code-mower 1.2.0__tar.gz → 1.2.2__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.2.0 → code_mower-1.2.2}/PKG-INFO +9 -7
- {code_mower-1.2.0 → code_mower-1.2.2}/README.md +8 -6
- {code_mower-1.2.0 → code_mower-1.2.2}/pyproject.toml +1 -1
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/__init__.py +1 -1
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/campaign_adapters.py +13 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/init.py +2 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/jira_cloud.py +2 -1
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/jira_mutations.py +9 -1
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/jira_pr_sync.py +12 -3
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/lane_status.py +35 -2
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/session.py +4 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/code-mower.example.yml +3 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/builder-provenance.yml.j2 +1 -1
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/tracker_contract.py +1 -1
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/tracker_queue.py +1 -1
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower.egg-info/PKG-INFO +9 -7
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/builder-provenance.yml.j2 +1 -1
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_campaign_adapters.py +97 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_jira_adoption.py +2 -1
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_jira_cloud.py +7 -3
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_jira_pr_sync.py +49 -1
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_lane_status.py +89 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_participant_sessions.py +2 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_release_hygiene.py +55 -47
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_tracker_contract.py +6 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_tracker_queue.py +2 -2
- {code_mower-1.2.0 → code_mower-1.2.2}/CODE_OF_CONDUCT.md +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/LICENSE +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/MANIFEST.in +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/NOTICE +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/SUPPORT.md +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/requirements/requirements.txt +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/setup.cfg +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/adapters/__init__.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/adapters/_base.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/adapters/cursor_bugbot.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/adapters/gitar.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/adapters/greptile.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/adapters/qodo.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/antigravity_sdk_probe.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/audit_handoff_log.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/audit_labeler_lib.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/audit_limits.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/audit_progress.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/blind_review_artifacts.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/blind_review_coordinator.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/board.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/board_store.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/bootstrap.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/builder_experiment.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/builder_runs.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/__init__.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/arms.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/auto_discovery.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/commands.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/context_inputs.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/corpus.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/effect_report.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/evidence.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/evidence_report.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/identity.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/metrics.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/overlap.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/planning.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/policy.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/results.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/run_results.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/run_status.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/runner.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/truth.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/calibration/value_report.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/campaign_discovery.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/checks.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/claude_audit_pr.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/claude_cli_bounce.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/claude_cli_environment.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/clear_stale.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cli.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/__init__.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/adoption_runs.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/bundle.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/doctor.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/dogfood.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/endpoints.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/errors.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/events.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/export.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/finding_outcomes.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/git_metadata.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/manifest.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/operations.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/pr_outcomes.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/productivity.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/productivity_windows.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/reports.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/setup.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/tokens.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/upload.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/cloud_client/work_types.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/code_mower_calibration.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/code_mower_context_packs.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/code_mower_merge.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/code_mower_telemetry.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/codex_audit_env_preflight.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/codex_audit_pr.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/codex_audit_schema_smoke.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/codex_audit_verdict.schema.json +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/config.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/controller.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/decisions.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/devin_api.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/devin_cli_audit_pr.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/__init__.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/adoption.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/audit_limits.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/campaign_auth.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/cloud.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/common.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_actions.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_api.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_branch.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_config.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_human_token.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_provider.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_repo.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/github_trusted_authors.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/groups.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/jira.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/models.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/output.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/presets.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/privacy.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_env.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_local_audit_setup.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_probe.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/providers.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/registry.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/runner.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/runtime.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/self_hosted_runner.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/doctor_checks/supervised_pilot.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/file_locks.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/gate_health.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/gemini_cli_audit_pr.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/git_identity.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/grok_build_audit_pr.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/hermes_cli_audit_pr.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/lane_configs/__init__.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/lane_configs/aider.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/lane_configs/claude.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/lane_configs/codex.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/lane_configs/devin.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/lane_configs/devin_cli.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/lane_configs/gemini_cli.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/lane_configs/grok_build.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/lane_configs/hermes_cli.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/lane_configs/local_llm.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/lane_configs/muse_cli.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/lane_delivery.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/local_llm_audit_pr.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/local_llm_bakeoff.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/local_llm_calibration.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/local_llm_profiles.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/migration.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/migration_install.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/migration_mirror.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/migration_readiness.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/migration_rehearsal.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/muse_cli_audit_pr.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/next_steps.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/package.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/package_content.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/package_manifest.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/package_paths.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/package_rendering.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/package_static.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/participants.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/plan_context.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/productivity_report.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/prompts.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/provider_credentials.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/provider_registry.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/provider_runners/__init__.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/provider_runners/comments.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/provider_runners/exit_codes.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/provider_runners/git.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/provider_runners/github_auth.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/provider_runners/github_pr.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/provider_runners/pr_worktree.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/provider_runners/process.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/provider_runners/repo_paths.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/provider_runners/text_schema.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/provider_runners/workspace.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/providers/__init__.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/providers/local_cli.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/providers/provenance.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/release_campaigns.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/release_qualify.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/release_readiness.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/reviewer_metrics.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/reviewer_spend.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/saas_reviewer_labeler.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/secrets.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/session_lease.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/builder-experiment.example.json +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/calibration-corpus.example.json +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/calibration-corpus.json +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/context-packs.example.json +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lane_prompts/operability.md +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lane_prompts/plan-conformance.md +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lanes/README.md +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lanes/claude.md +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lanes/codex.md +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lanes/cursor.md +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lanes/devin.md +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lanes/generic.md +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/lanes/run_mac_lane.sh +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/product-support/code_mower +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/product-support/run_devin_cli_audit_pr.sh +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/product-support/status_report.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/providers.yml +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/reviewer-spend.example.json +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/code-mower-gate.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/dispatch-lanes.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/lane-mac-runner.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/needs-owner-notify.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/templates/workflows/weekly-status.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/trailer_comment_labeler.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/versioning.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/work_orders.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower/workflow_actionlint.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower.egg-info/SOURCES.txt +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower.egg-info/dependency_links.txt +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower.egg-info/entry_points.txt +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower.egg-info/requires.txt +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/src/code_mower.egg-info/top_level.txt +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/builder-experiment.example.json +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/calibration-corpus.example.json +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/calibration-corpus.json +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/code-mower.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/context-packs.example.json +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/cursor/BUGBOT.md +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/lanes/README.md +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/lanes/claude.md +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/lanes/codex.md +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/lanes/cursor.md +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/lanes/devin.md +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/lanes/generic.md +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/lanes/run_mac_lane.sh +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/acp_bridge.yml +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/aider.yml +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/antigravity_cli.yml +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/claude_audit.yml +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/claude_review.yml +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/coderabbit_cli.yml +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/codex.yml +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/cursor_bugbot.yml +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/cursor_cloud_agent.yml +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/devin.yml +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/devin_cli.yml +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/gemini_cli.yml +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/gitar.yml +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/greptile.yml +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/hermes_cli.yml +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/local_llm.yml +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/muse_cli.yml +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers/qodo.yml +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/providers.yml +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/reviewer-spend.example.json +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/reviewer-value-report.example.md +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/code-mower-gate.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/dispatch-lanes.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/lane-mac-runner.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/review-clear-stale.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_adoption_diagnostics.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_adoption_result_semantics.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_adoption_run_contract.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_antigravity_cli_audit_pr.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_antigravity_sdk_probe.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_audit_comment_posture.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_audit_limits.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_board.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_board_lease.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_builder_experiment.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_builder_identity.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_builder_runs.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_calibration_effect_report.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_calibration_truth.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_campaign_discovery.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_campaign_gh_auth_and_issue_binding_817.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_campaign_retry_evidence_711.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_checks.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_claude_audit_pr.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_claude_cli_bounce.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_clear_stale.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_cloud_client.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_cloud_git_metadata.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_cloud_manifest.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_cloud_reports.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_coderabbit_cli_audit_pr.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_codex_audit_env_preflight.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_codex_audit_pr.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_controller.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_decision_audit_integration.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_decisions.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_devin_api.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_devin_builder_lane.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_devin_cli_audit_pr.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_devin_provider_contract.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_actions_cost_summary.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_actions_failure_selection.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_boundaries.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_campaign_auth.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_campaign_readiness.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_github_checks.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_output.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_privacy.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_provider_env_required.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_provider_env_tokens.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_provider_local_audit_setup.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_provider_probe.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_provider_review_hygiene.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_registry.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_runtime.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_self_hosted_runner.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_doctor_supervised_pilot.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_file_locks.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_fork_pr_guard.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_gate_automerge.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_gate_health.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_hosted_dispatch_profile.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_init_actionlint.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_init_build_loop.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_jira_mutations.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_lane_delivery_contract.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_local_llm_github_helpers.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_migration_rehearsal.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_migration_setup_drift.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_next_steps.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_package_install_failure_taxonomy.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_plan_context.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_pr_outcome_contract.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_pr_outcome_coverage.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_productivity_metrics_contract.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_productivity_report.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_productivity_windows.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_prompts.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_provider_credentials.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_provider_fixture_contracts.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_provider_local_cli.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_provider_runners_comments.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_provider_runners_git.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_provider_runners_github_pr.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_provider_runners_pr_worktree.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_provider_runners_process.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_provider_runners_repo_paths.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_provider_runners_text_schema.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_provider_runners_workspace.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_release_campaigns.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_release_qualify.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_remote_qualification_failure_reason_819.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_reviewer_finding_outcome_contract.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_reviewer_metrics_core.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_reviewer_spend.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_session_lease.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_supervised_pilot_contract.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_tracker_config.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_trailer_comment_labeler.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/tests/test_work_orders.py +0 -0
- {code_mower-1.2.0 → code_mower-1.2.2}/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.2.
|
|
3
|
+
Version: 1.2.2
|
|
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
|
|
@@ -56,8 +56,8 @@ Default cloud bundles exclude source code, raw diffs, raw model transcripts,
|
|
|
56
56
|
raw stdout/stderr, auth output, and secrets.
|
|
57
57
|
|
|
58
58
|
Documentation on `main` follows the source on `main`. If you install the
|
|
59
|
-
published `code-mower==1.2.
|
|
60
|
-
[`v1.2.
|
|
59
|
+
published `code-mower==1.2.2` package, use the documentation from the matching
|
|
60
|
+
[`v1.2.2` tag](https://github.com/codemower-ai/code-mower/tree/v1.2.2) so the
|
|
61
61
|
commands and package stay aligned as development continues.
|
|
62
62
|
|
|
63
63
|
## Design Principles
|
|
@@ -252,7 +252,7 @@ agent report its actual host posture, exact installed version, doctor result,
|
|
|
252
252
|
Board URL, and any owner-only click-list before it mutates the repo.
|
|
253
253
|
|
|
254
254
|
The current package-index announcement entry point is the tagged
|
|
255
|
-
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.2.
|
|
255
|
+
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.2.2/docs/try-in-10-minutes.md)
|
|
256
256
|
guide. The v1.0 supervised-pilot release includes the native Board, the
|
|
257
257
|
controller dry-run and policy contract, adoption and upgrade hardening from
|
|
258
258
|
recent install rehearsals, package-index release checks, provider-diversity
|
|
@@ -367,7 +367,7 @@ Provider-contract baseline for the next release train:
|
|
|
367
367
|
|
|
368
368
|
For release verification,
|
|
369
369
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
370
|
-
the package-index procedure for `v1.2.
|
|
370
|
+
the package-index procedure for `v1.2.2` / `code-mower==1.2.2`. The
|
|
371
371
|
GitHub release records the workflow and rehearsal evidence for the exact tag.
|
|
372
372
|
After publication, [Release Qualification](docs/release-qualification.md)
|
|
373
373
|
coordinates provider-specific install and operational checks without treating
|
|
@@ -561,8 +561,8 @@ measurement work.
|
|
|
561
561
|
|
|
562
562
|
## Installation Status
|
|
563
563
|
|
|
564
|
-
The current package-index release baseline is `v1.2.
|
|
565
|
-
install spec `code-mower==1.2.
|
|
564
|
+
The current package-index release baseline is `v1.2.2`, with pinned package
|
|
565
|
+
install spec `code-mower==1.2.2`. Release evidence is recorded on the GitHub
|
|
566
566
|
release and in the first-user install rehearsal. The public repository is
|
|
567
567
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
|
|
568
568
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
@@ -675,6 +675,8 @@ first so local work exercises the same package entrypoint users install.
|
|
|
675
675
|
- [v1.1.1 Release Notes](docs/v111-release-notes.md)
|
|
676
676
|
- [v1.1.2 Release Notes](docs/v112-release-notes.md)
|
|
677
677
|
- [v1.2 Release Notes](docs/v12-release-notes.md)
|
|
678
|
+
- [v1.2.1 Release Notes](docs/v121-release-notes.md)
|
|
679
|
+
- [v1.2.2 Release Notes](docs/v122-release-notes.md)
|
|
678
680
|
- [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
|
|
679
681
|
- [v1.0.1 Effectiveness Assessment](docs/v101-effectiveness-assessment.md)
|
|
680
682
|
|
|
@@ -26,8 +26,8 @@ Default cloud bundles exclude source code, raw diffs, raw model transcripts,
|
|
|
26
26
|
raw stdout/stderr, auth output, and secrets.
|
|
27
27
|
|
|
28
28
|
Documentation on `main` follows the source on `main`. If you install the
|
|
29
|
-
published `code-mower==1.2.
|
|
30
|
-
[`v1.2.
|
|
29
|
+
published `code-mower==1.2.2` package, use the documentation from the matching
|
|
30
|
+
[`v1.2.2` tag](https://github.com/codemower-ai/code-mower/tree/v1.2.2) so the
|
|
31
31
|
commands and package stay aligned as development continues.
|
|
32
32
|
|
|
33
33
|
## Design Principles
|
|
@@ -222,7 +222,7 @@ agent report its actual host posture, exact installed version, doctor result,
|
|
|
222
222
|
Board URL, and any owner-only click-list before it mutates the repo.
|
|
223
223
|
|
|
224
224
|
The current package-index announcement entry point is the tagged
|
|
225
|
-
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.2.
|
|
225
|
+
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.2.2/docs/try-in-10-minutes.md)
|
|
226
226
|
guide. The v1.0 supervised-pilot release includes the native Board, the
|
|
227
227
|
controller dry-run and policy contract, adoption and upgrade hardening from
|
|
228
228
|
recent install rehearsals, package-index release checks, provider-diversity
|
|
@@ -337,7 +337,7 @@ Provider-contract baseline for the next release train:
|
|
|
337
337
|
|
|
338
338
|
For release verification,
|
|
339
339
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
340
|
-
the package-index procedure for `v1.2.
|
|
340
|
+
the package-index procedure for `v1.2.2` / `code-mower==1.2.2`. The
|
|
341
341
|
GitHub release records the workflow and rehearsal evidence for the exact tag.
|
|
342
342
|
After publication, [Release Qualification](docs/release-qualification.md)
|
|
343
343
|
coordinates provider-specific install and operational checks without treating
|
|
@@ -531,8 +531,8 @@ measurement work.
|
|
|
531
531
|
|
|
532
532
|
## Installation Status
|
|
533
533
|
|
|
534
|
-
The current package-index release baseline is `v1.2.
|
|
535
|
-
install spec `code-mower==1.2.
|
|
534
|
+
The current package-index release baseline is `v1.2.2`, with pinned package
|
|
535
|
+
install spec `code-mower==1.2.2`. Release evidence is recorded on the GitHub
|
|
536
536
|
release and in the first-user install rehearsal. The public repository is
|
|
537
537
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
|
|
538
538
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
@@ -645,6 +645,8 @@ first so local work exercises the same package entrypoint users install.
|
|
|
645
645
|
- [v1.1.1 Release Notes](docs/v111-release-notes.md)
|
|
646
646
|
- [v1.1.2 Release Notes](docs/v112-release-notes.md)
|
|
647
647
|
- [v1.2 Release Notes](docs/v12-release-notes.md)
|
|
648
|
+
- [v1.2.1 Release Notes](docs/v121-release-notes.md)
|
|
649
|
+
- [v1.2.2 Release Notes](docs/v122-release-notes.md)
|
|
648
650
|
- [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
|
|
649
651
|
- [v1.0.1 Effectiveness Assessment](docs/v101-effectiveness-assessment.md)
|
|
650
652
|
|
|
@@ -570,6 +570,19 @@ def build_qualification_prompt(
|
|
|
570
570
|
)
|
|
571
571
|
if target_runtime:
|
|
572
572
|
lines.append(f"- target_runtime: {target_runtime}")
|
|
573
|
+
if provider == "claude":
|
|
574
|
+
lines.extend(
|
|
575
|
+
[
|
|
576
|
+
"",
|
|
577
|
+
"Claude timing arithmetic (mandatory): report every step elapsed_seconds",
|
|
578
|
+
"as a non-negative integer number of seconds. Include an overhead step for",
|
|
579
|
+
"measured setup or serialization time outside the named checks. Set the",
|
|
580
|
+
"top-level elapsed_seconds to the exact arithmetic sum of the numeric step",
|
|
581
|
+
"elapsed_seconds values you emit; never use a separately measured or",
|
|
582
|
+
"estimated total. Before responding, add those emitted values again and",
|
|
583
|
+
"confirm exact equality.",
|
|
584
|
+
]
|
|
585
|
+
)
|
|
573
586
|
lines.extend(
|
|
574
587
|
[
|
|
575
588
|
"",
|
|
@@ -2361,6 +2361,7 @@ EXAMPLE_JIRA_TRACKER_CONFIG: dict[str, Any] = {
|
|
|
2361
2361
|
"status_category_map": {
|
|
2362
2362
|
"new": ["10000"],
|
|
2363
2363
|
"in_progress": ["10001"],
|
|
2364
|
+
"review": ["10004"],
|
|
2364
2365
|
"blocked": ["10002"],
|
|
2365
2366
|
"done": ["10003"],
|
|
2366
2367
|
},
|
|
@@ -2380,6 +2381,7 @@ EXAMPLE_JIRA_TRACKER_CONFIG: dict[str, Any] = {
|
|
|
2380
2381
|
],
|
|
2381
2382
|
"transitions": {
|
|
2382
2383
|
"in_progress": "31",
|
|
2384
|
+
"review": "51",
|
|
2383
2385
|
},
|
|
2384
2386
|
},
|
|
2385
2387
|
},
|
|
@@ -65,6 +65,7 @@ from .provider_credentials import (
|
|
|
65
65
|
resolve_provider_credentials,
|
|
66
66
|
validate_jira_email,
|
|
67
67
|
)
|
|
68
|
+
from .tracker_contract import LIFECYCLE_CATEGORIES
|
|
68
69
|
|
|
69
70
|
API_GATEWAY = "https://api.atlassian.com"
|
|
70
71
|
SITE_EXAMPLE = "https://example.atlassian.net"
|
|
@@ -1773,7 +1774,7 @@ def map_status_to_lifecycle(
|
|
|
1773
1774
|
if wanted not in known:
|
|
1774
1775
|
return None
|
|
1775
1776
|
mapping = status_category_map or {}
|
|
1776
|
-
for category in
|
|
1777
|
+
for category in LIFECYCLE_CATEGORIES:
|
|
1777
1778
|
ids = mapping.get(category) or []
|
|
1778
1779
|
if wanted in {str(item) for item in ids}:
|
|
1779
1780
|
return category
|
|
@@ -2252,7 +2252,15 @@ def _parser() -> argparse.ArgumentParser:
|
|
|
2252
2252
|
sync.add_argument(
|
|
2253
2253
|
"--milestone",
|
|
2254
2254
|
required=True,
|
|
2255
|
-
choices=(
|
|
2255
|
+
choices=(
|
|
2256
|
+
"opened",
|
|
2257
|
+
"ready_for_review",
|
|
2258
|
+
"updated",
|
|
2259
|
+
"blocked",
|
|
2260
|
+
"green",
|
|
2261
|
+
"merged",
|
|
2262
|
+
"closed_unmerged",
|
|
2263
|
+
),
|
|
2256
2264
|
help="GitHub/Code Mower lifecycle milestone to synchronize",
|
|
2257
2265
|
)
|
|
2258
2266
|
sync.add_argument("--pr-url", required=True, help="GitHub pull request URL")
|
|
@@ -58,6 +58,7 @@ SYNC_REPORT_SCHEMA = "code_mower.jiraPrSync.v1"
|
|
|
58
58
|
#: replay), never inferred from prose.
|
|
59
59
|
PR_MILESTONES = (
|
|
60
60
|
"opened",
|
|
61
|
+
"ready_for_review",
|
|
61
62
|
"updated",
|
|
62
63
|
"blocked",
|
|
63
64
|
"green",
|
|
@@ -72,6 +73,10 @@ PR_MILESTONES = (
|
|
|
72
73
|
#: often they replay.
|
|
73
74
|
_MILESTONE_POLICY: Mapping[str, Mapping[str, str]] = {
|
|
74
75
|
"opened": {"transition_category": "in_progress", "comment_template": "pr_opened"},
|
|
76
|
+
"ready_for_review": {
|
|
77
|
+
"transition_category": "review",
|
|
78
|
+
"comment_template": "pr_opened",
|
|
79
|
+
},
|
|
75
80
|
"updated": {"transition_category": "", "comment_template": ""},
|
|
76
81
|
"blocked": {"transition_category": "blocked", "comment_template": "pr_blocked"},
|
|
77
82
|
"green": {"transition_category": "", "comment_template": ""},
|
|
@@ -340,13 +345,17 @@ def build_sync_plan(
|
|
|
340
345
|
)
|
|
341
346
|
|
|
342
347
|
settings = jira_mutations.resolve_mutation_settings(config)
|
|
343
|
-
|
|
348
|
+
required_stale_categories = {
|
|
344
349
|
"opened": ("blocked", "done"),
|
|
350
|
+
"ready_for_review": ("blocked", "done"),
|
|
345
351
|
"blocked": ("done",),
|
|
346
352
|
}.get(milestone, ())
|
|
353
|
+
optional_stale_categories = {
|
|
354
|
+
"opened": ("review",),
|
|
355
|
+
}.get(milestone, ())
|
|
347
356
|
missing_stale_categories = [
|
|
348
357
|
category
|
|
349
|
-
for category in
|
|
358
|
+
for category in required_stale_categories
|
|
350
359
|
if not settings.status_category_map.get(category)
|
|
351
360
|
]
|
|
352
361
|
if missing_stale_categories:
|
|
@@ -387,7 +396,7 @@ def build_sync_plan(
|
|
|
387
396
|
stale_status_ids = sorted(
|
|
388
397
|
{
|
|
389
398
|
status_id
|
|
390
|
-
for category in
|
|
399
|
+
for category in (*required_stale_categories, *optional_stale_categories)
|
|
391
400
|
for status_id in settings.status_category_map.get(category, ())
|
|
392
401
|
}
|
|
393
402
|
)
|
|
@@ -14,6 +14,7 @@ from collections.abc import Callable, Mapping, Sequence
|
|
|
14
14
|
from datetime import UTC, datetime, timedelta
|
|
15
15
|
from pathlib import Path
|
|
16
16
|
from typing import Any
|
|
17
|
+
from urllib.parse import urlparse
|
|
17
18
|
|
|
18
19
|
from . import config as code_mower_config
|
|
19
20
|
from . import tracker_queue
|
|
@@ -125,16 +126,48 @@ def _check_value(check: Mapping[str, Any], keys: Sequence[str], default: str) ->
|
|
|
125
126
|
return default
|
|
126
127
|
|
|
127
128
|
|
|
129
|
+
def _check_identity(check: Mapping[str, Any]) -> tuple[str, str, str, str]:
|
|
130
|
+
app = check.get("app")
|
|
131
|
+
app_name = ""
|
|
132
|
+
if isinstance(app, Mapping):
|
|
133
|
+
app_name = _check_value(app, ("slug", "name", "databaseId"), "")
|
|
134
|
+
provider_url = _check_value(check, ("detailsUrl", "targetUrl"), "")
|
|
135
|
+
try:
|
|
136
|
+
provider_host = urlparse(provider_url).hostname or ""
|
|
137
|
+
except ValueError:
|
|
138
|
+
provider_host = ""
|
|
139
|
+
return (
|
|
140
|
+
_text(check.get("__typename")).casefold(),
|
|
141
|
+
_check_value(check, ("name", "context", "workflowName"), "unknown").casefold(),
|
|
142
|
+
_text(check.get("workflowName")).casefold(),
|
|
143
|
+
(app_name or provider_host).casefold(),
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
def _check_timestamp(check: Mapping[str, Any]) -> str:
|
|
148
|
+
return _check_value(check, ("startedAt", "createdAt", "completedAt"), "")
|
|
149
|
+
|
|
150
|
+
|
|
128
151
|
def _checks(raw: Any) -> list[dict[str, str]]:
|
|
129
152
|
if not isinstance(raw, list):
|
|
130
153
|
return []
|
|
154
|
+
current: dict[tuple[str, str, str, str], tuple[str, int, Mapping[str, Any]]] = {}
|
|
155
|
+
order: list[tuple[str, str, str, str]] = []
|
|
156
|
+
for index, check in enumerate(raw):
|
|
157
|
+
if not isinstance(check, Mapping):
|
|
158
|
+
continue
|
|
159
|
+
identity = _check_identity(check)
|
|
160
|
+
candidate = (_check_timestamp(check), index, check)
|
|
161
|
+
if identity not in current:
|
|
162
|
+
order.append(identity)
|
|
163
|
+
if identity not in current or candidate[:2] >= current[identity][:2]:
|
|
164
|
+
current[identity] = candidate
|
|
131
165
|
checks = [
|
|
132
166
|
{
|
|
133
167
|
"name": _check_value(check, ("name", "context", "workflowName"), "unknown"),
|
|
134
168
|
"state": _check_value(check, ("conclusion", "state", "status"), "unknown").lower(),
|
|
135
169
|
}
|
|
136
|
-
for check in
|
|
137
|
-
if isinstance(check, Mapping)
|
|
170
|
+
for _timestamp, _index, check in (current[identity] for identity in order)
|
|
138
171
|
]
|
|
139
172
|
major = [check for check in checks if any(term in check["name"].lower() for term in CHECK_TERMS)]
|
|
140
173
|
return (major or checks)[:8]
|
|
@@ -49,6 +49,10 @@ JIRA_TRACKER_CONTRACT_INSTRUCTIONS = (
|
|
|
49
49
|
"Every Jira write must flow through the guarded `code-mower tracker mutate` or "
|
|
50
50
|
"`code-mower tracker pr-sync` commands; do not write through Rovo MCP tools or "
|
|
51
51
|
"any other path.",
|
|
52
|
+
"When implementation starts, preview and then apply a claim plus the configured "
|
|
53
|
+
"`in_progress` transition through `code-mower tracker mutate`.",
|
|
54
|
+
"When a non-draft pull request is ready for human review, preview and then apply "
|
|
55
|
+
"the `ready_for_review` milestone through `code-mower tracker pr-sync`.",
|
|
52
56
|
"Report only the configured Jira project key or ID; never surface issue body "
|
|
53
57
|
"text, comments, attachments, or credentials in this session brief.",
|
|
54
58
|
)
|
|
@@ -26,6 +26,8 @@ repositories:
|
|
|
26
26
|
# - "10000"
|
|
27
27
|
# in_progress:
|
|
28
28
|
# - "10001"
|
|
29
|
+
# review:
|
|
30
|
+
# - "10004"
|
|
29
31
|
# blocked:
|
|
30
32
|
# - "10002"
|
|
31
33
|
# done:
|
|
@@ -44,6 +46,7 @@ repositories:
|
|
|
44
46
|
# - "link"
|
|
45
47
|
# transitions:
|
|
46
48
|
# in_progress: "31"
|
|
49
|
+
# review: "51"
|
|
47
50
|
|
|
48
51
|
audit:
|
|
49
52
|
# Leave blank to use the size-aware default: $2 base, +$1 per 150 KB
|
|
@@ -18,7 +18,7 @@ TRACKER_WORK_ITEM_SCHEMA = "code_mower.trackerWorkItem.v1"
|
|
|
18
18
|
|
|
19
19
|
TRACKER_KINDS = ("github", "jira_cloud")
|
|
20
20
|
|
|
21
|
-
LIFECYCLE_CATEGORIES = ("new", "in_progress", "blocked", "done")
|
|
21
|
+
LIFECYCLE_CATEGORIES = ("new", "in_progress", "review", "blocked", "done")
|
|
22
22
|
|
|
23
23
|
ALLOWED_MUTATION_OPERATIONS = ("assign", "transition", "comment", "link")
|
|
24
24
|
|
|
@@ -174,7 +174,7 @@ def normalize_jira_work_item(raw: Mapping[str, Any], config: Mapping[str, Any])
|
|
|
174
174
|
category = {"new": "new", "indeterminate": "in_progress", "done": "done"}.get(
|
|
175
175
|
(status.get("statusCategory") or {}).get("key")
|
|
176
176
|
)
|
|
177
|
-
elif status in ("new", "in_progress", "blocked", "done"):
|
|
177
|
+
elif status in ("new", "in_progress", "review", "blocked", "done"):
|
|
178
178
|
category = status
|
|
179
179
|
labels = fields.get(mappings.get("labels", "labels")) or []
|
|
180
180
|
if not isinstance(labels, list):
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code-mower
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.2
|
|
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
|
|
@@ -56,8 +56,8 @@ Default cloud bundles exclude source code, raw diffs, raw model transcripts,
|
|
|
56
56
|
raw stdout/stderr, auth output, and secrets.
|
|
57
57
|
|
|
58
58
|
Documentation on `main` follows the source on `main`. If you install the
|
|
59
|
-
published `code-mower==1.2.
|
|
60
|
-
[`v1.2.
|
|
59
|
+
published `code-mower==1.2.2` package, use the documentation from the matching
|
|
60
|
+
[`v1.2.2` tag](https://github.com/codemower-ai/code-mower/tree/v1.2.2) so the
|
|
61
61
|
commands and package stay aligned as development continues.
|
|
62
62
|
|
|
63
63
|
## Design Principles
|
|
@@ -252,7 +252,7 @@ agent report its actual host posture, exact installed version, doctor result,
|
|
|
252
252
|
Board URL, and any owner-only click-list before it mutates the repo.
|
|
253
253
|
|
|
254
254
|
The current package-index announcement entry point is the tagged
|
|
255
|
-
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.2.
|
|
255
|
+
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.2.2/docs/try-in-10-minutes.md)
|
|
256
256
|
guide. The v1.0 supervised-pilot release includes the native Board, the
|
|
257
257
|
controller dry-run and policy contract, adoption and upgrade hardening from
|
|
258
258
|
recent install rehearsals, package-index release checks, provider-diversity
|
|
@@ -367,7 +367,7 @@ Provider-contract baseline for the next release train:
|
|
|
367
367
|
|
|
368
368
|
For release verification,
|
|
369
369
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
370
|
-
the package-index procedure for `v1.2.
|
|
370
|
+
the package-index procedure for `v1.2.2` / `code-mower==1.2.2`. The
|
|
371
371
|
GitHub release records the workflow and rehearsal evidence for the exact tag.
|
|
372
372
|
After publication, [Release Qualification](docs/release-qualification.md)
|
|
373
373
|
coordinates provider-specific install and operational checks without treating
|
|
@@ -561,8 +561,8 @@ measurement work.
|
|
|
561
561
|
|
|
562
562
|
## Installation Status
|
|
563
563
|
|
|
564
|
-
The current package-index release baseline is `v1.2.
|
|
565
|
-
install spec `code-mower==1.2.
|
|
564
|
+
The current package-index release baseline is `v1.2.2`, with pinned package
|
|
565
|
+
install spec `code-mower==1.2.2`. Release evidence is recorded on the GitHub
|
|
566
566
|
release and in the first-user install rehearsal. The public repository is
|
|
567
567
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
|
|
568
568
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
@@ -675,6 +675,8 @@ first so local work exercises the same package entrypoint users install.
|
|
|
675
675
|
- [v1.1.1 Release Notes](docs/v111-release-notes.md)
|
|
676
676
|
- [v1.1.2 Release Notes](docs/v112-release-notes.md)
|
|
677
677
|
- [v1.2 Release Notes](docs/v12-release-notes.md)
|
|
678
|
+
- [v1.2.1 Release Notes](docs/v121-release-notes.md)
|
|
679
|
+
- [v1.2.2 Release Notes](docs/v122-release-notes.md)
|
|
678
680
|
- [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
|
|
679
681
|
- [v1.0.1 Effectiveness Assessment](docs/v101-effectiveness-assessment.md)
|
|
680
682
|
|
|
@@ -398,6 +398,35 @@ class ArgvBuilderTests(unittest.TestCase):
|
|
|
398
398
|
prompt,
|
|
399
399
|
)
|
|
400
400
|
|
|
401
|
+
def test_claude_prompt_requires_deterministic_timing_arithmetic(self) -> None:
|
|
402
|
+
prompt = campaign_adapters.build_qualification_prompt(
|
|
403
|
+
provider="claude",
|
|
404
|
+
release_tag="v1.0.0",
|
|
405
|
+
package_spec="code-mower==1.0.0",
|
|
406
|
+
package_identity="code-mower",
|
|
407
|
+
normalized_version="1.0.0",
|
|
408
|
+
qualification_context="cold_install",
|
|
409
|
+
starting_version="",
|
|
410
|
+
)
|
|
411
|
+
self.assertIn("non-negative integer number of seconds", prompt)
|
|
412
|
+
self.assertIn("exact arithmetic sum", prompt)
|
|
413
|
+
self.assertIn("never use a separately measured", prompt)
|
|
414
|
+
self.assertIn("Include an overhead step", prompt)
|
|
415
|
+
|
|
416
|
+
def test_non_claude_prompts_omit_claude_timing_rule(self) -> None:
|
|
417
|
+
for provider in ("codex", "antigravity", "muse", "devin_cli"):
|
|
418
|
+
with self.subTest(provider=provider):
|
|
419
|
+
prompt = campaign_adapters.build_qualification_prompt(
|
|
420
|
+
provider=provider,
|
|
421
|
+
release_tag="v1.0.0",
|
|
422
|
+
package_spec="code-mower==1.0.0",
|
|
423
|
+
package_identity="code-mower",
|
|
424
|
+
normalized_version="1.0.0",
|
|
425
|
+
qualification_context="cold_install",
|
|
426
|
+
starting_version="",
|
|
427
|
+
)
|
|
428
|
+
self.assertNotIn("Claude timing arithmetic", prompt)
|
|
429
|
+
|
|
401
430
|
def test_guidance_schema_enforces_step_id_taxonomy(self) -> None:
|
|
402
431
|
step_id_schema = campaign_adapters.ADOPTION_RESULT_JSON_SCHEMA[
|
|
403
432
|
"properties"
|
|
@@ -876,6 +905,74 @@ class AdapterTransportTests(unittest.TestCase):
|
|
|
876
905
|
self.assertEqual(json.loads(output.read_text(encoding="utf-8")), _adoption_result("claude"))
|
|
877
906
|
self.assertNotIn("SECRET-NOISE", output.read_text(encoding="utf-8"))
|
|
878
907
|
|
|
908
|
+
def test_claude_rejects_inconsistent_timing_without_retry(self) -> None:
|
|
909
|
+
calls = 0
|
|
910
|
+
inconsistent = _adoption_result(
|
|
911
|
+
"claude",
|
|
912
|
+
elapsed_seconds=20,
|
|
913
|
+
steps=[
|
|
914
|
+
{
|
|
915
|
+
"id": "package_install",
|
|
916
|
+
"status": "pass",
|
|
917
|
+
"elapsed_seconds": 8,
|
|
918
|
+
"warning_count": 0,
|
|
919
|
+
"owner_action_count": 0,
|
|
920
|
+
},
|
|
921
|
+
{
|
|
922
|
+
"id": "doctor",
|
|
923
|
+
"status": "pass",
|
|
924
|
+
"elapsed_seconds": 4,
|
|
925
|
+
"warning_count": 0,
|
|
926
|
+
"owner_action_count": 0,
|
|
927
|
+
},
|
|
928
|
+
],
|
|
929
|
+
)
|
|
930
|
+
|
|
931
|
+
def runner(
|
|
932
|
+
argv: Any, prompt_input: Any, timeout: int, workdir: Path, child_env: Any
|
|
933
|
+
) -> Any:
|
|
934
|
+
nonlocal calls
|
|
935
|
+
calls += 1
|
|
936
|
+
stdout = json.dumps({"is_error": False, "structured_output": inconsistent})
|
|
937
|
+
return subprocess.CompletedProcess(list(argv), 0, stdout=stdout, stderr="")
|
|
938
|
+
|
|
939
|
+
code, output, _tmp = self._run("claude", runner)
|
|
940
|
+
self.assertNotEqual(code, 0)
|
|
941
|
+
self.assertEqual(calls, 1)
|
|
942
|
+
self.assertFalse(output.exists())
|
|
943
|
+
|
|
944
|
+
def test_claude_accepts_exact_integer_step_sum(self) -> None:
|
|
945
|
+
exact = _adoption_result(
|
|
946
|
+
"claude",
|
|
947
|
+
elapsed_seconds=12,
|
|
948
|
+
steps=[
|
|
949
|
+
{
|
|
950
|
+
"id": "package_install",
|
|
951
|
+
"status": "pass",
|
|
952
|
+
"elapsed_seconds": 8,
|
|
953
|
+
"warning_count": 0,
|
|
954
|
+
"owner_action_count": 0,
|
|
955
|
+
},
|
|
956
|
+
{
|
|
957
|
+
"id": "doctor",
|
|
958
|
+
"status": "pass",
|
|
959
|
+
"elapsed_seconds": 4,
|
|
960
|
+
"warning_count": 0,
|
|
961
|
+
"owner_action_count": 0,
|
|
962
|
+
},
|
|
963
|
+
],
|
|
964
|
+
)
|
|
965
|
+
|
|
966
|
+
def runner(
|
|
967
|
+
argv: Any, prompt_input: Any, timeout: int, workdir: Path, child_env: Any
|
|
968
|
+
) -> Any:
|
|
969
|
+
stdout = json.dumps({"is_error": False, "structured_output": exact})
|
|
970
|
+
return subprocess.CompletedProcess(list(argv), 0, stdout=stdout, stderr="")
|
|
971
|
+
|
|
972
|
+
code, output, _tmp = self._run("claude", runner)
|
|
973
|
+
self.assertEqual(code, 0)
|
|
974
|
+
self.assertEqual(json.loads(output.read_text(encoding="utf-8")), exact)
|
|
975
|
+
|
|
879
976
|
def test_claude_rejects_is_error_true_envelope_even_with_valid_fenced_result(self) -> None:
|
|
880
977
|
"""A valid Claude error envelope must fail closed even if result contains fenced JSON."""
|
|
881
978
|
valid_payload = _adoption_result("claude")
|
|
@@ -727,8 +727,9 @@ class JiraAdoptionRehearsalFlowTests(unittest.TestCase):
|
|
|
727
727
|
issues = code_mower_config.validate_config(config_dict)
|
|
728
728
|
self.assertEqual(issues, [])
|
|
729
729
|
|
|
730
|
-
# Operator configures
|
|
730
|
+
# Operator configures transitions to match their workflow.
|
|
731
731
|
config_dict["tracker"]["jira_cloud"]["mutations"]["transitions"]["in_progress"] = "21"
|
|
732
|
+
config_dict["tracker"]["jira_cloud"]["mutations"]["transitions"]["review"] = "51"
|
|
732
733
|
|
|
733
734
|
# Step 3: Run doctor readiness checks
|
|
734
735
|
perms_with_writes = {
|
|
@@ -847,7 +847,10 @@ class ReadPrimitiveTests(unittest.TestCase):
|
|
|
847
847
|
client = make_client(runner)
|
|
848
848
|
statuses = client.get_statuses()
|
|
849
849
|
categories = client.get_status_categories()
|
|
850
|
-
self.assertEqual(
|
|
850
|
+
self.assertEqual(
|
|
851
|
+
[item["id"] for item in statuses],
|
|
852
|
+
["10000", "10001", "10004", "10002"],
|
|
853
|
+
)
|
|
851
854
|
self.assertEqual(
|
|
852
855
|
[item["key"] for item in categories], ["new", "indeterminate", "done"]
|
|
853
856
|
)
|
|
@@ -922,9 +925,10 @@ class ReadPrimitiveTests(unittest.TestCase):
|
|
|
922
925
|
client = make_client(runner)
|
|
923
926
|
transitions = client.get_transitions("20001")
|
|
924
927
|
self.assertEqual(
|
|
925
|
-
[item["id"] for item in transitions], ["11", "21", "31"]
|
|
928
|
+
[item["id"] for item in transitions], ["11", "21", "51", "31"]
|
|
926
929
|
)
|
|
927
930
|
self.assertEqual(transitions[1]["to_status_id"], "10001")
|
|
931
|
+
self.assertEqual(transitions[2]["to_status_id"], "10004")
|
|
928
932
|
|
|
929
933
|
def test_effective_permission_probe_returns_booleans(self) -> None:
|
|
930
934
|
runner = FakeHttp([http_response(load_fixture("permissions.json"))])
|
|
@@ -1218,7 +1222,7 @@ class DoctorCheckTests(unittest.TestCase):
|
|
|
1218
1222
|
detail = dict(read.detail or {})
|
|
1219
1223
|
self.assertEqual(detail["reason"], "ready")
|
|
1220
1224
|
self.assertEqual(detail["project_key"], "ABC")
|
|
1221
|
-
self.assertEqual(detail["status_count"],
|
|
1225
|
+
self.assertEqual(detail["status_count"], 4)
|
|
1222
1226
|
self.assertEqual(detail["permission_probe"]["BROWSE_PROJECTS"], True)
|
|
1223
1227
|
# Readiness samples the configured project, even when queue JQL is broad.
|
|
1224
1228
|
bodies = runner.request_bodies()
|