code-mower 0.9.1b1__tar.gz → 0.9.2b1__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.9.1b1 → code_mower-0.9.2b1}/PKG-INFO +10 -9
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/README.md +9 -8
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/pyproject.toml +1 -1
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/__init__.py +1 -1
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/board.py +2 -1
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/board_store.py +4 -2
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cli.py +0 -3
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_human_token.py +4 -6
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/lane_status.py +61 -14
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/migration.py +1 -1
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/package_manifest.py +0 -1
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/builder-provenance.yml.j2 +1 -1
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower.egg-info/PKG-INFO +10 -9
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower.egg-info/SOURCES.txt +0 -2
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/builder-provenance.yml.j2 +1 -1
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_board.py +2 -2
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_doctor_github_checks.py +16 -4
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_lane_status.py +100 -13
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_release_hygiene.py +38 -38
- code_mower-0.9.1b1/src/code_mower/observe.py +0 -324
- code_mower-0.9.1b1/tests/test_observe.py +0 -111
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/CODE_OF_CONDUCT.md +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/LICENSE +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/MANIFEST.in +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/NOTICE +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/SUPPORT.md +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/requirements/requirements.txt +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/setup.cfg +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/adapters/__init__.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/adapters/_base.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/adapters/cursor_bugbot.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/adapters/gitar.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/adapters/greptile.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/adapters/qodo.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/antigravity_cli_audit_pr.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/antigravity_sdk_probe.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/audit_handoff_log.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/audit_labeler_lib.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/audit_limits.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/audit_progress.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/blind_review_artifacts.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/blind_review_coordinator.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/bootstrap.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/builder_experiment.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/builder_runs.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/__init__.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/arms.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/auto_discovery.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/commands.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/context_inputs.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/corpus.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/effect_report.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/evidence.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/evidence_report.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/identity.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/metrics.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/overlap.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/planning.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/policy.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/results.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/run_results.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/run_status.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/runner.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/truth.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/calibration/value_report.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/checks.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/claude_audit_pr.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/claude_cli_bounce.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/claude_cli_environment.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/clear_stale.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/__init__.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/bundle.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/doctor.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/dogfood.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/endpoints.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/errors.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/events.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/export.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/git_metadata.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/manifest.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/operations.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/reports.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/setup.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/tokens.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/cloud_client/upload.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/code_mower_calibration.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/code_mower_context_packs.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/code_mower_merge.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/code_mower_telemetry.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/coderabbit_cli_audit_pr.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/codex_audit_env_preflight.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/codex_audit_pr.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/codex_audit_schema_smoke.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/codex_audit_verdict.schema.json +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/config.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/decisions.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/__init__.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/adoption.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/audit_limits.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/cloud.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/common.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_actions.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_actions_cost.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_actions_cost_summary.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_actions_failure_annotations.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_actions_failure_models.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_actions_failure_scan.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_actions_failure_selection.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_actions_failures.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_actions_permissions.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_api.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_branch.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_config.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_provider.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_repo.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_trusted_authors.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/groups.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/models.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/output.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/presets.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/privacy.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_api_model.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_api_model_openai.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_api_model_profiles.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_env.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_env_required.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_env_tokens.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_local_audit_setup.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_local_cli.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_local_cli_commands.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_local_cli_probe_config.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_probe.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_probe_auth.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_probe_evaluation.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_probe_json.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_probe_remediation.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/provider_review_hygiene.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/providers.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/registry.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/runner.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/runtime.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/runtime_github_auth.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/self_hosted_runner.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/gate_health.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/gemini_cli_audit_pr.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/git_identity.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/grok_build_audit_pr.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/hermes_cli_audit_pr.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/init.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/lane_configs/__init__.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/lane_configs/aider.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/lane_configs/antigravity_cli.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/lane_configs/claude.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/lane_configs/codex.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/lane_configs/devin.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/lane_configs/gemini_cli.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/lane_configs/grok_build.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/lane_configs/hermes_cli.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/lane_configs/local_llm.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/local_llm_audit_pr.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/local_llm_bakeoff.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/local_llm_calibration.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/local_llm_profiles.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/migration_install.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/migration_mirror.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/migration_readiness.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/migration_rehearsal.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/next_steps.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/package.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/package_content.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/package_paths.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/package_rendering.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/package_static.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/plan_context.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/prompts.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/provider_registry.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/provider_runners/__init__.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/provider_runners/comments.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/provider_runners/exit_codes.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/provider_runners/git.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/provider_runners/github_auth.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/provider_runners/github_pr.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/provider_runners/pr_worktree.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/provider_runners/process.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/provider_runners/repo_paths.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/provider_runners/text_schema.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/provider_runners/verdict_artifacts.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/provider_runners/workspace.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/providers/__init__.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/providers/local_cli.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/providers/provenance.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/release_readiness.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/reviewer_metrics.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/reviewer_spend.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/saas_reviewer_labeler.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/secrets.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/builder-experiment.example.json +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/calibration-corpus.example.json +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/calibration-corpus.json +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/code-mower.example.yml +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/context-packs.example.json +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lane_prompts/base-audit.md +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lane_prompts/calibration-policy.md +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lane_prompts/context-driven-quality.md +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lane_prompts/docs-design.md +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lane_prompts/generic-programming.md +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lane_prompts/operability.md +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lane_prompts/package-runtime.md +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lane_prompts/plan-conformance.md +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lane_prompts/security-threat-model.md +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lanes/README.md +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lanes/claude.md +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lanes/codex.md +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lanes/cursor.md +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lanes/generic.md +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/lanes/run_mac_lane.sh +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/product-support/code_mower +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/product-support/code_mower_standalone_pin.env +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/product-support/code_mower_standalone_shadow.sh +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/product-support/run_claude_audit_pr.sh +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/product-support/run_codex_audit_pr.sh +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/product-support/safe_gh_comment.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/product-support/status_report.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/providers.yml +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/reviewer-spend.example.json +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/reviewer-value-report.example.md +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/code-mower-gate.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/dispatch-lanes.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/lane-mac-runner.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/needs-owner-notify.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/review-clear-stale.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/templates/workflows/weekly-status.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/trailer_comment_labeler.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/versioning.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/work_orders.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/workflow_actionlint.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower.egg-info/dependency_links.txt +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower.egg-info/entry_points.txt +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower.egg-info/requires.txt +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower.egg-info/top_level.txt +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/builder-experiment.example.json +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/calibration-corpus.example.json +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/calibration-corpus.json +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/code-mower.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/context-packs.example.json +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/cursor/BUGBOT.md +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/lanes/README.md +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/lanes/claude.md +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/lanes/codex.md +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/lanes/cursor.md +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/lanes/generic.md +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/lanes/run_mac_lane.sh +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/acp_bridge.yml +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/aider.yml +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/antigravity_cli.yml +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/claude_audit.yml +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/claude_review.yml +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/coderabbit_cli.yml +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/codex.yml +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/cursor_bugbot.yml +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/devin.yml +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/gemini_cli.yml +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/gitar.yml +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/greptile.yml +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/hermes_cli.yml +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/local_llm.yml +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers/qodo.yml +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/providers.yml +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/reviewer-spend.example.json +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/reviewer-value-report.example.md +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/audit-label-cleanup.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/blind-review-artifacts-dry-run.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/code-mower-agent-pr-labeler.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/code-mower-fix-round-dispatch.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/code-mower-gate-health.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/code-mower-gate.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/dispatch-lanes.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/hosted-bridge.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/lane-mac-runner.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/local-cli-audit.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/private-standalone-shadow.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/review-clear-stale.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/saas-reviewer-labeler.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/self-hosted-local-audit.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/templates/workflows/trailer-comment-labeler.yml.j2 +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_antigravity_sdk_probe.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_audit_comment_posture.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_audit_limits.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_builder_experiment.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_builder_identity.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_builder_runs.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_calibration_effect_report.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_calibration_truth.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_checks.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_claude_audit_pr.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_claude_cli_bounce.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_clear_stale.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_cloud_client.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_cloud_git_metadata.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_cloud_manifest.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_cloud_reports.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_coderabbit_cli_audit_pr.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_codex_audit_env_preflight.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_codex_audit_pr.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_decision_audit_integration.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_decisions.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_doctor_actions_cost_summary.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_doctor_actions_failure_selection.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_doctor_boundaries.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_doctor_output.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_doctor_privacy.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_doctor_provider_env_required.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_doctor_provider_env_tokens.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_doctor_provider_local_audit_setup.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_doctor_provider_probe.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_doctor_provider_review_hygiene.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_doctor_registry.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_doctor_runtime.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_doctor_self_hosted_runner.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_gate_health.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_init_actionlint.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_init_build_loop.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_local_llm_github_helpers.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_migration_setup_drift.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_plan_context.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_prompts.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_provider_fixture_contracts.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_provider_local_cli.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_provider_runners_comments.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_provider_runners_git.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_provider_runners_github_pr.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_provider_runners_pr_worktree.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_provider_runners_process.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_provider_runners_repo_paths.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_provider_runners_text_schema.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_provider_runners_workspace.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_reviewer_metrics_core.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_reviewer_spend.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_trailer_comment_labeler.py +0 -0
- {code_mower-0.9.1b1 → code_mower-0.9.2b1}/tests/test_work_orders.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code-mower
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.2b1
|
|
4
4
|
Summary: Multi-reviewer AI code audit orchestration
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Requires-Python: >=3.12
|
|
@@ -169,12 +169,13 @@ after reinstalling, especially when switching between pipx and uv.
|
|
|
169
169
|
| C. Builder experiment | You want to compare authoring loops before trusting them broadly. | Use a work order or experiment spec, run `code-mower builder-experiment run` around an explicit command, then review the source-free `authoringRun` artifact and normal audit evidence. | [Builder Experiments](docs/builder-experiments.md) |
|
|
170
170
|
|
|
171
171
|
The current package-index announcement entry point is the tagged
|
|
172
|
-
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.9.
|
|
172
|
+
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.9.2-beta.1/docs/try-in-10-minutes.md)
|
|
173
173
|
guide. The v0.9 beta includes the completed native Board work plus the adoption
|
|
174
|
-
and upgrade hardening from recent install rehearsals; v0.9.
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
174
|
+
and upgrade hardening from recent install rehearsals; v0.9.2 keeps the path
|
|
175
|
+
simple by removing the retired third-party observe bridge, softening
|
|
176
|
+
dispatch-token expiry metadata when the secret is present, and making
|
|
177
|
+
stale-audit waits name the runner/dispatcher requeue path. Package-only users
|
|
178
|
+
can start from the public package rather than a source checkout.
|
|
178
179
|
|
|
179
180
|
## What Calibration Does And Does Not Prove
|
|
180
181
|
|
|
@@ -205,7 +206,7 @@ Provider-contract baseline for the next release train:
|
|
|
205
206
|
|
|
206
207
|
For release verification,
|
|
207
208
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
208
|
-
the package-index procedure for `v0.9.
|
|
209
|
+
the package-index procedure for `v0.9.2-beta.1` / `code-mower==0.9.2b1`. The
|
|
209
210
|
GitHub release records the workflow and rehearsal evidence for the exact tag.
|
|
210
211
|
|
|
211
212
|
## Optional: Plan Before Coding
|
|
@@ -391,8 +392,8 @@ measurement work.
|
|
|
391
392
|
|
|
392
393
|
## Installation Status
|
|
393
394
|
|
|
394
|
-
The current package-index beta baseline is `v0.9.
|
|
395
|
-
install spec `code-mower==0.9.
|
|
395
|
+
The current package-index beta baseline is `v0.9.2-beta.1`, with pinned package
|
|
396
|
+
install spec `code-mower==0.9.2b1`. Release evidence is recorded on the GitHub
|
|
396
397
|
release and in the first-user install rehearsal. The public repository is
|
|
397
398
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
|
|
398
399
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
@@ -152,12 +152,13 @@ after reinstalling, especially when switching between pipx and uv.
|
|
|
152
152
|
| C. Builder experiment | You want to compare authoring loops before trusting them broadly. | Use a work order or experiment spec, run `code-mower builder-experiment run` around an explicit command, then review the source-free `authoringRun` artifact and normal audit evidence. | [Builder Experiments](docs/builder-experiments.md) |
|
|
153
153
|
|
|
154
154
|
The current package-index announcement entry point is the tagged
|
|
155
|
-
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.9.
|
|
155
|
+
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.9.2-beta.1/docs/try-in-10-minutes.md)
|
|
156
156
|
guide. The v0.9 beta includes the completed native Board work plus the adoption
|
|
157
|
-
and upgrade hardening from recent install rehearsals; v0.9.
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
157
|
+
and upgrade hardening from recent install rehearsals; v0.9.2 keeps the path
|
|
158
|
+
simple by removing the retired third-party observe bridge, softening
|
|
159
|
+
dispatch-token expiry metadata when the secret is present, and making
|
|
160
|
+
stale-audit waits name the runner/dispatcher requeue path. Package-only users
|
|
161
|
+
can start from the public package rather than a source checkout.
|
|
161
162
|
|
|
162
163
|
## What Calibration Does And Does Not Prove
|
|
163
164
|
|
|
@@ -188,7 +189,7 @@ Provider-contract baseline for the next release train:
|
|
|
188
189
|
|
|
189
190
|
For release verification,
|
|
190
191
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
191
|
-
the package-index procedure for `v0.9.
|
|
192
|
+
the package-index procedure for `v0.9.2-beta.1` / `code-mower==0.9.2b1`. The
|
|
192
193
|
GitHub release records the workflow and rehearsal evidence for the exact tag.
|
|
193
194
|
|
|
194
195
|
## Optional: Plan Before Coding
|
|
@@ -374,8 +375,8 @@ measurement work.
|
|
|
374
375
|
|
|
375
376
|
## Installation Status
|
|
376
377
|
|
|
377
|
-
The current package-index beta baseline is `v0.9.
|
|
378
|
-
install spec `code-mower==0.9.
|
|
378
|
+
The current package-index beta baseline is `v0.9.2-beta.1`, with pinned package
|
|
379
|
+
install spec `code-mower==0.9.2b1`. Release evidence is recorded on the GitHub
|
|
379
380
|
release and in the first-user install rehearsal. The public repository is
|
|
380
381
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
|
|
381
382
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
@@ -697,6 +697,7 @@ def render_board_html(config: BoardConfig) -> str:
|
|
|
697
697
|
<div>labels: ${{labels(pr.labels)}}</div>
|
|
698
698
|
<div>checks: ${{checks(pr.checks)}}</div>
|
|
699
699
|
<div>next: <b>${{esc(pr.next_action)}}</b></div>
|
|
700
|
+
${{pr.next_detail ? `<div class="muted">${{esc(pr.next_detail)}}</div>` : ""}}
|
|
700
701
|
</div>`).join("") : empty("No open pull requests."));
|
|
701
702
|
put("alerts", alerts.length ? alerts.map(a => `<div class="row"><b class="warn">${{esc(a.kind)}}</b> ${{esc(a.message)}}</div>`).join("") : empty("No gate alerts."));
|
|
702
703
|
put("runs", runs.length ? runs.slice(0, 8).map(run => `<div class="row"><div class="line"><a href="${{esc(href(run.url))}}">${{esc(run.workflow || "workflow")}}</a>${{pill(run.conclusion || run.status || "unknown")}}</div><div class="muted">${{esc(run.branch)}}${{run.updated_at ? ` updated ${{localTime(run.updated_at)}}` : ""}}</div></div>`).join("") : empty("No recent Code Mower workflow runs."));
|
|
@@ -707,7 +708,7 @@ def render_board_html(config: BoardConfig) -> str:
|
|
|
707
708
|
spend.filtered_rows ? `<div class="row muted">Filtered ${{esc(spend.filtered_rows)}} spend row(s) from other repos.</div>` : ""
|
|
708
709
|
].filter(Boolean);
|
|
709
710
|
put("spend", spendRows.length ? spendRows.join("") : empty(spend.message || "No reviewer spend rows for this repo yet."));
|
|
710
|
-
const boards = data.
|
|
711
|
+
const boards = data.local_boards?.boards || [];
|
|
711
712
|
const procs = data.local_processes?.processes || [];
|
|
712
713
|
put("local", [...boards.map(b => `<div class="row">board localhost:${{esc(b.port)}} pid=${{esc(b.pid)}} cwd=<code>${{esc(b.cwd || "")}}</code></div>`), ...procs.slice(0, 8).map(p => `<div class="row">${{esc(p.provider)}} pid=${{esc(p.pid)}} cwd=<code>${{esc(p.cwd || "")}}</code></div>`)].join("") || empty("No local boards or lane processes visible."));
|
|
713
714
|
}}
|
|
@@ -83,14 +83,16 @@ def _redact_local_paths(value: Any) -> Any:
|
|
|
83
83
|
|
|
84
84
|
def _snapshot_summary(snapshot: Mapping[str, Any]) -> dict[str, Any]:
|
|
85
85
|
remote = snapshot.get("remote") if isinstance(snapshot.get("remote"), dict) else {}
|
|
86
|
-
|
|
86
|
+
local_boards = (
|
|
87
|
+
snapshot.get("local_boards") if isinstance(snapshot.get("local_boards"), dict) else {}
|
|
88
|
+
)
|
|
87
89
|
local_processes = (
|
|
88
90
|
snapshot.get("local_processes") if isinstance(snapshot.get("local_processes"), dict) else {}
|
|
89
91
|
)
|
|
90
92
|
pull_requests = remote.get("pull_requests") if isinstance(remote.get("pull_requests"), list) else []
|
|
91
93
|
gate_health = remote.get("gate_health") if isinstance(remote.get("gate_health"), dict) else {}
|
|
92
94
|
gate_alerts = gate_health.get("alerts") if isinstance(gate_health.get("alerts"), list) else []
|
|
93
|
-
boards =
|
|
95
|
+
boards = local_boards.get("boards") if isinstance(local_boards.get("boards"), list) else []
|
|
94
96
|
processes = (
|
|
95
97
|
local_processes.get("processes")
|
|
96
98
|
if isinstance(local_processes.get("processes"), list)
|
|
@@ -71,7 +71,6 @@ from . import local_llm_calibration
|
|
|
71
71
|
from . import local_llm_profiles
|
|
72
72
|
from . import migration as code_mower_migration
|
|
73
73
|
from . import next_steps as code_mower_next_steps
|
|
74
|
-
from . import observe as code_mower_observe
|
|
75
74
|
from . import package as code_mower_package
|
|
76
75
|
from . import prompts as code_mower_prompts
|
|
77
76
|
from . import reviewer_metrics
|
|
@@ -456,7 +455,6 @@ COMMAND_DESCRIPTIONS: dict[str, str] = {
|
|
|
456
455
|
"migration": "Rehearse standalone package and wrapper migration paths.",
|
|
457
456
|
"merge-plan": "Inspect merge-readiness signals and lane labels.",
|
|
458
457
|
"next-steps": "Print the recommended next actions after setup.",
|
|
459
|
-
"observe": "Run legacy optional local observability companions.",
|
|
460
458
|
"package": "Build or inspect package extraction artifacts.",
|
|
461
459
|
"plan": "Create local issue-derived planning artifacts.",
|
|
462
460
|
"project-context": "Create editable local project-context doctrine docs.",
|
|
@@ -596,7 +594,6 @@ COMMAND_HANDLERS: dict[str, CommandHandler] = {
|
|
|
596
594
|
"migration": code_mower_migration.main,
|
|
597
595
|
"merge-plan": code_mower_merge.main,
|
|
598
596
|
"next-steps": code_mower_next_steps.main,
|
|
599
|
-
"observe": code_mower_observe.main,
|
|
600
597
|
"package": _package_main,
|
|
601
598
|
"plan": code_mower_work_orders.plan_main,
|
|
602
599
|
"project-context": code_mower_work_orders.project_context_main,
|
{code_mower-0.9.1b1 → code_mower-0.9.2b1}/src/code_mower/doctor_checks/github_human_token.py
RENAMED
|
@@ -173,11 +173,10 @@ def check_human_automation_token(
|
|
|
173
173
|
http_timeout=http_timeout,
|
|
174
174
|
)
|
|
175
175
|
if variable_payload is None:
|
|
176
|
-
status = _blocking_status_for_posture(adoption_posture)
|
|
177
176
|
return DoctorCheck(
|
|
178
177
|
name="github.human_automation_token",
|
|
179
|
-
status=
|
|
180
|
-
message=f"{slug} is missing the {expires_var} human token expiry
|
|
178
|
+
status=STATUS_WARN,
|
|
179
|
+
message=f"{slug} is missing the {expires_var} human token expiry metadata",
|
|
181
180
|
detail={
|
|
182
181
|
**detail,
|
|
183
182
|
"created_at": str(secret_payload.get("created_at") or ""),
|
|
@@ -219,10 +218,9 @@ def check_human_automation_token(
|
|
|
219
218
|
)
|
|
220
219
|
expiry = _parse_expiry(expiry_text)
|
|
221
220
|
if expiry is None:
|
|
222
|
-
status = _blocking_status_for_posture(adoption_posture)
|
|
223
221
|
return DoctorCheck(
|
|
224
222
|
name="github.human_automation_token",
|
|
225
|
-
status=
|
|
223
|
+
status=STATUS_WARN,
|
|
226
224
|
message=f"{slug} has an invalid {expires_var} value",
|
|
227
225
|
detail={**detail, "expires_at": expiry_text},
|
|
228
226
|
remediation=(
|
|
@@ -235,7 +233,7 @@ def check_human_automation_token(
|
|
|
235
233
|
days_remaining = (expiry - today).days
|
|
236
234
|
status = STATUS_PASS
|
|
237
235
|
if days_remaining < 0:
|
|
238
|
-
status =
|
|
236
|
+
status = STATUS_WARN
|
|
239
237
|
elif days_remaining <= EXPIRY_WARNING_DAYS:
|
|
240
238
|
status = STATUS_WARN
|
|
241
239
|
|
|
@@ -19,10 +19,12 @@ WORKFLOW_TERMS = ("code mower", "code-mower", "gate", "audit", "dispatch", "labe
|
|
|
19
19
|
CHECK_TERMS = ("code-mower", "gate", "package", "audit", "label", "dispatch", "gitar", "clear-stale")
|
|
20
20
|
GATE_RERUN_ACTIONS = {
|
|
21
21
|
"fix failing check",
|
|
22
|
+
"rerun stale gate",
|
|
22
23
|
"waiting for audits or owner input",
|
|
23
24
|
"waiting for checks",
|
|
24
25
|
"ready for merge or auto-merge",
|
|
25
26
|
}
|
|
27
|
+
PENDING_STATES = {"", "pending", "queued", "in_progress", "requested"}
|
|
26
28
|
PROCESS_PROVIDERS = {
|
|
27
29
|
"antigravity": "antigravity",
|
|
28
30
|
"claude": "claude",
|
|
@@ -31,10 +33,9 @@ PROCESS_PROVIDERS = {
|
|
|
31
33
|
"gemini": "gemini",
|
|
32
34
|
"gitar": "gitar",
|
|
33
35
|
}
|
|
34
|
-
AGENTTRAIL_DEFAULT_PORTS = {5330, 5331}
|
|
35
36
|
BOARD_DEFAULT_PORTS = set(range(5332, 5342))
|
|
36
|
-
LOCAL_BOARD_DEFAULT_PORTS =
|
|
37
|
-
LOCAL_BOARD_PROCESS_NAMES = {"code-mower", "
|
|
37
|
+
LOCAL_BOARD_DEFAULT_PORTS = BOARD_DEFAULT_PORTS
|
|
38
|
+
LOCAL_BOARD_PROCESS_NAMES = {"code-mower", "python", "python3"}
|
|
38
39
|
LOCAL_PATH_REDACTION = "[local path hidden]"
|
|
39
40
|
|
|
40
41
|
|
|
@@ -133,6 +134,38 @@ def _has_state(checks: Sequence[Mapping[str, str]], states: set[str]) -> bool:
|
|
|
133
134
|
return any(check.get("state", "") in states for check in checks)
|
|
134
135
|
|
|
135
136
|
|
|
137
|
+
def _audit_need_lanes(labels: Mapping[str, Sequence[str]]) -> tuple[str, ...]:
|
|
138
|
+
lanes = []
|
|
139
|
+
for label in labels.get("needs", ()):
|
|
140
|
+
if label.startswith("needs-") and label.endswith("-audit"):
|
|
141
|
+
lanes.append(label.removeprefix("needs-").removesuffix("-audit"))
|
|
142
|
+
return tuple(lanes)
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
def _has_pending_gate(checks: Sequence[Mapping[str, str]]) -> bool:
|
|
146
|
+
return any("gate" in check.get("name", "").lower() and check.get("state", "") in PENDING_STATES for check in checks)
|
|
147
|
+
|
|
148
|
+
|
|
149
|
+
def _stale_next_action_and_detail(
|
|
150
|
+
labels: Mapping[str, Sequence[str]],
|
|
151
|
+
checks: Sequence[Mapping[str, str]],
|
|
152
|
+
stale: bool,
|
|
153
|
+
next_action: str,
|
|
154
|
+
) -> tuple[str, str]:
|
|
155
|
+
if not stale or labels.get("blocked"):
|
|
156
|
+
return next_action, ""
|
|
157
|
+
audit_lanes = _audit_need_lanes(labels)
|
|
158
|
+
if audit_lanes:
|
|
159
|
+
lane_text = ", ".join(audit_lanes)
|
|
160
|
+
return (
|
|
161
|
+
"requeue stale audit",
|
|
162
|
+
f"stale audit request for {lane_text}; check the audit runner/dispatcher and requeue the lane",
|
|
163
|
+
)
|
|
164
|
+
if _has_pending_gate(checks):
|
|
165
|
+
return "rerun stale gate", "stale gate status; rerun the gate workflow for the current head"
|
|
166
|
+
return next_action, "stale pending evidence; inspect recent workflows and requeue the stuck lane"
|
|
167
|
+
|
|
168
|
+
|
|
136
169
|
def _next_action(
|
|
137
170
|
labels: Mapping[str, Sequence[str]],
|
|
138
171
|
checks: Sequence[Mapping[str, str]],
|
|
@@ -149,7 +182,7 @@ def _next_action(
|
|
|
149
182
|
return "rebase/behind"
|
|
150
183
|
if labels.get("needs"):
|
|
151
184
|
return "waiting for audits or owner input"
|
|
152
|
-
if _has_state(checks,
|
|
185
|
+
if _has_state(checks, PENDING_STATES):
|
|
153
186
|
return "waiting for checks"
|
|
154
187
|
if merge_state == "CLEAN" and labels.get("done"):
|
|
155
188
|
return "ready for merge or auto-merge"
|
|
@@ -172,7 +205,7 @@ def _stale(
|
|
|
172
205
|
labels: Mapping[str, Any],
|
|
173
206
|
checks: Sequence[Mapping[str, str]],
|
|
174
207
|
) -> bool:
|
|
175
|
-
if not (labels.get("needs") or _has_state(checks,
|
|
208
|
+
if not (labels.get("needs") or _has_state(checks, PENDING_STATES)):
|
|
176
209
|
return False
|
|
177
210
|
try:
|
|
178
211
|
updated = datetime.fromisoformat(updated_at.replace("Z", "+00:00"))
|
|
@@ -200,6 +233,8 @@ def _summarize_pr(
|
|
|
200
233
|
number = int(pr.get("number") or 0)
|
|
201
234
|
head_sha = _text(pr.get("headRefOid"))
|
|
202
235
|
next_action = _next_action(labels, checks, merge_state, is_draft)
|
|
236
|
+
stale = _stale(updated_at, now, stale_minutes, labels, checks)
|
|
237
|
+
next_action, next_detail = _stale_next_action_and_detail(labels, checks, stale, next_action)
|
|
203
238
|
return {
|
|
204
239
|
"number": number,
|
|
205
240
|
"title": _text(pr.get("title")),
|
|
@@ -212,8 +247,9 @@ def _summarize_pr(
|
|
|
212
247
|
"updated_at": updated_at,
|
|
213
248
|
"labels": labels,
|
|
214
249
|
"checks": checks,
|
|
215
|
-
"stale":
|
|
250
|
+
"stale": stale,
|
|
216
251
|
"next_action": next_action,
|
|
252
|
+
"next_detail": next_detail,
|
|
217
253
|
"gate_rerun_command": _gate_rerun_command(repo, number, head_sha),
|
|
218
254
|
}
|
|
219
255
|
|
|
@@ -365,7 +401,7 @@ def _process_command(pid: int, command_runner: CommandRunner) -> str:
|
|
|
365
401
|
return _stdout(command_runner, ["ps", "-p", str(pid), "-o", "command="]).strip()
|
|
366
402
|
|
|
367
403
|
|
|
368
|
-
def
|
|
404
|
+
def collect_local_boards(command_runner: CommandRunner = _run_command) -> dict[str, Any]:
|
|
369
405
|
listeners = _listener_inventory(command_runner)
|
|
370
406
|
if not listeners:
|
|
371
407
|
return {"available": False, "boards": [], "message": "local listener inventory unavailable"}
|
|
@@ -379,7 +415,7 @@ def collect_agenttrail_boards(command_runner: CommandRunner = _run_command) -> d
|
|
|
379
415
|
process_name = str(listener["process"]).lower()
|
|
380
416
|
board_like = any(
|
|
381
417
|
term in haystack
|
|
382
|
-
for term in ("
|
|
418
|
+
for term in ("code-mower board", "code_mower.board", "code_mower.cli board", "board serve")
|
|
383
419
|
)
|
|
384
420
|
runtime_like = process_name in LOCAL_BOARD_PROCESS_NAMES or process_name.startswith("python")
|
|
385
421
|
if board_like or (default_port and runtime_like):
|
|
@@ -426,7 +462,7 @@ def collect_lane_processes(command_runner: CommandRunner = _run_command) -> dict
|
|
|
426
462
|
|
|
427
463
|
|
|
428
464
|
def _redact_local_paths(report: dict[str, Any]) -> None:
|
|
429
|
-
for board in report["
|
|
465
|
+
for board in report["local_boards"].get("boards") or []:
|
|
430
466
|
if board.get("cwd"):
|
|
431
467
|
board["cwd"] = LOCAL_PATH_REDACTION
|
|
432
468
|
board["cwd_redacted"] = True
|
|
@@ -438,14 +474,23 @@ def _redact_local_paths(report: dict[str, Any]) -> None:
|
|
|
438
474
|
|
|
439
475
|
def _global_next(report: Mapping[str, Any]) -> str:
|
|
440
476
|
prs = report["remote"].get("pull_requests", [])
|
|
441
|
-
local_active = bool(report["
|
|
477
|
+
local_active = bool(report["local_boards"].get("boards")) or bool(report["local_processes"].get("processes"))
|
|
442
478
|
if not report["remote"].get("available"):
|
|
443
479
|
return (
|
|
444
480
|
"remote unavailable; inspect local lanes"
|
|
445
481
|
if local_active
|
|
446
482
|
else "remote unavailable; fix GitHub access"
|
|
447
483
|
)
|
|
448
|
-
for action in (
|
|
484
|
+
for action in (
|
|
485
|
+
"fix BLOCKED audit",
|
|
486
|
+
"fix failing check",
|
|
487
|
+
"rebase/behind",
|
|
488
|
+
"requeue stale audit",
|
|
489
|
+
"rerun stale gate",
|
|
490
|
+
"waiting for audits or owner input",
|
|
491
|
+
"waiting for checks",
|
|
492
|
+
"ready for merge or auto-merge",
|
|
493
|
+
):
|
|
449
494
|
if any(pr.get("next_action") == action for pr in prs):
|
|
450
495
|
return action
|
|
451
496
|
return "inspect PRs" if prs else ("local lanes visible; connect them to PR evidence" if local_active else "no active lanes")
|
|
@@ -468,7 +513,7 @@ def collect_status(
|
|
|
468
513
|
"repo": repo,
|
|
469
514
|
"generated_at": observed_at.isoformat().replace("+00:00", "Z"),
|
|
470
515
|
"remote": _remote(repo, gh_json_runner, observed_at, pr_limit, workflow_limit, stale_minutes),
|
|
471
|
-
"
|
|
516
|
+
"local_boards": collect_local_boards(command_runner),
|
|
472
517
|
"local_processes": collect_lane_processes(command_runner),
|
|
473
518
|
}
|
|
474
519
|
if not show_local_paths:
|
|
@@ -501,6 +546,8 @@ def render_text(report: Mapping[str, Any]) -> str:
|
|
|
501
546
|
lines.append(f" labels: {_label_text(pr['labels'])}")
|
|
502
547
|
lines.append(f" checks: {_check_text(pr['checks'])}")
|
|
503
548
|
lines.append(f" next: {pr['next_action']}")
|
|
549
|
+
if pr.get("next_detail"):
|
|
550
|
+
lines.append(f" detail: {pr['next_detail']}")
|
|
504
551
|
if pr.get("gate_rerun_command") and pr.get("next_action") in GATE_RERUN_ACTIONS:
|
|
505
552
|
lines.append(f" rerun gate: {pr['gate_rerun_command']}")
|
|
506
553
|
elif remote.get("available"):
|
|
@@ -528,8 +575,8 @@ def render_text(report: Mapping[str, Any]) -> str:
|
|
|
528
575
|
lines.append("Gate alerts: unavailable")
|
|
529
576
|
lines.extend(f"- {alert['message']}" for alert in alerts[:5])
|
|
530
577
|
lines.append("")
|
|
531
|
-
boards = report["
|
|
532
|
-
message = report["
|
|
578
|
+
boards = report["local_boards"].get("boards") or []
|
|
579
|
+
message = report["local_boards"].get("message") or "none visible"
|
|
533
580
|
lines.append("Local boards:" if boards else f"Local boards: none ({message})")
|
|
534
581
|
for board in boards:
|
|
535
582
|
cwd = f" cwd={board['cwd']}" if board.get("cwd") else ""
|
|
@@ -715,7 +715,7 @@ def main(argv: Sequence[str] | None = None) -> int:
|
|
|
715
715
|
"--allow-package-index",
|
|
716
716
|
action="store_true",
|
|
717
717
|
help=(
|
|
718
|
-
"allow bare package-index specs such as code-mower==0.9.
|
|
718
|
+
"allow bare package-index specs such as code-mower==0.9.2b1; "
|
|
719
719
|
"normal unit/CI rehearsals should use a local path instead"
|
|
720
720
|
),
|
|
721
721
|
)
|
|
@@ -244,7 +244,6 @@ PACKAGE_FILES = (
|
|
|
244
244
|
("src/code_mower/migration_readiness.py", "src/code_mower/migration_readiness.py", "core"),
|
|
245
245
|
("src/code_mower/migration_rehearsal.py", "src/code_mower/migration_rehearsal.py", "core"),
|
|
246
246
|
("tools/code_mower_next_steps.py", "src/code_mower/next_steps.py", "core"),
|
|
247
|
-
("src/code_mower/observe.py", "src/code_mower/observe.py", "core"),
|
|
248
247
|
("src/code_mower/lane_status.py", "src/code_mower/lane_status.py", "core"),
|
|
249
248
|
("tools/code_mower_package.py", "src/code_mower/package.py", "core"),
|
|
250
249
|
("tools/code_mower_package_content.py", "src/code_mower/package_content.py", "core"),
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: code-mower
|
|
3
|
-
Version: 0.9.
|
|
3
|
+
Version: 0.9.2b1
|
|
4
4
|
Summary: Multi-reviewer AI code audit orchestration
|
|
5
5
|
License-Expression: Apache-2.0
|
|
6
6
|
Requires-Python: >=3.12
|
|
@@ -169,12 +169,13 @@ after reinstalling, especially when switching between pipx and uv.
|
|
|
169
169
|
| C. Builder experiment | You want to compare authoring loops before trusting them broadly. | Use a work order or experiment spec, run `code-mower builder-experiment run` around an explicit command, then review the source-free `authoringRun` artifact and normal audit evidence. | [Builder Experiments](docs/builder-experiments.md) |
|
|
170
170
|
|
|
171
171
|
The current package-index announcement entry point is the tagged
|
|
172
|
-
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.9.
|
|
172
|
+
[Try Code Mower In 10 Minutes](https://github.com/codemower-ai/code-mower/blob/v0.9.2-beta.1/docs/try-in-10-minutes.md)
|
|
173
173
|
guide. The v0.9 beta includes the completed native Board work plus the adoption
|
|
174
|
-
and upgrade hardening from recent install rehearsals; v0.9.
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
174
|
+
and upgrade hardening from recent install rehearsals; v0.9.2 keeps the path
|
|
175
|
+
simple by removing the retired third-party observe bridge, softening
|
|
176
|
+
dispatch-token expiry metadata when the secret is present, and making
|
|
177
|
+
stale-audit waits name the runner/dispatcher requeue path. Package-only users
|
|
178
|
+
can start from the public package rather than a source checkout.
|
|
178
179
|
|
|
179
180
|
## What Calibration Does And Does Not Prove
|
|
180
181
|
|
|
@@ -205,7 +206,7 @@ Provider-contract baseline for the next release train:
|
|
|
205
206
|
|
|
206
207
|
For release verification,
|
|
207
208
|
[First-User Install Rehearsal](docs/first-user-install-rehearsal.md) records
|
|
208
|
-
the package-index procedure for `v0.9.
|
|
209
|
+
the package-index procedure for `v0.9.2-beta.1` / `code-mower==0.9.2b1`. The
|
|
209
210
|
GitHub release records the workflow and rehearsal evidence for the exact tag.
|
|
210
211
|
|
|
211
212
|
## Optional: Plan Before Coding
|
|
@@ -391,8 +392,8 @@ measurement work.
|
|
|
391
392
|
|
|
392
393
|
## Installation Status
|
|
393
394
|
|
|
394
|
-
The current package-index beta baseline is `v0.9.
|
|
395
|
-
install spec `code-mower==0.9.
|
|
395
|
+
The current package-index beta baseline is `v0.9.2-beta.1`, with pinned package
|
|
396
|
+
install spec `code-mower==0.9.2b1`. Release evidence is recorded on the GitHub
|
|
396
397
|
release and in the first-user install rehearsal. The public repository is
|
|
397
398
|
[codemower-ai/code-mower](https://github.com/codemower-ai/code-mower), and
|
|
398
399
|
GitHub releases remain the auditable source for tags, build artifacts, and
|
|
@@ -56,7 +56,6 @@ src/code_mower/migration_mirror.py
|
|
|
56
56
|
src/code_mower/migration_readiness.py
|
|
57
57
|
src/code_mower/migration_rehearsal.py
|
|
58
58
|
src/code_mower/next_steps.py
|
|
59
|
-
src/code_mower/observe.py
|
|
60
59
|
src/code_mower/package.py
|
|
61
60
|
src/code_mower/package_content.py
|
|
62
61
|
src/code_mower/package_manifest.py
|
|
@@ -331,7 +330,6 @@ tests/test_init_build_loop.py
|
|
|
331
330
|
tests/test_lane_status.py
|
|
332
331
|
tests/test_local_llm_github_helpers.py
|
|
333
332
|
tests/test_migration_setup_drift.py
|
|
334
|
-
tests/test_observe.py
|
|
335
333
|
tests/test_plan_context.py
|
|
336
334
|
tests/test_prompts.py
|
|
337
335
|
tests/test_provider_fixture_contracts.py
|
|
@@ -63,7 +63,7 @@ def _command_runner(args: list[str]) -> subprocess.CompletedProcess[str]:
|
|
|
63
63
|
if args[:4] == ["lsof", "-nP", "-iTCP", "-sTCP:LISTEN"]:
|
|
64
64
|
return _completed("p123\ncnode\nn127.0.0.1:5332\n")
|
|
65
65
|
if args == ["ps", "-p", "123", "-o", "command="]:
|
|
66
|
-
return _completed("
|
|
66
|
+
return _completed("code-mower board serve --repo owner/repo\n")
|
|
67
67
|
if args == ["lsof", "-a", "-p", "123", "-d", "cwd", "-Fn"]:
|
|
68
68
|
return _completed("p123\nn/tmp/lane-checkout\n")
|
|
69
69
|
if args == ["ps", "-axo", "pid=,command="]:
|
|
@@ -102,7 +102,7 @@ class BoardTests(TestCase):
|
|
|
102
102
|
self.assertIn("const localTime", html)
|
|
103
103
|
self.assertIn("Intl.DateTimeFormat(undefined", html)
|
|
104
104
|
self.assertIn('title="UTC ', html)
|
|
105
|
-
self.
|
|
105
|
+
self.assertIn("next_detail", html)
|
|
106
106
|
|
|
107
107
|
def test_render_board_html_escapes_script_terminators(self) -> None:
|
|
108
108
|
html = board.render_board_html(board.BoardConfig(repo="owner/repo</script><b>bad</b>"))
|
|
@@ -275,7 +275,19 @@ class GitHubDoctorCheckTests(unittest.TestCase):
|
|
|
275
275
|
self.assertIn("hosted-builder observer posture", check.message)
|
|
276
276
|
self.assertEqual(check.detail["adoption_posture"], "hosted-builders")
|
|
277
277
|
|
|
278
|
-
def
|
|
278
|
+
def test_human_automation_token_check_warns_when_expiry_metadata_missing(self) -> None:
|
|
279
|
+
check = self._human_token_check(
|
|
280
|
+
[
|
|
281
|
+
({"name": "DISPATCH_TOKEN"}, {}),
|
|
282
|
+
(None, {"returncode": 1, "output_summary": "not found"}),
|
|
283
|
+
]
|
|
284
|
+
)
|
|
285
|
+
|
|
286
|
+
self.assertEqual(check.status, "warn")
|
|
287
|
+
self.assertIn("missing the DISPATCH_TOKEN_EXPIRES_AT", check.message)
|
|
288
|
+
self.assertIn("--body never", str(check.remediation))
|
|
289
|
+
|
|
290
|
+
def test_human_automation_token_check_warns_when_expired(self) -> None:
|
|
279
291
|
check = self._human_token_check(
|
|
280
292
|
[
|
|
281
293
|
({"name": "DISPATCH_TOKEN"}, {}),
|
|
@@ -283,7 +295,7 @@ class GitHubDoctorCheckTests(unittest.TestCase):
|
|
|
283
295
|
]
|
|
284
296
|
)
|
|
285
297
|
|
|
286
|
-
self.assertEqual(check.status, "
|
|
298
|
+
self.assertEqual(check.status, "warn")
|
|
287
299
|
self.assertIn("expired", check.message)
|
|
288
300
|
|
|
289
301
|
def test_human_automation_token_check_warns_for_orchestrator_expired_secret(
|
|
@@ -300,7 +312,7 @@ class GitHubDoctorCheckTests(unittest.TestCase):
|
|
|
300
312
|
self.assertEqual(check.status, "warn")
|
|
301
313
|
self.assertIn("expired", check.message)
|
|
302
314
|
|
|
303
|
-
def
|
|
315
|
+
def test_human_automation_token_check_warns_on_timestamp_expiry(self) -> None:
|
|
304
316
|
check = self._human_token_check(
|
|
305
317
|
[
|
|
306
318
|
({"name": "DISPATCH_TOKEN"}, {}),
|
|
@@ -314,7 +326,7 @@ class GitHubDoctorCheckTests(unittest.TestCase):
|
|
|
314
326
|
]
|
|
315
327
|
)
|
|
316
328
|
|
|
317
|
-
self.assertEqual(check.status, "
|
|
329
|
+
self.assertEqual(check.status, "warn")
|
|
318
330
|
self.assertIn("invalid DISPATCH_TOKEN_EXPIRES_AT", check.message)
|
|
319
331
|
self.assertIn("`never`", str(check.remediation))
|
|
320
332
|
|