maintainability-agent 3.0.1__tar.gz → 3.0.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.
Files changed (358) hide show
  1. {maintainability_agent-3.0.1/src/maintainability_agent.egg-info → maintainability_agent-3.0.2}/PKG-INFO +2 -2
  2. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/README.md +1 -1
  3. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/pyproject.toml +1 -1
  4. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2/src/maintainability_agent.egg-info}/PKG-INFO +2 -2
  5. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_agent.egg-info/SOURCES.txt +1 -0
  6. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/__init__.py +1 -1
  7. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_runner.py +31 -4
  8. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/config.py +1 -1
  9. maintainability_agent-3.0.2/tests/test_tool_resolution.py +166 -0
  10. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/LICENSE +0 -0
  11. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/setup.cfg +0 -0
  12. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_agent.egg-info/dependency_links.txt +0 -0
  13. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_agent.egg-info/entry_points.txt +0 -0
  14. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_agent.egg-info/requires.txt +0 -0
  15. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_agent.egg-info/top_level.txt +0 -0
  16. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/__main__.py +0 -0
  17. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_adapters.py +0 -0
  18. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_analysis.py +0 -0
  19. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_analyzer_sections.py +0 -0
  20. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_anchor.py +0 -0
  21. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_arguments.py +0 -0
  22. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_aspects.py +0 -0
  23. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_assets/analyzer-catalog.json +0 -0
  24. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_assets/standard.md +0 -0
  25. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_attestation.py +0 -0
  26. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_backfill.py +0 -0
  27. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_bands.py +0 -0
  28. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_banner.py +0 -0
  29. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_built_ins.py +0 -0
  30. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_calibration.py +0 -0
  31. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_catalog.py +0 -0
  32. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_charts.py +0 -0
  33. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_cognitive.py +0 -0
  34. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_config_defaults.py +0 -0
  35. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_conformance.py +0 -0
  36. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_corroborate.py +0 -0
  37. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_coverage_notes.py +0 -0
  38. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_criteria_scope.py +0 -0
  39. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_derive.py +0 -0
  40. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_discovery.py +0 -0
  41. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_documents.py +0 -0
  42. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_economics.py +0 -0
  43. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_economics_view.py +0 -0
  44. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_environment.py +0 -0
  45. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_evidence_view.py +0 -0
  46. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_finding_match.py +0 -0
  47. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_first_run.py +0 -0
  48. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_formula.py +0 -0
  49. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_gates.py +0 -0
  50. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_generic.py +0 -0
  51. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_grant_ledger.py +0 -0
  52. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_history_view.py +0 -0
  53. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_hostile_prompt.py +0 -0
  54. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_hotspots.py +0 -0
  55. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_html_report_sections.py +0 -0
  56. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_html_view.py +0 -0
  57. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_identity.py +0 -0
  58. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_in_loop.py +0 -0
  59. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_in_loop_view.py +0 -0
  60. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_jvm_adapters.py +0 -0
  61. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_markdown_sections.py +0 -0
  62. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_masking.py +0 -0
  63. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_mcp_audit.py +0 -0
  64. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_mcp_gate.py +0 -0
  65. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_mcp_grants.py +0 -0
  66. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_mcp_refusals.py +0 -0
  67. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_mcp_resources.py +0 -0
  68. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_mcp_setup.py +0 -0
  69. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_metric_adapters.py +0 -0
  70. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_metrics_types.py +0 -0
  71. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_operator_reads.py +0 -0
  72. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_pillars.py +0 -0
  73. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_practice.py +0 -0
  74. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_precommit.py +0 -0
  75. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_precommit_install.py +0 -0
  76. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_precommit_view.py +0 -0
  77. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_pressures.py +0 -0
  78. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_ranges_c.py +0 -0
  79. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_ranges_cobol.py +0 -0
  80. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_ranges_core.py +0 -0
  81. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_ranges_cpp.py +0 -0
  82. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_ranges_csharp.py +0 -0
  83. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_ranges_fortran.py +0 -0
  84. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_ranges_go.py +0 -0
  85. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_ranges_java.py +0 -0
  86. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_ranges_js.py +0 -0
  87. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_ranges_php.py +0 -0
  88. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_ranges_ruby.py +0 -0
  89. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_ranges_rust.py +0 -0
  90. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_ranges_swift.py +0 -0
  91. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_ratchet.py +0 -0
  92. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_recurrence.py +0 -0
  93. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_run_comparison.py +0 -0
  94. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_safe_write.py +0 -0
  95. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_scan_history.py +0 -0
  96. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_scan_view.py +0 -0
  97. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_second_source.py +0 -0
  98. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_selection.py +0 -0
  99. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_semantic.py +0 -0
  100. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_semantic_policy.py +0 -0
  101. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_semantic_ts.py +0 -0
  102. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_semantic_view.py +0 -0
  103. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_setup_errors.py +0 -0
  104. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_setup_persist.py +0 -0
  105. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_skill_data/SKILL.md +0 -0
  106. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_skill_data/agents/anthropic.yaml +0 -0
  107. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_skill_data/agents/copilot.yaml +0 -0
  108. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_skill_data/agents/openai.yaml +0 -0
  109. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_skill_data/copilot/maintainability-agent.prompt.md +0 -0
  110. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_skill_data/references/finding-taxonomy.md +0 -0
  111. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_skill_install.py +0 -0
  112. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_stored_grants.py +0 -0
  113. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_tdd_view.py +0 -0
  114. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_test_commands.py +0 -0
  115. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_test_execution.py +0 -0
  116. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_test_pairing.py +0 -0
  117. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_tokens.py +0 -0
  118. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_tool_adapters.py +0 -0
  119. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_trends.py +0 -0
  120. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_user_config.py +0 -0
  121. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_verdict_adapters.py +0 -0
  122. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_verification.py +0 -0
  123. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_work_order.py +0 -0
  124. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_work_order_view.py +0 -0
  125. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_work_order_weights.py +0 -0
  126. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/_xml.py +0 -0
  127. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/baseline.py +0 -0
  128. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/cli.py +0 -0
  129. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/deadcode.py +0 -0
  130. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/declarations.py +0 -0
  131. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/duplication.py +0 -0
  132. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/evidence.py +0 -0
  133. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/git_tools.py +0 -0
  134. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/history.py +0 -0
  135. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/idioms.py +0 -0
  136. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/instructions.py +0 -0
  137. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/mcp_server.py +0 -0
  138. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/metrics.py +0 -0
  139. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/prompts.py +0 -0
  140. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/renderers.py +0 -0
  141. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/report.py +0 -0
  142. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/sarif.py +0 -0
  143. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/scoring.py +0 -0
  144. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/similarity.py +0 -0
  145. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/src/maintainability_audit/source.py +0 -0
  146. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_acquisition_trust.py +0 -0
  147. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_adapter_docs.py +0 -0
  148. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_adapter_recordings.py +0 -0
  149. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_adapters.py +0 -0
  150. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_added_lines.py +0 -0
  151. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_analysis_coverage.py +0 -0
  152. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_analysis_execution.py +0 -0
  153. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_analyzer_bridge.py +0 -0
  154. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_analyzer_config_isolation.py +0 -0
  155. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_analyzer_estimate_claims.py +0 -0
  156. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_analyzer_pinning.py +0 -0
  157. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_analyzer_primary_estimate.py +0 -0
  158. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_analyzer_provenance.py +0 -0
  159. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_analyzer_provenance_exclusions.py +0 -0
  160. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_analyzer_scoring_path.py +0 -0
  161. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_analyzer_spread_range.py +0 -0
  162. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_analyzer_xml_bounds.py +0 -0
  163. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_anchor_and_mode.py +0 -0
  164. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_anchor_disclosure.py +0 -0
  165. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_annotations_match_behaviour.py +0 -0
  166. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_anticipated_refusals.py +0 -0
  167. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_architecture.py +0 -0
  168. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_artifact_write_route_class.py +0 -0
  169. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_aspect_coverage.py +0 -0
  170. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_asset_snapshot_class.py +0 -0
  171. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_ast_reading_resolves_spellings.py +0 -0
  172. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_attestation.py +0 -0
  173. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_audit_components.py +0 -0
  174. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_authorization_freshness.py +0 -0
  175. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_authorship_gates.py +0 -0
  176. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_backfill.py +0 -0
  177. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_band_concealment_class.py +0 -0
  178. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_band_concealment_p3.py +0 -0
  179. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_band_pressures.py +0 -0
  180. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_bands.py +0 -0
  181. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_body_or_signature_class.py +0 -0
  182. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_c_declarations.py +0 -0
  183. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_calibration_corpus.py +0 -0
  184. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_calibration_drift.py +0 -0
  185. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_calibration_tooling.py +0 -0
  186. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_catalog_selection.py +0 -0
  187. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_catalog_tier_promise.py +0 -0
  188. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_chat_primary_docs.py +0 -0
  189. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_checkstyle_adapter.py +0 -0
  190. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_checkstyle_catalog.py +0 -0
  191. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_ci_history_recipe.py +0 -0
  192. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_ci_installs_the_analyzer_pool.py +0 -0
  193. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_claimed_languages.py +0 -0
  194. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_cli.py +0 -0
  195. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_clone_group_class.py +0 -0
  196. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_cobol_declarations.py +0 -0
  197. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_cognitive_complexity.py +0 -0
  198. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_cohort_statistics.py +0 -0
  199. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_concealment_properties.py +0 -0
  200. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_config_shape.py +0 -0
  201. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_consent_and_grant.py +0 -0
  202. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_consumer_migration.py +0 -0
  203. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_contract_claims.py +0 -0
  204. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_corroborate.py +0 -0
  205. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_coverage_by_language.py +0 -0
  206. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_cpp_declarations.py +0 -0
  207. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_criteria_completion.py +0 -0
  208. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_csharp_declarations.py +0 -0
  209. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_d15_composition.py +0 -0
  210. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_d15_goal_directed.py +0 -0
  211. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_dead_code.py +0 -0
  212. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_declaration_criteria_scope.py +0 -0
  213. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_declaration_edge_cases.py +0 -0
  214. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_declaration_grading.py +0 -0
  215. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_declaration_ranges.py +0 -0
  216. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_declaration_source.py +0 -0
  217. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_declared_authorship.py +0 -0
  218. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_declared_imports.py +0 -0
  219. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_derivation_mix.py +0 -0
  220. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_determinism.py +0 -0
  221. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_dimension_ratchet.py +0 -0
  222. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_direct_runner_availability_class.py +0 -0
  223. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_discovery.py +0 -0
  224. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_doc_claims.py +0 -0
  225. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_docs_links.py +0 -0
  226. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_economic_context.py +0 -0
  227. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_empty_output_not_clean.py +0 -0
  228. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_empty_output_not_clean_adapters.py +0 -0
  229. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_environment_work_order.py +0 -0
  230. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_evidence_invariants.py +0 -0
  231. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_evidence_normalization.py +0 -0
  232. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_evidence_properties.py +0 -0
  233. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_exclusion_dialects.py +0 -0
  234. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_falsifier_standard.py +0 -0
  235. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_file_list_cap_class.py +0 -0
  236. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_finding_identity.py +0 -0
  237. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_first_run_elicitation.py +0 -0
  238. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_first_run_prompt.py +0 -0
  239. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_first_run_reelicitation.py +0 -0
  240. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_fix_breadth_window.py +0 -0
  241. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_fixed_form_fortran.py +0 -0
  242. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_format_ask.py +0 -0
  243. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_fortran_declarations.py +0 -0
  244. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_fortran_metrics.py +0 -0
  245. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_fortran_practice.py +0 -0
  246. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_git_argv.py +0 -0
  247. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_git_read_only.py +0 -0
  248. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_git_readonly_class.py +0 -0
  249. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_go_declarations.py +0 -0
  250. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_grammar_constructs.py +0 -0
  251. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_grammar_token_coverage.py +0 -0
  252. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_grant_only_user_tier.py +0 -0
  253. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_history.py +0 -0
  254. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_history_boundary.py +0 -0
  255. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_history_manifest.py +0 -0
  256. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_history_schema2.py +0 -0
  257. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_history_window.py +0 -0
  258. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_hostile_prompt.py +0 -0
  259. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_html_executive.py +0 -0
  260. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_html_section_parity_class.py +0 -0
  261. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_identity_docs.py +0 -0
  262. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_identity_resolution.py +0 -0
  263. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_idiom_divergence.py +0 -0
  264. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_in_loop_budgets.py +0 -0
  265. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_in_loop_check.py +0 -0
  266. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_installed_wheel_runtime.py +0 -0
  267. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_instruction_targets.py +0 -0
  268. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_java_range_guard.py +0 -0
  269. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_java_ranges.py +0 -0
  270. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_java_scored.py +0 -0
  271. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_java_wiring.py +0 -0
  272. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_js_complexity_operators.py +0 -0
  273. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_js_declarations.py +0 -0
  274. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_language_coverage.py +0 -0
  275. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_language_support_honesty.py +0 -0
  276. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_mcp_baseline_payload.py +0 -0
  277. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_mcp_history.py +0 -0
  278. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_mcp_server.py +0 -0
  279. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_migration_1_0.py +0 -0
  280. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_near_duplicates.py +0 -0
  281. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_network_disclosure.py +0 -0
  282. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_one_setup_across_surfaces_class.py +0 -0
  283. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_operator_named_paths.py +0 -0
  284. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_operator_named_reads.py +0 -0
  285. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_pattern_budget.py +0 -0
  286. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_phase6_claims.py +0 -0
  287. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_php_declarations.py +0 -0
  288. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_pillars_and_practice.py +0 -0
  289. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_platform_claim.py +0 -0
  290. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_pmd_adapter.py +0 -0
  291. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_pmd_audit_closures.py +0 -0
  292. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_policy_claims.py +0 -0
  293. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_pool_runs_by_config.py +0 -0
  294. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_population_floors.py +0 -0
  295. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_practice_nested_gates_class.py +0 -0
  296. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_precommit_staged.py +0 -0
  297. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_presentation_refusals.py +0 -0
  298. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_promises.py +0 -0
  299. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_prompt_escalation_once.py +0 -0
  300. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_prompt_honesty.py +0 -0
  301. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_prompt_location_escalation_class.py +0 -0
  302. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_prove_falsifiers.py +0 -0
  303. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_python_complexity.py +0 -0
  304. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_python_declarations.py +0 -0
  305. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_read_boundary.py +0 -0
  306. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_readme_claims.py +0 -0
  307. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_recurrence.py +0 -0
  308. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_release_plan.py +0 -0
  309. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_release_plan_status.py +0 -0
  310. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_report_remedy_copy.py +0 -0
  311. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_roles_recorded.py +0 -0
  312. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_root_grants.py +0 -0
  313. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_rubric_ignores_project_lint_config.py +0 -0
  314. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_ruby_declarations.py +0 -0
  315. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_run_comparison.py +0 -0
  316. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_runner.py +0 -0
  317. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_rust_declarations.py +0 -0
  318. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_sarif.py +0 -0
  319. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_scan_history.py +0 -0
  320. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_scan_scope.py +0 -0
  321. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_scanner_unsafe_direction.py +0 -0
  322. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_scanning.py +0 -0
  323. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_schema_fidelity.py +0 -0
  324. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_scope_conformance.py +0 -0
  325. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_scoring_calibration.py +0 -0
  326. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_semantic_policy.py +0 -0
  327. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_setup_gate_completeness.py +0 -0
  328. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_setup_gate_independent_contract.py +0 -0
  329. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_setup_precondition.py +0 -0
  330. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_skill_install.py +0 -0
  331. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_sonar_resolve.py +0 -0
  332. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_source_index.py +0 -0
  333. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_spotbugs_adapter.py +0 -0
  334. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_spotbugs_catalog.py +0 -0
  335. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_stage8_contract.py +0 -0
  336. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_suite_isolation.py +0 -0
  337. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_swift_declarations.py +0 -0
  338. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_tdd_structure.py +0 -0
  339. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_test_commands.py +0 -0
  340. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_test_execution_class.py +0 -0
  341. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_three_presentations.py +0 -0
  342. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_tree_chosen_spawn.py +0 -0
  343. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_trends.py +0 -0
  344. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_type_fields_not_functions_class.py +0 -0
  345. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_uat_falsifiers.py +0 -0
  346. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_unread_code.py +0 -0
  347. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_user_config_tier.py +0 -0
  348. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_verification_audit_closures.py +0 -0
  349. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_verified_grade.py +0 -0
  350. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_version_claim.py +0 -0
  351. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_wheel_contents.py +0 -0
  352. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_work_order.py +0 -0
  353. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_work_order_items.py +0 -0
  354. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_work_order_selection.py +0 -0
  355. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_workflow_supply_chain.py +0 -0
  356. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_write_boundary.py +0 -0
  357. {maintainability_agent-3.0.1 → maintainability_agent-3.0.2}/tests/test_write_route_class.py +0 -0
  358. {maintainability_agent-3.0.1 → maintainability_agent-3.0.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: 3.0.1
3
+ Version: 3.0.2
4
4
  Summary: Maintainability gate and AI remediation prompt generator for CI.
5
5
  Author: Marshall Guillory
6
6
  License: MIT
@@ -45,7 +45,7 @@ Dynamic: license-file
45
45
  **A deterministic, offline maintainability audit whose output is a _bounded
46
46
  work order_ for an AI coding agent** — a copy-paste prompt, per finding, that
47
47
  says *fix exactly these and refactor nothing else*. Chat-primary; CLI for CI.
48
- Version **3.0.1**.
48
+ Version **3.0.2**.
49
49
 
50
50
  **Planned, not shipped:** the audit tool will become `maintainability-audit`;
51
51
  a new `maintainability-agent` companion will run it and automate human-selected
@@ -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 **3.0.1**.
8
+ Version **3.0.2**.
9
9
 
10
10
  **Planned, not shipped:** the audit tool will become `maintainability-audit`;
11
11
  a new `maintainability-agent` companion will run it and automate human-selected
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "maintainability-agent"
7
- version = "3.0.1"
7
+ version = "3.0.2"
8
8
  description = "Maintainability gate and AI remediation prompt generator for CI."
9
9
  readme = "README.md"
10
10
  # 3.11, not 3.10. `_discovery`, `_pillars` and `_runner` all import
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: maintainability-agent
3
- Version: 3.0.1
3
+ Version: 3.0.2
4
4
  Summary: Maintainability gate and AI remediation prompt generator for CI.
5
5
  Author: Marshall Guillory
6
6
  License: MIT
@@ -45,7 +45,7 @@ Dynamic: license-file
45
45
  **A deterministic, offline maintainability audit whose output is a _bounded
46
46
  work order_ for an AI coding agent** — a copy-paste prompt, per finding, that
47
47
  says *fix exactly these and refactor nothing else*. Chat-primary; CLI for CI.
48
- Version **3.0.1**.
48
+ Version **3.0.2**.
49
49
 
50
50
  **Planned, not shipped:** the audit tool will become `maintainability-audit`;
51
51
  a new `maintainability-agent` companion will run it and automate human-selected
@@ -336,6 +336,7 @@ tests/test_tdd_structure.py
336
336
  tests/test_test_commands.py
337
337
  tests/test_test_execution_class.py
338
338
  tests/test_three_presentations.py
339
+ tests/test_tool_resolution.py
339
340
  tests/test_tree_chosen_spawn.py
340
341
  tests/test_trends.py
341
342
  tests/test_type_fields_not_functions_class.py
@@ -1,3 +1,3 @@
1
1
  """Maintainability Audit CI."""
2
2
 
3
- __version__ = "3.0.1"
3
+ __version__ = "3.0.2"
@@ -32,8 +32,10 @@ import re
32
32
  import shutil
33
33
  import subprocess
34
34
  import sys
35
+ import sysconfig
35
36
  import tempfile
36
37
  import time
38
+ from contextlib import suppress
37
39
  from dataclasses import dataclass, field
38
40
  from enum import StrEnum
39
41
  from pathlib import Path
@@ -137,13 +139,38 @@ def locate(executable: str) -> str | None:
137
139
  `maintainability-audit --analyzers` finds almost nothing and reports
138
140
  an honest but useless "not installed" for every one of them.
139
141
  """
140
- own_bin = Path(sys.executable).parent
141
- candidate = own_bin / executable
142
- if candidate.is_file():
143
- return str(candidate)
142
+ for directory in _agent_script_dirs():
143
+ candidate = directory / executable
144
+ if candidate.is_file():
145
+ return str(candidate)
144
146
  return shutil.which(executable)
145
147
 
146
148
 
149
+ def _agent_script_dirs() -> tuple[Path, ...]:
150
+ """Where this interpreter's console scripts land, in precedence order.
151
+
152
+ Two directories, because `pip install lizard` writes to a different
153
+ one depending on whether the agent lives in a virtualenv. In a venv
154
+ it is the interpreter's own `bin`. On a **system** Python it is the
155
+ per-user scripts directory, because the framework directory is not
156
+ writable and pip falls back to `--user` — on macOS that is
157
+ `~/Library/Python/3.11/bin`, which is not on the default `PATH`.
158
+
159
+ Searching only the first was D142. A user followed the environment
160
+ work order's own instruction, ran `pip install lizard`, and the next
161
+ audit still reported it "not installed or not on PATH" — because it
162
+ was installed exactly where neither this function nor `PATH` looked.
163
+ The whole Python pool went missing that way on the MCP surface, so
164
+ `declarations` fell to the built-in tier while the report's own
165
+ remedy could not fix it.
166
+ """
167
+ directories = [Path(sys.executable).parent]
168
+ with suppress(Exception):
169
+ scheme = sysconfig.get_preferred_scheme("user")
170
+ directories.append(Path(sysconfig.get_path("scripts", scheme=scheme)))
171
+ return tuple(directories)
172
+
173
+
147
174
  # Variables that make an interpreter or a linter load code from
148
175
  # somewhere the operator did not choose. `PYTHONPATH` and `NODE_PATH`
149
176
  # put a directory on an import path; `PYTHONSTARTUP` names a file
@@ -20,7 +20,7 @@ from ._operator_reads import (
20
20
  # still the door every caller comes through.
21
21
  __all__ = ["DEFAULT_CONFIG", "DEFAULT_IDIOM_GROUPS", "PROJECT_URL", "VERSION"]
22
22
 
23
- VERSION = "3.0.1"
23
+ VERSION = "3.0.2"
24
24
 
25
25
  PROJECT_URL = "https://github.com/marshallguillory86/maintainability-agent"
26
26
 
@@ -0,0 +1,166 @@
1
+ """Finding a tool the operator installed the way we told them to — D142.
2
+
3
+ `locate` searched the interpreter's own `bin` and then `PATH`. That is
4
+ correct for a virtualenv, where `pip install lizard` writes beside the
5
+ interpreter. It is wrong for a **system** Python: the framework
6
+ directory is not writable, pip falls back to `--user`, and the console
7
+ script lands in the per-user scripts directory — on macOS
8
+ `~/Library/Python/3.11/bin`, which is on neither list and not on the
9
+ default `PATH`.
10
+
11
+ So the environment work order told an operator to run `pip install
12
+ lizard`, they ran it, and the next audit still reported the tool "not
13
+ installed or not on PATH". The remedy the product prescribes could not
14
+ fix the problem the product reports.
15
+
16
+ Found by running the audit against this repository through the MCP
17
+ server, the surface product intent calls primary. Nine analyzers were
18
+ invisible — the whole Python pool, `lizard` and `complexipy` among them
19
+ — so `declarations` fell to the built-in tier. The scan still passed its
20
+ gate and reported a **better** grade than the same scan with the pool
21
+ visible: B against C. A fallback that scores higher than the truth is
22
+ the worst direction for a silent failure, because nothing in the result
23
+ asks to be looked at.
24
+ """
25
+ from __future__ import annotations
26
+
27
+ import stat
28
+ import sysconfig
29
+ from pathlib import Path
30
+ from types import SimpleNamespace
31
+
32
+ import pytest
33
+
34
+ from maintainability_audit import _runner
35
+
36
+
37
+ def _fake_tool(directory: Path, name: str) -> Path:
38
+ directory.mkdir(parents=True, exist_ok=True)
39
+ script = directory / name
40
+ script.write_text("#!/bin/sh\nexit 0\n", encoding="utf-8")
41
+ script.chmod(script.stat().st_mode | stat.S_IEXEC)
42
+ return script
43
+
44
+
45
+ @pytest.fixture
46
+ def isolated(tmp_path: Path, monkeypatch: pytest.MonkeyPatch):
47
+ """Point every place `locate` looks at an empty directory.
48
+
49
+ Each test then puts the tool in exactly one of them, so what is being
50
+ asserted is the lookup and not the machine. Without this the tests
51
+ passed here and failed in CI: the runner installs the analyzer pool
52
+ beside its interpreter, so `own_bin` answered first and the fixture
53
+ directories were never reached. A test that agrees with the
54
+ environment it happens to run in cannot say which directory the code
55
+ actually searched.
56
+ """
57
+ own_bin = tmp_path / "interpreter" / "bin"
58
+ user_scripts = tmp_path / "user-base" / "bin"
59
+ on_path = tmp_path / "opt" / "bin"
60
+ for directory in (own_bin, user_scripts, on_path):
61
+ directory.mkdir(parents=True, exist_ok=True)
62
+
63
+ monkeypatch.setattr(_runner.sys, "executable", str(own_bin / "python3"))
64
+ monkeypatch.setenv("PATH", str(on_path))
65
+ monkeypatch.setattr(
66
+ sysconfig, "get_path",
67
+ lambda name, scheme=None, **kw: (
68
+ str(user_scripts) if name == "scripts" else sysconfig.get_paths()[name]
69
+ ),
70
+ )
71
+ return SimpleNamespace(own_bin=own_bin, user_scripts=user_scripts, on_path=on_path)
72
+
73
+
74
+ def test_a_tool_in_the_user_scripts_directory_is_found(isolated) -> None:
75
+ """The case `pip install <tool>` actually produces on a system Python.
76
+
77
+ Neither beside the interpreter nor on `PATH`, because that is
78
+ precisely the combination that made the whole Python pool invisible
79
+ on the MCP surface.
80
+ """
81
+ _fake_tool(isolated.user_scripts, "lizard")
82
+
83
+ found = _runner.locate("lizard")
84
+
85
+ assert found is not None, (
86
+ "a tool installed by `pip install lizard` on a system Python was not "
87
+ "found; that is where pip puts it and it is on neither the "
88
+ "interpreter's bin nor PATH"
89
+ )
90
+ assert Path(found) == isolated.user_scripts / "lizard"
91
+
92
+
93
+ def test_the_interpreters_own_bin_still_wins(isolated) -> None:
94
+ """Covers existing behaviour: the venv co-install keeps precedence.
95
+
96
+ It passes at the base — own-bin was already searched first — and is
97
+ here because the D142 fix appends a second directory. Appending it
98
+ ahead of `own_bin` would silently prefer a stale user-site copy over
99
+ the pinned one shipped beside the agent, which is the version-drift
100
+ the analyzer pinning exists to prevent.
101
+ """
102
+ _fake_tool(isolated.own_bin, "lizard")
103
+ _fake_tool(isolated.user_scripts, "lizard")
104
+
105
+ assert Path(_runner.locate("lizard")) == isolated.own_bin / "lizard"
106
+
107
+
108
+ def test_path_is_still_searched_when_neither_script_dir_has_it(isolated) -> None:
109
+ """Covers existing behaviour: `PATH` remains the last resort.
110
+
111
+ Passes at the base. It is here because the fix changed the shape of
112
+ the lookup from two steps to a loop plus a fallback, and dropping the
113
+ fallback would strand every tool an operator installed with homebrew
114
+ or a system package manager — `jscpd` and `pmd` on this machine.
115
+ """
116
+ _fake_tool(isolated.on_path, "pmd")
117
+
118
+ assert Path(_runner.locate("pmd")) == isolated.on_path / "pmd"
119
+
120
+
121
+ def test_a_missing_tool_is_still_reported_missing(isolated) -> None:
122
+ """Covers existing behaviour: absence is still absence.
123
+
124
+ Passes at the base, and pins the direction the fix must not move.
125
+ Widening the search until something is always found would turn "not
126
+ installed" into a false positive, which is worse than the defect —
127
+ the work order would name a tool that cannot run.
128
+ """
129
+ assert _runner.locate("a-tool-that-does-not-exist") is None
130
+
131
+
132
+ def test_a_broken_user_scheme_does_not_break_resolution(
133
+ isolated, monkeypatch: pytest.MonkeyPatch
134
+ ) -> None:
135
+ """Covers existing behaviour: `PATH` resolution survives sysconfig.
136
+
137
+ `get_preferred_scheme("user")` is interpreter-dependent and can raise
138
+ on an unusual install. It is wrapped, because a tool the operator has
139
+ on `PATH` must not become unfindable due to a lookup that exists only
140
+ to find a *different* directory.
141
+ """
142
+ _fake_tool(isolated.on_path, "radon")
143
+
144
+ def explode(*_args: object, **_kwargs: object) -> str:
145
+ raise KeyError("no such scheme")
146
+
147
+ monkeypatch.setattr(sysconfig, "get_preferred_scheme", explode)
148
+
149
+ assert Path(_runner.locate("radon")) == isolated.on_path / "radon"
150
+
151
+
152
+ def test_the_agents_script_dirs_are_real_directories_not_guesses() -> None:
153
+ """Whatever is searched must come from this interpreter, not a list.
154
+
155
+ A hardcoded `~/Library/Python/3.11/bin` would be right on one machine
156
+ and wrong on every other Python version and platform. Both entries
157
+ are derived: one from `sys.executable`, one from `sysconfig`.
158
+ """
159
+ directories = _runner._agent_script_dirs()
160
+
161
+ assert directories, "no script directory is searched at all"
162
+ assert directories[0] == Path(_runner.sys.executable).parent
163
+ assert all(isinstance(d, Path) for d in directories)
164
+ assert len(set(directories)) == len(directories), (
165
+ f"the same directory is searched twice: {directories}"
166
+ )