Sem – 시맨틱 버전 관리. Git 위에 엔터티 수준 차이점
Source: Hacker News
개요
시맨틱 버전 관리. Git 위에 엔터티 수준 차이점.
라인 43이 변경됨 대신, sem은 함수 validateToken가 src/auth.ts에 추가되었습니다 라고 알려줍니다.
sem diff
┌─ src/auth/login.ts ──────────────────────────────────
│
│ ⊕ function validateToken [added]
│ ∆ function authenticateUser [modified]
│ ⊖ function legacyAuth [deleted]
│
└──────────────────────────────────────────────────────
┌─ config/database.yml ─────────────────────────────────
│
│ ∆ property production.pool_size [modified]
│ - 5
│ + 20
│
└──────────────────────────────────────────────────────
Summary: 1 added, 1 modified, 1 deleted across 2 files
Install
소스에서 빌드 (Rust 필요):
git clone https://github.com/Ataraxy-Labs/sem
cd sem/crates
cargo install --path sem-cli
또는 GitHub Releases에서 바이너리를 받아 사용하세요.
사용법
Works in any Git repo. No setup required.
-
작업 중인 변경 사항의 의미론적 차이
sem diff -
스테이징된 변경 사항만
sem diff --staged -
특정 커밋
sem diff --commit abc1234 -
커밋 범위
sem diff --from HEAD~5 --to HEAD -
JSON 출력 (AI 에이전트, CI 파이프라인용)
sem diff --format json -
stdin에서 파일 변경 사항 읽기 (Git 저장소 불필요)
echo '[{"filePath":"src/main.rs","status":"modified","beforeContent":"...","afterContent":"..."}]' \ | sem diff --stdin --format json -
특정 파일 유형만
sem diff --file-exts .py .rs -
엔티티 의존성 그래프
sem graph -
영향 분석 (이 엔티티가 변경되면 무엇이 깨지는가?)
sem impact validateToken -
엔티티 수준 블레임
sem blame src/auth.ts
What it parses
Programming languages (13)
| Language | Extensions | Entities |
|---|---|---|
| TypeScript | .ts .tsx | 함수, 클래스, 인터페이스, 타입, 열거형, 내보내기 |
| JavaScript | .js .jsx .mjs .cjs | 함수, 클래스, 변수, 내보내기 |
| Python | .py | 함수, 클래스, 데코레이터가 적용된 정의 |
| Go | .go | 함수, 메서드, 타입, 변수, 상수 |
| Rust | .rs | 함수, 구조체, 열거형, impl, 트레이트, 모듈, 상수 |
| Java | .java | 클래스, 메서드, 인터페이스, 열거형, 필드, 생성자 |
| C | .c .h | 함수, 구조체, 열거형, 공용체, typedef |
| C++ | .cpp .cc .hpp | 함수, 클래스, 구조체, 열거형, 네임스페이스, 템플릿 |
| C# | .cs | 클래스, 메서드, 인터페이스, 열거형, 구조체, 속성 |
| Ruby | .rb | 메서드, 클래스, 모듈 |
| PHP | .php | 함수, 클래스, 메서드, 인터페이스, 트레이트, 열거형 |
| Fortran | .f90 .f95 .f | 함수, 서브루틴, 모듈, 프로그램 |
Structured data formats
| Format | Extensions | Entities |
|---|---|---|
| JSON | .json | 속성, 객체 (RFC 6901 경로) |
| YAML | .yml .yaml | 섹션, 속성 (점 경로) |
| TOML | .toml | 섹션, 속성 |
| CSV | .csv .tsv | 행 (첫 번째 열을 식별자로 사용) |
| Markdown | .md .mdx | 헤딩 기반 섹션 |
Everything else falls back to chunk‑based diffing.
매칭 작동 방식
세 단계 엔터티 매칭:
- Exact ID match – before/after에서 동일한 엔터티 → 수정됨 또는 변경되지 않음.
- Structural hash match – 동일한 AST 구조, 이름만 다름 → 이름 변경 또는 이동 (공백/주석 무시).
- Fuzzy similarity – > 80 % 토큰 겹침 → 이름 변경 가능성.
이를 통해 sem은 추가 및 삭제뿐만 아니라 이름 변경 및 이동을 감지할 수 있습니다. Structural hashing은 화장(공백, 포맷) 변경과 실제 로직 변경을 구분합니다.
{
"summary": {
"fileCount": 2,
"added": 1,
"modified": 1,
"deleted": 1,
"total": 3
},
"changes": [
{
"entityId": "src/auth.ts::function::validateToken",
"changeType": "added",
"entityType": "function",
"entityName": "validateToken",
"filePath": "src/auth.ts"
}
]
}
라이브러리로서
sem-core는 Rust 라이브러리 의존성으로 사용할 수 있습니다:
[dependencies]
sem-core = { git = "https://github.com/Ataraxy-Labs/sem", version = "0.3" }
weave (semantic merge driver)와 inspect (entity‑level code review)에서 사용됩니다.
Architecture
- tree‑sitter 코드 파싱용 (네이티브 Rust, WASM 아님)
- git2 Git 작업용
- rayon 병렬 파일 처리용
- xxhash 구조 해싱용
- 새로운 언어와 포맷을 추가하기 위한 플러그인 시스템
스타 히스토리
라이선스
MIT OR Apache‑2.0