2828 format_calibration_markdown ,
2929 run_calibration_manifest ,
3030)
31- from .codemod import CodemodCandidate , codemod_candidates_from_impact_ranking
31+ from .codemod import (
32+ CodemodCandidate ,
33+ codemod_candidates_from_impact_ranking ,
34+ codemod_candidates_with_automated_rewrites ,
35+ )
3236from .detectors import DetectorConfig
3337from .economics import (
3438 EconomicsProofReport ,
@@ -276,6 +280,11 @@ def _json_payload(
276280 impact_ranking ,
277281 source_index ,
278282 )
283+ codemod_candidates = codemod_candidates_with_automated_rewrites (
284+ codemod_candidates ,
285+ source_index ,
286+ {str (module .path ): module .source for module in modules },
287+ )
279288 if codemod_candidates is not None :
280289 payload ["codemod_candidates" ] = tuple (
281290 candidate .to_dict () for candidate in codemod_candidates
@@ -484,6 +493,9 @@ def format_codemod_applicability_markdown(
484493 for candidate in candidates
485494 )
486495 )
496+ safe_count = sum (
497+ (candidate .applicability .safe_to_apply for candidate in candidates )
498+ )
487499 ready_count = sum (
488500 (
489501 candidate .applicability .simulation_status .value == "ready_to_simulate"
@@ -494,6 +506,7 @@ def format_codemod_applicability_markdown(
494506 lines .append (
495507 " - Candidates: "
496508 f"{ len (candidates )} ; advisory-only: { advisory_count } ; "
509+ f"safe mechanical: { safe_count } ; "
497510 f"planned rewrites: { planned_count } ; ready to simulate: { ready_count } "
498511 )
499512 for index , candidate in enumerate (candidates [:10 ], start = 1 ):
@@ -503,6 +516,7 @@ def format_codemod_applicability_markdown(
503516 f"`{ candidate .opportunity_key .label } ` -> "
504517 f"{ candidate .target_count } target(s), "
505518 f"{ candidate .predicted_removed_finding_count } finding(s), "
519+ f"{ applicability .planned_rewrite_count } planned rewrite(s), "
506520 f"simulation { applicability .simulation_status .value } "
507521 )
508522 lines .append (f" strategy: { applicability .strategy_id } " )
@@ -787,6 +801,7 @@ def main() -> int:
787801 impact_ranking = None
788802 if args .include_impact_ranking :
789803 source_index = build_source_index (modules , findings )
804+ source_by_path = {str (module .path ): module .source for module in modules }
790805 impact_ranking = build_refactor_impact_ranking (
791806 findings ,
792807 source_index ,
@@ -801,6 +816,11 @@ def main() -> int:
801816 impact_ranking ,
802817 source_index ,
803818 )
819+ codemod_candidates = codemod_candidates_with_automated_rewrites (
820+ codemod_candidates ,
821+ source_index ,
822+ source_by_path ,
823+ )
804824 else :
805825 codemod_candidates = None
806826 if args .json :
0 commit comments