import type { KnowledgeGraph } from "@understand-anything/core"; /** * Generate a structured onboarding guide from the knowledge graph. * Output is standalone markdown suitable for a README, wiki, or docs. */ export function buildOnboardingGuide(graph: KnowledgeGraph): string { const { project, nodes, edges, layers, tour } = graph; const lines: string[] = []; // --- Project Overview --- lines.push(`# ${project.name}`); lines.push(""); lines.push(`> ${project.description}`); lines.push(""); lines.push(`| | |`); lines.push(`|---|---|`); lines.push(`| **Languages** | ${project.languages.join(", ")} |`); lines.push(`| **Frameworks** | ${project.frameworks.join(", ")} |`); lines.push(`| **Components** | ${nodes.length} nodes, ${edges.length} relationships |`); lines.push(`| **Last Analyzed** | ${project.analyzedAt} |`); lines.push(""); // --- Architecture --- if (layers.length > 0) { lines.push("## Architecture"); lines.push(""); lines.push("The project is organized into the following layers:"); lines.push(""); for (const layer of layers) { const memberNames = layer.nodeIds .map((id) => nodes.find((n) => n.id === id)?.name) .filter(Boolean); lines.push(`### ${layer.name}`); lines.push(""); lines.push(layer.description); lines.push(""); if (memberNames.length > 0) { lines.push(`Key components: ${memberNames.join(", ")}`); lines.push(""); } } } // --- Key Concepts --- const conceptNodes = nodes.filter((n) => n.type === "concept"); if (conceptNodes.length > 0) { lines.push("## Key Concepts"); lines.push(""); lines.push("Important architectural and domain concepts to understand:"); lines.push(""); for (const concept of conceptNodes) { lines.push(`### ${concept.name}`); lines.push(""); lines.push(concept.summary); lines.push(""); } } // --- Getting Started (Tour) --- if (tour.length > 0) { lines.push("## Getting Started"); lines.push(""); lines.push("Follow this guided tour to understand the codebase:"); lines.push(""); for (const step of tour) { const stepNodes = step.nodeIds .map((id) => nodes.find((n) => n.id === id)) .filter(Boolean); lines.push(`### ${step.order}. ${step.title}`); lines.push(""); lines.push(step.description); lines.push(""); if (stepNodes.length > 0) { lines.push("**Files to look at:**"); for (const node of stepNodes) { if (node!.filePath) { lines.push(`- \`${node!.filePath}\` — ${node!.summary}`); } } lines.push(""); } if (step.languageLesson) { lines.push(`> **Language Tip:** ${step.languageLesson}`); lines.push(""); } } } // --- File Map --- const fileNodes = nodes.filter((n) => n.type === "file" && n.filePath); if (fileNodes.length > 0) { lines.push("## File Map"); lines.push(""); lines.push("| File | Purpose | Complexity |"); lines.push("|------|---------|------------|"); for (const node of fileNodes) { lines.push(`| \`${node.filePath}\` | ${node.summary} | ${node.complexity} |`); } lines.push(""); } // --- Complexity Hotspots --- const complexNodes = nodes.filter((n) => n.complexity === "complex"); if (complexNodes.length > 0) { lines.push("## Complexity Hotspots"); lines.push(""); lines.push("These components are the most complex and deserve extra attention:"); lines.push(""); for (const node of complexNodes) { lines.push(`- **${node.name}** (${node.type}): ${node.summary}`); } lines.push(""); } // --- Footer --- lines.push("---"); lines.push(""); lines.push(`*Generated by [Understand Anything](https://github.com/Egonex-AI/Understand-Anything) from knowledge graph v${graph.version}*`); lines.push(""); return lines.join("\n"); }