maintainability-agent 4.4.1__tar.gz → 4.4.2__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.
- {maintainability_agent-4.4.1/src/maintainability_agent.egg-info → maintainability_agent-4.4.2}/PKG-INFO +10 -5
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/README.md +9 -4
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2/src/maintainability_agent.egg-info}/PKG-INFO +10 -5
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_agent.egg-info/SOURCES.txt +4 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/__init__.py +1 -1
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_arguments.py +18 -0
- maintainability_agent-4.4.2/src/maintainability_audit/_self_update.py +126 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/cli.py +9 -0
- maintainability_agent-4.4.2/tests/test_ci_runs_once.py +98 -0
- maintainability_agent-4.4.2/tests/test_local_gate.py +187 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_operator_named_reads.py +3 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_platform_claim.py +58 -50
- maintainability_agent-4.4.2/tests/test_self_update.py +239 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_suite_isolation.py +65 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_workflow_supply_chain.py +29 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/LICENSE +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/pyproject.toml +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/setup.cfg +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_agent.egg-info/dependency_links.txt +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_agent.egg-info/entry_points.txt +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_agent.egg-info/requires.txt +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_agent.egg-info/top_level.txt +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/__main__.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_adapters.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_analysis.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_analyzer_sections.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_anchor.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_aspects.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_assets/analyzer-catalog.json +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_assets/standard.md +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_attestation.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_backfill.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_bands.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_banner.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_built_ins.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_calibration.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_catalog.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_changed_code_policy.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_charts.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_cognitive.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_config_defaults.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_conformance.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_corroborate.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_coverage_notes.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_criteria_scope.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_delegated_pillar.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_derive.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_discovery.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_documents.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_economics.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_economics_view.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_environment.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_evidence_reader.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_evidence_view.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_finding_match.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_first_run.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_formula.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_gates.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_generic.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_grammar.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_grant_ledger.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_handoff.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_history_view.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_hostile_prompt.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_hotspots.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_html_report_sections.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_html_view.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_identity.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_in_loop.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_in_loop_view.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_jvm_adapters.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_markdown_sections.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_masking.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_mcp_audit.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_mcp_gate.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_mcp_grants.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_mcp_refusals.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_mcp_resources.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_mcp_setup.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_metric_adapters.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_metrics_types.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_operator_reads.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_oracle.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_pillars.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_pipeline_results.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_practice.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_precommit.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_precommit_install.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_precommit_view.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_pressures.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_prompt_sections.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_c.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_cobol.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_core.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_cpp.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_csharp.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_fortran.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_go.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_java.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_js.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_kotlin.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_php.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_ruby.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_rust.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_shell.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_swift.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ratchet.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_ratio_adapters.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_recurrence.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_run_comparison.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_runner.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_running_version.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_safe_write.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_scan_history.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_scan_view.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_second_source.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_security_delegate.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_security_work_order.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_selection.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_semantic.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_semantic_policy.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_semantic_ts.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_semantic_view.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_setup_errors.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_setup_persist.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_skill_data/SKILL.md +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_skill_data/agents/anthropic.yaml +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_skill_data/agents/copilot.yaml +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_skill_data/agents/openai.yaml +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_skill_data/copilot/maintainability-agent.prompt.md +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_skill_data/references/finding-taxonomy.md +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_skill_install.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_stored_grants.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_tdd_view.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_test_commands.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_test_execution.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_test_pairing.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_tokens.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_tool_adapters.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_trends.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_user_config.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_verdict_adapters.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_verification.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_work_order.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_work_order_view.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_work_order_weights.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_xml.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/baseline.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/config.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/deadcode.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/declarations.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/duplication.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/evidence.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/git_tools.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/history.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/idioms.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/instructions.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/mcp_server.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/metrics.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/prompts.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/renderers.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/report.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/sarif.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/scoring.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/similarity.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/source.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_a_clone_names_every_copy.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_a_dangling_source_link_is_named_not_fatal.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_a_format_override_is_disclosed.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_a_matching_format_stays_silent.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_a_published_question_offers_what_it_accepts.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_a_rendered_docs_site_is_not_scored_as_source.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_a_setup_question_keeps_its_contract.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_acquisition_trust.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_adapter_docs.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_adapter_recordings.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_adapters.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_added_lines.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_an_absent_work_order_renders_nothing.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_an_unmeasured_pillar_reports_no_number.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analysis_coverage.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analysis_execution.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analyzer_bridge.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analyzer_config_isolation.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analyzer_estimate_claims.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analyzer_file_lists_are_batched.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analyzer_pinning.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analyzer_primary_estimate.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analyzer_provenance.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analyzer_provenance_exclusions.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analyzer_scoring_path.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analyzer_spread_range.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analyzer_xml_bounds.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analyzers_against_the_real_tools.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analyzers_never_write.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_analyzers_report_what_actually_failed.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_anchor_and_mode.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_anchor_caveat_and_counts_follow_the_run.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_anchor_disclosure.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_annotations_match_behaviour.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_anticipated_refusals.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_architecture.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_artifact_write_route_class.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_aspect_coverage.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_asset_snapshot_class.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_ast_reading_resolves_spellings.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_attestation.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_audit_components.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_authorization_freshness.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_authorship_gates.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_backfill.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_band_concealment_class.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_band_concealment_p3.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_band_pressures.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_bands.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_behaviour_suites_are_tests.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_body_or_signature_class.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_both_setup_paths_ask_the_same_stage.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_build_output_is_not_the_repositorys_code.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_c_declarations.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_calibration_corpus.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_calibration_drift.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_calibration_tooling.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_catalog_selection.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_catalog_tier_promise.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_changed_code_policy.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_chat_leads_with_the_work_order.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_chat_primary_docs.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_check_refuses_plus_only_fragments.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_checkstyle_adapter.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_checkstyle_catalog.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_child_sandbox.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_ci_history_recipe.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_ci_installs_the_analyzer_pool.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_claimed_languages.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_clean_sees_the_weakened_oracle.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_cli.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_clone_group_class.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_cobol_declarations.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_code_scanning_gets_alerts_not_the_record.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_cognitive_complexity.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_cohesion_with_nothing_to_read_is_not_applicable.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_cohort_statistics.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_concealment_properties.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_config_shape.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_conformance_reads_the_operators_ask.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_consent_and_grant.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_consent_is_per_repository.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_consent_survives_setup_and_is_asked.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_consent_without_command_has_a_remedy.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_consumer_migration.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_contract_claims.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_corpus_note_counts_come_from_the_corpus.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_corroborate.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_coverage_by_language.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_coverage_config_reaches_children.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_coverage_formats.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_cpp_declarations.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_criteria_completion.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_csharp_declarations.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_current_state_docs_name_every_parsed_language.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_d15_composition.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_d15_goal_directed.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_dead_code.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_declaration_criteria_scope.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_declaration_edge_cases.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_declaration_grading.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_declaration_ranges.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_declaration_source.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_declarative_parsers.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_declared_capabilities_match_the_delegate.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_declared_imports.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_delegated_security_pillar.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_demo_tree.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_derivation_mix.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_determinism.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_dimension_ratchet.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_direct_runner_availability_class.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_discovery.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_doc_claims.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_docs_links.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_economic_context.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_empty_output_not_clean.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_empty_output_not_clean_adapters.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_environment_work_order.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_every_built_presentation_is_offered.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_every_job_tests_the_pinned_oracle.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_every_language_counts_its_own_loop.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_every_language_has_a_loop_fixture.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_every_pool_install_is_the_same_pool.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_every_question_can_be_answered.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_every_surface_says_what_the_run_found.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_evidence_invariants.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_evidence_normalization.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_evidence_properties.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_example_config_opens_claimed_languages.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_exclude_additional_keeps_the_defaults.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_exclusion_dialects.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_exposure_never_outranks_band.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_falsifier_standard.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_file_list_cap_class.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_finding_identity.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_first_run_elicitation.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_first_run_prompt.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_first_run_reelicitation.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_first_stage_setup_wording_holds.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_fix_breadth_window.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_fixed_form_fortran.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_format_ask.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_fortran_declarations.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_fortran_metrics.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_fortran_practice.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_git_argv.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_git_read_only.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_git_readonly_class.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_go_declarations.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_grammar_constructs.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_grammar_token_coverage.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_grant_only_user_tier.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_grok_audit_of_3_11.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_history.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_history_boundary.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_history_manifest.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_history_schema2.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_history_window.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_hostile_prompt.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_html_executive.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_html_section_parity_class.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_identity_docs.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_identity_resolution.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_idiom_divergence.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_in_loop_budgets.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_in_loop_check.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_installed_wheel_runtime.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_instruction_targets.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_java_range_guard.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_java_ranges.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_java_scored.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_java_wiring.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_js_complexity_operators.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_js_declarations.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_kotlin_declarations.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_kotlin_metrics.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_language_coverage.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_language_support_honesty.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_list_tools_publishes_the_answer_path.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_maintenance_signals.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_mcp_baseline_payload.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_mcp_format_contract.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_mcp_history.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_mcp_server.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_mcp_start_failure_names_what_is_installed.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_migration_1_0.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_missing_security_scanners_are_named_before_the_run.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_mutation_recorded.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_near_duplicates.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_network_disclosure.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_no_private_names.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_one_setup_across_surfaces_class.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_operator_named_paths.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_oracle_weakening_precision_bar.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_pairing_reads_imports.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_pattern_budget.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_phase6_claims.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_php_declarations.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_pillars_and_practice.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_pipeline_results.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_pmd_adapter.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_pmd_audit_closures.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_policy_claims.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_pool_runs_by_config.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_population_floors.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_practice_nested_gates_class.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_precommit_staged.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_preflight_before_consent_runs_nothing_from_the_tree.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_presentation_refusals.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_previous_release_reached_pypi.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_promises.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_prompt_does_not_issue_rates_when_unscored.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_prompt_escalation_once.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_prompt_honesty.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_prompt_location_escalation_class.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_prove_falsifiers.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_python_complexity.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_python_declarations.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_read_boundary.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_readme_claims.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_recurrence.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_regular_file_reads_work_without_o_nonblock.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_release_needs_an_empty_ledger.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_release_plan.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_release_plan_status.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_rendered_docs.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_report_remedy_copy.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_reported_but_not_scored.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_root_grants.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_rubric_ignores_project_lint_config.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_ruby_declarations.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_run_comparison.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_runner.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_rust_declarations.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_sarif.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_scan_history.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_scan_scope.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_scanner_fingerprint_covers_the_measurement_path.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_scanner_unsafe_direction.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_scanning.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_schema_fidelity.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_scope_conformance.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_scoring_calibration.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_security_delegate_versions_agree.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_security_findings_keep_their_handoff.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_security_pillar_asserts_a_scanner_set.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_security_pillar_runs_and_shows.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_selection_covers_every_parsed_language.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_semantic_findings_stay_inside_the_audited_files.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_semantic_policy.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_setup_answers_are_the_same_setup.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_setup_gate_completeness.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_setup_gate_independent_contract.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_setup_instruction_describes_its_own_reply.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_setup_precondition.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_setup_writes_a_valid_config.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_shell_declarations.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_shell_metrics.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_skill_install.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_sonar_resolve.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_source_index.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_spotbugs_adapter.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_spotbugs_catalog.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_stage8_contract.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_stamped_documents_stay_honest.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_stdout_outputs.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_swift_declarations.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_tdd_structure.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_terminal_asks_the_same_questions.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_test_commands.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_test_execution_class.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_agent_knows_when_it_is_stale.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_changelog_covers_the_shipping_version.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_chat_payload_has_a_budget.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_condition_says_what_it_measured.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_handoff_rules_are_their_own_module.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_pillar_row_reads_cleanly.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_presentation_question_stays_answerable.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_previous_release_was_tagged.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_prompt_does_not_take_back_what_it_withheld.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_prompt_keeps_listing_what_it_did_not_withhold.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_release_process_describes_itself.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_release_record_stays_well_formed.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_report_is_saved_not_sent.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_security_run_has_a_configurable_limit.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_security_work_order_is_drawn.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_suite_names_the_program_it_ran.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_tree_cannot_redirect_a_read.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_the_version_has_one_source.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_three_presentations.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_tool_resolution.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_tree_cannot_opt_the_host_in.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_tree_chosen_spawn.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_tree_reads_use_the_primitive.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_trends.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_type_fields_not_functions_class.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_uat_falsifiers.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_unanchored_set_matches_corpus.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_unread_code.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_user_config_tier.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_verification_audit_closures.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_verified_grade.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_version_claim.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_version_stamping.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_wheel_contents.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_withheld_work_keeps_its_boundary.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_work_items_state_their_own_finding.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_work_order.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_work_order_binds_to_this_interpreter.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_work_order_items.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_work_order_selection.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_write_boundary.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_write_route_class.py +0 -0
- {maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_written_record.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: maintainability-agent
|
|
3
|
-
Version: 4.4.
|
|
3
|
+
Version: 4.4.2
|
|
4
4
|
Summary: Maintainability gate and AI remediation prompt generator for CI.
|
|
5
5
|
Author: Marshall Guillory
|
|
6
6
|
License: MIT
|
|
@@ -47,7 +47,7 @@ Dynamic: license-file
|
|
|
47
47
|
**A deterministic, offline maintainability audit whose output is a _bounded
|
|
48
48
|
work order_ for an AI coding agent** — a copy-paste prompt, per finding, that
|
|
49
49
|
says *fix exactly these and refactor nothing else*. Chat-primary; CLI for CI.
|
|
50
|
-
Version **4.4.
|
|
50
|
+
Version **4.4.2**.
|
|
51
51
|
|
|
52
52
|
> ## **Calibrated against 201 mature open-source repositories in fifteen languages.**
|
|
53
53
|
>
|
|
@@ -488,7 +488,8 @@ and is now the dominant failure in the probe, which is why the count moved. The
|
|
|
488
488
|
bounded, symlink-refusing write works through a *file descriptor*, so a validated
|
|
489
489
|
path cannot be swapped for a symlink before the write lands — Windows has no
|
|
490
490
|
equivalent and the portable rewrite is the hole. **An unsupported platform never
|
|
491
|
-
buys green by weakening the supported ones.**
|
|
491
|
+
buys green by weakening the supported ones.** Windows is not run in CI at all
|
|
492
|
+
(Decision 18); a Windows user who hits a problem can open an issue or a pull request.
|
|
492
493
|
|
|
493
494
|
## Invokable skill / slash command
|
|
494
495
|
|
|
@@ -501,7 +502,11 @@ Copilot Chat:
|
|
|
501
502
|
maintainability-agent --install-skill # writes ~/.claude/skills
|
|
502
503
|
```
|
|
503
504
|
|
|
504
|
-
|
|
505
|
+
`maintainability-agent --update` upgrades the install to the newest release —
|
|
506
|
+
never a downgrade — re-syncs the skill, and says when the MCP server needs a
|
|
507
|
+
restart; `maintainability-agent --install-updater` runs it hourly (macOS launch
|
|
508
|
+
agent). Run `--install-skill` by hand after any other upgrade — a drifted skill
|
|
509
|
+
teaches agents a dead workflow,
|
|
505
510
|
so a differing installed copy is refused with the list of differences. Per-host
|
|
506
511
|
install destinations, and `--init-agent-standards` for always-on guidance
|
|
507
512
|
instead of an invokable skill:
|
|
@@ -512,7 +517,7 @@ instead of an invokable skill:
|
|
|
512
517
|
This repo ships `action.yml`, usable as a composite action:
|
|
513
518
|
|
|
514
519
|
```yaml
|
|
515
|
-
- uses: marshallguillory86/maintainability-agent@v4.4.
|
|
520
|
+
- uses: marshallguillory86/maintainability-agent@v4.4.2
|
|
516
521
|
with:
|
|
517
522
|
config: maintainability-agent.json
|
|
518
523
|
changed-only: main...HEAD
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
**A deterministic, offline maintainability audit whose output is a _bounded
|
|
6
6
|
work order_ for an AI coding agent** — a copy-paste prompt, per finding, that
|
|
7
7
|
says *fix exactly these and refactor nothing else*. Chat-primary; CLI for CI.
|
|
8
|
-
Version **4.4.
|
|
8
|
+
Version **4.4.2**.
|
|
9
9
|
|
|
10
10
|
> ## **Calibrated against 201 mature open-source repositories in fifteen languages.**
|
|
11
11
|
>
|
|
@@ -446,7 +446,8 @@ and is now the dominant failure in the probe, which is why the count moved. The
|
|
|
446
446
|
bounded, symlink-refusing write works through a *file descriptor*, so a validated
|
|
447
447
|
path cannot be swapped for a symlink before the write lands — Windows has no
|
|
448
448
|
equivalent and the portable rewrite is the hole. **An unsupported platform never
|
|
449
|
-
buys green by weakening the supported ones.**
|
|
449
|
+
buys green by weakening the supported ones.** Windows is not run in CI at all
|
|
450
|
+
(Decision 18); a Windows user who hits a problem can open an issue or a pull request.
|
|
450
451
|
|
|
451
452
|
## Invokable skill / slash command
|
|
452
453
|
|
|
@@ -459,7 +460,11 @@ Copilot Chat:
|
|
|
459
460
|
maintainability-agent --install-skill # writes ~/.claude/skills
|
|
460
461
|
```
|
|
461
462
|
|
|
462
|
-
|
|
463
|
+
`maintainability-agent --update` upgrades the install to the newest release —
|
|
464
|
+
never a downgrade — re-syncs the skill, and says when the MCP server needs a
|
|
465
|
+
restart; `maintainability-agent --install-updater` runs it hourly (macOS launch
|
|
466
|
+
agent). Run `--install-skill` by hand after any other upgrade — a drifted skill
|
|
467
|
+
teaches agents a dead workflow,
|
|
463
468
|
so a differing installed copy is refused with the list of differences. Per-host
|
|
464
469
|
install destinations, and `--init-agent-standards` for always-on guidance
|
|
465
470
|
instead of an invokable skill:
|
|
@@ -470,7 +475,7 @@ instead of an invokable skill:
|
|
|
470
475
|
This repo ships `action.yml`, usable as a composite action:
|
|
471
476
|
|
|
472
477
|
```yaml
|
|
473
|
-
- uses: marshallguillory86/maintainability-agent@v4.4.
|
|
478
|
+
- uses: marshallguillory86/maintainability-agent@v4.4.2
|
|
474
479
|
with:
|
|
475
480
|
config: maintainability-agent.json
|
|
476
481
|
changed-only: main...HEAD
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: maintainability-agent
|
|
3
|
-
Version: 4.4.
|
|
3
|
+
Version: 4.4.2
|
|
4
4
|
Summary: Maintainability gate and AI remediation prompt generator for CI.
|
|
5
5
|
Author: Marshall Guillory
|
|
6
6
|
License: MIT
|
|
@@ -47,7 +47,7 @@ Dynamic: license-file
|
|
|
47
47
|
**A deterministic, offline maintainability audit whose output is a _bounded
|
|
48
48
|
work order_ for an AI coding agent** — a copy-paste prompt, per finding, that
|
|
49
49
|
says *fix exactly these and refactor nothing else*. Chat-primary; CLI for CI.
|
|
50
|
-
Version **4.4.
|
|
50
|
+
Version **4.4.2**.
|
|
51
51
|
|
|
52
52
|
> ## **Calibrated against 201 mature open-source repositories in fifteen languages.**
|
|
53
53
|
>
|
|
@@ -488,7 +488,8 @@ and is now the dominant failure in the probe, which is why the count moved. The
|
|
|
488
488
|
bounded, symlink-refusing write works through a *file descriptor*, so a validated
|
|
489
489
|
path cannot be swapped for a symlink before the write lands — Windows has no
|
|
490
490
|
equivalent and the portable rewrite is the hole. **An unsupported platform never
|
|
491
|
-
buys green by weakening the supported ones.**
|
|
491
|
+
buys green by weakening the supported ones.** Windows is not run in CI at all
|
|
492
|
+
(Decision 18); a Windows user who hits a problem can open an issue or a pull request.
|
|
492
493
|
|
|
493
494
|
## Invokable skill / slash command
|
|
494
495
|
|
|
@@ -501,7 +502,11 @@ Copilot Chat:
|
|
|
501
502
|
maintainability-agent --install-skill # writes ~/.claude/skills
|
|
502
503
|
```
|
|
503
504
|
|
|
504
|
-
|
|
505
|
+
`maintainability-agent --update` upgrades the install to the newest release —
|
|
506
|
+
never a downgrade — re-syncs the skill, and says when the MCP server needs a
|
|
507
|
+
restart; `maintainability-agent --install-updater` runs it hourly (macOS launch
|
|
508
|
+
agent). Run `--install-skill` by hand after any other upgrade — a drifted skill
|
|
509
|
+
teaches agents a dead workflow,
|
|
505
510
|
so a differing installed copy is refused with the list of differences. Per-host
|
|
506
511
|
install destinations, and `--init-agent-standards` for always-on guidance
|
|
507
512
|
instead of an invokable skill:
|
|
@@ -512,7 +517,7 @@ instead of an invokable skill:
|
|
|
512
517
|
This repo ships `action.yml`, usable as a composite action:
|
|
513
518
|
|
|
514
519
|
```yaml
|
|
515
|
-
- uses: marshallguillory86/maintainability-agent@v4.4.
|
|
520
|
+
- uses: marshallguillory86/maintainability-agent@v4.4.2
|
|
516
521
|
with:
|
|
517
522
|
config: maintainability-agent.json
|
|
518
523
|
changed-only: main...HEAD
|
|
@@ -104,6 +104,7 @@ src/maintainability_audit/_second_source.py
|
|
|
104
104
|
src/maintainability_audit/_security_delegate.py
|
|
105
105
|
src/maintainability_audit/_security_work_order.py
|
|
106
106
|
src/maintainability_audit/_selection.py
|
|
107
|
+
src/maintainability_audit/_self_update.py
|
|
107
108
|
src/maintainability_audit/_semantic.py
|
|
108
109
|
src/maintainability_audit/_semantic_policy.py
|
|
109
110
|
src/maintainability_audit/_semantic_ts.py
|
|
@@ -222,6 +223,7 @@ tests/test_checkstyle_catalog.py
|
|
|
222
223
|
tests/test_child_sandbox.py
|
|
223
224
|
tests/test_ci_history_recipe.py
|
|
224
225
|
tests/test_ci_installs_the_analyzer_pool.py
|
|
226
|
+
tests/test_ci_runs_once.py
|
|
225
227
|
tests/test_claimed_languages.py
|
|
226
228
|
tests/test_clean_sees_the_weakened_oracle.py
|
|
227
229
|
tests/test_cli.py
|
|
@@ -334,6 +336,7 @@ tests/test_kotlin_metrics.py
|
|
|
334
336
|
tests/test_language_coverage.py
|
|
335
337
|
tests/test_language_support_honesty.py
|
|
336
338
|
tests/test_list_tools_publishes_the_answer_path.py
|
|
339
|
+
tests/test_local_gate.py
|
|
337
340
|
tests/test_maintenance_signals.py
|
|
338
341
|
tests/test_mcp_baseline_payload.py
|
|
339
342
|
tests/test_mcp_format_contract.py
|
|
@@ -405,6 +408,7 @@ tests/test_security_findings_keep_their_handoff.py
|
|
|
405
408
|
tests/test_security_pillar_asserts_a_scanner_set.py
|
|
406
409
|
tests/test_security_pillar_runs_and_shows.py
|
|
407
410
|
tests/test_selection_covers_every_parsed_language.py
|
|
411
|
+
tests/test_self_update.py
|
|
408
412
|
tests/test_semantic_findings_stay_inside_the_audited_files.py
|
|
409
413
|
tests/test_semantic_policy.py
|
|
410
414
|
tests/test_setup_answers_are_the_same_setup.py
|
{maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/_arguments.py
RENAMED
|
@@ -212,6 +212,24 @@ def _add_setup_actions(parser: argparse.ArgumentParser) -> None:
|
|
|
212
212
|
"own without asking, because that is an upgrade. Honours "
|
|
213
213
|
"core.hooksPath.",
|
|
214
214
|
)
|
|
215
|
+
parser.add_argument(
|
|
216
|
+
"--update", action="store_true",
|
|
217
|
+
help="Upgrade this install to the newest release (never a downgrade), "
|
|
218
|
+
"re-sync the skill, and say when the MCP server needs a restart.",
|
|
219
|
+
)
|
|
220
|
+
parser.add_argument(
|
|
221
|
+
"--install-updater", action="store_true",
|
|
222
|
+
help="Write the hourly launch agent that runs --update (macOS), "
|
|
223
|
+
"replacing the legacy one.",
|
|
224
|
+
)
|
|
225
|
+
parser.add_argument(
|
|
226
|
+
"--home", default=None, metavar="DIR",
|
|
227
|
+
help="With --install-updater: the home directory to write into (default: ~).",
|
|
228
|
+
)
|
|
229
|
+
parser.add_argument(
|
|
230
|
+
"--no-launchctl", action="store_true",
|
|
231
|
+
help="With --install-updater: write the agent without loading it.",
|
|
232
|
+
)
|
|
215
233
|
parser.add_argument(
|
|
216
234
|
"--skills-dir", default=None, metavar="DIR",
|
|
217
235
|
help="Where --install-skill writes (default: ~/.claude/skills).",
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
"""Keep the local install current: ``--update`` and ``--install-updater``.
|
|
2
|
+
|
|
3
|
+
The updater used to be an untracked script beside the venv, run by a launch
|
|
4
|
+
agent. It trusted PyPI's ``info.version``, which lags a release, and on
|
|
5
|
+
2026-09-22 it *downgraded* 3.7.29 to 3.7.19; it never re-synced the skill the
|
|
6
|
+
README says to sync after every upgrade; and nothing tested it (D230).
|
|
7
|
+
|
|
8
|
+
Now it is a product command. The installer resolves the version — ``pip
|
|
9
|
+
install --upgrade`` picks the highest release the index lists and never moves
|
|
10
|
+
backwards — so this module holds no HTTP client and reads no release feed
|
|
11
|
+
(P1: analysis touches no network; updating is an operator action, like tool
|
|
12
|
+
acquisition). Every child process goes through ``_runner.run`` (rule 7). A
|
|
13
|
+
version that comes back lower than before is reported, never accepted
|
|
14
|
+
silently; a higher one re-syncs the skill and records that the MCP server,
|
|
15
|
+
which holds the code it loaded at spawn, needs a restart.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
from __future__ import annotations
|
|
19
|
+
|
|
20
|
+
import plistlib
|
|
21
|
+
import re
|
|
22
|
+
import sys
|
|
23
|
+
from dataclasses import dataclass
|
|
24
|
+
from pathlib import Path
|
|
25
|
+
|
|
26
|
+
from . import _runner
|
|
27
|
+
|
|
28
|
+
PACKAGE = "maintainability-agent"
|
|
29
|
+
#: The launch agent, named for the product and the component (reverse DNS of
|
|
30
|
+
#: the project's home), replacing the personal-prefix label it had before.
|
|
31
|
+
LABEL = "io.github.marshallguillory86.maintainability-agent.update"
|
|
32
|
+
LEGACY_LABEL = "com.marshallguillory.maintainability-agent-update"
|
|
33
|
+
_VERSION_CODE = f"import importlib.metadata as m; print(m.version({PACKAGE!r}))"
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
@dataclass(frozen=True)
|
|
37
|
+
class UpdateResult:
|
|
38
|
+
before: str
|
|
39
|
+
after: str
|
|
40
|
+
skill_synced: bool
|
|
41
|
+
restart_needed: bool
|
|
42
|
+
error: str | None
|
|
43
|
+
message: str
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _key(version: str) -> tuple:
|
|
47
|
+
"""Release ordering for plain ``N.N.N`` versions; a suffix sorts before
|
|
48
|
+
the release it precedes (``4.4.1rc1`` < ``4.4.1``)."""
|
|
49
|
+
parts = []
|
|
50
|
+
for piece in version.strip().split("."):
|
|
51
|
+
number = re.match(r"\d+", piece)
|
|
52
|
+
parts.append((int(number.group()) if number else 0, 1 if number and number.end() == len(piece) else 0))
|
|
53
|
+
return tuple(parts)
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
def _state_dir(home: Path) -> Path:
|
|
57
|
+
return home / ".local" / "share" / "maintainability-agent"
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def _run(argv: list[str]) -> _runner.ToolResult:
|
|
61
|
+
return _runner.run("self-update", _runner.Invocation(argv=tuple(argv)), timeout_seconds=600)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def _installed(python: str) -> str:
|
|
65
|
+
return (_run([python, "-c", _VERSION_CODE]).stdout or "").strip()
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
def update(python: str, uv: str | None, home: Path) -> UpdateResult:
|
|
69
|
+
before = _installed(python)
|
|
70
|
+
if uv:
|
|
71
|
+
argv = [uv, "pip", "install", "--python", python, "--upgrade", PACKAGE]
|
|
72
|
+
else:
|
|
73
|
+
argv = [python, "-m", "pip", "install", "--upgrade", PACKAGE]
|
|
74
|
+
installed = _run(argv)
|
|
75
|
+
after = _installed(python)
|
|
76
|
+
if not installed.usable:
|
|
77
|
+
return UpdateResult(before, after, False, False, f"install failed: {installed.detail}",
|
|
78
|
+
f"Update failed; still on {before}.")
|
|
79
|
+
if _key(after) < _key(before):
|
|
80
|
+
return UpdateResult(before, after, False, False,
|
|
81
|
+
f"version went down from {before} to {after}",
|
|
82
|
+
f"Refused: the install moved {before} to {after}, a downgrade.")
|
|
83
|
+
if _key(after) == _key(before):
|
|
84
|
+
return UpdateResult(before, after, False, False, None, f"Already up to date ({after}).")
|
|
85
|
+
_run([python, "-m", "maintainability_audit", "--install-skill"])
|
|
86
|
+
state = _state_dir(home)
|
|
87
|
+
state.mkdir(parents=True, exist_ok=True)
|
|
88
|
+
(state / ".pending-restart").write_text(after + "\n", encoding="utf-8")
|
|
89
|
+
return UpdateResult(before, after, True, True, None,
|
|
90
|
+
f"Updated {before} -> {after}; skill re-synced. "
|
|
91
|
+
"Restart the MCP server to use it (/mcp in Claude Code).")
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def update_action() -> int:
|
|
95
|
+
result = update(sys.executable, _runner.locate("uv"), Path.home())
|
|
96
|
+
print(result.message, file=sys.stderr if result.error else sys.stdout)
|
|
97
|
+
return 1 if result.error else 0
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def install_updater(home: Path, *, launchctl: bool = True) -> int:
|
|
101
|
+
"""Write the hourly launch agent that runs ``--update``; remove the
|
|
102
|
+
legacy one so two updaters never run."""
|
|
103
|
+
agents = home / "Library" / "LaunchAgents"
|
|
104
|
+
agents.mkdir(parents=True, exist_ok=True)
|
|
105
|
+
legacy = agents / f"{LEGACY_LABEL}.plist"
|
|
106
|
+
if legacy.exists():
|
|
107
|
+
if launchctl:
|
|
108
|
+
_run(["launchctl", "unload", str(legacy)])
|
|
109
|
+
legacy.unlink()
|
|
110
|
+
state = _state_dir(home)
|
|
111
|
+
state.mkdir(parents=True, exist_ok=True)
|
|
112
|
+
plist = agents / f"{LABEL}.plist"
|
|
113
|
+
plist.write_bytes(plistlib.dumps({
|
|
114
|
+
"Label": LABEL,
|
|
115
|
+
"ProgramArguments": [sys.executable, "-m", "maintainability_audit", "--update"],
|
|
116
|
+
"StartInterval": 3600,
|
|
117
|
+
"RunAtLoad": True,
|
|
118
|
+
"ProcessType": "Background",
|
|
119
|
+
"LowPriorityIO": True,
|
|
120
|
+
"StandardOutPath": str(state / "update.out.log"),
|
|
121
|
+
"StandardErrorPath": str(state / "update.err.log"),
|
|
122
|
+
}))
|
|
123
|
+
if launchctl:
|
|
124
|
+
_run(["launchctl", "load", str(plist)])
|
|
125
|
+
print(f"installed {plist}")
|
|
126
|
+
return 0
|
{maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/src/maintainability_audit/cli.py
RENAMED
|
@@ -393,6 +393,15 @@ def _action_before_config(
|
|
|
393
393
|
"""
|
|
394
394
|
if args.install_skill:
|
|
395
395
|
return _install_skill_action(args)
|
|
396
|
+
if args.update:
|
|
397
|
+
from ._self_update import update_action
|
|
398
|
+
|
|
399
|
+
return update_action()
|
|
400
|
+
if args.install_updater:
|
|
401
|
+
from ._self_update import install_updater
|
|
402
|
+
|
|
403
|
+
home = Path(args.home).expanduser() if args.home else Path.home()
|
|
404
|
+
return install_updater(home, launchctl=not args.no_launchctl)
|
|
396
405
|
if args.install_precommit_hook:
|
|
397
406
|
from ._precommit_install import install_precommit_hook
|
|
398
407
|
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"""Written by the Claude Sonnet test seat (Codex at its usage limit); Codex reviews.
|
|
2
|
+
|
|
3
|
+
His words: 'The CI is ridiculously unacceptable'. The evidence: Quality Gates
|
|
4
|
+
ran twice per PR (push on every branch plus pull_request), MA audited itself
|
|
5
|
+
twice (maintainability.yml plus the Quality Gates audit job), a Windows probe
|
|
6
|
+
failed every run while blocking nothing, and Sonar ran on every PR.
|
|
7
|
+
|
|
8
|
+
The required checks must still run on every pull_request, or merges deadlock;
|
|
9
|
+
that guard lives in test_workflow_supply_chain.py.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import re
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
|
|
17
|
+
from _workflow_text import jobs, triggers
|
|
18
|
+
|
|
19
|
+
WORKFLOWS = Path(__file__).resolve().parents[1] / ".github" / "workflows"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def test_quality_gates_push_is_limited_to_main_so_a_pr_runs_once() -> None:
|
|
23
|
+
"""No push trigger at all (his pipeline lint: a merge never re-runs
|
|
24
|
+
tests), or one limited to main."""
|
|
25
|
+
push = triggers("quality-gates.yml").get("push")
|
|
26
|
+
if push is None:
|
|
27
|
+
return
|
|
28
|
+
body = " ".join(s.strip() for s in push)
|
|
29
|
+
assert re.search(r"branches:\s*\[\s*main\s*\]", body) or (
|
|
30
|
+
"branches:" in body and re.search(r"-\s*main\b", body)
|
|
31
|
+
), f"push must be absent or restricted to branches: [main]; got {body!r}"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
def test_maintainability_workflow_does_not_audit_every_pull_request_again() -> None:
|
|
35
|
+
assert "pull_request" not in triggers("maintainability.yml")
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def test_no_windows_job_runs_at_all() -> None:
|
|
39
|
+
"""Decision 18 (his words: "just turn this shit off"): Windows is not
|
|
40
|
+
tested in CI; Windows users report problems as issues or PRs."""
|
|
41
|
+
assert "probe-windows" not in jobs("quality-gates.yml")
|
|
42
|
+
for path in WORKFLOWS.glob("*.yml"):
|
|
43
|
+
assert "windows-" not in path.read_text(encoding="utf-8"), path.name
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def test_sonar_does_not_run_on_pull_requests() -> None:
|
|
47
|
+
condition = jobs("quality-gates.yml")["sonar"]["if"]
|
|
48
|
+
assert condition, "sonar needs an `if:`"
|
|
49
|
+
assert "pull_request" not in condition
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def _runs_on_pull_request(condition: str) -> bool:
|
|
53
|
+
"""True when an `if:` leaves the job running on pull_request."""
|
|
54
|
+
if not condition:
|
|
55
|
+
return True
|
|
56
|
+
if "!= 'pull_request'" in condition:
|
|
57
|
+
return False
|
|
58
|
+
return "pull_request" in condition or "!= 'push'" in condition
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
def _job_bodies(workflow: str) -> dict[str, str]:
|
|
62
|
+
"""Job id -> the job's raw text, so a test can read `runs-on` and steps."""
|
|
63
|
+
from _workflow_text import _code_lines, _sub_blocks, _top_block
|
|
64
|
+
|
|
65
|
+
blocks = _sub_blocks(_top_block(_code_lines(workflow), "jobs"), 2)
|
|
66
|
+
return {job_id: "\n".join(body) for job_id, body in blocks.items()}
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def test_no_macos_job_runs_in_ci() -> None:
|
|
70
|
+
"""His decision (2026-10-15, option 1): each test runs once, on Linux
|
|
71
|
+
`verify`. macOS is covered by the local gate on his Mac."""
|
|
72
|
+
assert "verify-macos" not in jobs("quality-gates.yml")
|
|
73
|
+
for path in WORKFLOWS.glob("*.yml"):
|
|
74
|
+
for job_id, job in jobs(path.name).items():
|
|
75
|
+
assert "macos" not in job["name"].lower(), f"{path.name}:{job_id} name"
|
|
76
|
+
for job_id, body in _job_bodies(path.name).items():
|
|
77
|
+
runs_on = re.findall(r"^\s*runs-on:\s*(.*)$", body, flags=re.M)
|
|
78
|
+
assert not any("macos" in value.lower() for value in runs_on), (
|
|
79
|
+
f"{path.name}:{job_id} runs on macOS"
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
def test_verify_does_not_run_on_a_merge_to_main() -> None:
|
|
84
|
+
"""Tests run once, on the pull request; a push to main does not rerun them."""
|
|
85
|
+
condition = jobs("quality-gates.yml")["verify"]["if"]
|
|
86
|
+
assert condition, "verify needs an `if:` that excludes push"
|
|
87
|
+
assert "github.event_name != 'push'" in condition, condition
|
|
88
|
+
|
|
89
|
+
|
|
90
|
+
def test_exactly_one_job_runs_the_test_suite_on_pull_requests() -> None:
|
|
91
|
+
bodies = _job_bodies("quality-gates.yml")
|
|
92
|
+
conditions = jobs("quality-gates.yml")
|
|
93
|
+
runners = [
|
|
94
|
+
job_id
|
|
95
|
+
for job_id, body in bodies.items()
|
|
96
|
+
if "pytest" in body and _runs_on_pull_request(conditions[job_id]["if"])
|
|
97
|
+
]
|
|
98
|
+
assert runners == ["verify"], f"jobs running pytest on pull_request: {runners}"
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
# Written by the Claude Sonnet test seat (Codex at its usage limit); Codex reviews.
|
|
2
|
+
# His decision 2026-10-15: macOS is verified by an enforced local gate, not a CI runner.
|
|
3
|
+
"""The enforced local gate that is the macOS evidence.
|
|
4
|
+
|
|
5
|
+
`verify-macos` was removed from CI so each test runs once, on Linux. The
|
|
6
|
+
claim that macOS works now rests on a git pre-push hook that runs the
|
|
7
|
+
full suite on the maintainer's Mac. These tests pin the gate script, the
|
|
8
|
+
installer, and the contributor docs that point at them.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import os
|
|
14
|
+
import re
|
|
15
|
+
import shutil
|
|
16
|
+
import subprocess
|
|
17
|
+
from pathlib import Path
|
|
18
|
+
|
|
19
|
+
ROOT = Path(__file__).resolve().parents[1]
|
|
20
|
+
GATE = ROOT / "tools" / "local-gate.sh"
|
|
21
|
+
INSTALLER = ROOT / "tools" / "install-local-gate.sh"
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def _logical_lines(path: Path) -> list[str]:
|
|
25
|
+
"""Script lines with backslash continuations joined, comments dropped."""
|
|
26
|
+
text = path.read_text(encoding="utf-8").replace("\\\n", " ")
|
|
27
|
+
return [
|
|
28
|
+
" ".join(line.split()) for line in text.splitlines()
|
|
29
|
+
if line.strip() and not line.lstrip().startswith("#")
|
|
30
|
+
]
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def _git(cwd: Path, *args: str) -> subprocess.CompletedProcess[str]:
|
|
34
|
+
return subprocess.run(
|
|
35
|
+
["git", *args], cwd=cwd, capture_output=True, text=True, check=False)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
def _temp_repo(tmp_path: Path) -> Path:
|
|
39
|
+
repo = tmp_path / "repo"
|
|
40
|
+
(repo / "tools").mkdir(parents=True)
|
|
41
|
+
assert _git(repo, "init", "-q").returncode == 0
|
|
42
|
+
for script in (GATE, INSTALLER):
|
|
43
|
+
target = repo / "tools" / script.name
|
|
44
|
+
shutil.copy(script, target)
|
|
45
|
+
target.chmod(0o755)
|
|
46
|
+
return repo
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _install(repo: Path) -> subprocess.CompletedProcess[str]:
|
|
50
|
+
return subprocess.run(
|
|
51
|
+
["bash", str(repo / "tools" / "install-local-gate.sh")],
|
|
52
|
+
cwd=repo, capture_output=True, text=True, check=False)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
# -- 1. the gate script ---------------------------------------------------
|
|
56
|
+
|
|
57
|
+
def test_the_gate_script_exists_and_is_executable() -> None:
|
|
58
|
+
assert GATE.is_file(), "tools/local-gate.sh does not exist"
|
|
59
|
+
assert os.access(GATE, os.X_OK), "tools/local-gate.sh is not executable"
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def test_the_gate_fails_fast() -> None:
|
|
63
|
+
lines = _logical_lines(GATE)
|
|
64
|
+
assert "set -euo pipefail" in lines
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
def test_the_gate_runs_from_the_repository_root() -> None:
|
|
68
|
+
text = GATE.read_text(encoding="utf-8")
|
|
69
|
+
assert re.search(r"^\s*cd\s.*\.\.", text, re.MULTILINE), (
|
|
70
|
+
"the gate must cd to the directory above its own location")
|
|
71
|
+
assert "BASH_SOURCE" in text or "$0" in text
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
def test_the_gate_lints_then_runs_the_whole_suite_with_coverage_floor() -> None:
|
|
75
|
+
lines = _logical_lines(GATE)
|
|
76
|
+
lint = [i for i, line in enumerate(lines) if line == "python3 -m ruff check src tests tools"]
|
|
77
|
+
suite = [i for i, line in enumerate(lines)
|
|
78
|
+
if re.search(r"python3 -m pytest\b", line)]
|
|
79
|
+
assert lint, f"no `python3 -m ruff check src tests tools` line: {lines}"
|
|
80
|
+
assert suite, f"no `python3 -m pytest` line: {lines}"
|
|
81
|
+
assert lint[0] < suite[0], "lint must run before the suite"
|
|
82
|
+
command = lines[suite[0]]
|
|
83
|
+
assert re.search(r"-n auto\b", command)
|
|
84
|
+
# Measure this tree by path. An installed copy of the package elsewhere on
|
|
85
|
+
# the machine (pip install --user) must never be measured: a package-name
|
|
86
|
+
# source counts both copies and reports a false low percentage.
|
|
87
|
+
tokens = command.split()
|
|
88
|
+
assert "--cov=src/maintainability_audit" in tokens
|
|
89
|
+
assert "--cov=maintainability_audit" not in tokens, (
|
|
90
|
+
"the gate must measure src/maintainability_audit by path, not by package name")
|
|
91
|
+
assert "--cov-fail-under=92" in command
|
|
92
|
+
assert not re.search(r"tests/\S+\.py", command), (
|
|
93
|
+
"the gate must run the whole suite, not named files")
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
# -- 2. the installer -----------------------------------------------------
|
|
97
|
+
|
|
98
|
+
def test_the_installer_exists_and_is_executable() -> None:
|
|
99
|
+
assert INSTALLER.is_file(), "tools/install-local-gate.sh does not exist"
|
|
100
|
+
assert os.access(INSTALLER, os.X_OK)
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
def test_the_installer_resolves_the_hooks_dir_through_git() -> None:
|
|
104
|
+
"""`--git-common-dir`/hooks is the repository's own hooks folder in every
|
|
105
|
+
worktree. `--git-path hooks` follows a global core.hooksPath to a shared
|
|
106
|
+
dispatcher, which the installer must never write into; that dispatcher
|
|
107
|
+
runs `$(git rev-parse --git-common-dir)/hooks/<name>` itself."""
|
|
108
|
+
text = INSTALLER.read_text(encoding="utf-8")
|
|
109
|
+
assert "git rev-parse --git-common-dir" in text
|
|
110
|
+
assert "--git-path hooks" not in text
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
def test_the_installer_writes_an_executable_pre_push_hook(tmp_path: Path) -> None:
|
|
114
|
+
repo = _temp_repo(tmp_path)
|
|
115
|
+
result = _install(repo)
|
|
116
|
+
assert result.returncode == 0, result.stderr
|
|
117
|
+
hook = repo / ".git" / "hooks" / "pre-push"
|
|
118
|
+
assert hook.is_file()
|
|
119
|
+
assert os.access(hook, os.X_OK)
|
|
120
|
+
assert "tools/local-gate.sh" in hook.read_text(encoding="utf-8")
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
def test_the_installer_is_idempotent(tmp_path: Path) -> None:
|
|
124
|
+
repo = _temp_repo(tmp_path)
|
|
125
|
+
assert _install(repo).returncode == 0
|
|
126
|
+
hook = repo / ".git" / "hooks" / "pre-push"
|
|
127
|
+
first = hook.read_bytes()
|
|
128
|
+
again = _install(repo)
|
|
129
|
+
assert again.returncode == 0, again.stderr
|
|
130
|
+
assert hook.read_bytes() == first
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
def test_the_installer_will_not_overwrite_a_foreign_hook(tmp_path: Path) -> None:
|
|
134
|
+
repo = _temp_repo(tmp_path)
|
|
135
|
+
hooks = repo / ".git" / "hooks"
|
|
136
|
+
hooks.mkdir(exist_ok=True)
|
|
137
|
+
hook = hooks / "pre-push"
|
|
138
|
+
hook.write_text("#!/bin/sh\necho mine\n", encoding="utf-8")
|
|
139
|
+
hook.chmod(0o755)
|
|
140
|
+
before = hook.read_bytes()
|
|
141
|
+
result = _install(repo)
|
|
142
|
+
assert result.returncode != 0
|
|
143
|
+
assert hook.read_bytes() == before
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def test_the_installed_hook_blocks_a_push_when_the_gate_fails(tmp_path: Path) -> None:
|
|
147
|
+
repo = _temp_repo(tmp_path)
|
|
148
|
+
assert _install(repo).returncode == 0
|
|
149
|
+
# Replace the copied gate with one that fails: the hook must propagate.
|
|
150
|
+
gate = repo / "tools" / "local-gate.sh"
|
|
151
|
+
gate.write_text("#!/usr/bin/env bash\nexit 7\n", encoding="utf-8")
|
|
152
|
+
gate.chmod(0o755)
|
|
153
|
+
hook = repo / ".git" / "hooks" / "pre-push"
|
|
154
|
+
result = subprocess.run(
|
|
155
|
+
[str(hook), "origin", "file:///nowhere"], cwd=repo, input="",
|
|
156
|
+
capture_output=True, text=True, check=False)
|
|
157
|
+
assert result.returncode != 0
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
def test_the_installed_hook_passes_when_the_gate_passes(tmp_path: Path) -> None:
|
|
161
|
+
repo = _temp_repo(tmp_path)
|
|
162
|
+
assert _install(repo).returncode == 0
|
|
163
|
+
gate = repo / "tools" / "local-gate.sh"
|
|
164
|
+
gate.write_text("#!/usr/bin/env bash\nexit 0\n", encoding="utf-8")
|
|
165
|
+
gate.chmod(0o755)
|
|
166
|
+
hook = repo / ".git" / "hooks" / "pre-push"
|
|
167
|
+
result = subprocess.run(
|
|
168
|
+
[str(hook), "origin", "file:///nowhere"], cwd=repo, input="",
|
|
169
|
+
capture_output=True, text=True, check=False)
|
|
170
|
+
assert result.returncode == 0, result.stderr
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
# -- 3. the contributor docs ---------------------------------------------
|
|
174
|
+
|
|
175
|
+
def test_contributing_tells_contributors_to_install_the_gate() -> None:
|
|
176
|
+
text = (ROOT / "CONTRIBUTING.md").read_text(encoding="utf-8")
|
|
177
|
+
assert "tools/install-local-gate.sh" in text
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
def test_contributing_says_the_pre_push_gate_verifies_macos() -> None:
|
|
181
|
+
text = (ROOT / "CONTRIBUTING.md").read_text(encoding="utf-8").lower()
|
|
182
|
+
assert "pre-push" in text
|
|
183
|
+
assert "macos" in text
|
|
184
|
+
assert any(
|
|
185
|
+
"pre-push" in para.lower() and "macos" in para.lower()
|
|
186
|
+
for para in text.split("\n\n")
|
|
187
|
+
), "the pre-push gate and macOS must be stated together"
|
{maintainability_agent-4.4.1 → maintainability_agent-4.4.2}/tests/test_operator_named_reads.py
RENAMED
|
@@ -146,6 +146,8 @@ WRITES_A_FILE = {
|
|
|
146
146
|
"--comment-output", "--prompt-output", "--attestation-output",
|
|
147
147
|
"--agent-instructions-output", "--hostile-prompt-output",
|
|
148
148
|
"--instructions-output-dir", "--skills-dir", "--target-path",
|
|
149
|
+
# The home --install-updater writes its launch agent into (D230).
|
|
150
|
+
"--home",
|
|
149
151
|
}
|
|
150
152
|
NOT_AN_OPERATOR_PATH = {
|
|
151
153
|
# A revspec, not a file.
|
|
@@ -160,6 +162,7 @@ NOT_AN_OPERATOR_PATH = {
|
|
|
160
162
|
"--fail-on-gate", "--fail-on-new", "--fail-on-out-of-scope",
|
|
161
163
|
"--fail-on-regression", "--force-skill", "--format", "--help",
|
|
162
164
|
"--init-agent-standards", "--install-precommit-hook", "--install-skill",
|
|
165
|
+
"--update", "--install-updater", "--no-launchctl",
|
|
163
166
|
"--record-history", "--staged", "--target", "--transformation",
|
|
164
167
|
"--version", "--work",
|
|
165
168
|
}
|