skills-experimental/heartbeat-task-visualizer/SKILL.md
Visualize background tasks during heartbeat checks. Send Feishu cards to show task status, progress, and results. Use when visualizing heartbeat tasks, showing active work, or monitoring health.
npx skillsauth add bianhaifeng789-hue/openclaw-config heartbeat-task-visualizerInstall 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.
心跳时检查后台任务状态,发送飞书卡片更新。
问题:
解决:
每 ~30 分钟 heartbeat 检查:
→ 检查 memory/heartbeat-state.json lastTaskUpdate
→ 如果有活动任务,发送飞书卡片
调用 getRunningTasks() → 返回运行中任务列表
→ 生成卡片(createTasksSummaryCard)
→ 通过 message 工具发送
策略:避免频繁更新
→ 同一任务:至少间隔 3 秒更新一次
→ 多任务:汇总显示,不单独发送
→ 完成时:发送完成卡片
| Claude Code | OpenClaw 飞书 | |-------------|--------------| | DreamTask | 记忆整合 | | LocalAgentTask | 子代理任务 | | LocalShellTask | Shell 任务 | | RemoteAgentTask | 远程代理 | | MonitorMcpTask | MCP 监控 |
{
"config": {"wide_screen_mode": true},
"header": {
"title": {"tag": "plain_text", "content": "⚙️ 后台任务 (2 运行中)"},
"template": "blue"
},
"elements": [
{
"tag": "div",
"text": {
"tag": "lark_md",
"content": "🔄 记忆维护 `[███░░░░░░░]` 30%\n🔄 洞察分析 `[█░░░░░░░░░]` 10%"
}
},
{
"tag": "note",
"elements": [
{"tag": "plain_text", "content": "总计: 5 | 完成: 3 | 失败: 0"}
]
}
]
}
{
"config": {"wide_screen_mode": true},
"header": {
"title": {"tag": "plain_text", "content": "✅ 任务完成"},
"template": "green"
},
"elements": [
{
"tag": "div",
"text": {
"tag": "lark_md",
"content": "**✅ 记忆维护 完成**\n\n耗时: 2分钟\n结果:\n- 更新 Current Focus\n- 更新 Learnings"
}
},
{
"tag": "action",
"actions": [
{
"tag": "button",
"text": {"tag": "plain_text", "content": "查看 MEMORY.md"},
"type": "primary",
"value": {"action": "view_memory"}
}
]
}
]
}
// memory/heartbeat-state.json 新增字段
{
"taskTracker": {
"activeTasks": [
{
"id": "bg-1-1234567890",
"name": "memory_maintenance",
"progress": 30,
"status": "running",
"startedAt": 1234567890
}
],
"cardMessageId": "om_xxx", // 当前卡片消息 ID
"lastUpdate": 1234567891,
"taskResults": {
"bg-1-1234567890": "正在更新 MEMORY.md..."
}
}
}
impl/utils/background-task-service.ts - 任务管理impl/utils/background-task-card.ts - 卡片生成impl/utils/task-tracker.ts - 整合器// heartbeat 执行时
const runningTasks = getRunningTasks()
if (runningTasks.length > 0) {
const card = createTasksSummaryCard(runningTasks)
// 使用 message 工具发送
await message({
action: 'send',
card: card
})
}
// 任务完成时
completeTask('bg-1-xxx', '更新了 MEMORY.md')
// 自动发送完成卡片
const task = getTask('bg-1-xxx')
const card = createTaskCard(task, '更新了 MEMORY.md')
await message({
action: 'send',
card: card
})
| Claude Code | OpenClaw 飞书 | |-------------|--------------| | AppState.tasks | memory/heartbeat-state.json | | Footer pill | 飞书卡片消息 | | Shift+Down dialog | 卡片交互按钮 | | updateTaskState() | taskTracker.updateProgress() | | registerTask() | taskTracker.registerTask() |
此 Skill 在 heartbeat 检查时自动执行,无需手动触发。
taskVisualizer:
enabled: true
showProgress: true # 显示进度
showResult: true # 显示结果
notifyOnFailure: true # 失败通知
updateIntervalMs: 3000 # 更新间隔
compactMode: false # 简洁模式
business
IAA 日报飞书输出能力。 支持把固定 CSV 模板一键转换成: - 中文运营结论 - 飞书卡片 JSON - 飞书发送载荷 Use when: - 需要把 IAA 日报直接发到飞书 - 需要从 CSV 一键生成运营日报
data-ai
IAA日报分析模型 功能: - 渠道日报自动分析 - 小时级+日级ROI联动判断 - 按地区输出加量/降量/停投建议 - 按产品类型输出阈值 - 自动识别利润区/观察区/止损区 Use when: - 分析每天投放数据 - 生成运营日报结论 - 判断是否加量/降量/停投 - 对比美加澳/日韩表现 Keywords: - 日报模型, 投放日报, 加量, 降量, 停投, ROI日报, 分地区分析
data-ai
IAA固定日报分析模板 功能: - 固定字段模板(可直接贴每天数据) - 自动输出总盘结论 - 自动输出美加澳/日韩结论 - 自动给出加量/降量/停投建议 - 适配文件修复/清理两类产品 Use when: - 需要固定日报格式 - 每天复盘渠道表现 - 给运营团队出统一结论 Keywords: - 固定模板, 日报模板, ROI模板, IAA日报, 运营模板
development
# HyperlinkPool Pattern Skill HyperlinkPool Pattern - HyperlinkPool class + strings array + stringMap + Index 0 no hyperlink + intern(hyperlink) + get(id) + undefined handling + 5-minute reset + OSC8 hyperlink interning。 ## 功能概述 从Claude Code的ink/screen.ts提取的HyperlinkPool模式,用于OpenClaw的OSC8超链接池管理。 ## 核心机制 ### HyperlinkPool Class ```typescript export class HyperlinkPool { private strings: string[] = [''] // Index 0 = no hyperlink private stringMap = new Map<string, number>() // strings