code-mower 0.5.0b5__tar.gz → 0.5.0b7__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.0b5 → code_mower-0.5.0b7}/PKG-INFO +25 -12
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/README.md +24 -11
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/pyproject.toml +1 -1
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/__init__.py +1 -1
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/models.py +25 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/output.py +13 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/next_steps.py +3 -2
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/release_readiness.py +17 -11
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/versioning.py +8 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower.egg-info/PKG-INFO +25 -12
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_doctor_output.py +13 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_doctor_registry.py +8 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_release_hygiene.py +35 -39
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/CODE_OF_CONDUCT.md +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/LICENSE +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/MANIFEST.in +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/NOTICE +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/SUPPORT.md +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/requirements/requirements.txt +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/setup.cfg +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/adapters/__init__.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/adapters/_base.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/adapters/cursor_bugbot.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/adapters/gitar.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/adapters/greptile.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/adapters/qodo.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/audit_handoff_log.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/audit_labeler_lib.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/audit_progress.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/blind_review_artifacts.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/blind_review_coordinator.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/bootstrap.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/builder_experiment.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/__init__.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/arms.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/auto_discovery.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/commands.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/context_inputs.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/corpus.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/evidence.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/evidence_report.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/identity.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/metrics.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/overlap.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/planning.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/policy.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/results.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/run_results.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/run_status.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/runner.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/truth.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/calibration/value_report.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/checks.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/claude_audit_pr.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/claude_cli_bounce.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/claude_cli_environment.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/clear_stale.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cli.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud_client/__init__.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud_client/bundle.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud_client/doctor.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud_client/dogfood.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud_client/endpoints.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud_client/errors.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud_client/events.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud_client/export.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud_client/git_metadata.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud_client/manifest.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud_client/operations.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud_client/reports.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud_client/setup.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/cloud_client/upload.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/code_mower_calibration.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/code_mower_context_packs.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/code_mower_merge.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/code_mower_telemetry.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/codex_audit_env_preflight.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/codex_audit_pr.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/codex_audit_schema_smoke.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/codex_audit_verdict.schema.json +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/config.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/__init__.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/cloud.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/common.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github_actions.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github_api.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github_branch.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github_config.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github_provider.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/github_repo.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/groups.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/presets.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/privacy.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/provider_env.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/provider_probe.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/providers.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/registry.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/runner.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/runtime.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/gemini_cli_audit_pr.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/hermes_cli_audit_pr.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/init.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/lane_configs/__init__.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/lane_configs/aider.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/lane_configs/claude.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/lane_configs/codex.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/lane_configs/devin.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/lane_configs/gemini_cli.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/lane_configs/hermes_cli.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/lane_configs/local_llm.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/local_llm_audit_pr.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/local_llm_bakeoff.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/local_llm_calibration.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/local_llm_profiles.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/migration.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/migration_install.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/migration_mirror.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/migration_readiness.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/migration_rehearsal.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/package.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/package_content.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/package_manifest.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/package_paths.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/package_rendering.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/package_static.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/prompts.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/provider_registry.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/provider_runners/__init__.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/provider_runners/comments.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/provider_runners/git.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/provider_runners/github_auth.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/provider_runners/github_pr.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/provider_runners/process.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/provider_runners/repo_paths.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/provider_runners/text_schema.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/provider_runners/workspace.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/reviewer_metrics.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/saas_reviewer_labeler.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/secrets.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/builder-experiment.example.json +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/calibration-corpus.example.json +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/calibration-corpus.json +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/code-mower.example.yml +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/context-packs.example.json +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/lane_prompts/operability.md +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/product-support/code_mower +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/providers.yml +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/reviewer-spend.example.json +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower/trailer_comment_labeler.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower.egg-info/SOURCES.txt +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower.egg-info/dependency_links.txt +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower.egg-info/entry_points.txt +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower.egg-info/requires.txt +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/src/code_mower.egg-info/top_level.txt +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/builder-experiment.example.json +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/calibration-corpus.example.json +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/calibration-corpus.json +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/code-mower.yml.j2 +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/context-packs.example.json +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/cursor/BUGBOT.md +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/acp_bridge.yml +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/aider.yml +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/antigravity_cli.yml +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/claude_audit.yml +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/claude_review.yml +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/coderabbit_cli.yml +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/codex.yml +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/cursor_bugbot.yml +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/devin.yml +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/gemini_cli.yml +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/gitar.yml +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/greptile.yml +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/hermes_cli.yml +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/local_llm.yml +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers/qodo.yml +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/providers.yml +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/reviewer-spend.example.json +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/reviewer-value-report.example.md +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/workflows/review-clear-stale.yml.j2 +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_calibration_truth.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_checks.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_claude_cli_bounce.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_clear_stale.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_cloud_client.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_cloud_git_metadata.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_cloud_manifest.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_cloud_reports.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_coderabbit_cli_audit_pr.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_doctor_actions_cost_summary.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_doctor_actions_failure_selection.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_doctor_boundaries.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_doctor_github_checks.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_doctor_privacy.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_doctor_provider_env_required.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_doctor_provider_env_tokens.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_doctor_provider_probe.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_local_llm_github_helpers.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_provider_runners_comments.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_provider_runners_git.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_provider_runners_github_pr.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_provider_runners_process.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_provider_runners_repo_paths.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_provider_runners_text_schema.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_provider_runners_workspace.py +0 -0
- {code_mower-0.5.0b5 → code_mower-0.5.0b7}/tests/test_reviewer_metrics_core.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.0b7
|
|
4
4
|
Summary: Multi-reviewer AI code audit orchestration
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Requires-Python: >=3.11
|
|
@@ -98,10 +98,17 @@ Code Mower currently targets Python 3.11+; Python 3.12 is recommended.
|
|
|
98
98
|
|
|
99
99
|
```bash
|
|
100
100
|
python3.12 --version
|
|
101
|
-
pipx install --python python3.12
|
|
101
|
+
pipx install --python python3.12 code-mower==0.5.0b7
|
|
102
102
|
code-mower --version
|
|
103
103
|
```
|
|
104
104
|
|
|
105
|
+
`0.5.0b7` is a beta release. Until Code Mower publishes a stable `1.0`
|
|
106
|
+
line, use the explicit beta version above or allow prereleases with:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
pipx install --python python3.12 --pip-args="--pre" code-mower
|
|
110
|
+
```
|
|
111
|
+
|
|
105
112
|
From the repository you want to pilot:
|
|
106
113
|
|
|
107
114
|
```bash
|
|
@@ -167,7 +174,8 @@ The cloud value loop is:
|
|
|
167
174
|
2. inspect the metadata-only bundle or dogfood preview;
|
|
168
175
|
3. upload only with `--yes`; and
|
|
169
176
|
4. use [CodeMower.com](https://codemower.com) to see repo rollups, provider/lens
|
|
170
|
-
signal, cost/latency, noisy lanes,
|
|
177
|
+
signal, cost/latency, noisy lanes, next-lane recommendations, and
|
|
178
|
+
token-safe evidence/detail pages over time.
|
|
171
179
|
|
|
172
180
|
Start with a dry run:
|
|
173
181
|
|
|
@@ -177,6 +185,12 @@ code-mower cloud dogfood --json
|
|
|
177
185
|
|
|
178
186
|
Nothing uploads unless you pass `--yes`.
|
|
179
187
|
|
|
188
|
+
Current dogfood uploads, historical catch-up imports, and calibrated
|
|
189
|
+
reviewer/lens evidence are intentionally separate. Imported GitHub Actions
|
|
190
|
+
history can prove activity and upload health; it should not be treated as
|
|
191
|
+
reviewer-quality evidence until it is calibrated against known-clean and
|
|
192
|
+
known-blocked cases.
|
|
193
|
+
|
|
180
194
|
To connect to [CodeMower.com](https://codemower.com), sign in at
|
|
181
195
|
[https://codemower.com/login](https://codemower.com/login), create or receive a
|
|
182
196
|
team token, then run:
|
|
@@ -232,11 +246,11 @@ best?" to "which AI builder plus reviewer loop ships best on this product?" See
|
|
|
232
246
|
|
|
233
247
|
## Installation Status
|
|
234
248
|
|
|
235
|
-
The current public beta is `v0.5.0-beta.
|
|
236
|
-
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower)
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
249
|
+
The current public beta is `v0.5.0-beta.7` from
|
|
250
|
+
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and it
|
|
251
|
+
is published as `code-mower==0.5.0b7` on
|
|
252
|
+
[PyPI](https://pypi.org/project/code-mower/). GitHub releases remain the
|
|
253
|
+
auditable source for tags, build artifacts, and release notes.
|
|
240
254
|
|
|
241
255
|
For source checkout development and release rehearsal, use:
|
|
242
256
|
|
|
@@ -250,10 +264,9 @@ The wrapper resolves Python 3.12+ and refuses stale or old system Python shims.
|
|
|
250
264
|
|
|
251
265
|
## Known Limitations
|
|
252
266
|
|
|
253
|
-
- PyPI distribution
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
activation path.
|
|
267
|
+
- PyPI distribution publishing is active through trusted publishing; see
|
|
268
|
+
[docs/pypi-release.md](docs/pypi-release.md) for the release and
|
|
269
|
+
verification runbook.
|
|
257
270
|
- GitHub is the primary supported forge. GitLab, Bitbucket, and ACP bridges are
|
|
258
271
|
roadmap items.
|
|
259
272
|
- Hosted/SaaS reviewers start informational or manual until calibration data
|
|
@@ -86,10 +86,17 @@ Code Mower currently targets Python 3.11+; Python 3.12 is recommended.
|
|
|
86
86
|
|
|
87
87
|
```bash
|
|
88
88
|
python3.12 --version
|
|
89
|
-
pipx install --python python3.12
|
|
89
|
+
pipx install --python python3.12 code-mower==0.5.0b7
|
|
90
90
|
code-mower --version
|
|
91
91
|
```
|
|
92
92
|
|
|
93
|
+
`0.5.0b7` is a beta release. Until Code Mower publishes a stable `1.0`
|
|
94
|
+
line, use the explicit beta version above or allow prereleases with:
|
|
95
|
+
|
|
96
|
+
```bash
|
|
97
|
+
pipx install --python python3.12 --pip-args="--pre" code-mower
|
|
98
|
+
```
|
|
99
|
+
|
|
93
100
|
From the repository you want to pilot:
|
|
94
101
|
|
|
95
102
|
```bash
|
|
@@ -155,7 +162,8 @@ The cloud value loop is:
|
|
|
155
162
|
2. inspect the metadata-only bundle or dogfood preview;
|
|
156
163
|
3. upload only with `--yes`; and
|
|
157
164
|
4. use [CodeMower.com](https://codemower.com) to see repo rollups, provider/lens
|
|
158
|
-
signal, cost/latency, noisy lanes,
|
|
165
|
+
signal, cost/latency, noisy lanes, next-lane recommendations, and
|
|
166
|
+
token-safe evidence/detail pages over time.
|
|
159
167
|
|
|
160
168
|
Start with a dry run:
|
|
161
169
|
|
|
@@ -165,6 +173,12 @@ code-mower cloud dogfood --json
|
|
|
165
173
|
|
|
166
174
|
Nothing uploads unless you pass `--yes`.
|
|
167
175
|
|
|
176
|
+
Current dogfood uploads, historical catch-up imports, and calibrated
|
|
177
|
+
reviewer/lens evidence are intentionally separate. Imported GitHub Actions
|
|
178
|
+
history can prove activity and upload health; it should not be treated as
|
|
179
|
+
reviewer-quality evidence until it is calibrated against known-clean and
|
|
180
|
+
known-blocked cases.
|
|
181
|
+
|
|
168
182
|
To connect to [CodeMower.com](https://codemower.com), sign in at
|
|
169
183
|
[https://codemower.com/login](https://codemower.com/login), create or receive a
|
|
170
184
|
team token, then run:
|
|
@@ -220,11 +234,11 @@ best?" to "which AI builder plus reviewer loop ships best on this product?" See
|
|
|
220
234
|
|
|
221
235
|
## Installation Status
|
|
222
236
|
|
|
223
|
-
The current public beta is `v0.5.0-beta.
|
|
224
|
-
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower)
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
237
|
+
The current public beta is `v0.5.0-beta.7` from
|
|
238
|
+
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and it
|
|
239
|
+
is published as `code-mower==0.5.0b7` on
|
|
240
|
+
[PyPI](https://pypi.org/project/code-mower/). GitHub releases remain the
|
|
241
|
+
auditable source for tags, build artifacts, and release notes.
|
|
228
242
|
|
|
229
243
|
For source checkout development and release rehearsal, use:
|
|
230
244
|
|
|
@@ -238,10 +252,9 @@ The wrapper resolves Python 3.12+ and refuses stale or old system Python shims.
|
|
|
238
252
|
|
|
239
253
|
## Known Limitations
|
|
240
254
|
|
|
241
|
-
- PyPI distribution
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
activation path.
|
|
255
|
+
- PyPI distribution publishing is active through trusted publishing; see
|
|
256
|
+
[docs/pypi-release.md](docs/pypi-release.md) for the release and
|
|
257
|
+
verification runbook.
|
|
245
258
|
- GitHub is the primary supported forge. GitLab, Bitbucket, and ACP bridges are
|
|
246
259
|
roadmap items.
|
|
247
260
|
- Hosted/SaaS reviewers start informational or manual until calibration data
|
|
@@ -57,6 +57,30 @@ class DoctorReport:
|
|
|
57
57
|
return STATUS_WARN
|
|
58
58
|
return STATUS_PASS
|
|
59
59
|
|
|
60
|
+
@property
|
|
61
|
+
def run_plan(self) -> tuple[dict[str, Any], ...]:
|
|
62
|
+
"""Return the structured doctor run plan when a report contains one."""
|
|
63
|
+
|
|
64
|
+
for check in self.checks:
|
|
65
|
+
if check.name != "doctor.plan" or not isinstance(check.detail, Mapping):
|
|
66
|
+
continue
|
|
67
|
+
stages = check.detail.get("stages")
|
|
68
|
+
if not isinstance(stages, list):
|
|
69
|
+
return ()
|
|
70
|
+
plan: list[dict[str, Any]] = []
|
|
71
|
+
for stage in stages:
|
|
72
|
+
if not isinstance(stage, Mapping):
|
|
73
|
+
continue
|
|
74
|
+
plan.append(
|
|
75
|
+
{
|
|
76
|
+
"id": str(stage.get("id", "")),
|
|
77
|
+
"group": str(stage.get("group", "")),
|
|
78
|
+
"optional": bool(stage.get("optional", False)),
|
|
79
|
+
}
|
|
80
|
+
)
|
|
81
|
+
return tuple(plan)
|
|
82
|
+
return ()
|
|
83
|
+
|
|
60
84
|
def group_summary(self) -> dict[str, dict[str, int | str]]:
|
|
61
85
|
summary: dict[str, dict[str, int | str]] = {}
|
|
62
86
|
for group_id, label in GROUP_LABELS.items():
|
|
@@ -91,6 +115,7 @@ class DoctorReport:
|
|
|
91
115
|
"failures": self.failures,
|
|
92
116
|
"warnings": self.warnings,
|
|
93
117
|
},
|
|
118
|
+
"run_plan": list(self.run_plan),
|
|
94
119
|
"groups": self.group_summary(),
|
|
95
120
|
"checks": [check.as_dict() for check in self.checks],
|
|
96
121
|
}
|
|
@@ -39,6 +39,16 @@ def _format_status_summary(report: DoctorReport) -> str:
|
|
|
39
39
|
return ", ".join(parts)
|
|
40
40
|
|
|
41
41
|
|
|
42
|
+
def _format_run_plan(report: DoctorReport) -> str | None:
|
|
43
|
+
if not report.run_plan:
|
|
44
|
+
return None
|
|
45
|
+
stages = []
|
|
46
|
+
for stage in report.run_plan:
|
|
47
|
+
suffix = " optional" if stage.get("optional") else ""
|
|
48
|
+
stages.append(f"{stage.get('id', '')} ({stage.get('group', '')}{suffix})")
|
|
49
|
+
return ", ".join(stages)
|
|
50
|
+
|
|
51
|
+
|
|
42
52
|
def _format_check(check: DoctorCheck) -> list[str]:
|
|
43
53
|
lane = f" [{check.lane}]" if check.lane else ""
|
|
44
54
|
lines = [f"- {check.status.upper()} {check.name}{lane}: {check.message}"]
|
|
@@ -57,6 +67,9 @@ def render_doctor_text(report: DoctorReport) -> str:
|
|
|
57
67
|
]
|
|
58
68
|
if report.profile:
|
|
59
69
|
lines.append(f"Profile: {report.profile}")
|
|
70
|
+
run_plan = _format_run_plan(report)
|
|
71
|
+
if run_plan:
|
|
72
|
+
lines.append(f"Run plan: {run_plan}")
|
|
60
73
|
lines.append(f"Checks: {_format_status_summary(report)}")
|
|
61
74
|
lines.append("")
|
|
62
75
|
|
|
@@ -206,8 +206,9 @@ def build_next_steps(
|
|
|
206
206
|
"and cloud dry-run artifacts, emits `first_user_readiness`, and "
|
|
207
207
|
"optionally checks a real repo when --repo-path is provided. "
|
|
208
208
|
"Wrapper-bearing repos get parity checks; fresh external repos "
|
|
209
|
-
"get installed-CLI readiness checks. The
|
|
210
|
-
"current
|
|
209
|
+
"get installed-CLI readiness checks. The default beta path uses "
|
|
210
|
+
"the current published PyPI prerelease; GitHub tags remain a "
|
|
211
|
+
"release-debug fallback."
|
|
211
212
|
),
|
|
212
213
|
"artifacts": [
|
|
213
214
|
"outputs/package-install-rehearsal.json",
|
|
@@ -21,7 +21,7 @@ RELEASE_DOC_PATHS = (
|
|
|
21
21
|
"docs/pypi-release.md",
|
|
22
22
|
"docs/public-release-checklist.md",
|
|
23
23
|
)
|
|
24
|
-
|
|
24
|
+
REQUIRED_PUBLIC_PACKAGE_SPEC_DOC_PATHS = (
|
|
25
25
|
"README.md",
|
|
26
26
|
"docs/quickstart.md",
|
|
27
27
|
"docs/try-in-10-minutes.md",
|
|
@@ -230,10 +230,15 @@ def render_release_readiness(repo_path: Path) -> dict[str, Any]:
|
|
|
230
230
|
for relative_path, text in docs.items()
|
|
231
231
|
if release_tag and release_tag in text
|
|
232
232
|
]
|
|
233
|
-
|
|
233
|
+
package_spec_docs = [
|
|
234
234
|
relative_path
|
|
235
|
-
for relative_path in
|
|
236
|
-
if
|
|
235
|
+
for relative_path, text in docs.items()
|
|
236
|
+
if package_index_spec and package_index_spec in text
|
|
237
|
+
]
|
|
238
|
+
missing_package_spec_docs = [
|
|
239
|
+
relative_path
|
|
240
|
+
for relative_path in REQUIRED_PUBLIC_PACKAGE_SPEC_DOC_PATHS
|
|
241
|
+
if package_index_spec and package_index_spec not in docs.get(relative_path, "")
|
|
237
242
|
]
|
|
238
243
|
package_index_docs = [
|
|
239
244
|
relative_path
|
|
@@ -382,14 +387,15 @@ def render_release_readiness(repo_path: Path) -> dict[str, Any]:
|
|
|
382
387
|
evidence=str(workflow_path),
|
|
383
388
|
),
|
|
384
389
|
_release_check(
|
|
385
|
-
check_id="
|
|
386
|
-
title="Current
|
|
387
|
-
status="pass" if
|
|
388
|
-
evidence=
|
|
390
|
+
check_id="public-package-spec-docs-current",
|
|
391
|
+
title="Current package-index spec is present in public install docs",
|
|
392
|
+
status="pass" if package_index_spec and not missing_package_spec_docs else "fail",
|
|
393
|
+
evidence=package_index_spec or "missing version",
|
|
389
394
|
detail={
|
|
390
|
-
"
|
|
391
|
-
"
|
|
392
|
-
"
|
|
395
|
+
"release_tag_docs": version_docs,
|
|
396
|
+
"package_spec_docs": package_spec_docs,
|
|
397
|
+
"required_docs": list(REQUIRED_PUBLIC_PACKAGE_SPEC_DOC_PATHS),
|
|
398
|
+
"missing_docs": missing_package_spec_docs,
|
|
393
399
|
},
|
|
394
400
|
),
|
|
395
401
|
_release_check(
|
|
@@ -29,4 +29,12 @@ def release_tag_for_version(version: str) -> str:
|
|
|
29
29
|
|
|
30
30
|
|
|
31
31
|
def public_package_spec(version: str, repo_url: str = PUBLIC_REPO_URL) -> str:
|
|
32
|
+
"""Return the package-index install spec for public prerelease users."""
|
|
33
|
+
|
|
34
|
+
return f"code-mower=={version}"
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def github_package_spec(version: str, repo_url: str = PUBLIC_REPO_URL) -> str:
|
|
38
|
+
"""Return the GitHub-tag install spec used for release debugging."""
|
|
39
|
+
|
|
32
40
|
return f"git+{repo_url}.git@{release_tag_for_version(version)}"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code-mower
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.0b7
|
|
4
4
|
Summary: Multi-reviewer AI code audit orchestration
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Requires-Python: >=3.11
|
|
@@ -98,10 +98,17 @@ Code Mower currently targets Python 3.11+; Python 3.12 is recommended.
|
|
|
98
98
|
|
|
99
99
|
```bash
|
|
100
100
|
python3.12 --version
|
|
101
|
-
pipx install --python python3.12
|
|
101
|
+
pipx install --python python3.12 code-mower==0.5.0b7
|
|
102
102
|
code-mower --version
|
|
103
103
|
```
|
|
104
104
|
|
|
105
|
+
`0.5.0b7` is a beta release. Until Code Mower publishes a stable `1.0`
|
|
106
|
+
line, use the explicit beta version above or allow prereleases with:
|
|
107
|
+
|
|
108
|
+
```bash
|
|
109
|
+
pipx install --python python3.12 --pip-args="--pre" code-mower
|
|
110
|
+
```
|
|
111
|
+
|
|
105
112
|
From the repository you want to pilot:
|
|
106
113
|
|
|
107
114
|
```bash
|
|
@@ -167,7 +174,8 @@ The cloud value loop is:
|
|
|
167
174
|
2. inspect the metadata-only bundle or dogfood preview;
|
|
168
175
|
3. upload only with `--yes`; and
|
|
169
176
|
4. use [CodeMower.com](https://codemower.com) to see repo rollups, provider/lens
|
|
170
|
-
signal, cost/latency, noisy lanes,
|
|
177
|
+
signal, cost/latency, noisy lanes, next-lane recommendations, and
|
|
178
|
+
token-safe evidence/detail pages over time.
|
|
171
179
|
|
|
172
180
|
Start with a dry run:
|
|
173
181
|
|
|
@@ -177,6 +185,12 @@ code-mower cloud dogfood --json
|
|
|
177
185
|
|
|
178
186
|
Nothing uploads unless you pass `--yes`.
|
|
179
187
|
|
|
188
|
+
Current dogfood uploads, historical catch-up imports, and calibrated
|
|
189
|
+
reviewer/lens evidence are intentionally separate. Imported GitHub Actions
|
|
190
|
+
history can prove activity and upload health; it should not be treated as
|
|
191
|
+
reviewer-quality evidence until it is calibrated against known-clean and
|
|
192
|
+
known-blocked cases.
|
|
193
|
+
|
|
180
194
|
To connect to [CodeMower.com](https://codemower.com), sign in at
|
|
181
195
|
[https://codemower.com/login](https://codemower.com/login), create or receive a
|
|
182
196
|
team token, then run:
|
|
@@ -232,11 +246,11 @@ best?" to "which AI builder plus reviewer loop ships best on this product?" See
|
|
|
232
246
|
|
|
233
247
|
## Installation Status
|
|
234
248
|
|
|
235
|
-
The current public beta is `v0.5.0-beta.
|
|
236
|
-
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower)
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
249
|
+
The current public beta is `v0.5.0-beta.7` from
|
|
250
|
+
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and it
|
|
251
|
+
is published as `code-mower==0.5.0b7` on
|
|
252
|
+
[PyPI](https://pypi.org/project/code-mower/). GitHub releases remain the
|
|
253
|
+
auditable source for tags, build artifacts, and release notes.
|
|
240
254
|
|
|
241
255
|
For source checkout development and release rehearsal, use:
|
|
242
256
|
|
|
@@ -250,10 +264,9 @@ The wrapper resolves Python 3.12+ and refuses stale or old system Python shims.
|
|
|
250
264
|
|
|
251
265
|
## Known Limitations
|
|
252
266
|
|
|
253
|
-
- PyPI distribution
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
activation path.
|
|
267
|
+
- PyPI distribution publishing is active through trusted publishing; see
|
|
268
|
+
[docs/pypi-release.md](docs/pypi-release.md) for the release and
|
|
269
|
+
verification runbook.
|
|
257
270
|
- GitHub is the primary supported forge. GitLab, Bitbucket, and ACP bridges are
|
|
258
271
|
roadmap items.
|
|
259
272
|
- Hosted/SaaS reviewers start informational or manual until calibration data
|
|
@@ -26,6 +26,14 @@ class DoctorOutputTests(unittest.TestCase):
|
|
|
26
26
|
name="doctor.plan",
|
|
27
27
|
status=STATUS_PASS,
|
|
28
28
|
message="doctor run plan: load-inputs, select-profile, runtime, providers",
|
|
29
|
+
detail={
|
|
30
|
+
"stages": [
|
|
31
|
+
{"id": "load-inputs", "group": "runtime", "optional": False},
|
|
32
|
+
{"id": "select-profile", "group": "runtime", "optional": False},
|
|
33
|
+
{"id": "runtime", "group": "runtime", "optional": False},
|
|
34
|
+
{"id": "providers", "group": "providers", "optional": False},
|
|
35
|
+
]
|
|
36
|
+
},
|
|
29
37
|
),
|
|
30
38
|
DoctorCheck(
|
|
31
39
|
name="runtime.python",
|
|
@@ -59,6 +67,11 @@ class DoctorOutputTests(unittest.TestCase):
|
|
|
59
67
|
|
|
60
68
|
rendered = output.render_doctor_text(report)
|
|
61
69
|
|
|
70
|
+
self.assertIn(
|
|
71
|
+
"Run plan: load-inputs (runtime), select-profile (runtime), "
|
|
72
|
+
"runtime (runtime), providers (providers)",
|
|
73
|
+
rendered,
|
|
74
|
+
)
|
|
62
75
|
self.assertIn("Checks: 7 total, 2 warnings, 1 skipped", rendered)
|
|
63
76
|
self.assertLess(rendered.index("Setup"), rendered.index("Runtime"))
|
|
64
77
|
self.assertLess(rendered.index("Runtime"), rendered.index("Provider lanes"))
|
|
@@ -54,6 +54,14 @@ class DoctorRegistryTests(unittest.TestCase):
|
|
|
54
54
|
tuple(stage["id"] for stage in plan_check.detail["stages"]),
|
|
55
55
|
("load-inputs", "select-profile", "runtime", "providers", "github", "cloud"),
|
|
56
56
|
)
|
|
57
|
+
self.assertEqual(
|
|
58
|
+
tuple(stage["id"] for stage in report.run_plan),
|
|
59
|
+
("load-inputs", "select-profile", "runtime", "providers", "github", "cloud"),
|
|
60
|
+
)
|
|
61
|
+
self.assertEqual(
|
|
62
|
+
tuple(stage["id"] for stage in report.as_dict()["run_plan"]),
|
|
63
|
+
("load-inputs", "select-profile", "runtime", "providers", "github", "cloud"),
|
|
64
|
+
)
|
|
57
65
|
|
|
58
66
|
|
|
59
67
|
if __name__ == "__main__":
|
|
@@ -47,7 +47,7 @@ from scripts import privacy_scan
|
|
|
47
47
|
|
|
48
48
|
class ReleaseHygieneTests(unittest.TestCase):
|
|
49
49
|
def test_version_is_current_v05_prerelease(self) -> None:
|
|
50
|
-
self.assertEqual(__version__, "0.5.
|
|
50
|
+
self.assertEqual(__version__, "0.5.0b7")
|
|
51
51
|
|
|
52
52
|
def test_release_workflow_verifies_downloaded_distributions_before_publish(self) -> None:
|
|
53
53
|
workflow = (ROOT / ".github/workflows/release.yml").read_text(encoding="utf-8")
|
|
@@ -158,8 +158,7 @@ class ReleaseHygieneTests(unittest.TestCase):
|
|
|
158
158
|
self.assertIn(
|
|
159
159
|
(
|
|
160
160
|
"code-mower migration package-install-rehearsal --package-spec "
|
|
161
|
-
"
|
|
162
|
-
"--json"
|
|
161
|
+
"code-mower==0.5.0b7 --json"
|
|
163
162
|
),
|
|
164
163
|
help_text,
|
|
165
164
|
)
|
|
@@ -1368,8 +1367,8 @@ printf '%s\\n' "${lane}"
|
|
|
1368
1367
|
fromlist=["current_alpha_package_spec"],
|
|
1369
1368
|
)
|
|
1370
1369
|
self.assertEqual(
|
|
1371
|
-
legacy_module.current_alpha_package_spec("0.5.
|
|
1372
|
-
"
|
|
1370
|
+
legacy_module.current_alpha_package_spec("0.5.0b7"),
|
|
1371
|
+
"code-mower==0.5.0b7",
|
|
1373
1372
|
)
|
|
1374
1373
|
finally:
|
|
1375
1374
|
sys.path[:] = original_path
|
|
@@ -1406,7 +1405,7 @@ printf '%s\\n' "${lane}"
|
|
|
1406
1405
|
"-c",
|
|
1407
1406
|
(
|
|
1408
1407
|
"from tools import code_mower_package_content as c; "
|
|
1409
|
-
"print(c.current_alpha_package_spec('0.5.
|
|
1408
|
+
"print(c.current_alpha_package_spec('0.5.0b7'))"
|
|
1410
1409
|
),
|
|
1411
1410
|
],
|
|
1412
1411
|
cwd=tmp_path,
|
|
@@ -1419,7 +1418,7 @@ printf '%s\\n' "${lane}"
|
|
|
1419
1418
|
self.assertEqual(completed.returncode, 0, completed.stderr)
|
|
1420
1419
|
self.assertEqual(
|
|
1421
1420
|
completed.stdout.strip(),
|
|
1422
|
-
"
|
|
1421
|
+
"code-mower==0.5.0b7",
|
|
1423
1422
|
)
|
|
1424
1423
|
|
|
1425
1424
|
def test_package_rendering_legacy_fallback_stays_valid_yaml_subset(self) -> None:
|
|
@@ -1495,11 +1494,11 @@ printf '%s\\n' "${lane}"
|
|
|
1495
1494
|
(output_dir / "src/code_mower/cloud_client/dogfood.py").is_file()
|
|
1496
1495
|
)
|
|
1497
1496
|
self.assertIn(
|
|
1498
|
-
'version = "0.5.
|
|
1497
|
+
'version = "0.5.0b7"',
|
|
1499
1498
|
(output_dir / "pyproject.toml").read_text(encoding="utf-8"),
|
|
1500
1499
|
)
|
|
1501
1500
|
self.assertIn(
|
|
1502
|
-
'__version__ = "0.5.
|
|
1501
|
+
'__version__ = "0.5.0b7"',
|
|
1503
1502
|
(output_dir / "src/code_mower/__init__.py").read_text(
|
|
1504
1503
|
encoding="utf-8"
|
|
1505
1504
|
),
|
|
@@ -2968,7 +2967,7 @@ def main():
|
|
|
2968
2967
|
{
|
|
2969
2968
|
"status": "pass",
|
|
2970
2969
|
"package_spec": "code-mower",
|
|
2971
|
-
"version": "code-mower 0.5.
|
|
2970
|
+
"version": "code-mower 0.5.0b7",
|
|
2972
2971
|
"work_dir": "/tmp/code-mower-rehearsal",
|
|
2973
2972
|
"toy_repo": "/tmp/code-mower-rehearsal/toy-repo",
|
|
2974
2973
|
"step_count": 1,
|
|
@@ -3080,7 +3079,7 @@ def main():
|
|
|
3080
3079
|
scorecard = code_mower_migration._first_user_readiness_scorecard(
|
|
3081
3080
|
toy_repo=toy_repo,
|
|
3082
3081
|
outputs=outputs,
|
|
3083
|
-
version="code-mower 0.5.
|
|
3082
|
+
version="code-mower 0.5.0b7",
|
|
3084
3083
|
steps=[
|
|
3085
3084
|
{
|
|
3086
3085
|
"command": ["code-mower", "doctor", "--easy", "--json"],
|
|
@@ -3159,7 +3158,7 @@ def main():
|
|
|
3159
3158
|
scorecard = code_mower_migration._first_user_readiness_scorecard(
|
|
3160
3159
|
toy_repo=toy_repo,
|
|
3161
3160
|
outputs=outputs,
|
|
3162
|
-
version="code-mower 0.5.
|
|
3161
|
+
version="code-mower 0.5.0b7",
|
|
3163
3162
|
steps=[
|
|
3164
3163
|
{
|
|
3165
3164
|
"command": ["code-mower", "doctor", "--easy", "--json"],
|
|
@@ -3221,7 +3220,7 @@ def main():
|
|
|
3221
3220
|
scorecard = code_mower_migration._first_user_readiness_scorecard(
|
|
3222
3221
|
toy_repo=toy_repo,
|
|
3223
3222
|
outputs=outputs,
|
|
3224
|
-
version="code-mower 0.5.
|
|
3223
|
+
version="code-mower 0.5.0b7",
|
|
3225
3224
|
steps=[
|
|
3226
3225
|
{
|
|
3227
3226
|
"command": ["code-mower", "doctor", "--easy", "--json"],
|
|
@@ -3287,24 +3286,24 @@ def main():
|
|
|
3287
3286
|
)
|
|
3288
3287
|
self.assertEqual(
|
|
3289
3288
|
code_mower_migration._resolve_install_package_spec(
|
|
3290
|
-
"git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.
|
|
3289
|
+
"git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.7",
|
|
3291
3290
|
base_dir=package,
|
|
3292
3291
|
),
|
|
3293
|
-
"git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.
|
|
3292
|
+
"git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.7",
|
|
3294
3293
|
)
|
|
3295
3294
|
self.assertEqual(
|
|
3296
3295
|
code_mower_migration._resolve_install_package_spec(
|
|
3297
|
-
"code-mower==0.5.
|
|
3296
|
+
"code-mower==0.5.0b7",
|
|
3298
3297
|
base_dir=package,
|
|
3299
3298
|
),
|
|
3300
|
-
"code-mower==0.5.
|
|
3299
|
+
"code-mower==0.5.0b7",
|
|
3301
3300
|
)
|
|
3302
3301
|
|
|
3303
3302
|
def test_package_install_rehearsal_supports_index_aware_pip_install(self) -> None:
|
|
3304
3303
|
self.assertEqual(
|
|
3305
3304
|
code_mower_migration._pip_install_command(
|
|
3306
3305
|
Path("/tmp/venv/bin/python"),
|
|
3307
|
-
"code-mower==0.5.
|
|
3306
|
+
"code-mower==0.5.0b7",
|
|
3308
3307
|
pip_index_url="https://test.pypi.org/simple/",
|
|
3309
3308
|
pip_extra_index_urls=["https://pypi.org/simple/"],
|
|
3310
3309
|
),
|
|
@@ -3317,7 +3316,7 @@ def main():
|
|
|
3317
3316
|
"https://test.pypi.org/simple/",
|
|
3318
3317
|
"--extra-index-url",
|
|
3319
3318
|
"https://pypi.org/simple/",
|
|
3320
|
-
"code-mower==0.5.
|
|
3319
|
+
"code-mower==0.5.0b7",
|
|
3321
3320
|
],
|
|
3322
3321
|
)
|
|
3323
3322
|
|
|
@@ -3337,10 +3336,10 @@ def main():
|
|
|
3337
3336
|
payload = release_readiness.render_release_readiness(ROOT)
|
|
3338
3337
|
|
|
3339
3338
|
self.assertEqual(payload["status"], "pass")
|
|
3340
|
-
self.assertEqual(payload["version"], "0.5.
|
|
3341
|
-
self.assertEqual(payload["release_tag"], "v0.5.0-beta.
|
|
3342
|
-
self.assertEqual(payload["alpha_tag"], "v0.5.0-beta.
|
|
3343
|
-
self.assertEqual(payload["package_index_spec"], "code-mower==0.5.
|
|
3339
|
+
self.assertEqual(payload["version"], "0.5.0b7")
|
|
3340
|
+
self.assertEqual(payload["release_tag"], "v0.5.0-beta.7")
|
|
3341
|
+
self.assertEqual(payload["alpha_tag"], "v0.5.0-beta.7")
|
|
3342
|
+
self.assertEqual(payload["package_index_spec"], "code-mower==0.5.0b7")
|
|
3344
3343
|
check_ids = {check["id"]: check for check in payload["checks"]}
|
|
3345
3344
|
self.assertEqual(check_ids["package-version-consistency"]["status"], "pass")
|
|
3346
3345
|
self.assertEqual(
|
|
@@ -3389,7 +3388,7 @@ def main():
|
|
|
3389
3388
|
check_ids = {check["id"]: check for check in payload["checks"]}
|
|
3390
3389
|
check = check_ids["materialized-package-version-consistency"]
|
|
3391
3390
|
self.assertEqual(check["status"], "fail")
|
|
3392
|
-
self.assertEqual(check["detail"]["source_version"], "0.5.
|
|
3391
|
+
self.assertEqual(check["detail"]["source_version"], "0.5.0b7")
|
|
3393
3392
|
self.assertEqual(check["detail"]["generated_init_version"], "0.0.0")
|
|
3394
3393
|
|
|
3395
3394
|
def test_public_support_docs_are_packaged_and_privacy_forward(self) -> None:
|
|
@@ -3469,20 +3468,20 @@ def main():
|
|
|
3469
3468
|
|
|
3470
3469
|
def test_release_readiness_tag_derivation_supports_release_stages(self) -> None:
|
|
3471
3470
|
self.assertEqual(
|
|
3472
|
-
release_readiness._release_tag_for_version("0.5.
|
|
3473
|
-
"v0.5.0-beta.
|
|
3471
|
+
release_readiness._release_tag_for_version("0.5.0b7"),
|
|
3472
|
+
"v0.5.0-beta.7",
|
|
3474
3473
|
)
|
|
3475
3474
|
self.assertEqual(
|
|
3476
|
-
code_mower_versioning.release_tag_for_version("0.5.
|
|
3477
|
-
"v0.5.0-beta.
|
|
3475
|
+
code_mower_versioning.release_tag_for_version("0.5.0b7"),
|
|
3476
|
+
"v0.5.0-beta.7",
|
|
3478
3477
|
)
|
|
3479
3478
|
self.assertEqual(
|
|
3480
|
-
release_readiness._release_tag_for_version("0.5.
|
|
3481
|
-
"v0.5.0-beta.
|
|
3479
|
+
release_readiness._release_tag_for_version("0.5.0b7"),
|
|
3480
|
+
"v0.5.0-beta.7",
|
|
3482
3481
|
)
|
|
3483
3482
|
self.assertEqual(
|
|
3484
|
-
code_mower_versioning.release_tag_for_version("0.5.
|
|
3485
|
-
"v0.5.0-beta.
|
|
3483
|
+
code_mower_versioning.release_tag_for_version("0.5.0b7"),
|
|
3484
|
+
"v0.5.0-beta.7",
|
|
3486
3485
|
)
|
|
3487
3486
|
self.assertEqual(
|
|
3488
3487
|
release_readiness._release_tag_for_version("1.0.0rc1"),
|
|
@@ -3511,8 +3510,8 @@ def main():
|
|
|
3511
3510
|
next_steps.current_alpha_package_spec(),
|
|
3512
3511
|
)
|
|
3513
3512
|
self.assertEqual(
|
|
3514
|
-
code_mower_package_content.current_alpha_package_spec("0.5.
|
|
3515
|
-
"
|
|
3513
|
+
code_mower_package_content.current_alpha_package_spec("0.5.0b7"),
|
|
3514
|
+
"code-mower==0.5.0b7",
|
|
3516
3515
|
)
|
|
3517
3516
|
self.assertNotIn(next_steps.current_public_tag(), package_content_text)
|
|
3518
3517
|
self.assertNotIn("v0.0.0", package_content_text)
|
|
@@ -3684,11 +3683,8 @@ def main():
|
|
|
3684
3683
|
step for step in plan["steps"] if step["id"] == "package-install-rehearsal"
|
|
3685
3684
|
)
|
|
3686
3685
|
self.assertIn("doctor --v05", doctor_step["command"])
|
|
3687
|
-
self.assertIn(
|
|
3688
|
-
|
|
3689
|
-
package_step["command"],
|
|
3690
|
-
)
|
|
3691
|
-
self.assertIn("current GitHub tag", package_step["why"])
|
|
3686
|
+
self.assertIn("code-mower==0.5.0b7", package_step["command"])
|
|
3687
|
+
self.assertIn("current published PyPI prerelease", package_step["why"])
|
|
3692
3688
|
self.assertIn("first_user_readiness", package_step["why"])
|
|
3693
3689
|
self.assertEqual(
|
|
3694
3690
|
package_step["artifacts"],
|
|
File without changes
|
|
File without changes
|