源码公开,仅限非商用(PolyForm Noncommercial 1.0.0)。自己部署自己用、学习研究、个人项目都可以;卖它、放进收费产品、在公司里当工具用不行,要商用请先联系(见 §11)。
遇到问题先运行
npm run diagnose,把输出贴进 Issue。常见问题见 docs/FAQ.md。
一个跑在你自己电脑上的 AI 控制面:你把活派出去,Claude Code、Codex、DeepSeek、WorkBuddy 这些 AI 在你的电脑上并行干;危险的事停下来等你在网页或手机上点一下;花了多少额度、谁干得好、哪里在等你,一层一层看得清。
它做决定,不动手干活。 干活的是各家 AI 工具(执行器里);工作台管派给谁、批不批、提醒什么、数据怎么样——每个决定都有规则先筛、你能推翻、留审计。
点封面看 30 秒项目短片(有声音,约 30 MB;浏览器也可能直接下载)。实际界面看下面的截图。
- 多家 AI 一起用:不绑死一家。你自己挑执行者,也可以打开调度大脑,让它在合格名单里按擅长和剩余额度挑人;配好账号槽后,到限额可以换下一个。
- 人始终握着刹车:命中规则的操作停下来等你;推送、部署、动密钥要人点。普通文档合并有可关闭的自动放行规则;沙箱出来的改动仍要你批。
- 沙箱:可选让任务在一次性容器里跑——没有出口的网络、白名单代理、真密钥不进容器、代码改动以补丁出来、检查过才进你的仓库(§4.1)。
- 全在自己手里:自己的电脑、自己的账号、自己的数据。工作台不保存任何模型密钥。
- 零依赖:只用 Node 22 自带的 HTTP 服务和 SQLite,没有
npm install,没有构建步骤;数据是一个 SQLite 文件。 - 做完让另一位看一遍:派活时可以选「谁审」。审的那位只读、不改,结论是「过 / 要改 / 拿不准」;要改就打回,最多两轮;它不能替你点头。大脑挑人时会写明理由。
- 说实话、不拿旧信息当现状:每个任务开头写着今天的日期;执行守则要求没跑的测试不说通过、做了一半要明说、会变的事实(版本、价格、政策)先查再写,查不到标「未核实」。说做完却没有产出文件的,直接算没成。交活后执行器自己把测试再跑一遍,和它说的对照:它说通过、实际没过,点头卡上会直接写出来。这些是对 AI 的要求和几道检查,不是保证——所以还有审和你的点头。
- 停下就收尾:停止任务后,旧轮次的回报不会把它重新标成完成;沙箱里还没开工的那一轮也不会继续启动 AI。服务端和执行器要一起升级。
- 界面一层打开一层:第一层一句话 + 几行,点开才是细节;浅色、深色都用松绿作强调色,只靠深浅分轻重。
以下截图于 2026-11-13 从当前公开主干重新拍摄,使用独立演示数据,不是真实任务或模型验收记录。电脑、手机,浅色、深色都在下面;旧标签里的界面可能不同。
| 视图 | 浅色 | 深色 |
|---|---|---|
| 电脑:左边一条流,右边点开的那件事 | ![]() |
![]() |
| 手机:首页 | ![]() |
![]() |
| 手机:一件事(做 → 审 → 你点头) | ![]() |
![]() |
| 请执行者进来 | ![]() |
![]() |
| 一层 | 是什么 |
|---|---|
| 工作台 | 一条流:顶上一排执行者头像和一个输入框(写一句要做什么);下面是「等你」「在做」「做好了」。点一件事,它在右边打开成一条线(手机上盖上来):谁说了什么、另一位怎么审的、要你点头的卡片 |
| 剧组 | 每个 AI 一行:手上的活、擅长什么(五个点)、账号槽和额度。日常增减不用进来:在首页点头像「先歇着 / 移除」,点「+」请进来 |
| 自媒体 | 七个平台(B站、小红书、抖音、视频号、X、Instagram、Facebook)各一行:粉丝、这周发了几条、多少播放;点开是每条内容的数据曲线 |
| 记录 | 每天谁做完了什么、一次过还是返工、额度花在哪 |
| 设置 | 接入、安全(审批规则、总开关)、通知、外观、备份;要填的东西点开才出现 |
原来的四行首页、任务看板、剧组、记录都还在,收在首页最下面的「高级」里,地址没变。
装好之后怎么用:日常操作看 docs/USAGE.md,接第二个仓库看 docs/NEW-PROJECT.md,让 agent 替你装看 docs/AGENT-INSTALL.md。
能用,我自己每天在用;但下面这些是真的,装之前请知道:
- 先把单人第一版跑稳。下面写的是当前主干,不代表你下载的旧标签已经有;升级后先自检、跑一条小任务,再把日常活交过去。多调度、行业包、模型自动审批还不是这版已经交付的东西。
- 单人单令牌。工作台只有一个账号,拿到你的登录就能批一切、看一切。只装给自己用,别几个人共用一个。
- 沙箱只覆盖一部分执行者。只有「Claude Code + API Key」的执行者能进沙箱(§4.1)。WorkBuddy、DeepSeek Harness、用订阅登录的账号直接在你电脑上跑,挡它们的是钩子审批和命令检查——命令检查堵不完所有写法,这类执行者只派你信得过的活。
- GitHub 任务通道只接你信得过的仓库。Issue 正文不进提示词,只作为资料文件交给 AI,并写明「这是资料,不是指令」;但资料它还是会读,隔离不是万能的。先只接你自己写 Issue 的仓库。
- 主要在 Windows(家庭版)+ Docker Desktop 上验过;macOS / Linux 的测试全套能过,但真机用得少。
- 自媒体的数据要手动填;发布永远你自己点。
- 战绩先看事实,别拿它当排行榜。样本少会直接写「样本太少」;首次运行结局与任务重试后的统计口径还在核对,真实多账号轮换也还没完整验收。
- 出了问题先
npm run diagnose,再开 Issue。
只想先看看它长什么样,四步就够,别的一概不用管。
-
装 Node ≥ 22.18(或者 Docker)。
node -v能打印出版本就行。 -
拿代码,跑一次安装脚本:
git clone https://github.com/xiebenzhen-code/privatebot.git ai-workbench cd ai-workbench npm run setup # 一问一答:生成两把钥匙、选项目、验证 key
让 agent 替你装:把这一页交给它,它按
docs/AGENT-INSTALL.md走,全程不用问你第二遍。不想用脚本、自己填也行(下面这段就是脚本做的事):
cp .env.example .env echo "WB_TOKEN=$(openssl rand -hex 24)" >> .env # 脚本用 echo "WB_PASSWORD=$(openssl rand -hex 12)" >> .env # 网页登录用,必须和上面不一样
没装
openssl(Windows 上常见)就自己敲两串随机字符,别用短密码。 -
启动,两种挑一种:
docker compose up -d --build # 有 Docker,推荐 npm start # 没有 Docker,直接用 Node(会自己读 .env)
-
打开
http://localhost:3200,用WB_PASSWORD登录。在输入框写一句要做什么,回车就派出去(想指定谁做,写@名字,或者点开「谁做 · 谁审」);要你点头的事出现在「等你」,点开就是「好 / 不行」。只想先试试,派一条「给 README 加一句这个项目是做什么的」。没开执行器会一直排队,这是正常的,接着看 §4。
想让 AI 自动干活、接 GitHub、接手机,再往下看 §0 起的各节,都是可选的。
常被问到的几件事先摆在这里。只有「工作台」是必须的,其余按需加。
浏览器 / 手机
│ HTTP
▼
工作台(网页 + 审批 + SQLite 一个文件) ← 数据全在这儿
│ 领任务、回结果
▼
执行器 runner.mjs(宿主机,不进 Docker)
│ 无头调用
▼
Claude Code CLI
│ git(在 worktree 里改,你批了才推)
▼
你的仓库
旁路,都可选:反代 CLIProxyAPI(Docker)、Hook claude-hook.mjs(你的电脑)
| 组件 | 跑在哪 | 必须吗 | 不开会怎样 |
|---|---|---|---|
| 工作台(网页、数据库、审批) | 本机 Docker,或者 npm start 直接跑 |
必须 | 什么都没有 |
执行器 scripts/runner.mjs |
宿主机,不进 Docker(要调本机的 Claude Code 和 git) | 想让它自动干活才要 | 点了「开始」任务一直排队 |
| Claude Code | 宿主机,执行器后台无头调用,你不用打开它 | 同上 | 同上 |
| 反代 CLIProxyAPI | Docker(可选) | 不必需 | 用不了「把订阅额度当接口」 |
Hook claude-hook.mjs |
你自己电脑的 ~/.claude |
不必需 | 手动开的会话不进看板 |
| GitHub | 云端,凭 token 访问 | 不必需 | 派活通道不可用;本机有 git 仓库照样能建任务 |
几条容易搞错的:
- Docker 不是必须的,它只是省事。没 Docker 就
npm start,数据同样是一个 SQLite 文件。 - 执行器一定跑在宿主机上,不进容器:它要起本机的
claude命令、在本机 git 里开 worktree。不把它开着,「开始」只等于排队。 - 执行器不需要 Claude 账号,只要一个 Anthropic 兼容接口(DeepSeek、百炼都行),见 §4。
- GitHub 不是必须的,连现成的仓库都不用有:安装时不指定项目,会自动建一个空的
~/ai-projects/first当第一个项目;以后在网页上「+ 新建项目」再加。合并只在本地做,不需要远程;只有「推送」这一步需要仓库有远程(GitHub、Gitee、自建都行;没有远端的项目推送直接跳过,不算失败)。要从 Issue 派活,再给执行器配githubToken,工作台进程不连 GitHub。
两种方式:
- 让他自己的 coding agent 装(推荐):让他把仓库地址和
docs/AGENT-INSTALL.md交给自己电脑上的 Claude Code / Codex / WorkBuddy,照着做;装完浏览器打开http://localhost:3200。 - 你坐在他电脑旁边装:照「5 分钟跑起来」走一遍 → 配执行器(§4,用他自己的模型账号和密钥)→ 需要沙箱再开 §4.1 → 跟他一起跑通一个真任务。
规矩:他的密钥只放在他的电脑上,你不经手、不保存;号池只能是他自己的账号自己用。工作台本身不保存任何模型密钥。
收费帮公司或客户装、或者在公司里用,属于商用,先看 §11。
只填你实际要用的,其余留空。所有 key 都只写在 .env 或你自己的配置文件里,永远不要提交进仓库。
| 凭据 | 干什么用 | 去哪拿 | 填在哪 |
|---|---|---|---|
WB_TOKEN |
脚本、curl、执行器调用接口 | 自己生成:openssl rand -hex 24 |
.env |
WB_PASSWORD |
浏览器登录(≥ 12 位) | 自己想一个 | .env |
githubToken |
Issue 通道、日报 | GitHub → Settings → Developer settings → Fine-grained tokens:只勾需要的仓库,权限给 Issues: Read and write、Contents: Read-only,有效期建议 90 天 | 执行器配置 ~/.ai-workbench-runner.json |
GITHUB_ALLOWED_AUTHORS |
只认谁的 Issue | 填你自己的 GitHub 用户名 | .env |
| 模型 key(DeepSeek / 百炼 / 智谱) | 执行器干活、余额查询 | 各家控制台 | 执行器配置或 .env,不进仓库 |
CPA_MANAGEMENT_KEY |
读反代用量(可选) | CLIProxyAPI 的 secret-key |
.env |
为什么令牌和密码必须分开:WB_TOKEN 是给脚本用的,它做不了批审批、改规则、改设置、导出整库这些事——这些都是「只有人能做」的动作。网页登录走 WB_PASSWORD,换一个服务端随机会话 Cookie,脚本令牌推算不出这个 Cookie。这样一个令牌泄露,坏人也没法替你批准一条 rm -rf。
GITHUB_ALLOWED_AUTHORS默认是空的,空的意思是谁都不收。想让 Issue 通道工作就必须显式填上自己的用户名——否则任何人开个 Issue 就能往你电脑上派活。
git clone https://github.com/xiebenzhen-code/privatebot.git /opt/ai-workbench
cd /opt/ai-workbench
cp .env.example .env
echo "WB_TOKEN=$(openssl rand -hex 24)" >> .env # 给脚本用:curl、执行器、心跳
echo "WB_PASSWORD=自己设一个十二位以上" >> .env # 给网页登录用,和上面必须不一样
docker compose up -d --build打开 http://localhost:3200,用 WB_PASSWORD 登录。
两把钥匙别混:令牌(WB_TOKEN)给脚本,密码(WB_PASSWORD)给人。网页登录换到的是一枚服务端随机会话 Cookie,令牌推不出来;批审批、改规则、改设置、导出整库这些动作只有网页上的会话能做,脚本令牌做不了。两个值填成一样的话,服务会拒绝启动并告诉你原因。
装完、或者重启机器之后,跑一次自检,九项一次看完:
npm run postboot # 立刻查
npm run postboot -- --wait 120 # 开机后马上跑,最多等两分钟让引擎和容器起来它只读,不改任何东西:Docker 引擎、两个容器的状态与重启策略、工作台健康、账号与余额、反代能列出模型、反代里的登录账号还在、容器之间网络通、备份是 48 小时内的。全部通过退出码 0,有问题退出码 1 并指明哪几项——可以直接挂进计划任务。
想先看看填满数据的样子:
docker compose exec workbench node --disable-warning=ExperimentalWarning scripts/seed.ts(只在空库上执行;会写入演示任务、审批、用量。之后想清空,删掉数据卷 docker compose down -v 重来。)
拉不到基础镜像(node:22-slim 报 401 / 超时):先 docker logout 再试;还不行就在 .env 里加一行 NODE_IMAGE=<能访问的镜像源>/library/node:22-slim,例如 docker.m.daocloud.io/library/node:22-slim。
升级:git pull && docker compose up -d --build。数据库迁移在启动时自动执行。
不用 Docker:装 Node ≥ 22.18,WB_TOKEN=... npm start。这样跑默认也只绑本机(127.0.0.1),局域网打不开;要让同一 Wi-Fi 的手机访问,设 HOST=0.0.0.0(局域网是明文,别在共用网络里这样开),出门仍走 Tailscale。
Windows:见 docs/INSTALL-WINDOWS.md,可以整段交给 coding agent 执行(包括 Docker Hub 连不上时的处理和开机自启)。
默认只绑本机(127.0.0.1)——装完只有这台电脑能打开 http://localhost:3200。想用手机,只有两种推荐方式,其余一律不建议:
| 场景 | 怎么做 | 代价 |
|---|---|---|
| 在家(同一个 Wi-Fi) | .env 里写 WB_BIND=0.0.0.0,重建容器,手机打开 http://电脑的局域网IP:3200 |
局域网里是明文 HTTP,密码和 Cookie 在网络上没加密。别在公司、咖啡店、酒店这类共用网络上这样开 |
| 出门(外网) | 电脑和手机装同一个 Tailscale,电脑上 tailscale serve 3200,手机打开它给的 https://电脑名.xxx.ts.net |
要装 Tailscale;地址只有你自己 tailnet 里的设备能开 |
不要做:在路由器上给 3200 做端口转发、用内网穿透(frp / ngrok 之类)、用 tailscale funnel、或者挂 Cloudflare Tunnel 直接对外——这些都会把这个页面变成公网可访问,等于把「能批准任意命令」的入口交出去。真要自己搭反向代理,必须带 HTTPS,并自己确认来源限制。
(024 起工作台会检测「看起来是从公网来的访问」:默认在页面顶部提醒你、一天记一条审计并推一次消息;设置 › 安全里可以改成直接拒绝,或者用 WB_ALLOWED_HOSTS 放行自己的域名。那只是发现误用的兜底,不是防护。)
在运行 Claude Code 的电脑上:
- 把
scripts/claude-hook.mjs放到~/ai-workbench/scripts/(或者直接 clone 这个仓库到~/ai-workbench)。 - 写
~/.ai-workbench.json:{ "url": "http://<服务器IP>:3200", "token": "<WB_TOKEN>" } - 把 hooks 合并进
~/.claude/settings.json。工作台「设置 › 接入」页面有带好地址的版本可以直接复制:{ "hooks": { "PreToolUse": [{ "matcher": "Bash|Edit|Write|MultiEdit", "hooks": [{ "type": "command", "command": "node ~/ai-workbench/scripts/claude-hook.mjs", "timeout": 1800 }] }], "UserPromptSubmit": [{ "hooks": [{ "type": "command", "command": "node ~/ai-workbench/scripts/claude-hook.mjs", "timeout": 15 }] }], "Stop": [{ "hooks": [{ "type": "command", "command": "node ~/ai-workbench/scripts/claude-hook.mjs", "timeout": 15 }] }], "SessionEnd": [{ "hooks": [{ "type": "command", "command": "node ~/ai-workbench/scripts/claude-hook.mjs", "timeout": 15 }] }] } } - 重开 Claude Code。
审批结果怎么回到 Claude:
| 你在工作台点 | Claude Code 收到 |
|---|---|
| 批准 | allow:命令直接执行 |
| 驳回 | deny + 你的意见:Claude 不会重试同样的操作 |
| 打回修改 | deny + 你写的修改意见:Claude 按意见调整后再来 |
| 我来接管 | deny:Claude 停下来总结进度;任务转到你的待办 |
| 25 分钟没人处理 | ask:退回终端里原本的确认提示 |
工作台连不上时 hook 什么都不做,Claude Code 照常走自己的权限确认,不会卡住。
规则在「设置 › 审批规则」里增删和开关:Bash 匹配命令文本,Edit/Write 匹配文件路径,正则不区分大小写,同时命中多条时取风险最高的。
想让「反代池」里跑的 Claude Code 实例也接入?同样配置,在
~/.ai-workbench.json里加"executor": "pool",它的任务就会归到反代池下面。
在跑 Claude Code / Codex 的电脑上定时执行。它读 ~/.claude/projects 和 ~/.codex/sessions 下的本地会话日志,只上报 token 数、模型、项目目录名和时间,不传对话内容。
node ~/ai-workbench/scripts/sync-usage.mjs # 增量;--full 全量重扫(重复的会被忽略)
crontab -e
*/10 * * * * /usr/local/bin/node ~/ai-workbench/scripts/sync-usage.mjs >> ~/.ai-workbench-sync.log 2>&1想让用量对上「账号与额度」里的账号,在 ~/.ai-workbench.json 里加:
{ "accounts": { "claude": "Claude Max · 主号", "codex": "Codex · Plus" } }Codex 的日志格式没有官方文档,解析是尽力而为;格式变了只会少算,不会出错。
scripts/runner.mjs 是一台「干活的机器」:从看板领一个你点了开始的任务 → 给它在独立 worktree 里开分支 → 用 Claude Code 无头模式跑 → 干完回来等你批准合并和推送。
不需要 Claude 账号。 它只要求一个 Anthropic 兼容接口,所以可以直接接:
- DeepSeek 官方:
https://api.deepseek.com/anthropic - 阿里云百炼:
https://dashscope.aliyuncs.com/apps/anthropic(模型名如deepseek-v4.1-flash) - 任何实现了
/v1/messages的服务
配置写在 ~/.ai-workbench-runner.json(不进仓库),完整样例见 docs/runner.example.json:
{
"workbench": "http://localhost:3200",
"token": "与 .env 里的 WB_TOKEN 相同",
"projects": { "my-repo": "C:/work/my-repo" },
"worktreeRoot": "C:/work/wb-worktrees",
"executors": {
"pool": {
"tool": "claude",
"args": ["-p", "--output-format", "stream-json", "--verbose"],
"backends": [
{ "name": "bailian", "model": "deepseek-v4.1-flash",
"env": { "ANTHROPIC_BASE_URL": "https://dashscope.aliyuncs.com/apps/anthropic", "ANTHROPIC_AUTH_TOKEN": "<百炼 key>" } },
{ "name": "deepseek", "model": "deepseek-chat",
"env": { "ANTHROPIC_BASE_URL": "https://api.deepseek.com/anthropic", "ANTHROPIC_AUTH_TOKEN": "<DeepSeek key>" } }
]
}
}
}backends 按顺序排:派单建议指向哪个就走哪个,前一个报 401 / 403 / 429 / 额度不足时,同一个任务自动换下一个重跑(测试失败、语法错误这类不换——那会把真 bug 藏起来)。不写 backends 就退回单后端写法,直接写 model 和 env。
跑起来:
node scripts/runner.mjs --check # 先自检:工具在不在、每个后端有没有模型名
node scripts/runner-guard.mjs # 开始守在看板前面(守卫保证同时只有一个)几道闸:
- 单任务默认 45 分钟(
maxMinutes),超时杀掉。 - 用量超过单任务 token 上限(默认 2000 万,按执行者在「剧组」页可改)或超出时长上限,会停下来问你「继续还是终止」,不会闷头烧钱。
- 合并、推送分开审批(默认等 120 / 30 分钟)。普通任务只改
docs/时可按设置自动批合并;沙箱补丁不走这条捷径。推送审批绑定实际提交,批完又加了提交就得重新问。 - 只在你自己的 worktree 里动文件;仓库里带
.claude/settings*.json的会被直接拒绝,因为项目级配置能绕过门禁。 - 只领你点了「开始」的任务。
- 只读任务勾「只要一个回答」:结论会存进详情;没改文件就不用合并。没勾却没有任何文件产出,会明确报失败,不把一句空话当干完。
开机后也想让它自己守着:Windows 的安装、自启和停用看 docs/INSTALL-WINDOWS.md,这里不再抄一份命令。改了执行器脚本,要重启执行器;页面提示「在跑旧代码」时别只刷新网页。
不开沙箱时,执行器直接在你电脑上跑 AI,靠钩子审批和命令检查挡危险操作——但命令检查天生堵不完(字符串拼接、脚本里再起进程都绕得过)。开了沙箱,墙从「命令长什么样」换成「它在哪儿跑」:
- 每个任务一个一次性容器:不是 root、没有任何特权、根目录只读、不挂你电脑上的任何目录、没有
docker.sock; - 网络没有出口,只能经白名单代理访问 npm、PyPI 这类包仓库;连不到你电脑上的工作台、反代池、局域网;
- 模型接口走「模型网关」容器:AI 手里只有假 key,真 key 经 stdin 写进网关的内存盘,不上命令行、不进环境变量;
- 代码以 bundle 进去、以补丁出来;补丁先过检查(不许碰
.git、任何目录下的.gitattributes、符号链接、子模块、密钥文件……),过了才套到你的 worktree,之后再问你批不批合并 / 推送;宿主接补丁时禁用 Git 的外部过滤器和驱动; - 进不去沙箱就直接失败,不会悄悄退回你电脑上跑。
npm run sandbox:build # 打镜像,要联网一次;Debian 源报错加 --apt-mirror mirrors.tuna.tsinghua.edu.cn
node --test test/sandbox0462-docker.test.ts # 在你的电脑上跑一遍真容器探针第一版只支持 Claude Code + API Key 后端(反代池、DeepSeek、百炼这类)。推荐把 "sandbox": "docker" 只写在这类执行者里,别一把开给所有工具:
"executors": {
"pool": { "sandbox": "docker", "tool": "claude", "backends": [ … ] },
"workbuddy": { "tool": "codebuddy" }
}其余执行者不写 sandbox,照原来的方式跑;如果以前在全局开过,先把全局那项去掉。宿主开了 Clash 一类代理的 fake-ip,把 "sandboxFakeIp": true 留在全局。常见问题见 FAQ 的沙箱一节。
沙箱名额按并发设置和 Docker 可用内存一起算,满了显示「排队等沙箱名额」,不会硬挤进去。/work 默认上限 4 GB,约每分钟查一次;超了显示「写满了」并停掉,半截补丁不收。这是定时检查,不是硬磁盘配额,别把它当成绝不会瞬时多写。
沙箱挡不住的(写明白,别装作挡住了):容器 / 内核本身的漏洞;白名单里的站点本身就是出口。
工作台不自己连 GitHub,执行器替它读 Issue、取队列、写评论。要用时,在工作台 .env 里填 GITHUB_REPOS=你的用户名/仓库 和 GITHUB_ALLOWED_AUTHORS=你的用户名;令牌 githubToken 只填执行器配置,改完重启执行器。
给 Issue 加 wb-task 标签,在线且空闲的执行器通常 5 分钟内把它带回来,默认仍等你在网页点「开始」。任务进度和结果由执行器回写;执行器离线,设置里会写「GitHub 通道暂停」,重新在线后继续。Issue 正文作为资料文件交给 AI、不进提示词;仍然建议只接你自己写 Issue 的仓库。
在要看的机器上每分钟上报 CPU、内存、磁盘、GPU(nvidia-smi)、运行中的容器数:
crontab -e
* * * * * WB_URL=http://127.0.0.1:3200 WB_TOKEN=<令牌> WB_MACHINE=my-pc bash /opt/ai-workbench/scripts/heartbeat.sh超过 3 分钟没心跳会显示离线。
任何能发 HTTP 的东西都能用。请求头带 Authorization: Bearer <WB_TOKEN>。
WB=http://<服务器IP>:3200; AUTH="Authorization: Bearer $WB_TOKEN"
# 建任务(executor: claude | codex | pool | local | me)
curl -s -X POST $WB/api/tasks -H "$AUTH" -H 'Content-Type: application/json' \
-d '{"title":"迁移监控面板","executor":"codex","project":"demo-server","category":"ops","session_url":"https://chatgpt.com/codex/tasks/…"}'
# 更新进度
curl -s -X PATCH $WB/api/tasks/12 -H "$AUTH" -H 'Content-Type: application/json' -d '{"status":"running","progress":40,"step":"改配置"}'
# 发起审批,然后轮询结果(status: pending → approved / rejected / changes / takeover)
curl -s -X POST $WB/api/approvals -H "$AUTH" -H 'Content-Type: application/json' \
-d '{"title":"发布 v0.3.2","summary":"docker compose up -d","risk":"high","executor":"pool","task_id":12}'
curl -s $WB/api/approvals/7 -H "$AUTH"
# 更新账号额度
curl -s -X PUT "$WB/api/accounts/反代%20A" -H "$AUTH" -H 'Content-Type: application/json' -d '{"executor":"pool","window_pct":88,"reset_note":"32m","status":"near"}'完整接口:
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | /api/health |
健康检查(无需令牌) |
| GET / POST | /api/tasks |
列表(?status=running,review&executor=claude&category=dev)/ 新建 |
| GET / PATCH / DELETE | /api/tasks/:id |
详情(含审批和动态)/ 更新 / 删除 |
| GET / POST | /api/approvals |
列表(?status=pending)/ 发起 |
| GET | /api/approvals/:id |
查询审批状态 |
| POST | /api/approvals/:id/decide |
{"decision":"approved|rejected|changes|takeover","feedback":"…"} |
| POST | /api/approvals/:id/expire |
关闭无人处理的审批 |
| POST | /api/hooks/claude |
Claude Code hook 接收端(claude-hook.mjs 在用) |
| POST | /api/usage |
{"records":[{source_key, ts, executor, account, model, project, input_tokens, output_tokens, cache_tokens}]} |
| GET | /api/stats?days=7|14|30 |
汇总统计 |
| GET / PUT / DELETE | /api/accounts[/:name] |
账号与额度 |
| GET / POST / DELETE | /api/machines[/:name/heartbeat] |
机器心跳 |
| GET / POST / PATCH / DELETE | /api/rules[/:id] |
审批规则 |
| GET | /api/events、/api/events.csv |
审计日志 |
| GET | /api/backup |
下载数据库快照 |
| GET / POST | /api/backup/state、/api/backup/run |
自动备份状态 / 立刻备份一次(只能在网页上点) |
「自媒体」页记你在七个平台发的每条内容和它的数据(播放、点赞、评论、转发、收藏、涨粉),只追加快照,曲线从快照画。
- 发布永远你自己点。工作台不自动登录、不替你发。
- 数据先手动填:国内平台基本没有给个人创作者的数据接口;爬虫和第三方数据服务一律不用(违反平台规则,会连累账号)。Instagram / Facebook 的官方接口以后接。
- 内容的打分、预测、复盘可以交给执行器里的技能做(比如 cheat-on-content),工作台只派活、收结果、记数据。
- 自动:每天 03:30(
WB_TZ)把快照写到WB_BACKUP_DIR,文件名<项目>_<日期>_<时间>_<版本>.db,旁边一份同名.json记着时间、版本、迁移序号和数量,保留最近 30 份。设成网盘的同步文件夹就有了异地副本。 - 备份里删掉了
sessions:备份泄露也不能拿去登录,恢复后重新登录一次即可。key 和令牌本来就不在数据库里(在.env)。 - 手动:网页「设置 › 自动备份」点「立即备份」(只有网页上的登录能点,Bearer 令牌不行);或
curl -H "Authorization: Bearer $WB_TOKEN" $WB/api/backup -o workbench.db直接下载一份。运行中导出也是一致的快照。 - 超过 3 天没备份成功会给你建一条待办。
- 恢复:
docker compose down,把备份拷进数据卷替换/data/workbench.db(顺手删掉-wal/-shm),再up -d。完整步骤见docs/INSTALL-WINDOWS.md。
WB_BACKUP_DIR 就是个普通文件夹,指到哪个网盘的同步目录都行:
| 网盘 | 填什么 |
|---|---|
| OneDrive | C:/Users/你/OneDrive/wb-backups |
| 坚果云 | C:/Users/你/Nutstore Files/wb-backups |
| Google 云端硬盘 | C:/Users/你/Drive/wb-backups——用 Drive 电脑版的「添加文件夹」同步,不要指向 G: 虚拟盘,Docker 写不进去 |
| iCloud(Windows) | C:/Users/你/iCloudDrive/wb-backups |
| 局域网 NAS | //nas/share/wb-backups(先确认 Docker 能访问这个共享) |
用正斜杠写最稳,路径里有中文和空格也可以。
- 两把钥匙,各管一头:
WB_PASSWORD(≥ 12 位)只用于网页登录,换到的是服务端随机生成的 HttpOnly 会话 Cookie;WB_TOKEN只给脚本用 Bearer 令牌。批审批、改规则、改设置、导出整库这些动作只有网页会话能做,脚本令牌做不了,所以令牌泄露了也批不了一条rm -rf。两个值相同会拒绝启动。 - 默认设计给局域网用。要从外网访问,请放在带 HTTPS 的反向代理后面(Caddy / Nginx / Tailscale),代理需传
X-Forwarded-Proto。 - 跨站写请求会被拒绝(检查 Origin + SameSite Cookie);页面里的所有用户内容都经过转义;CSP 禁止外部脚本。
- 换钥匙:改
.env里的WB_TOKEN或WB_PASSWORD后重启。换令牌要同步改脚本里的值;换密码会让所有浏览器退出登录(重启时发现密码变了就清掉全部会话,并记一条auth.password_changed审计)。所以怀疑密码泄露时,正确顺序是先改密码再重启——只改不重启,旧会话还活着。第一次在这台机器上启动时只记住指纹、不踢人。
这个仓库本身就是这样开发的:
- 决策端(Claude,或任何能读仓库、能跑命令的模型):写需求单、做界面和安全核心、审别人的提交;
- 本机的 coding agent(比如 Codex):实现、真机验收、在你电脑上跑测试;
- 工作台自己的执行器:边界清楚的小活(文档、小样式、加测试),顺便验证「工作台开发工作台」。
交叉验证:谁写的,就由另一方验——决策端写的安全代码由本机 agent 专门试着绕,本机 agent 写的由决策端复核。自己审自己等于没审。
新接手的模型第一句话先读 docs/specs/DECISION-HANDOFF.md 和 docs/specs/README.md 的状态表。要用 GitHub Issue 派活,它用的账号得写进 .env 的 GITHUB_ALLOWED_AUTHORS(默认空,谁都不收)。
npm run dev # 关闭鉴权、用 ./data/dev.db、改代码自动重启
npm run seed # 往空库写演示数据(WB_DB 指定库文件)
npm test # 端到端测试:真实 HTTP + 内存数据库 + 真实 hook / 同步脚本代码结构和约定见 CLAUDE.md(给接手维护的人和 coding agent 看)。 需求单与决策记录见 docs/specs/README.md。
PolyForm Noncommercial License 1.0.0,全文见 LICENSE。说人话:源码公开、只许非商用。它不是 MIT 那种「随便怎么用都行」的开源许可证,严格说也不算 OSI 意义上的「开源」。
| 可以吗 | |
|---|---|
| 自己部署自己用、学习研究、业余项目、个人作品 | 可以 |
| 改代码给自己用;把改过或没改的代码分享给别人 | 可以,但要把许可证(或它的网址)和 Required Notice 那一行一起给对方 |
| 学校、公益组织、政府机构内部用 | 可以 |
| 免费帮朋友装在他自己电脑上、他自己非商用 | 可以 |
| 在公司、工作室、团队里当工作工具用(哪怕不收费、只在内部) | 不可以,要商业授权 |
| 卖它、拿它做收费服务、收费帮客户部署或代运营 | 不可以,要商业授权 |
| 放进收费产品、付费课程、付费社群 | 不可以,要商业授权 |
商业授权:联系 mashangfei@protonmail.com,说明用在哪、几个人用、要不要改代码。
第三方的东西不在这个许可证里。 仓库里不包含任何第三方 Skill。README 里提到的工具各有各的许可证,用之前自己看:例如 cheat-on-content(MIT)、chat-to-content(Apache-2.0);dontbesilent 的 dbskill 不允许再分发、不允许打包进产品——帮别人装时只能让他从官方仓库自己装。
软件按原样提供,不担保;出了事自己担着。贡献规则见 CONTRIBUTING.md。
English summary
Source-available under the PolyForm Noncommercial License 1.0.0. Personal, hobby, research, educational and non-profit use is allowed, including sharing (keep the license and the Required Notice line). Any commercial use — inside a company, as a paid service, or bundled into a paid product — needs a commercial license: mashangfei@protonmail.com. Third-party skills mentioned in this README are not included and carry their own licenses.
- 挂件(056):别的项目以「一句话 / 提醒 / 看板」接进工作台,项目本身不用改
- 三道审批(047):规则直接过 / 模型陪审 / 人批;先只陪审、记吻合率
- 行业包(059):选项目模板、点常用活按钮;生图和视频插件跟着执行器走,工作台不拿 key
- 多调度(051):一个任务拆给几个 AI;AI 派给 AI 有层数上限
- 统一 API 入口(050):你自己的多个账号背后一个兼容接口
- 订阅登录的账号进沙箱;沙箱第二档(真虚拟机)
- 多用户和权限
需求单和状态表见 docs/specs/README.md。








