一个原生 macOS 菜单栏应用,用飞书机器人作为入口,把收到的文本消息转发到本机 Codex CLI 执行,再将执行结果回传飞书。
当前版本是 MVP,重点解决三件事:
- 用飞书长连接稳定接收消息事件
- 把 Codex 执行范围限制在白名单项目目录内
- 用本地菜单栏 UI 完成初始化、状态查看和日常配置
- 原生
SwiftUI + AppKit菜单栏应用,无额外服务端依赖 - 使用飞书长连接模式接收
im.message.receive_v1 App Secret只写入 macOS Keychain,不落盘到配置文件- 支持默认项目和多个白名单项目目录
- 所有 Codex 请求都固定在当前选中的项目目录执行
- 任务串行执行,支持取消当前任务并清空排队任务
- 内置常用管理指令,方便直接在飞书里操作
- 提供首次启动向导、设置页、状态页、日志页
- macOS 13+
- Swift 5.7+(或 Xcode 14+)
- 本机已安装并登录
Codex CLI - 一个已开启机器人能力的飞书企业自建应用
- 克隆仓库。
- 在本机确认
codex可执行,并完成登录:
codex --version
codex login- 编译并启动应用:
swift build
swift run CodexFeishuMenuBarApp- 首次启动后,在向导里填写:
- 飞书
App ID - 飞书
App Secret - 默认项目目录
- 其他允许执行的白名单项目目录
- 飞书
- 在飞书中向机器人发送消息,应用会在当前项目目录调用 Codex。
在飞书开放平台创建企业自建应用后,至少完成以下配置:
- 开启机器人能力。
- 在“事件与回调”中启用长连接模式。
- 订阅消息事件
im.message.receive_v1。 - 安装并启用应用,让目标用户或群可以与机器人交互。
应用当前只处理文本消息。
支持的内置指令:
帮助状态当前项目项目列表切到 <项目名>取消任务
未命中内置指令时,默认会在当前项目目录执行:
codex exec "<用户消息>"App Secret仅存储在 macOS Keychain。- 项目目录必须先加入白名单,才能作为执行上下文。
- 所有 Codex 执行都绑定到当前项目目录,不会直接在任意路径运行。
- 配置和日志写入用户目录,不写进仓库。
本地数据位置:
- 配置文件:
~/Library/Application Support/CodexFeishuMenuBarApp/config.json - 日志文件:
~/Library/Application Support/CodexFeishuMenuBarApp/logs.jsonl - 飞书
App Secret:macOS Keychain
Package.swift: Swift Package 定义Sources/Storage: 配置持久化、Keychain、日志、运行状态模型Sources/Projects: 白名单项目目录校验与切换Sources/Codex: 环境检测、进程执行、任务队列Sources/Commands: 内置指令解析与帮助文本Sources/Feishu: 鉴权、回消息、长连接 WebSocket、协议编解码Sources/UI: 菜单栏、窗口、向导、设置、状态、日志
swift build
swift run CodexFeishuMenuBarApp如果你习惯 Xcode,也可以直接打开 Package.swift 进行调试。
- 目前只处理文本消息
- 飞书回传当前使用文本消息,超长输出会被截断
- 还没有做消息去重和会话级上下文记忆
- 还没有做更细粒度的用户、群或租户授权
- 项目编辑能力还比较基础,主要支持新增、切换和删除
- 目前还没有自动化测试
- 增加飞书事件去重,避免网络抖动导致重复执行
- 支持按用户、群、租户做更细粒度授权
- 给队列增加任务 ID、排队详情和历史记录
- 支持增量回传或卡片消息回传 Codex 输出
- 增加项目编辑、排序、搜索和更友好的目录导入
- 增加启动项、崩溃恢复和更完整的连接自愈
- 补齐指令解析、项目白名单、Feishu 协议编解码和任务取消流程的测试覆盖