| name | feishu-codex-bridge |
| description | Run local Codex CLI from Feishu/Lark chat with sessions, attachments, and background service support |
| triggers | ["how do I set up the Feishu Codex bridge","configure feishu codex bridge for my team","run codex commands from Lark chat","manage Feishu bot sessions and workspaces","troubleshoot feishu-codex-bridge connection","set up background service for Lark Codex bot","use codex CLI through Feishu messages","configure reasoning effort for Feishu Codex bridge"] |
Feishu Codex Bridge
Skill by ara.so — Codex Skills collection.
A local bridge that connects Feishu/Lark chat to your local Codex CLI. Send messages in Feishu/Lark and the bridge runs codex exec on your machine, streaming results back to chat with session persistence, file attachments, and background service support.
What It Does
- Chat-to-CLI Bridge: Converts Feishu/Lark messages into local
codex exec commands
- Session Management: Maps each chat/topic to a persistent Codex session
- Attachment Support: Downloads images and files for Codex to process
- Workspace Management: Switch between named project directories
- Background Service: Runs as a macOS launchd service
- Access Control: Allowlist users, chats, and admin commands
- Lark-CLI Integration: Gives Codex API access to Lark messages, docs, calendars
Installation
Global NPM Install
npm i -g feishu-codex-bridge
feishu-codex-bridge --version
First-Time Setup
feishu-codex-bridge start
This interactive setup will:
- Find or install Codex CLI (
@openai/codex)
- Check
codex login status and prompt if needed
- Show a QR code for Feishu/Lark app creation
- Create PersonalAgent app and save config
- Install and initialize
lark-cli with the same App ID
- Start listening for chat events
After setup, test in Feishu/Lark DM:
/status
Help me inspect this repo
Requirements
- Node.js >= 20
- Network access to npm, OpenAI/Codex, and Feishu/Lark platform
- Terminal for QR scan and login prompts
Custom Codex Binary
export CODEX_BIN="/path/to/codex"
Bridge checks these locations in order:
$CODEX_BIN
codex in $PATH
~/.feishu-codex-bridge/codex-cli
/Applications/Codex.app/Contents/Resources/codex (macOS)
Configuration
Directory Structure
~/.feishu-codex-bridge/
├── config.json # App config and preferences
├── secrets.enc # Encrypted App Secret store
├── sessions.json # Chat-to-session mapping
├── workspaces.json # Named workspaces
├── processes.json # Live process registry
├── service.log # Service stdout
├── service.err.log # Service stderr
├── logs/YYYY-MM-DD.log # Daily structured logs
├── media/<chatId>/ # Downloaded attachments (24h TTL)
├── codex-cli/ # Private Codex CLI install
└── lark-cli/ # Private Lark CLI install
config.json Structure
{
"appId": "cli_a1234567890abcde",
"tenant": "feishu",
"preferences": {
"codexReasoningEffort": "high",
"timeout": 300,
"replyMode": "stream",
"allowedUsers": [],
"allowedChats": [],
"admins": []
}
}
Reasoning Effort
Set globally in config.json or per-chat via /config:
{
"preferences": {
"codexReasoningEffort": "xhigh"
}
}
Values: minimal, low, medium, high, xhigh. Omit to inherit from ~/.codex/config.toml.
Access Control
Restrict bot access in config.json:
{
"preferences": {
"allowedUsers": ["ou_1234567890abcdef"],
"allowedChats": ["oc_9876543210fedcba"],
"admins": ["ou_1234567890abcdef"]
}
}
Find IDs from logs:
grep '"event":"enter"' ~/.feishu-codex-bridge/logs/$(date +%Y-%m-%d).log | tail -5
Chat Commands
Status and Control
/status # Show cwd, session, agent, reasoning effort
/help # Show help card with all commands
/stop # Stop current Codex run
/reconnect # Reconnect WebSocket
/ps # List bridge processes
/exit <id|#> # Stop a bridge process (admin)
/doctor [description] # Diagnose bridge issues with Codex
Session Management
/new # Reset current chat's session
/reset # Alias for /new
/resume [N] # List and resume recent sessions in cwd
/timeout [N|off|default] # Set idle timeout for current session
Workspace Management
/cd <path> # Change working directory (resets session)
/ws list # List named workspaces
/ws save <name> [path] # Save workspace (defaults to current cwd)
/ws use <name> # Switch to workspace
/ws remove <name> # Delete workspace
Example workspace workflow:
/cd ~/projects/api-server
/ws save api-server
/cd ~/projects/frontend
/ws save frontend
/ws list
/ws use api-server
Configuration
/config # Open interactive config menu
/account # View or change Feishu/Lark app (admin)
Background Service
Install and Manage (macOS launchd)
feishu-codex-bridge start
feishu-codex-bridge service install launchd
feishu-codex-bridge service status
feishu-codex-bridge service logs --follow
feishu-codex-bridge service restart
feishu-codex-bridge service uninstall
Service Logs
tail -f ~/.feishu-codex-bridge/service.log
tail -f ~/.feishu-codex-bridge/service.err.log
tail -f ~/.feishu-codex-bridge/logs/$(date +%Y-%m-%d).log
Platform Configuration
After QR setup, configure in Feishu/Lark Developer Console:
Required Permission Scopes
im:message
im:message:send_as_bot
im:resource
im:chat (for group creation)
drive:drive (for cloud-doc comments)
Event Subscriptions (Long-Connection Mode)
im.message.receive_v1
card.action.trigger
drive.notice.comment_add_v1 (for @bot in docs)
im.message.reaction.created_v1 (optional)
im.message.reaction.deleted_v1 (optional)
im.chat.member.bot.added_v1 (optional)
Important: Bridge and lark-cli must use the same App ID. Do not run lark-cli config init --new after bridge setup.
User OAuth
Required only for accessing personal resources (user's docs, calendar, chat history):
export PATH="$HOME/.feishu-codex-bridge/lark-cli/node_modules/.bin:$PATH"
lark-cli auth login --recommend
Bot identity works for tenant/bot APIs. User OAuth needed for personal resource access.
Development
From Source
git clone https://github.com/QQQingyu/feishu-codex-bridge.git
cd feishu-codex-bridge
npx pnpm@10.20.0 install
npx pnpm@10.20.0 build
node bin/feishu-codex-bridge.mjs --help
Type Checking and Tests
npx pnpm@10.20.0 typecheck
npx pnpm@10.20.0 test
Troubleshooting
Bot is Silent
feishu-codex-bridge ps
feishu-codex-bridge service status
feishu-codex-bridge service logs --follow
tail -f ~/.feishu-codex-bridge/logs/$(date +%Y-%m-%d).log
If process is running but bot doesn't respond, verify:
- Permission scopes in Developer Console
- Event subscriptions are enabled
- Long-connection mode is active
Codex CLI Issues
feishu-codex-bridge doctor
feishu-codex-bridge start
Common fixes:
- Codex not in PATH: Bridge auto-installs to
~/.feishu-codex-bridge/codex-cli
- Not logged in: Setup prompts for
codex login
- App mismatch: Ensure bridge and lark-cli use same App ID
Lark CLI Path Issues
Add to shell profile for direct terminal usage:
export PATH="$HOME/.feishu-codex-bridge/lark-cli/node_modules/.bin:$PATH"
For Codex runs, bridge handles PATH automatically.
App ID Mismatch
If lark-cli was initialized with a different app:
feishu-codex-bridge start
Never run lark-cli config init --new after bridge setup.
Hanging Codex Runs
# In chat:
/stop
# Set idle timeout globally
/config
# Or for current session only:
/timeout 10
Process Conflicts
Only one bridge instance per Feishu/Lark app. Stop foreground before installing service:
feishu-codex-bridge ps
feishu-codex-bridge exit <id>
pkill -f feishu-codex-bridge
Log Analysis
grep '"event":"enter"' ~/.feishu-codex-bridge/logs/$(date +%Y-%m-%d).log | tail -10
grep '"level":"error"' ~/.feishu-codex-bridge/logs/$(date +%Y-%m-%d).log | tail -10
grep '"chatId":"oc_..."' ~/.feishu-codex-bridge/logs/$(date +%Y-%m-%d).log
Common Patterns
Multi-Project Workspace Setup
/cd ~/work/backend-api
/ws save backend
/cd ~/work/frontend-app
/ws save frontend
/cd ~/work/docs
/ws save docs
/ws use backend
Help me add rate limiting to the auth endpoint
/ws use frontend
Update the login form to show better errors
/ws use docs
Generate API docs from the OpenAPI spec
Session Resume After Restart
# List recent sessions in current directory
/resume
# Resume specific session (shows last 10)
/resume 3
Per-Chat Reasoning Effort
# High effort for complex refactoring
/config
# Select "Reasoning Effort" > "xhigh"
# In different chat, use default
/config
# Select "Reasoning Effort" > "default"
Access Control Setup
{
"preferences": {
"allowedUsers": [
"ou_dev_team_member_1",
"ou_dev_team_member_2"
],
"allowedChats": [
"oc_dev_team_group"
],
"admins": [
"ou_dev_team_member_1"
]
}
}
Debugging Bridge Behavior
# In chat:
/doctor The bot isn't responding to file attachments
# Codex will analyze recent logs and suggest fixes
Architecture
Feishu/Lark Chat
↓ WebSocket
Bridge Process
↓ spawn
codex exec/resume
↓ optional
lark-cli API calls
↓
Streaming Card Reply
Responsibilities:
- Bridge: Event handling, session mapping, attachment downloads, card rendering, process lifecycle
- Codex CLI: Code reasoning, file editing, command execution, session resume
- Lark CLI: API tool for messages, docs, calendars, groups, OAuth
License
MIT