sem:1480⭐のセマンティックバージョン管理CLI、コードdiffをエンティティレベルへ

従来のGit diffはテキスト行ベースです。コードがフォーマットされたり変数がリネームされたりすると、diffはノイズが多く読みにくくなります。semtree-sitterベースのセマンティックバージョン管理ツールで、diffの粒度を「行」から「コードエンティティ」レベルに引き上げます。

主要機能

エンティティレベルDiff

通常のdiffが「X行目が修正されました」を表示するのに対し、semはコード構造を理解し、「関数calculateTotalが修正されました」「構造体Userにフィールドemailが追加されました」を表示します。

# セマンティックdiffを表示
sem diff HEAD~1

# 出力例:
# Modified: function calculateTotal in src/cart.js
#   - return price * quantity
#   + return price * quantity * (1 - discount)

セマンティックBlame

特定の関数や変数の修正履歴を追跡できます。

# 関数の修正履歴を確認
sem blame src/cart.js calculateTotal

依存関係影響分析

関数を修正する際、semはそれに依存する他の関数を分析し、変更の影響範囲を評価するのに役立ちます。

# 変更影響を分析
sem impact src/cart.js calculateTotal

依存関係グラフの可視化

コードエンティティ間の依存関係グラフを生成し、プロジェクトのアーキテクチャを理解できます。

# 依存関係グラフを生成
sem graph --output deps.dot

技術的実装

semのコアはtree-sitter構文解析器で、現在21言語をサポートしています:

  • システム級: C, C++, Rust, Go
  • Web: JavaScript, TypeScript, HTML, CSS
  • JVM: Java, Kotlin, Scala
  • その他: Python, Ruby, PHP, C#, Swift, OCaml, Haskell, Lua, Elm

コードを解析後、semはセマンティックエンティティ(関数、クラス、変数など)を抽出し、エンティティ関係グラフを構築します。すべてのdiff、blame、impact分析はこのグラフ構造に基づいて行われます。

インストール

# ソースからコンパイル
git clone https://github.com/Ataraxy-Labs/sem.git
cd sem
cargo install --path .

# またはプリコンパイル済みバイナリ(将来予定)

ユースケース

コードレビュー

PRレビュー時に、semはどのロジックが修正されたかを明確に表示し、フォーマット変更をフィルタリングします:

sem diff main...feature-branch

リファクタリング支援

変数のリネームや関数の抽出時に、関連するすべての箇所が更新されたことを確認できます:

sem blame src/utils.js helperFunction

アーキテクチャ分析

モジュール依存関係グラフを生成し、循環依存や過度な結合を発見します:

sem graph --module-level --output architecture.dot
dot -Tpng architecture.dot -o architecture.png

プロジェクト情報

属性詳細
リポジトリhttps://github.com/Ataraxy-Labs/sem
言語Rust
Stars1,480
Forks44
ライセンスMIT
アクティビティ継続的に更新(日増約50⭐)

Gitとの関係

semはGitを置き換えるものではなく、Gitを強化するツールです:

  • semは分析のためにGit履歴を読み取ります
  • 既存のGitワークフローとシームレスに統合可能
  • Git hooksでsemを呼び出してコード分析を実行可能
# pre-commit hookでの使用例
sem diff --staged --check-impact

まとめ

大規模なコードベースや頻繁にリファクタリングされるプロジェクトにとって、semは従来のバージョン管理では提供できないセマンティック層の洞察を提供します。プロジェクトは比較的新しいものの、tree-sitterの堅牢な解析能力とRustの高性能実装により、開発者のツールボックスに価値ある追加となります。