Auto-claude-code-research-in-sleep feishu-notify
Send notifications to Feishu/Lark. Internal utility used by other skills, or manually via /feishu-notify. Supports push-only (webhook) and interactive (bidirectional) modes. Use when user says \\\"\u53d1\u98de\u4e66\\\", \\\"notify feishu\\\", or other skills need to send status updates.
git clone https://github.com/wanshuiyin/Auto-claude-code-research-in-sleep
T=$(mktemp -d) && git clone --depth=1 https://github.com/wanshuiyin/Auto-claude-code-research-in-sleep "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/skills-codex/feishu-notify" ~/.claude/skills/wanshuiyin-auto-claude-code-research-in-sleep-feishu-notify-6b8688 && rm -rf "$T"
skills/skills-codex/feishu-notify/SKILL.mdFeishu/Lark Notification
Send a notification: $ARGUMENTS
Overview
This skill provides Feishu/Lark integration for ARIS. It is designed as an internal utility — other skills call it at key events (experiment done, review scored, checkpoint waiting). It can also be invoked manually.
Zero-impact guarantee: If no
feishu.json config exists, this skill does nothing and returns silently. All existing workflows are completely unaffected.
Configuration
The skill reads
~/.codex/feishu.json. If this file does not exist, all Feishu functionality is disabled — skills behave exactly as before.
Config Format
{ "mode": "push", "webhook_url": "https://open.feishu.cn/open-apis/bot/v2/hook/YOUR_WEBHOOK_ID", "interactive": { "bridge_url": "http://localhost:5000", "timeout_seconds": 300 } }
Modes
| Mode | value | What it does | Requires |
|---|---|---|---|
| Off | or file absent | Nothing. Pure CLI as-is | Nothing |
| Push only | | Send webhook notifications at key events. Mobile push, no reply | Feishu bot webhook URL |
| Interactive | | Full bidirectional. Approve/reject from Feishu, reply to checkpoints | feishu-claude-code running |
Workflow
Step 1: Read Config
cat ~/.codex/feishu.json 2>/dev/null
- File not found → return silently, do nothing
→ return silently, do nothing"mode": "off"
→ proceed to Step 2 (push)"mode": "push"
→ proceed to Step 3 (interactive)"mode": "interactive"
Step 2: Push Notification (webhook)
Send a rich card to the Feishu webhook:
curl -s -X POST "$WEBHOOK_URL" \ -H "Content-Type: application/json" \ -d '{ "msg_type": "interactive", "card": { "header": { "title": {"tag": "plain_text", "content": "TITLE"}, "template": "COLOR" }, "elements": [ {"tag": "markdown", "content": "BODY"} ] } }'
Card templates by event type:
| Event | Title | Color | Body |
|---|---|---|---|
| Experiment Complete | | Results table, delta vs baseline |
| Review Round N: X/10 | (≥6) / (<6) | Score, verdict, top 3 weaknesses |
| Checkpoint: Waiting for Input | | Question, options, context |
| Error: [type] | | Error message, what failed |
| Pipeline Complete | | Final summary, deliverables |
| Custom | | Free-form message from $ARGUMENTS |
Return immediately after curl — push mode never waits for a response.
Step 3: Interactive Notification (bidirectional)
Interactive mode uses feishu-claude-code as a bridge:
-
Send message to the bridge:
curl -s -X POST "$BRIDGE_URL/send" \ -H "Content-Type: application/json" \ -d '{"type": "EVENT_TYPE", "title": "TITLE", "body": "BODY", "options": ["approve", "reject", "custom"]}' -
Wait for reply (with timeout):
curl -s "$BRIDGE_URL/poll?timeout=$TIMEOUT_SECONDS"Returns:
or{"reply": "approve"}
or{"reply": "reject"}
or{"reply": "user typed message"}{"timeout": true} -
On timeout: Fall back to
behavior (proceed with default option).AUTO_PROCEED -
Return the user's reply to the calling skill so it can act on it.
Step 4: Verify Delivery
- Push mode: Check curl exit code. If non-zero, log warning but do NOT block the workflow.
- Interactive mode: If bridge is unreachable, fall back to push mode (if webhook configured) or skip silently.
Helper Function (for other skills)
Other skills should use this pattern to send notifications:
### Feishu Notification (if configured) Check if `~/.codex/feishu.json` exists and mode is not "off": - If **push** mode: send webhook notification with event summary - If **interactive** mode: send notification and wait for user reply - If **off** or file absent: skip entirely (no-op)
This check is always guarded. If the config file doesn't exist, the skill skips the notification block entirely — zero overhead, zero side effects.
Event Catalog
Skills send these events at these moments:
| Skill | Event | When |
|---|---|---|
| | After each round's review score |
| | Loop complete (positive or max rounds) |
| | After each round's review score |
| | All rounds complete |
| | Screen session finishes |
| | Between phases (if interactive) |
| | Final report ready |
| | Results collected |
| | Between workflow stages |
| | Full pipeline complete |
Key Rules
- NEVER block a workflow because Feishu is unreachable. Always fail open.
- NEVER require Feishu config — all skills must work without it.
- Config file absent = mode off. No error, no warning, no log.
- Push mode is fire-and-forget. Send curl, check exit code, move on.
- Interactive timeout = auto-proceed. Don't hang forever waiting for a reply.
- Respect
: In interactive mode, if the user doesn't reply within timeout, use the same auto-proceed logic as the calling skill.AUTO_PROCEED - No secrets in notifications. Never include API keys, tokens, or passwords in Feishu messages.