Install
openclaw skills install @thcjp/linear-workflow-bot把 Linear 任务自动接入"通知-执行-回写-Git 同步"流水线。面向独立开发者与一人公司, 解决免费自动化平台额度紧张、Webhook 触发不可靠、多服务配置散乱、Git 同步冲突四大痛点。 核心能力: - 三层自动化平台选型:Make.com(免费首选)/ Pipedream(即时触发)/ Zapier(付费兜底) - Webhook 健康检查与自愈:心跳探活、失败重投、死信队列 - 任务处理闭环:确认 → DM 通知 → 状态流转 → 执行 → 回写评论 → Git 同步 - 配置中心化:单一 JSON 管理团队/状态/Discord/Git 四类配置 - 免费额度监控:每月 ops 消耗看板,临近上限自动降级到低频模式 适用场景: - 个人开发者把 Linear 作为任务中枢,自动分发到 Discord/Git - 小团队需要任务到达即通知、即执行、即归档 - 研究/内容/代码任务的自动化产出与版本化归档 - 预算敏感场景下榨干免费额度 差异化: - 平台选型决策表 + 免费额度看板,原版只罗列限制 - Webhook 自愈流程(心跳/重投/死信),原版仅给排错条目 - 配置中心化 schema,原版散落多个文件 - 任务处理闭环含失败补偿,原版是单向流程无回滚 触发关键词: linear, webhook, discord, make, pipedream, zapier, 自动化, 任务流水线, git sync
openclaw skills install @thcjp/linear-workflow-bot自动化流水线:Linear → Webhook 平台 → 通知通道 → 任务执行 → Git 同步
在 Linear 创建的任务自动触发处理,实时通知、执行、回写结果并同步到 Git 仓库。
| 平台 | 免费额度 | 触发延迟 | Webhook 支持 | 推荐场景 |
|---|---|---|---|---|
| Make.com | 1000 ops/月 | 15 min(免费) | 是 | 免费首选,额度最宽裕 |
| Pipedream | ~100 credits | 即时 | 是 | 需要实时性,能接受额度快速消耗 |
| Zapier | 100 tasks/月 | 15 min 轮询 | 否(需付费) | 已有付费账号的团队 |
| 自建 | 无限 | 即时 | 是 | 有服务器、不想被额度卡脖子 |
选型规则:
5 步完成首次接入:
~/.linearbot/linear.env 写入 LINEAR_API_KEY./scripts/linear-api.sh teams 与 states~/.linearbot/config.json(schema 见下文)./scripts/linearbot doctor 验证全链路替代原版散落多文件,单一 JSON 管理:
{
"$schema": "linearbot/v1",
"linear": {
"teamId": "team-uuid",
"states": {
"todo": "state-uuid",
"inProgress": "state-uuid",
"done": "state-uuid",
"canceled": "state-uuid"
},
"watchFilter": "state.name = \"Todo\" AND assignee.id = \"<your-id>\""
},
"notify": {
"channel": "discord",
"discord": {
"botToken": "${DISCORD_BOT_TOKEN}",
"notifyUserId": "discord-user-id",
"taskChannelId": "channel-id",
"allowBots": true
}
},
"git": {
"repo": "/path/to/repo",
"autoPush": true,
"commitPrefix": "task:",
"branch": "main",
"conflictStrategy": "rebase"
},
"quota": {
"platform": "make",
"monthlyLimit": 1000,
"warningThreshold": 0.8,
"degradeStrategy": "batch-daily"
}
}
变量引用 ${VAR} 从环境变量读取,避免明文 secrets 入库。
state.name = "Todo"(与配置中心 watchFilter 对齐)<@BOT_ID>
New task: {{steps.trigger.event.data.title}}
Status: {{steps.trigger.event.data.state.name}}
ID: {{steps.trigger.event.data.identifier}}
URL: {{steps.trigger.event.data.url}}
# receiver.py - 单文件 Flask 接收器
from flask import Flask, request
import subprocess
app = Flask(__name__)
@app.route("/linear", methods=["POST"])
def linear():
event = request.json
if event.get("action") == "create":
subprocess.Popen(["./scripts/handle-task.sh", event["data"]["identifier"]])
return "", 200
部署到任意 VPS,配合 systemd 守护。
任务到达通道后的处理流程,每步都有失败补偿:
| 步骤 | 动作 | 失败补偿 |
|---|---|---|
| 1. 确认 | 在通道回复收到 | 失败重试 3 次,仍失败则写入死信 |
| 2. DM 通知 | 给配置的用户发私信 | 用户 ID 错则回退到通道 @mention |
| 3. 状态流转 | linear-api.sh start <id> | Linear API 失败则走鉴权自愈 |
| 4. 执行任务 | 调子 Agent 或本地脚本 | 超时 30 min 则标记 "Stalled" |
| 5. 回写评论 | linear-api.sh comment <id> "<summary>" | 评论过长则改用文件附件 |
| 6. 完成流转 | linear-api.sh done <id> | 失败则保持 In Progress 并告警 |
| 7. Git 同步 | git add/commit/push | 冲突按 conflictStrategy 处理 |
Todo ──(收到)──> In Progress ──(成功)──> Done
│
├──(超时)──> Stalled ──(用户介入)──> In Progress / Canceled
│
└──(失败)──> In Progress + 评论告警
每小时心跳:
├─ 调 Make/Pipedream API 查 scenario 最近运行
├─ 30 min 无运行 → 发测试 webhook 探活
├─ 探活失败:
│ ├─ 重投最近 5 条历史任务(去重)
│ ├─ 通知用户 webhook 异常
│ └─ 切换到备用平台(若配置了 fallback)
└─ 死信队列:3 次失败的任务进 DLQ,等用户手动处理
# 每日检查 Make.com 用量
./scripts/linearbot quota-check
# 输出:本月已用 823/1000 ops (82%),临近阈值,启用降级
降级策略(degradeStrategy):
batch-daily:把即时触发改为每日 22:00 批量处理drop-low-priority:丢弃低优先级标签的任务switch-platform:自动切到备用平台scripts/linear-api.sh 命令:
| 命令 | 说明 |
|---|---|
teams | 列团队与 ID |
states | 列工作流状态 |
get <id> | 取任务详情 |
pending | 列待办任务 |
start <id> | 标记 In Progress |
done <id> | 标记 Done |
cancel <id> | 标记 Canceled |
comment <id> "text" | 加评论 |
comment-file <id> path.md | 用文件加评论(长文本) |
scripts/linearbot 命令:
| 命令 | 说明 |
|---|---|
doctor | 全链路健康检查 |
quota-check | 查额度用量 |
replay <id> | 重放指定任务 |
dlq list | 列死信队列 |
dlq ack <id> | 确认死信已处理 |
| 任务类型 | 执行方式 | 归档位置 |
|---|---|---|
| 研究 | 子 Agent 调研 | research/<topic>.md |
| 内容创作 | 生成草稿 | content/<slug>.md |
| 代码任务 | 写/改代码 + commit | 仓库对应目录 |
| 数据处理 | 跑脚本 | output/<task-id>/ |
| 自定义 | 按 outputPattern 配置 | 配置指定 |
Linear 任务 ENG-456 "调研 wasm 在边缘计算的应用"
1. 收到 → Discord 通知 + DM
2. start ENG-456
3. 子 Agent 调研,生成 research/wasm-edge-computing.md
4. comment ENG-456 "已完成,见 research/wasm-edge-computing.md"
5. done ENG-456
6. git add research/ && commit -m "task: ENG-456 wasm调研" && push
Linear 任务 ENG-457 "写 5 篇产品文案"
1. 收到 → 通知
2. start
3. 子 Agent 按 5 个主题各生成一篇,存 content/
4. comment-file ENG-457 /tmp/summary.md(含 5 篇链接)
5. done + git push
doctor 发现 Make scenario 30 min 无运行
1. 发测试 webhook → 失败
2. 重投最近 5 条任务到备用 Pipedream workflow
3. Discord 告警 "Make 异常,已切 Pipedream"
4. 用户收到通知后修复 Make,linearbot resume 回切
Q1: 免费 1000 ops 会超吗? A: 单人日均任务 < 30 条基本够。每条任务平均消耗 2-3 ops(触发 + 通知)。超过 80% 阈值自动降级到 batch-daily。
Q2: Git push 冲突怎么办?
A: 按 conflictStrategy:rebase(默认,自动 rebase 后重试 3 次)、merge(生成 merge commit)、abort(放弃同步并告警)。
Q3: 子 Agent 执行超时?
A: 默认 30 min 超时标记 Stalled。可在 config 中调 executionTimeout。Stalled 任务不自动取消,等用户介入。
Q4: 多个 Linear 团队怎么配?
A: 配置中心支持 teams 数组,每个团队独立 watchFilter 与通知通道。Git 同步可按团队分仓库或分目录。
Q5: 凭证安全?
A: 所有 secrets 用 ${VAR} 引用环境变量,不写入 config.json。~/.linearbot/ 目录权限设为 600。
| 现象 | 排查路径 |
|---|---|
| 任务不触发 | linearbot doctor → 查 webhook 平台 scenario 状态 → 查 watchFilter |
| Linear API 报 401 | 检查 ~/.linearbot/linear.env → 重新生成 API Key |
| Discord 不通知 | 验证 botToken → 检查 bot 在频道权限 → allowBots: true |
| Git push 失败 | 检查 SSH key/credential → 查 remote → 按 conflictStrategy 处理 |
| 额度耗尽 | quota-check → 启用降级 → 或切自建接收器 |
| 死信堆积 | linearbot dlq list → 逐个 replay 或 ack |
| 依赖项 | 类型 | 是否必需 | 获取方式 |
|---|---|---|---|
| Linear 账号 | SaaS | 必需 | linear.app 注册 |
| Make.com / Pipedream / Zapier | 自动化平台 | 三选一(或自建) | 对应官网注册 |
| Discord 账号 + Bot | 通知通道 | 推荐(可替换为 Slack/Telegram) | Discord Developer Portal |
| Git 仓库 | 版本控制 | 可选(启用 Git 同步时必需) | 本地或 GitHub/GitLab |
jq | JSON 处理 | 推荐 | 系统包管理器 |
| LLM API | API | 必需 | 由 Agent 内置 LLM 提供 |
LINEAR_API_KEY:Linear → Settings → API → Personal API keysDISCORD_BOT_TOKEN:Discord Developer Portal → Bot → Token~/.linearbot/*.env(权限 600),勿入库