code-mower 0.5.0b45__tar.gz → 0.5.0b46__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-0.5.0b45 → code_mower-0.5.0b46}/PKG-INFO +6 -6
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/README.md +5 -5
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/pyproject.toml +1 -1
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/__init__.py +1 -1
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/cli.py +1 -1
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/init.py +15 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/workflows/builder-provenance.yml.j2 +1 -1
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/workflows/code-mower-gate.yml.j2 +36 -4
- {code_mower-0.5.0b45 → code_mower-0.5.0b46/src/code_mower}/templates/workflows/review-clear-stale.yml.j2 +1 -1
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower.egg-info/PKG-INFO +6 -6
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/workflows/code-mower-gate.yml.j2 +36 -4
- {code_mower-0.5.0b45/src/code_mower → code_mower-0.5.0b46}/templates/workflows/review-clear-stale.yml.j2 +1 -1
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_release_hygiene.py +151 -37
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/CODE_OF_CONDUCT.md +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/LICENSE +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/MANIFEST.in +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/NOTICE +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/SUPPORT.md +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/requirements/requirements.txt +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/setup.cfg +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/adapters/__init__.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/adapters/_base.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/adapters/cursor_bugbot.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/adapters/gitar.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/adapters/greptile.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/adapters/qodo.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/audit_handoff_log.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/audit_labeler_lib.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/audit_progress.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/blind_review_artifacts.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/blind_review_coordinator.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/bootstrap.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/builder_experiment.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/builder_runs.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/calibration/__init__.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/calibration/arms.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/calibration/auto_discovery.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/calibration/commands.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/calibration/context_inputs.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/calibration/corpus.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/calibration/effect_report.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/calibration/evidence.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/calibration/evidence_report.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/calibration/identity.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/calibration/metrics.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/calibration/overlap.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/calibration/planning.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/calibration/policy.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/calibration/results.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/calibration/run_results.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/calibration/run_status.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/calibration/runner.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/calibration/truth.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/calibration/value_report.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/checks.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/claude_audit_pr.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/claude_cli_bounce.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/claude_cli_environment.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/clear_stale.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/cloud.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/cloud_client/__init__.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/cloud_client/bundle.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/cloud_client/doctor.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/cloud_client/dogfood.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/cloud_client/endpoints.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/cloud_client/errors.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/cloud_client/events.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/cloud_client/export.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/cloud_client/git_metadata.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/cloud_client/manifest.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/cloud_client/operations.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/cloud_client/reports.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/cloud_client/setup.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/cloud_client/upload.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/code_mower_calibration.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/code_mower_context_packs.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/code_mower_merge.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/code_mower_telemetry.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/codex_audit_env_preflight.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/codex_audit_pr.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/codex_audit_schema_smoke.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/codex_audit_verdict.schema.json +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/config.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/__init__.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/cloud.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/common.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/github.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/github_actions.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/github_api.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/github_branch.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/github_config.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/github_provider.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/github_repo.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/groups.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/models.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/output.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/presets.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/privacy.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/provider_env.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/provider_probe.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/providers.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/registry.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/runner.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/runtime.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/gate_health.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/gemini_cli_audit_pr.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/grok_build_audit_pr.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/hermes_cli_audit_pr.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/lane_configs/__init__.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/lane_configs/aider.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/lane_configs/claude.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/lane_configs/codex.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/lane_configs/devin.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/lane_configs/gemini_cli.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/lane_configs/grok_build.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/lane_configs/hermes_cli.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/lane_configs/local_llm.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/local_llm_audit_pr.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/local_llm_bakeoff.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/local_llm_calibration.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/local_llm_profiles.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/migration.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/migration_install.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/migration_mirror.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/migration_readiness.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/migration_rehearsal.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/next_steps.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/package.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/package_content.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/package_manifest.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/package_paths.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/package_rendering.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/package_static.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/plan_context.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/prompts.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/provider_registry.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/provider_runners/__init__.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/provider_runners/comments.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/provider_runners/git.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/provider_runners/github_auth.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/provider_runners/github_pr.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/provider_runners/pr_worktree.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/provider_runners/process.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/provider_runners/repo_paths.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/provider_runners/text_schema.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/provider_runners/workspace.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/providers/__init__.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/providers/local_cli.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/providers/provenance.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/release_readiness.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/reviewer_metrics.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/reviewer_spend.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/saas_reviewer_labeler.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/secrets.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/builder-experiment.example.json +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/calibration-corpus.example.json +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/calibration-corpus.json +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/code-mower.example.yml +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/context-packs.example.json +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/lane_prompts/operability.md +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/lane_prompts/plan-conformance.md +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/product-support/code_mower +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/product-support/status_report.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/providers.yml +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/reviewer-spend.example.json +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/workflows/needs-owner-notify.yml.j2 +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/templates/workflows/weekly-status.yml.j2 +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/trailer_comment_labeler.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/versioning.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower/work_orders.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower.egg-info/SOURCES.txt +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower.egg-info/dependency_links.txt +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower.egg-info/entry_points.txt +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower.egg-info/requires.txt +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/src/code_mower.egg-info/top_level.txt +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/builder-experiment.example.json +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/calibration-corpus.example.json +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/calibration-corpus.json +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/code-mower.yml.j2 +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/context-packs.example.json +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/cursor/BUGBOT.md +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/providers/acp_bridge.yml +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/providers/aider.yml +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/providers/antigravity_cli.yml +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/providers/claude_audit.yml +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/providers/claude_review.yml +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/providers/coderabbit_cli.yml +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/providers/codex.yml +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/providers/cursor_bugbot.yml +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/providers/devin.yml +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/providers/gemini_cli.yml +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/providers/gitar.yml +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/providers/greptile.yml +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/providers/hermes_cli.yml +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/providers/local_llm.yml +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/providers/qodo.yml +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/providers.yml +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/reviewer-spend.example.json +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/reviewer-value-report.example.md +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/workflows/builder-provenance.yml.j2 +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_audit_comment_posture.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_builder_identity.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_builder_runs.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_calibration_effect_report.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_calibration_truth.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_checks.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_claude_audit_pr.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_claude_cli_bounce.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_clear_stale.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_cloud_client.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_cloud_git_metadata.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_cloud_manifest.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_cloud_reports.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_coderabbit_cli_audit_pr.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_codex_audit_env_preflight.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_codex_audit_pr.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_doctor_actions_cost_summary.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_doctor_actions_failure_selection.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_doctor_boundaries.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_doctor_github_checks.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_doctor_output.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_doctor_privacy.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_doctor_provider_env_required.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_doctor_provider_env_tokens.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_doctor_provider_probe.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_doctor_provider_review_hygiene.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_doctor_registry.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_gate_health.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_local_llm_github_helpers.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_plan_context.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_prompts.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_provider_local_cli.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_provider_runners_comments.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_provider_runners_git.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_provider_runners_github_pr.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_provider_runners_pr_worktree.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_provider_runners_process.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_provider_runners_repo_paths.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_provider_runners_text_schema.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_provider_runners_workspace.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_reviewer_metrics_core.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_reviewer_spend.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_trailer_comment_labeler.py +0 -0
- {code_mower-0.5.0b45 → code_mower-0.5.0b46}/tests/test_work_orders.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code-mower
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.0b46
|
|
4
4
|
Summary: Multi-reviewer AI code audit orchestration
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Requires-Python: >=3.11
|
|
@@ -103,11 +103,11 @@ Code Mower currently targets Python 3.11+; Python 3.12 is recommended.
|
|
|
103
103
|
|
|
104
104
|
```bash
|
|
105
105
|
python3.12 --version
|
|
106
|
-
pipx install --python python3.12 code-mower==0.5.
|
|
106
|
+
pipx install --python python3.12 code-mower==0.5.0b46
|
|
107
107
|
code-mower --version
|
|
108
108
|
```
|
|
109
109
|
|
|
110
|
-
`0.5.
|
|
110
|
+
`0.5.0b46` is a beta release. Until Code Mower publishes a stable `1.0`
|
|
111
111
|
line, use the explicit beta version above or allow prereleases with:
|
|
112
112
|
|
|
113
113
|
```bash
|
|
@@ -155,7 +155,7 @@ First-time command map: [docs/launch-command-surface.md](docs/launch-command-sur
|
|
|
155
155
|
|
|
156
156
|
The current PyPI beta has been rehearsed end-to-end from a clean install:
|
|
157
157
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
158
|
-
the latest 10/10 public-package readiness proof for `code-mower==0.5.
|
|
158
|
+
the latest 10/10 public-package readiness proof for `code-mower==0.5.0b46`.
|
|
159
159
|
|
|
160
160
|
## Optional: Plan Before Coding
|
|
161
161
|
|
|
@@ -310,9 +310,9 @@ builder provenance, start with
|
|
|
310
310
|
|
|
311
311
|
## Installation Status
|
|
312
312
|
|
|
313
|
-
The current public beta is `v0.5.0-beta.
|
|
313
|
+
The current public beta is `v0.5.0-beta.46` from
|
|
314
314
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), published
|
|
315
|
-
as `code-mower==0.5.
|
|
315
|
+
as `code-mower==0.5.0b46` on [PyPI](https://pypi.org/project/code-mower/).
|
|
316
316
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
317
317
|
release notes.
|
|
318
318
|
|
|
@@ -88,11 +88,11 @@ Code Mower currently targets Python 3.11+; Python 3.12 is recommended.
|
|
|
88
88
|
|
|
89
89
|
```bash
|
|
90
90
|
python3.12 --version
|
|
91
|
-
pipx install --python python3.12 code-mower==0.5.
|
|
91
|
+
pipx install --python python3.12 code-mower==0.5.0b46
|
|
92
92
|
code-mower --version
|
|
93
93
|
```
|
|
94
94
|
|
|
95
|
-
`0.5.
|
|
95
|
+
`0.5.0b46` is a beta release. Until Code Mower publishes a stable `1.0`
|
|
96
96
|
line, use the explicit beta version above or allow prereleases with:
|
|
97
97
|
|
|
98
98
|
```bash
|
|
@@ -140,7 +140,7 @@ First-time command map: [docs/launch-command-surface.md](docs/launch-command-sur
|
|
|
140
140
|
|
|
141
141
|
The current PyPI beta has been rehearsed end-to-end from a clean install:
|
|
142
142
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
143
|
-
the latest 10/10 public-package readiness proof for `code-mower==0.5.
|
|
143
|
+
the latest 10/10 public-package readiness proof for `code-mower==0.5.0b46`.
|
|
144
144
|
|
|
145
145
|
## Optional: Plan Before Coding
|
|
146
146
|
|
|
@@ -295,9 +295,9 @@ builder provenance, start with
|
|
|
295
295
|
|
|
296
296
|
## Installation Status
|
|
297
297
|
|
|
298
|
-
The current public beta is `v0.5.0-beta.
|
|
298
|
+
The current public beta is `v0.5.0-beta.46` from
|
|
299
299
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), published
|
|
300
|
-
as `code-mower==0.5.
|
|
300
|
+
as `code-mower==0.5.0b46` on [PyPI](https://pypi.org/project/code-mower/).
|
|
301
301
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
302
302
|
release notes.
|
|
303
303
|
|
|
@@ -14,7 +14,7 @@ from pathlib import Path
|
|
|
14
14
|
if __package__ in {None, ""}:
|
|
15
15
|
raise SystemExit(
|
|
16
16
|
"code_mower.cli is a packaged entrypoint. Install Code Mower with "
|
|
17
|
-
"`pipx install code-mower==0.5.
|
|
17
|
+
"`pipx install code-mower==0.5.0b46`, or run source checkouts with "
|
|
18
18
|
"`PYTHONPATH=src python -m code_mower.cli`."
|
|
19
19
|
)
|
|
20
20
|
|
|
@@ -442,6 +442,9 @@ def _owner_surface_config(config: Mapping[str, Any]) -> dict[str, str]:
|
|
|
442
442
|
rendered[key] = _csv_value(surface.get(key), default)
|
|
443
443
|
continue
|
|
444
444
|
value = surface.get(key, default)
|
|
445
|
+
if key == "gate_override_label" and key in surface and value is not None:
|
|
446
|
+
rendered[key] = str(value).strip()
|
|
447
|
+
continue
|
|
445
448
|
rendered[key] = str(value).strip() if value is not None else default
|
|
446
449
|
if not rendered[key]:
|
|
447
450
|
rendered[key] = default
|
|
@@ -644,6 +647,8 @@ def _gate_workflow_entry(
|
|
|
644
647
|
*,
|
|
645
648
|
author_exclusion_json: str,
|
|
646
649
|
owner_label: str = DEFAULT_OWNER_LABEL,
|
|
650
|
+
owner_login: str = "",
|
|
651
|
+
gate_override_label: str = "gate:override",
|
|
647
652
|
) -> dict[str, str]:
|
|
648
653
|
gate_lanes = [
|
|
649
654
|
_gate_lane_entry(lane_id, lane)
|
|
@@ -657,6 +662,8 @@ def _gate_workflow_entry(
|
|
|
657
662
|
"package_copy_from": GATE_WORKFLOW_TEMPLATE,
|
|
658
663
|
"gate_lanes_json": json.dumps(gate_lanes, separators=(",", ":"), sort_keys=True),
|
|
659
664
|
"owner_label": owner_label,
|
|
665
|
+
"owner_login": owner_login,
|
|
666
|
+
"gate_override_label": gate_override_label,
|
|
660
667
|
"author_exclusion_json": author_exclusion_json,
|
|
661
668
|
}
|
|
662
669
|
|
|
@@ -973,6 +980,7 @@ def _render_stale_workflow_template(text: str, *, lane: str) -> str:
|
|
|
973
980
|
.replace("{% endraw %}", "")
|
|
974
981
|
.replace('default: "devin"', f'default: "{lane}"')
|
|
975
982
|
.replace("github.event.inputs.lane || 'devin'", f"github.event.inputs.lane || '{lane}'")
|
|
983
|
+
.replace("code-mower-clear-stale-devin-", f"code-mower-clear-stale-{lane}-")
|
|
976
984
|
)
|
|
977
985
|
|
|
978
986
|
|
|
@@ -980,6 +988,9 @@ def _render_workflow_template(text: str, entry: Mapping[str, Any]) -> str:
|
|
|
980
988
|
"""Render lightweight workflow placeholders without requiring Jinja."""
|
|
981
989
|
|
|
982
990
|
rendered = text.replace("{% raw %}", "").replace("{% endraw %}", "")
|
|
991
|
+
gate_override_label = entry.get("gate_override_label", "gate:override")
|
|
992
|
+
if gate_override_label is None:
|
|
993
|
+
gate_override_label = "gate:override"
|
|
983
994
|
replacements = {
|
|
984
995
|
"__ADAPTER__": str(entry.get("adapter") or ""),
|
|
985
996
|
"__AUTHOR_EXCLUSION_JSON__": str(
|
|
@@ -996,6 +1007,7 @@ def _render_workflow_template(text: str, entry: Mapping[str, Any]) -> str:
|
|
|
996
1007
|
entry.get("gate_health_max_wait_minutes") or "30"
|
|
997
1008
|
),
|
|
998
1009
|
"__GATE_LANES_JSON__": str(entry.get("gate_lanes_json") or "[]"),
|
|
1010
|
+
"__GATE_OVERRIDE_LABEL_JSON__": json.dumps(str(gate_override_label)),
|
|
999
1011
|
"__GITHUB_ACTIONS_WORKFLOWS__": str(entry.get("github_actions_workflows") or ""),
|
|
1000
1012
|
"__LABEL_TOKEN_ENV__": str(entry.get("label_token_env") or ""),
|
|
1001
1013
|
"__LANE_ID__": str(entry.get("lane_id") or ""),
|
|
@@ -1020,6 +1032,7 @@ def _render_workflow_template(text: str, entry: Mapping[str, Any]) -> str:
|
|
|
1020
1032
|
"__OWNER_LABEL__": json.dumps(
|
|
1021
1033
|
str(entry.get("owner_label") or DEFAULT_OWNER_LABEL)
|
|
1022
1034
|
),
|
|
1035
|
+
"__OWNER_LOGIN_JSON__": json.dumps(str(entry.get("owner_login") or "")),
|
|
1023
1036
|
"__TRAILER_LANE__": str(entry.get("trailer_lane") or ""),
|
|
1024
1037
|
"__TRAILER_PREFIX__": str(entry.get("trailer_prefix") or ""),
|
|
1025
1038
|
"__WEEKLY_STATUS_CRON__": str(entry.get("weekly_status_cron") or ""),
|
|
@@ -1323,6 +1336,8 @@ def render_init_plan(
|
|
|
1323
1336
|
selected_lanes,
|
|
1324
1337
|
author_exclusion_json=author_exclusion_json,
|
|
1325
1338
|
owner_label=owner_surface["needs_owner_label"],
|
|
1339
|
+
owner_login=owner_surface["owner_login"],
|
|
1340
|
+
gate_override_label=owner_surface["gate_override_label"],
|
|
1326
1341
|
)
|
|
1327
1342
|
)
|
|
1328
1343
|
|
|
@@ -25,6 +25,8 @@ env:
|
|
|
25
25
|
CODE_MOWER_GATE_CONTEXT: code-mower/gate
|
|
26
26
|
CODE_MOWER_GATE_ENABLE_AUTO_MERGE: "true"
|
|
27
27
|
CODE_MOWER_OWNER_LABEL: __OWNER_LABEL__
|
|
28
|
+
CODE_MOWER_OWNER_LOGIN: __OWNER_LOGIN_JSON__
|
|
29
|
+
CODE_MOWER_GATE_OVERRIDE_LABEL: __GATE_OVERRIDE_LABEL_JSON__
|
|
28
30
|
CODE_MOWER_AUTHOR_EXCLUSION_JSON: >-
|
|
29
31
|
__AUTHOR_EXCLUSION_JSON__
|
|
30
32
|
CODE_MOWER_GATE_LANES_JSON: >-
|
|
@@ -56,13 +58,15 @@ jobs:
|
|
|
56
58
|
|
|
57
59
|
labels_file="$(mktemp)"
|
|
58
60
|
comments_file="$(mktemp)"
|
|
61
|
+
events_file="$(mktemp)"
|
|
59
62
|
pr_file="$(mktemp)"
|
|
60
63
|
gh api "repos/${GITHUB_REPOSITORY}/issues/${PR_NUMBER}/labels" > "${labels_file}"
|
|
61
64
|
gh api --paginate --slurp "repos/${GITHUB_REPOSITORY}/issues/${PR_NUMBER}/comments?per_page=100" > "${comments_file}"
|
|
65
|
+
gh api --paginate --slurp "repos/${GITHUB_REPOSITORY}/issues/${PR_NUMBER}/events?per_page=100" > "${events_file}"
|
|
62
66
|
gh api "repos/${GITHUB_REPOSITORY}/pulls/${PR_NUMBER}" > "${pr_file}"
|
|
63
67
|
|
|
64
68
|
eval "$(
|
|
65
|
-
python3 - "${labels_file}" "${comments_file}" "${pr_file}" <<'PY'
|
|
69
|
+
python3 - "${labels_file}" "${comments_file}" "${events_file}" "${pr_file}" <<'PY'
|
|
66
70
|
import json
|
|
67
71
|
import os
|
|
68
72
|
import shlex
|
|
@@ -86,7 +90,9 @@ jobs:
|
|
|
86
90
|
labels_payload = json.load(labels_handle)
|
|
87
91
|
with open(sys.argv[2], encoding="utf-8") as comments_handle:
|
|
88
92
|
comments_payload = json.load(comments_handle)
|
|
89
|
-
with open(sys.argv[3], encoding="utf-8") as
|
|
93
|
+
with open(sys.argv[3], encoding="utf-8") as events_handle:
|
|
94
|
+
events_payload = json.load(events_handle)
|
|
95
|
+
with open(sys.argv[4], encoding="utf-8") as pr_handle:
|
|
90
96
|
pr_payload = json.load(pr_handle)
|
|
91
97
|
except Exception:
|
|
92
98
|
emit("failure", "Code Mower gate config could not be parsed")
|
|
@@ -105,6 +111,15 @@ jobs:
|
|
|
105
111
|
}
|
|
106
112
|
lanes = [lane for lane in lanes if isinstance(lane, dict)]
|
|
107
113
|
owner_label = os.environ.get("CODE_MOWER_OWNER_LABEL", "needs-owner")
|
|
114
|
+
gate_override_label = os.environ.get("CODE_MOWER_GATE_OVERRIDE_LABEL", "gate:override")
|
|
115
|
+
owner_login = os.environ.get("CODE_MOWER_OWNER_LOGIN", "").strip()
|
|
116
|
+
repo_owner = os.environ["GITHUB_REPOSITORY"].split("/", 1)[0]
|
|
117
|
+
configured_override_owner = (
|
|
118
|
+
owner_login
|
|
119
|
+
if owner_login and owner_login.lower() != "todo_owner_login"
|
|
120
|
+
else repo_owner
|
|
121
|
+
)
|
|
122
|
+
override_owner = configured_override_owner.lower()
|
|
108
123
|
pr_number = str(pr_payload.get("number") or os.environ.get("PR_NUMBER") or "")
|
|
109
124
|
pr_author = str(((pr_payload.get("user") or {}).get("login") or ""))
|
|
110
125
|
github_tokens = (GitHubToken("GH_TOKEN", os.environ.get("GH_TOKEN", "")),)
|
|
@@ -112,6 +127,10 @@ jobs:
|
|
|
112
127
|
for page in comments_payload:
|
|
113
128
|
if isinstance(page, list):
|
|
114
129
|
comments.extend(item for item in page if isinstance(item, dict))
|
|
130
|
+
events = []
|
|
131
|
+
for page in events_payload:
|
|
132
|
+
if isinstance(page, list):
|
|
133
|
+
events.extend(item for item in page if isinstance(item, dict))
|
|
115
134
|
|
|
116
135
|
def mapping(section):
|
|
117
136
|
value = exclusion.get(section) if isinstance(exclusion, dict) else {}
|
|
@@ -170,12 +189,25 @@ jobs:
|
|
|
170
189
|
and has_current_trailer(lane, str(lane.get("blocked") or ""))
|
|
171
190
|
]
|
|
172
191
|
|
|
192
|
+
override_actor = ""
|
|
193
|
+
if gate_override_label:
|
|
194
|
+
for event in events:
|
|
195
|
+
if event.get("event") != "labeled":
|
|
196
|
+
continue
|
|
197
|
+
if str(((event.get("label") or {}).get("name")) or "") != gate_override_label:
|
|
198
|
+
continue
|
|
199
|
+
override_actor = str(((event.get("actor") or {}).get("login")) or "").lower()
|
|
200
|
+
|
|
173
201
|
if len(builder_matches) > 1:
|
|
174
202
|
emit("failure", "conflicting Code Mower builder identity")
|
|
175
|
-
elif blocked:
|
|
176
|
-
emit("failure", "blocked audit: " + ", ".join(blocked))
|
|
177
203
|
elif owner_label in labels:
|
|
178
204
|
emit("pending", owner_label + ": waiting on owner")
|
|
205
|
+
elif gate_override_label and gate_override_label in labels and override_actor != override_owner:
|
|
206
|
+
emit("failure", gate_override_label + " was not owner-applied")
|
|
207
|
+
elif gate_override_label and gate_override_label in labels:
|
|
208
|
+
emit("success", "owner gate override")
|
|
209
|
+
elif blocked:
|
|
210
|
+
emit("failure", "blocked audit: " + ", ".join(blocked))
|
|
179
211
|
else:
|
|
180
212
|
excluded_builder = builder_matches[0] if builder_matches else ""
|
|
181
213
|
required = [
|
|
@@ -28,7 +28,7 @@ permissions:
|
|
|
28
28
|
pull-requests: write
|
|
29
29
|
|
|
30
30
|
concurrency:
|
|
31
|
-
group: {% raw %}code-mower-clear-stale-${{ github.event.pull_request.number || github.event.inputs.pr || github.run_id }}{% endraw %}
|
|
31
|
+
group: {% raw %}code-mower-clear-stale-devin-${{ github.event.pull_request.number || github.event.inputs.pr || github.run_id }}{% endraw %}
|
|
32
32
|
cancel-in-progress: true
|
|
33
33
|
|
|
34
34
|
jobs:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code-mower
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.0b46
|
|
4
4
|
Summary: Multi-reviewer AI code audit orchestration
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Requires-Python: >=3.11
|
|
@@ -103,11 +103,11 @@ Code Mower currently targets Python 3.11+; Python 3.12 is recommended.
|
|
|
103
103
|
|
|
104
104
|
```bash
|
|
105
105
|
python3.12 --version
|
|
106
|
-
pipx install --python python3.12 code-mower==0.5.
|
|
106
|
+
pipx install --python python3.12 code-mower==0.5.0b46
|
|
107
107
|
code-mower --version
|
|
108
108
|
```
|
|
109
109
|
|
|
110
|
-
`0.5.
|
|
110
|
+
`0.5.0b46` is a beta release. Until Code Mower publishes a stable `1.0`
|
|
111
111
|
line, use the explicit beta version above or allow prereleases with:
|
|
112
112
|
|
|
113
113
|
```bash
|
|
@@ -155,7 +155,7 @@ First-time command map: [docs/launch-command-surface.md](docs/launch-command-sur
|
|
|
155
155
|
|
|
156
156
|
The current PyPI beta has been rehearsed end-to-end from a clean install:
|
|
157
157
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
158
|
-
the latest 10/10 public-package readiness proof for `code-mower==0.5.
|
|
158
|
+
the latest 10/10 public-package readiness proof for `code-mower==0.5.0b46`.
|
|
159
159
|
|
|
160
160
|
## Optional: Plan Before Coding
|
|
161
161
|
|
|
@@ -310,9 +310,9 @@ builder provenance, start with
|
|
|
310
310
|
|
|
311
311
|
## Installation Status
|
|
312
312
|
|
|
313
|
-
The current public beta is `v0.5.0-beta.
|
|
313
|
+
The current public beta is `v0.5.0-beta.46` from
|
|
314
314
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), published
|
|
315
|
-
as `code-mower==0.5.
|
|
315
|
+
as `code-mower==0.5.0b46` on [PyPI](https://pypi.org/project/code-mower/).
|
|
316
316
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
317
317
|
release notes.
|
|
318
318
|
|
|
@@ -25,6 +25,8 @@ env:
|
|
|
25
25
|
CODE_MOWER_GATE_CONTEXT: code-mower/gate
|
|
26
26
|
CODE_MOWER_GATE_ENABLE_AUTO_MERGE: "true"
|
|
27
27
|
CODE_MOWER_OWNER_LABEL: __OWNER_LABEL__
|
|
28
|
+
CODE_MOWER_OWNER_LOGIN: __OWNER_LOGIN_JSON__
|
|
29
|
+
CODE_MOWER_GATE_OVERRIDE_LABEL: __GATE_OVERRIDE_LABEL_JSON__
|
|
28
30
|
CODE_MOWER_AUTHOR_EXCLUSION_JSON: >-
|
|
29
31
|
__AUTHOR_EXCLUSION_JSON__
|
|
30
32
|
CODE_MOWER_GATE_LANES_JSON: >-
|
|
@@ -56,13 +58,15 @@ jobs:
|
|
|
56
58
|
|
|
57
59
|
labels_file="$(mktemp)"
|
|
58
60
|
comments_file="$(mktemp)"
|
|
61
|
+
events_file="$(mktemp)"
|
|
59
62
|
pr_file="$(mktemp)"
|
|
60
63
|
gh api "repos/${GITHUB_REPOSITORY}/issues/${PR_NUMBER}/labels" > "${labels_file}"
|
|
61
64
|
gh api --paginate --slurp "repos/${GITHUB_REPOSITORY}/issues/${PR_NUMBER}/comments?per_page=100" > "${comments_file}"
|
|
65
|
+
gh api --paginate --slurp "repos/${GITHUB_REPOSITORY}/issues/${PR_NUMBER}/events?per_page=100" > "${events_file}"
|
|
62
66
|
gh api "repos/${GITHUB_REPOSITORY}/pulls/${PR_NUMBER}" > "${pr_file}"
|
|
63
67
|
|
|
64
68
|
eval "$(
|
|
65
|
-
python3 - "${labels_file}" "${comments_file}" "${pr_file}" <<'PY'
|
|
69
|
+
python3 - "${labels_file}" "${comments_file}" "${events_file}" "${pr_file}" <<'PY'
|
|
66
70
|
import json
|
|
67
71
|
import os
|
|
68
72
|
import shlex
|
|
@@ -86,7 +90,9 @@ jobs:
|
|
|
86
90
|
labels_payload = json.load(labels_handle)
|
|
87
91
|
with open(sys.argv[2], encoding="utf-8") as comments_handle:
|
|
88
92
|
comments_payload = json.load(comments_handle)
|
|
89
|
-
with open(sys.argv[3], encoding="utf-8") as
|
|
93
|
+
with open(sys.argv[3], encoding="utf-8") as events_handle:
|
|
94
|
+
events_payload = json.load(events_handle)
|
|
95
|
+
with open(sys.argv[4], encoding="utf-8") as pr_handle:
|
|
90
96
|
pr_payload = json.load(pr_handle)
|
|
91
97
|
except Exception:
|
|
92
98
|
emit("failure", "Code Mower gate config could not be parsed")
|
|
@@ -105,6 +111,15 @@ jobs:
|
|
|
105
111
|
}
|
|
106
112
|
lanes = [lane for lane in lanes if isinstance(lane, dict)]
|
|
107
113
|
owner_label = os.environ.get("CODE_MOWER_OWNER_LABEL", "needs-owner")
|
|
114
|
+
gate_override_label = os.environ.get("CODE_MOWER_GATE_OVERRIDE_LABEL", "gate:override")
|
|
115
|
+
owner_login = os.environ.get("CODE_MOWER_OWNER_LOGIN", "").strip()
|
|
116
|
+
repo_owner = os.environ["GITHUB_REPOSITORY"].split("/", 1)[0]
|
|
117
|
+
configured_override_owner = (
|
|
118
|
+
owner_login
|
|
119
|
+
if owner_login and owner_login.lower() != "todo_owner_login"
|
|
120
|
+
else repo_owner
|
|
121
|
+
)
|
|
122
|
+
override_owner = configured_override_owner.lower()
|
|
108
123
|
pr_number = str(pr_payload.get("number") or os.environ.get("PR_NUMBER") or "")
|
|
109
124
|
pr_author = str(((pr_payload.get("user") or {}).get("login") or ""))
|
|
110
125
|
github_tokens = (GitHubToken("GH_TOKEN", os.environ.get("GH_TOKEN", "")),)
|
|
@@ -112,6 +127,10 @@ jobs:
|
|
|
112
127
|
for page in comments_payload:
|
|
113
128
|
if isinstance(page, list):
|
|
114
129
|
comments.extend(item for item in page if isinstance(item, dict))
|
|
130
|
+
events = []
|
|
131
|
+
for page in events_payload:
|
|
132
|
+
if isinstance(page, list):
|
|
133
|
+
events.extend(item for item in page if isinstance(item, dict))
|
|
115
134
|
|
|
116
135
|
def mapping(section):
|
|
117
136
|
value = exclusion.get(section) if isinstance(exclusion, dict) else {}
|
|
@@ -170,12 +189,25 @@ jobs:
|
|
|
170
189
|
and has_current_trailer(lane, str(lane.get("blocked") or ""))
|
|
171
190
|
]
|
|
172
191
|
|
|
192
|
+
override_actor = ""
|
|
193
|
+
if gate_override_label:
|
|
194
|
+
for event in events:
|
|
195
|
+
if event.get("event") != "labeled":
|
|
196
|
+
continue
|
|
197
|
+
if str(((event.get("label") or {}).get("name")) or "") != gate_override_label:
|
|
198
|
+
continue
|
|
199
|
+
override_actor = str(((event.get("actor") or {}).get("login")) or "").lower()
|
|
200
|
+
|
|
173
201
|
if len(builder_matches) > 1:
|
|
174
202
|
emit("failure", "conflicting Code Mower builder identity")
|
|
175
|
-
elif blocked:
|
|
176
|
-
emit("failure", "blocked audit: " + ", ".join(blocked))
|
|
177
203
|
elif owner_label in labels:
|
|
178
204
|
emit("pending", owner_label + ": waiting on owner")
|
|
205
|
+
elif gate_override_label and gate_override_label in labels and override_actor != override_owner:
|
|
206
|
+
emit("failure", gate_override_label + " was not owner-applied")
|
|
207
|
+
elif gate_override_label and gate_override_label in labels:
|
|
208
|
+
emit("success", "owner gate override")
|
|
209
|
+
elif blocked:
|
|
210
|
+
emit("failure", "blocked audit: " + ", ".join(blocked))
|
|
179
211
|
else:
|
|
180
212
|
excluded_builder = builder_matches[0] if builder_matches else ""
|
|
181
213
|
required = [
|
|
@@ -28,7 +28,7 @@ permissions:
|
|
|
28
28
|
pull-requests: write
|
|
29
29
|
|
|
30
30
|
concurrency:
|
|
31
|
-
group: {% raw %}code-mower-clear-stale-${{ github.event.pull_request.number || github.event.inputs.pr || github.run_id }}{% endraw %}
|
|
31
|
+
group: {% raw %}code-mower-clear-stale-devin-${{ github.event.pull_request.number || github.event.inputs.pr || github.run_id }}{% endraw %}
|
|
32
32
|
cancel-in-progress: true
|
|
33
33
|
|
|
34
34
|
jobs:
|