kyorlin2001/code-analysis-tool
0
1from __future__ import annotations2 3from dataclasses import dataclass4from typing import Any5 6from models.analysis_state import AnalysisState7 8 9@dataclass10class IntakeOutput:11 """12 Result of the intake agent.13 """14 15 repo_name: str16 file_count: int17 language_summary: dict[str, int]18 notes: list[str]19 20 21class IntakeAgent:22 """23 Performs the first-pass repository intake.24 25 Responsibilities:26 - inspect repository contents27 - estimate language distribution28 - capture basic notes for downstream agents29 """30 31 def run(self, state: AnalysisState) -> IntakeOutput:32 language_summary = self._summarize_languages(state.files)33 34 notes: list[str] = []35 if not state.files:36 notes.append("No supported text files were found in the repository.")37 else:38 notes.append(f"Found {len(state.files)} supported text files.")39 40 output = IntakeOutput(41 repo_name=state.repo_name,42 file_count=len(state.files),43 language_summary=language_summary,44 notes=notes,45 )46 47 state.summaries["intake"] = self._format_summary(output)48 state.agent_outputs["intake"] = output49 return output50 51 def _summarize_languages(self, files: list[str]) -> dict[str, int]:52 """53 Very lightweight extension-based language summary.54 """55 extension_map = {56 ".py": "Python",57 ".js": "JavaScript",58 ".ts": "TypeScript",59 ".tsx": "TypeScript React",60 ".jsx": "JavaScript React",61 ".java": "Java",62 ".kt": "Kotlin",63 ".go": "Go",64 ".rs": "Rust",65 }66 67 language_summary: dict[str, int] = {}68 for file in files:69 for extension, language in extension_map.items():70 if file.endswith(extension):71 language_summary[language] = language_summary.get(language, 0) + 172 break73 74 return language_summary75 76 def _format_summary(self, output: IntakeOutput) -> str:77 summary = f"Intake Agent Summary:\n"78 summary += f" Repo Name: {output.repo_name}\n"79 summary += f" File Count: {output.file_count}\n"80 summary += " Language Summary:\n"81 for language, count in output.language_summary.items():82 summary += f" {language}: {count}\n"83 summary += " Notes:\n"84 for note in output.notes:85 summary += f" {note}\n"86 return summary