sem
sem 是一款基于 Git 构建的语义化版本控制命令行工具。与传统工具仅关注代码行数的增减不同,sem 利用 tree-sitter 技术深入解析代码结构,将函数、类和方法识别为独立实体,从而在“实体级别”进行差异对比、责任追溯和影响分析。
它主要解决了传统代码审查中“只见行数变化,不见逻辑改动”的痛点。开发者不再需要面对晦涩的行号差异,而是能直接看到"authenticateUser 函数被修改”这样清晰的语义信息。此外,sem 还能通过跨文件依赖图谱,精准预测修改某个实体可能引发的连锁反应,帮助团队提前规避潜在风险。
这款工具非常适合软件开发者、技术负责人以及 DevOps 工程师使用,尤其适用于需要高质量代码审查、复杂重构或维护大型多语言项目的团队。目前支持包括 Rust、Python、TypeScript 等在内的 23 种主流编程语言。
sem 的独特亮点在于其无需任何配置即可在任何 Git 仓库中运行,并提供 JSON、Markdown 等多种输出格式,轻松集成到 CI 流水线或 AI 辅助开发流程中。无论是日常提交检查还是深度代码演进追踪,sem 都能让版本管理变得更加直观和高效。
使用场景
某电商平台的后端团队正在紧急重构用户认证模块,需要在不破坏现有支付流程的前提下,将 authenticateUser 函数迁移到新的微服务架构中。
没有 sem 时
- 开发者面对传统的 Git diff 只能看到行号变化,难以快速判断具体是哪个函数逻辑被修改,尤其在文件大幅重组时极易迷失。
- 评估修改影响范围全靠人工记忆或全局搜索,经常遗漏跨文件的依赖调用,导致支付接口因鉴权逻辑变更而意外崩溃。
- 代码审查(Code Review)效率低下,评审者需要逐行阅读大量无关的格式调整或注释变动,难以聚焦核心业务逻辑的演进。
- 追溯某个函数的历史变更时,必须手动翻阅冗长的提交记录,无法直观看到该实体在不同版本中的具体形态演变。
使用 sem 后
- 通过
sem diff直接以“函数”为单位展示差异,清晰呈现authenticateUser的参数与返回值变化,自动忽略无关的行级噪音。 - 运行
sem impact authenticateUser瞬间生成跨文件依赖图,精准定位所有受影响的支付回调和测试用例,提前规避回归风险。 - 利用
sem blame在实体级别查看责任人,快速确认谁最后修改了关键方法,结合sem log一键追踪该函数完整的迭代历史。 - 输出 Markdown 或 JSON 格式的语义化报告集成到 PR 描述中,让 AI 助手或非核心成员也能秒懂本次重构的具体业务含义。
sem 将版本控制从枯燥的“文本行对比”升级为智能的“业务实体分析”,让开发者真正掌控代码变更的逻辑本质而非表面字符。
运行环境要求
- Linux
- macOS
- Windows
无 GPU 需求
未说明

快速开始
基于 Git 的语义版本控制工具。
与按行比较不同,sem 能告诉你哪些代码实体发生了变化:函数、方法、类。
为什么选择 sem? · 安装 · 命令 · MCP 服务器 · 发布记录
sem 是一款基于 Git 的语义版本控制工具。它使用 tree-sitter 解析你的代码,将每个函数、类和方法提取为独立的代码实体,并在实体级别进行差异比较,而不是逐行比较。这意味着你会看到“函数 blahh 被修改”而不是“第 x 行到第 y 行发生了变化”。
它可以在任何 Git 仓库中直接使用,无需额外配置。
安装
brew install sem-cli
或者将 npm 包安装到 node_modules 中:
npm install --save-dev @ataraxy-labs/sem
如果你使用 Bun,需要信任该包以便其 postinstall 脚本能下载二进制文件:
bun add -d @ataraxy-labs/sem
bun pm trust @ataraxy-labs/sem
你也可以从源码构建(需要 Rust):
git clone https://github.com/Ataraxy-Labs/sem
cd sem/crates
cargo install --path sem-cli
或者直接从 GitHub Releases 下载预编译的二进制文件。
此外,还可以通过 Docker 运行:
docker build -t sem .
docker run --rm -it -u "$(id -u):$(id -g)" -v "$(pwd):/repo" sem diff
命令
sem 可以在任何 Git 仓库中使用,无需任何配置。它同样适用于非 Git 环境中的任意文件比较。
sem diff
实体级别的差异比较,支持重命名检测、结构化哈希以及单词级别的内联高亮。
# 工作区更改的语义差异
sem diff
# 仅暂存区的更改
sem diff --staged
# 指定提交
sem diff --commit abc1234
# 提交范围
sem diff --from HEAD~5 --to HEAD
# 详细模式(每个实体的单词级内联差异)
sem diff -v
# 纯文本输出(类似 git status 格式)
sem diff --format plain
# JSON 输出(适用于 AI 代理、CI 流水线)
sem diff --format json
# Markdown 输出(适用于 PR、报告)
sem diff --format markdown
# 比较任意两个文件(无需 Git 仓库)
sem diff file1.ts file2.ts
# 从标准输入读取文件变更(无需 Git 仓库)
echo '[{"filePath":"src/main.rs","status":"modified","beforeContent":"...","afterContent":"..."}]' \
| sem diff --stdin --format json
# 仅针对特定文件类型
sem diff --file-exts .py .rs
sem impact
跨文件依赖图展示了当某个代码实体发生变化时,哪些部分会受到影响。
# 全面的影响分析
sem impact authenticateUser
# 仅显示直接依赖
sem impact authenticateUser --deps
# 仅显示直接被依赖者
sem impact authenticateUser --dependents
# 仅显示受影响的测试
sem impact authenticateUser --tests
# JSON 输出
sem impact authenticateUser --json
# 按文件细化结果
sem impact authenticateUser --file src/auth.ts
sem blame
实体级别的代码归属追踪,显示每个函数、类或方法的最后修改人。
sem blame src/auth.ts
# JSON 输出
sem blame src.auth.ts --json
sem log
跟踪单个代码实体在整个 Git 历史中的演变过程。
sem log authenticateUser
# 详细模式(显示各版本之间的内容差异)
sem log authenticateUser -v
# 限制扫描的提交数量
sem log authenticateUser --limit 20
# JSON 输出
sem log authenticateUser --json
sem entities
列出文件中的所有代码实体及其类型和所在行范围。
sem entities src/auth.ts
# JSON 输出
sem entities src.auth.ts --json
sem context
为大模型量身定制的上下文信息:目标代码实体、其依赖项和被依赖项,可根据指定的 token 预算进行裁剪。
sem context authenticateUser
# 自定义 token 预算
sem context authenticateUser --budget 4000
# JSON 输出
sem context authenticateUser --json
设置为默认的 Git diff
用实体级别的差异替换 git diff 的输出。无论是自动化工具还是人工操作,都会自动获得 sem 的输出,而无需更改任何命令。
sem setup
现在,git diff 将显示实体级别的变更,而非逐行差异。无需任何提示,也无需额外配置代理。所有调用 git diff 的地方都会自动使用 sem 的输出。此外,还会安装一个 pre-commit 钩子,用于展示暂存区更改所影响的实体范围。
若要恢复为正常的 Git diff:
sem unsetup
解析的内容
通过 Tree-sitter 实现完整实体提取的 23 种编程语言:
| 语言 | 扩展名 | 实体 |
|---|---|---|
| TypeScript | .ts .tsx .mts .cts |
函数、类、接口、类型、枚举、导出 |
| JavaScript | .js .jsx .mjs .cjs |
函数、类、变量、导出 |
| Python | .py |
函数、类、装饰器定义 |
| Go | .go |
函数、方法、类型、变量、常量 |
| Rust | .rs |
函数、结构体、枚举、实现块、特质、模块、常量 |
| Java | .java |
类、方法、接口、枚举、字段、构造函数 |
| C | .c .h |
函数、结构体、枚举、联合、类型别名 |
| C++ | .cpp .cc .hpp |
函数、类、结构体、枚举、命名空间、模板 |
| C# | .cs |
类、方法、接口、枚举、结构体、属性 |
| Ruby | .rb |
方法、类、模块 |
| PHP | .php |
函数、类、方法、接口、特质、枚举 |
| Swift | .swift |
函数、类、协议、结构体、枚举、属性 |
| Elixir | .ex .exs |
模块、函数、宏、守卫、协议 |
| Bash | .sh |
函数 |
| HCL/Terraform | .hcl .tf .tfvars |
块、属性(嵌套块的限定名称) |
| Kotlin | .kt .kts |
类、接口、对象、函数、属性、伴生对象 |
| Fortran | .f90 .f95 .f |
函数、子程序、模块、程序 |
| Vue | .vue |
模板/脚本/样式块 + 内部 TS/JS 实体 |
| XML | .xml .plist .svg .csproj |
元素(嵌套,标签名标识) |
| ERB | .erb .html.erb |
块、表达式、代码标签 |
| Svelte | .svelte .svelte.js .svelte.ts |
组件块 + Rune JS/TS 模块 |
| Perl | .pl .pm .t |
子程序、包 |
| Dart | .dart |
类、混入、扩展、枚举、类型别名、函数 |
此外,还包括结构化数据格式:
| 格式 | 扩展名 | 实体 |
|---|---|---|
| JSON | .json |
属性、对象(RFC 6901 路径) |
| YAML | .yml .yaml |
节、属性(点号路径) |
| TOML | .toml |
节、属性 |
| CSV | .csv .tsv |
行(第一列作为标识) |
| Markdown | .md .mdx |
基于标题的章节 |
其他所有内容则回退到基于块的差异比较。
匹配机制
三阶段实体匹配:
- 精确 ID 匹配 — 前后相同的实体 = 已修改或未更改
- 结构哈希匹配 — AST 结构相同但名称不同 = 重命名或移动(忽略空格和注释)
- 模糊相似度 — 令牌重叠率 >80% = 可能是重命名
这意味着 sem 不仅能检测添加和删除,还能检测重命名和移动。结构哈希还能区分外观上的变化(如空格、格式)与实际逻辑变化。
MCP 服务器
sem 包含一个 MCP 服务器,为 AI 代理提供 6 种工具:sem_entities、sem_diff、sem_blame、sem_impact、sem_log、sem_context。这些工具与 CLI 命令完全一致。
{
"mcpServers": {
"sem": {
"command": "sem-mcp"
}
}
}
安装 MCP 二进制文件:
cd sem/crates
cargo install --path sem-mcp
JSON 输出
sem diff --format json
{
"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(语义合并驱动)和 inspect(实体级代码审查)所使用。
架构
- Tree-sitter 用于代码解析(原生 Rust,非 WASM)
- git2 用于 Git 操作
- rayon 用于并行文件处理
- xxhash 用于结构哈希
- 插件系统用于添加新语言和格式
贡献
想添加一种新语言吗?请参阅 CONTRIBUTING.md,获取分步指南。
星标历史
许可证
MIT 或 Apache-2.0
版本历史
v0.3.202026/04/14v0.3.192026/04/13v0.3.182026/04/13v0.3.172026/04/12v0.3.162026/04/11v0.3.152026/04/10v0.3.142026/04/07v0.3.132026/04/03v0.3.122026/04/02v0.3.102026/03/15v0.3.92026/03/10v0.3.82026/03/09v0.3.72026/03/08v0.3.62026/03/08v0.3.52026/03/06v0.3.42026/03/01v0.3.32026/02/22v0.3.22026/02/15v0.3.12026/02/13v0.3.02026/02/12常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
gemini-cli
gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。
markitdown
MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器
