brainstorming
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
在 FanBox 终端里指挥兄弟终端窗口(列出/读取/发指令/新开/等待),以及设定时任务(每天/每周/固定时间/cron 自动开窗跑 agent)。用户说「开个窗口跑 X」「让 N 号窗口执行…」「每天 X 点自动…」「定时/定期跑…」时使用。仅当 FANBOX_CTL 环境变量存在时可用。
Claude Code
$ npx -y skills add alchaincyf/fanbox --skill fanbox-agent --agent claude-code
Codex
$ npx skills add alchaincyf/fanbox --skill fanbox-agent -a codex -y
Cursor
$ npx skills add alchaincyf/fanbox --skill fanbox-agent -a cursor -y
Gemini CLI
$ npx skills add alchaincyf/fanbox --skill fanbox-agent -a gemini-cli -y
GitHub Copilot
$ npx skills add alchaincyf/fanbox --skill fanbox-agent -a github-copilot -y
OpenCode
$ npx skills add alchaincyf/fanbox --skill fanbox-agent -a opencode -y
Windsurf
$ npx skills add alchaincyf/fanbox --skill fanbox-agent -a windsurf -y
name: fanbox-agent description: 在 FanBox 终端里指挥兄弟终端窗口(列出/读取/发指令/新开/等待),以及设定时任务(每天/每周/固定时间/cron 自动开窗跑 agent)。用户说「开个窗口跑 X」「让 N 号窗口执行…」「每天 X 点自动…」「定时/定期跑…」时使用。仅当 FANBOX_CTL 环境变量存在时可用。
只在 FanBox 桌面 app 的终端里可用。先确认门票在手:
[ -n "$FANBOX_CTL" ] && echo "在 FanBox 里,我是 $FANBOX_TERM_ID 号窗口" || echo "不在 FanBox 终端里,本 skill 不可用"
三个环境变量由 FanBox 注入:`FANBOX_CTL`(接口地址)、`FANBOX_CTL_TOKEN`(门票,每次启动随机、只存在于 FanBox 终端的环境里,**绝不外传、不写进文件**)、`FANBOX_TERM_ID`(自己的窗口 id)。
**别给自己($FANBOX_TERM_ID)发指令**——那会把你自己的输入流打乱甚至死循环。
所有请求带 `x-fanbox-token` 头。以下用 `CT` 缩写公共参数:
CT=(-s -H "x-fanbox-token: $FANBOX_CTL_TOKEN")
**列出所有终端窗口**(id / 目录 / 前台进程 / 忙闲 / 最近输出尾巴):
curl "${CT[@]}" "$FANBOX_CTL/terminals"
# → {"ok":true,"terminals":[{"id":"t2","cwd":"…","proc":"claude","busy":false,"hooked":true,"state":"done","tail":"…"}]}**读某窗口最近输出**(去 ANSI 纯文本,默认 200 行,最多 2000):
curl "${CT[@]}" "$FANBOX_CTL/read?id=t2&lines=100"**给窗口发指令**(默认自动补回车提交;`"submit": false` 只输入不提交;多行文本发给 claude 等 TUI 加 `"paste": true` 走 bracketed paste 整块粘贴):
curl "${CT[@]}" -X POST -H 'Content-Type: application/json' \
-d '{"id":"t2","text":"npm test"}' "$FANBOX_CTL/send"控制键直接发字符本身,如 Ctrl-C:`{"id":"t2","text":"","submit":false}`。
**新开终端窗口**(可选 `autorun` 开窗即执行,会等 shell 就绪再敲):
curl "${CT[@]}" -X POST -H 'Content-Type: application/json' \
-d '{"cwd":"/path/to/project","autorun":"claude \"跑通所有测试\""}' "$FANBOX_CTL/create"
# → {"ok":true,"id":"t5","autorun":true}**等窗口告一段落**(HTTP 长轮询,timeoutMs 最长 240000):
curl "${CT[@]}" -X POST -H 'Content-Type: application/json' \
-d '{"id":"t5","timeoutMs":120000}' "$FANBOX_CTL/wait"三种等法:
返回 `{ok, idle|matched|exited|timeout, elapsed, output}`,output 是等待期间的输出(最后 8KB),通常不用再 read。
**关闭窗口**:
curl "${CT[@]}" -X POST -H 'Content-Type: application/json' -d '{"id":"t5"}' "$FANBOX_CTL/kill"用户说「每天早上 9 点整理灵感箱」「周五下班前汇总本周改动」「两小时后跑一遍测试」时,把意图换算成 schedule 对象调接口。到点 FanBox 会自动开一个终端窗口执行(FanBox 没开着则记「错过」不补跑)。
schedule 三种形态:
**列出全部任务**:
curl "${CT[@]}" "$FANBOX_CTL/cron"**创建 / 修改**(带 `id` 是修改,不带是创建;`agent` 可选 `claude`/`codex`/`shell`;`full:true` 表示全自动跳过一切确认——**必须用户明确授权才可设**,默认 acceptEdits):
curl "${CT[@]}" -X POST -H 'Content-Type: application/json' -d '{
"name": "整理灵感箱",
"cwd": "/Users/xxx/Documents/写作",
"agent": "claude",
"prompt": "把灵感箱里的碎片整理进对应选题,完成后简要汇报",
"schedule": {"type":"cron","expr":"0 9 * * *"}
}' "$FANBOX_CTL/cron/save"**预览执行时间**(换算完先验一下,把结果报给用户确认):
curl "${CT[@]}" -X POST -H 'Content-Type: application/json' \
-d '{"schedule":{"type":"cron","expr":"0 18 * * 5"}}' "$FANBOX_CTL/cron/preview"
# → {"ok":true,"times":[…]} 接下来最多 3 次的时间戳**其他操作**(都是 POST):`/cron/toggle` `{"id":"crxx","enabled":false}`、`/cron/run` `{"id":"crxx"}`(立即执行一次)、`/cron/delete` `{"id":"crxx"}`。
规矩:创建/修改完把「任务名 + 什么时候执行 + 去哪个目录干什么」复述给用户;删除和 `full:true` 先经用户明确同意。
新窗口里的 claude 默认权限模式会在写文件/跑命令前停下等确认,没人替它点就永远卡着(wait 只会 timeout 或 quiet)。两条路:
1. `create` × N 个窗口,不同 `cwd` 或不同 `autorun` 方案 2. 并行等待:每个窗口的 `wait` 用 `curl … &` 后台发起,`wait` 命令收齐 3. 从各 `wait` 返回的 `output`(或补一次 `read`)收结果,对比汇报
用户在 FanBox 界面上能看到每个窗口实时滚动,被遥控的 tab 会闪 ⚡。
"AI 帮你一个下午起十个项目,然后它们就再也找不到了。FanBox 帮你把它们找回来。" "AI spins up ten projects in an afternoon. FanBox helps you find them again."
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…
Ask which skill or flow fits your situation. A router over the skills in this repo.