code-mower 0.5.0b18__tar.gz → 0.5.0b20__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.0b18 → code_mower-0.5.0b20}/PKG-INFO +6 -6
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/README.md +5 -5
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/pyproject.toml +1 -1
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/__init__.py +1 -1
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/cli.py +1 -1
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/cloud_client/export.py +2 -1
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/cloud_client/operations.py +1 -1
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/providers/provenance.py +13 -2
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower.egg-info/PKG-INFO +6 -6
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_cloud_client.py +82 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_provider_local_cli.py +29 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_release_hygiene.py +34 -34
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/CODE_OF_CONDUCT.md +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/LICENSE +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/MANIFEST.in +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/NOTICE +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/SUPPORT.md +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/requirements/requirements.txt +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/setup.cfg +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/adapters/__init__.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/adapters/_base.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/adapters/cursor_bugbot.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/adapters/gitar.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/adapters/greptile.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/adapters/qodo.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/audit_handoff_log.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/audit_labeler_lib.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/audit_progress.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/blind_review_artifacts.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/blind_review_coordinator.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/bootstrap.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/builder_experiment.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/calibration/__init__.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/calibration/arms.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/calibration/auto_discovery.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/calibration/commands.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/calibration/context_inputs.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/calibration/corpus.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/calibration/effect_report.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/calibration/evidence.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/calibration/evidence_report.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/calibration/identity.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/calibration/metrics.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/calibration/overlap.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/calibration/planning.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/calibration/policy.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/calibration/results.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/calibration/run_results.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/calibration/run_status.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/calibration/runner.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/calibration/truth.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/calibration/value_report.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/checks.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/claude_audit_pr.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/claude_cli_bounce.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/claude_cli_environment.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/clear_stale.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/cloud.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/cloud_client/__init__.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/cloud_client/bundle.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/cloud_client/doctor.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/cloud_client/dogfood.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/cloud_client/endpoints.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/cloud_client/errors.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/cloud_client/events.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/cloud_client/git_metadata.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/cloud_client/manifest.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/cloud_client/reports.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/cloud_client/setup.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/cloud_client/upload.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/code_mower_calibration.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/code_mower_context_packs.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/code_mower_merge.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/code_mower_telemetry.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/codex_audit_env_preflight.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/codex_audit_pr.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/codex_audit_schema_smoke.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/codex_audit_verdict.schema.json +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/config.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/__init__.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/cloud.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/common.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/github.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/github_actions.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/github_api.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/github_branch.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/github_config.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/github_provider.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/github_repo.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/groups.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/models.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/output.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/presets.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/privacy.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/provider_env.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/provider_probe.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/providers.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/registry.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/runner.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/runtime.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/gemini_cli_audit_pr.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/hermes_cli_audit_pr.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/init.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/lane_configs/__init__.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/lane_configs/aider.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/lane_configs/claude.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/lane_configs/codex.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/lane_configs/devin.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/lane_configs/gemini_cli.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/lane_configs/hermes_cli.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/lane_configs/local_llm.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/local_llm_audit_pr.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/local_llm_bakeoff.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/local_llm_calibration.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/local_llm_profiles.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/migration.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/migration_install.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/migration_mirror.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/migration_readiness.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/migration_rehearsal.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/next_steps.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/package.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/package_content.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/package_manifest.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/package_paths.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/package_rendering.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/package_static.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/prompts.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/provider_registry.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/provider_runners/__init__.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/provider_runners/comments.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/provider_runners/git.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/provider_runners/github_auth.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/provider_runners/github_pr.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/provider_runners/pr_worktree.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/provider_runners/process.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/provider_runners/repo_paths.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/provider_runners/text_schema.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/provider_runners/workspace.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/providers/__init__.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/providers/local_cli.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/release_readiness.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/reviewer_metrics.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/saas_reviewer_labeler.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/secrets.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/templates/builder-experiment.example.json +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/templates/calibration-corpus.example.json +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/templates/calibration-corpus.json +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/templates/code-mower.example.yml +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/templates/context-packs.example.json +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/templates/lane_prompts/operability.md +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/templates/product-support/code_mower +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/templates/providers.yml +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/templates/reviewer-spend.example.json +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/trailer_comment_labeler.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower/versioning.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower.egg-info/SOURCES.txt +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower.egg-info/dependency_links.txt +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower.egg-info/entry_points.txt +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower.egg-info/requires.txt +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/src/code_mower.egg-info/top_level.txt +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/builder-experiment.example.json +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/calibration-corpus.example.json +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/calibration-corpus.json +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/code-mower.yml.j2 +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/context-packs.example.json +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/cursor/BUGBOT.md +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/providers/acp_bridge.yml +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/providers/aider.yml +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/providers/antigravity_cli.yml +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/providers/claude_audit.yml +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/providers/claude_review.yml +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/providers/coderabbit_cli.yml +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/providers/codex.yml +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/providers/cursor_bugbot.yml +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/providers/devin.yml +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/providers/gemini_cli.yml +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/providers/gitar.yml +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/providers/greptile.yml +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/providers/hermes_cli.yml +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/providers/local_llm.yml +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/providers/qodo.yml +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/providers.yml +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/reviewer-spend.example.json +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/reviewer-value-report.example.md +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/workflows/review-clear-stale.yml.j2 +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_calibration_effect_report.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_calibration_truth.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_checks.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_claude_cli_bounce.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_clear_stale.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_cloud_git_metadata.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_cloud_manifest.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_cloud_reports.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_coderabbit_cli_audit_pr.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_doctor_actions_cost_summary.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_doctor_actions_failure_selection.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_doctor_boundaries.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_doctor_github_checks.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_doctor_output.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_doctor_privacy.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_doctor_provider_env_required.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_doctor_provider_env_tokens.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_doctor_provider_probe.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_doctor_provider_review_hygiene.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_doctor_registry.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_local_llm_github_helpers.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_provider_runners_comments.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_provider_runners_git.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_provider_runners_github_pr.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_provider_runners_pr_worktree.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_provider_runners_process.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_provider_runners_repo_paths.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_provider_runners_text_schema.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/tests/test_provider_runners_workspace.py +0 -0
- {code_mower-0.5.0b18 → code_mower-0.5.0b20}/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.0b20
|
|
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.0b20
|
|
105
105
|
code-mower --version
|
|
106
106
|
```
|
|
107
107
|
|
|
108
|
-
`0.5.
|
|
108
|
+
`0.5.0b20` 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.0b20`.
|
|
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.20` 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.0b20` 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.0b20
|
|
90
90
|
code-mower --version
|
|
91
91
|
```
|
|
92
92
|
|
|
93
|
-
`0.5.
|
|
93
|
+
`0.5.0b20` 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.0b20`.
|
|
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.20` 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.0b20` 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.0b20`, or run source checkouts with "
|
|
18
18
|
"`PYTHONPATH=src python -m code_mower.cli`."
|
|
19
19
|
)
|
|
20
20
|
|
|
@@ -256,13 +256,14 @@ def build_provenance_summary(events: list[dict[str, Any]]) -> dict[str, Any]:
|
|
|
256
256
|
provider = str(tool.get("provider") or event.get("provider") or "").strip()
|
|
257
257
|
model = str(tool.get("model") or "").strip()
|
|
258
258
|
model_version_raw = str(tool.get("model_version_raw") or "").strip()
|
|
259
|
+
model_source = str(tool.get("model_source") or "").strip()
|
|
259
260
|
tool_version = str(tool.get("tool_version") or "").strip()
|
|
260
261
|
if not tool_name and not provider and not model:
|
|
261
262
|
missing_tool_events += 1
|
|
262
263
|
missing_model_events += 1
|
|
263
264
|
missing_tool_version_events += 1
|
|
264
265
|
continue
|
|
265
|
-
if not model and not model_version_raw:
|
|
266
|
+
if not model and not model_version_raw and model_source in {"", "missing"}:
|
|
266
267
|
missing_model_events += 1
|
|
267
268
|
if not tool_version:
|
|
268
269
|
missing_tool_version_events += 1
|
|
@@ -19,6 +19,8 @@ TOOL_PROVENANCE_FIELDS = (
|
|
|
19
19
|
"provider",
|
|
20
20
|
"model",
|
|
21
21
|
"model_version_raw",
|
|
22
|
+
"model_source",
|
|
23
|
+
"version_source",
|
|
22
24
|
"integration",
|
|
23
25
|
"lens",
|
|
24
26
|
"runtime_environment",
|
|
@@ -91,6 +93,8 @@ def normalize_tool_provenance(
|
|
|
91
93
|
"provider": provider,
|
|
92
94
|
"model": _safe_text(source.get("model")),
|
|
93
95
|
"model_version_raw": _safe_text(source.get("model_version_raw")),
|
|
96
|
+
"model_source": _safe_text(source.get("model_source")),
|
|
97
|
+
"version_source": _safe_text(source.get("version_source")),
|
|
94
98
|
"integration": integration,
|
|
95
99
|
"lens": lens,
|
|
96
100
|
"runtime_environment": _safe_text(
|
|
@@ -174,7 +178,10 @@ def _profile_model(config: Mapping[str, Any]) -> tuple[str, str]:
|
|
|
174
178
|
return _safe_text(profile.get("model")), profile_id
|
|
175
179
|
|
|
176
180
|
|
|
177
|
-
|
|
181
|
+
_VENDOR_HIDDEN_MODEL_DRIVERS = frozenset({"hosted_bridge", "manual", "saas_event"})
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
def _configured_model(config: Mapping[str, Any], driver: str) -> tuple[str, str]:
|
|
178
185
|
env_model = _env_value(config, "model_env")
|
|
179
186
|
if env_model:
|
|
180
187
|
return env_model, "env"
|
|
@@ -184,6 +191,8 @@ def _configured_model(config: Mapping[str, Any]) -> tuple[str, str]:
|
|
|
184
191
|
default_model = _safe_text(config.get("default_model"))
|
|
185
192
|
if default_model:
|
|
186
193
|
return default_model, "default"
|
|
194
|
+
if driver in _VENDOR_HIDDEN_MODEL_DRIVERS:
|
|
195
|
+
return "", "vendor_hidden"
|
|
187
196
|
return "", "missing"
|
|
188
197
|
|
|
189
198
|
|
|
@@ -233,7 +242,7 @@ def build_provider_lane_tool_provenance(
|
|
|
233
242
|
driver = _safe_text(_lane_value(lane, "driver")) or "unknown"
|
|
234
243
|
command_candidates = _configured_command_candidates(config, provider)
|
|
235
244
|
command, resolved_command = _select_available_command(command_candidates)
|
|
236
|
-
model, model_source = _configured_model(config)
|
|
245
|
+
model, model_source = _configured_model(config, driver)
|
|
237
246
|
provider_from_env = _env_value(config, "provider_env")
|
|
238
247
|
if provider_from_env:
|
|
239
248
|
provider = provider_from_env
|
|
@@ -280,6 +289,8 @@ def build_provider_lane_tool_provenance(
|
|
|
280
289
|
"tool_version": tool_version,
|
|
281
290
|
"provider": provider,
|
|
282
291
|
"model": model,
|
|
292
|
+
"model_source": model_source,
|
|
293
|
+
"version_source": detail["version_source"],
|
|
283
294
|
"integration": driver.replace("_", "-"),
|
|
284
295
|
"lens": lens,
|
|
285
296
|
"source": source,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code-mower
|
|
3
|
-
Version: 0.5.
|
|
3
|
+
Version: 0.5.0b20
|
|
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.0b20
|
|
105
105
|
code-mower --version
|
|
106
106
|
```
|
|
107
107
|
|
|
108
|
-
`0.5.
|
|
108
|
+
`0.5.0b20` 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.0b20`.
|
|
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.20` 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.0b20` 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
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import json
|
|
4
|
+
import subprocess
|
|
4
5
|
import tempfile
|
|
5
6
|
from pathlib import Path
|
|
6
7
|
|
|
@@ -10,6 +11,7 @@ from code_mower.cloud_client import (
|
|
|
10
11
|
CloudBundleError,
|
|
11
12
|
DEFAULT_SETUP_INSTALL_ID,
|
|
12
13
|
EVENT_SCHEMA,
|
|
14
|
+
build_provenance_summary,
|
|
13
15
|
build_provider_catalog_snapshot_events,
|
|
14
16
|
build_cloud_bundle,
|
|
15
17
|
build_upload_payload,
|
|
@@ -238,12 +240,92 @@ def test_provider_catalog_snapshot_events_are_metadata_only(monkeypatch) -> None
|
|
|
238
240
|
assert codex["source"] == "unit-test"
|
|
239
241
|
assert codex["tool"]["tool_name"] == "codex"
|
|
240
242
|
assert codex["tool"]["provider"] == "codex"
|
|
243
|
+
assert codex["tool"]["model_source"] == "missing"
|
|
244
|
+
assert codex["tool"]["version_source"] == "missing"
|
|
241
245
|
assert codex["dimensions"]["catalog_snapshot"] is True
|
|
242
246
|
assert codex["dimensions"]["merge_authority"] is True
|
|
243
247
|
assert "token_env" not in codex["dimensions"]
|
|
244
248
|
assert "auth" not in codex["dimensions"]
|
|
245
249
|
|
|
246
250
|
|
|
251
|
+
def test_provenance_summary_treats_vendor_hidden_model_as_known_source() -> None:
|
|
252
|
+
summary = build_provenance_summary(
|
|
253
|
+
[
|
|
254
|
+
normalize_event(
|
|
255
|
+
{
|
|
256
|
+
"schema": EVENT_SCHEMA,
|
|
257
|
+
"event_id": "evt-vendor-hidden",
|
|
258
|
+
"event_type": "provider_catalog_snapshot",
|
|
259
|
+
"created_at": "2026-01-01T00:00:00Z",
|
|
260
|
+
"repo_slug": "owner/repo",
|
|
261
|
+
"team_id": "team",
|
|
262
|
+
"install_id": "install",
|
|
263
|
+
"source": "unit-test",
|
|
264
|
+
"tool": {
|
|
265
|
+
"role": "reviewer",
|
|
266
|
+
"tool_name": "gitar",
|
|
267
|
+
"provider": "gitar",
|
|
268
|
+
"model": "",
|
|
269
|
+
"model_source": "vendor_hidden",
|
|
270
|
+
"version_source": "not_probed",
|
|
271
|
+
},
|
|
272
|
+
},
|
|
273
|
+
"provider_catalog_snapshot",
|
|
274
|
+
)
|
|
275
|
+
]
|
|
276
|
+
)
|
|
277
|
+
|
|
278
|
+
assert summary["events_with_model_provenance"] == 1
|
|
279
|
+
assert summary["events_missing_model_provenance"] == 0
|
|
280
|
+
|
|
281
|
+
|
|
282
|
+
def test_dogfood_dry_run_preserves_version_probe(monkeypatch, tmp_path: Path) -> None:
|
|
283
|
+
subprocess.run(["git", "init"], cwd=tmp_path, check=True, capture_output=True)
|
|
284
|
+
subprocess.run(
|
|
285
|
+
["git", "config", "user.email", "test@example.com"],
|
|
286
|
+
cwd=tmp_path,
|
|
287
|
+
check=True,
|
|
288
|
+
)
|
|
289
|
+
subprocess.run(["git", "config", "user.name", "Test"], cwd=tmp_path, check=True)
|
|
290
|
+
(tmp_path / "README.md").write_text("fixture\n", encoding="utf-8")
|
|
291
|
+
subprocess.run(["git", "add", "README.md"], cwd=tmp_path, check=True)
|
|
292
|
+
subprocess.run(
|
|
293
|
+
["git", "commit", "-m", "fixture"],
|
|
294
|
+
cwd=tmp_path,
|
|
295
|
+
check=True,
|
|
296
|
+
capture_output=True,
|
|
297
|
+
)
|
|
298
|
+
calls: list[bool] = []
|
|
299
|
+
|
|
300
|
+
def fake_catalog_events(**kwargs):
|
|
301
|
+
calls.append(bool(kwargs["include_version_probe"]))
|
|
302
|
+
return []
|
|
303
|
+
|
|
304
|
+
monkeypatch.setattr(
|
|
305
|
+
"code_mower.cloud_client.operations.build_provider_catalog_snapshot_events",
|
|
306
|
+
fake_catalog_events,
|
|
307
|
+
)
|
|
308
|
+
|
|
309
|
+
result = dogfood_upload(
|
|
310
|
+
repo_path=tmp_path,
|
|
311
|
+
output_dir=tmp_path / ".code-mower/cloud-dogfood-bundle",
|
|
312
|
+
reports=[],
|
|
313
|
+
events=[],
|
|
314
|
+
repo_slug="owner/repo",
|
|
315
|
+
team_id="team",
|
|
316
|
+
install_id="install",
|
|
317
|
+
source="unit-test",
|
|
318
|
+
endpoint="https://codemower.com/api/ingest",
|
|
319
|
+
token_env="CODE_MOWER_TEST_EMPTY_TOKEN",
|
|
320
|
+
include_reports=False,
|
|
321
|
+
yes=False,
|
|
322
|
+
timeout=0.1,
|
|
323
|
+
)
|
|
324
|
+
|
|
325
|
+
assert result["status"] == "dry_run"
|
|
326
|
+
assert calls == [True]
|
|
327
|
+
|
|
328
|
+
|
|
247
329
|
def test_cloud_doctor_runs_from_client_module() -> None:
|
|
248
330
|
with tempfile.TemporaryDirectory() as tmp:
|
|
249
331
|
report = run_cloud_doctor(
|
|
@@ -81,6 +81,8 @@ def test_provider_lane_tool_provenance_reads_version_and_model_env(
|
|
|
81
81
|
assert tool["tool_version"] == "provider-cli 9.8.7"
|
|
82
82
|
assert tool["provider"] == "gemini"
|
|
83
83
|
assert tool["model"] == "model-v1"
|
|
84
|
+
assert tool["model_source"] == "env"
|
|
85
|
+
assert tool["version_source"] == "cli_version_probe"
|
|
84
86
|
assert tool["lens"] == "security-threat-model"
|
|
85
87
|
assert detail["lane_id"] == "gemini_cli"
|
|
86
88
|
assert detail["command_candidates"] == ["provider-cli"]
|
|
@@ -119,12 +121,37 @@ def test_provider_lane_tool_provenance_uses_available_alternate_command(
|
|
|
119
121
|
assert tool["tool_name"] == "antigravity"
|
|
120
122
|
assert tool["tool_version"] == "antigravity 1.2.3"
|
|
121
123
|
assert tool["provider"] == "antigravity"
|
|
124
|
+
assert tool["model_source"] == "missing"
|
|
125
|
+
assert tool["version_source"] == "cli_version_probe"
|
|
122
126
|
assert detail["command"] == "antigravity"
|
|
123
127
|
assert detail["command_candidates"] == ["agy", "antigravity"]
|
|
124
128
|
assert detail["command_found"] is True
|
|
125
129
|
assert detail["version_known"] is True
|
|
126
130
|
|
|
127
131
|
|
|
132
|
+
def test_provider_lane_tool_provenance_marks_hosted_model_as_vendor_hidden() -> None:
|
|
133
|
+
lane = {
|
|
134
|
+
"driver": "saas_event",
|
|
135
|
+
"provider": "gitar",
|
|
136
|
+
"adapter": "gitar",
|
|
137
|
+
"provider_config": {},
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
tool, detail = build_provider_lane_tool_provenance(
|
|
141
|
+
"gitar",
|
|
142
|
+
lane,
|
|
143
|
+
source="unit-test",
|
|
144
|
+
)
|
|
145
|
+
|
|
146
|
+
assert tool["tool_name"] == "gitar"
|
|
147
|
+
assert tool["provider"] == "gitar"
|
|
148
|
+
assert tool["model"] == ""
|
|
149
|
+
assert tool["model_source"] == "vendor_hidden"
|
|
150
|
+
assert tool["version_source"] == "not_probed"
|
|
151
|
+
assert detail["model_known"] is False
|
|
152
|
+
assert detail["model_source"] == "vendor_hidden"
|
|
153
|
+
|
|
154
|
+
|
|
128
155
|
def test_provider_lane_tool_provenance_reads_model_from_selected_profile(
|
|
129
156
|
monkeypatch,
|
|
130
157
|
tmp_path: Path,
|
|
@@ -159,6 +186,8 @@ def test_provider_lane_tool_provenance_reads_model_from_selected_profile(
|
|
|
159
186
|
)
|
|
160
187
|
|
|
161
188
|
assert tool["model"] == "qwen/qwen3-coder-next"
|
|
189
|
+
assert tool["model_source"] == "profile:qwen3-coder-next-lmstudio"
|
|
190
|
+
assert tool["version_source"] == "cli_version_probe"
|
|
162
191
|
assert detail["model_known"] is True
|
|
163
192
|
assert detail["model_source"] == "profile:qwen3-coder-next-lmstudio"
|
|
164
193
|
assert detail["version_known"] is True
|
|
@@ -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.0b20")
|
|
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.0b20 --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.0b20"),
|
|
1618
|
+
"code-mower==0.5.0b20",
|
|
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.0b20'))"
|
|
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.0b20",
|
|
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.0b20"',
|
|
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.0b20"',
|
|
1749
1749
|
(output_dir / "src/code_mower/__init__.py").read_text(
|
|
1750
1750
|
encoding="utf-8"
|
|
1751
1751
|
),
|
|
@@ -3236,7 +3236,7 @@ def main():
|
|
|
3236
3236
|
{
|
|
3237
3237
|
"status": "pass",
|
|
3238
3238
|
"package_spec": "code-mower",
|
|
3239
|
-
"version": "code-mower 0.5.
|
|
3239
|
+
"version": "code-mower 0.5.0b20",
|
|
3240
3240
|
"work_dir": "/tmp/code-mower-rehearsal",
|
|
3241
3241
|
"toy_repo": "/tmp/code-mower-rehearsal/toy-repo",
|
|
3242
3242
|
"step_count": 1,
|
|
@@ -3348,7 +3348,7 @@ def main():
|
|
|
3348
3348
|
scorecard = code_mower_migration._first_user_readiness_scorecard(
|
|
3349
3349
|
toy_repo=toy_repo,
|
|
3350
3350
|
outputs=outputs,
|
|
3351
|
-
version="code-mower 0.5.
|
|
3351
|
+
version="code-mower 0.5.0b20",
|
|
3352
3352
|
steps=[
|
|
3353
3353
|
{
|
|
3354
3354
|
"command": ["code-mower", "doctor", "--easy", "--json"],
|
|
@@ -3427,7 +3427,7 @@ def main():
|
|
|
3427
3427
|
scorecard = code_mower_migration._first_user_readiness_scorecard(
|
|
3428
3428
|
toy_repo=toy_repo,
|
|
3429
3429
|
outputs=outputs,
|
|
3430
|
-
version="code-mower 0.5.
|
|
3430
|
+
version="code-mower 0.5.0b20",
|
|
3431
3431
|
steps=[
|
|
3432
3432
|
{
|
|
3433
3433
|
"command": ["code-mower", "doctor", "--easy", "--json"],
|
|
@@ -3489,7 +3489,7 @@ def main():
|
|
|
3489
3489
|
scorecard = code_mower_migration._first_user_readiness_scorecard(
|
|
3490
3490
|
toy_repo=toy_repo,
|
|
3491
3491
|
outputs=outputs,
|
|
3492
|
-
version="code-mower 0.5.
|
|
3492
|
+
version="code-mower 0.5.0b20",
|
|
3493
3493
|
steps=[
|
|
3494
3494
|
{
|
|
3495
3495
|
"command": ["code-mower", "doctor", "--easy", "--json"],
|
|
@@ -3555,24 +3555,24 @@ def main():
|
|
|
3555
3555
|
)
|
|
3556
3556
|
self.assertEqual(
|
|
3557
3557
|
code_mower_migration._resolve_install_package_spec(
|
|
3558
|
-
"git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.
|
|
3558
|
+
"git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.20",
|
|
3559
3559
|
base_dir=package,
|
|
3560
3560
|
),
|
|
3561
|
-
"git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.
|
|
3561
|
+
"git+https://github.com/codemower-ai/code-mower.git@v0.5.0-beta.20",
|
|
3562
3562
|
)
|
|
3563
3563
|
self.assertEqual(
|
|
3564
3564
|
code_mower_migration._resolve_install_package_spec(
|
|
3565
|
-
"code-mower==0.5.
|
|
3565
|
+
"code-mower==0.5.0b20",
|
|
3566
3566
|
base_dir=package,
|
|
3567
3567
|
),
|
|
3568
|
-
"code-mower==0.5.
|
|
3568
|
+
"code-mower==0.5.0b20",
|
|
3569
3569
|
)
|
|
3570
3570
|
|
|
3571
3571
|
def test_package_install_rehearsal_supports_index_aware_pip_install(self) -> None:
|
|
3572
3572
|
self.assertEqual(
|
|
3573
3573
|
code_mower_migration._pip_install_command(
|
|
3574
3574
|
Path("/tmp/venv/bin/python"),
|
|
3575
|
-
"code-mower==0.5.
|
|
3575
|
+
"code-mower==0.5.0b20",
|
|
3576
3576
|
pip_index_url="https://test.pypi.org/simple/",
|
|
3577
3577
|
pip_extra_index_urls=["https://pypi.org/simple/"],
|
|
3578
3578
|
),
|
|
@@ -3585,7 +3585,7 @@ def main():
|
|
|
3585
3585
|
"https://test.pypi.org/simple/",
|
|
3586
3586
|
"--extra-index-url",
|
|
3587
3587
|
"https://pypi.org/simple/",
|
|
3588
|
-
"code-mower==0.5.
|
|
3588
|
+
"code-mower==0.5.0b20",
|
|
3589
3589
|
],
|
|
3590
3590
|
)
|
|
3591
3591
|
|
|
@@ -3605,10 +3605,10 @@ def main():
|
|
|
3605
3605
|
payload = release_readiness.render_release_readiness(ROOT)
|
|
3606
3606
|
|
|
3607
3607
|
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.
|
|
3608
|
+
self.assertEqual(payload["version"], "0.5.0b20")
|
|
3609
|
+
self.assertEqual(payload["release_tag"], "v0.5.0-beta.20")
|
|
3610
|
+
self.assertEqual(payload["alpha_tag"], "v0.5.0-beta.20")
|
|
3611
|
+
self.assertEqual(payload["package_index_spec"], "code-mower==0.5.0b20")
|
|
3612
3612
|
check_ids = {check["id"]: check for check in payload["checks"]}
|
|
3613
3613
|
self.assertEqual(check_ids["package-version-consistency"]["status"], "pass")
|
|
3614
3614
|
self.assertEqual(
|
|
@@ -3657,7 +3657,7 @@ def main():
|
|
|
3657
3657
|
check_ids = {check["id"]: check for check in payload["checks"]}
|
|
3658
3658
|
check = check_ids["materialized-package-version-consistency"]
|
|
3659
3659
|
self.assertEqual(check["status"], "fail")
|
|
3660
|
-
self.assertEqual(check["detail"]["source_version"], "0.5.
|
|
3660
|
+
self.assertEqual(check["detail"]["source_version"], "0.5.0b20")
|
|
3661
3661
|
self.assertEqual(check["detail"]["generated_init_version"], "0.0.0")
|
|
3662
3662
|
|
|
3663
3663
|
def test_public_support_docs_are_packaged_and_privacy_forward(self) -> None:
|
|
@@ -3737,20 +3737,20 @@ def main():
|
|
|
3737
3737
|
|
|
3738
3738
|
def test_release_readiness_tag_derivation_supports_release_stages(self) -> None:
|
|
3739
3739
|
self.assertEqual(
|
|
3740
|
-
release_readiness._release_tag_for_version("0.5.
|
|
3741
|
-
"v0.5.0-beta.
|
|
3740
|
+
release_readiness._release_tag_for_version("0.5.0b20"),
|
|
3741
|
+
"v0.5.0-beta.20",
|
|
3742
3742
|
)
|
|
3743
3743
|
self.assertEqual(
|
|
3744
|
-
code_mower_versioning.release_tag_for_version("0.5.
|
|
3745
|
-
"v0.5.0-beta.
|
|
3744
|
+
code_mower_versioning.release_tag_for_version("0.5.0b20"),
|
|
3745
|
+
"v0.5.0-beta.20",
|
|
3746
3746
|
)
|
|
3747
3747
|
self.assertEqual(
|
|
3748
|
-
release_readiness._release_tag_for_version("0.5.
|
|
3749
|
-
"v0.5.0-beta.
|
|
3748
|
+
release_readiness._release_tag_for_version("0.5.0b20"),
|
|
3749
|
+
"v0.5.0-beta.20",
|
|
3750
3750
|
)
|
|
3751
3751
|
self.assertEqual(
|
|
3752
|
-
code_mower_versioning.release_tag_for_version("0.5.
|
|
3753
|
-
"v0.5.0-beta.
|
|
3752
|
+
code_mower_versioning.release_tag_for_version("0.5.0b20"),
|
|
3753
|
+
"v0.5.0-beta.20",
|
|
3754
3754
|
)
|
|
3755
3755
|
self.assertEqual(
|
|
3756
3756
|
release_readiness._release_tag_for_version("1.0.0rc1"),
|
|
@@ -3779,8 +3779,8 @@ def main():
|
|
|
3779
3779
|
next_steps.current_alpha_package_spec(),
|
|
3780
3780
|
)
|
|
3781
3781
|
self.assertEqual(
|
|
3782
|
-
code_mower_package_content.current_alpha_package_spec("0.5.
|
|
3783
|
-
"code-mower==0.5.
|
|
3782
|
+
code_mower_package_content.current_alpha_package_spec("0.5.0b20"),
|
|
3783
|
+
"code-mower==0.5.0b20",
|
|
3784
3784
|
)
|
|
3785
3785
|
self.assertNotIn(next_steps.current_public_tag(), package_content_text)
|
|
3786
3786
|
self.assertNotIn("v0.0.0", package_content_text)
|
|
@@ -3952,7 +3952,7 @@ def main():
|
|
|
3952
3952
|
step for step in plan["steps"] if step["id"] == "package-install-rehearsal"
|
|
3953
3953
|
)
|
|
3954
3954
|
self.assertIn("doctor --v05", doctor_step["command"])
|
|
3955
|
-
self.assertIn("code-mower==0.5.
|
|
3955
|
+
self.assertIn("code-mower==0.5.0b20", package_step["command"])
|
|
3956
3956
|
self.assertIn("current published PyPI prerelease", package_step["why"])
|
|
3957
3957
|
self.assertIn("first_user_readiness", package_step["why"])
|
|
3958
3958
|
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
|