code-mower 1.1.1__tar.gz → 1.1.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.1.1 → code_mower-1.1.2}/PKG-INFO +6 -5
- {code_mower-1.1.1 → code_mower-1.1.2}/README.md +5 -4
- {code_mower-1.1.1 → code_mower-1.1.2}/pyproject.toml +1 -1
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/__init__.py +1 -1
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/jira_cloud.py +41 -15
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/builder-provenance.yml.j2 +1 -1
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/tracker_queue.py +11 -4
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower.egg-info/PKG-INFO +6 -5
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/builder-provenance.yml.j2 +1 -1
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_jira_cloud.py +38 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_release_hygiene.py +44 -44
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_tracker_queue.py +10 -5
- {code_mower-1.1.1 → code_mower-1.1.2}/CODE_OF_CONDUCT.md +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/LICENSE +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/MANIFEST.in +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/NOTICE +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/SUPPORT.md +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/requirements/requirements.txt +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/setup.cfg +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/adapters/__init__.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/adapters/_base.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/adapters/cursor_bugbot.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/adapters/gitar.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/adapters/greptile.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/adapters/qodo.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/antigravity_sdk_probe.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/audit_handoff_log.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/audit_labeler_lib.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/audit_limits.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/audit_progress.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/blind_review_artifacts.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/blind_review_coordinator.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/board.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/board_store.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/bootstrap.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/builder_experiment.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/builder_runs.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/__init__.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/arms.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/auto_discovery.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/commands.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/context_inputs.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/corpus.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/effect_report.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/evidence.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/evidence_report.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/identity.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/metrics.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/overlap.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/planning.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/policy.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/results.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/run_results.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/run_status.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/runner.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/truth.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/calibration/value_report.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/campaign_adapters.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/campaign_discovery.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/checks.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/claude_audit_pr.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/claude_cli_bounce.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/claude_cli_environment.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/clear_stale.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cli.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/__init__.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/adoption_runs.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/bundle.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/doctor.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/dogfood.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/endpoints.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/errors.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/events.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/export.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/finding_outcomes.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/git_metadata.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/manifest.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/operations.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/pr_outcomes.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/productivity.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/productivity_windows.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/reports.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/setup.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/tokens.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/upload.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/cloud_client/work_types.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/code_mower_calibration.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/code_mower_context_packs.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/code_mower_merge.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/code_mower_telemetry.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/codex_audit_env_preflight.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/codex_audit_pr.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/codex_audit_schema_smoke.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/codex_audit_verdict.schema.json +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/config.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/controller.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/decisions.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/devin_api.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/devin_cli_audit_pr.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/__init__.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/adoption.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/audit_limits.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/campaign_auth.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/cloud.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/common.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_actions.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_api.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_branch.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_config.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_human_token.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_provider.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_repo.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/github_trusted_authors.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/groups.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/jira.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/models.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/output.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/presets.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/privacy.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_env.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_local_audit_setup.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_probe.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/providers.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/registry.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/runner.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/runtime.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/self_hosted_runner.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/doctor_checks/supervised_pilot.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/file_locks.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/gate_health.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/gemini_cli_audit_pr.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/git_identity.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/grok_build_audit_pr.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/hermes_cli_audit_pr.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/init.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/jira_mutations.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/jira_pr_sync.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/lane_configs/__init__.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/lane_configs/aider.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/lane_configs/claude.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/lane_configs/codex.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/lane_configs/devin.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/lane_configs/devin_cli.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/lane_configs/gemini_cli.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/lane_configs/grok_build.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/lane_configs/hermes_cli.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/lane_configs/local_llm.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/lane_configs/muse_cli.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/lane_delivery.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/lane_status.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/local_llm_audit_pr.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/local_llm_bakeoff.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/local_llm_calibration.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/local_llm_profiles.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/migration.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/migration_install.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/migration_mirror.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/migration_readiness.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/migration_rehearsal.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/muse_cli_audit_pr.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/next_steps.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/package.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/package_content.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/package_manifest.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/package_paths.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/package_rendering.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/package_static.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/participants.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/plan_context.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/productivity_report.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/prompts.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/provider_credentials.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/provider_registry.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/provider_runners/__init__.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/provider_runners/comments.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/provider_runners/exit_codes.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/provider_runners/git.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/provider_runners/github_auth.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/provider_runners/github_pr.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/provider_runners/pr_worktree.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/provider_runners/process.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/provider_runners/repo_paths.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/provider_runners/text_schema.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/provider_runners/workspace.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/providers/__init__.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/providers/local_cli.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/providers/provenance.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/release_campaigns.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/release_qualify.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/release_readiness.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/reviewer_metrics.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/reviewer_spend.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/saas_reviewer_labeler.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/secrets.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/session.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/builder-experiment.example.json +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/calibration-corpus.example.json +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/calibration-corpus.json +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/code-mower.example.yml +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/context-packs.example.json +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lane_prompts/operability.md +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lane_prompts/plan-conformance.md +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lanes/README.md +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lanes/claude.md +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lanes/codex.md +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lanes/cursor.md +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lanes/devin.md +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lanes/generic.md +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/lanes/run_mac_lane.sh +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/product-support/code_mower +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/product-support/run_devin_cli_audit_pr.sh +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/product-support/status_report.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/providers.yml +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/reviewer-spend.example.json +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/code-mower-gate.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/dispatch-lanes.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/lane-mac-runner.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/needs-owner-notify.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/templates/workflows/weekly-status.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/tracker_contract.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/trailer_comment_labeler.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/versioning.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/work_orders.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower/workflow_actionlint.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower.egg-info/SOURCES.txt +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower.egg-info/dependency_links.txt +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower.egg-info/entry_points.txt +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower.egg-info/requires.txt +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/src/code_mower.egg-info/top_level.txt +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/builder-experiment.example.json +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/calibration-corpus.example.json +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/calibration-corpus.json +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/code-mower.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/context-packs.example.json +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/cursor/BUGBOT.md +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/lanes/README.md +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/lanes/claude.md +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/lanes/codex.md +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/lanes/cursor.md +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/lanes/devin.md +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/lanes/generic.md +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/lanes/run_mac_lane.sh +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/acp_bridge.yml +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/aider.yml +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/antigravity_cli.yml +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/claude_audit.yml +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/claude_review.yml +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/coderabbit_cli.yml +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/codex.yml +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/cursor_bugbot.yml +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/cursor_cloud_agent.yml +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/devin.yml +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/devin_cli.yml +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/gemini_cli.yml +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/gitar.yml +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/greptile.yml +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/hermes_cli.yml +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/local_llm.yml +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/muse_cli.yml +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers/qodo.yml +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/providers.yml +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/reviewer-spend.example.json +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/reviewer-value-report.example.md +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/code-mower-gate.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/dispatch-lanes.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/lane-mac-runner.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/review-clear-stale.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_adoption_diagnostics.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_adoption_result_semantics.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_adoption_run_contract.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_antigravity_cli_audit_pr.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_antigravity_sdk_probe.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_audit_comment_posture.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_audit_limits.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_board.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_builder_experiment.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_builder_identity.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_builder_runs.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_calibration_effect_report.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_calibration_truth.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_campaign_adapters.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_campaign_discovery.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_campaign_gh_auth_and_issue_binding_817.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_campaign_retry_evidence_711.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_checks.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_claude_audit_pr.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_claude_cli_bounce.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_clear_stale.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_cloud_client.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_cloud_git_metadata.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_cloud_manifest.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_cloud_reports.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_coderabbit_cli_audit_pr.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_codex_audit_env_preflight.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_codex_audit_pr.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_controller.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_decision_audit_integration.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_decisions.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_devin_api.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_devin_builder_lane.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_devin_cli_audit_pr.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_devin_provider_contract.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_actions_cost_summary.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_actions_failure_selection.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_boundaries.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_campaign_auth.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_campaign_readiness.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_github_checks.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_output.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_privacy.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_provider_env_required.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_provider_env_tokens.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_provider_local_audit_setup.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_provider_probe.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_provider_review_hygiene.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_registry.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_runtime.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_self_hosted_runner.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_doctor_supervised_pilot.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_file_locks.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_fork_pr_guard.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_gate_automerge.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_gate_health.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_hosted_dispatch_profile.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_init_actionlint.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_init_build_loop.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_jira_adoption.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_jira_mutations.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_jira_pr_sync.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_lane_delivery_contract.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_lane_status.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_local_llm_github_helpers.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_migration_rehearsal.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_migration_setup_drift.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_next_steps.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_package_install_failure_taxonomy.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_participant_sessions.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_plan_context.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_pr_outcome_contract.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_pr_outcome_coverage.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_productivity_metrics_contract.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_productivity_report.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_productivity_windows.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_prompts.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_provider_credentials.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_provider_fixture_contracts.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_provider_local_cli.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_provider_runners_comments.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_provider_runners_git.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_provider_runners_github_pr.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_provider_runners_pr_worktree.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_provider_runners_process.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_provider_runners_repo_paths.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_provider_runners_text_schema.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_provider_runners_workspace.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_release_campaigns.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_release_qualify.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_remote_qualification_failure_reason_819.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_reviewer_finding_outcome_contract.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_reviewer_metrics_core.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_reviewer_spend.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_supervised_pilot_contract.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_tracker_config.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_tracker_contract.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_trailer_comment_labeler.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.2}/tests/test_work_orders.py +0 -0
- {code_mower-1.1.1 → code_mower-1.1.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.1.
|
|
3
|
+
Version: 1.1.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
|
|
@@ -245,7 +245,7 @@ agent report its actual host posture, exact installed version, doctor result,
|
|
|
245
245
|
Board URL, and any owner-only click-list before it mutates the repo.
|
|
246
246
|
|
|
247
247
|
The current package-index announcement entry point is the tagged
|
|
248
|
-
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.1.
|
|
248
|
+
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.1.2/docs/try-in-10-minutes.md)
|
|
249
249
|
guide. The v1.0 supervised-pilot release includes the native Board, the
|
|
250
250
|
controller dry-run and policy contract, adoption and upgrade hardening from
|
|
251
251
|
recent install rehearsals, package-index release checks, provider-diversity
|
|
@@ -348,7 +348,7 @@ Provider-contract baseline for the next release train:
|
|
|
348
348
|
|
|
349
349
|
For release verification,
|
|
350
350
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
351
|
-
the package-index procedure for `v1.1.
|
|
351
|
+
the package-index procedure for `v1.1.2` / `code-mower==1.1.2`. The
|
|
352
352
|
GitHub release records the workflow and rehearsal evidence for the exact tag.
|
|
353
353
|
After publication, [Release Qualification](docs/release-qualification.md)
|
|
354
354
|
coordinates provider-specific install and operational checks without treating
|
|
@@ -542,8 +542,8 @@ measurement work.
|
|
|
542
542
|
|
|
543
543
|
## Installation Status
|
|
544
544
|
|
|
545
|
-
The current package-index release baseline is `v1.1.
|
|
546
|
-
install spec `code-mower==1.1.
|
|
545
|
+
The current package-index release baseline is `v1.1.2`, with pinned package
|
|
546
|
+
install spec `code-mower==1.1.2`. Release evidence is recorded on the GitHub
|
|
547
547
|
release and in the first-user install rehearsal. The public repository is
|
|
548
548
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
|
|
549
549
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
@@ -630,6 +630,7 @@ first so local work exercises the same package entrypoint users install.
|
|
|
630
630
|
- [v1.0.14 Release Notes](docs/v1014-release-notes.md)
|
|
631
631
|
- [v1.0.15 Release Notes](docs/v1015-release-notes.md)
|
|
632
632
|
- [v1.1.1 Release Notes](docs/v111-release-notes.md)
|
|
633
|
+
- [v1.1.2 Release Notes](docs/v112-release-notes.md)
|
|
633
634
|
- [v1.1 Release Notes](docs/v11-release-notes.md)
|
|
634
635
|
- [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
|
|
635
636
|
- [v1.0.1 Effectiveness Assessment](docs/v101-effectiveness-assessment.md)
|
|
@@ -215,7 +215,7 @@ agent report its actual host posture, exact installed version, doctor result,
|
|
|
215
215
|
Board URL, and any owner-only click-list before it mutates the repo.
|
|
216
216
|
|
|
217
217
|
The current package-index announcement entry point is the tagged
|
|
218
|
-
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.1.
|
|
218
|
+
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.1.2/docs/try-in-10-minutes.md)
|
|
219
219
|
guide. The v1.0 supervised-pilot release includes the native Board, the
|
|
220
220
|
controller dry-run and policy contract, adoption and upgrade hardening from
|
|
221
221
|
recent install rehearsals, package-index release checks, provider-diversity
|
|
@@ -318,7 +318,7 @@ Provider-contract baseline for the next release train:
|
|
|
318
318
|
|
|
319
319
|
For release verification,
|
|
320
320
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
321
|
-
the package-index procedure for `v1.1.
|
|
321
|
+
the package-index procedure for `v1.1.2` / `code-mower==1.1.2`. The
|
|
322
322
|
GitHub release records the workflow and rehearsal evidence for the exact tag.
|
|
323
323
|
After publication, [Release Qualification](docs/release-qualification.md)
|
|
324
324
|
coordinates provider-specific install and operational checks without treating
|
|
@@ -512,8 +512,8 @@ measurement work.
|
|
|
512
512
|
|
|
513
513
|
## Installation Status
|
|
514
514
|
|
|
515
|
-
The current package-index release baseline is `v1.1.
|
|
516
|
-
install spec `code-mower==1.1.
|
|
515
|
+
The current package-index release baseline is `v1.1.2`, with pinned package
|
|
516
|
+
install spec `code-mower==1.1.2`. Release evidence is recorded on the GitHub
|
|
517
517
|
release and in the first-user install rehearsal. The public repository is
|
|
518
518
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
|
|
519
519
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
@@ -600,6 +600,7 @@ first so local work exercises the same package entrypoint users install.
|
|
|
600
600
|
- [v1.0.14 Release Notes](docs/v1014-release-notes.md)
|
|
601
601
|
- [v1.0.15 Release Notes](docs/v1015-release-notes.md)
|
|
602
602
|
- [v1.1.1 Release Notes](docs/v111-release-notes.md)
|
|
603
|
+
- [v1.1.2 Release Notes](docs/v112-release-notes.md)
|
|
603
604
|
- [v1.1 Release Notes](docs/v11-release-notes.md)
|
|
604
605
|
- [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
|
|
605
606
|
- [v1.0.1 Effectiveness Assessment](docs/v101-effectiveness-assessment.md)
|
|
@@ -83,16 +83,17 @@ MAX_ATTEMPTS = 4
|
|
|
83
83
|
BACKOFF_BASE_SECONDS = 0.5
|
|
84
84
|
BACKOFF_CAP_SECONDS = 8.0
|
|
85
85
|
RETRY_AFTER_CAP_SECONDS = 60
|
|
86
|
-
SEARCH_PAGE_SIZE =
|
|
86
|
+
SEARCH_PAGE_SIZE = 25
|
|
87
87
|
SEARCH_MAX_ISSUES = 200
|
|
88
88
|
#: Maximum enhanced-JQL page fetches per search call. This bound is
|
|
89
89
|
#: independent of the count of collected usable issues so that empty or
|
|
90
90
|
#: unusable pages with fresh continuation tokens cannot loop forever.
|
|
91
|
-
SEARCH_MAX_PAGES =
|
|
91
|
+
SEARCH_MAX_PAGES = 40
|
|
92
92
|
#: Create-metadata page size and maximum page fetches per discovery call.
|
|
93
93
|
CREATEMETA_PAGE_SIZE = 50
|
|
94
94
|
CREATEMETA_MAX_PAGES = 8
|
|
95
95
|
MAX_REQUIRED_CREATE_FIELDS = 64
|
|
96
|
+
MAX_ISSUE_TYPES = 256
|
|
96
97
|
KEYCHAIN_TIMEOUT_SECONDS = 10
|
|
97
98
|
MAX_METADATA_VALUE_LENGTH = 128
|
|
98
99
|
MAX_LABEL_LENGTH = 128
|
|
@@ -261,6 +262,21 @@ def _bounded_labels(value: Any) -> list[str]:
|
|
|
261
262
|
return sorted(set(names))[:MAX_LABELS]
|
|
262
263
|
|
|
263
264
|
|
|
265
|
+
def _bounded_issue_types(value: Any) -> list[dict[str, str]]:
|
|
266
|
+
issue_types: list[dict[str, str]] = []
|
|
267
|
+
seen_ids: set[str] = set()
|
|
268
|
+
entries = value if isinstance(value, list) else []
|
|
269
|
+
for entry in entries:
|
|
270
|
+
if not isinstance(entry, Mapping):
|
|
271
|
+
continue
|
|
272
|
+
type_id = _bounded_str(entry.get("id"), 32)
|
|
273
|
+
if not type_id or not _TOKEN_ID_RE.fullmatch(type_id) or type_id in seen_ids:
|
|
274
|
+
continue
|
|
275
|
+
seen_ids.add(type_id)
|
|
276
|
+
issue_types.append({"id": type_id, "name": _bounded_str(entry.get("name"))})
|
|
277
|
+
return issue_types
|
|
278
|
+
|
|
279
|
+
|
|
264
280
|
def default_keychain_runner(argv: Sequence[str], env: Mapping[str, str]) -> str:
|
|
265
281
|
"""Read one generic-password entry through the macOS ``security`` CLI.
|
|
266
282
|
|
|
@@ -1059,12 +1075,30 @@ class JiraReadClient:
|
|
|
1059
1075
|
Follows bounded create-metadata pagination. Repeated or malformed
|
|
1060
1076
|
pagination state fails closed instead of presenting a partial page
|
|
1061
1077
|
as the exhaustive set. A response with no pagination keys is one
|
|
1062
|
-
exhaustive page.
|
|
1078
|
+
exhaustive page. Jira sites that return 404 for create metadata fall
|
|
1079
|
+
back to the project issue-type endpoint; other failures remain visible.
|
|
1063
1080
|
"""
|
|
1064
1081
|
if not _PROJECT_ID_RE.fullmatch(project_id):
|
|
1065
1082
|
raise ValueError("project_id must be a bounded numeric id")
|
|
1066
1083
|
quoted = urllib.parse.quote(project_id, safe="")
|
|
1067
1084
|
path = f"/rest/api/3/issue/createmeta/{quoted}/issuetypes"
|
|
1085
|
+
try:
|
|
1086
|
+
return self._get_createmeta_issue_types(path)
|
|
1087
|
+
except JiraApiError as exc:
|
|
1088
|
+
if exc.code != "jira_not_found":
|
|
1089
|
+
raise
|
|
1090
|
+
raw_types = self.request_list(
|
|
1091
|
+
"GET",
|
|
1092
|
+
"/rest/api/3/issuetype/project",
|
|
1093
|
+
query={"projectId": project_id},
|
|
1094
|
+
endpoint="issueTypeProject",
|
|
1095
|
+
)
|
|
1096
|
+
if len(raw_types) > MAX_ISSUE_TYPES:
|
|
1097
|
+
raise JiraApiError("jira_unavailable", endpoint="issueTypeProject")
|
|
1098
|
+
return _bounded_issue_types(raw_types)
|
|
1099
|
+
|
|
1100
|
+
def _get_createmeta_issue_types(self, path: str) -> list[dict[str, str]]:
|
|
1101
|
+
"""Read bounded create-metadata pages from one validated path."""
|
|
1068
1102
|
issue_types: list[dict[str, str]] = []
|
|
1069
1103
|
seen_ids: set[str] = set()
|
|
1070
1104
|
start_at = 0
|
|
@@ -1082,18 +1116,10 @@ class JiraReadClient:
|
|
|
1082
1116
|
raw_types = data.get("issueTypes")
|
|
1083
1117
|
if not isinstance(raw_types, list):
|
|
1084
1118
|
raise JiraApiError("jira_unavailable", endpoint="createMeta")
|
|
1085
|
-
for entry in raw_types:
|
|
1086
|
-
if not
|
|
1087
|
-
|
|
1088
|
-
|
|
1089
|
-
if not type_id or not _TOKEN_ID_RE.fullmatch(type_id):
|
|
1090
|
-
continue
|
|
1091
|
-
if type_id in seen_ids:
|
|
1092
|
-
continue
|
|
1093
|
-
seen_ids.add(type_id)
|
|
1094
|
-
issue_types.append(
|
|
1095
|
-
{"id": type_id, "name": _bounded_str(entry.get("name"))}
|
|
1096
|
-
)
|
|
1119
|
+
for entry in _bounded_issue_types(raw_types):
|
|
1120
|
+
if entry["id"] not in seen_ids:
|
|
1121
|
+
seen_ids.add(entry["id"])
|
|
1122
|
+
issue_types.append(entry)
|
|
1097
1123
|
if "total" not in data and "startAt" not in data:
|
|
1098
1124
|
break
|
|
1099
1125
|
total = _parse_createmeta_total(data, endpoint="createMeta")
|
|
@@ -16,6 +16,11 @@ from urllib.parse import urlsplit
|
|
|
16
16
|
from .tracker_contract import TRACKER_WORK_ITEM_SCHEMA, validate_tracker_work_item
|
|
17
17
|
|
|
18
18
|
|
|
19
|
+
QUEUE_PAGE_SIZE = 25
|
|
20
|
+
QUEUE_DEFAULT_MAX_PAGES = 10
|
|
21
|
+
QUEUE_MAX_PAGES = 40
|
|
22
|
+
|
|
23
|
+
|
|
19
24
|
class JiraQueueReader(Protocol):
|
|
20
25
|
"""Minimal enhanced-search seam for #800; no transport implementation here."""
|
|
21
26
|
|
|
@@ -203,7 +208,8 @@ def normalize_jira_work_item(raw: Mapping[str, Any], config: Mapping[str, Any])
|
|
|
203
208
|
|
|
204
209
|
def collect_queue(
|
|
205
210
|
config: Mapping[str, Any], *, reader: JiraQueueReader | None = None,
|
|
206
|
-
now: datetime | None = None, max_pages: int =
|
|
211
|
+
now: datetime | None = None, max_pages: int = QUEUE_DEFAULT_MAX_PAGES,
|
|
212
|
+
page_size: int = QUEUE_PAGE_SIZE,
|
|
207
213
|
) -> dict[str, Any]:
|
|
208
214
|
"""Bounded enhanced JQL reads. Partial/error results never become eligible."""
|
|
209
215
|
observed = now or datetime.now(UTC)
|
|
@@ -227,12 +233,13 @@ def collect_queue(
|
|
|
227
233
|
seen_tokens: set[str] = set()
|
|
228
234
|
items = {}
|
|
229
235
|
token = None
|
|
230
|
-
|
|
231
|
-
|
|
236
|
+
bounded_page_size = min(QUEUE_PAGE_SIZE, max(1, page_size))
|
|
237
|
+
for _ in range(min(QUEUE_MAX_PAGES, max(1, max_pages))):
|
|
238
|
+
page = reader.search_page(jql=query, fields=sorted(fields), max_results=bounded_page_size, next_page_token=token)
|
|
232
239
|
if "isLast" in page and not isinstance(page["isLast"], bool):
|
|
233
240
|
raise ValueError("invalid completion marker")
|
|
234
241
|
raw_items = page["issues"]
|
|
235
|
-
if not isinstance(raw_items, list) or len(raw_items) >
|
|
242
|
+
if not isinstance(raw_items, list) or len(raw_items) > bounded_page_size:
|
|
236
243
|
raise ValueError("invalid page")
|
|
237
244
|
for raw in raw_items:
|
|
238
245
|
item = normalize_jira_work_item(raw, jira)
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code-mower
|
|
3
|
-
Version: 1.1.
|
|
3
|
+
Version: 1.1.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
|
|
@@ -245,7 +245,7 @@ agent report its actual host posture, exact installed version, doctor result,
|
|
|
245
245
|
Board URL, and any owner-only click-list before it mutates the repo.
|
|
246
246
|
|
|
247
247
|
The current package-index announcement entry point is the tagged
|
|
248
|
-
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.1.
|
|
248
|
+
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v1.1.2/docs/try-in-10-minutes.md)
|
|
249
249
|
guide. The v1.0 supervised-pilot release includes the native Board, the
|
|
250
250
|
controller dry-run and policy contract, adoption and upgrade hardening from
|
|
251
251
|
recent install rehearsals, package-index release checks, provider-diversity
|
|
@@ -348,7 +348,7 @@ Provider-contract baseline for the next release train:
|
|
|
348
348
|
|
|
349
349
|
For release verification,
|
|
350
350
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
351
|
-
the package-index procedure for `v1.1.
|
|
351
|
+
the package-index procedure for `v1.1.2` / `code-mower==1.1.2`. The
|
|
352
352
|
GitHub release records the workflow and rehearsal evidence for the exact tag.
|
|
353
353
|
After publication, [Release Qualification](docs/release-qualification.md)
|
|
354
354
|
coordinates provider-specific install and operational checks without treating
|
|
@@ -542,8 +542,8 @@ measurement work.
|
|
|
542
542
|
|
|
543
543
|
## Installation Status
|
|
544
544
|
|
|
545
|
-
The current package-index release baseline is `v1.1.
|
|
546
|
-
install spec `code-mower==1.1.
|
|
545
|
+
The current package-index release baseline is `v1.1.2`, with pinned package
|
|
546
|
+
install spec `code-mower==1.1.2`. Release evidence is recorded on the GitHub
|
|
547
547
|
release and in the first-user install rehearsal. The public repository is
|
|
548
548
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
|
|
549
549
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
@@ -630,6 +630,7 @@ first so local work exercises the same package entrypoint users install.
|
|
|
630
630
|
- [v1.0.14 Release Notes](docs/v1014-release-notes.md)
|
|
631
631
|
- [v1.0.15 Release Notes](docs/v1015-release-notes.md)
|
|
632
632
|
- [v1.1.1 Release Notes](docs/v111-release-notes.md)
|
|
633
|
+
- [v1.1.2 Release Notes](docs/v112-release-notes.md)
|
|
633
634
|
- [v1.1 Release Notes](docs/v11-release-notes.md)
|
|
634
635
|
- [Post-v0.8 Effectiveness Assessment](docs/post-v08-effectiveness-assessment.md)
|
|
635
636
|
- [v1.0.1 Effectiveness Assessment](docs/v101-effectiveness-assessment.md)
|
|
@@ -898,6 +898,7 @@ class ReadPrimitiveTests(unittest.TestCase):
|
|
|
898
898
|
# Only bounded metadata fields are requested and returned.
|
|
899
899
|
for body in bodies:
|
|
900
900
|
self.assertLessEqual(set(body["fields"]), jira_cloud.SAFE_SEARCH_FIELDS)
|
|
901
|
+
self.assertEqual(body["maxResults"], jira_cloud.SEARCH_PAGE_SIZE)
|
|
901
902
|
first = result["issues"][0]
|
|
902
903
|
self.assertEqual(first["id"], "20001")
|
|
903
904
|
self.assertEqual(first["fields"]["status_id"], "10000")
|
|
@@ -1737,6 +1738,43 @@ class IssueTypePaginationTests(unittest.TestCase):
|
|
|
1737
1738
|
self.assertIn("startAt=0", runner.calls[0]["url"])
|
|
1738
1739
|
self.assertIn("startAt=2", runner.calls[1]["url"])
|
|
1739
1740
|
|
|
1741
|
+
def test_not_found_falls_back_to_project_issue_types(self) -> None:
|
|
1742
|
+
runner = FakeHttp(
|
|
1743
|
+
[
|
|
1744
|
+
http_error(404),
|
|
1745
|
+
http_response(load_fixture("project_issue_types.json")),
|
|
1746
|
+
]
|
|
1747
|
+
)
|
|
1748
|
+
client = make_client(runner)
|
|
1749
|
+
types = client.get_issue_types(PROJECT_ID)
|
|
1750
|
+
self.assertEqual(
|
|
1751
|
+
types,
|
|
1752
|
+
[{"id": "10001", "name": "Task"}, {"id": "10002", "name": "Bug"}],
|
|
1753
|
+
)
|
|
1754
|
+
self.assertIn("/issue/createmeta/", runner.calls[0]["url"])
|
|
1755
|
+
self.assertIn("/issuetype/project?projectId=10001", runner.calls[1]["url"])
|
|
1756
|
+
self.assertNotIn("fixture prose", json.dumps(types))
|
|
1757
|
+
|
|
1758
|
+
def test_non_not_found_failure_does_not_fall_back(self) -> None:
|
|
1759
|
+
runner = FakeHttp([http_error(403)])
|
|
1760
|
+
client = make_client(runner)
|
|
1761
|
+
with self.assertRaises(jira_cloud.JiraApiError) as ctx:
|
|
1762
|
+
client.get_issue_types(PROJECT_ID)
|
|
1763
|
+
self.assertEqual(ctx.exception.code, "jira_forbidden")
|
|
1764
|
+
self.assertEqual(len(runner.calls), 1)
|
|
1765
|
+
|
|
1766
|
+
def test_fallback_issue_type_inventory_is_bounded(self) -> None:
|
|
1767
|
+
raw = [
|
|
1768
|
+
{"id": str(index), "name": f"Type {index}"}
|
|
1769
|
+
for index in range(jira_cloud.MAX_ISSUE_TYPES + 1)
|
|
1770
|
+
]
|
|
1771
|
+
runner = FakeHttp([http_error(404), http_response(raw)])
|
|
1772
|
+
client = make_client(runner)
|
|
1773
|
+
with self.assertRaises(jira_cloud.JiraApiError) as ctx:
|
|
1774
|
+
client.get_issue_types(PROJECT_ID)
|
|
1775
|
+
self.assertEqual(ctx.exception.code, "jira_unavailable")
|
|
1776
|
+
self.assertEqual(ctx.exception.endpoint, "issueTypeProject")
|
|
1777
|
+
|
|
1740
1778
|
def test_page_bound_fails_closed(self) -> None:
|
|
1741
1779
|
script = [
|
|
1742
1780
|
self.page([(f"1000{index}", f"Type{index}")], index, 10000)
|
|
@@ -65,7 +65,7 @@ from scripts import guard_package_workflows, privacy_scan
|
|
|
65
65
|
|
|
66
66
|
class ReleaseHygieneTests(unittest.TestCase):
|
|
67
67
|
def test_version_is_current_supervised_pilot_release(self) -> None:
|
|
68
|
-
self.assertEqual(__version__, "1.1.
|
|
68
|
+
self.assertEqual(__version__, "1.1.2")
|
|
69
69
|
|
|
70
70
|
def test_dogfood_repo_has_real_root_config(self) -> None:
|
|
71
71
|
config_path = ROOT / "code-mower.yml"
|
|
@@ -216,7 +216,7 @@ class ReleaseHygieneTests(unittest.TestCase):
|
|
|
216
216
|
self.assertIn("Cold Install Vs Upgrade", install)
|
|
217
217
|
self.assertIn("Switching Between pipx And uv", install)
|
|
218
218
|
self.assertIn("uv tool install --python 3.12 --reinstall --refresh-package", install)
|
|
219
|
-
self.assertIn("code-mower==1.1.
|
|
219
|
+
self.assertIn("code-mower==1.1.2", troubleshooting)
|
|
220
220
|
self.assertNotIn("code-mower==0.8.0b1", troubleshooting)
|
|
221
221
|
self.assertIn("pipx uninstall code-mower", install)
|
|
222
222
|
for env_name in ("PIPX_HOME", "PIPX_BIN_DIR", "PIPX_LOG_DIR"):
|
|
@@ -1100,7 +1100,7 @@ exit 1
|
|
|
1100
1100
|
)
|
|
1101
1101
|
|
|
1102
1102
|
self.assertNotEqual(completed.returncode, 0)
|
|
1103
|
-
self.assertIn("pipx install code-mower==1.1.
|
|
1103
|
+
self.assertIn("pipx install code-mower==1.1.2", completed.stderr)
|
|
1104
1104
|
self.assertIn("scripts/dev-python -m venv .venv", completed.stderr)
|
|
1105
1105
|
self.assertIn(".venv/bin/code-mower", completed.stderr)
|
|
1106
1106
|
self.assertNotIn("PYTHONPATH=src", completed.stderr)
|
|
@@ -3238,10 +3238,10 @@ jobs:
|
|
|
3238
3238
|
|
|
3239
3239
|
cases = (
|
|
3240
3240
|
(
|
|
3241
|
-
'CODE_MOWER_STANDALONE_REF="v1.1.
|
|
3241
|
+
'CODE_MOWER_STANDALONE_REF="v1.1.2"\n',
|
|
3242
3242
|
"pass",
|
|
3243
3243
|
"matches_running_package",
|
|
3244
|
-
"v1.1.
|
|
3244
|
+
"v1.1.2",
|
|
3245
3245
|
),
|
|
3246
3246
|
(
|
|
3247
3247
|
'CODE_MOWER_STANDALONE_REF="v0.9.1-beta.1"\n',
|
|
@@ -3272,12 +3272,12 @@ jobs:
|
|
|
3272
3272
|
|
|
3273
3273
|
payload = migration._standalone_pin_drift_summary(
|
|
3274
3274
|
repo,
|
|
3275
|
-
package_version="1.1.
|
|
3275
|
+
package_version="1.1.2",
|
|
3276
3276
|
)
|
|
3277
3277
|
|
|
3278
3278
|
self.assertEqual(payload["status"], status)
|
|
3279
3279
|
self.assertEqual(payload["reason"], reason)
|
|
3280
|
-
self.assertEqual(payload["expected_ref"], "v1.1.
|
|
3280
|
+
self.assertEqual(payload["expected_ref"], "v1.1.2")
|
|
3281
3281
|
if current_ref is None:
|
|
3282
3282
|
self.assertNotIn("current_ref", payload)
|
|
3283
3283
|
else:
|
|
@@ -3298,7 +3298,7 @@ jobs:
|
|
|
3298
3298
|
|
|
3299
3299
|
payload = migration._standalone_pin_drift_summary(
|
|
3300
3300
|
repo,
|
|
3301
|
-
package_version="1.1.
|
|
3301
|
+
package_version="1.1.2",
|
|
3302
3302
|
)
|
|
3303
3303
|
|
|
3304
3304
|
self.assertEqual(payload["status"], "warn")
|
|
@@ -3361,7 +3361,7 @@ jobs:
|
|
|
3361
3361
|
"standalone_pin": {
|
|
3362
3362
|
"status": "skip",
|
|
3363
3363
|
"reason": "pin_file_absent",
|
|
3364
|
-
"expected_ref": "v1.1.
|
|
3364
|
+
"expected_ref": "v1.1.2",
|
|
3365
3365
|
},
|
|
3366
3366
|
"builder_hint": {
|
|
3367
3367
|
"status": "skip",
|
|
@@ -3373,7 +3373,7 @@ jobs:
|
|
|
3373
3373
|
|
|
3374
3374
|
rendered = migration.render_setup_drift_text(payload)
|
|
3375
3375
|
|
|
3376
|
-
self.assertIn("Standalone pin: SKIP pin_file_absent expected=v1.1.
|
|
3376
|
+
self.assertIn("Standalone pin: SKIP pin_file_absent expected=v1.1.2", rendered)
|
|
3377
3377
|
|
|
3378
3378
|
def test_setup_drift_reports_builder_hint_when_builders_omitted(self) -> None:
|
|
3379
3379
|
from code_mower import migration
|
|
@@ -5553,11 +5553,11 @@ printf 'repo:%s:%s:%s\\n' "${lane}" "${stdin_flag}" "${token}"
|
|
|
5553
5553
|
(output_dir / "src/code_mower/cloud_client/dogfood.py").is_file()
|
|
5554
5554
|
)
|
|
5555
5555
|
self.assertIn(
|
|
5556
|
-
'version = "1.1.
|
|
5556
|
+
'version = "1.1.2"',
|
|
5557
5557
|
(output_dir / "pyproject.toml").read_text(encoding="utf-8"),
|
|
5558
5558
|
)
|
|
5559
5559
|
self.assertIn(
|
|
5560
|
-
'__version__ = "1.1.
|
|
5560
|
+
'__version__ = "1.1.2"',
|
|
5561
5561
|
(output_dir / "src/code_mower/__init__.py").read_text(
|
|
5562
5562
|
encoding="utf-8"
|
|
5563
5563
|
),
|
|
@@ -7562,7 +7562,7 @@ def main():
|
|
|
7562
7562
|
"pip",
|
|
7563
7563
|
"install",
|
|
7564
7564
|
"--no-cache-dir",
|
|
7565
|
-
"code-mower==1.1.
|
|
7565
|
+
"code-mower==1.1.2",
|
|
7566
7566
|
]
|
|
7567
7567
|
|
|
7568
7568
|
def fake_run_step(*args: object, **kwargs: object) -> subprocess.CompletedProcess[str]:
|
|
@@ -7629,7 +7629,7 @@ def main():
|
|
|
7629
7629
|
self.assertTrue(code_mower_migration._package_spec_uses_package_index("code-mower"))
|
|
7630
7630
|
self.assertTrue(
|
|
7631
7631
|
code_mower_migration._package_spec_uses_package_index(
|
|
7632
|
-
"code-mower==1.1.
|
|
7632
|
+
"code-mower==1.1.2"
|
|
7633
7633
|
)
|
|
7634
7634
|
)
|
|
7635
7635
|
self.assertFalse(code_mower_migration._package_spec_uses_package_index("."))
|
|
@@ -7638,7 +7638,7 @@ def main():
|
|
|
7638
7638
|
)
|
|
7639
7639
|
self.assertFalse(
|
|
7640
7640
|
code_mower_migration._package_spec_uses_package_index(
|
|
7641
|
-
"git+https://github.com/codemower-ai/code-mower.git@v1.1.
|
|
7641
|
+
"git+https://github.com/codemower-ai/code-mower.git@v1.1.2"
|
|
7642
7642
|
)
|
|
7643
7643
|
)
|
|
7644
7644
|
|
|
@@ -7648,7 +7648,7 @@ def main():
|
|
|
7648
7648
|
|
|
7649
7649
|
with self.assertRaisesRegex(ValueError, "--allow-package-index"):
|
|
7650
7650
|
code_mower_migration.run_package_install_rehearsal(
|
|
7651
|
-
package_spec="code-mower==1.1.
|
|
7651
|
+
package_spec="code-mower==1.1.2",
|
|
7652
7652
|
work_dir=work_dir,
|
|
7653
7653
|
)
|
|
7654
7654
|
|
|
@@ -7676,7 +7676,7 @@ def main():
|
|
|
7676
7676
|
[
|
|
7677
7677
|
"package-install-rehearsal",
|
|
7678
7678
|
"--package-spec",
|
|
7679
|
-
"code-mower==1.1.
|
|
7679
|
+
"code-mower==1.1.2",
|
|
7680
7680
|
"--allow-package-index",
|
|
7681
7681
|
"--upgrade-pip",
|
|
7682
7682
|
"--pip-no-cache",
|
|
@@ -7732,10 +7732,10 @@ def main():
|
|
|
7732
7732
|
payload = release_readiness.render_release_readiness(ROOT)
|
|
7733
7733
|
|
|
7734
7734
|
self.assertEqual(payload["status"], "pass")
|
|
7735
|
-
self.assertEqual(payload["version"], "1.1.
|
|
7736
|
-
self.assertEqual(payload["release_tag"], "v1.1.
|
|
7737
|
-
self.assertEqual(payload["alpha_tag"], "v1.1.
|
|
7738
|
-
self.assertEqual(payload["package_index_spec"], "code-mower==1.1.
|
|
7735
|
+
self.assertEqual(payload["version"], "1.1.2")
|
|
7736
|
+
self.assertEqual(payload["release_tag"], "v1.1.2")
|
|
7737
|
+
self.assertEqual(payload["alpha_tag"], "v1.1.2")
|
|
7738
|
+
self.assertEqual(payload["package_index_spec"], "code-mower==1.1.2")
|
|
7739
7739
|
check_ids = {check["id"]: check for check in payload["checks"]}
|
|
7740
7740
|
self.assertEqual(check_ids["package-version-consistency"]["status"], "pass")
|
|
7741
7741
|
self.assertEqual(
|
|
@@ -7751,9 +7751,9 @@ def main():
|
|
|
7751
7751
|
self.assertEqual(check_ids["public-support-redaction-guidance"]["status"], "pass")
|
|
7752
7752
|
commands = {action["id"]: action["command"] for action in payload["next_actions"]}
|
|
7753
7753
|
urls = {action["id"]: action.get("url", "") for action in payload["next_actions"]}
|
|
7754
|
-
self.assertIn("--ref v1.1.
|
|
7754
|
+
self.assertIn("--ref v1.1.2", commands["dry-run-release-workflow"])
|
|
7755
7755
|
self.assertNotIn("--ref main", commands["dry-run-release-workflow"])
|
|
7756
|
-
self.assertIn("--ref v1.1.
|
|
7756
|
+
self.assertIn("--ref v1.1.2", commands["publish-testpypi-candidate"])
|
|
7757
7757
|
self.assertNotIn("--ref main", commands["publish-testpypi-candidate"])
|
|
7758
7758
|
self.assertIn("publish_testpypi=true", commands["publish-testpypi-candidate"])
|
|
7759
7759
|
self.assertIn("publish_pypi=false", commands["publish-testpypi-candidate"])
|
|
@@ -7790,7 +7790,7 @@ def main():
|
|
|
7790
7790
|
check_ids = {check["id"]: check for check in payload["checks"]}
|
|
7791
7791
|
check = check_ids["materialized-package-version-consistency"]
|
|
7792
7792
|
self.assertEqual(check["status"], "fail")
|
|
7793
|
-
self.assertEqual(check["detail"]["source_version"], "1.1.
|
|
7793
|
+
self.assertEqual(check["detail"]["source_version"], "1.1.2")
|
|
7794
7794
|
self.assertEqual(check["detail"]["generated_init_version"], "0.0.0")
|
|
7795
7795
|
|
|
7796
7796
|
def test_public_support_docs_are_packaged_and_privacy_forward(self) -> None:
|
|
@@ -7894,20 +7894,20 @@ def main():
|
|
|
7894
7894
|
"v1.0.0-rc.1",
|
|
7895
7895
|
)
|
|
7896
7896
|
self.assertEqual(
|
|
7897
|
-
release_readiness._release_tag_for_version("1.1.
|
|
7898
|
-
"v1.1.
|
|
7897
|
+
release_readiness._release_tag_for_version("1.1.2"),
|
|
7898
|
+
"v1.1.2",
|
|
7899
7899
|
)
|
|
7900
7900
|
self.assertEqual(
|
|
7901
|
-
code_mower_versioning.release_tag_for_version("1.1.
|
|
7902
|
-
"v1.1.
|
|
7901
|
+
code_mower_versioning.release_tag_for_version("1.1.2"),
|
|
7902
|
+
"v1.1.2",
|
|
7903
7903
|
)
|
|
7904
7904
|
|
|
7905
7905
|
def test_public_release_baseline_helpers_derive_announcement_links(self) -> None:
|
|
7906
7906
|
self.assertEqual(
|
|
7907
7907
|
code_mower_versioning.public_baseline_sentence(__version__),
|
|
7908
7908
|
(
|
|
7909
|
-
"The current package-index release baseline is `v1.1.
|
|
7910
|
-
"with pinned package install spec `code-mower==1.1.
|
|
7909
|
+
"The current package-index release baseline is `v1.1.2`, "
|
|
7910
|
+
"with pinned package install spec `code-mower==1.1.2`. "
|
|
7911
7911
|
"Release evidence is recorded on the GitHub release and in the "
|
|
7912
7912
|
"first-user install rehearsal."
|
|
7913
7913
|
),
|
|
@@ -7916,7 +7916,7 @@ def main():
|
|
|
7916
7916
|
code_mower_versioning.tagged_doc_url(__version__),
|
|
7917
7917
|
(
|
|
7918
7918
|
"https://github.com/codemower-ai/code-mower/blob/"
|
|
7919
|
-
"v1.1.
|
|
7919
|
+
"v1.1.2/docs/try-in-10-minutes.md"
|
|
7920
7920
|
),
|
|
7921
7921
|
)
|
|
7922
7922
|
|
|
@@ -7969,15 +7969,15 @@ def main():
|
|
|
7969
7969
|
)
|
|
7970
7970
|
|
|
7971
7971
|
current_status = (
|
|
7972
|
-
"The current package-index release baseline is `v1.1.
|
|
7973
|
-
"pinned package install spec `code-mower==1.1.
|
|
7972
|
+
"The current package-index release baseline is `v1.1.2`, with "
|
|
7973
|
+
"pinned package install spec `code-mower==1.1.2`. Release "
|
|
7974
7974
|
"evidence is recorded on the GitHub release and in the first-user "
|
|
7975
7975
|
"install rehearsal."
|
|
7976
7976
|
)
|
|
7977
7977
|
for text in (readme, current_state, rollout):
|
|
7978
7978
|
self.assertIn(current_status, " ".join(text.split()))
|
|
7979
7979
|
self.assertIn(
|
|
7980
|
-
"The current package-index release entrypoint is `code-mower==1.1.
|
|
7980
|
+
"The current package-index release entrypoint is `code-mower==1.1.2`",
|
|
7981
7981
|
public_release,
|
|
7982
7982
|
)
|
|
7983
7983
|
self.assertIn("The v1.0 supervised-pilot release includes", public_release)
|
|
@@ -7987,7 +7987,7 @@ def main():
|
|
|
7987
7987
|
)
|
|
7988
7988
|
|
|
7989
7989
|
self.assertIn(
|
|
7990
|
-
"The current public-release baseline is `v1.1.
|
|
7990
|
+
"The current public-release baseline is `v1.1.2`",
|
|
7991
7991
|
oss_checklist,
|
|
7992
7992
|
)
|
|
7993
7993
|
self.assertIn(
|
|
@@ -8018,7 +8018,7 @@ def main():
|
|
|
8018
8018
|
" ".join(first_user.split()),
|
|
8019
8019
|
)
|
|
8020
8020
|
self.assertIn("never substitute mutable `main`", first_user)
|
|
8021
|
-
self.assertEqual(first_user.count(" --ref v1.1.
|
|
8021
|
+
self.assertEqual(first_user.count(" --ref v1.1.2 \\"), 2)
|
|
8022
8022
|
self.assertNotIn(" --ref main \\", first_user)
|
|
8023
8023
|
self.assertIn("-f publish_testpypi=true", first_user)
|
|
8024
8024
|
self.assertIn("-f publish_pypi=false", first_user)
|
|
@@ -8030,23 +8030,23 @@ def main():
|
|
|
8030
8030
|
first_user,
|
|
8031
8031
|
)
|
|
8032
8032
|
self.assertNotIn(
|
|
8033
|
-
"The latest public-package rehearsal for `v1.1.
|
|
8033
|
+
"The latest public-package rehearsal for `v1.1.2` was run",
|
|
8034
8034
|
first_user,
|
|
8035
8035
|
)
|
|
8036
|
-
self.assertNotIn("TestPyPI is not\npublished for `1.1.
|
|
8036
|
+
self.assertNotIn("TestPyPI is not\npublished for `1.1.2`", first_user)
|
|
8037
8037
|
for text in (readme, current_state, rollout):
|
|
8038
8038
|
self.assertNotIn(
|
|
8039
|
-
"published on PyPI as `code-mower==1.1.
|
|
8039
|
+
"published on PyPI as `code-mower==1.1.2`",
|
|
8040
8040
|
text,
|
|
8041
8041
|
)
|
|
8042
8042
|
self.assertNotIn(
|
|
8043
8043
|
"latest 10/10 public-package readiness proof for "
|
|
8044
|
-
"`code-mower==1.1.
|
|
8044
|
+
"`code-mower==1.1.2`",
|
|
8045
8045
|
text,
|
|
8046
8046
|
)
|
|
8047
8047
|
self.assertNotIn(
|
|
8048
8048
|
"public PyPI package-install rehearsal from "
|
|
8049
|
-
"`code-mower==1.1.
|
|
8049
|
+
"`code-mower==1.1.2`",
|
|
8050
8050
|
text,
|
|
8051
8051
|
)
|
|
8052
8052
|
self.assertNotIn("beta.52: 10/10 first-user readiness", text)
|
|
@@ -8346,7 +8346,7 @@ def main():
|
|
|
8346
8346
|
|
|
8347
8347
|
self.assertIn("Python 3.12 or newer", install)
|
|
8348
8348
|
self.assertIn('pipx install --python "$CODE_MOWER_PYTHON"', install)
|
|
8349
|
-
self.assertIn("uv tool install --python 3.12 code-mower==1.1.
|
|
8349
|
+
self.assertIn("uv tool install --python 3.12 code-mower==1.1.2", install)
|
|
8350
8350
|
self.assertIn(
|
|
8351
8351
|
'PIP_NO_CACHE_DIR=1 pipx install --force --python "$CODE_MOWER_PYTHON"',
|
|
8352
8352
|
install,
|
|
@@ -8440,7 +8440,7 @@ def main():
|
|
|
8440
8440
|
/ "v101-effectiveness-assessment.md",
|
|
8441
8441
|
}
|
|
8442
8442
|
stale_phrases = (
|
|
8443
|
-
"pipx install --python python3.12 code-mower==1.1.
|
|
8443
|
+
"pipx install --python python3.12 code-mower==1.1.2",
|
|
8444
8444
|
"Use only after TestPyPI passes.",
|
|
8445
8445
|
"future newest betas until 1.0",
|
|
8446
8446
|
"during v0.7 adoption",
|
|
@@ -8736,7 +8736,7 @@ def main():
|
|
|
8736
8736
|
"doctor --adoption --repo codemower-ai/code-mower",
|
|
8737
8737
|
doctor_step["command"],
|
|
8738
8738
|
)
|
|
8739
|
-
self.assertIn("code-mower==1.1.
|
|
8739
|
+
self.assertIn("code-mower==1.1.2", package_step["command"])
|
|
8740
8740
|
self.assertIn("--allow-package-index", package_step["command"])
|
|
8741
8741
|
self.assertIn("current published PyPI package", package_step["why"])
|
|
8742
8742
|
self.assertIn("first_user_readiness", package_step["why"])
|