@@ -77,6 +77,46 @@ def _where_to_modify(modules: List[Dict[str, Any]], limit: int) -> str:
7777 return "\n " .join (suggestions )
7878
7979
80+ def _llm_directory_summaries (llm_payload : Dict [str , Any ], fallback_modules : List [Dict [str , Any ]], limit : int = 8 ) -> str :
81+ items = llm_payload .get ("directory_summaries" , [])
82+ lines : List [str ] = []
83+ if isinstance (items , list ):
84+ for item in items [:limit ]:
85+ if not isinstance (item , dict ):
86+ continue
87+ name = str (item .get ("name" , "" )).strip ()
88+ summary = str (item .get ("summary" , "" )).strip ()
89+ if not name or not summary :
90+ continue
91+ lines .append (f"- **{ name } **: { summary } " )
92+ if lines :
93+ return "\n " .join (lines )
94+
95+ for module in fallback_modules [:limit ]:
96+ name = module .get ("name" , "" )
97+ if not name :
98+ continue
99+ lines .append (f"- **{ name } **: Module with { module .get ('file_count' , 0 )} files." )
100+ return "\n " .join (lines ) if lines else "- No directory-level summary available."
101+
102+
103+ def _llm_deep_dive_starters (llm_payload : Dict [str , Any ]) -> str :
104+ starters = llm_payload .get ("deep_dive_starters" , [])
105+ if not isinstance (starters , list ) or not starters :
106+ return "- Start from entrypoints, then trace one request through dependencies."
107+ return "\n " .join ([f"- { str (item )} " for item in starters [:6 ]])
108+
109+
110+ def _llm_confidence_notes (llm_payload : Dict [str , Any ]) -> str :
111+ notes = llm_payload .get ("confidence_notes" , [])
112+ if not isinstance (notes , list ) or not notes :
113+ if llm_payload .get ("enabled" , False ) and not llm_payload .get ("used" , False ):
114+ error = llm_payload .get ("error" , "LLM summary unavailable for this run." )
115+ return f"- { error } "
116+ return "- LLM summary disabled; deterministic analysis remains primary."
117+ return "\n " .join ([f"- { str (item )} " for item in notes [:6 ]])
118+
119+
80120def _glossary_terms (
81121 stack_payload : Dict [str , Any ],
82122 dep_payload : Dict [str , Any ],
@@ -216,8 +256,13 @@ def _plain_system_summary(
216256 repo_name : str ,
217257 stack_payload : Dict [str , Any ],
218258 doc_payload : Dict [str , Any ],
259+ llm_payload : Dict [str , Any ],
219260 audience : str ,
220261) -> str :
262+ llm_summary = str (llm_payload .get ("repo_summary_paragraph" , "" )).strip ()
263+ if llm_summary :
264+ return llm_summary
265+
221266 parsed_docs = doc_payload .get ("parsed_docs" , [])
222267 summary_doc = _pick_summary_doc (parsed_docs )
223268 if summary_doc :
@@ -297,6 +342,7 @@ def generate_docs(
297342 flow_payload : Dict [str , Any ],
298343 diagram_manifest : Dict [str , Any ],
299344 docs_payload : Dict [str , Any ],
345+ llm_payload : Dict [str , Any ],
300346 enrichment_payload : Dict [str , Any ],
301347) -> Dict [str , Any ]:
302348 overview_dir = common .ensure_dir (output_root / "overview" )
@@ -335,11 +381,16 @@ def generate_docs(
335381 "audience_note" : _audience_note (audience ),
336382 "mode_note" : _mode_note (mode ),
337383 "overview_length_note" : _overview_length_note (overview_length ),
338- "plain_summary" : _plain_system_summary (repo_name , stack_payload , docs_payload , audience ),
384+ "plain_summary" : _plain_system_summary (repo_name , stack_payload , docs_payload , llm_payload , audience ),
339385 "docs_coverage" : _docs_coverage_line (docs_payload ),
340386 "docs_quick_links" : _docs_summary (docs_payload , profile ["doc_link_limit" ]),
341387 "primary_user_flow_summary" : _primary_flow_summary (flow_payload ),
342388 "external_context_summary" : _external_context_summary (enrichment_payload ),
389+ "directory_plain_summaries" : _llm_directory_summaries (llm_payload , modules , limit = profile ["module_limit" ]),
390+ "llm_deep_dive_starters" : _llm_deep_dive_starters (llm_payload ),
391+ "llm_confidence_notes" : _llm_confidence_notes (llm_payload ),
392+ "llm_enabled" : "true" if llm_payload .get ("enabled" , False ) else "false" ,
393+ "llm_used" : "true" if llm_payload .get ("used" , False ) else "false" ,
343394 }
344395
345396 overview_template = common .load_template (templates_root / "overview.md.j2" )
@@ -422,6 +473,17 @@ def generate_docs(
422473 ),
423474 ]
424475
476+ if llm_payload .get ("used" , False ):
477+ claims .append (
478+ common .collect_claim (
479+ "claim_llm_narrative" ,
480+ "An LLM-generated narrative summary was incorporated for repository and directory explainers." ,
481+ ["meta/llm_summary.json" ],
482+ 0.7 ,
483+ "Generated from deterministic context payload + model inference." ,
484+ )
485+ )
486+
425487 if enrichment_payload .get ("records" ):
426488 claims .append (
427489 common .collect_claim (
@@ -467,6 +529,7 @@ def main() -> int:
467529 parser .add_argument ("--flows" , required = True )
468530 parser .add_argument ("--diagram-manifest" , required = True )
469531 parser .add_argument ("--coverage" , required = True )
532+ parser .add_argument ("--llm-summary" , required = True )
470533 parser .add_argument ("--enrichment" , required = True )
471534 args = parser .parse_args ()
472535
@@ -484,6 +547,7 @@ def main() -> int:
484547 flow_payload = common .read_json (Path (args .flows ), default = {}),
485548 diagram_manifest = common .read_json (Path (args .diagram_manifest ), default = {}),
486549 docs_payload = common .read_json (Path (args .coverage ), default = {}),
550+ llm_payload = common .read_json (Path (args .llm_summary ), default = {}),
487551 enrichment_payload = common .read_json (Path (args .enrichment ), default = {}),
488552 )
489553 print (json .dumps ({"overview" : payload ["overview_file" ], "deep_count" : len (payload ["deep_files" ])}, indent = 2 ))
0 commit comments