maintainability-agent 4.4.0__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.0/src/maintainability_agent.egg-info → maintainability_agent-4.4.2}/PKG-INFO +11 -6
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/README.md +9 -4
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/pyproject.toml +4 -1
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2/src/maintainability_agent.egg-info}/PKG-INFO +11 -6
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_agent.egg-info/SOURCES.txt +5 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_agent.egg-info/requires.txt +1 -1
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/__init__.py +1 -1
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_analysis.py +49 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_arguments.py +18 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_mcp_refusals.py +6 -0
- maintainability_agent-4.4.2/src/maintainability_audit/_self_update.py +126 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_verdict_adapters.py +4 -2
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/cli.py +9 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_adapters.py +54 -0
- maintainability_agent-4.4.2/tests/test_analyzers_never_write.py +128 -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.0 → maintainability_agent-4.4.2}/tests/test_operator_named_reads.py +3 -0
- {maintainability_agent-4.4.0 → 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.0 → maintainability_agent-4.4.2}/tests/test_suite_isolation.py +65 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_workflow_supply_chain.py +29 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/LICENSE +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/setup.cfg +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_agent.egg-info/dependency_links.txt +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_agent.egg-info/entry_points.txt +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_agent.egg-info/top_level.txt +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/__main__.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_adapters.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_analyzer_sections.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_anchor.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_aspects.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_assets/analyzer-catalog.json +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_assets/standard.md +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_attestation.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_backfill.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_bands.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_banner.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_built_ins.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_calibration.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_catalog.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_changed_code_policy.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_charts.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_cognitive.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_config_defaults.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_conformance.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_corroborate.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_coverage_notes.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_criteria_scope.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_delegated_pillar.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_derive.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_discovery.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_documents.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_economics.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_economics_view.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_environment.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_evidence_reader.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_evidence_view.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_finding_match.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_first_run.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_formula.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_gates.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_generic.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_grammar.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_grant_ledger.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_handoff.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_history_view.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_hostile_prompt.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_hotspots.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_html_report_sections.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_html_view.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_identity.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_in_loop.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_in_loop_view.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_jvm_adapters.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_markdown_sections.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_masking.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_mcp_audit.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_mcp_gate.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_mcp_grants.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_mcp_resources.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_mcp_setup.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_metric_adapters.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_metrics_types.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_operator_reads.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_oracle.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_pillars.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_pipeline_results.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_practice.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_precommit.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_precommit_install.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_precommit_view.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_pressures.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_prompt_sections.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_c.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_cobol.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_core.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_cpp.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_csharp.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_fortran.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_go.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_java.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_js.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_kotlin.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_php.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_ruby.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_rust.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_shell.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ranges_swift.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ratchet.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_ratio_adapters.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_recurrence.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_run_comparison.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_runner.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_running_version.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_safe_write.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_scan_history.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_scan_view.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_second_source.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_security_delegate.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_security_work_order.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_selection.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_semantic.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_semantic_policy.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_semantic_ts.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_semantic_view.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_setup_errors.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_setup_persist.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_skill_data/SKILL.md +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_skill_data/agents/anthropic.yaml +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_skill_data/agents/copilot.yaml +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_skill_data/agents/openai.yaml +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_skill_data/copilot/maintainability-agent.prompt.md +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_skill_data/references/finding-taxonomy.md +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_skill_install.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_stored_grants.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_tdd_view.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_test_commands.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_test_execution.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_test_pairing.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_tokens.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_tool_adapters.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_trends.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_user_config.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_verification.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_work_order.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_work_order_view.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_work_order_weights.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_xml.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/baseline.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/config.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/deadcode.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/duplication.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/evidence.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/git_tools.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/history.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/idioms.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/instructions.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/mcp_server.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/metrics.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/prompts.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/renderers.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/report.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/sarif.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/scoring.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/similarity.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/source.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_a_clone_names_every_copy.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_a_dangling_source_link_is_named_not_fatal.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_a_format_override_is_disclosed.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_a_matching_format_stays_silent.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_a_published_question_offers_what_it_accepts.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_a_rendered_docs_site_is_not_scored_as_source.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_a_setup_question_keeps_its_contract.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_acquisition_trust.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_adapter_docs.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_adapter_recordings.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_added_lines.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_an_absent_work_order_renders_nothing.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_an_unmeasured_pillar_reports_no_number.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analysis_coverage.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analysis_execution.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analyzer_bridge.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analyzer_config_isolation.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analyzer_estimate_claims.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analyzer_file_lists_are_batched.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analyzer_pinning.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analyzer_primary_estimate.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analyzer_provenance.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analyzer_provenance_exclusions.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analyzer_scoring_path.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analyzer_spread_range.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analyzer_xml_bounds.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analyzers_against_the_real_tools.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_analyzers_report_what_actually_failed.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_anchor_and_mode.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_anchor_caveat_and_counts_follow_the_run.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_anchor_disclosure.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_annotations_match_behaviour.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_anticipated_refusals.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_architecture.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_artifact_write_route_class.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_aspect_coverage.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_asset_snapshot_class.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_ast_reading_resolves_spellings.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_attestation.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_audit_components.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_authorization_freshness.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_authorship_gates.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_backfill.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_band_concealment_class.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_band_concealment_p3.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_band_pressures.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_bands.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_behaviour_suites_are_tests.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_body_or_signature_class.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_both_setup_paths_ask_the_same_stage.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_build_output_is_not_the_repositorys_code.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_c_declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_calibration_corpus.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_calibration_drift.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_calibration_tooling.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_catalog_selection.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_catalog_tier_promise.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_changed_code_policy.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_chat_leads_with_the_work_order.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_chat_primary_docs.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_check_refuses_plus_only_fragments.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_checkstyle_adapter.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_checkstyle_catalog.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_child_sandbox.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_ci_history_recipe.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_ci_installs_the_analyzer_pool.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_claimed_languages.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_clean_sees_the_weakened_oracle.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_cli.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_clone_group_class.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_cobol_declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_code_scanning_gets_alerts_not_the_record.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_cognitive_complexity.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_cohesion_with_nothing_to_read_is_not_applicable.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_cohort_statistics.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_concealment_properties.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_config_shape.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_conformance_reads_the_operators_ask.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_consent_and_grant.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_consent_is_per_repository.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_consent_survives_setup_and_is_asked.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_consent_without_command_has_a_remedy.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_consumer_migration.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_contract_claims.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_corpus_note_counts_come_from_the_corpus.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_corroborate.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_coverage_by_language.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_coverage_config_reaches_children.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_coverage_formats.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_cpp_declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_criteria_completion.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_csharp_declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_current_state_docs_name_every_parsed_language.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_d15_composition.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_d15_goal_directed.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_dead_code.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_declaration_criteria_scope.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_declaration_edge_cases.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_declaration_grading.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_declaration_ranges.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_declaration_source.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_declarative_parsers.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_declared_capabilities_match_the_delegate.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_declared_imports.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_delegated_security_pillar.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_demo_tree.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_derivation_mix.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_determinism.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_dimension_ratchet.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_direct_runner_availability_class.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_discovery.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_doc_claims.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_docs_links.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_economic_context.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_empty_output_not_clean.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_empty_output_not_clean_adapters.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_environment_work_order.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_every_built_presentation_is_offered.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_every_job_tests_the_pinned_oracle.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_every_language_counts_its_own_loop.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_every_language_has_a_loop_fixture.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_every_pool_install_is_the_same_pool.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_every_question_can_be_answered.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_every_surface_says_what_the_run_found.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_evidence_invariants.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_evidence_normalization.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_evidence_properties.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_example_config_opens_claimed_languages.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_exclude_additional_keeps_the_defaults.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_exclusion_dialects.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_exposure_never_outranks_band.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_falsifier_standard.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_file_list_cap_class.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_finding_identity.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_first_run_elicitation.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_first_run_prompt.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_first_run_reelicitation.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_first_stage_setup_wording_holds.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_fix_breadth_window.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_fixed_form_fortran.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_format_ask.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_fortran_declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_fortran_metrics.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_fortran_practice.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_git_argv.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_git_read_only.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_git_readonly_class.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_go_declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_grammar_constructs.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_grammar_token_coverage.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_grant_only_user_tier.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_grok_audit_of_3_11.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_history.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_history_boundary.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_history_manifest.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_history_schema2.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_history_window.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_hostile_prompt.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_html_executive.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_html_section_parity_class.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_identity_docs.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_identity_resolution.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_idiom_divergence.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_in_loop_budgets.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_in_loop_check.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_installed_wheel_runtime.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_instruction_targets.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_java_range_guard.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_java_ranges.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_java_scored.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_java_wiring.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_js_complexity_operators.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_js_declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_kotlin_declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_kotlin_metrics.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_language_coverage.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_language_support_honesty.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_list_tools_publishes_the_answer_path.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_maintenance_signals.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_mcp_baseline_payload.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_mcp_format_contract.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_mcp_history.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_mcp_server.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_mcp_start_failure_names_what_is_installed.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_migration_1_0.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_missing_security_scanners_are_named_before_the_run.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_mutation_recorded.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_near_duplicates.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_network_disclosure.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_no_private_names.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_one_setup_across_surfaces_class.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_operator_named_paths.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_oracle_weakening_precision_bar.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_pairing_reads_imports.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_pattern_budget.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_phase6_claims.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_php_declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_pillars_and_practice.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_pipeline_results.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_pmd_adapter.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_pmd_audit_closures.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_policy_claims.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_pool_runs_by_config.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_population_floors.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_practice_nested_gates_class.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_precommit_staged.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_preflight_before_consent_runs_nothing_from_the_tree.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_presentation_refusals.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_previous_release_reached_pypi.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_promises.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_prompt_does_not_issue_rates_when_unscored.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_prompt_escalation_once.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_prompt_honesty.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_prompt_location_escalation_class.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_prove_falsifiers.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_python_complexity.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_python_declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_read_boundary.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_readme_claims.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_recurrence.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_regular_file_reads_work_without_o_nonblock.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_release_needs_an_empty_ledger.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_release_plan.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_release_plan_status.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_rendered_docs.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_report_remedy_copy.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_reported_but_not_scored.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_root_grants.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_rubric_ignores_project_lint_config.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_ruby_declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_run_comparison.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_runner.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_rust_declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_sarif.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_scan_history.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_scan_scope.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_scanner_fingerprint_covers_the_measurement_path.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_scanner_unsafe_direction.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_scanning.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_schema_fidelity.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_scope_conformance.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_scoring_calibration.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_security_delegate_versions_agree.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_security_findings_keep_their_handoff.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_security_pillar_asserts_a_scanner_set.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_security_pillar_runs_and_shows.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_selection_covers_every_parsed_language.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_semantic_findings_stay_inside_the_audited_files.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_semantic_policy.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_setup_answers_are_the_same_setup.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_setup_gate_completeness.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_setup_gate_independent_contract.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_setup_instruction_describes_its_own_reply.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_setup_precondition.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_setup_writes_a_valid_config.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_shell_declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_shell_metrics.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_skill_install.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_sonar_resolve.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_source_index.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_spotbugs_adapter.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_spotbugs_catalog.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_stage8_contract.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_stamped_documents_stay_honest.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_stdout_outputs.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_swift_declarations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_tdd_structure.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_terminal_asks_the_same_questions.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_test_commands.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_test_execution_class.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_agent_knows_when_it_is_stale.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_changelog_covers_the_shipping_version.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_chat_payload_has_a_budget.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_condition_says_what_it_measured.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_handoff_rules_are_their_own_module.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_pillar_row_reads_cleanly.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_presentation_question_stays_answerable.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_previous_release_was_tagged.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_prompt_does_not_take_back_what_it_withheld.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_prompt_keeps_listing_what_it_did_not_withhold.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_release_process_describes_itself.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_release_record_stays_well_formed.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_report_is_saved_not_sent.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_security_run_has_a_configurable_limit.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_security_work_order_is_drawn.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_suite_names_the_program_it_ran.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_tree_cannot_redirect_a_read.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_the_version_has_one_source.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_three_presentations.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_tool_resolution.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_tree_cannot_opt_the_host_in.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_tree_chosen_spawn.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_tree_reads_use_the_primitive.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_trends.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_type_fields_not_functions_class.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_uat_falsifiers.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_unanchored_set_matches_corpus.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_unread_code.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_user_config_tier.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_verification_audit_closures.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_verified_grade.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_version_claim.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_version_stamping.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_wheel_contents.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_withheld_work_keeps_its_boundary.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_work_items_state_their_own_finding.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_work_order.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_work_order_binds_to_this_interpreter.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_work_order_items.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_work_order_selection.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_write_boundary.py +0 -0
- {maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/tests/test_write_route_class.py +0 -0
- {maintainability_agent-4.4.0 → 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
|
|
@@ -37,7 +37,7 @@ Requires-Dist: mcp<3,>=2; extra == "dev"
|
|
|
37
37
|
Requires-Dist: PyYAML>=6; extra == "dev"
|
|
38
38
|
Requires-Dist: setuptools>=70; extra == "dev"
|
|
39
39
|
Requires-Dist: lizard>=1.17; extra == "dev"
|
|
40
|
-
Requires-Dist: markdown
|
|
40
|
+
Requires-Dist: markdown==3.11.1; extra == "dev"
|
|
41
41
|
Dynamic: license-file
|
|
42
42
|
|
|
43
43
|
# Maintainability Agent
|
|
@@ -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
|
|
@@ -63,7 +63,10 @@ mcp = ["mcp>=2,<3"]
|
|
|
63
63
|
# ships imports it, and the oracle exists so a measurement can be
|
|
64
64
|
# checked against something other than its author. `markdown` renders the
|
|
65
65
|
# docs/html reading copy (`tools/render_docs.py`); the product never does.
|
|
66
|
-
|
|
66
|
+
# It is pinned exactly: the committed copy is checked against a fresh render,
|
|
67
|
+
# and markdown 3.11 rendered two pages differently from 3.10, so an unpinned
|
|
68
|
+
# release failed CI on files nobody had touched (2026-10-14).
|
|
69
|
+
dev = ["pytest>=8", "pytest-cov>=5", "pytest-xdist>=3.6", "jsonschema>=4", "ruff>=0.5", "pip-audit>=2.7", "mcp>=2,<3", "PyYAML>=6", "setuptools>=70", "lizard>=1.17", "markdown==3.11.1"]
|
|
67
70
|
|
|
68
71
|
[tool.pydocstyle]
|
|
69
72
|
# D401 ("First line should be in imperative mood") is switched off, and the
|
|
@@ -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
|
|
@@ -37,7 +37,7 @@ Requires-Dist: mcp<3,>=2; extra == "dev"
|
|
|
37
37
|
Requires-Dist: PyYAML>=6; extra == "dev"
|
|
38
38
|
Requires-Dist: setuptools>=70; extra == "dev"
|
|
39
39
|
Requires-Dist: lizard>=1.17; extra == "dev"
|
|
40
|
-
Requires-Dist: markdown
|
|
40
|
+
Requires-Dist: markdown==3.11.1; extra == "dev"
|
|
41
41
|
Dynamic: license-file
|
|
42
42
|
|
|
43
43
|
# Maintainability Agent
|
|
@@ -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
|
|
@@ -182,6 +183,7 @@ tests/test_analyzer_scoring_path.py
|
|
|
182
183
|
tests/test_analyzer_spread_range.py
|
|
183
184
|
tests/test_analyzer_xml_bounds.py
|
|
184
185
|
tests/test_analyzers_against_the_real_tools.py
|
|
186
|
+
tests/test_analyzers_never_write.py
|
|
185
187
|
tests/test_analyzers_report_what_actually_failed.py
|
|
186
188
|
tests/test_anchor_and_mode.py
|
|
187
189
|
tests/test_anchor_caveat_and_counts_follow_the_run.py
|
|
@@ -221,6 +223,7 @@ tests/test_checkstyle_catalog.py
|
|
|
221
223
|
tests/test_child_sandbox.py
|
|
222
224
|
tests/test_ci_history_recipe.py
|
|
223
225
|
tests/test_ci_installs_the_analyzer_pool.py
|
|
226
|
+
tests/test_ci_runs_once.py
|
|
224
227
|
tests/test_claimed_languages.py
|
|
225
228
|
tests/test_clean_sees_the_weakened_oracle.py
|
|
226
229
|
tests/test_cli.py
|
|
@@ -333,6 +336,7 @@ tests/test_kotlin_metrics.py
|
|
|
333
336
|
tests/test_language_coverage.py
|
|
334
337
|
tests/test_language_support_honesty.py
|
|
335
338
|
tests/test_list_tools_publishes_the_answer_path.py
|
|
339
|
+
tests/test_local_gate.py
|
|
336
340
|
tests/test_maintenance_signals.py
|
|
337
341
|
tests/test_mcp_baseline_payload.py
|
|
338
342
|
tests/test_mcp_format_contract.py
|
|
@@ -404,6 +408,7 @@ tests/test_security_findings_keep_their_handoff.py
|
|
|
404
408
|
tests/test_security_pillar_asserts_a_scanner_set.py
|
|
405
409
|
tests/test_security_pillar_runs_and_shows.py
|
|
406
410
|
tests/test_selection_covers_every_parsed_language.py
|
|
411
|
+
tests/test_self_update.py
|
|
407
412
|
tests/test_semantic_findings_stay_inside_the_audited_files.py
|
|
408
413
|
tests/test_semantic_policy.py
|
|
409
414
|
tests/test_setup_answers_are_the_same_setup.py
|
{maintainability_agent-4.4.0 → maintainability_agent-4.4.2}/src/maintainability_audit/_analysis.py
RENAMED
|
@@ -19,6 +19,7 @@ clean result.
|
|
|
19
19
|
|
|
20
20
|
from __future__ import annotations
|
|
21
21
|
|
|
22
|
+
import hashlib
|
|
22
23
|
from collections.abc import Sequence
|
|
23
24
|
from dataclasses import dataclass, field, replace
|
|
24
25
|
from pathlib import Path
|
|
@@ -40,6 +41,7 @@ from ._metrics_types import KNOWN_SOURCE_SUFFIXES, Finding, Measurement
|
|
|
40
41
|
from ._runner import Outcome, Probe, ToolResult, run
|
|
41
42
|
from ._selection import Selected, select_runnable
|
|
42
43
|
from .config import acquisition_permitted
|
|
44
|
+
from .git_tools import GitCommandFailed, probe_git, run_git
|
|
43
45
|
|
|
44
46
|
#: Sources outside this package: an analyzer it ran, or a file the
|
|
45
47
|
#: developer's own pipeline wrote (Decision 17). Built-ins are not here.
|
|
@@ -356,6 +358,43 @@ def analyze(root: Path, config: dict[str, Any], probe: Probe | None = None) -> A
|
|
|
356
358
|
return analysis
|
|
357
359
|
|
|
358
360
|
|
|
361
|
+
class RepositoryModifiedError(Exception):
|
|
362
|
+
"""An analyzer changed the repository it was auditing.
|
|
363
|
+
|
|
364
|
+
The audit never edits source. A tool that writes to the audited tree
|
|
365
|
+
(ruff honouring a repository's `fix = true` rewrote 102 files of
|
|
366
|
+
an audited repository on 2026-10-14) fails the audit loudly rather than handing back
|
|
367
|
+
a grade for code that is no longer what was audited.
|
|
368
|
+
"""
|
|
369
|
+
|
|
370
|
+
|
|
371
|
+
def _tracked_state(root: Path) -> dict[str, str] | None:
|
|
372
|
+
"""Each tracked file that differs from HEAD, by a hash of its diff.
|
|
373
|
+
|
|
374
|
+
None when `root` is not a git work tree: there is nothing to compare
|
|
375
|
+
against, so nothing is claimed.
|
|
376
|
+
"""
|
|
377
|
+
if not probe_git(["rev-parse", "--is-inside-work-tree"], root):
|
|
378
|
+
return None
|
|
379
|
+
try:
|
|
380
|
+
diff = run_git(["diff", "HEAD", "--no-ext-diff", "--binary"], root, strip=False)
|
|
381
|
+
except GitCommandFailed:
|
|
382
|
+
return None
|
|
383
|
+
state: dict[str, str] = {}
|
|
384
|
+
for block in diff.split("\ndiff --git "):
|
|
385
|
+
if not block.strip():
|
|
386
|
+
continue
|
|
387
|
+
header = block.split("\n", 1)[0].removeprefix("diff --git ")
|
|
388
|
+
name = header.split(" b/", 1)[-1]
|
|
389
|
+
state[name] = hashlib.sha256(block.encode("utf-8", "replace")).hexdigest()
|
|
390
|
+
return state
|
|
391
|
+
|
|
392
|
+
|
|
393
|
+
def _changed_paths(before: dict[str, str], after: dict[str, str]) -> list[str]:
|
|
394
|
+
return sorted(path for path in set(before) | set(after)
|
|
395
|
+
if before.get(path) != after.get(path))
|
|
396
|
+
|
|
397
|
+
|
|
359
398
|
def _run_one(root: Path, adapter: Any, probe: Probe, timeout: int,
|
|
360
399
|
analysis: Analysis, excludes: Sequence[str] = (),
|
|
361
400
|
inventory: Any = None) -> ToolCoverage:
|
|
@@ -371,6 +410,9 @@ def _run_one(root: Path, adapter: Any, probe: Probe, timeout: int,
|
|
|
371
410
|
"""
|
|
372
411
|
try:
|
|
373
412
|
return _attempt(root, adapter, probe, timeout, analysis, excludes, inventory)
|
|
413
|
+
except RepositoryModifiedError:
|
|
414
|
+
# Not an adapter defect to record quietly: the audited tree changed.
|
|
415
|
+
raise
|
|
374
416
|
except Exception as error: # noqa: BLE001 - the backstop is the point
|
|
375
417
|
return ToolCoverage(
|
|
376
418
|
slug=adapter.slug, outcome="failed", concepts=tuple(adapter.concepts),
|
|
@@ -494,12 +536,19 @@ def _run_batches(adapter: Any, root: Path, excludes: Sequence[str],
|
|
|
494
536
|
invocations = planned(root, excludes) if planned else [adapter.invocation(root, excludes=excludes)]
|
|
495
537
|
results: list[ToolResult] = []
|
|
496
538
|
parsed: list[Extraction] = []
|
|
539
|
+
before = _tracked_state(root)
|
|
497
540
|
for invocation in invocations:
|
|
498
541
|
result = run(adapter.slug, invocation, timeout_seconds=timeout)
|
|
499
542
|
results.append(result)
|
|
500
543
|
parsed.append(adapter.parse(result))
|
|
501
544
|
if not result.usable:
|
|
502
545
|
break
|
|
546
|
+
after = _tracked_state(root) if before is not None else None
|
|
547
|
+
if before is not None and after is not None and after != before:
|
|
548
|
+
changed = _changed_paths(before, after)
|
|
549
|
+
raise RepositoryModifiedError(
|
|
550
|
+
f"{adapter.slug} modified the audited repository: {', '.join(changed)}. "
|
|
551
|
+
"The audit never edits source; restore these files and report the adapter.")
|
|
503
552
|
if len(results) == 1:
|
|
504
553
|
return results[0], parsed[0]
|
|
505
554
|
return _merged_result(results, len(invocations)), _merged_extraction(parsed)
|
{maintainability_agent-4.4.0 → 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).",
|
|
@@ -18,6 +18,7 @@ D48.
|
|
|
18
18
|
|
|
19
19
|
from __future__ import annotations
|
|
20
20
|
|
|
21
|
+
from ._analysis import RepositoryModifiedError
|
|
21
22
|
from ._catalog import PolicyError
|
|
22
23
|
from ._mcp_audit import InvalidAuditArgument, PathNotAllowed
|
|
23
24
|
from ._mcp_setup import SetupRequired
|
|
@@ -37,6 +38,11 @@ ANTICIPATED_REFUSALS = (
|
|
|
37
38
|
# type and `PathNotAllowed` both derive from it alongside the
|
|
38
39
|
# internal ones that must stay crashes.
|
|
39
40
|
ConfigUnreadable,
|
|
41
|
+
# An analyzer changed the audited repository. The message names the
|
|
42
|
+
# changed files and says to report the adapter: actionable, and a
|
|
43
|
+
# grade must never be returned for code that is no longer what was
|
|
44
|
+
# audited.
|
|
45
|
+
RepositoryModifiedError,
|
|
40
46
|
)
|
|
41
47
|
|
|
42
48
|
__all__ = ["ANTICIPATED_REFUSALS"]
|
|
@@ -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
|
|
@@ -117,7 +117,9 @@ class RuffAdapter(BaseAdapter):
|
|
|
117
117
|
concepts=("style", "complexity", "dead-code"),
|
|
118
118
|
findings_exit_codes=(0, 1), exclude_flag="--exclude",
|
|
119
119
|
exclude_dialect="gitignore",
|
|
120
|
-
|
|
120
|
+
# --no-fix: a repository's `fix = true` must never turn an audit
|
|
121
|
+
# into a rewrite (it rewrote 102 files of an audited repository, 2026-10-14).
|
|
122
|
+
extra_args=("check", "--no-fix", "--output-format", "json", "--no-cache"),
|
|
121
123
|
)
|
|
122
124
|
|
|
123
125
|
def _read(self, result: ToolResult) -> Extraction:
|
|
@@ -169,7 +171,7 @@ class FortitudeAdapter(BaseAdapter):
|
|
|
169
171
|
concepts=("style", "dead-code"),
|
|
170
172
|
findings_exit_codes=(0, 1), exclude_flag="--exclude",
|
|
171
173
|
exclude_dialect="fnmatch",
|
|
172
|
-
extra_args=("check", "--output-format", "json"),
|
|
174
|
+
extra_args=("check", "--no-fix", "--output-format", "json"),
|
|
173
175
|
)
|
|
174
176
|
|
|
175
177
|
def _read(self, result: ToolResult) -> Extraction:
|
{maintainability_agent-4.4.0 → 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
|
|
|
@@ -17,10 +17,12 @@ A+ one more time.
|
|
|
17
17
|
from __future__ import annotations
|
|
18
18
|
|
|
19
19
|
import json
|
|
20
|
+
import subprocess
|
|
20
21
|
from pathlib import Path
|
|
21
22
|
|
|
22
23
|
import pytest
|
|
23
24
|
|
|
25
|
+
from maintainability_audit import _analysis
|
|
24
26
|
from maintainability_audit._adapters import BaseAdapter, Extraction, measurements_only
|
|
25
27
|
from maintainability_audit._metrics_types import Measurement
|
|
26
28
|
from maintainability_audit._runner import Outcome, ToolResult
|
|
@@ -489,3 +491,55 @@ def test_jscpd_paths_drop_the_embedded_format_tag() -> None:
|
|
|
489
491
|
|
|
490
492
|
paths = [f.path for f in adapter.parse(result).findings]
|
|
491
493
|
assert paths == ["docs/api/formik.md", "src/a.ts", "pkgs/v1.2/b.js"]
|
|
494
|
+
|
|
495
|
+
|
|
496
|
+
# --- Guards for D229 (an analyzer can never rewrite the audited repository) --
|
|
497
|
+
# Regression guards, not falsifiers: they pass on the code before the fix too,
|
|
498
|
+
# so they live here rather than in the falsifier file D229 cites.
|
|
499
|
+
|
|
500
|
+
_WRITE_TOKENS = ("--fix", "--write", "--in-place", "-i", "--apply", "--fix-only", "--unsafe-fixes")
|
|
501
|
+
|
|
502
|
+
|
|
503
|
+
def _write_guard_argvs(slug, root):
|
|
504
|
+
names = ("mod.py", "Main.java", "main.f90", "app.js", "lib.c", "x.go", "y.rs", "z.ts")
|
|
505
|
+
for name in names:
|
|
506
|
+
(root / name).write_text("x\n", encoding="utf-8")
|
|
507
|
+
adapter = ADAPTERS[slug]()
|
|
508
|
+
runs = list(adapter.invocations(root, ()))
|
|
509
|
+
runs.append(adapter.invocation(root, [str(root / name) for name in names]))
|
|
510
|
+
return [tuple(run.argv) for run in runs]
|
|
511
|
+
|
|
512
|
+
|
|
513
|
+
@pytest.mark.parametrize("slug", sorted(ADAPTERS))
|
|
514
|
+
def test_no_adapter_is_built_to_write(slug, tmp_path):
|
|
515
|
+
"""Covers existing behaviour: no adapter has ever passed a write-enabling flag; D229's
|
|
516
|
+
rewrite came from repository config, and this keeps a future adapter from adding one."""
|
|
517
|
+
adapter = ADAPTERS[slug]()
|
|
518
|
+
for argv in _write_guard_argvs(slug, tmp_path):
|
|
519
|
+
found = [token for token in argv if token in _WRITE_TOKENS]
|
|
520
|
+
assert not found, f"{slug} argv carries write-enabling {found}: {argv}"
|
|
521
|
+
assert not adapter.extra_args or adapter.extra_args[0] != "format", (
|
|
522
|
+
f"{slug} runs a formatter, which rewrites files")
|
|
523
|
+
|
|
524
|
+
|
|
525
|
+
class _QuietProbe(BaseAdapter):
|
|
526
|
+
def __init__(self):
|
|
527
|
+
super().__init__(slug="fake", emits="verdict", executable="fake", concepts=("style",))
|
|
528
|
+
|
|
529
|
+
def _read(self, result): # pragma: no cover - parse is not the subject
|
|
530
|
+
return Extraction()
|
|
531
|
+
|
|
532
|
+
|
|
533
|
+
def test_an_analyzer_that_changes_nothing_reports_no_integrity_failure(tmp_path, monkeypatch):
|
|
534
|
+
"""Covers existing behaviour: a clean run raised nothing before D229 either; this holds
|
|
535
|
+
that the integrity check never turns an unchanged tree into a failure."""
|
|
536
|
+
for args in (("init", "-q"), ("config", "user.email", "t@example.com"), ("config", "user.name", "t")):
|
|
537
|
+
subprocess.run(["git", *args], cwd=tmp_path, check=True, capture_output=True)
|
|
538
|
+
(tmp_path / "mod.py").write_text("import os\n", encoding="utf-8")
|
|
539
|
+
subprocess.run(["git", "add", "."], cwd=tmp_path, check=True, capture_output=True)
|
|
540
|
+
subprocess.run(["git", "commit", "-q", "-m", "init"], cwd=tmp_path, check=True, capture_output=True)
|
|
541
|
+
monkeypatch.setattr(_analysis, "run",
|
|
542
|
+
lambda slug, invocation, **kw: ToolResult(slug=slug, outcome=Outcome.RAN,
|
|
543
|
+
stdout="[]", exit_code=0))
|
|
544
|
+
result, _parsed = _analysis._run_batches(_QuietProbe(), tmp_path, (), 60)
|
|
545
|
+
assert result.outcome == Outcome.RAN
|