工作流
在终端里跑 TinyOwl(也给 AI 编程助手用)
TinyOwl 桌面版把尺寸调整、压缩和可选上传保存成可复用的工作流。装好命令行后,同一套流程也能在终端、构建脚本或 AI 编程助手里直接跑,不用打开桌面窗口。
本文初稿由 AI 辅助整理;所有命令、参数与输出细节均由 TinyOwl 团队对照 docs/cli.md 及 Apple 芯片上的 TinyOwl v0.8.x 真实命令行实测核对。
版本说明:本文基于 TinyOwl v0.8.x 核对;适用于 macOS 12 及以上的 Apple 芯片 Mac。
和桌面版同一套工作流,无窗口运行
日常用桌面版时,TinyOwl 首页 那套体验很直接:把尺寸、本地压缩和可选上传串成一条工作流,截图后按 Command + V,或把文件拖进窗口就能跑完。
不过自动化场景里,点窗口就不太合适了:
- 文档与网站静态构建: 博客发版或静态站点打包前,希望由构建脚本自动优化
public或assets目录下的所有新配图。 - 本地代码库 Git Hook: 在提交包含大图的 Pull Request 之前,自动拦截并按团队规范完成压缩。
- AI 编程助手协作: 使用 Cursor Agent、Claude Code 或 Codex 编写技术文档和前端页面时,让助手直接在终端调用本地工具处理图片并产出 Markdown 链接。
如果另写一套 Node 或 Python 脚本,既要维护 Sharp 这类本地依赖,又要重新配质量参数和云存储密钥。
TinyOwl 命令行直接复用你在桌面端已经调好的同一套工作流。带参数运行时不会弹出主窗口,不会激活程序坞,不会常驻菜单栏,也不会加载 WebView,用完就退出。
更完整的参数列表与选项,可以参阅命令行工具使用指南。
一键安装,无需 sudo
TinyOwl 只有一个应用包、一个可执行文件。双击打开是图形界面;在终端带参数调用同一个文件,就是命令行模式。
启用命令非常简单:
- 首次打开 TinyOwl 桌面端时,应用会弹窗询问是否一键启用命令行。
- 平时也可以随时进入 设置 → 基本设置 → 命令行工具 进行安装或卸载。
无论哪种方式,都只在 ~/.local/bin/tinyowl 创建一个指向应用包内可执行文件的符号链接。
整个安装过程遵循安全原则:
- 从不调用
sudo,也不要求任何管理员密码。 - 从不修改 Shell 配置文件(例如
~/.zshrc或~/.bashrc)。 - 从不覆盖已有文件,若已有同名文件或属于其他工具的链接,绝不强行替换。
如果你的系统尚未将 ~/.local/bin 加入环境变量,应用界面会直接提示需要添加到 PATH 的确切路径。
如果你习惯用脚本配置新 Mac 工作机,可以直接通过应用包执行无人值守安装:
/Applications/TinyOwl.app/Contents/MacOS/TinyOwl cli install
如果日后想移除命令,卸载指令只会清理 TinyOwl 自己创建的符号链接:
tinyowl cli uninstall
三条真实命令与真实 JSON
命令行的输入输出尽量稳定、可解析。下面三条分别是:列出工作流、预演、正式运行。
1. 查询当前可用的工作流列表
通过 --json 参数可以快速获取本机已配置的工作流定义:
tinyowl workflows list --json
{
"ok": true,
"workflows": [
{ "id": "workflow-compress-only", "name": "只压缩" },
{ "id": "workflow-compress-and-upload", "name": "压缩并上传" },
{ "id": "workflow-resize-compress-and-upload", "name": "调整后上传" }
]
}
传入 --json 时,stdout 只输出一条 JSON;进度和诊断信息都走 stderr。英文界面下,中文工作流名称也会原样保留;机器标识用稳定的工作流 ID(例如 workflow-compress-only)。
2. 通过 dry-run 模拟执行计划
在正式写入磁盘或发起网络请求之前,你可以先查看执行计划:
tinyowl run workflow-compress-only ~/Pictures/TinyOwl-demo.png --dry-run --json
{
"ok": true,
"dryRun": true,
"plan": {
"workflow": { "id": "workflow-compress-only", "name": "只压缩" },
"inputCount": 1,
"items": [
{
"path": "~/Pictures/TinyOwl-demo.png",
"plannedOutputPath": "~/Desktop/zipic/73e34bef.png",
"supported": true
}
],
"compression": { "quality": 75, "outputFormat": "original" },
"license": { "authorized": true, "required": false }
}
}
计划里能看到输入文件、计划输出路径、是否支持该格式、压缩质量与输出格式,以及当前是否已授权。
3. 正式运行工作流
确认无误后,指定目标图片与输出目录即可执行:
tinyowl run workflow-compress-only ~/Pictures/TinyOwl-demo.png --output-dir ~/Pictures/optimized
处理后的图片会写到 ~/Pictures/optimized。整批成功时退出码是 0。传入文件夹时会按固定顺序递归扫描,不会跟随目录符号链接。
AI 编程助手如何调用
当前主流的 AI 编程助手(如 Cursor Agent、Claude Code 等)基本都是通过执行 Bash 工具调用命令行。但在调用传统 CLI 工具时,AI 经常会遇到几个痛点:终端 ANSI 颜色代码干扰解析、动态进度条混入输出流、遇到意外覆盖时工具原地等待用户交互等。
TinyOwl 命令行比较适合这种用法:
- 标准流分开: 配合
--json,stdout只有最终 JSON,没有颜色码或进度条,助手可以用JSON.parse或jq解析。 - 退出码固定: 不用从文本里猜有没有报错,看退出码就行。
- 不卡在交互上: 覆盖或裁剪这类操作不会挂起等你按回车,而是直接失败并返回专用退出码,避免 agent 卡住。
- 可以先预演: 改项目静态资源前,先跑
--dry-run --json,确认输入和授权状态。
AI 编程助手用自带的终端工具直接调用 tinyowl 即可。
限制条件、安全标记与退出码
在无人值守脚本里跑,有几条边界要先知道:
安全标记与覆盖确认
- 覆盖原文件与裁剪保护: 若工作流配置了「覆盖源文件」或者包含固定比例的「裁剪画框」步骤,在命令行中执行必须显式添加
--yes参数。未带--yes时命令会立即终止并返回退出码4。 - 本地纯处理: 若某条工作流包含上传步骤,但你在 CI 或离线环境中只需要缩放和压缩,加上
--skip-upload即可跳过云端传输。
授权边界
- 单张图片: 处理单张支持格式的图片遵循 TinyOwl 的免费规则。
- 批量处理: 批量需要与桌面端相同的有效许可证或试用。未授权时,批处理会失败,并返回需要授权类退出码(文档中为
3)。
隐私保护与存储凭证安全
- 配置来源: 命令行直接读取桌面端现有的
settings.json配置文件。 - 不读钥匙串、不把密钥写进参数: 命令行不访问 macOS 钥匙串,也不接受把 Access Key、Secret Key 或 Session Token 当作参数传入,避免密钥进 shell 历史、进程列表或 agent 日志。
- 只输出是否就绪: 输出里只有就绪状态这类布尔值,不打印密钥;云服务返回的错误也会先打码再输出。
完整退出码对照表
脚本和 AI 工具可以按这些退出码分支:
| 退出码 | 状态含义 | 建议处理方式 |
|---|---|---|
0 | 成功(Success) | 全部文件处理成功,正常继续。 |
2 | 用法或配置错误(Usage) | 检查传入参数、文件路径是否存在或命令格式是否有误。 |
3 | 需要授权(Authorization Required) | 批量处理需要有效授权或许可试用,检查桌面端授权状态。 |
4 | 需要显式确认(Confirmation Required) | 工作流包含覆盖或裁剪操作,需在命令中补充 --yes 参数。 |
5 | 部分失败(Partial Failure) | 批次中部分文件成功、部分失败,解析返回的单文件状态逐个排查。 |
6 | 完全失败(Execution Failure) | 整个批次或核心执行流程失败。 |
7 | 工作流名称歧义(Ambiguous Workflow) | 存在多个同名工作流,请改用唯一的 workflow-id 调用。 |
稳定的 JSON、明确的安全边界和固定退出码,让桌面端调好的工作流也能直接进脚本和 AI 编程对话。