深夜提醒

现在是深夜,建议您注意休息,不要熬夜哦~

🏮 🏮 🏮

新年快乐

祝君万事如意心想事成!

share-image
ESC

本地部署 SunCodexClaw:让飞书里的 AI 直接改我的代码

为什么想这么干

最近越来越觉得,Codex 这类 AI 编程助手最大的瓶颈不是智商,而是交互场景。我坐在电脑前时,用它改代码很顺手;但人不在电脑旁,突然想查个日志、修个 bug、或者让别人帮看一下项目时,就得先远程连回去,体验很断裂。

我经常在通勤、开会甚至睡前冒出一些想法,比如:

  • 某个服务怎么又起不来了,帮我看看日志;
  • 这个函数重构方案有没有问题;
  • 睡前丢一个耗时任务给它,醒了看结果。

飞书的移动端体验很好,语音输入也方便。于是我就想在本地部署一套东西,让 Codex 成为飞书里的一个机器人,我在手机上发消息,它直接在我电脑上改代码、跑命令,再把结果回给我。

选型:为什么是 SunCodexClaw

一开始我搜了一圈,相关项目大概有两类:

一类是通用型的 AI Agent 聊天壳,主打多轮对话和记忆;另一类是专门把 Codex/Claude Code 接到飞书的执行型机器人。

我选的是 SunCodexClaw。它吸引我的地方在于,它不是只做一层聊天转发,而是把飞书消息、Codex 工作区、本地文件、云文档进度、多账号运行和本机执行串成一条真正能办事的链路。简单说,它在飞书里收到消息后,会直接调用我本地的 codex exec 去干活,结果再回发。

对比其他方案,它更适合我的需求:

  • 直接跑本机 codex,能读能写能执行;
  • 支持图片、文件、语音入站和回传;
  • 每个机器人可以绑定不同工作区;
  • 支持把长任务进度写到飞书云文档;
  • 有本地记忆,跨线程能继承偏好。

部署过程

环境检查

我本地已经装了 Node.js 和 Codex CLI,所以先确认版本:

node -v
npm -v
git --version
codex --version

确认都没问题后, clone 仓库:

cd /home/wenjun/Documents/code
git clone https://github.com/Sunbelife/SunCodexClaw.git
cd SunCodexClaw
npm install

这里遇到一个小坑:ffmpeg-static 的安装脚本会下载预编译二进制,默认 30 秒超时,我的网络没下完就断了。解决方式是先把 npm fetch 超时调长:

npm config set fetch-timeout 120000
npm install

装完后还有两个包有 install script 需要显式批准:

npm approve-scripts ffmpeg-static@5.3.0 protobufjs@7.5.4
npm rebuild

飞书自建应用配置

SunCodexClaw 用飞书自建应用收消息。我在飞书开放平台创建了一个企业自建应用,然后做这几件事:

  1. 开启机器人能力;
  2. 事件订阅里添加 im.message.receive_v1
  3. 权限管理里开启收发消息、读取群聊、上传下载资源、读写云文档等权限;
  4. 创建版本并发布。

权限清单大概是这些(不同租户可能略有差异):

{
"scopes": {
"tenant": [
"im:message",
"im:message:readonly",
"im:message.group_msg",
"im:message.p2p_msg:readonly",
"im:message:send_as_bot",
"im:chat:read",
"im:chat:readonly",
"im:chat.members:read",
"im:resource",
"docx:document",
"docx:document:create",
"docx:document:readonly",
"docx:document:write_only",
"drive:drive",
"drive:drive.metadata:readonly",
"drive:drive:readonly"
],
"user": []
}
}

拿到 App IDApp Secret 后,先放到本地配置文件里,不要写进仓库。

配置文件

SunCodexClaw 的配置分两层:

  • config/secrets/local.yaml:放敏感信息;
  • config/feishu/default.json:放运行配置。

这两层会合并,local.yaml 优先级更高。我把 app_idapp_secretcodex 相关配置写进 local.yaml:

config:
feishu:
default:
app_id: "cli_xxxxxxxxxxxxxxxx"
app_secret: "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
bot_name: "飞书 Codex 助手"
reply_mode: "codex"
require_mention: true
require_mention_group_only: true
progress:
enabled: true
mode: "doc"
codex:
bin: "codex"
model: "deepseek-v4-flash"
reasoning_effort: "high"
cwd: "/home/wenjun/Documents/code"
history_turns: 6
sandbox: "danger-full-access"
approval_policy: "never"
memory:
enabled: true
role_memory: |
默认用简体中文回复。
默认先做事,再解释。

cwd 一开始我用的是 /home/wenjun/Documents/code/my_blog,后来改成 /home/wenjun/Documents/code,因为我下面有好几个项目,机器人需要根据消息判断操作哪个目录。

验证和启动

配置好后先跑 dry-run:

npm run feishu:ws:dry

看到 app_id_found=trueapp_secret_found=truecodex_found=truews client ready 这些信号,说明基本通了。

然后启动:

bash tools/feishu_bot_ctl.sh start default

为了不每次开机都手动启动,我给它加了一个 systemd user 服务:

[Unit]
Description=SunCodexClaw Feishu Bot (default)
After=network.target

[Service]
Type=simple
WorkingDirectory=/home/wenjun/Documents/code/SunCodexClaw
ExecStart=/home/wenjun/.config/nvm/versions/node/v26.5.1/bin/node /home/wenjun/Documents/code/SunCodexClaw/tools/feishu_ws_bot.js --account default
Restart=always
RestartSec=5
Environment="PATH=/home/wenjun/.config/nvm/versions/node/v26.5.1/bin:/usr/bin:/bin:/usr/sbin:/sbin"
Environment="HOME=/home/wenjun"
Environment="CODEX_HOME=/home/wenjun/.codex"

[Install]
WantedBy=default.target

服务文件放到 ~/.config/systemd/user/suncodexclaw-feishu-default.service,然后:

systemctl --user daemon-reload
systemctl --user enable suncodexclaw-feishu-default.service
systemctl --user start suncodexclaw-feishu-default.service

现在开机登录后自动启动,崩溃了也会自动重启。

安全风险要当回事

这里必须强调一下权限问题。为了让机器人能真正改代码、跑命令,我配置的是:

sandbox: "danger-full-access"
approval_policy: "never"

这意味着飞书里的指令会无确认地直接执行。如果机器人被拉进公开群、或者 open_id 白名单配得太宽,风险很大。

我的做法:

  • 只让我自己的飞书账号能触发;
  • 不把它加到外部群;
  • 本机用普通用户运行,不给 root;
  • 重要项目先备份。

如果你只是想让 AI 帮你读代码、给建议,可以把 sandbox 改成 workspace-writeapproval_policy 改成 suggestalways,让它每次执行前都请求确认。

实际怎么用

私聊直接发消息,群里需要 @机器人。我现在常用的几种问法:

@飞书 Codex 助手 列出当前目录下所有项目

@飞书 Codex 助手 看一下 my_blog/_config.yml 里的 categories 配置有没有重复

@飞书 Codex 助手 在 blog_api/internal/routes/routes.go 里加一个 GET /health 路由

@飞书 Codex 助手 帮我跑一下 my_blog 的 hexo generate,看看有没有报错

实际对话效果类似这样:

飞书里的 Codex 助手实际对话

长任务它会先回一句”已接收,正在执行”,然后把过程写到飞书云文档,做完再把结果和文档链接一起发回来。文件、图片也能自动上传。

遇到的问题和总结

整个过程不算复杂,但有几个细节容易踩坑:

  1. ffmpeg-static 下载超时,需要调大 npm fetch 超时并显式批准 install script;
  2. 同一个飞书应用凭据不能同时给两个机器人用,会抢 WebSocket 连接,所以我为这次部署单独建了一个飞书应用;
  3. cwd 的范围要想好,太小只能操作一个项目,太大相对路径容易写错;
  4. 安全边界一定要单独考虑,不要默认给最高权限。

整体体验符合我的预期:手机上发一句话,本机 Codex 就开始干活,结果直接回到飞书。对于随时想使唤 AI 改点代码的场景,这套方案比远程终端顺手多了。

文章作者:阿文
文章链接: https://www.awen.me/post/e4bc9091.html
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 阿文的博客

评论

0 条评论
😀😃😄 😁😅😂 🤣😊😇 🙂🙃😉 😌😍🥰 😘😗😙 😚😋😛 😝😜🤪 🤨🧐🤓 😎🥸🤩 🥳😏😒 😞😔😟 😕🙁☹️ 😣😖😫 😩🥺😢 😭😤😠 😡🤬🤯 😳🥵🥶 😱😨😰 😥😓🤗 🤔🤭🤫 🤥😶😐 😑😬🙄 😯😦😧 😮😲🥱 😴🤤😪 😵🤐🥴 🤢🤮🤧 😷🤒🤕 🤑🤠😈 👿👹👺 🤡💩👻 💀☠️👽 👾🤖🎃 😺😸😹 😻😼😽 🙀😿😾 👍👎👏 🙌👐🤲 🤝🤜🤛 ✌️🤞🤟 🤘👌🤏 👈👉👆 👇☝️ 🤚🖐️🖖 👋🤙💪 🦾🖕✍️ 🙏💅🤳 💯💢💥 💫💦💨 🕳️💣💬 👁️‍🗨️🗨️🗯️ 💭💤❤️ 🧡💛💚 💙💜🖤 🤍🤎💔 ❣️💕💞 💓💗💖 💘💝💟 ☮️✝️☪️ 🕉️☸️✡️ 🔯🕎☯️ ☦️🛐 🆔⚛️🉑 ☢️☣️📴 📳🈶🈚 🈸🈺🈷️ ✴️🆚💮 🉐㊙️㊗️ 🈴🈵🈹 🈲🅰️🅱️ 🆎🆑🅾️ 🆘 🛑📛 🚫💯💢 ♨️🚷🚯 🚳🚱🔞 📵🚭 ‼️⁉️🔅 🔆〽️⚠️ 🚸🔱⚜️ 🔰♻️ 🈯💹❇️ ✳️🌐 💠Ⓜ️🌀 💤🏧🚾 🅿️🈳 🈂🛂🛃 🛄🛅🛗 🚀🛸🚁 🚉🚆🚅 ✈️🛫🛬 🛩️💺🛰️
加载中...

留言反馈

😀😃😄 😁😅😂 🤣😊😇 🙂🙃😉 😌😍🥰 😘😗😙 😚😋😛 😝😜🤪 🤨🧐🤓 😎🥸🤩 🥳😏😒 😞😔😟 😕🙁☹️ 😣😖😫 😩🥺😢 😭😤😠 😡🤬🤯 😳🥵🥶 😱😨😰 😥😓🤗 🤔🤭🤫 🤥😶😐 😑😬🙄 😯😦😧 😮😲🥱 😴🤤😪 😵🤐🥴 🤢🤮🤧 😷🤒🤕 🤑🤠😈 👿👹👺 🤡💩👻 💀☠️👽 👾🤖🎃 😺😸😹 😻😼😽 🙀😿😾 👍👎👏 🙌👐🤲 🤝🤜🤛 ✌️🤞🤟 🤘👌🤏 👈👉👆 👇☝️ 🤚🖐️🖖 👋🤙💪 🦾🖕✍️ 🙏💅🤳 💯💢💥 💫💦💨 🕳️💣💬 👁️‍🗨️🗨️🗯️ 💭💤❤️ 🧡💛💚 💙💜🖤 🤍🤎💔 ❣️💕💞 💓💗💖 💘💝💟 ☮️✝️☪️ 🕉️☸️✡️ 🔯🕎☯️ ☦️🛐 🆔⚛️🉑 ☢️☣️📴 📳🈶🈚 🈸🈺🈷️ ✴️🆚💮 🉐㊙️㊗️ 🈴🈵🈹 🈲🅰️🅱️ 🆎🆑🅾️ 🆘 🛑📛 🚫💯💢 ♨️🚷🚯 🚳🚱🔞 📵🚭 ‼️⁉️🔅 🔆〽️⚠️ 🚸🔱⚜️ 🔰♻️ 🈯💹❇️ ✳️🌐 💠Ⓜ️🌀 💤🏧🚾 🅿️🈳 🈂🛂🛃 🛄🛅🛗 🚀🛸🚁 🚉🚆🚅 ✈️🛫🛬 🛩️💺🛰️