autoclaw 1.3.5 → 1.3.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/README.md +56 -3
  2. package/README.zh-CN.md +347 -294
  3. package/dist/agent.js +13 -1
  4. package/dist/index.js +75 -1
  5. package/dist/skills.js +278 -0
  6. package/dist/tools/index.js +4 -0
  7. package/dist/tools/render-image.js +135 -0
  8. package/dist/tools/render-pdf.js +111 -0
  9. package/dist/tools/takumi-fonts.js +61 -0
  10. package/dist/zip.js +149 -0
  11. package/package.json +7 -4
  12. package/skills/code2media/SKILL.md +82 -0
  13. package/skills/code2media/references/syntax-guide.md +63 -0
  14. package/skills/code2media/scripts/package.json +10 -0
  15. package/skills/code2media/scripts/render.mjs +177 -0
  16. package/skills/code2media/templates/animation.html +19 -0
  17. package/skills/code2media/templates/badge.html +6 -0
  18. package/skills/code2media/templates/certificate.html +9 -0
  19. package/skills/code2media/templates/metrics-card.html +25 -0
  20. package/skills/code2media/templates/weekly-report.html +86 -0
  21. package/skills/invoice-maker/SKILL.md +65 -0
  22. package/skills/invoice-maker/references/syntax-guide.md +63 -0
  23. package/skills/invoice-maker/scripts/package.json +10 -0
  24. package/skills/invoice-maker/scripts/render.mjs +177 -0
  25. package/skills/invoice-maker/templates/invoice.html +26 -0
  26. package/skills/invoice-maker/templates/quote.html +68 -0
  27. package/skills/poster-maker/SKILL.md +83 -0
  28. package/skills/poster-maker/references/scenario-playbook.md +85 -0
  29. package/skills/poster-maker/references/syntax-guide.md +63 -0
  30. package/skills/poster-maker/scripts/package.json +10 -0
  31. package/skills/poster-maker/scripts/render.mjs +177 -0
  32. package/skills/poster-maker/templates/cover.html +13 -0
  33. package/skills/poster-maker/templates/og-card.html +17 -0
  34. package/skills/poster-maker/templates/social-post.html +14 -0
package/README.zh-CN.md CHANGED
@@ -1,295 +1,348 @@
1
- # AutoClaw 🦞
2
-
3
- [![NPM Version](https://img.shields.io/npm/v/autoclaw.svg?style=flat-square)](https://www.npmjs.com/package/autoclaw)
4
- [![NPM Downloads](https://img.shields.io/npm/dm/autoclaw.svg?style=flat-square)](https://www.npmjs.com/package/autoclaw)
5
- [![GitHub](https://img.shields.io/badge/GitHub-Repository-blue?logo=github&style=flat-square)](https://github.com/tsingliuwin/autoclaw)
6
- [![License](https://img.shields.io/npm/l/autoclaw.svg?style=flat-square)](https://github.com/tsingliuwin/autoclaw/blob/main/LICENSE)
7
- [![Safety](https://img.shields.io/badge/Safety-Notice-yellow?style=flat-square)](./SAFETY.md)
8
- [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
9
-
10
- **稳定、高工程化、易规模化:专为无界面系统设计的高效自动化 Agent 框架。**
11
-
12
- [English](./README.md) | 简体中文
13
-
14
- ---
15
-
16
- 🔗 **GitHub 仓库**: [https://github.com/tsingliuwin/autoclaw](https://github.com/tsingliuwin/autoclaw)
17
-
18
- ---
19
-
20
- AutoClaw 是一款针对 **“无界面系统” (Headless Systems)** 的高稳定性自动化 Agent 开源框架。
21
-
22
- 相比于 OpenClaw 等需要“看屏幕”的 Agent(如视觉解析),AutoClaw 采用纯指令驱动,具有更强的**工程化**属性、更高的**稳定性**,以及极易**规模化**的特点。它专为在各种复杂环境中执行确定性的自动化任务而设计——无论是本地服务器、CI/CD 流水线,还是成千上万个容器节点。
23
-
24
- ## 为什么选择 AutoClaw?
25
-
26
- - 🐳 **Docker 友好**: 专为容器化环境设计,无 GUI 依赖,极致轻量(Node.js/Alpine 友好)。
27
- - 🚀 **更强工程化 (Better Engineering)**: 并非依赖不稳定的视觉识别,而是通过系统 API 和 Shell 指令精准操作,确保任务执行的确定性。
28
- - 🛡️ **高稳定性 (Superior Stability)**: 摆脱了图形界面渲染、屏幕分辨率、网络延迟对视觉识别的影响,即便在极端的 Headless 环境下也能稳定运行。
29
- - 📈 **易于规模化 (Massive Scalability)**: 低资源占用使得你可以同时编排成千上万个 Agent 实例(如在 Kubernetes 集群中),实现真正的自动化蜂群。
30
- - 🔌 **集群就绪 (Swarm Ready)**: 无状态设计,支持通过 K8s、Docker Swarm 或简单的 Shell 脚本进行大规模调度。
31
- - 🧩 **可扩展集成**: 内置支持网页搜索 (Tavily)、邮件发送 (SMTP) 以及通知钩子 (飞书、钉钉、企业微信)。
32
-
33
- ## 特性
34
-
35
- - 📜 **无头执行 (Headless Execution)**: 无需图形界面,纯终端运行。核心流程仅依赖 Shell 与文件操作;可选的网页工具在无头 Chromium 中运行。
36
- - 🤖 **非交互模式**: 支持自动化标志(`-y`, `--no-interactive`),完美适配零干预的自动化流程。
37
- - 📂 **全方位控制 (Universal Control)**: 从基础的文件 I/O 到复杂的系统管理。
38
- - 🖥️ **后台进程**: 后台启动长期命令(开发服务器、watcher)并轮询输出,不阻塞任务运行。
39
- - 🛡️ **安全护栏**: 破坏性命令闸、凭据文件防线、步数上限、墙钟超时与 API 重试——为没有人看着的机器而设计。
40
- - 🧠 **上下文感知 (Context Aware)**: 提供精确的操作系统与时间上下文,正确处理"今天"、"下周一"等相对时间。
41
- - 🌐 **网页搜索**: 集成 Tavily,支持实时信息检索。
42
- - 🌍 **网页阅读与截图**: 提取文章正文、截取页面图片(需先执行 `npx playwright install chromium`)。
43
- - 🎨 **图像生成**: 通过任意 OpenAI 兼容的图像接口生成图片(兼容 DALL-E)。
44
- - 🕒 **时间精准**: 内置工具获取精确系统日期和时间,确保正确的时间上下文。
45
- - 📧 **通讯能力**: 自动发送电子邮件并将通知推送至聊天群组。
46
-
47
- ## 技术栈
48
- - **运行时**: Node.js
49
- - **语言**: TypeScript
50
- - **框架**: Commander.js
51
- - **UI**: Inquirer (交互), Chalk (样式), Ora (加载动画)
52
- - **AI**: OpenAI SDK(任意 OpenAI 兼容端点:DeepSeek、Kimi、Qwen、GLM、Ollama 等)
53
- - **网页工具**: Playwright(无头 Chromium,用于 `read_website` / `take_screenshot`)
54
-
55
- ## 安装
56
-
57
- ### 用户安装
58
- 通过 npm 全局安装:
59
- ```bash
60
- npm install -g autoclaw
61
- ```
62
-
63
- ### 开发安装
64
- 1. 克隆仓库:
65
- ```bash
66
- git clone https://github.com/tsingliuwin/autoclaw.git
67
- cd autoclaw
68
- ```
69
- 2. 安装依赖:
70
- ```bash
71
- npm install
72
- ```
73
- 3. 构建项目:
74
- ```bash
75
- npm run build
76
- ```
77
- 4. 全局链接 (可选):
78
- ```bash
79
- npm link
80
- ```
81
-
82
- ## 快速上手
83
-
84
- 1. **配置**: 运行交互式设置向导以配置您的 API 密钥和集成插件。向导会现场做连接测试(失败映射到最可能出错的字段:401=key 错、404=URL 错、400=模型名错),并能拉取服务商的模型列表供你直接选择。
85
- ```bash
86
- autoclaw setup
87
- ```
88
- 2. **运行**: 在交互模式下启动 Agent。
89
- ```bash
90
- autoclaw
91
- ```
92
-
93
- ## 使用方法
94
-
95
- ### 交互模式
96
- 直接运行 `autoclaw` 进入对话循环。
97
- ```bash
98
- autoclaw
99
- > 列出 src 文件夹中所有的 TypeScript 文件。
100
- ```
101
- 交互命令:`exit` / `quit` 退出;`/view` 用分页器查看上一次工具的完整输出——超过 20 行的工具输出会在屏幕上折叠,并保存到 `~/.autoclaw/output/`。
102
-
103
- ### 无头模式 (一次性任务)
104
- 执行单个指令后立即退出。
105
- ```bash
106
- autoclaw "检查磁盘使用情况并将报告保存到 usage.txt" --no-interactive
107
- ```
108
- 退出码向编排器报告结果:`0` 完成,`1` 硬性失败(如 API 错误),`2` 触发步数上限(任务未完成)。
109
-
110
- ### 机器可读输出 (--json)
111
- 加 `--json` 后,stdout 每行输出一个 JSON 事件(run_start、tool_call、tool_result、usage、run_end);人类可读输出(包括工具自己打印的内容)全部转到 stderr。
112
- ```bash
113
- autoclaw "执行部署并汇报" -y -n --json
114
- ```
115
- Token 用量仅在设置 `AUTOCLOW_INCLUDE_USAGE=1`(或 `true`)时才收集——这是可选项,因为并非所有 OpenAI 兼容端点都接受 `stream_options.include_usage`。
116
-
117
- ### 批处理模式 (蜂群工人)
118
- 把 JSONL 任务清单交给 AutoClaw;每个任务在全新的隔离 Agent 中执行(任务之间上下文互不污染),结果逐行写入 JSONL 文件:
119
- ```bash
120
- autoclaw batch tasks.jsonl -y # 结果 -> tasks.results.jsonl
121
- autoclaw batch tasks.jsonl -o out.jsonl --fail-fast
122
- ```
123
- 清单每行为 `{"id": "...", "task": "..."}`——`id` 可省略(默认 `task-N`);空行和 `#` 注释行会跳过。可选的每任务覆盖项:`maxSteps`、`model`、`provider`。
124
-
125
- 单个任务失败不会中断批次(需要中断用 `--fail-fast`)。全部完成时进程退出 `0`,否则 `1`,cron 和 K8s Job 由此感知批次成败。任务输出保持人类可读——结果文件才是机器可读契约,含每个任务的 `status`、`steps`、`message`、`error`、`usage`。
126
-
127
- 长批次可以中途停、从断点继续,也可以本地并行:
128
- ```bash
129
- autoclaw batch big.jsonl -y --resume # 跳过结果文件中已完成的任务
130
- autoclaw batch big.jsonl -y -c 4 # 最多 4 个任务并行
131
- ```
132
- 未执行的任务不会出现在结果文件里,所以 `--fail-fast` 之后接 `--resume` 就是天然的重试循环。
133
-
134
- AutoClaw 同时会自动给提示词瘦身:可选工具(网页搜索、邮件、群通知、图像生成)只在凭据配置后才会注册进工具定义;长循环中较早的工具结果会被替换为短摘要。
135
-
136
- ### 实战配方
137
-
138
- Linux 定时巡检(crontab):
139
- ```cron
140
- 0 9 * * * autoclaw batch /opt/ops/daily.jsonl -y -n --resume >> /var/log/autoclaw.log 2>&1
141
- ```
142
-
143
- Windows 计划任务:
144
- ```bash
145
- schtasks /create /tn "AutoClaw Daily" /tr "autoclaw batch C:\ops\daily.jsonl -y -n" /sc daily /st 09:00
146
- ```
147
-
148
- 一个清单内的流水线——前一个任务写文件,后一个任务读:
149
- ```jsonl
150
- {"id": "sweep", "task": "检查磁盘与关键服务状态,报告写入 report/sweep.md"}
151
- {"id": "notify", "task": "读取 report/sweep.md,用三句话总结后推送到飞书"}
152
- ```
153
-
154
- 新机器或 CI 环境自检:
155
- ```bash
156
- autoclaw doctor # 退出 0 = 就绪;退出 1 = 打印缺失项
157
- ```
158
-
159
- ### 自动确认 (CI/CD)
160
- 自动批准所有工具执行(危险操作,请谨慎使用或在沙箱环境下运行)。
161
- ```bash
162
- autoclaw "将 src/index.ts 重构为使用 ES 模块" -y
163
- ```
164
-
165
- ### CLI 选项
166
- - `-m, --model <model>`: 指定 LLM 模型 (默认: `gpt-5.6`)。
167
- - `-P, --provider <name>`: 使用 provider 预设 (见 [Provider 预设](#provider-预设))。
168
- - `-n, --no-interactive`: 处理完初始查询后退出 (无头模式)。
169
- - `-y, --yes`: 自动确认所有工具执行 (例如 Shell 命令)。
170
- - `--allow-dangerous`: 允许 `-y` 直接执行内置安全闸拦截的明显破坏性命令 (rm -rf、format、shutdown 等)。
171
- - `--json`: 在 stdout 输出 NDJSON 事件流 (供编排器使用,配合 `-n`)。
172
-
173
- ### 诊断
174
- `autoclaw doctor` 无头完成全面自检,逐项打印 ✓/✗:配置文件、解析出的 provider/baseUrl/model、API key、真实连接测试、解析出的 shell、已注册工具、playwright 浏览器状态。退出 `0` = 就绪,`1` = 有关键项失败(会打印是哪项)。适合 CI 或新机器。
175
-
176
- ### 沙箱
177
- 命令执行可通过 `config.sandbox` / `AUTOCLOW_SANDBOX` 加以约束(词汇借鉴自 DeepSeek Harness):
178
- - `danger-full-access`(默认):命令不受约束地运行。
179
- - `workspace-write`:命令只能在当前工作目录和 `/tmp` 内写入。
180
- - `read-only`:命令无法在任何位置写入。
181
-
182
- 后端:Linux 使用 bubblewrap(`apt install bubblewrap`),macOS 使用 `sandbox-exec`。**Windows 暂无后端**——非默认模式会"失败关闭"(直接拒绝命令并给出明确错误),而不是假装约束;在 Windows 上请暂用 `danger-full-access`。此词汇不约束读取与网络。
183
- - `--json`: 在 stdout 输出 NDJSON 事件流 (供编排器使用,配合 `-n`)。
184
-
185
- ### Provider 预设
186
- AutoClaw 可对接任意 OpenAI 兼容端点。内置预设可自动填好 Base URL 和默认模型:
187
- ```bash
188
- autoclaw -P deepseek "检查磁盘使用情况并保存报告" -y -n
189
- ```
190
- 可用预设:`openai`、`deepseek`、`moonshot` (Kimi)、`dashscope` (Qwen)、`zhipu` (GLM)、`ark` (火山方舟)、`siliconflow` (硅基流动)、`openrouter`、`ollama` (本地)。模型仍可用 `-m` 或配置覆盖。未设置 `OPENAI_API_KEY` 时,会自动读取各家自己的环境变量 (如 `DEEPSEEK_API_KEY`、`MOONSHOT_API_KEY`、`DASHSCOPE_API_KEY`、`ZHIPU_API_KEY`、`ARK_API_KEY`、`SILICONFLOW_API_KEY`、`OPENROUTER_API_KEY`)。
191
-
192
- ## 配置
193
-
194
- AutoClaw 使用层级配置系统。
195
-
196
- **优先级排序 (从高到低):**
197
- 1. **CLI 参数**: (例如 `-m gpt-5.6`)
198
- 2. **环境变量**: (`OPENAI_API_KEY`, `.env` 文件)
199
- 3. **项目配置**: (当前目录下的 `./.autoclaw/setting.json`)
200
- 4. **全局配置**: (`~/.autoclaw/setting.json`)
201
-
202
- ### 支持的配置键 (JSON)
203
- - `provider`: Provider 预设名 (如 `deepseek`)。
204
- - `apiKey`: 您的 OpenAI API 密钥。
205
- - `baseUrl`: 自定义 API 基础地址 (例如 DeepSeek 或本地 LLM)。
206
- - `model`: 默认使用的模型。
207
- - `maxSteps`: 单任务最大 LLM 轮数,超出后自动停止 (默认: `25`)。
208
- - `shellTimeout`: Shell 命令超时时间(毫秒)(默认: `120000`)。
209
- - `taskTimeoutMs`: 单任务整体墙钟超时(毫秒,默认关闭;会中断进行中的 API 调用并以 `timeout` 状态停止)。
210
- - `sandbox`: 约束 shell 命令(`read-only`、`workspace-write`、`danger-full-access`;默认 `danger-full-access`)。
211
- - `shell`: 强制 `execute_shell_command` 使用的 shell (`bash`、`powershell`、`cmd`、`sh`;默认自动检测——Windows 上优先 Git Bash > PowerShell > cmd)。
212
- - `tavilyApiKey`: Tavily 网页搜索的 API 密钥。
213
- - `smtpHost`, `smtpPort`, `smtpUser`, `smtpPass`, `smtpFrom`: SMTP 邮件设置。
214
- - `feishuWebhook`, `dingtalkWebhook`, `wecomWebhook`: 通知钩子地址。
215
-
216
- ### 项目级配置示例
217
- 在 `.autoclaw/setting.json` 创建文件:
218
- ```json
219
- {
220
- "model": "gpt-5.6",
221
- "baseUrl": "https://api.deepseek.com/v1"
222
- }
223
- ```
224
-
225
- > **⚠️ 安全警告**: 如果您在 `.autoclaw/setting.json` 中存储了 `apiKey` 或机密信息,请务必将 `.autoclaw/` 添加到您的 `.gitignore` 文件中,以防泄露!
226
-
227
- ### 环境变量
228
- - `OPENAI_API_KEY`, `OPENAI_BASE_URL`, `OPENAI_MODEL`: 主模型设置。
229
- - `AUTOCLOW_PROVIDER`: 未传 `-P` 时使用的 provider 预设。
230
- - `AUTOCLOW_MAX_STEPS`, `AUTOCLOW_SHELL_TIMEOUT`: 稳定性限制(单任务最大轮数;Shell 超时毫秒数)。
231
- - `AUTOCLOW_TASK_TIMEOUT_MS`: 单任务整体墙钟超时(毫秒)。
232
- - `AUTOCLOW_SANDBOX`: 约束 shell 命令(`read-only`、`workspace-write`、`danger-full-access`)。
233
- - `AUTOCLOW_SHELL`: 强制 shell 命令使用的 shell (`bash`、`powershell`、`cmd`、`sh`)。
234
- - `AUTOCLOW_INCLUDE_USAGE`: 设为 `1`/`true` 时向 API 请求 token 用量(可选开启)。
235
- - `TAVILY_API_KEY`, `SMTP_HOST`/`SMTP_PORT`/`SMTP_USER`/`SMTP_PASS`, `FEISHU_WEBHOOK`/`FEISHU_KEYWORD`, `DINGTALK_WEBHOOK`/`DINGTALK_KEYWORD`, `WECOM_WEBHOOK`/`WECOM_KEYWORD`: 工具凭据,可作为 setup 的替代方式。
236
-
237
- ## 集成功能
238
-
239
- ### 网页搜索 (Tavily)
240
- 如果您在设置中提供了 Tavily API 密钥,AutoClaw 可以搜索网页。
241
- - **示例**: "搜索最新的 Node.js 发布说明。"
242
-
243
- ### 邮件 (SMTP)
244
- 配置 SMTP 设置以允许 Agent 发送邮件。
245
- - **示例**: "向 user@example.com 发送一封包含日志文件摘要的邮件。"
246
-
247
- ### 通知 (飞书/钉钉/企业微信)
248
- 配置 Webhook 以在团队聊天应用中接收警报或报告。
249
- - **示例**: "在飞书上通知团队构建已完成。"
250
-
251
- ### 日期与时间
252
- 内置工具为 Agent 提供当前系统时间,确保准确处理相对时间请求。
253
- - **示例**: "今天是几号?" 或 "提醒我下周一检查日志。"
254
-
255
- ## Docker 支持
256
-
257
- ### 构建与运行
258
- 仓库自带多阶段构建的 `Dockerfile`(node:22-alpine,跳过浏览器下载保持镜像苗条)。容器内直接运行无头一次性任务,配合目录挂载操作当前目录:
259
- ```bash
260
- docker build -t autoclaw .
261
- docker run --rm -v "$PWD":/workspace -w /workspace -e OPENAI_API_KEY=sk-... autoclaw "检查磁盘使用情况并保存报告" -y -n
262
- ```
263
- 注意:默认镜像中未内置浏览器,基于浏览器的工具(`read_website` / `take_screenshot`)不可用——它们会返回友好的安装提示,而不是报错崩溃。
264
-
265
- ### 截图中的中文显示问题
266
- 在 Docker 容器(尤其是 Alpine 或 Debian Slim)中运行时,网页截图中的中文可能会显示为方块("豆腐块")。表情符号(如 🔥)也可能显示为方块。
267
-
268
- **解决方案:** 在容器中安装 CJK(中日韩)和 Emoji 字体。
269
-
270
- **Debian/Ubuntu:**
271
- ```bash
272
- apt-get update && apt-get install -y fonts-noto-cjk fonts-wqy-zenhei fonts-noto-color-emoji
273
- ```
274
-
275
- **Alpine Linux:**
276
- ```bash
277
- apk add font-noto-cjk font-noto-emoji
278
- ```
279
-
280
- ## 开源协议
281
-
282
- MIT
283
-
284
- ## 贡献指南
285
-
286
- 欢迎贡献!请随时提交 Pull Request。
287
-
288
- 1. Fork 本项目
289
- 2. 创建您的特性分支 (`git checkout -b feature/AmazingFeature`)
290
- 3. 提交您的更改 (`git commit -m 'Add some AmazingFeature'`)
291
- 4. 推送至分支 (`git push origin feature/AmazingFeature`)
292
- 5. 开启一个 Pull Request
293
-
294
- ---
1
+ # AutoClaw 🦞
2
+
3
+ [![NPM Version](https://img.shields.io/npm/v/autoclaw.svg?style=flat-square)](https://www.npmjs.com/package/autoclaw)
4
+ [![NPM Downloads](https://img.shields.io/npm/dm/autoclaw.svg?style=flat-square)](https://www.npmjs.com/package/autoclaw)
5
+ [![GitHub](https://img.shields.io/badge/GitHub-Repository-blue?logo=github&style=flat-square)](https://github.com/tsingliuwin/autoclaw)
6
+ [![License](https://img.shields.io/npm/l/autoclaw.svg?style=flat-square)](https://github.com/tsingliuwin/autoclaw/blob/main/LICENSE)
7
+ [![Safety](https://img.shields.io/badge/Safety-Notice-yellow?style=flat-square)](./SAFETY.md)
8
+ [![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)
9
+
10
+ **稳定、高工程化、易规模化:专为无界面系统设计的高效自动化 Agent 框架。**
11
+
12
+ [English](./README.md) | 简体中文
13
+
14
+ ---
15
+
16
+ 🔗 **GitHub 仓库**: [https://github.com/tsingliuwin/autoclaw](https://github.com/tsingliuwin/autoclaw)
17
+
18
+ ---
19
+
20
+ AutoClaw 是一款针对 **“无界面系统” (Headless Systems)** 的高稳定性自动化 Agent 开源框架。
21
+
22
+ 相比于 OpenClaw 等需要“看屏幕”的 Agent(如视觉解析),AutoClaw 采用纯指令驱动,具有更强的**工程化**属性、更高的**稳定性**,以及极易**规模化**的特点。它专为在各种复杂环境中执行确定性的自动化任务而设计——无论是本地服务器、CI/CD 流水线,还是成千上万个容器节点。
23
+
24
+ ## 为什么选择 AutoClaw?
25
+
26
+ - 🐳 **Docker 友好**: 专为容器化环境设计,无 GUI 依赖,极致轻量(Node.js/Alpine 友好)。
27
+ - 🚀 **更强工程化 (Better Engineering)**: 并非依赖不稳定的视觉识别,而是通过系统 API 和 Shell 指令精准操作,确保任务执行的确定性。
28
+ - 🛡️ **高稳定性 (Superior Stability)**: 摆脱了图形界面渲染、屏幕分辨率、网络延迟对视觉识别的影响,即便在极端的 Headless 环境下也能稳定运行。
29
+ - 📈 **易于规模化 (Massive Scalability)**: 低资源占用使得你可以同时编排成千上万个 Agent 实例(如在 Kubernetes 集群中),实现真正的自动化蜂群。
30
+ - 🔌 **集群就绪 (Swarm Ready)**: 无状态设计,支持通过 K8s、Docker Swarm 或简单的 Shell 脚本进行大规模调度。
31
+ - 🧩 **可扩展集成**: 内置支持网页搜索 (Tavily)、邮件发送 (SMTP) 以及通知钩子 (飞书、钉钉、企业微信)。
32
+
33
+ ## 特性
34
+
35
+ - 📜 **无头执行 (Headless Execution)**: 无需图形界面,纯终端运行。核心流程仅依赖 Shell 与文件操作;可选的网页工具在无头 Chromium 中运行。
36
+ - 🤖 **非交互模式**: 支持自动化标志(`-y`, `--no-interactive`),完美适配零干预的自动化流程。
37
+ - 📂 **全方位控制 (Universal Control)**: 从基础的文件 I/O 到复杂的系统管理。
38
+ - 🖥️ **后台进程**: 后台启动长期命令(开发服务器、watcher)并轮询输出,不阻塞任务运行。
39
+ - 🛡️ **安全护栏**: 破坏性命令闸、凭据文件防线、步数上限、墙钟超时与 API 重试——为没有人看着的机器而设计。
40
+ - 🧠 **上下文感知 (Context Aware)**: 提供精确的操作系统与时间上下文,正确处理"今天"、"下周一"等相对时间。
41
+ - 🌐 **网页搜索**: 集成 Tavily,支持实时信息检索。
42
+ - 🌍 **网页阅读与截图**: 提取文章正文、截取页面图片(需先执行 `npx playwright install chromium`)。
43
+ - 🎨 **图像生成**: 通过任意 OpenAI 兼容的图像接口生成图片(兼容 DALL-E)。
44
+ - 🖼️ **确定性图像渲染** (`render_image`): HTML + Tailwind 模板直接渲染为 PNG/JPEG/WebP/SVG,并支持动图(由 CSS `@keyframes` 采样的动画 WebP/GIF/APNG)。完全离线、无浏览器、毫秒级渲染——适合 OG 分享卡、横幅、徽章、数据卡片等对文字与排版精度有要求的场景。
45
+ - 📄 **PDF 渲染** (`render_pdf`): HTML 模板直接渲染为分页 PDF,文字可选中、页眉页脚逐页重复、支持页码计数。完全离线、无浏览器——适合发票、报表、证书等结构化文档。
46
+ - 🕒 **时间精准**: 内置工具获取精确系统日期和时间,确保正确的时间上下文。
47
+ - 📧 **通讯能力**: 自动发送电子邮件并将通知推送至聊天群组。
48
+
49
+ ## 技术栈
50
+ - **运行时**: Node.js
51
+ - **语言**: TypeScript
52
+ - **框架**: Commander.js
53
+ - **UI**: Inquirer (交互), Chalk (样式), Ora (加载动画)
54
+ - **AI**: OpenAI SDK(任意 OpenAI 兼容端点:DeepSeek、Kimi、Qwen、GLM、Ollama 等)
55
+ - **网页工具**: Playwright(无头 Chromium,用于 `read_website` / `take_screenshot`)
56
+ - **渲染引擎**: Takumi(Rust 引擎,经原生绑定驱动 `render_image` / `render_pdf`,无需浏览器)
57
+
58
+ ## 安装
59
+
60
+ ### 用户安装
61
+ 通过 npm 全局安装:
62
+ ```bash
63
+ npm install -g autoclaw
64
+ ```
65
+
66
+ ### 开发安装
67
+ 1. 克隆仓库:
68
+ ```bash
69
+ git clone https://github.com/tsingliuwin/autoclaw.git
70
+ cd autoclaw
71
+ ```
72
+ 2. 安装依赖:
73
+ ```bash
74
+ npm install
75
+ ```
76
+ 3. 构建项目:
77
+ ```bash
78
+ npm run build
79
+ ```
80
+ 4. 全局链接 (可选):
81
+ ```bash
82
+ npm link
83
+ ```
84
+
85
+ ## 快速上手
86
+
87
+ 1. **配置**: 运行交互式设置向导以配置您的 API 密钥和集成插件。向导会现场做连接测试(失败映射到最可能出错的字段:401=key 错、404=URL 错、400=模型名错),并能拉取服务商的模型列表供你直接选择。
88
+ ```bash
89
+ autoclaw setup
90
+ ```
91
+ 2. **运行**: 在交互模式下启动 Agent。
92
+ ```bash
93
+ autoclaw
94
+ ```
95
+
96
+ ## 使用方法
97
+
98
+ ### 交互模式
99
+ 直接运行 `autoclaw` 进入对话循环。
100
+ ```bash
101
+ autoclaw
102
+ > 列出 src 文件夹中所有的 TypeScript 文件。
103
+ ```
104
+ 交互命令:`exit` / `quit` 退出;`/view` 用分页器查看上一次工具的完整输出——超过 20 行的工具输出会在屏幕上折叠,并保存到 `~/.autoclaw/output/`。
105
+
106
+ ### 无头模式 (一次性任务)
107
+ 执行单个指令后立即退出。
108
+ ```bash
109
+ autoclaw "检查磁盘使用情况并将报告保存到 usage.txt" --no-interactive
110
+ ```
111
+ 退出码向编排器报告结果:`0` 完成,`1` 硬性失败(如 API 错误),`2` 触发步数上限(任务未完成)。
112
+
113
+ ### 机器可读输出 (--json)
114
+ 加 `--json` 后,stdout 每行输出一个 JSON 事件(run_start、tool_call、tool_result、usage、run_end);人类可读输出(包括工具自己打印的内容)全部转到 stderr。
115
+ ```bash
116
+ autoclaw "执行部署并汇报" -y -n --json
117
+ ```
118
+ Token 用量仅在设置 `AUTOCLOW_INCLUDE_USAGE=1`(或 `true`)时才收集——这是可选项,因为并非所有 OpenAI 兼容端点都接受 `stream_options.include_usage`。
119
+
120
+ ### 批处理模式 (蜂群工人)
121
+ 把 JSONL 任务清单交给 AutoClaw;每个任务在全新的隔离 Agent 中执行(任务之间上下文互不污染),结果逐行写入 JSONL 文件:
122
+ ```bash
123
+ autoclaw batch tasks.jsonl -y # 结果 -> tasks.results.jsonl
124
+ autoclaw batch tasks.jsonl -o out.jsonl --fail-fast
125
+ ```
126
+ 清单每行为 `{"id": "...", "task": "..."}`——`id` 可省略(默认 `task-N`);空行和 `#` 注释行会跳过。可选的每任务覆盖项:`maxSteps`、`model`、`provider`。
127
+
128
+ 单个任务失败不会中断批次(需要中断用 `--fail-fast`)。全部完成时进程退出 `0`,否则 `1`,cron 和 K8s Job 由此感知批次成败。任务输出保持人类可读——结果文件才是机器可读契约,含每个任务的 `status`、`steps`、`message`、`error`、`usage`。
129
+
130
+ 长批次可以中途停、从断点继续,也可以本地并行:
131
+ ```bash
132
+ autoclaw batch big.jsonl -y --resume # 跳过结果文件中已完成的任务
133
+ autoclaw batch big.jsonl -y -c 4 # 最多 4 个任务并行
134
+ ```
135
+ 未执行的任务不会出现在结果文件里,所以 `--fail-fast` 之后接 `--resume` 就是天然的重试循环。
136
+
137
+ AutoClaw 同时会自动给提示词瘦身:可选工具(网页搜索、邮件、群通知、图像生成)只在凭据配置后才会注册进工具定义;长循环中较早的工具结果会被替换为短摘要。
138
+
139
+ ### 技能(可移植能力包)
140
+ AutoClaw 支持 `SKILL.md` 技能包——与 WorkBuddy 技能商店相同的格式,一份技能包既能在 AutoClaw 内运行,也能发布到其它平台。system prompt 里每个技能只占一行清单;任务匹配时 agent 才去读取该技能的 `SKILL.md` 并照做,全程走普通的文件与 shell 工具。技能没有特权运行时:脚本同样经过破坏性命令闸、沙箱与步数上限。
141
+
142
+ 作用域(同名后者遮蔽前者):内置 `skills/`(随 npm 包发布)→ `~/.autoclaw/skills/` → `.autoclaw/skills/`。
143
+
144
+ ```bash
145
+ autoclaw skill list # 列出发现的技能(含作用域与版本)
146
+ autoclaw skill install <zip|目录|https地址> # 安装到 ~/.autoclaw/skills/(含 zip-slip 防护)
147
+ autoclaw skill remove <name> # 移除用户级技能(内置技能受保护)
148
+ autoclaw skill pack <目录> # 打包为商店上传 zip(默认 <name>-skill-<version>.zip,SKILL.md 位于 zip 根目录)
149
+ ```
150
+
151
+ 安装兼容任意 SKILL.md 格式的第三方包:本地目录、本地 zip 或 https 下载地址均可。对第三方布局差异做了容错(SKILL.md 位于 zip 根部、普通文件夹、`skills/<name>/` 包装、macOS 的 `__MACOSX`/`.DS_Store` 垃圾文件),并且始终按技能 frontmatter 的 `name` 安装,保证发现与清单的一致性。
152
+
153
+ 内置三个技能,分层协作:[`code2media`](skills/code2media/SKILL.md)(代码转多媒体)是通用渲染引擎——独立 Node 脚本把任意 HTML 变成图片/SVG/分页 PDF/动图;[`poster-maker`](skills/poster-maker/SKILL.md)(海报生成器)与 [`invoice-maker`](skills/invoice-maker/SKILL.md)(发票生成器)是独立优化的场景技能,各自沉淀了平台尺寸表、票据版式规范与质量清单。同一个 zip 可直接发布到任何兼容 SKILL.md 的商店。技能与 batch 模式天然组合:清单里一行 `{"id":"cert-042","task":"用 invoice-maker 技能根据 orders-042.json 生成发票 invoices/042.pdf"}` 就能让一个隔离的 swarm worker 跑同一个技能。
154
+
155
+ ### 实战配方
156
+
157
+ Linux 定时巡检(crontab):
158
+ ```cron
159
+ 0 9 * * * autoclaw batch /opt/ops/daily.jsonl -y -n --resume >> /var/log/autoclaw.log 2>&1
160
+ ```
161
+
162
+ Windows 计划任务:
163
+ ```bash
164
+ schtasks /create /tn "AutoClaw Daily" /tr "autoclaw batch C:\ops\daily.jsonl -y -n" /sc daily /st 09:00
165
+ ```
166
+
167
+ 一个清单内的流水线——前一个任务写文件,后一个任务读:
168
+ ```jsonl
169
+ {"id": "sweep", "task": "检查磁盘与关键服务状态,报告写入 report/sweep.md"}
170
+ {"id": "notify", "task": "读取 report/sweep.md,用三句话总结后推送到飞书"}
171
+ ```
172
+
173
+ 新机器或 CI 环境自检:
174
+ ```bash
175
+ autoclaw doctor # 退出 0 = 就绪;退出 1 = 打印缺失项
176
+ ```
177
+
178
+ ### 自动确认 (CI/CD)
179
+ 自动批准所有工具执行(危险操作,请谨慎使用或在沙箱环境下运行)。
180
+ ```bash
181
+ autoclaw "将 src/index.ts 重构为使用 ES 模块" -y
182
+ ```
183
+
184
+ ### CLI 选项
185
+ - `-m, --model <model>`: 指定 LLM 模型 (默认: `gpt-5.6`)。
186
+ - `-P, --provider <name>`: 使用 provider 预设 (见 [Provider 预设](#provider-预设))。
187
+ - `-n, --no-interactive`: 处理完初始查询后退出 (无头模式)。
188
+ - `-y, --yes`: 自动确认所有工具执行 (例如 Shell 命令)。
189
+ - `--allow-dangerous`: 允许 `-y` 直接执行内置安全闸拦截的明显破坏性命令 (rm -rf、format、shutdown 等)。
190
+ - `--json`: 在 stdout 输出 NDJSON 事件流 (供编排器使用,配合 `-n`)。
191
+
192
+ ### 诊断
193
+ `autoclaw doctor` 无头完成全面自检,逐项打印 ✓/✗:配置文件、解析出的 provider/baseUrl/model、API key、真实连接测试、解析出的 shell、已注册工具、playwright 浏览器状态。退出 `0` = 就绪,`1` = 有关键项失败(会打印是哪项)。适合 CI 或新机器。
194
+
195
+ ### 沙箱
196
+ 命令执行可通过 `config.sandbox` / `AUTOCLOW_SANDBOX` 加以约束(词汇借鉴自 DeepSeek Harness):
197
+ - `danger-full-access`(默认):命令不受约束地运行。
198
+ - `workspace-write`:命令只能在当前工作目录和 `/tmp` 内写入。
199
+ - `read-only`:命令无法在任何位置写入。
200
+
201
+ 后端:Linux 使用 bubblewrap(`apt install bubblewrap`),macOS 使用 `sandbox-exec`。**Windows 暂无后端**——非默认模式会"失败关闭"(直接拒绝命令并给出明确错误),而不是假装约束;在 Windows 上请暂用 `danger-full-access`。此词汇不约束读取与网络。
202
+ - `--json`: 在 stdout 输出 NDJSON 事件流 (供编排器使用,配合 `-n`)。
203
+
204
+ ### Provider 预设
205
+ AutoClaw 可对接任意 OpenAI 兼容端点。内置预设可自动填好 Base URL 和默认模型:
206
+ ```bash
207
+ autoclaw -P deepseek "检查磁盘使用情况并保存报告" -y -n
208
+ ```
209
+ 可用预设:`openai`、`deepseek`、`moonshot` (Kimi)、`dashscope` (Qwen)、`zhipu` (GLM)、`ark` (火山方舟)、`siliconflow` (硅基流动)、`openrouter`、`ollama` (本地)。模型仍可用 `-m` 或配置覆盖。未设置 `OPENAI_API_KEY` 时,会自动读取各家自己的环境变量 (如 `DEEPSEEK_API_KEY`、`MOONSHOT_API_KEY`、`DASHSCOPE_API_KEY`、`ZHIPU_API_KEY`、`ARK_API_KEY`、`SILICONFLOW_API_KEY`、`OPENROUTER_API_KEY`)。
210
+
211
+ ## 配置
212
+
213
+ AutoClaw 使用层级配置系统。
214
+
215
+ **优先级排序 (从高到低):**
216
+ 1. **CLI 参数**: (例如 `-m gpt-5.6`)
217
+ 2. **环境变量**: (`OPENAI_API_KEY`, `.env` 文件)
218
+ 3. **项目配置**: (当前目录下的 `./.autoclaw/setting.json`)
219
+ 4. **全局配置**: (`~/.autoclaw/setting.json`)
220
+
221
+ ### 支持的配置键 (JSON)
222
+ - `provider`: Provider 预设名 (如 `deepseek`)。
223
+ - `apiKey`: 您的 OpenAI API 密钥。
224
+ - `baseUrl`: 自定义 API 基础地址 (例如 DeepSeek 或本地 LLM)。
225
+ - `model`: 默认使用的模型。
226
+ - `maxSteps`: 单任务最大 LLM 轮数,超出后自动停止 (默认: `25`)。
227
+ - `shellTimeout`: Shell 命令超时时间(毫秒)(默认: `120000`)。
228
+ - `taskTimeoutMs`: 单任务整体墙钟超时(毫秒,默认关闭;会中断进行中的 API 调用并以 `timeout` 状态停止)。
229
+ - `sandbox`: 约束 shell 命令(`read-only`、`workspace-write`、`danger-full-access`;默认 `danger-full-access`)。
230
+ - `skillsEnabled`: 设为 `false` 关闭技能系统(默认开启)。
231
+ - `shell`: 强制 `execute_shell_command` 使用的 shell (`bash`、`powershell`、`cmd`、`sh`;默认自动检测——Windows 上优先 Git Bash > PowerShell > cmd)。
232
+ - `tavilyApiKey`: Tavily 网页搜索的 API 密钥。
233
+ - `smtpHost`, `smtpPort`, `smtpUser`, `smtpPass`, `smtpFrom`: SMTP 邮件设置。
234
+ - `feishuWebhook`, `dingtalkWebhook`, `wecomWebhook`: 通知钩子地址。
235
+
236
+ ### 项目级配置示例
237
+ 在 `.autoclaw/setting.json` 创建文件:
238
+ ```json
239
+ {
240
+ "model": "gpt-5.6",
241
+ "baseUrl": "https://api.deepseek.com/v1"
242
+ }
243
+ ```
244
+
245
+ > **⚠️ 安全警告**: 如果您在 `.autoclaw/setting.json` 中存储了 `apiKey` 或机密信息,请务必将 `.autoclaw/` 添加到您的 `.gitignore` 文件中,以防泄露!
246
+
247
+ ### 环境变量
248
+ - `OPENAI_API_KEY`, `OPENAI_BASE_URL`, `OPENAI_MODEL`: 主模型设置。
249
+ - `AUTOCLOW_PROVIDER`: 未传 `-P` 时使用的 provider 预设。
250
+ - `AUTOCLOW_MAX_STEPS`, `AUTOCLOW_SHELL_TIMEOUT`: 稳定性限制(单任务最大轮数;Shell 超时毫秒数)。
251
+ - `AUTOCLOW_TASK_TIMEOUT_MS`: 单任务整体墙钟超时(毫秒)。
252
+ - `AUTOCLOW_SANDBOX`: 约束 shell 命令(`read-only`、`workspace-write`、`danger-full-access`)。
253
+ - `AUTOCLOW_SHELL`: 强制 shell 命令使用的 shell (`bash`、`powershell`、`cmd`、`sh`)。
254
+ - `AUTOCLOW_INCLUDE_USAGE`: 设为 `1`/`true` 时向 API 请求 token 用量(可选开启)。
255
+ - `TAVILY_API_KEY`, `SMTP_HOST`/`SMTP_PORT`/`SMTP_USER`/`SMTP_PASS`, `FEISHU_WEBHOOK`/`FEISHU_KEYWORD`, `DINGTALK_WEBHOOK`/`DINGTALK_KEYWORD`, `WECOM_WEBHOOK`/`WECOM_KEYWORD`: 工具凭据,可作为 setup 的替代方式。
256
+
257
+ ## 集成功能
258
+
259
+ ### 网页搜索 (Tavily)
260
+ 如果您在设置中提供了 Tavily API 密钥,AutoClaw 可以搜索网页。
261
+ - **示例**: "搜索最新的 Node.js 发布说明。"
262
+
263
+ ### 邮件 (SMTP)
264
+ 配置 SMTP 设置以允许 Agent 发送邮件。
265
+ - **示例**: "向 user@example.com 发送一封包含日志文件摘要的邮件。"
266
+
267
+ ### 通知 (飞书/钉钉/企业微信)
268
+ 配置 Webhook 以在团队聊天应用中接收警报或报告。
269
+ - **示例**: "在飞书上通知团队构建已完成。"
270
+
271
+ ### 日期与时间
272
+ 内置工具为 Agent 提供当前系统时间,确保准确处理相对时间请求。
273
+ - **示例**: "今天是几号?" 或 "提醒我下周一检查日志。"
274
+
275
+ ### 确定性渲染 (Takumi)
276
+ `render_image` 将 HTML 模板渲染为精确的图像——PNG、JPEG、WebP 或矢量 SVG——全程离线,不依赖浏览器或 AI 模型。`render_pdf` 将 HTML 模板渲染为分页 PDF,文字可选中,页眉/页脚逐页重复,并支持 `<span class="pageNumber">` / `<span class="totalPages">` 页码计数。模板样式支持内联 CSS、`<style>` 块,或通过 `tw` 属性使用 Tailwind v4 工具类(`<div tw="w-full h-full bg-blue-500">`);普通 `class` 属性仅匹配常规 CSS 选择器。两个工具都会自动探测常见系统字体(含中日韩与 Emoji);也可通过 `font_paths` 注册指定字体文件。
277
+
278
+ 典型工作流——用自然语言描述任务,模板由 agent 自己编写:
279
+
280
+ ```bash
281
+ # 博客 SEO:为每篇文章生成 OG 分享图
282
+ autoclaw "读取 content/posts/ 下每篇 .md 的标题和摘要,为每篇文章渲染一张 OG 分享图(1200x630)到 public/og/" -y -n
283
+
284
+ # 财务/电商:从订单表批量生成 PDF 发票并邮件发送
285
+ autoclaw "读取 orders.csv,为每个订单生成 PDF 发票保存到 invoices/(A4,页脚带页码),然后把每张发票邮件发送给该行记录的客户邮箱" -y
286
+
287
+ # 培训/HR:为学员名单批量生成结业证书
288
+ autoclaw "读取 attendees.json,为每位学员渲染一张结业证书(1414x1000)保存到 certs/,编号从 AC-2026-0001 起" -y -n
289
+
290
+ # cron/CI 定时报告:输出确定——相同输入得到完全相同的 PDF,可做校验
291
+ autoclaw "汇总本周 nginx 访问日志,生成一页 A4 的 PDF 流量周报(含指标表格),保存为 report.pdf" -y -n
292
+ ```
293
+
294
+ 集群规模用 batch 模式——每个任务在隔立的 agent 中渲染:
295
+
296
+ ```bash
297
+ cat > render-jobs.jsonl <<'EOF'
298
+ {"id": "og-001", "task": "为 post-001.md 渲染 OG 分享图到 public/og/001.png"}
299
+ {"id": "og-002", "task": "为 post-002.md 渲染 OG 分享图到 public/og/002.png"}
300
+ EOF
301
+ autoclaw batch render-jobs.jsonl -y -c 4
302
+ ```
303
+
304
+ 选型提示:需要精确文字、排版与品牌一致性(卡片、横幅、徽章、文档)时用 `render_image` / `render_pdf`;艺术创作、照片类图像用 `generate_image`。模板中的 Emoji 默认从 Twemoji CDN 在线获取,完全离线的环境请让模板保持纯文本。
305
+
306
+ 可运行案例与渲染效果预览:[examples/render](examples/render/README.zh-CN.md)(OG 分享卡、社媒海报、KPI 指标卡、周报 PDF、SVG 徽章、证书、动图、多页采购订单——`agent-run/` 下还有一次真实 agent 无头运行的产物)。同一能力也打包成了可移植的 [WorkBuddy 技能](skills/code2media/SKILL.md)(`code2media-skill-1.2.1.zip`):一个独立 Node 脚本,任何装有 Node >= 20.19 的机器都能把 HTML 渲染成图片/SVG/PDF/动图。
307
+
308
+ ## Docker 支持
309
+
310
+ ### 构建与运行
311
+ 仓库自带多阶段构建的 `Dockerfile`(node:22-alpine,跳过浏览器下载保持镜像苗条)。容器内直接运行无头一次性任务,配合目录挂载操作当前目录:
312
+ ```bash
313
+ docker build -t autoclaw .
314
+ docker run --rm -v "$PWD":/workspace -w /workspace -e OPENAI_API_KEY=sk-... autoclaw "检查磁盘使用情况并保存报告" -y -n
315
+ ```
316
+ 注意:默认镜像中未内置浏览器,基于浏览器的工具(`read_website` / `take_screenshot`)不可用——它们会返回友好的安装提示,而不是报错崩溃。
317
+
318
+ ### 截图与渲染输出中的中文显示问题
319
+ 在 Docker 容器(尤其是 Alpine 或 Debian Slim)中运行时,网页截图中的中文可能会显示为方块("豆腐块")。表情符号(如 🔥)也可能显示为方块。`render_image` / `render_pdf` 输出中包含中日韩文字时同样受影响。
320
+
321
+ **解决方案:** 在容器中安装 CJK(中日韩)和 Emoji 字体。渲染工具会自动探测同一批字体路径,因此安装这些字体包可以同时修复截图与渲染输出的中文显示。
322
+
323
+ **Debian/Ubuntu:**
324
+ ```bash
325
+ apt-get update && apt-get install -y fonts-noto-cjk fonts-wqy-zenhei fonts-noto-color-emoji
326
+ ```
327
+
328
+ **Alpine Linux:**
329
+ ```bash
330
+ apk add font-noto-cjk font-noto-emoji
331
+ ```
332
+
333
+ ## 开源协议
334
+
335
+ MIT
336
+
337
+ ## 贡献指南
338
+
339
+ 欢迎贡献!请随时提交 Pull Request。
340
+
341
+ 1. Fork 本项目
342
+ 2. 创建您的特性分支 (`git checkout -b feature/AmazingFeature`)
343
+ 3. 提交您的更改 (`git commit -m 'Add some AmazingFeature'`)
344
+ 4. 推送至分支 (`git push origin feature/AmazingFeature`)
345
+ 5. 开启一个 Pull Request
346
+
347
+ ---
295
348
  GitHub: [https://github.com/tsingliuwin/autoclaw](https://github.com/tsingliuwin/autoclaw)