Sem – 시맨틱 버전 관리. Git 위에 엔터티 수준 차이점

발행: (2026년 3월 8일 PM 03:01 GMT+9)
5 분 소요

Source: Hacker News

개요

시맨틱 버전 관리. Git 위에 엔터티 수준 차이점.

라인 43이 변경됨 대신, sem은 함수 validateTokensrc/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)

LanguageExtensionsEntities
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

FormatExtensionsEntities
JSON.json속성, 객체 (RFC 6901 경로)
YAML.yml .yaml섹션, 속성 (점 경로)
TOML.toml섹션, 속성
CSV.csv .tsv행 (첫 번째 열을 식별자로 사용)
Markdown.md .mdx헤딩 기반 섹션

Everything else falls back to chunk‑based diffing.

매칭 작동 방식

세 단계 엔터티 매칭:

  1. Exact ID match – before/after에서 동일한 엔터티 → 수정됨 또는 변경되지 않음.
  2. Structural hash match – 동일한 AST 구조, 이름만 다름 → 이름 변경 또는 이동 (공백/주석 무시).
  3. 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

0 조회
Back to Blog

관련 글

더 보기 »

모든 마찰이 같은 것은 아니다

소개 요즘 많은 게시물들이 “마찰의 종말”을 축하하며, AI가 코드를 작성하는 데 따르는 마찰을 없애고 개발 속도를 높이는 것을 칭송하고 있다...

Attune.js 소개

!Introducing Attune.js의 커버 이미지https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploads....