/understand 한 줄이면 멀티에이전트 파이프라인이 프로젝트를 훑어 모든 파일·함수·클래스·의존성을 추출하고, 이를 노드와 엣지로 이루어진 지식 그래프(JSON)로 만든 뒤, 팬·줌·검색·클릭이 되는 인터랙티브 대시보드로 보여 준다. 핵심은 tree-sitter(결정적 구문 분석) + LLM(의미 분석)을 섞은 하이브리드라는 점 — 구조는 매번 똑같이 재현되고, "이 파일이 무엇을 위한 것인가"라는 의도는 LLM이 채운다. (저장소: Egonex-AI/Understand-Anything · TypeScript · MIT · Claude Code/Cursor/Copilot/Codex/Gemini 등 멀티플랫폼 플러그인)Lum1104/Understand-Anything(원작)을 이어받아 Egonex가 발전시킨 별개 프로젝트다. 원작이 단일 도구였다면, 이쪽은 pnpm 모노레포 · 9종 에이전트 · 17개 플랫폼 설치기 · React 대시보드 · 도메인/지식베이스 분석까지 갖춘 본격 제품 형태다.이 레포가 무엇을 하는 물건인가.
새 팀에 합류해 20만 줄짜리 코드베이스를 받았다고 하자. 보통은 main부터 무작정 읽어 내려가며 머릿속에 구조도를 그린다. Understand Anything은 그 "머릿속 구조도"를 실제 데이터(지식 그래프)로 외부화하고, 색으로 계층을 구분한 인터랙티브 그래프로 띄운다.
각 노드를 클릭하면 평이한 영어(또는 한국어) 요약·관계·가이드 투어가 뜬다. "인증을 담당하는 부분이 어디냐?"를 의미로 검색하고, 내 변경이 어디까지 파급되는지(diff 영향)를 커밋 전에 본다. 그래프는 그냥 JSON이라 커밋해서 팀과 공유하면 동료는 분석 파이프라인을 다시 돌릴 필요가 없다.
Understand Anything은 코드 이해(code comprehension) 계열의 개발자 도구다. Claude Code 플러그인으로 시작했지만 지금은 Cursor · VS Code Copilot · Codex · Gemini CLI · OpenCode 등 17개 플랫폼에서 동작한다. /understand로 그래프를 만들고, /understand-dashboard로 시각화하며, /understand-chat·/understand-diff·/understand-explain·/understand-onboard·/understand-domain·/understand-knowledge 같은 명령으로 질의·영향분석·온보딩 문서까지 뽑는다.
트렌딩 이유 · 단순 "AI에게 물어보기"와의 차이.
요즘은 코드를 모르면 그냥 AI에게 물어보면 된다고들 한다. 그런데 LLM에게 "이 코드베이스 설명해줘"라고 하면 매번 답이 다르고, 큰 레포는 컨텍스트에 다 안 들어가며, 환각으로 없는 함수를 지어낸다. Understand Anything이 주목받는 이유는 이 세 약점을 정면으로 푼다는 데 있다 — ① tree-sitter로 구조를 결정적으로 추출(같은 코드 → 같은 그래프), ② 한 번 만든 그래프를 JSON으로 커밋·공유(매번 재분석 불필요), ③ 증분 분석(바뀐 파일만 다시 본다).
| 비교 항목 | 그냥 LLM에게 질문 | Understand Anything |
|---|---|---|
| 재현성 | 매번 답이 달라짐 | 구조 부분은 결정적(tree-sitter, 같은 입력=같은 엣지) |
| 큰 코드베이스 | 컨텍스트 한도 초과 | 파일별 분해 + 병렬 분석(배치당 20~30파일, 동시 5개) |
| 환각 | 없는 함수·관계를 지어냄 | 구문 트리에 근거(grounded)를 둔 노드/엣지 |
| 재사용 | 대화 끝나면 사라짐 | 그래프 = JSON, git에 커밋해 팀과 공유 |
| 탐색 UX | 텍스트 답변뿐 | 팬·줌·검색·클릭 가능한 시각 대시보드 |
| 변경 영향 | 일일이 물어봐야 | /understand-diff로 파급 범위 시각화 |
| 플랫폼 | 도구마다 따로 | 17개 AI 코딩 플랫폼 공통 지원 |
거대한 코드베이스를 LLM 컨텍스트에 한 번에 넣을 수는 없다. 잘라 넣으면 전체 구조가 깨지고, 같은 질문에도 매번 다른 답이 나오며, 모델은 "있을 법한" 함수를 그럴싸하게 지어낸다(환각). 결정적으로, 이렇게 얻은 이해는 대화가 끝나면 증발해 팀과 공유할 수도, 다음에 재사용할 수도 없다.
구조적 사실(imports·calls·inherits)은 tree-sitter가 결정적으로 뽑고, 그 위에 LLM이 요약·태그·계층·도메인 같은 '의도'만 얹는다. 두 결과를 합쳐 하나의 knowledge-graph.json으로 디스크에 영속화하고, 바뀐 파일만 골라 다시 분석하는 핑거프린트 기반 증분 갱신으로 비용을 줄인다. "변하지 않는 사실은 파서가, 변하는 해석은 LLM이"라는 분업이 설계 철학이다.
분석 엔진(코어)·대시보드(프론트)·플러그인/인프라 각각.
@understand-anything/core전부 TypeScript(strict 모드) + ESM으로 짜였고, Node.js 22+에서 돈다. 코어는 브라우저(대시보드)에서도 일부 모듈을 재사용하기 위해 ./search·./types·./schema 같은 서브패스 export로 잘게 나뉘어, Node 전용 모듈이 브라우저 번들에 딸려 들어가지 않게 막는다.
| 요소 | 역할 |
|---|---|
| TypeScript 5.7+ | 전체 언어. strict 모드, ESM("type":"module"). |
web-tree-sitter (WASM) | 결정적 구문 분석. 네이티브 바인딩이 darwin/arm64+Node24에서 깨져 WASM판을 채택. |
| tree-sitter 문법 13종 | TS·JS·Python·Go·Rust·Java·Ruby·PHP·C·C++·C#·Dart·Kotlin 등의 WASM 문법. |
fuse.js | 퍼지 검색 엔진(이름·태그·요약 가중치 검색). 오타에도 관대. |
| 임베딩 검색 | embedding-search.ts — 코사인 유사도 기반 의미 검색. |
vitest | 전 패키지 단위 테스트 러너. |
@understand-anything/dashboard| 요소 | 역할 |
|---|---|
| React 19 + Vite 6 | SPA 대시보드. 빠른 dev 서버·HMR. |
@xyflow/react (React Flow) | 노드·엣지 그래프 렌더링·팬·줌·드래그의 핵심. |
zustand | 전역 상태(선택 노드·필터·페르소나) 관리. |
| TailwindCSS v4 | 다크 럭셔리 테마(딥 블랙 #0a0a0a + 골드 #d4a574). |
elkjs · @dagrejs/dagre · d3-force | 3종 그래프 레이아웃 엔진(계층·DAG·force-directed). |
graphology + Louvain | 커뮤니티 클러스터링(연관 노드 자동 군집화). |
prism-react-renderer | 노드 클릭 시 슬라이드업 소스 뷰어(문법 하이라이팅). |
react-markdown | 요약·투어 설명의 마크다운 렌더. |
| 요소 | 역할 |
|---|---|
| pnpm 모노레포 | pnpm-workspace.yaml — core·dashboard·plugin·homepage 워크스페이스. |
| 플러그인 매니페스트 | .claude-plugin·.cursor-plugin·.copilot-plugin 자동 디스커버리. |
install.sh / install.ps1 | 원라인 설치기. 17개 플랫폼에 맞는 심볼릭 링크 생성. |
| Skills + Agents | 마크다운 프론트매터로 정의된 8개 스킬·9개 에이전트. |
| post-commit 훅 | --auto-update — 매 커밋마다 그래프 증분 패치. |
| git-lfs / committed graph | 큰 그래프(10MB+)는 LFS로, 그래프 JSON을 레포에 커밋해 공유. |
| 다국어 출력 | --language ko/zh/ja/... — 요약·UI·투어를 지정 언어로 생성. |
코드 → 7단계 멀티에이전트 파이프라인 → 지식 그래프 JSON → 대시보드.
입력은 코드베이스(디렉토리). /understand가 7단계 파이프라인을 오케스트레이션한다. 먼저 스캐너가 파일·언어·프레임워크를 찾고, 파일 분석가가 배치 단위(20~30개)로 병렬 실행되며 각 파일에서 tree-sitter로 구조를 뽑고 LLM으로 요약·태그를 붙인다. 이어 아키텍처 분석가가 계층을 식별하고, 투어 작성가가 의존성 순서대로 학습 투어를 만들며, 검수가가 그래프 무결성을 검증한 뒤, 모든 조각을 합쳐 knowledge-graph.json으로 영속화한다. 마지막에 자동으로 /understand-dashboard가 떠 그래프를 시각화한다.
이 도구의 표현력은 노드 타입 21종, 엣지 타입 35종이라는 풍부한 스키마에서 나온다(core/src/types.ts). 코드뿐 아니라 설정·문서·서비스·테이블·엔드포인트, 나아가 비즈니스 도메인과 위키 지식까지 같은 그래프 안에 표현한다.
| 노드 카테고리 | 타입 (일부) |
|---|---|
| 코드 (5) | file · function · class · module · concept |
| 비코드 (8) | config · document · service · table · endpoint · pipeline · schema · resource |
| 도메인 (3) | domain · flow · step — 비즈니스 프로세스 매핑 |
| 지식 (5) | article · entity · topic · claim · source — 위키/지식베이스 |
| 엣지 카테고리 | 타입 (일부) |
|---|---|
| 구조 (Structural) | imports · exports · contains · inherits · implements |
| 행위 (Behavioral) | calls · subscribes · publishes · middleware |
| 데이터 흐름 | reads_from · writes_to · transforms · validates |
| 의미/의존 | depends_on · tested_by · related · similar_to |
| 지식 | cites · contradicts · builds_on · exemplifies |
export interface GraphNode {
id: string;
type: NodeType; // 21종 중 하나
name: string;
filePath?: string;
lineRange?: [number, number];
summary: string; // ← LLM이 채우는 "평이한 설명"
tags: string[]; // ← LLM 태그
complexity: "simple" | "moderate" | "complex";
languageNotes?: string; // ← 이 노드에 쓰인 언어 개념(제네릭·클로저 등)
domainMeta?: DomainMeta;
knowledgeMeta?: KnowledgeMeta;
}
구조 필드(id·type·filePath·lineRange·관계)는 tree-sitter가, 의미 필드(summary·tags·complexity·languageNotes)는 LLM이 채운다. 이 한 인터페이스에 "결정적 + 의미적" 하이브리드가 그대로 새겨져 있다.
| 패턴 | 이 레포에서의 구현 |
|---|---|
| 하이브리드 분석 | tree-sitter(결정적 구조) + LLM(의미). 같은 코드 → 같은 엣지, 의도는 LLM이. |
| 플러그인 아키텍처 | AnalyzerPlugin 인터페이스 + 레지스트리. 언어 추가 = 추출기 플러그인 등록. |
| 중간 결과 디스크 격리 | 에이전트는 결과를 intermediate/에 쓰고 컨텍스트로 안 돌려줌(토큰 절약). |
| 핑거프린트 증분 | fingerprint.ts — 파일 해시로 변경 감지, 바뀐 것만 재분석. |
| 서브패스 export 격리 | core를 ./search·./types 등으로 쪼개 Node 모듈이 브라우저로 안 새게. |
| 스키마 검증 | 그래프 로드 시 스키마 검증, 실패 시 대시보드 경고 배너. |
| 모델 비명시 프론트매터 | 에이전트에 model 필드를 비워 플랫폼 기본 모델로 폴백(opencode 호환). |
| 페르소나 적응 UI | 주니어/PM/파워유저에 따라 대시보드 상세도 자동 조절. |
코드 분석을 "건축물 실측 + 도슨트 해설"로 생각하자. 측량사(tree-sitter)는 줄자로 벽·문·기둥의 위치를 한 치 오차 없이 똑같이 잰다 — 누가 재든 같은 도면이 나온다. 하지만 "이 방이 왜 여기 있고 무슨 용도인지"는 측량사가 모른다. 그래서 도슨트(LLM)가 그 도면 위에 "여긴 인증을 처리하는 거실", "이 복도는 결제 흐름"이라고 의미를 입힌다. Understand Anything은 이 둘을 한 그래프로 합쳐, 정확한 구조와 살아 있는 의미를 동시에 준다.
pnpm 모노레포 — 플러그인 안에 core·dashboard·skills·agents가 모두 있다.
① core/src/types.ts의 노드/엣지 스키마로 "무엇을 그래프로 만드나" 파악 → ② plugins/tree-sitter-plugin.ts로 구조 추출 방식 → ③ analyzer/graph-builder.ts로 구조→그래프 조립 → ④ agents/file-analyzer.md로 LLM이 의미를 얹는 2단계 프롬프트 → ⑤ dashboard/src/components/GraphView.tsx로 시각화. 결정적 추출부터 의미적 해석, 시각화까지의 전 여정이 이 다섯 곳에 압축돼 있다.
개발자 도구·LLM 오케스트레이션·그래프 시각화에서 무엇을 배우나.
가장 큰 배울 점은 "무엇을 코드(결정적)로 두고, 무엇을 LLM(확률적)에 맡길지"의 경계 설계다. 구조적 사실은 매번 같아야 하므로 tree-sitter로, "이게 무슨 의도냐"는 본질적으로 해석이라 LLM으로 나눴다. 이 분업 덕에 그래프가 재현 가능하면서도 풍부하다. 이는 RAG·코드 인덱싱·문서 처리 등 "정확성과 유연성을 동시에 원하는 모든 LLM 시스템"에 옮겨 쓸 수 있는 원칙이다.
web-tree-sitter로 파싱해 함수·import만 추출하는 30줄 스크립트를 짜 보라. 그다음 같은 파일을 LLM에 "구조를 JSON으로" 요청해, 둘의 재현성 차이를 비교.9종 에이전트가 릴레이로 일하되, 중간 결과를 컨텍스트로 되돌리지 않고 intermediate/ 디스크에 쓴다는 점이 핵심이다. 큰 코드베이스를 한 컨텍스트에 다 넣을 수 없으니, 파일을 배치(20~30개)로 쪼개 동시 5개 병렬 처리하고 결과만 모은다. "에이전트 = 컨텍스트 윈도우의 분할 정복"이라는 패턴을 실물로 보여 준다.
agents/file-analyzer.md의 2단계(구조 추출 스크립트 → LLM 분석) 프롬프트 구조를 읽고, "왜 구조를 먼저 결정적으로 뽑은 뒤 LLM에 넘기는가(=환각 억제)"를 한 문단으로 정리하라.같은 core 코드를 Node(CLI 분석기)와 브라우저(대시보드)가 함께 쓰는데, Node 전용 모듈(fs 등)이 브라우저 번들에 새면 빌드가 깨진다. 해법은 ./search·./types·./schema 같은 서브패스 export로 브라우저-안전 표면만 노출하는 것. pnpm 워크스페이스에서 패키지 경계를 어떻게 설계하는지 배울 수 있다.
package.json exports 필드로 "브라우저용 서브패스"와 "Node 전용 메인 엔트리"를 분리해 보라.수천 노드를 그냥 뿌리면 "털뭉치(hairball)"가 된다. 이 레포는 elkjs·dagre·d3-force 3종 레이아웃과 graphology의 Louvain 커뮤니티 검출로 연관 노드를 군집화하고, 계층별 색상·엣지 집계(aggregation)로 시각 복잡도를 낮춘다. "대규모 그래프를 사람이 읽게 만드는" 정보 시각화의 정석이다.
설치는 가볍지만, "LLM 코딩 에이전트"가 전제다.
| 항목 | 요구사항 |
|---|---|
| 런타임 | Node.js 22 이상(v24에서 개발). pnpm 10 이상(packageManager로 고정). |
| 호스트 도구 | AI 코딩 에이전트 필수 — Claude Code(네이티브) 또는 Cursor·VS Code Copilot·Codex·Gemini CLI 등 17종 중 하나. |
| 설치(Claude Code) | /plugin marketplace add Egonex-AI/Understand-Anything → /plugin install understand-anything |
| 설치(기타 플랫폼) | curl -fsSL …/install.sh | bash -s codex 식 원라인. ~/.understand-anything/repo에 클론 후 심링크. |
| 그래프 산출물 | 분석 대상 프로젝트의 .understand-anything/knowledge-graph.json(커밋 권장). |
| 큰 그래프 | 10MB+ 그래프는 git-lfs로 추적. |
| LLM 비용 | 분석은 LLM 호출이라 토큰 비용 발생. 증분 갱신으로 재분석 최소화. |
| 지원 언어(구조분석) | tree-sitter 추출기 있는 13종: TS/JS·Python·Go·Rust·Java·Ruby·PHP·C/C++·C#·Dart·Kotlin(그 외는 LLM이 처리). |
.understand-anything/에서 intermediate/와 diff-overlay.json만 .gitignore하고 나머지(그래프 JSON)는 커밋하면, 새 팀원은 파이프라인을 돌리지 않고도 바로 대시보드를 연다. --auto-update post-commit 훅을 켜면 매 커밋마다 그래프가 코드와 동기화된 채로 유지된다.
난이도별 5단계 — 사용부터 내부 엔진 모방까지.
plugin을 설치하고 본인의 기존 프로젝트에서 /understand → /understand-dashboard를 실행한다. 계층 색상·검색·노드 클릭 요약을 둘러보고, 한국어로 받고 싶으면 /understand --language ko로 다시 생성해 차이를 본다.
생성된 .understand-anything/knowledge-graph.json을 열어 nodes/edges 배열을 살펴본다. types.ts의 21노드·35엣지 정의와 대조하며, 본인 코드의 어떤 함수가 어떤 calls/imports 엣지로 연결됐는지 손으로 짚어 본다.
코드를 조금 수정한 뒤 /understand-diff로 "내 변경이 어디까지 파급되나"를 시각화하고, /understand-onboard로 신규 입사자용 온보딩 가이드를 자동 생성한다. 생성물이 실제 구조와 맞는지 검증해 본다.
web-tree-sitter로 작은 TS/JS 디렉토리를 파싱해 파일·함수 노드 + imports 엣지만 뽑아 JSON으로 떨구는 80~120줄짜리 미니 추출기를 만든다. Understand Anything의 GraphNode/GraphEdge 형태를 그대로 흉내 내, 결정적 구조 추출의 핵심을 체득한다.
과제 4의 JSON에 LLM 요약·태그(summary·tags)를 배치로 붙여 "하이브리드 그래프"를 완성하고, React Flow + dagre로 띄운다. 노드 클릭 시 요약을 보여 주는 사이드바까지 붙이면, 사실상 Understand Anything의 축소판을 직접 만든 셈이다.
6주 코스 — 구문 분석부터 멀티에이전트·그래프 시각화까지.
| 주차 | 주제 | 실습 · 참고 |
|---|---|---|
| 1주차 | tree-sitter 기초 — CST·문법·쿼리·WASM 로딩 | tree-sitter 공식 문서 · tree-sitter-plugin.ts 정독 |
| 2주차 | 코드 그래프 모델링 — 노드/엣지 스키마 설계 | types.ts(21노드·35엣지) · graph-builder.ts |
| 3주차 | 멀티에이전트 오케스트레이션 — 역할분담·중간결과 격리 | agents/*.md 9종 · 배치 병렬·핑거프린트 증분 |
| 4주차 | 검색 — 퍼지(fuse.js) vs 임베딩 의미 검색 | search.ts·embedding-search.ts 비교 구현 |
| 5주차 | 그래프 시각화 — React Flow·레이아웃·클러스터링 | dashboard/components/GraphView · elkjs/dagre/d3-force |
| 6주차 | 플러그인/모노레포 배포 — 멀티플랫폼·서브패스 export | install.sh·매니페스트·pnpm workspace 경계 설계 |
본문·소스에 나온 용어 빠른 참조.
| 용어 | 의미 |
|---|---|
| 지식 그래프 | 노드(파일·함수·클래스)와 엣지(관계)로 코드를 표현한 데이터 구조. |
| tree-sitter | 소스를 구체 구문 트리(CST)로 파싱하는 결정적 증분 파서. WASM판 사용. |
| 하이브리드 분석 | 구조=tree-sitter(결정적), 의미=LLM(요약·태그)으로 나눈 분업. |
| 멀티에이전트 파이프라인 | 스캐너·분석가·검수가 등 9종 에이전트가 릴레이로 그래프를 완성. |
| GraphNode / GraphEdge | 그래프의 기본 단위. 21종 노드 타입, 35종 엣지 타입. |
| 증분 갱신 (incremental) | 핑거프린트(파일 해시)로 변경 파일만 골라 재분석해 비용 절감. |
| 계층 (Layer) | API·Service·Data·UI·Middleware 등 아키텍처 그룹. 색상으로 구분. |
| 가이드 투어 (Tour) | 의존성 순서대로 코드베이스를 학습하게 하는 자동 생성 워크스루. |
| 도메인 분석 | /understand-domain — 코드를 비즈니스 도메인·플로우·스텝으로 매핑. |
| 지식베이스 분석 | /understand-knowledge — Karpathy 패턴 LLM 위키를 그래프화. |
| 서브패스 export | core를 ./search 등으로 쪼개 브라우저-안전 표면만 노출. |
| 커뮤니티 클러스터링 | graphology Louvain으로 연관 노드를 자동 군집화(시각 복잡도↓). |
| 페르소나 적응 UI | 주니어/PM/파워유저에 맞춰 대시보드 상세도를 조절. |
| diff 영향 분석 | /understand-diff — 변경이 그래프에서 어디까지 파급되는지 시각화. |
| pnpm 모노레포 | core·dashboard·plugin·homepage를 한 저장소 워크스페이스로 관리. |