code-mower 0.5.0b29__tar.gz → 0.5.0b30__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.0b29 → code_mower-0.5.0b30}/PKG-INFO +6 -6
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/README.md +5 -5
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/pyproject.toml +1 -1
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/__init__.py +1 -1
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cli.py +1 -1
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud.py +29 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud_client/operations.py +53 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower.egg-info/PKG-INFO +6 -6
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_cloud_client.py +32 -1
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_provider_local_cli.py +2 -2
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_release_hygiene.py +78 -34
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/CODE_OF_CONDUCT.md +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/LICENSE +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/MANIFEST.in +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/NOTICE +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/SUPPORT.md +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/requirements/requirements.txt +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/setup.cfg +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/adapters/__init__.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/adapters/_base.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/adapters/cursor_bugbot.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/adapters/gitar.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/adapters/greptile.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/adapters/qodo.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/audit_handoff_log.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/audit_labeler_lib.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/audit_progress.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/blind_review_artifacts.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/blind_review_coordinator.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/bootstrap.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/builder_experiment.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/__init__.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/arms.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/auto_discovery.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/commands.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/context_inputs.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/corpus.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/effect_report.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/evidence.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/evidence_report.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/identity.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/metrics.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/overlap.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/planning.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/policy.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/results.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/run_results.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/run_status.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/runner.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/truth.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/calibration/value_report.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/checks.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/claude_audit_pr.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/claude_cli_bounce.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/claude_cli_environment.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/clear_stale.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud_client/__init__.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud_client/bundle.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud_client/doctor.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud_client/dogfood.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud_client/endpoints.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud_client/errors.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud_client/events.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud_client/export.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud_client/git_metadata.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud_client/manifest.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud_client/reports.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud_client/setup.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/cloud_client/upload.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/code_mower_calibration.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/code_mower_context_packs.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/code_mower_merge.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/code_mower_telemetry.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/codex_audit_env_preflight.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/codex_audit_pr.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/codex_audit_schema_smoke.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/codex_audit_verdict.schema.json +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/config.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/__init__.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/cloud.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/common.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github_actions.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github_api.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github_branch.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github_config.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github_provider.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/github_repo.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/groups.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/models.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/output.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/presets.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/privacy.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_env.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_probe.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/providers.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/registry.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/runner.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/runtime.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/gemini_cli_audit_pr.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/hermes_cli_audit_pr.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/init.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/lane_configs/__init__.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/lane_configs/aider.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/lane_configs/claude.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/lane_configs/codex.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/lane_configs/devin.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/lane_configs/gemini_cli.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/lane_configs/hermes_cli.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/lane_configs/local_llm.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/local_llm_audit_pr.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/local_llm_bakeoff.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/local_llm_calibration.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/local_llm_profiles.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/migration.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/migration_install.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/migration_mirror.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/migration_readiness.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/migration_rehearsal.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/next_steps.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/package.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/package_content.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/package_manifest.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/package_paths.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/package_rendering.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/package_static.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/prompts.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/provider_registry.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/provider_runners/__init__.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/provider_runners/comments.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/provider_runners/git.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/provider_runners/github_auth.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/provider_runners/github_pr.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/provider_runners/pr_worktree.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/provider_runners/process.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/provider_runners/repo_paths.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/provider_runners/text_schema.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/provider_runners/workspace.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/providers/__init__.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/providers/local_cli.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/providers/provenance.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/release_readiness.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/reviewer_metrics.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/saas_reviewer_labeler.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/secrets.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/builder-experiment.example.json +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/calibration-corpus.example.json +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/calibration-corpus.json +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/code-mower.example.yml +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/context-packs.example.json +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/lane_prompts/operability.md +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/product-support/code_mower +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/providers.yml +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/reviewer-spend.example.json +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/trailer_comment_labeler.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower/versioning.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower.egg-info/SOURCES.txt +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower.egg-info/dependency_links.txt +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower.egg-info/entry_points.txt +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower.egg-info/requires.txt +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/src/code_mower.egg-info/top_level.txt +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/builder-experiment.example.json +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/calibration-corpus.example.json +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/calibration-corpus.json +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/code-mower.yml.j2 +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/context-packs.example.json +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/cursor/BUGBOT.md +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/acp_bridge.yml +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/aider.yml +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/antigravity_cli.yml +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/claude_audit.yml +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/claude_review.yml +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/coderabbit_cli.yml +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/codex.yml +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/cursor_bugbot.yml +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/devin.yml +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/gemini_cli.yml +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/gitar.yml +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/greptile.yml +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/hermes_cli.yml +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/local_llm.yml +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers/qodo.yml +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/providers.yml +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/reviewer-spend.example.json +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/reviewer-value-report.example.md +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/workflows/review-clear-stale.yml.j2 +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_calibration_effect_report.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_calibration_truth.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_checks.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_claude_cli_bounce.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_clear_stale.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_cloud_git_metadata.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_cloud_manifest.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_cloud_reports.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_coderabbit_cli_audit_pr.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_doctor_actions_cost_summary.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_doctor_actions_failure_selection.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_doctor_boundaries.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_doctor_github_checks.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_doctor_output.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_doctor_privacy.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_doctor_provider_env_required.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_doctor_provider_env_tokens.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_doctor_provider_probe.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_doctor_provider_review_hygiene.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_doctor_registry.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_local_llm_github_helpers.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_provider_runners_comments.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_provider_runners_git.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_provider_runners_github_pr.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_provider_runners_pr_worktree.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_provider_runners_process.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_provider_runners_repo_paths.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_provider_runners_text_schema.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/tests/test_provider_runners_workspace.py +0 -0
- {code_mower-0.5.0b29 → code_mower-0.5.0b30}/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.0b30
|
|
4
4
|
Summary: Multi-reviewer AI code audit orchestration
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Requires-Python: >=3.11
|
|
@@ -101,11 +101,11 @@ Code Mower currently targets Python 3.11+; Python 3.12 is recommended.
|
|
|
101
101
|
|
|
102
102
|
```bash
|
|
103
103
|
python3.12 --version
|
|
104
|
-
pipx install --python python3.12 code-mower==0.5.
|
|
104
|
+
pipx install --python python3.12 code-mower==0.5.0b30
|
|
105
105
|
code-mower --version
|
|
106
106
|
```
|
|
107
107
|
|
|
108
|
-
`0.5.
|
|
108
|
+
`0.5.0b30` is a beta release. Until Code Mower publishes a stable `1.0`
|
|
109
109
|
line, use the explicit beta version above or allow prereleases with:
|
|
110
110
|
|
|
111
111
|
```bash
|
|
@@ -148,7 +148,7 @@ First-time command map: [docs/launch-command-surface.md](docs/launch-command-sur
|
|
|
148
148
|
|
|
149
149
|
The current PyPI beta has been rehearsed end-to-end from a clean install:
|
|
150
150
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
151
|
-
the latest 10/10 public-package readiness proof for `code-mower==0.5.
|
|
151
|
+
the latest 10/10 public-package readiness proof for `code-mower==0.5.0b30`.
|
|
152
152
|
|
|
153
153
|
## Why Not Just Run Codex Or Claude Yourself?
|
|
154
154
|
|
|
@@ -253,9 +253,9 @@ best?" to "which AI builder plus reviewer loop ships best on this product?" See
|
|
|
253
253
|
|
|
254
254
|
## Installation Status
|
|
255
255
|
|
|
256
|
-
The current public beta is `v0.5.0-beta.
|
|
256
|
+
The current public beta is `v0.5.0-beta.30` from
|
|
257
257
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), published
|
|
258
|
-
as `code-mower==0.5.
|
|
258
|
+
as `code-mower==0.5.0b30` on [PyPI](https://pypi.org/project/code-mower/).
|
|
259
259
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
260
260
|
release notes.
|
|
261
261
|
|
|
@@ -86,11 +86,11 @@ 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 code-mower==0.5.
|
|
89
|
+
pipx install --python python3.12 code-mower==0.5.0b30
|
|
90
90
|
code-mower --version
|
|
91
91
|
```
|
|
92
92
|
|
|
93
|
-
`0.5.
|
|
93
|
+
`0.5.0b30` is a beta release. Until Code Mower publishes a stable `1.0`
|
|
94
94
|
line, use the explicit beta version above or allow prereleases with:
|
|
95
95
|
|
|
96
96
|
```bash
|
|
@@ -133,7 +133,7 @@ First-time command map: [docs/launch-command-surface.md](docs/launch-command-sur
|
|
|
133
133
|
|
|
134
134
|
The current PyPI beta has been rehearsed end-to-end from a clean install:
|
|
135
135
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
136
|
-
the latest 10/10 public-package readiness proof for `code-mower==0.5.
|
|
136
|
+
the latest 10/10 public-package readiness proof for `code-mower==0.5.0b30`.
|
|
137
137
|
|
|
138
138
|
## Why Not Just Run Codex Or Claude Yourself?
|
|
139
139
|
|
|
@@ -238,9 +238,9 @@ best?" to "which AI builder plus reviewer loop ships best on this product?" See
|
|
|
238
238
|
|
|
239
239
|
## Installation Status
|
|
240
240
|
|
|
241
|
-
The current public beta is `v0.5.0-beta.
|
|
241
|
+
The current public beta is `v0.5.0-beta.30` from
|
|
242
242
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), published
|
|
243
|
-
as `code-mower==0.5.
|
|
243
|
+
as `code-mower==0.5.0b30` on [PyPI](https://pypi.org/project/code-mower/).
|
|
244
244
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
245
245
|
release notes.
|
|
246
246
|
|
|
@@ -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.0b30`, or run source checkouts with "
|
|
18
18
|
"`PYTHONPATH=src python -m code_mower.cli`."
|
|
19
19
|
)
|
|
20
20
|
|
|
@@ -669,6 +669,35 @@ def main(argv: list[str] | None = None) -> int:
|
|
|
669
669
|
print(f"Repositories: {result['repo_count']}")
|
|
670
670
|
print(f"Steps: {result['step_count']}")
|
|
671
671
|
print(f"Errors: {result['error_count']}")
|
|
672
|
+
summary = result.get("data_class_summary", {})
|
|
673
|
+
if isinstance(summary, dict):
|
|
674
|
+
current = summary.get("current_dogfood", {})
|
|
675
|
+
history = summary.get("imported_history", {})
|
|
676
|
+
reviewer = summary.get("reviewer_evidence", {})
|
|
677
|
+
print(
|
|
678
|
+
"Current dogfood: "
|
|
679
|
+
f"{current.get('steps', 0)} steps, "
|
|
680
|
+
f"{current.get('events', 0)} events"
|
|
681
|
+
)
|
|
682
|
+
print(
|
|
683
|
+
"Imported history: "
|
|
684
|
+
f"{history.get('steps', 0)} steps, "
|
|
685
|
+
f"{history.get('events', 0)} events "
|
|
686
|
+
"(not calibration evidence)"
|
|
687
|
+
)
|
|
688
|
+
print(
|
|
689
|
+
"Reviewer evidence: "
|
|
690
|
+
f"{reviewer.get('steps', 0)} steps, "
|
|
691
|
+
f"{reviewer.get('events', 0)} events"
|
|
692
|
+
)
|
|
693
|
+
guidance = (
|
|
694
|
+
history.get("trust_guidance", {})
|
|
695
|
+
if isinstance(history, dict)
|
|
696
|
+
else {}
|
|
697
|
+
)
|
|
698
|
+
if guidance and history.get("events", 0):
|
|
699
|
+
print(f"History use: {guidance.get('use_for', '')}")
|
|
700
|
+
print(f"History next: {guidance.get('next_step', '')}")
|
|
672
701
|
return 0 if result["error_count"] == 0 else 1
|
|
673
702
|
except CloudBundleError as exc:
|
|
674
703
|
print(f"error: {exc}", file=sys.stderr)
|
|
@@ -413,6 +413,58 @@ def repo_sync_output_name(repo_slug: str, repo_path: Path, index: int) -> str:
|
|
|
413
413
|
return f"{cleaned or 'repo'}-{index + 1}"
|
|
414
414
|
|
|
415
415
|
|
|
416
|
+
def build_repo_sync_data_class_summary(
|
|
417
|
+
repos: list[dict[str, Any]],
|
|
418
|
+
) -> dict[str, dict[str, Any]]:
|
|
419
|
+
"""Summarize synced data by dashboard provenance class."""
|
|
420
|
+
|
|
421
|
+
summary: dict[str, dict[str, Any]] = {
|
|
422
|
+
"current_dogfood": {
|
|
423
|
+
"steps": 0,
|
|
424
|
+
"events": 0,
|
|
425
|
+
"description": "current repo metadata and provider inventory",
|
|
426
|
+
},
|
|
427
|
+
"imported_history": {
|
|
428
|
+
"steps": 0,
|
|
429
|
+
"events": 0,
|
|
430
|
+
"description": "sanitized GitHub Actions history",
|
|
431
|
+
"trust_guidance": CATCH_UP_TRUST_GUIDANCE,
|
|
432
|
+
},
|
|
433
|
+
"reviewer_evidence": {
|
|
434
|
+
"steps": 0,
|
|
435
|
+
"events": 0,
|
|
436
|
+
"description": "metadata-only reviewer verdict artifacts",
|
|
437
|
+
},
|
|
438
|
+
}
|
|
439
|
+
for repo in repos:
|
|
440
|
+
steps = repo.get("steps")
|
|
441
|
+
if not isinstance(steps, list):
|
|
442
|
+
continue
|
|
443
|
+
for step in steps:
|
|
444
|
+
if not isinstance(step, dict):
|
|
445
|
+
continue
|
|
446
|
+
mode = str(step.get("mode") or "")
|
|
447
|
+
if mode == "cloud-dogfood":
|
|
448
|
+
target = summary["current_dogfood"]
|
|
449
|
+
target["steps"] += 1
|
|
450
|
+
export = step.get("export")
|
|
451
|
+
if isinstance(export, dict):
|
|
452
|
+
target["events"] += int(export.get("event_count") or 0)
|
|
453
|
+
elif mode == "cloud-catch-up":
|
|
454
|
+
target = summary["imported_history"]
|
|
455
|
+
target["steps"] += 1
|
|
456
|
+
catch_up = step.get("catch_up")
|
|
457
|
+
if isinstance(catch_up, dict):
|
|
458
|
+
target["events"] += int(catch_up.get("event_count") or 0)
|
|
459
|
+
else:
|
|
460
|
+
target["events"] += int(step.get("run_count") or 0)
|
|
461
|
+
elif mode == "cloud-reviewer-runs":
|
|
462
|
+
target = summary["reviewer_evidence"]
|
|
463
|
+
target["steps"] += 1
|
|
464
|
+
target["events"] += int(step.get("event_count") or 0)
|
|
465
|
+
return summary
|
|
466
|
+
|
|
467
|
+
|
|
416
468
|
def repo_sync_upload(
|
|
417
469
|
*,
|
|
418
470
|
repo_specs: list[str],
|
|
@@ -524,5 +576,6 @@ def repo_sync_upload(
|
|
|
524
576
|
"step_count": sum(len(repo["steps"]) for repo in repos),
|
|
525
577
|
"error_count": error_count,
|
|
526
578
|
"modes": selected_modes,
|
|
579
|
+
"data_class_summary": build_repo_sync_data_class_summary(repos),
|
|
527
580
|
"repos": repos,
|
|
528
581
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code-mower
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.0b30
|
|
4
4
|
Summary: Multi-reviewer AI code audit orchestration
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Requires-Python: >=3.11
|
|
@@ -101,11 +101,11 @@ Code Mower currently targets Python 3.11+; Python 3.12 is recommended.
|
|
|
101
101
|
|
|
102
102
|
```bash
|
|
103
103
|
python3.12 --version
|
|
104
|
-
pipx install --python python3.12 code-mower==0.5.
|
|
104
|
+
pipx install --python python3.12 code-mower==0.5.0b30
|
|
105
105
|
code-mower --version
|
|
106
106
|
```
|
|
107
107
|
|
|
108
|
-
`0.5.
|
|
108
|
+
`0.5.0b30` is a beta release. Until Code Mower publishes a stable `1.0`
|
|
109
109
|
line, use the explicit beta version above or allow prereleases with:
|
|
110
110
|
|
|
111
111
|
```bash
|
|
@@ -148,7 +148,7 @@ First-time command map: [docs/launch-command-surface.md](docs/launch-command-sur
|
|
|
148
148
|
|
|
149
149
|
The current PyPI beta has been rehearsed end-to-end from a clean install:
|
|
150
150
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
151
|
-
the latest 10/10 public-package readiness proof for `code-mower==0.5.
|
|
151
|
+
the latest 10/10 public-package readiness proof for `code-mower==0.5.0b30`.
|
|
152
152
|
|
|
153
153
|
## Why Not Just Run Codex Or Claude Yourself?
|
|
154
154
|
|
|
@@ -253,9 +253,9 @@ best?" to "which AI builder plus reviewer loop ships best on this product?" See
|
|
|
253
253
|
|
|
254
254
|
## Installation Status
|
|
255
255
|
|
|
256
|
-
The current public beta is `v0.5.0-beta.
|
|
256
|
+
The current public beta is `v0.5.0-beta.30` from
|
|
257
257
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), published
|
|
258
|
-
as `code-mower==0.5.
|
|
258
|
+
as `code-mower==0.5.0b30` on [PyPI](https://pypi.org/project/code-mower/).
|
|
259
259
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
260
260
|
release notes.
|
|
261
261
|
|
|
@@ -304,7 +304,7 @@ def test_provenance_summary_preserves_source_quality_fields() -> None:
|
|
|
304
304
|
"tool": {
|
|
305
305
|
"role": "reporter",
|
|
306
306
|
"tool_name": "code-mower",
|
|
307
|
-
"tool_version": "0.5.
|
|
307
|
+
"tool_version": "0.5.0b30",
|
|
308
308
|
"provider": "code-mower",
|
|
309
309
|
"model": "",
|
|
310
310
|
"model_source": "not_applicable",
|
|
@@ -622,6 +622,37 @@ def test_cloud_repo_sync_helpers_live_in_client_module() -> None:
|
|
|
622
622
|
assert repo_sync_output_name("Owner/Repo", Path("/tmp/repo"), 2) == "owner--repo-3"
|
|
623
623
|
|
|
624
624
|
|
|
625
|
+
def test_cloud_repo_sync_data_class_summary_separates_sources() -> None:
|
|
626
|
+
summary = cloud_operations.build_repo_sync_data_class_summary(
|
|
627
|
+
[
|
|
628
|
+
{
|
|
629
|
+
"steps": [
|
|
630
|
+
{
|
|
631
|
+
"mode": "cloud-dogfood",
|
|
632
|
+
"export": {"event_count": 16},
|
|
633
|
+
},
|
|
634
|
+
{
|
|
635
|
+
"mode": "cloud-catch-up",
|
|
636
|
+
"catch_up": {"event_count": 50},
|
|
637
|
+
},
|
|
638
|
+
{
|
|
639
|
+
"mode": "cloud-reviewer-runs",
|
|
640
|
+
"event_count": 7,
|
|
641
|
+
},
|
|
642
|
+
]
|
|
643
|
+
}
|
|
644
|
+
]
|
|
645
|
+
)
|
|
646
|
+
|
|
647
|
+
assert summary["current_dogfood"]["steps"] == 1
|
|
648
|
+
assert summary["current_dogfood"]["events"] == 16
|
|
649
|
+
assert summary["imported_history"]["steps"] == 1
|
|
650
|
+
assert summary["imported_history"]["events"] == 50
|
|
651
|
+
assert summary["imported_history"]["trust_guidance"] == cloud_operations.CATCH_UP_TRUST_GUIDANCE
|
|
652
|
+
assert summary["reviewer_evidence"]["steps"] == 1
|
|
653
|
+
assert summary["reviewer_evidence"]["events"] == 7
|
|
654
|
+
|
|
655
|
+
|
|
625
656
|
def test_cloud_py_keeps_legacy_operation_aliases() -> None:
|
|
626
657
|
assert cloud_cli._dogfood_upload is dogfood_upload
|
|
627
658
|
assert cloud_cli._repo_sync_output_name("owner/repo", Path("/tmp/repo"), 0) == "owner--repo-1"
|
|
@@ -436,11 +436,11 @@ def test_provider_lane_tool_provenance_reads_model_from_selected_profile(
|
|
|
436
436
|
def test_code_mower_reporter_provenance_marks_model_not_applicable() -> None:
|
|
437
437
|
tool = build_code_mower_tool_provenance(
|
|
438
438
|
source="unit-test",
|
|
439
|
-
version="0.5.
|
|
439
|
+
version="0.5.0b30",
|
|
440
440
|
)
|
|
441
441
|
|
|
442
442
|
assert tool["tool_name"] == "code-mower"
|
|
443
|
-
assert tool["tool_version"] == "0.5.
|
|
443
|
+
assert tool["tool_version"] == "0.5.0b30"
|
|
444
444
|
assert tool["provider"] == "code-mower"
|
|
445
445
|
assert tool["model"] == ""
|
|
446
446
|
assert tool["model_source"] == "not_applicable"
|
|
@@ -49,7 +49,7 @@ from scripts import privacy_scan
|
|
|
49
49
|
|
|
50
50
|
class ReleaseHygieneTests(unittest.TestCase):
|
|
51
51
|
def test_version_is_current_v05_prerelease(self) -> None:
|
|
52
|
-
self.assertEqual(__version__, "0.5.
|
|
52
|
+
self.assertEqual(__version__, "0.5.0b30")
|
|
53
53
|
|
|
54
54
|
def test_release_workflow_verifies_downloaded_distributions_before_publish(self) -> None:
|
|
55
55
|
workflow = (ROOT / ".github/workflows/release.yml").read_text(encoding="utf-8")
|
|
@@ -199,7 +199,7 @@ class ReleaseHygieneTests(unittest.TestCase):
|
|
|
199
199
|
self.assertIn(
|
|
200
200
|
(
|
|
201
201
|
"code-mower migration package-install-rehearsal --package-spec "
|
|
202
|
-
"code-mower==0.5.
|
|
202
|
+
"code-mower==0.5.0b30 --json"
|
|
203
203
|
),
|
|
204
204
|
help_text,
|
|
205
205
|
)
|
|
@@ -1614,8 +1614,8 @@ printf '%s\\n' "${lane}"
|
|
|
1614
1614
|
fromlist=["current_alpha_package_spec"],
|
|
1615
1615
|
)
|
|
1616
1616
|
self.assertEqual(
|
|
1617
|
-
legacy_module.current_alpha_package_spec("0.5.
|
|
1618
|
-
"code-mower==0.5.
|
|
1617
|
+
legacy_module.current_alpha_package_spec("0.5.0b30"),
|
|
1618
|
+
"code-mower==0.5.0b30",
|
|
1619
1619
|
)
|
|
1620
1620
|
finally:
|
|
1621
1621
|
sys.path[:] = original_path
|
|
@@ -1652,7 +1652,7 @@ printf '%s\\n' "${lane}"
|
|
|
1652
1652
|
"-c",
|
|
1653
1653
|
(
|
|
1654
1654
|
"from tools import code_mower_package_content as c; "
|
|
1655
|
-
"print(c.current_alpha_package_spec('0.5.
|
|
1655
|
+
"print(c.current_alpha_package_spec('0.5.0b30'))"
|
|
1656
1656
|
),
|
|
1657
1657
|
],
|
|
1658
1658
|
cwd=tmp_path,
|
|
@@ -1665,7 +1665,7 @@ printf '%s\\n' "${lane}"
|
|
|
1665
1665
|
self.assertEqual(completed.returncode, 0, completed.stderr)
|
|
1666
1666
|
self.assertEqual(
|
|
1667
1667
|
completed.stdout.strip(),
|
|
1668
|
-
"code-mower==0.5.
|
|
1668
|
+
"code-mower==0.5.0b30",
|
|
1669
1669
|
)
|
|
1670
1670
|
|
|
1671
1671
|
def test_package_rendering_legacy_fallback_stays_valid_yaml_subset(self) -> None:
|
|
@@ -1741,11 +1741,11 @@ printf '%s\\n' "${lane}"
|
|
|
1741
1741
|
(output_dir / "src/code_mower/cloud_client/dogfood.py").is_file()
|
|
1742
1742
|
)
|
|
1743
1743
|
self.assertIn(
|
|
1744
|
-
'version = "0.5.
|
|
1744
|
+
'version = "0.5.0b30"',
|
|
1745
1745
|
(output_dir / "pyproject.toml").read_text(encoding="utf-8"),
|
|
1746
1746
|
)
|
|
1747
1747
|
self.assertIn(
|
|
1748
|
-
'__version__ = "0.5.
|
|
1748
|
+
'__version__ = "0.5.0b30"',
|
|
1749
1749
|
(output_dir / "src/code_mower/__init__.py").read_text(
|
|
1750
1750
|
encoding="utf-8"
|
|
1751
1751
|
),
|
|
@@ -2779,6 +2779,50 @@ def main():
|
|
|
2779
2779
|
)
|
|
2780
2780
|
self.assertEqual(steps[1]["status"], "no_events")
|
|
2781
2781
|
|
|
2782
|
+
def test_cloud_repo_sync_cli_text_summarizes_data_classes(self) -> None:
|
|
2783
|
+
with tempfile.TemporaryDirectory() as tmp:
|
|
2784
|
+
root = Path(tmp)
|
|
2785
|
+
subprocess.run(["git", "init"], cwd=root, check=True, capture_output=True)
|
|
2786
|
+
subprocess.run(
|
|
2787
|
+
["git", "config", "user.email", "test@example.com"],
|
|
2788
|
+
cwd=root,
|
|
2789
|
+
check=True,
|
|
2790
|
+
)
|
|
2791
|
+
subprocess.run(
|
|
2792
|
+
["git", "config", "user.name", "Test"],
|
|
2793
|
+
cwd=root,
|
|
2794
|
+
check=True,
|
|
2795
|
+
)
|
|
2796
|
+
(root / "README.md").write_text("fixture\n", encoding="utf-8")
|
|
2797
|
+
subprocess.run(["git", "add", "README.md"], cwd=root, check=True)
|
|
2798
|
+
subprocess.run(
|
|
2799
|
+
["git", "commit", "-m", "fixture"],
|
|
2800
|
+
cwd=root,
|
|
2801
|
+
check=True,
|
|
2802
|
+
capture_output=True,
|
|
2803
|
+
)
|
|
2804
|
+
|
|
2805
|
+
output = StringIO()
|
|
2806
|
+
with redirect_stdout(output):
|
|
2807
|
+
code = code_mower_cloud.main(
|
|
2808
|
+
[
|
|
2809
|
+
"repo-sync",
|
|
2810
|
+
"--repo",
|
|
2811
|
+
f"owner/repo={root}",
|
|
2812
|
+
"--output-dir",
|
|
2813
|
+
str(root / ".code-mower/cloud-repo-sync"),
|
|
2814
|
+
"--endpoint",
|
|
2815
|
+
"http://localhost:3000/api/ingest",
|
|
2816
|
+
]
|
|
2817
|
+
)
|
|
2818
|
+
|
|
2819
|
+
self.assertEqual(code, 0)
|
|
2820
|
+
text = output.getvalue()
|
|
2821
|
+
self.assertIn("Code Mower cloud repo sync", text)
|
|
2822
|
+
self.assertIn("Current dogfood: 1 steps, ", text)
|
|
2823
|
+
self.assertIn("Imported history: 0 steps, 0 events (not calibration evidence)", text)
|
|
2824
|
+
self.assertIn("Reviewer evidence: 1 steps, 0 events", text)
|
|
2825
|
+
|
|
2782
2826
|
def test_cloud_repo_sync_reviewer_only_no_events_is_not_uploaded(self) -> None:
|
|
2783
2827
|
with tempfile.TemporaryDirectory() as tmp:
|
|
2784
2828
|
root = Path(tmp)
|
|
@@ -3236,7 +3280,7 @@ def main():
|
|
|
3236
3280
|
{
|
|
3237
3281
|
"status": "pass",
|
|
3238
3282
|
"package_spec": "code-mower",
|
|
3239
|
-
"version": "code-mower 0.5.
|
|
3283
|
+
"version": "code-mower 0.5.0b30",
|
|
3240
3284
|
"work_dir": "/tmp/code-mower-rehearsal",
|
|
3241
3285
|
"toy_repo": "/tmp/code-mower-rehearsal/toy-repo",
|
|
3242
3286
|
"step_count": 1,
|
|
@@ -3348,7 +3392,7 @@ def main():
|
|
|
3348
3392
|
scorecard = code_mower_migration._first_user_readiness_scorecard(
|
|
3349
3393
|
toy_repo=toy_repo,
|
|
3350
3394
|
outputs=outputs,
|
|
3351
|
-
version="code-mower 0.5.
|
|
3395
|
+
version="code-mower 0.5.0b30",
|
|
3352
3396
|
steps=[
|
|
3353
3397
|
{
|
|
3354
3398
|
"command": ["code-mower", "doctor", "--easy", "--json"],
|
|
@@ -3427,7 +3471,7 @@ def main():
|
|
|
3427
3471
|
scorecard = code_mower_migration._first_user_readiness_scorecard(
|
|
3428
3472
|
toy_repo=toy_repo,
|
|
3429
3473
|
outputs=outputs,
|
|
3430
|
-
version="code-mower 0.5.
|
|
3474
|
+
version="code-mower 0.5.0b30",
|
|
3431
3475
|
steps=[
|
|
3432
3476
|
{
|
|
3433
3477
|
"command": ["code-mower", "doctor", "--easy", "--json"],
|
|
@@ -3489,7 +3533,7 @@ def main():
|
|
|
3489
3533
|
scorecard = code_mower_migration._first_user_readiness_scorecard(
|
|
3490
3534
|
toy_repo=toy_repo,
|
|
3491
3535
|
outputs=outputs,
|
|
3492
|
-
version="code-mower 0.5.
|
|
3536
|
+
version="code-mower 0.5.0b30",
|
|
3493
3537
|
steps=[
|
|
3494
3538
|
{
|
|
3495
3539
|
"command": ["code-mower", "doctor", "--easy", "--json"],
|
|
@@ -3555,24 +3599,24 @@ def main():
|
|
|
3555
3599
|
)
|
|
3556
3600
|
self.assertEqual(
|
|
3557
3601
|
code_mower_migration._resolve_install_package_spec(
|
|
3558
|
-
"git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.
|
|
3602
|
+
"git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.30",
|
|
3559
3603
|
base_dir=package,
|
|
3560
3604
|
),
|
|
3561
|
-
"git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.
|
|
3605
|
+
"git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.30",
|
|
3562
3606
|
)
|
|
3563
3607
|
self.assertEqual(
|
|
3564
3608
|
code_mower_migration._resolve_install_package_spec(
|
|
3565
|
-
"code-mower==0.5.
|
|
3609
|
+
"code-mower==0.5.0b30",
|
|
3566
3610
|
base_dir=package,
|
|
3567
3611
|
),
|
|
3568
|
-
"code-mower==0.5.
|
|
3612
|
+
"code-mower==0.5.0b30",
|
|
3569
3613
|
)
|
|
3570
3614
|
|
|
3571
3615
|
def test_package_install_rehearsal_supports_index_aware_pip_install(self) -> None:
|
|
3572
3616
|
self.assertEqual(
|
|
3573
3617
|
code_mower_migration._pip_install_command(
|
|
3574
3618
|
Path("/tmp/venv/bin/python"),
|
|
3575
|
-
"code-mower==0.5.
|
|
3619
|
+
"code-mower==0.5.0b30",
|
|
3576
3620
|
pip_index_url="https://test.pypi.org/simple/",
|
|
3577
3621
|
pip_extra_index_urls=["https://pypi.org/simple/"],
|
|
3578
3622
|
),
|
|
@@ -3585,7 +3629,7 @@ def main():
|
|
|
3585
3629
|
"https://test.pypi.org/simple/",
|
|
3586
3630
|
"--extra-index-url",
|
|
3587
3631
|
"https://pypi.org/simple/",
|
|
3588
|
-
"code-mower==0.5.
|
|
3632
|
+
"code-mower==0.5.0b30",
|
|
3589
3633
|
],
|
|
3590
3634
|
)
|
|
3591
3635
|
|
|
@@ -3605,10 +3649,10 @@ def main():
|
|
|
3605
3649
|
payload = release_readiness.render_release_readiness(ROOT)
|
|
3606
3650
|
|
|
3607
3651
|
self.assertEqual(payload["status"], "pass")
|
|
3608
|
-
self.assertEqual(payload["version"], "0.5.
|
|
3609
|
-
self.assertEqual(payload["release_tag"], "v0.5.0-beta.
|
|
3610
|
-
self.assertEqual(payload["alpha_tag"], "v0.5.0-beta.
|
|
3611
|
-
self.assertEqual(payload["package_index_spec"], "code-mower==0.5.
|
|
3652
|
+
self.assertEqual(payload["version"], "0.5.0b30")
|
|
3653
|
+
self.assertEqual(payload["release_tag"], "v0.5.0-beta.30")
|
|
3654
|
+
self.assertEqual(payload["alpha_tag"], "v0.5.0-beta.30")
|
|
3655
|
+
self.assertEqual(payload["package_index_spec"], "code-mower==0.5.0b30")
|
|
3612
3656
|
check_ids = {check["id"]: check for check in payload["checks"]}
|
|
3613
3657
|
self.assertEqual(check_ids["package-version-consistency"]["status"], "pass")
|
|
3614
3658
|
self.assertEqual(
|
|
@@ -3657,7 +3701,7 @@ def main():
|
|
|
3657
3701
|
check_ids = {check["id"]: check for check in payload["checks"]}
|
|
3658
3702
|
check = check_ids["materialized-package-version-consistency"]
|
|
3659
3703
|
self.assertEqual(check["status"], "fail")
|
|
3660
|
-
self.assertEqual(check["detail"]["source_version"], "0.5.
|
|
3704
|
+
self.assertEqual(check["detail"]["source_version"], "0.5.0b30")
|
|
3661
3705
|
self.assertEqual(check["detail"]["generated_init_version"], "0.0.0")
|
|
3662
3706
|
|
|
3663
3707
|
def test_public_support_docs_are_packaged_and_privacy_forward(self) -> None:
|
|
@@ -3737,20 +3781,20 @@ def main():
|
|
|
3737
3781
|
|
|
3738
3782
|
def test_release_readiness_tag_derivation_supports_release_stages(self) -> None:
|
|
3739
3783
|
self.assertEqual(
|
|
3740
|
-
release_readiness._release_tag_for_version("0.5.
|
|
3741
|
-
"v0.5.0-beta.
|
|
3784
|
+
release_readiness._release_tag_for_version("0.5.0b30"),
|
|
3785
|
+
"v0.5.0-beta.30",
|
|
3742
3786
|
)
|
|
3743
3787
|
self.assertEqual(
|
|
3744
|
-
code_mower_versioning.release_tag_for_version("0.5.
|
|
3745
|
-
"v0.5.0-beta.
|
|
3788
|
+
code_mower_versioning.release_tag_for_version("0.5.0b30"),
|
|
3789
|
+
"v0.5.0-beta.30",
|
|
3746
3790
|
)
|
|
3747
3791
|
self.assertEqual(
|
|
3748
|
-
release_readiness._release_tag_for_version("0.5.
|
|
3749
|
-
"v0.5.0-beta.
|
|
3792
|
+
release_readiness._release_tag_for_version("0.5.0b30"),
|
|
3793
|
+
"v0.5.0-beta.30",
|
|
3750
3794
|
)
|
|
3751
3795
|
self.assertEqual(
|
|
3752
|
-
code_mower_versioning.release_tag_for_version("0.5.
|
|
3753
|
-
"v0.5.0-beta.
|
|
3796
|
+
code_mower_versioning.release_tag_for_version("0.5.0b30"),
|
|
3797
|
+
"v0.5.0-beta.30",
|
|
3754
3798
|
)
|
|
3755
3799
|
self.assertEqual(
|
|
3756
3800
|
release_readiness._release_tag_for_version("1.0.0rc1"),
|
|
@@ -3779,8 +3823,8 @@ def main():
|
|
|
3779
3823
|
next_steps.current_alpha_package_spec(),
|
|
3780
3824
|
)
|
|
3781
3825
|
self.assertEqual(
|
|
3782
|
-
code_mower_package_content.current_alpha_package_spec("0.5.
|
|
3783
|
-
"code-mower==0.5.
|
|
3826
|
+
code_mower_package_content.current_alpha_package_spec("0.5.0b30"),
|
|
3827
|
+
"code-mower==0.5.0b30",
|
|
3784
3828
|
)
|
|
3785
3829
|
self.assertNotIn(next_steps.current_public_tag(), package_content_text)
|
|
3786
3830
|
self.assertNotIn("v0.0.0", package_content_text)
|
|
@@ -3952,7 +3996,7 @@ def main():
|
|
|
3952
3996
|
step for step in plan["steps"] if step["id"] == "package-install-rehearsal"
|
|
3953
3997
|
)
|
|
3954
3998
|
self.assertIn("doctor --v05", doctor_step["command"])
|
|
3955
|
-
self.assertIn("code-mower==0.5.
|
|
3999
|
+
self.assertIn("code-mower==0.5.0b30", package_step["command"])
|
|
3956
4000
|
self.assertIn("current published PyPI prerelease", package_step["why"])
|
|
3957
4001
|
self.assertIn("first_user_readiness", package_step["why"])
|
|
3958
4002
|
self.assertEqual(
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|