Aict 完全指南:让 AI 编码 Agent 不再费力解析 Unix 命令输出
问题:AI 看不懂的 Unix 输出
AI 编码 Agent(Claude Code、Codex、Cursor 等)每天都在执行大量 Unix 命令——ls 查看目录、grep 搜索代码、cat 读取文件。但有一个尴尬的事实:这些命令的输出是为人类设计的。
-rw-r--r-- 1 user staff 2048 Apr 6 10:00 main.go -rw-r--r-- 1 user staff 1024 Apr 6 10:00 utils.go drwxr-xr-x 5 user staff 160 Apr 6 10:00 internal
Agent 拿到这样的输出后,需要猜测哪一列是文件大小、哪一列是修改时间,甚至要判断 internal 是文件还是目录。这不仅浪费 token,还容易出错——一个列对齐的变化就可能导致解析失败。
Aict 的解决方案
Aict 是一个用 Go 编写的命令行工具,它重新实现了 33 个常用 Unix 工具,默认输出结构化的 XML/JSON 格式,让 Agent 可以直接读取,无需任何解析。
同样是查看目录,Aict 的输出是这样的:
$ aict ls src/
每个字段都有明确的标签:路径永远是绝对路径、时间戳是 Unix 整数、语言和 MIME 类型自动检测——Agent 拿到后直接读取属性值即可。
安装
macOS(Homebrew)
brew tap synseqack/aict brew install aict
安装完成后会自动生成 bash 和 zsh 的 shell 补全。
Go 安装
go install github.com/synseqack/aict@latest
从源码编译
git clone https://github.com/synseqack/aict cd aict go build -o aict .
验证安装:运行 aict --help 应该列出所有可用工具。
快速上手
Aict 默认输出 XML(对 Agent 最友好),也支持 JSON 和纯文本模式:
aict ls src/ aict grep "func" . -r aict cat main.go aict ls src/ --json aict ls src/ --plain export AICT_XML=1
33 个工具的完整清单
Aict 将 33 个工具分为 6 大类,每类覆盖一个操作领域:
| 类别 | 工具 |
|---|---|
| 文件查看 | cat head tail file stat wc |
| 搜索与比对 | ls find grep diff |
| 路径工具 | realpath basename dirname pwd |
| 文本处理 | sort uniq cut tr sed awk |
| 数据与归档 | jq tar |
| 系统与环境 | env system ps df du checksums md5sum sha1sum sha256sum |
此外还包含 git(status / diff / log / ls-files / blame)、completions(shell 补全生成)和 doctor(自诊断)。
所有工具都支持 --xml(默认)、--json 和 --plain 三种输出格式。
MCP 服务器集成
Aict 内置了 MCP 服务器,通过 stdio 协议将全部工具暴露为可调用的 MCP 函数。这意味着 Claude Code、Cursor 等支持 MCP 的 Agent 可以直接像调用本地函数一样使用 Aict。
配置 Claude Desktop
编辑 ~/.config/claude/claude_desktop_config.json:
{
"mcpServers": {
"aict": {
"command": "aict",
"args": ["mcp"]
}
}
}
配置 Claude Code
编辑 ~/.claude.json:
{
"mcpServers": {
"aict": {
"command": "aict",
"args": ["mcp"]
}
}
}
配置完成后,Claude Code 可以原生调用 ls、grep、diff 等工具,接收结构化 JSON 结果。
输出格式约定
所有 Aict 工具遵循统一的输出约定:
| 字段类型 | 约定 |
|---|---|
| 路径 | 始终使用绝对路径(absolute 属性) |
| 时间戳 | Unix epoch 整数 + _ago_s 辅助字段 |
| 文件大小 | size_bytes(字节)+ size_human(人类可读) |
| 布尔值 | "true" / "false" 字符串 |
| 错误 | 元素——从不输出到 stderr |
| 空结果 | 有效 XML,计数为零,从不报错 |
Token 成本分析
Aict 的作者诚实地给出了 benchmark 数据:Aict 的输出比精简的 GNU 工具多消耗 1.1–7.8 倍 token。但这些 token 买来的是更少的往返调用和零解析歧义。
| 任务 | GNU 调用次数 | Aict 调用次数 | Token 对比 (GNU → Aict) |
|---|---|---|---|
| 列出目录(含大小/类型/语言) | 2 次 | 1 次 | 246 → 820 · 3.3× |
| 读取文件 + 行数 + 类型 | 3 次 | 1 次 | 173 → 274 · 1.6× |
查找 .go 文件(含大小/mtime) | 4 次 | 1 次 | 47 → 367 · 7.8× |
| Grep(含文件/行号/上下文) | 1 次 | 1 次 | 141 → 326 · 2.3× |
| Diff(含变更类型) | 1 次 | 1 次 | 167 → 192 · 1.2× |
在实际 Agent 评估中(opencode,相同任务每种工具跑 3 次),使用 Aict 的 Agent 生成了 约 46% 更少的输出 token(中位数 265 vs 487),且 3/3 全部正确——而使用 GNU 工具的 Agent 在一次执行中因信任了 file(1) 的语言检测结果而输出了有缺陷的报告。
FAQ 精选
为什么默认用 XML 而非 JSON?
XML 属性在上下文窗口中更紧凑。 比 {"size":1024,"lang":"go"} 更短。如果需要 JSON,用 --json 即可。
为什么不直接管道 GNU 工具到 jq?
ls、cat、stat、find、diff 等工具根本不输出 JSON,jq 无法处理它们。Aict 为整个工具链提供结构化输出。此外,Aict 也内置了自己的 jq 实现。
和 ripgrep 比怎么样?
纯搜索场景下 ripgrep 快得多。Aict 的 grep 增加了语言检测、MIME 类型和与其他工具一致的输出格式——速度敏感时用 ripgrep,Agent 需要结构化上下文时用 Aict。
安全吗?
Aict 是严格的只读工具。没有网络请求(MIME 检测使用 Go 标准库,不是 HTTP)、没有遥测、没有数据收集。它只读取你明确传入路径的文件。
总结
Aict 解决了一个实际但常被忽略的问题:AI 编码 Agent 与 Unix 工具之间的「格式鸿沟」。用结构化的 XML/JSON 替代人类可读的纯文本输出,让 Agent 更高效、更准确地理解文件系统信息。
对于经常使用 Claude Code、Codex 或 OpenCode 的开发者来说,配置 Aict 的 MCP 服务器是一次性投入,后续 Agent 的所有文件操作都能获得更精确的结构化数据。当 Agent 不再需要猜测列偏移时,它就能把 token 花在真正重要的事情上——写代码。
相关链接