Know what changed.

Semantic understanding on top of Git.
Diff, blame, impact, log. Functions, not lines.

copied $ brew install sem-cli
~/project

      

Same commit. Different lens.

Left: what git shows you. Right: what actually happened.

git diff
diff --git a/src/auth/login.ts b/src/auth/login.ts
index 4a2b1c0..8f3d2e1 100644
--- a/src/auth/login.ts
+++ b/src/auth/login.ts
@@ -12,6 +12,18 @@
+export function validateToken(token: string) {
+  const decoded = jwt.verify(token, SECRET);
+  if (!decoded.exp || decoded.exp < Date.now()) {
+    throw new TokenExpiredError();
+  }
+  return decoded;
+}
+
@@ -24,8 +36,10 @@
 export async function authenticateUser(
-  const user = await db.findUser(email);
-  if (!user) return null;
+  const user = await db.findUser(email);
+  if (!user) throw new UserNotFoundError();
+  await rateLimiter.check(email);
@@ -45,12 +59,0 @@
-export function legacyAuth(user, pass) {
-  return db.query('SELECT * FROM users
-    WHERE email = ? AND password = ?',
-    [user, pass]);
-}
sem diff
┌─ src/auth/login.ts ────────────────

   function  validateToken    [added]
   function  authenticateUser [modified]
   function  legacyAuth       [deleted]

└────────────────────────────────────

3 entities changed across 1 file

AI agents are 2.3x more accurate when given sem output vs raw line diffs. See the benchmark.

Six commands. One binary.

Everything works in any Git repo. No config. No plugins.

sem diff
What changed? Entity-level diffs with rename detection, structural hashing, and word-level inline highlights.
   function  validateToken    [added]
   function  authenticateUser [modified]
   function  legacyAuth       [deleted]
sem blame
Who changed it? Per-entity blame showing the last commit that touched each function, class, or method.
   render_inline_diff  a1a6fbf  Rohan  04-03
   format_terminal     a1a6fbf  Rohan  04-03
sem impact
What breaks? Cross-file dependency graph shows every entity that depends on a given function, plus affected tests.
⊕ function authenticateUser
  → depends on:  db.findUser, rateLimiter
  ← used by:    loginRoute, authMiddleware
  ! 42 entities transitively affected
sem log
How did it evolve? Git history for a single entity. See every commit that touched a specific function.
  ae576ab  Rohan  02-05  added
  a105183  Rohan  02-08  modified (logic)
  a1a6fbf  Rohan  04-03  modified (logic)
sem entities
What's under a path? Lists every function, class, method, and type with line ranges.
entities: src/auth/login.ts
  function validateToken     (L12:24)
  function authenticateUser  (L26:45)
  interface AuthConfig       (L47:52)
sem context
Smart context for AI. Token-budgeted context window: the entity, its dependencies, and dependents. Fits in any LLM prompt.
context for authenticateUser (budget: 8000)
  target:          ~705 tokens
  dependencies:    ~256 tokens
  dependents:      ~812 tokens

All commands support --json for machine-readable output. Full reference.

Your stack. Covered.

26 languages. 5 data formats. One binary.

TypeScript
JavaScript
Python
Go
Rust
Java
C
C++
C#
Ruby
PHP
Swift
Kotlin
Elixir
Bash
HCL
Fortran
Vue
Svelte
XML
ERB
Dart
Perl
OCaml
Scala
Zig
JSON
YAML
TOML
CSV
Markdown
8ms typical diff
26 languages
0 config needed
4,000+ downloads

Try it. 10 seconds.

$ brew install sem-cli
$ sem setup
 Created wrapper script
 Set git config --global diff.external = sem
 Pre-commit hook installed

Done! Running git diff in any repo will now use sem.
  To revert, run: sem unsetup

One command. Every git diff becomes a sem diff. No config files.
Also: cargo install --git https://github.com/Ataraxy-Labs/sem sem-cli