skills/42-wanshuiyin-ARIS/skills/skills-codex/feishu-notify/SKILL.md
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 \"发飞书\", \"notify feishu\", or other skills need to send status updates.
npx skillsauth add brycewang-stanford/Awesome-Agent-Skills-for-Empirical-Research feishu-notifyInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Send a notification: $ARGUMENTS
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.
The skill reads ~/.codex/feishu.json. If this file does not exist, all Feishu functionality is disabled — skills behave exactly as before.
{
"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
}
}
| Mode | "mode" value | What it does | Requires |
|------|----------------|--------------|----------|
| Off | "off" or file absent | Nothing. Pure CLI as-is | Nothing |
| Push only | "push" | Send webhook notifications at key events. Mobile push, no reply | Feishu bot webhook URL |
| Interactive | "interactive" | Full bidirectional. Approve/reject from Feishu, reply to checkpoints | feishu-claude-code running |
cat ~/.codex/feishu.json 2>/dev/null
"mode": "off" → return silently, do nothing"mode": "push" → proceed to Step 2 (push)"mode": "interactive" → proceed to Step 3 (interactive)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_done | Experiment Complete | green | Results table, delta vs baseline |
| review_scored | Review Round N: X/10 | blue (≥6) / orange (<6) | Score, verdict, top 3 weaknesses |
| checkpoint | Checkpoint: Waiting for Input | yellow | Question, options, context |
| error | Error: [type] | red | Error message, what failed |
| pipeline_done | Pipeline Complete | purple | Final summary, deliverables |
| custom | Custom | blue | Free-form message from $ARGUMENTS |
Return immediately after curl — push mode never waits for a response.
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: {"reply": "approve"} or {"reply": "reject"} or {"reply": "user typed message"} or {"timeout": true}
On timeout: Fall back to AUTO_PROCEED behavior (proceed with default option).
Return the user's reply to the calling skill so it can act on it.
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.
Skills send these events at these moments:
| Skill | Event | When |
|-------|-------|------|
| /auto-review-loop | review_scored | After each round's review score |
| /auto-review-loop | pipeline_done | Loop complete (positive or max rounds) |
| /auto-paper-improvement-loop | review_scored | After each round's review score |
| /auto-paper-improvement-loop | pipeline_done | All rounds complete |
| /run-experiment | experiment_done | Screen session finishes |
| /idea-discovery | checkpoint | Between phases (if interactive) |
| /idea-discovery | pipeline_done | Final report ready |
| /monitor-experiment | experiment_done | Results collected |
| /research-pipeline | checkpoint | Between workflow stages |
| /research-pipeline | pipeline_done | Full pipeline complete |
AUTO_PROCEED: In interactive mode, if the user doesn't reply within timeout, use the same auto-proceed logic as the calling skill.tools
Show mcp-stata identity, connected tools, and status. Use when the user asks if mcp-stata is available, asks about access to the toolkit, or asks what Stata tools are connected.
tools
Activate when users mention Stata commands, .do files, regressions, econometrics, stored results, graphs, dataset inspection, replication, or Stata errors. Route the task through mcp-stata tools and the specialized research skills instead of treating it as plain text coding.
development
Build and review paper-ready regression, balance, and summary tables from Stata outputs. Use when the user needs a clean table for a draft, appendix, or coauthor share-out.
tools
Install, configure, update, or verify mcp-stata across Claude Code, Codex, Gemini CLI, Cursor, Windsurf, and VS Code. Activate when users ask to set up the Stata toolkit or troubleshoot the installation.