sem is a semantic differ — it shows what functions, structs, and modules changed instead of raw line diffs. A high-level overview of what actually happened, without reading through every changed line.
Especially useful for agentic engineering: when an AI agent makes changes across multiple files, sem diff tells you what it touched at a glance.
brew install sem-cliKey commands: sem diff, sem blame, sem impact, sem log, sem entities, sem context.
Here is an example from my toy DNS server in Rust — sem diff HEAD~1 after a refactor that moved functions from main.rs into modules:
┌─ src/dns_message.rs ────────────────────────────────
│
│ ⊕ function parse_request [added]
│ ⊕ function create_response_header [added]
│ ⊕ function build_response [added]
│
└───────────────────────────────────────────────────────
┌─ src/main.rs ───────────────────────────────────────
│
│ ∆ function main [modified]
│ ⊖ function parse_request [deleted]
│ ⊖ function create_response_header [deleted]
│ ⊖ function build_response [deleted]
│ ⊕ module dns_message [added]
│ ⊕ module server [added]
│
└───────────────────────────────────────────────────────
Summary: 16 added, 1 modified, 8 deleted across 5 filesAnd sem blame src/main.rs:
┌─ src/main.rs
│
│ ⊕ module dns_header da6257ce Kostiantyn Lysenko 2025-10-12 add: implemented DNS header parsing
│ ⊕ module dns_message d6ca5503 Kostiantyn Lysenko 2025-12-29 re-factor: modularize DNS server code...
│ ⊕ module forwarder d6ca5503 Kostiantyn Lysenko 2025-12-29 re-factor: modularize DNS server code...
│ ⊕ module server d6ca5503 Kostiantyn Lysenko 2025-12-29 re-factor: modularize DNS server code...
│ ⊕ struct Args 20039b7b Kostiantyn Lysenko 2025-12-06 add: inital implementation of calling...
│ ⊕ function main d6ca5503 Kostiantyn Lysenko 2025-12-29 re-factor: modularize DNS server code...
│
└────────────────────────────────────────────────────────────Every entity, its last commit, and why it changed — at a glance.
sem also ships with an MCP server. If you want to use it with Claude Code:
claude mcp add -s user sem -- sem mcp