dep-graph
npx skills add https://github.com/ssiumha/dots --skill dep-graph
Agent 安装分布
Skill 文档
Dependency Graph
íë¡ì í¸ ë´ íì¼ ê° import ìì¡´ì±ì ë¶ìíì¬ vis-network ê¸°ë° ì¸í°ëí°ë¸ HTML ë³´ê³ ì를 ìì±í©ëë¤.
íµì¬ ìì¹:
- ë ¸ë ë¨ì: íì¼ (ë²ì©ì , 구í ë¨ì)
- ì¶ì¶: Python ì¤í¬ë¦½í¸ ì°ì , ìë ë¶ì í´ë°±
- ìê°í: vis-network CDN (ë¨ì¼ íì¼, 물리 ë´ì¥)
- ìì: ìµìì ëë í 리 ê¸°ë° ìë ë°°ì (12ì íë í¸)
Quick Reference
/dep-graph # íì¬ ëë í 리 ì ì²´
/dep-graph --scope=src/ # í¹ì ëë í 리ë§
/dep-graph --depth=2 # import ê¹ì´ ì í
/dep-graph --exclude="**/*.test.*" # í
ì¤í¸ íì¼ ì ì¸
Instructions
Phase 0: ì¤í¬ë¦½í¸ ì¤í (ê¶ì¥)
Python3ê° ì¤ì¹ëì´ ìì¼ë©´ ì¤í¬ë¦½í¸ë¡ ì ì²´ íì´íë¼ì¸ì ì¤ííë¤.
python3 {SKILL_DIR}/scripts/build-graph.py \
--root {PROJECT_ROOT} \
--template {SKILL_DIR}/templates/report.html \
--output dep-graph.html \
[--scope {scope}] [--depth {depth}] [--exclude {pattern}]
{SKILL_DIR}: ì´ ì¤í¬ì ëë í 리 ê²½ë¡ (SKILL.mdê° ìë ê³³){PROJECT_ROOT}: ë¶ì ëì íë¡ì í¸ ë£¨í¸- ì¸ìë ì¬ì©ì ì
ë ¥(
--scope,--depth,--exclude)ì´ ìì¼ë©´ ì ë¬
ì¤í¬ë¦½í¸ê° ì±ê³µíë©´ Phase 4-4 ê²°ê³¼ ë³´ê³ ë¡ ë°ë¡ ì´ë. ì¤í¨ ì Phase 1ë¶í° ìë ì§í.
Phase 1: ì¤ì½í ë° ì¸ì´ ê°ì§ (ìë í´ë°±)
1-1. ëì íì¼ ìì§
# scope ì¸ì í´ì
--scope=<path> â í´ë¹ ê²½ë¡ íì
(ìì¼ë©´) â íì¬ ìì
ëë í 리 ì ì²´
Globì¼ë¡ ìì¤ íì¼ ìì§:
**/*.{ts,tsx,js,jsx,mjs,cjs} â TypeScript/JavaScript
**/*.java â Java
**/*.py â Python
**/*.go â Go
**/*.rs â Rust
--exclude ì¸ìê° ìì¼ë©´ í´ë¹ í¨í´ ì ì¸. 기본 ì ì¸:
node_modules/,vendor/,build/,dist/,.git/**/*.test.*,**/*.spec.*,**/__tests__/**
1-2. ì¸ì´ íë³
íì¥ì ë¹ë ê¸°ì¤ ì£¼ ì¸ì´ ê²°ì . í¼í© íë¡ì í¸ë 모ë ì¸ì´ ì²ë¦¬.
1-3. depth ì í
--depth=N ì§ì ì, ì¤ì½í 루í¸ë¡ë¶í° Në¨ê³ê¹ì§ë§ ë°ë¼ê°. 기본ê°: 무ì í.
Phase 2: ìì¡´ì± ì¶ì¶
ì¸ì´ë³ í¨í´ íì¼ ì°¸ì¡°íì¬ import문 ì¶ì¶.
2-1. ast-grep ìë (ì°ì )
ast-grepì´ ì¤ì¹ëì´ ìì¼ë©´ (which ast-grep) ì íí AST ê¸°ë° ì¶ì¶:
# ast-grepì¼ë¡ import문 ê²ì
ast-grep --pattern '<PATTERN>' --json <file>
ì¸ì´ë³ í¨í´ì resources/patterns/ 참조:
- TypeScript/JavaScript â
resources/patterns/typescript.md - Java â
resources/patterns/java.md
2-2. grep í´ë°±
ast-grep 미ì¤ì¹ ì ì ê·ì ê¸°ë° ì¶ì¶:
# TypeScript/JavaScript
grep -nE "^import .+ from ['\"]|require\(['\"]" <file>
# Java
grep -nE "^import (static )?[a-zA-Z]" <file>
# Python
grep -nE "^(from .+ import|import )" <file>
# Go
grep -nE "\"[a-zA-Z0-9_/.-]+\"" <file> # import block ë´ë¶
2-3. ê²½ë¡ í´ì
ì¶ì¶ë import ê²½ë¡ë¥¼ ì¤ì íì¼ ê²½ë¡ë¡ 매í:
| ì í | ì²ë¦¬ |
|---|---|
ìë ê²½ë¡ (./, ../) |
íì¬ íì¼ ê¸°ì¤ resolve, íì¥ì íì |
| ë³ì¹ (alias) | tsconfig.json paths, webpack alias ë± ì½ì´ì 매í |
| í¨í¤ì§/ì¸ë¶ | external ë
¸ëë¡ ê·¸ë£¹í (ì í íì) |
ë°°ë´ (index.ts) |
ëë í 리 import ì index.* ìë íì |
íì¥ì íì ìì (TypeScript):
.ts â .tsx â .js â .jsx â /index.ts â /index.tsx â /index.js
Phase 3: ê·¸ëí ë°ì´í° 구ì±
3-1. ë°ì´í° 구조 ìì±
const GRAPH_DATA = {
nodes: [
{ id: "src/api/user.ts", label: "user.ts", group: "api", title: "src/api/user.ts\nImports: 3\nImported by: 5" }
],
edges: [
{ from: "src/api/user.ts", to: "src/models/User.ts", arrows: "to" }
],
groups: {
"api": { color: "#4FC3F7" },
"models": { color: "#81C784" }
},
stats: {
totalFiles: 42,
totalEdges: 87,
avgDependencies: 2.07,
maxFanOut: { file: "src/index.ts", count: 12 },
maxFanIn: { file: "src/utils/helpers.ts", count: 15 },
circular: [["src/a.ts", "src/b.ts", "src/a.ts"]],
externalDeps: ["react", "lodash"]
}
};
3-2. ë ¸ë ìì±
id: ì¤ì½í ë£¨í¸ ìë ê²½ë¡label: íì¼ëª ë§ (ëë í 리 ìì´)group: ìµìì ëë í ë¦¬ëª (ìì 그룹)title: í¸ë² ì íìí ìì¸ ì ë³´size: fan-in ë¹ë¡ (참조 ë§ììë¡ í¼)
3-3. ìì íë í¸ (12ì ìí)
const PALETTE = [
"#4FC3F7", "#81C784", "#FFB74D", "#E57373",
"#BA68C8", "#4DD0E1", "#FFD54F", "#A1887F",
"#90A4AE", "#F06292", "#AED581", "#7986CB"
];
ìµìì ëë í 리 ë±ì¥ ììëë¡ ë°°ì .
3-4. ìí 참조 íì§
DFSë¡ ì¬ì´í´ íì§. ë°ê²¬ë ì¬ì´í´ì stats.circularì 기ë¡.
Phase 4: HTML 리í¬í¸ ìì±
4-1. í í릿 ë¡ë©
templates/report.html íì¼ì Readë¡ ì½ëë¤.
4-2. ë°ì´í° 주ì
í
í릿 ë´ {{GRAPH_DATA}} íë ì´ì¤íë를 Phase 3ìì 구ì±í JSONì¼ë¡ êµì²´.
</script> 문ìì´ì´ í¬í¨ëë©´ HTML íì±ì´ 깨ì§ë¯ë¡ ë°ëì ì´ì¤ì¼ì´í:
const jsonStr = JSON.stringify(GRAPH_DATA)
.replace(/</g, '\\u003c')
.replace(/>/g, '\\u003e');
template.replace('{{GRAPH_DATA}}', jsonStr);
4-3. íì¼ ì¶ë ¥
dep-graph.html # íë¡ì í¸ ë£¨í¸ì ìì±
4-4. ê²°ê³¼ ë³´ê³
ìì± ìë£ í ì¬ì©ììê² ë³´ê³ :
## Dependency Graph Report
- íì¼: `dep-graph.html`
- ë
¸ë: {totalFiles}ê° íì¼
- ì£ì§: {totalEdges}ê° ìì¡´ì±
- íê· ìì¡´ì±: {avgDependencies}
- ìµë Fan-out: {maxFanOut.file} ({maxFanOut.count})
- ìµë Fan-in: {maxFanIn.file} ({maxFanIn.count})
- ìí 참조: {circular.length}ê° ë°ê²¬
- ì¸ë¶ í¨í¤ì§: {externalDeps.length}ê°
ë¸ë¼ì°ì ìì `dep-graph.html`ì ì´ì´ íì¸íì¸ì.
ìí ì°¸ì¡°ê° ìì¼ë©´ ê²½ê³ ì í¨ê» ì¬ì´í´ ê²½ë¡ íì.
Output Format
ë¨ì¼ HTML íì¼ (dep-graph.html). ë¸ë¼ì°ì ìì ì´ë©´:
- ì¬ì´ëë°: ê²ì, ëë í 리 íí°, íµê³, ë ¸ë ìì¸
- í´ë°: Reset / Physics í ê¸ / External í ê¸ / Circular íì´ë¼ì´í¸
- ì¸í°ëì : í´ë¦âì°ê²° íì´ë¼ì´í¸, ëë¸í´ë¦âí¬ì»¤ì¤, ëëê·¸ ì´ë
- í
ë§:
prefers-color-schemeìë (dark/light)
Technical Details
ì¤í¬ë¦½í¸: scripts/build-graph.py
- Python 3.10+ íì (íì¤ ë¼ì´ë¸ë¬ë¦¬ë§ ì¬ì©, ì¸ë¶ ìì¡´ì± ìì)
- ì§ì ì¸ì´: Java, TypeScript/JavaScript, Python
- Java source root ìë íì (
**/src/main/java) - Java ë´ë¶ í¨í¤ì§ ìë íë³ (source rootì top-level í¨í¤ì§ ìì§)
- tsconfig.json
compilerOptions.pathsalias ìë ì½ê¸° (JSONC ì§ì) - ìí 참조 íì§ (iterative DFS, ëê·ëª¨ íë¡ì í¸ ìì )
--jsoníëê·¸ë¡ stats JSON ì¶ë ¥ (ì¤í¬ë¦½í¸ ì²´ì´ëì©)- íì¼ ì½ê¸° ì¤í¨ ì skip + stderr ê²½ê³