V2EX 的各位好,dtool 是一个给 AI Agent 用的本地 Excel 数据流水线 CLI:Excel 转数据集,AI 写 SQL ,dtool 执行、留痕、出图,数据不出本地。之前发过 v0.3.0 ,这次是 v0.4.0 。
v0.3.0 用下来,有两个痛点比较硬:
痛点一:SQL 引擎只有 SQLite ,分析型查询有天花板。
日常 GROUP BY 、窗口函数够用,但一遇到多维小计就难受——ROLLUP / CUBE / GROUPING SETS 全不支持,只能拿 UNION ALL 硬拼,SQL 又长又容易写错。表一宽、数据一多,体验就卡在这。更根本的问题是,引擎是写死在里面的,想换、想加,没有口子。
痛点二:convert 一跑就落盘,Schema 生成即事实。
Excel 丢进去,列类型、可空性、唯一性直接定死,猜错了只能等查询跑偏了再回头重跑。数据入口没有可复核的中间态。同样地,转换器本身也是内部实现,想加个新格式、改个推断逻辑,都得动核心代码。
v0.4.0 的思路不是单点打补丁,而是把引擎和转换器这两层都抽成接口,让能力扩展变成可插拔的事。
引擎接口化:SQLite 之外,DuckDB 正式接入
所有 v0.4.0 发布二进制现在同时内置 SQLite + DuckDB,单文件零依赖的契约不变,不用另装。DuckDB 补上了 SQLite 在分析型查询上的短板,ROLLUP / CUBE / GROUPING SETS 这类多维小计不再只能拿 UNION ALL 硬凑。SKILL.md 也补了引擎方言、沙箱边界和跨引擎哈希的说明,避免 Agent 拿 SQLite 的习惯去写 DuckDB 。
关键不在“多了一个引擎”,而在引擎变成了接口:后端可扩展,后面再加新引擎是接一个实现的事,不用反复动核心。DuckDB 是第一个走通这条路的,不是最后一个。
代价是依赖里多了 duckdb-go/v2 、arrow-go/v18 这些,二进制会大一些。另外这版不再提供 windows/arm64 构建,Windows 用 amd64 的没影响。
转换器接口化:可预演练,也为新格式留了口子
转换器从内部实现提升为接口层。直接效果是可以先预演练,确认之后再正式落盘——列类型、可空性、唯一性这些判断,能在写盘之前拦住,Excel 入口从“生成即成事实”变成了可审阅的一步。
同样地,接口化的意义不止于预演练:转换器可扩展,后续接入新的输入格式、替换推断策略,都是按接口加实现,不用改核心。今天受益的是 Excel 的预演练,明天受益的是“再加一种格式”。
没变的
单二进制零依赖、默认强隐私( stdout 只给路径 + SHA256 ,不打印数据内容)、Action 台账、stdout 结构化 JSON 、退出码 4 = 跑完但出错 / 5 = 可重跑、默认沙箱只放单条 SELECT / WITH 、图表单图 1000 点上限。这些契约都保留。
一句话:v0.3.0 立规矩,v0.4.0 把引擎层和转换层都接口化了——DuckDB 和 Excel 预演练是这次看得见的两项新能力,可扩展性是留在底下的那条线。隐私和留痕的底线没动。
- 仓库: https://github.com/dezhishen/dtool
- Release: https://github.com/dezhishen/dtool/releases/tag/v0.4.0
- MIT ,单二进制,Linux / macOS / Windows 。
快速开始
dtool 的发布包是完整包:二进制、SKILL.md、README.md、LICENSE、THIRD_PARTY_NOTICES.md 都在同一个压缩包里。无论走哪条安装路径,目标都是把这一整套落到机器上——技能描述和可执行文件一起装,不用分两次。
方式一:对话安装(最省事,技能 + 二进制一次到位)
不用开终端,直接在 Agent 聊天框里发一句话。
OpenClaw:
请帮我安装 dtool 这个 skill ,完整包(含 dtool 二进制),从 https://github.com/dezhishen/dtool 拉取。
支持 SkillHub 对话安装的 Agent( QClaw 、WorkBuddy 、Kimi 、Claude 等):
根据 https://skillhub.cn/install/skillhub.md 安装 SkillHub 商店,然后安装 dtool 技能完整包(含二进制),技能页面是 https://skillhub.cn/skills/indiv-sdz/dtool ,源码仓库是 https://github.com/dezhishen/dtool 。
Agent 会把技能描述和二进制一起装好。装完在会话里让它跑一句 dtool version,有版本输出就说明二进制也到位了。
方式二:GitHub Releases 手动下载(离线 / 想自己控制路径)
Releases 页面: https://github.com/dezhishen/dtool/releases
Linux / macOS:
V=$(curl -sSL https://api.github.com/repos/dezhishen/dtool/releases/latest \
| sed -n 's/.*"tag_name": *"\([^"]*\)".*/\1/p')
base=https://github.com/dezhishen/dtool/releases/download/$V
curl -LO "$base/dtool_${V#v}_linux_amd64.tar.gz" && curl -LO "$base/checksums.txt"
sha256sum -c --ignore-missing checksums.txt
tar -xzf "dtool_${V#v}_linux_amd64.tar.gz"
ls # dtool 、SKILL.md 、README.md 、LICENSE 、THIRD_PARTY_NOTICES.md
install -m 0755 dtool ~/.local/bin/
mkdir -p ~/.claude/skills/dtool && cp SKILL.md ~/.claude/skills/dtool/
dtool version
Windows:下载 dtool_<版本>_windows_amd64.zip,解压得到 dtool.exe、SKILL.md、README.md、LICENSE、THIRD_PARTY_NOTICES.md。dtool.exe 放进 PATH,SKILL.md 复制到 Agent 技能目录。v0.4.0 不再提供 windows/arm64 构建,amd64 不受影响。
方式三:OpenClaw 原生命令
openclaw skills install @indiv-sdz/dtool
# 或直接从 GitHub 仓库装
openclaw skills install git:dezhishen/dtool
# 装到共享目录(所有 Agent 可见)
openclaw skills install @indiv-sdz/dtool --global
不加 --global 默认装到当前工作区 ./skills/。装完 openclaw skills list 确认,再跑 dtool version 验证二进制。
方式四:ClawHub CLI ( OpenClaw 生态的标准包管理)
npm i -g clawhub # 需要 Node.js 22.13+ 或 24+
clawhub install <skill-slug>
clawhub list
默认装到 ./skills/ 并记录版本到 .clawhub/lock.json。ClawHub 的 GitHub 仓库:https://github.com/openclaw-community/openclaw-hub。
方式五:SkillHub CLI (国内镜像,跨平台通用)
curl -fsSL https://skillhub.cn/install/install.sh | bash
skillhub install dtool
skillhub link # 自动链接到本机检测到的 Agent 技能目录
SkillHub 技能页:https://skillhub.cn/skills/indiv-sdz/dtool。装完同样用 dtool version 验证二进制。
方式六:手动复制(离线 / 私有环境兜底)
如果手头只有仓库源码、拿不到 Releases 包:
git clone https://github.com/dezhishen/dtool.git
mkdir -p ~/.claude/skills/dtool
cp dtool/SKILL.md ~/.claude/skills/dtool/
这条路径只复制了技能描述,二进制需要另外从 Releases 下载或自行编译。OpenClaw 全局技能目录是 ~/.openclaw/skills/,项目级是 <项目>/.openclaw/skills/。
装完验证
新开一个 Agent 会话,发一句:
用 dtool 查一下当前版本,然后帮我看看工作区里有哪些数据集。
dtool version 能返回版本号、dtool query 能返回结构化 JSON ,才算技能和二进制都就绪。如果 Agent 提示找不到 dtool,检查二进制是否在 PATH 里;如果技能列表里有 dtool 但 Agent 不主动调用,检查技能是否落到了 Agent 实际加载的 skills 目录。
跑第一条流水线
# Excel → 数据集( v0.4.0 可先预演练 Schema ,确认后再落盘)
dtool convert --input sales.xlsx --name sales
# SQL 查询,数据集名直接当表名
dtool query --sql 'SELECT region, SUM(amount) AS total FROM sales GROUP BY region ORDER BY total DESC'
# 出图,引用上一次查询结果,不用重跑
dtool visualize --input latest:query --type bar --x region --y total --title "区域销量" --output out/sales.png
# 一条龙
dtool pipeline --excel sales.xlsx \
--sql 'SELECT region, SUM(amount) AS total FROM data GROUP BY region' \
--chart bar --x region --y total --output out/summary.png
每步 stdout 都是结构化 JSON ,含 action_id、产物路径和 SHA256 ;失败时 stdout 仍是 JSON ,退出码非 0 。数据不出本地,AI 只负责写 SQL 和出图思路,执行和留痕交给 dtool 。
关键地址汇总:
- GitHub 仓库:
https://github.com/dezhishen/dtool - GitHub Releases (完整包:二进制 + SKILL.md + README + LICENSE + THIRD_PARTY_NOTICES ):
https://github.com/dezhishen/dtool/releases - SkillHub 技能页:
https://skillhub.cn/skills/indiv-sdz/dtool