maintainability-agent 4.1.0__tar.gz → 4.2.0__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.1.0/src/maintainability_agent.egg-info → maintainability_agent-4.2.0}/PKG-INFO +17 -4
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/README.md +16 -3
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0/src/maintainability_agent.egg-info}/PKG-INFO +17 -4
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_agent.egg-info/SOURCES.txt +3 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/__init__.py +1 -1
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_operator_reads.py +3 -1
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/config.py +19 -2
- maintainability_agent-4.2.0/tests/test_a_rendered_docs_site_is_not_scored_as_source.py +61 -0
- maintainability_agent-4.2.0/tests/test_exclude_additional_keeps_the_defaults.py +53 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_readme_claims.py +16 -0
- maintainability_agent-4.2.0/tests/test_regular_file_reads_work_without_o_nonblock.py +28 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/LICENSE +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/pyproject.toml +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/setup.cfg +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_agent.egg-info/dependency_links.txt +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_agent.egg-info/entry_points.txt +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_agent.egg-info/requires.txt +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_agent.egg-info/top_level.txt +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/__main__.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_adapters.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_analysis.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_analyzer_sections.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_anchor.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_arguments.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_aspects.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_assets/analyzer-catalog.json +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_assets/standard.md +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_attestation.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_backfill.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_bands.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_banner.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_built_ins.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_calibration.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_catalog.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_charts.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_cognitive.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_config_defaults.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_conformance.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_corroborate.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_coverage_notes.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_criteria_scope.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_delegated_pillar.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_derive.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_discovery.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_documents.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_economics.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_economics_view.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_environment.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_evidence_reader.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_evidence_view.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_finding_match.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_first_run.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_formula.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_gates.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_generic.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_grammar.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_grant_ledger.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_handoff.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_history_view.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_hostile_prompt.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_hotspots.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_html_report_sections.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_html_view.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_identity.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_in_loop.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_in_loop_view.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_jvm_adapters.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_markdown_sections.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_masking.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_mcp_audit.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_mcp_gate.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_mcp_grants.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_mcp_refusals.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_mcp_resources.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_mcp_setup.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_metric_adapters.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_metrics_types.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_oracle.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_pillars.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_practice.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_precommit.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_precommit_install.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_precommit_view.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_pressures.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_prompt_sections.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_ranges_c.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_ranges_cobol.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_ranges_core.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_ranges_cpp.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_ranges_csharp.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_ranges_fortran.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_ranges_go.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_ranges_java.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_ranges_js.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_ranges_kotlin.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_ranges_php.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_ranges_ruby.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_ranges_rust.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_ranges_shell.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_ranges_swift.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_ratchet.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_ratio_adapters.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_recurrence.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_run_comparison.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_runner.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_running_version.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_safe_write.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_scan_history.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_scan_view.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_second_source.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_security_delegate.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_security_work_order.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_selection.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_semantic.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_semantic_policy.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_semantic_ts.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_semantic_view.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_setup_errors.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_setup_persist.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_skill_data/SKILL.md +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_skill_data/agents/anthropic.yaml +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_skill_data/agents/copilot.yaml +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_skill_data/agents/openai.yaml +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_skill_data/copilot/maintainability-agent.prompt.md +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_skill_data/references/finding-taxonomy.md +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_skill_install.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_stored_grants.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_tdd_view.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_test_commands.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_test_execution.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_test_pairing.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_tokens.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_tool_adapters.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_trends.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_user_config.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_verdict_adapters.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_verification.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_work_order.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_work_order_view.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_work_order_weights.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_xml.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/baseline.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/cli.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/deadcode.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/declarations.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/duplication.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/evidence.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/git_tools.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/history.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/idioms.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/instructions.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/mcp_server.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/metrics.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/prompts.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/renderers.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/report.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/sarif.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/scoring.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/similarity.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/source.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_a_clone_names_every_copy.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_a_dangling_source_link_is_named_not_fatal.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_a_format_override_is_disclosed.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_a_matching_format_stays_silent.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_a_published_question_offers_what_it_accepts.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_a_setup_question_keeps_its_contract.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_acquisition_trust.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_adapter_docs.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_adapter_recordings.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_adapters.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_added_lines.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_an_absent_work_order_renders_nothing.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_an_unmeasured_pillar_reports_no_number.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_analysis_coverage.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_analysis_execution.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_analyzer_bridge.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_analyzer_config_isolation.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_analyzer_estimate_claims.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_analyzer_file_lists_are_batched.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_analyzer_pinning.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_analyzer_primary_estimate.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_analyzer_provenance.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_analyzer_provenance_exclusions.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_analyzer_scoring_path.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_analyzer_spread_range.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_analyzer_xml_bounds.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_anchor_and_mode.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_anchor_caveat_and_counts_follow_the_run.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_anchor_disclosure.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_annotations_match_behaviour.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_anticipated_refusals.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_architecture.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_artifact_write_route_class.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_aspect_coverage.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_asset_snapshot_class.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_ast_reading_resolves_spellings.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_attestation.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_audit_components.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_authorization_freshness.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_authorship_gates.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_backfill.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_band_concealment_class.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_band_concealment_p3.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_band_pressures.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_bands.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_behaviour_suites_are_tests.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_body_or_signature_class.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_both_setup_paths_ask_the_same_stage.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_build_output_is_not_the_repositorys_code.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_c_declarations.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_calibration_corpus.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_calibration_drift.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_calibration_tooling.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_catalog_selection.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_catalog_tier_promise.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_chat_leads_with_the_work_order.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_chat_primary_docs.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_check_refuses_plus_only_fragments.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_checkstyle_adapter.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_checkstyle_catalog.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_child_sandbox.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_ci_history_recipe.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_ci_installs_the_analyzer_pool.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_claimed_languages.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_clean_sees_the_weakened_oracle.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_cli.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_clone_group_class.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_cobol_declarations.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_code_scanning_gets_alerts_not_the_record.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_cognitive_complexity.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_cohesion_with_nothing_to_read_is_not_applicable.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_cohort_statistics.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_concealment_properties.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_config_shape.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_conformance_reads_the_operators_ask.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_consent_and_grant.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_consent_is_per_repository.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_consent_survives_setup_and_is_asked.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_consent_without_command_has_a_remedy.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_consumer_migration.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_contract_claims.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_corpus_note_counts_come_from_the_corpus.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_corroborate.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_coverage_by_language.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_coverage_config_reaches_children.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_coverage_formats.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_cpp_declarations.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_criteria_completion.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_csharp_declarations.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_current_state_docs_name_every_parsed_language.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_d15_composition.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_d15_goal_directed.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_dead_code.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_declaration_criteria_scope.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_declaration_edge_cases.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_declaration_grading.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_declaration_ranges.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_declaration_source.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_declarative_parsers.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_declared_capabilities_match_the_delegate.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_declared_imports.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_delegated_security_pillar.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_demo_tree.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_derivation_mix.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_determinism.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_dimension_ratchet.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_direct_runner_availability_class.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_discovery.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_doc_claims.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_docs_links.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_economic_context.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_empty_output_not_clean.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_empty_output_not_clean_adapters.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_environment_work_order.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_every_built_presentation_is_offered.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_every_language_counts_its_own_loop.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_every_language_has_a_loop_fixture.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_every_pool_install_is_the_same_pool.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_every_question_can_be_answered.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_every_surface_says_what_the_run_found.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_evidence_invariants.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_evidence_normalization.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_evidence_properties.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_example_config_opens_claimed_languages.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_exclusion_dialects.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_exposure_never_outranks_band.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_falsifier_standard.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_file_list_cap_class.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_finding_identity.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_first_run_elicitation.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_first_run_prompt.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_first_run_reelicitation.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_first_stage_setup_wording_holds.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_fix_breadth_window.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_fixed_form_fortran.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_format_ask.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_fortran_declarations.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_fortran_metrics.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_fortran_practice.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_git_argv.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_git_read_only.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_git_readonly_class.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_go_declarations.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_grammar_constructs.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_grammar_token_coverage.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_grant_only_user_tier.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_grok_audit_of_3_11.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_history.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_history_boundary.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_history_manifest.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_history_schema2.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_history_window.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_hostile_prompt.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_html_executive.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_html_section_parity_class.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_identity_docs.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_identity_resolution.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_idiom_divergence.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_in_loop_budgets.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_in_loop_check.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_installed_wheel_runtime.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_instruction_targets.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_java_range_guard.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_java_ranges.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_java_scored.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_java_wiring.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_js_complexity_operators.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_js_declarations.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_kotlin_declarations.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_kotlin_metrics.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_language_coverage.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_language_support_honesty.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_list_tools_publishes_the_answer_path.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_maintenance_signals.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_mcp_baseline_payload.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_mcp_format_contract.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_mcp_history.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_mcp_server.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_mcp_start_failure_names_what_is_installed.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_migration_1_0.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_missing_security_scanners_are_named_before_the_run.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_mutation_recorded.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_near_duplicates.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_network_disclosure.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_one_setup_across_surfaces_class.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_operator_named_paths.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_operator_named_reads.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_oracle_weakening_precision_bar.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_pairing_reads_imports.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_pattern_budget.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_phase6_claims.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_php_declarations.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_pillars_and_practice.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_platform_claim.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_pmd_adapter.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_pmd_audit_closures.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_policy_claims.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_pool_runs_by_config.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_population_floors.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_practice_nested_gates_class.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_precommit_staged.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_preflight_before_consent_runs_nothing_from_the_tree.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_presentation_refusals.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_previous_release_reached_pypi.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_promises.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_prompt_does_not_issue_rates_when_unscored.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_prompt_escalation_once.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_prompt_honesty.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_prompt_location_escalation_class.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_prove_falsifiers.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_python_complexity.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_python_declarations.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_read_boundary.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_recurrence.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_release_needs_an_empty_ledger.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_release_plan.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_release_plan_status.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_rendered_docs.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_report_remedy_copy.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_root_grants.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_rubric_ignores_project_lint_config.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_ruby_declarations.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_run_comparison.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_runner.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_rust_declarations.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_sarif.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_scan_history.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_scan_scope.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_scanner_fingerprint_covers_the_measurement_path.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_scanner_unsafe_direction.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_scanning.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_schema_fidelity.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_scope_conformance.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_scoring_calibration.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_security_delegate_versions_agree.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_security_findings_keep_their_handoff.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_security_pillar_asserts_a_scanner_set.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_security_pillar_runs_and_shows.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_selection_covers_every_parsed_language.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_semantic_findings_stay_inside_the_audited_files.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_semantic_policy.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_setup_answers_are_the_same_setup.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_setup_gate_completeness.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_setup_gate_independent_contract.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_setup_instruction_describes_its_own_reply.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_setup_precondition.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_setup_writes_a_valid_config.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_shell_declarations.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_shell_metrics.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_skill_install.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_sonar_resolve.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_source_index.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_spotbugs_adapter.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_spotbugs_catalog.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_stage8_contract.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_stamped_documents_stay_honest.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_stdout_outputs.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_suite_isolation.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_swift_declarations.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_tdd_structure.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_terminal_asks_the_same_questions.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_test_commands.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_test_execution_class.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_the_agent_knows_when_it_is_stale.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_the_changelog_covers_the_shipping_version.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_the_chat_payload_has_a_budget.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_the_condition_says_what_it_measured.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_the_handoff_rules_are_their_own_module.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_the_pillar_row_reads_cleanly.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_the_presentation_question_stays_answerable.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_the_previous_release_was_tagged.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_the_prompt_does_not_take_back_what_it_withheld.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_the_prompt_keeps_listing_what_it_did_not_withhold.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_the_release_process_describes_itself.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_the_release_record_stays_well_formed.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_the_report_is_saved_not_sent.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_the_security_run_has_a_configurable_limit.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_the_security_work_order_is_drawn.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_the_suite_names_the_program_it_ran.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_the_tree_cannot_redirect_a_read.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_the_version_has_one_source.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_three_presentations.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_tool_resolution.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_tree_cannot_opt_the_host_in.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_tree_chosen_spawn.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_tree_reads_use_the_primitive.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_trends.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_type_fields_not_functions_class.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_uat_falsifiers.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_unanchored_set_matches_corpus.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_unread_code.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_user_config_tier.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_verification_audit_closures.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_verified_grade.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_version_claim.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_version_stamping.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_wheel_contents.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_withheld_work_keeps_its_boundary.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_work_items_state_their_own_finding.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_work_order.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_work_order_binds_to_this_interpreter.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_work_order_items.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_work_order_selection.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_workflow_supply_chain.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_write_boundary.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/tests/test_write_route_class.py +0 -0
- {maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/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.
|
|
3
|
+
Version: 4.2.0
|
|
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.
|
|
50
|
+
Version **4.2.0**.
|
|
51
51
|
|
|
52
52
|
> ## **Calibrated against 201 mature open-source repositories in fifteen languages.**
|
|
53
53
|
>
|
|
@@ -56,6 +56,11 @@ Version **4.1.0**.
|
|
|
56
56
|
> taste, each pinned to the exact commit it was measured at, so anyone can
|
|
57
57
|
> re-run the calibration and get the same numbers. The median of that corpus
|
|
58
58
|
> scores a **B**. [How the corpus is chosen and measured](docs/standard.md#the-reference-corpus).
|
|
59
|
+
>
|
|
60
|
+
> So your grade places your code against those 201: a **B** means you are at
|
|
61
|
+
> the median of mature, widely used open source. The corpus is re-measured
|
|
62
|
+
> whenever the instrument changes — in 4.1.0 every file of even the largest
|
|
63
|
+
> repositories was read, and the scale came back unchanged to four decimals.
|
|
59
64
|
|
|
60
65
|
**Languages parsed:** Python, Java, Kotlin, C, C++, C#, Go, Rust, PHP, Ruby,
|
|
61
66
|
Swift, Shell, COBOL, Fortran (free-form *and* fixed-form), and the JS/TS/HTML family — each
|
|
@@ -93,7 +98,10 @@ you what it could not measure.
|
|
|
93
98
|
**Install secure-code-agent for the security pillar.** Every audit runs it; it is
|
|
94
99
|
installed alongside rather than as a dependency, so the two tools release
|
|
95
100
|
independently. Without it the report says the security pillar was not measured
|
|
96
|
-
and gives this command.
|
|
101
|
+
and gives this command. A full security run can take several minutes on a
|
|
102
|
+
large repository; the audit waits up to 15 minutes for it, and
|
|
103
|
+
`security.timeout_seconds` in `maintainability-agent.json` changes that. Its
|
|
104
|
+
scanners decide what it can grade — see
|
|
97
105
|
[machine setup](docs/machine-setup.md#3-toolchain) for which to install, and
|
|
98
106
|
don't add its `[mcp]` extra to this environment (it pins `mcp<2`).
|
|
99
107
|
|
|
@@ -356,6 +364,11 @@ signals on:
|
|
|
356
364
|
- an ISO/IEC 25010-inspired 0–5 estimate per category, and a verified grade —
|
|
357
365
|
or a disclosed withholding when the evidence is thin.
|
|
358
366
|
|
|
367
|
+
**Large repositories are measured whole.** Every file is handed to the
|
|
368
|
+
analyzers, split across as many runs as the command line needs, so a big
|
|
369
|
+
codebase is read rather than sampled — FFmpeg's 4,687 files, not the first
|
|
370
|
+
1,543 that fitted on one command line before 4.1.0.
|
|
371
|
+
|
|
359
372
|
The analyzer is intentionally conservative and under-reports rather than
|
|
360
373
|
over-reports: an unrecognized declaration costs one missed finding, never a
|
|
361
374
|
cascade of false ones. Pair it with native tools (ESLint, Ruff, Radon, Semgrep,
|
|
@@ -496,7 +509,7 @@ instead of an invokable skill:
|
|
|
496
509
|
This repo ships `action.yml`, usable as a composite action:
|
|
497
510
|
|
|
498
511
|
```yaml
|
|
499
|
-
- uses: marshallguillory86/maintainability-agent@v4.
|
|
512
|
+
- uses: marshallguillory86/maintainability-agent@v4.2.0
|
|
500
513
|
with:
|
|
501
514
|
config: maintainability-agent.json
|
|
502
515
|
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.
|
|
8
|
+
Version **4.2.0**.
|
|
9
9
|
|
|
10
10
|
> ## **Calibrated against 201 mature open-source repositories in fifteen languages.**
|
|
11
11
|
>
|
|
@@ -14,6 +14,11 @@ Version **4.1.0**.
|
|
|
14
14
|
> taste, each pinned to the exact commit it was measured at, so anyone can
|
|
15
15
|
> re-run the calibration and get the same numbers. The median of that corpus
|
|
16
16
|
> scores a **B**. [How the corpus is chosen and measured](docs/standard.md#the-reference-corpus).
|
|
17
|
+
>
|
|
18
|
+
> So your grade places your code against those 201: a **B** means you are at
|
|
19
|
+
> the median of mature, widely used open source. The corpus is re-measured
|
|
20
|
+
> whenever the instrument changes — in 4.1.0 every file of even the largest
|
|
21
|
+
> repositories was read, and the scale came back unchanged to four decimals.
|
|
17
22
|
|
|
18
23
|
**Languages parsed:** Python, Java, Kotlin, C, C++, C#, Go, Rust, PHP, Ruby,
|
|
19
24
|
Swift, Shell, COBOL, Fortran (free-form *and* fixed-form), and the JS/TS/HTML family — each
|
|
@@ -51,7 +56,10 @@ you what it could not measure.
|
|
|
51
56
|
**Install secure-code-agent for the security pillar.** Every audit runs it; it is
|
|
52
57
|
installed alongside rather than as a dependency, so the two tools release
|
|
53
58
|
independently. Without it the report says the security pillar was not measured
|
|
54
|
-
and gives this command.
|
|
59
|
+
and gives this command. A full security run can take several minutes on a
|
|
60
|
+
large repository; the audit waits up to 15 minutes for it, and
|
|
61
|
+
`security.timeout_seconds` in `maintainability-agent.json` changes that. Its
|
|
62
|
+
scanners decide what it can grade — see
|
|
55
63
|
[machine setup](docs/machine-setup.md#3-toolchain) for which to install, and
|
|
56
64
|
don't add its `[mcp]` extra to this environment (it pins `mcp<2`).
|
|
57
65
|
|
|
@@ -314,6 +322,11 @@ signals on:
|
|
|
314
322
|
- an ISO/IEC 25010-inspired 0–5 estimate per category, and a verified grade —
|
|
315
323
|
or a disclosed withholding when the evidence is thin.
|
|
316
324
|
|
|
325
|
+
**Large repositories are measured whole.** Every file is handed to the
|
|
326
|
+
analyzers, split across as many runs as the command line needs, so a big
|
|
327
|
+
codebase is read rather than sampled — FFmpeg's 4,687 files, not the first
|
|
328
|
+
1,543 that fitted on one command line before 4.1.0.
|
|
329
|
+
|
|
317
330
|
The analyzer is intentionally conservative and under-reports rather than
|
|
318
331
|
over-reports: an unrecognized declaration costs one missed finding, never a
|
|
319
332
|
cascade of false ones. Pair it with native tools (ESLint, Ruff, Radon, Semgrep,
|
|
@@ -454,7 +467,7 @@ instead of an invokable skill:
|
|
|
454
467
|
This repo ships `action.yml`, usable as a composite action:
|
|
455
468
|
|
|
456
469
|
```yaml
|
|
457
|
-
- uses: marshallguillory86/maintainability-agent@v4.
|
|
470
|
+
- uses: marshallguillory86/maintainability-agent@v4.2.0
|
|
458
471
|
with:
|
|
459
472
|
config: maintainability-agent.json
|
|
460
473
|
changed-only: main...HEAD
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: maintainability-agent
|
|
3
|
-
Version: 4.
|
|
3
|
+
Version: 4.2.0
|
|
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.
|
|
50
|
+
Version **4.2.0**.
|
|
51
51
|
|
|
52
52
|
> ## **Calibrated against 201 mature open-source repositories in fifteen languages.**
|
|
53
53
|
>
|
|
@@ -56,6 +56,11 @@ Version **4.1.0**.
|
|
|
56
56
|
> taste, each pinned to the exact commit it was measured at, so anyone can
|
|
57
57
|
> re-run the calibration and get the same numbers. The median of that corpus
|
|
58
58
|
> scores a **B**. [How the corpus is chosen and measured](docs/standard.md#the-reference-corpus).
|
|
59
|
+
>
|
|
60
|
+
> So your grade places your code against those 201: a **B** means you are at
|
|
61
|
+
> the median of mature, widely used open source. The corpus is re-measured
|
|
62
|
+
> whenever the instrument changes — in 4.1.0 every file of even the largest
|
|
63
|
+
> repositories was read, and the scale came back unchanged to four decimals.
|
|
59
64
|
|
|
60
65
|
**Languages parsed:** Python, Java, Kotlin, C, C++, C#, Go, Rust, PHP, Ruby,
|
|
61
66
|
Swift, Shell, COBOL, Fortran (free-form *and* fixed-form), and the JS/TS/HTML family — each
|
|
@@ -93,7 +98,10 @@ you what it could not measure.
|
|
|
93
98
|
**Install secure-code-agent for the security pillar.** Every audit runs it; it is
|
|
94
99
|
installed alongside rather than as a dependency, so the two tools release
|
|
95
100
|
independently. Without it the report says the security pillar was not measured
|
|
96
|
-
and gives this command.
|
|
101
|
+
and gives this command. A full security run can take several minutes on a
|
|
102
|
+
large repository; the audit waits up to 15 minutes for it, and
|
|
103
|
+
`security.timeout_seconds` in `maintainability-agent.json` changes that. Its
|
|
104
|
+
scanners decide what it can grade — see
|
|
97
105
|
[machine setup](docs/machine-setup.md#3-toolchain) for which to install, and
|
|
98
106
|
don't add its `[mcp]` extra to this environment (it pins `mcp<2`).
|
|
99
107
|
|
|
@@ -356,6 +364,11 @@ signals on:
|
|
|
356
364
|
- an ISO/IEC 25010-inspired 0–5 estimate per category, and a verified grade —
|
|
357
365
|
or a disclosed withholding when the evidence is thin.
|
|
358
366
|
|
|
367
|
+
**Large repositories are measured whole.** Every file is handed to the
|
|
368
|
+
analyzers, split across as many runs as the command line needs, so a big
|
|
369
|
+
codebase is read rather than sampled — FFmpeg's 4,687 files, not the first
|
|
370
|
+
1,543 that fitted on one command line before 4.1.0.
|
|
371
|
+
|
|
359
372
|
The analyzer is intentionally conservative and under-reports rather than
|
|
360
373
|
over-reports: an unrecognized declaration costs one missed finding, never a
|
|
361
374
|
cascade of false ones. Pair it with native tools (ESLint, Ruff, Radon, Semgrep,
|
|
@@ -496,7 +509,7 @@ instead of an invokable skill:
|
|
|
496
509
|
This repo ships `action.yml`, usable as a composite action:
|
|
497
510
|
|
|
498
511
|
```yaml
|
|
499
|
-
- uses: marshallguillory86/maintainability-agent@v4.
|
|
512
|
+
- uses: marshallguillory86/maintainability-agent@v4.2.0
|
|
500
513
|
with:
|
|
501
514
|
config: maintainability-agent.json
|
|
502
515
|
changed-only: main...HEAD
|
|
@@ -157,6 +157,7 @@ tests/test_a_dangling_source_link_is_named_not_fatal.py
|
|
|
157
157
|
tests/test_a_format_override_is_disclosed.py
|
|
158
158
|
tests/test_a_matching_format_stays_silent.py
|
|
159
159
|
tests/test_a_published_question_offers_what_it_accepts.py
|
|
160
|
+
tests/test_a_rendered_docs_site_is_not_scored_as_source.py
|
|
160
161
|
tests/test_a_setup_question_keeps_its_contract.py
|
|
161
162
|
tests/test_acquisition_trust.py
|
|
162
163
|
tests/test_adapter_docs.py
|
|
@@ -276,6 +277,7 @@ tests/test_evidence_invariants.py
|
|
|
276
277
|
tests/test_evidence_normalization.py
|
|
277
278
|
tests/test_evidence_properties.py
|
|
278
279
|
tests/test_example_config_opens_claimed_languages.py
|
|
280
|
+
tests/test_exclude_additional_keeps_the_defaults.py
|
|
279
281
|
tests/test_exclusion_dialects.py
|
|
280
282
|
tests/test_exposure_never_outranks_band.py
|
|
281
283
|
tests/test_falsifier_standard.py
|
|
@@ -367,6 +369,7 @@ tests/test_python_declarations.py
|
|
|
367
369
|
tests/test_read_boundary.py
|
|
368
370
|
tests/test_readme_claims.py
|
|
369
371
|
tests/test_recurrence.py
|
|
372
|
+
tests/test_regular_file_reads_work_without_o_nonblock.py
|
|
370
373
|
tests/test_release_needs_an_empty_ledger.py
|
|
371
374
|
tests/test_release_plan.py
|
|
372
375
|
tests/test_release_plan_status.py
|
|
@@ -55,7 +55,9 @@ def open_regular_file(path: Path, why: str) -> int:
|
|
|
55
55
|
"""
|
|
56
56
|
import stat as stat_module
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
# Windows has no `O_NONBLOCK` and no POSIX FIFO in the tree to guard
|
|
59
|
+
# against; using the flag unconditionally killed every read there.
|
|
60
|
+
handle = os.open(path, os.O_RDONLY | getattr(os, "O_NONBLOCK", 0))
|
|
59
61
|
if not stat_module.S_ISREG(os.fstat(handle).st_mode):
|
|
60
62
|
os.close(handle)
|
|
61
63
|
raise PathNotAllowed(f"{path} is not a regular file. {why}")
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/config.py
RENAMED
|
@@ -161,12 +161,29 @@ def load_config(path: str | None) -> dict[str, Any]:
|
|
|
161
161
|
return config
|
|
162
162
|
config["analyzers"]["run"] = True
|
|
163
163
|
if user_tier is not None:
|
|
164
|
-
|
|
164
|
+
_merge_tier(config, user_tier)
|
|
165
165
|
if path:
|
|
166
|
-
|
|
166
|
+
_merge_tier(config, _host_authority_stripped(_configured(Path(path))))
|
|
167
167
|
return config
|
|
168
168
|
|
|
169
169
|
|
|
170
|
+
def _merge_tier(config: dict[str, Any], tier: dict[str, Any]) -> None:
|
|
171
|
+
"""One tier over the ones before it, with `exclude_additional` appended.
|
|
172
|
+
|
|
173
|
+
`deep_update` replaces lists, so setting `paths.exclude_patterns` to add
|
|
174
|
+
one directory discarded every default exclusion and froze a copy that
|
|
175
|
+
drifts on the next release (#292). `exclude_additional` adds to whatever
|
|
176
|
+
the earlier tiers produced instead, so a repository can add without
|
|
177
|
+
restating.
|
|
178
|
+
"""
|
|
179
|
+
added = list((tier.get("paths") or {}).get("exclude_additional") or [])
|
|
180
|
+
deep_update(config, tier)
|
|
181
|
+
paths = config["paths"]
|
|
182
|
+
paths.pop("exclude_additional", None)
|
|
183
|
+
paths["exclude_patterns"] = [*paths["exclude_patterns"],
|
|
184
|
+
*(p for p in added if p not in paths["exclude_patterns"])]
|
|
185
|
+
|
|
186
|
+
|
|
170
187
|
#: The one key a repository may state and this tool will not act on,
|
|
171
188
|
#: because acting on it runs a program of the tree's choosing on the host.
|
|
172
189
|
#: The whole leaf is dropped, not merged.
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"""A committed docs site rendered from Markdown is not scored as source (#292).
|
|
2
|
+
|
|
3
|
+
Every repository now commits an HTML site rendered from its Markdown, and
|
|
4
|
+
the audit scored it as source: each page duplicated its Markdown, so
|
|
5
|
+
duplicate blocks doubled; a debt marker in `README.md` was reported again in
|
|
6
|
+
`docs/html/readme.html`, where editing it is forbidden and re-rendering
|
|
7
|
+
reproduces it; and a long page drew "split along a real boundary" advice
|
|
8
|
+
with nobody to take it. secure-code-agent measured it: files 160 → 195,
|
|
9
|
+
duplicate blocks 22 → 44, risk findings 5 → 8, from the site alone.
|
|
10
|
+
|
|
11
|
+
Not a `docs/html/` exclusion: a directory-name rule is what ADR 010 rejected.
|
|
12
|
+
The renderer declares what it wrote, with the `@generated` banner discovery
|
|
13
|
+
already honours, and discovery does the rest for any repository whose
|
|
14
|
+
renderer says so.
|
|
15
|
+
"""
|
|
16
|
+
|
|
17
|
+
from __future__ import annotations
|
|
18
|
+
|
|
19
|
+
import importlib.util
|
|
20
|
+
from pathlib import Path
|
|
21
|
+
|
|
22
|
+
from maintainability_audit.config import load_config
|
|
23
|
+
from maintainability_audit.report import build_report
|
|
24
|
+
|
|
25
|
+
ROOT = Path(__file__).resolve().parents[1]
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def _renderer():
|
|
29
|
+
spec = importlib.util.spec_from_file_location("render_docs_under_test", ROOT / "tools" / "render_docs.py")
|
|
30
|
+
module = importlib.util.module_from_spec(spec)
|
|
31
|
+
spec.loader.exec_module(module)
|
|
32
|
+
return module
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def test_every_rendered_page_declares_itself_generated(tmp_path: Path) -> None:
|
|
36
|
+
out = tmp_path / "html"
|
|
37
|
+
_renderer().render(ROOT, out)
|
|
38
|
+
pages = sorted(out.glob("*.html"))
|
|
39
|
+
|
|
40
|
+
# `render` returns the Markdown sources, not the pages; reading the
|
|
41
|
+
# output directory is what makes this about what was written.
|
|
42
|
+
assert len(pages) > 10, "the renderer wrote too few pages; this test would pass vacuously"
|
|
43
|
+
unstamped = [p.name for p in pages
|
|
44
|
+
if "@generated" not in p.read_text(encoding="utf-8").splitlines()[0]]
|
|
45
|
+
assert unstamped == []
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def test_a_stamped_page_is_not_scored_beside_its_markdown(tmp_path: Path) -> None:
|
|
49
|
+
banner = _renderer().GENERATED_BANNER
|
|
50
|
+
(tmp_path / "README.md").write_text("# Title\n\nTODO: settle this.\n", encoding="utf-8")
|
|
51
|
+
(tmp_path / "docs" / "html").mkdir(parents=True)
|
|
52
|
+
(tmp_path / "docs" / "html" / "readme.html").write_text(
|
|
53
|
+
f"{banner}\n<!doctype html><html><body><p>TODO: settle this.</p></body></html>\n",
|
|
54
|
+
encoding="utf-8")
|
|
55
|
+
(tmp_path / "app.py").write_text("def f():\n return 1\n", encoding="utf-8")
|
|
56
|
+
|
|
57
|
+
report = build_report(tmp_path, load_config(None))
|
|
58
|
+
|
|
59
|
+
paths = {finding["path"] for finding in report["risk_findings"]}
|
|
60
|
+
assert "docs/html/readme.html" not in paths
|
|
61
|
+
assert "README.md" in paths
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"""`paths.exclude_additional` adds exclusions without discarding the defaults (#292).
|
|
2
|
+
|
|
3
|
+
`deep_update` merges dicts and *replaces* lists, so a repository that set
|
|
4
|
+
`paths.exclude_patterns` to skip one more directory silently discarded the
|
|
5
|
+
whole default list — `.git/`, `node_modules/`, `vendor/`, `*.min.js` and
|
|
6
|
+
whatever a later release adds — and froze a copy of it that drifts on the
|
|
7
|
+
next release. secure-code-agent declined to do that rather than add one
|
|
8
|
+
exclusion. `exclude_additional` appends to whatever the earlier tiers
|
|
9
|
+
produced, at each tier, so a repository can add without restating.
|
|
10
|
+
"""
|
|
11
|
+
|
|
12
|
+
from __future__ import annotations
|
|
13
|
+
|
|
14
|
+
import json
|
|
15
|
+
from pathlib import Path
|
|
16
|
+
|
|
17
|
+
import jsonschema
|
|
18
|
+
|
|
19
|
+
from maintainability_audit.config import load_config
|
|
20
|
+
from maintainability_audit.report import build_report
|
|
21
|
+
|
|
22
|
+
ROOT = Path(__file__).resolve().parents[1]
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
def _config_with(tmp_path: Path, paths: dict) -> str:
|
|
26
|
+
path = tmp_path / "maintainability-agent.json"
|
|
27
|
+
path.write_text(json.dumps({"version": 1, "paths": paths}), encoding="utf-8")
|
|
28
|
+
return str(path)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def test_additions_keep_every_default(tmp_path: Path) -> None:
|
|
32
|
+
defaults = load_config(None)["paths"]["exclude_patterns"]
|
|
33
|
+
|
|
34
|
+
merged = load_config(_config_with(tmp_path, {"exclude_additional": ["scratch/"]}))
|
|
35
|
+
|
|
36
|
+
assert merged["paths"]["exclude_patterns"] == [*defaults, "scratch/"]
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def test_an_addition_is_honoured_by_the_scan(tmp_path: Path) -> None:
|
|
40
|
+
(tmp_path / "app.py").write_text("def f():\n return 1\n", encoding="utf-8")
|
|
41
|
+
(tmp_path / "scratch").mkdir()
|
|
42
|
+
(tmp_path / "scratch" / "junk.py").write_text("def g():\n return 2\n", encoding="utf-8")
|
|
43
|
+
|
|
44
|
+
config = load_config(_config_with(tmp_path, {"exclude_additional": ["scratch/"]}))
|
|
45
|
+
report = build_report(tmp_path, config)
|
|
46
|
+
|
|
47
|
+
assert report["summary"]["files_scanned"] == 1
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def test_the_published_schema_accepts_it() -> None:
|
|
51
|
+
schema = json.loads((ROOT / "maintainability-agent.schema.json").read_text(encoding="utf-8"))
|
|
52
|
+
|
|
53
|
+
jsonschema.validate({"version": 1, "paths": {"exclude_additional": ["scratch/"]}}, schema)
|
|
@@ -391,3 +391,19 @@ def test_the_readme_opens_with_the_corpus_size_in_bold() -> None:
|
|
|
391
391
|
|
|
392
392
|
assert f"**Calibrated against {CORPUS_SIZE} mature open-source repositories" in opening
|
|
393
393
|
assert f"in {words.get(len(CORPUS_LANGUAGES), len(CORPUS_LANGUAGES))} languages" in opening
|
|
394
|
+
|
|
395
|
+
|
|
396
|
+
def test_the_readme_states_the_security_runs_actual_limit() -> None:
|
|
397
|
+
"""The README tells a reader how long the security run may take.
|
|
398
|
+
|
|
399
|
+
That sentence names a number the code owns, so it is held to
|
|
400
|
+
`DEFAULT_TIMEOUT_SECONDS` the way the corpus headline is held to
|
|
401
|
+
`CORPUS_SIZE`: a default raised in code cannot leave the README promising
|
|
402
|
+
the old one.
|
|
403
|
+
"""
|
|
404
|
+
from maintainability_audit._security_delegate import DEFAULT_TIMEOUT_SECONDS
|
|
405
|
+
|
|
406
|
+
readme = (ROOT / "README.md").read_text(encoding="utf-8")
|
|
407
|
+
|
|
408
|
+
assert f"up to {DEFAULT_TIMEOUT_SECONDS // 60} minutes" in readme
|
|
409
|
+
assert "security.timeout_seconds" in readme
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
"""Reading a regular file works on a platform with no `os.O_NONBLOCK`.
|
|
2
|
+
|
|
3
|
+
`open_regular_file` opens with `O_NONBLOCK` so a FIFO cannot hang the open
|
|
4
|
+
before the regular-file check runs. Windows has no such flag, and the module
|
|
5
|
+
used it unconditionally, so every read on the Windows probe died with
|
|
6
|
+
`module 'os' has no attribute 'O_NONBLOCK'`. Windows has no POSIX FIFO in
|
|
7
|
+
the tree to guard against, so where the flag does not exist the open goes
|
|
8
|
+
without it; the check that follows is unchanged.
|
|
9
|
+
"""
|
|
10
|
+
|
|
11
|
+
from __future__ import annotations
|
|
12
|
+
|
|
13
|
+
import os
|
|
14
|
+
from pathlib import Path
|
|
15
|
+
|
|
16
|
+
from maintainability_audit._operator_reads import open_regular_file
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def test_a_regular_file_opens_where_the_flag_does_not_exist(tmp_path: Path, monkeypatch) -> None:
|
|
20
|
+
target = tmp_path / "config.json"
|
|
21
|
+
target.write_text("{}", encoding="utf-8")
|
|
22
|
+
monkeypatch.delattr(os, "O_NONBLOCK")
|
|
23
|
+
|
|
24
|
+
handle = open_regular_file(target, "test")
|
|
25
|
+
try:
|
|
26
|
+
assert os.read(handle, 10) == b"{}"
|
|
27
|
+
finally:
|
|
28
|
+
os.close(handle)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/__main__.py
RENAMED
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_adapters.py
RENAMED
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_analysis.py
RENAMED
|
File without changes
|
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_anchor.py
RENAMED
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_arguments.py
RENAMED
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_aspects.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_backfill.py
RENAMED
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_bands.py
RENAMED
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_banner.py
RENAMED
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_built_ins.py
RENAMED
|
File without changes
|
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_catalog.py
RENAMED
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_charts.py
RENAMED
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_cognitive.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_derive.py
RENAMED
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_discovery.py
RENAMED
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_documents.py
RENAMED
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_economics.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_first_run.py
RENAMED
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_formula.py
RENAMED
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_gates.py
RENAMED
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_generic.py
RENAMED
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_grammar.py
RENAMED
|
File without changes
|
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_handoff.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_hotspots.py
RENAMED
|
File without changes
|
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_html_view.py
RENAMED
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_identity.py
RENAMED
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_in_loop.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_masking.py
RENAMED
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_mcp_audit.py
RENAMED
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_mcp_gate.py
RENAMED
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_mcp_grants.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_mcp_setup.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_oracle.py
RENAMED
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_pillars.py
RENAMED
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_practice.py
RENAMED
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_precommit.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_pressures.py
RENAMED
|
File without changes
|
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_ranges_c.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{maintainability_agent-4.1.0 → maintainability_agent-4.2.0}/src/maintainability_audit/_ranges_cpp.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|