| name | waga |
|---|---|
| description | 用飞书私聊远程指挥本机的 Cursor CLI 会话(Waga)。给当前会话起个名挂上监听后, 只响应飞书里带该名字前缀的消息,并把回复/状态/情绪表情发回飞书。当用户说 「挂 waga」「/waga-on」「上线飞书」「让我能用飞书远程指挥你」「起个 waga session」 「给 worker 派活」「/who」时使用。底层复用 $WAGA_DIR 仓库脚本。 |
用飞书私聊远程精准指挥本机某个 Cursor CLI 会话。把 Waga 的多会话路由 + 状态反馈
适配到 Cursor CLI:路由逻辑、回信/表情/卡片/spawn 等 helper 全部复用仓库脚本,
唯一与 Claude Code 版的区别是把 Monitor 持久工具换成 Cursor 的
「后台 Shell + notify_on_output」唤醒机制,并且 worker 可切换模型。
lark-cli已安装并配好 bot(见 README 的 Quick start / waga-setup.md)。cursor-agent已安装并登录(cursor-agent status显示 Logged in)。~/.zshrc已 exportWAGA_DIR(本仓库目录)与LARK_CLI_NO_PROXY=1。$WAGA_DIR/.env内有WAGA_CHAT_ID/WAGA_USER_ID(bot 身份收发,无需 auth login)。- 详细的飞书侧路由语法、表情两层设计、/who、/doctor 等,以
$WAGA_DIR/waga-on.md为准。
Claude Code 用 Monitor(persistent:true) 跑 daemon 并靠 task-notification 唤醒会话;
Cursor CLI 没有该工具。等价做法:把同一段 daemon 脚本写成独立 .sh,用后台
Shell(is_background: true)启动,并设 notify_on_output 监听 [WAGA-MSG],命中即通知我。
执行 /waga-on [name] 时:
- 决定 name:用户传参 > 当前 cwd 的 basename >
default。手机友好用 1-2 字符短名。 - 覆盖语义(不叠加):再次挂载前,先 kill 掉本会话之前起的 waga 后台 shell,再起新的;
否则两个 daemon 会并存、共抢
/tmp/waga_sticky.txt。 - 生成 daemon 脚本(把
$WAGA_DIR/waga-on.md「挂载命令」那段 while 循环落盘):
cat > /tmp/waga_monitor_<NAME>.sh <<'WAGA_EOF'
export WAGA_ENGINE_LABEL=cursor # ★卡片蓝名旁显示 · cursor
export WAGA_ENGINE_MODEL="<当前会话模型>" # ★再右边显示模型,如 gemini-3.5-flash;可留空
# ←把 $WAGA_DIR/waga-on.md 中「## 挂载命令」代码块(export...到 done)整段粘进来
WAGA_EOF
chmod +x /tmp/waga_monitor_<NAME>.sh★ 引擎标签(必做):Cursor 侧所有发卡/回信都要在环境里带
WAGA_ENGINE_LABEL=cursor, 这样飞书卡片蓝色 name 旁会显示· cursor · <模型>,与 Claude 拉起的卡区分。
- 用后台 Shell 启动并监听:调用
Shell,command: bash /tmp/waga_monitor_<NAME>.sh <NAME>,is_background: true,并设notify_on_output监听\[WAGA-MSG\]|\[WAGA-ERR\]。 - daemon 会先发上线卡片(
waga-card.py online)并打印[WAGA] listener armed as [<NAME>]。
读对应后台 shell 输出,找最新的 [WAGA-MSG] <ctime> [mid=<mid>] :: <正文> 和紧跟的
[WAGA-REMINDER](里面给好了 vibe / done / reply 整条命令,照抄即可)。
⚠ 所有发卡/回信都要带 WAGA_ENGINE_LABEL=cursor。然后:
- 先贴情绪表情(读懂后按当下情绪挑一组 2-4 个、每次不同、绝不随机):
bash "$WAGA_DIR/waga-react.sh" vibe <mid> "E1 E2 E3" - 干活:可用所有 Cursor 工具。任务型先 announce:
WAGA_ENGINE_LABEL=cursor python3 "$WAGA_DIR/waga-card.py" start <NAME> "收到,开始干X"→step→done - 回信(铁律:必须用 lark-cli 发出去):
WAGA_ENGINE_LABEL=cursor bash "$WAGA_DIR/waga-reply.sh" <NAME> "<回复>" - 收尾换状态:
bash "$WAGA_DIR/waga-react.sh" done <mid>
路由原则:起什么 worker 取决于调哪个 spawn 脚本,不是自动探测。
- Cursor 的 WAGA → 必须调
waga-spawn-cursor.sh(底层cursor-agent,可切模型)。 - Claude Code 的 WAGA 才调
waga-spawn.sh(底层claude)。二者独立、可并存。
bash "$WAGA_DIR/waga-spawn-cursor.sh" <名字> "初始任务" "<工作目录>" "<模型(可选)>"
# 例:
bash "$WAGA_DIR/waga-spawn-cursor.sh" api "把测试跑一遍" "$HOME/proj" gemini-3.1-pro
bash "$WAGA_DIR/waga-spawn-cursor.sh" web "" "$HOME/proj" gpt-5.5-high模型优先级:第 4 参 > 环境变量 WAGA_CURSOR_MODEL > 账号默认。可用模型见
cursor-agent models(Gemini/GPT/Grok/Sonnet/Opus/Composer)。运行中切模型:
飞书发 <名字>: /model gpt-5.5-high(下一条生效)。
⚠ 权限前置(一次性,用户本人做):headless worker 带 --force(等价
--dangerously-skip-permissions),AI 不能自我授权。需用户在
~/.cursor/cli-config.json 的 permissions.allow 加一条精确指向该脚本的规则
(把路径换成你 clone 本仓库的真实绝对路径):
"Shell(bash \"/绝对路径/waga-for-cursor/waga-spawn-cursor.sh\"*)"
/who、name: /stop、name: /status、name: /cd <路径>、name: /model <model>等飞书指令由 daemon 脚本内置处理。
- 会话存活才有唤醒:后台 shell 与 notify_on_output 仅在当前 Cursor 会话活着时起效 (关窗即停,符合「关窗=注销」语义)。
- 其余坑(emoji 大小写敏感、token ~7 天过期喷
[WAGA-ERR]需lark-cli auth login、 代理 reset 用LARK_CLI_NO_PROXY=1)见 README。