From oh-my-feishu
Sends interactive Feishu (Lark) card messages for auto-repair results, including service name, traceback preview, diff preview, and GitHub PR link. Uses Feishu API via curl; requires app ID/secret env vars.
npx claudepluginhub yjzhang2003/oh-my-feishu --plugin oh-my-feishuThis skill is limited to using the following tools:
- `receive_id`: Feishu user or chat open_id (fallback: `NOTIFY_CHAT_ID` env var)
Automatically detects bugs from service errors or tracebacks, analyzes root cause, fixes code with pytest validation, submits GitHub PRs, and sends Feishu notifications. Supports multi-service multi-repo.
Guides Feishu bot development in zero-code (automation workflows), full-code (open platform APIs), and AI MCP Server modes. Covers SDKs, message card builder, opdev CLI, triggers, and best practices.
Configures Bark push, WeChat, and system notifications for Claude Code via .claude/claude-notification.local.md. Provides bash scripts for proactive task alerts.
Share bugs, ideas, or general feedback.
receive_id: Feishu user or chat open_id (fallback: NOTIFY_CHAT_ID env var)pr_url: GitHub pull request URLsummary: Brief description of the bug and fixservice_name: (optional) Name of the service that had the bugtraceback_preview: (optional) Short traceback preview (truncated to 300 chars)diff_preview: (optional) Short diff preview (truncated to 500 chars)Read env vars
FEISHU_APP_IDFEISHU_APP_SECRETNOTIFY_CHAT_ID (used as fallback if receive_id not provided)Get tenant_access_token
curl -X POST https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal \
-H "Content-Type: application/json" \
-d '{"app_id":"'$FEISHU_APP_ID'","app_secret":"'$FEISHU_APP_SECRET'"}'
Build interactive card
If service_name is provided, use the service-aware card:
{
"config": {"wide_screen_mode": true},
"header": {
"title": {"tag": "plain_text", "content": "🛠️ {service_name} Bug 自动修复完成"},
"template": "red"
},
"elements": [
{
"tag": "div",
"text": {"tag": "lark_md", "content": "**Service:** {service_name}\n**Summary:**\n{summary}"}
},
{
"tag": "div",
"text": {"tag": "lark_md", "content": "**Traceback:**\n```{traceback_preview_truncated}```"}
},
{
"tag": "action",
"actions": [
{
"tag": "button",
"text": {"tag": "plain_text", "content": "查看 PR / Review"},
"url": "{pr_url}",
"type": "primary"
}
]
}
]
}
The traceback section should be omitted if traceback_preview is empty.
The diff_preview can be added as an additional section if provided.
If service_name is not provided, use the legacy card format:
{
"config": {"wide_screen_mode": true},
"header": {
"title": {"tag": "plain_text", "content": "🛠️ Bug 自动修复完成"},
"template": "red"
},
"elements": [
{
"tag": "div",
"text": {"tag": "lark_md", "content": "**Bug Summary**\n{summary}"}
},
{
"tag": "action",
"actions": [
{
"tag": "button",
"text": {"tag": "plain_text", "content": "查看 PR"},
"url": "{pr_url}",
"type": "primary"
}
]
}
]
}
Send message
curl -X POST "https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=chat_id" \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"receive_id": "{receive_id}",
"msg_type": "interactive",
"content": "{escaped_card_json}"
}'
Use receive_id_type=chat_id when receive_id starts with oc_.
Use receive_id_type=open_id when receive_id starts with ou_.
.claude/triggers/notify_error.log