工作流自动化引擎 CLI(Phase 96)
chainlesschain automation(别名auto)— SaaS 连接器 + 触发器 + DAG 工作流编排。12 个 SaaS 连接器 + 5 种触发器类型 + DAG 拓扑排序 + 条件分支执行。
版本边界(2026-08-14):
0.163.8是 npmlatest与生产推荐版。automation run-scheduled、execution preflight/budget、scope-checked channel event、双 IDE Automation Center、scheduler outcome-unknown 裁决、五域迁移/回滚,以及 exact-fence runtime pause/resume 与 incident retry/cancel 均已进入公开安装契约。
概述
Automation Engine 是面向非开发者的工作流自动化平台(区别于 workflow 的开发流水线)。 内置 12 个 SaaS 连接器(Gmail/Slack/GitHub/Jira/Notion/Trello/Discord/Teams/ Airtable/Figma/Linear/Confluence),支持 webhook/schedule/email/form/manual 五种触发方式。
核心特性
- 12 个 SaaS 连接器 — Gmail / Slack / GitHub / Jira / Notion / Trello / Discord / Teams / Airtable / Figma / Linear / Confluence
- 5 种触发器 — webhook(HTTP 回调)、schedule(cron)、email(邮件入站)、form(表单提交)、manual(手动)
- DAG 拓扑排序执行 — 支持条件分支、并行节点、步骤级超时
- 生命周期管理 —
draft → active → paused → archived;activate/pause/archive/delete状态机 - 模板共享 — 导出/导入自定义模板,
share --public公开 - 执行日志 — 每次执行记录步骤级详情、输入输出、错误堆栈
- 持久定时执行 —
automation run-scheduled将 active+scheduled flow 绑定为 immutable snapshot,使用 logical occurrence 去重、owner/fence lease 与确定性 execution id;只恢复可验证成功证据,不自动重放 outcome-unknown 副作用 - 执行前置检查与预算 — creator identity、
automation:execute、连接器 RBAC、live revocation、flow run/action budget 与共享 scheduler policy revision 分层复验 - Automation Center — CLI 生成 versioned projection 和 exact argv;VS Code
0.37.50/ JetBrains0.4.86通过 revision CAS 管理 flow 与 cron/once/webhook/GitHub Routine - V2 治理层 —
-v2后缀:4 态 automation maturity + 5 态 execution lifecycle,cap + auto-pause-idle + auto-fail-stuck
系统架构
┌──────────────────────────────────────────────────────┐
│ chainlesschain automation │
├──────────────────────────────────────────────────────┤
│ Triggers │ Orchestrator │
│ webhook / schedule / │ DAG topo-sort + │
│ email / form / manual │ conditional exec │
├──────────────────────────────────────────────────────┤
│ Connectors (12) │
│ Gmail │ Slack │ GitHub │ Jira │ Notion │ Trello ... │
├──────────────────────────────────────────────────────┤
│ Execution Log │ Templates │
│ step-level, JSON │ public share + import │
├──────────────────────────────────────────────────────┤
│ SQLite (automation_flows / triggers / executions) │
├──────────────────────────────────────────────────────┤
│ Scheduler Kernel (kernel-v1.sqlite) │
│ snapshot/CAS · occurrence dedup · lease · recovery │
└──────────────────────────────────────────────────────┘数据流:create flow → add-trigger → activate → 触发器触发 → DAG 执行 → 写 executions → logs。
配置参考
| 配置项 | 含义 | 默认 |
|---|---|---|
maxConcurrentExecutions | 并发执行数 | 10 |
executionTimeoutMs | 单次执行超时 | 300000 ms |
logRetentionDays | 日志保留天数 | 30 |
maxStepsPerFlow | 单工作流最大步骤 | 100 |
V2 perOwnerActiveAutomationCap | 每 owner 活跃工作流 | ~20 |
V2 perAutomationRunningExecCap | 每工作流运行中执行 | ~10 |
V2 autoPauseIdleAfterMs | 闲置自动暂停阈值 | 86400000 ms |
查看:chainlesschain auto config、auto trigger-types、auto statuses。
性能指标
| 指标 | 典型值 |
|---|---|
| 创建工作流 | < 20 ms |
| 添加触发器 | < 15 ms |
| DAG 拓扑排序(20 节点) | < 10 ms |
| 手动 execute(含连接器调用) | 依赖外部服务 |
| V2 createExecV2 dispatch | < 50 ms |
| V2 cap (default) | per-owner 20 active / per-auto 10 running |
测试覆盖率
核心覆盖位于 automation-engine.test.js,发布后恢复增量另由 automation-center-runtime.test.js、automation-center-incidents.test.js、 automation-execution-incident.test.js、scheduler-runtime-control-capabilities.test.js 与 scheduler-reliability-soak.test.js 覆盖。
覆盖范围包括 flow CRUD、trigger 创建/enable/disable/fire、串行/并行/条件执行、 模板 import/export、activate/pause/archive 状态机、V2 cap/idle/stuck、 checkpoint pause/resume、stale fence/revision/capability 拒绝、incident 幂等 requeue、 manual incident retry 拒绝和敏感证据不越过 IDE 投影边界。
安全考虑
- 连接器凭证隔离 — 每个连接器凭证单独加密存储,按 flow 授权访问
- Webhook 签名 — 入站 webhook 建议配置 HMAC 签名验证 payload 完整性
- cron 频率限制 — schedule 触发器后端强制最小间隔,防止滥用
- 步骤失败重试 — 指数退避重试,避免外部服务过载
- 审计日志 — 所有 activate/pause/archive/delete 操作写入审计链
- 失败闭合的无人值守权限 — 缺少 creator、
automation:execute、连接器权限、预算或共享 scheduler policy 时拒绝运行;重试复用原 reservation - 作用域事件去重 —
dispatch-channel-event要求稳定 source event id,仅接受 webhook/Telegram origin,并在 durable scope check 后触发匹配 flow
故障排查
Q: 触发器 fire 了但执行未启动?
- 确认 flow 已
activate(draft/paused状态不会执行) - 检查
auto show <flow-id>的 DAG 是否有孤立节点 - 查看
auto logs <flow-id>获取具体错误
Q: 定时任务未按计划触发?
- 验证 cron 表达式语法(
auto schedule <id> --cron传入后会解析) - 确认已安装
chainlesschain@0.163.8,再运行chainlesschain auto run-scheduled --json - 确认 flow 状态为
active;draft/paused/archived不会被 scheduler 入队 - V2 下检查是否被
auto-pause-idle自动暂停
Q: 连接器调用失败?
- 先运行连接器自带的 health check(通过
execute单步测试) - 检查凭证是否过期(OAuth token refresh)
- 查看
logs --limit 10 --json的响应状态码
关键文件
packages/cli/src/commands/automation.js— Commander 子命令(~924 行)packages/cli/src/lib/automation-engine.js— DAG 引擎与连接器packages/cli/src/lib/scheduler-kernel/automation-adapter.js— scheduled flow snapshot、occurrence 与恢复策略packages/cli/src/lib/automation-execution-authority.js— creator / connector RBAC / flow budget 前置检查与结算packages/cli/src/lib/automation-center.js、automation-center-routines.js— versioned projection、revision-CAS flow/Routine 控制面packages/cli/src/lib/automation-center-runtime.js、automation-center-incidents.js— 发布后源码的 fenced runtime 控制、incident retry/cancel 与脱敏投影packages/cli/src/lib/automation-execution-incident.js— revisioned incident 持久化与终态结算packages/cli/src/lib/scheduler-kernel/runtime-control-capabilities.js— production adapter 的checkpoint_v1safe-point 声明packages/cli/src/lib/scheduler-kernel/automation-event-adapter.js— channel event scope、去重与执行packages/cli/src/lib/scheduler-kernel/runtime.js— 共享 claim/lease/heartbeat/settlement runtimepackages/cli/__tests__/unit/automation-engine.test.js— 单测(114 tests)- 数据表:
automation_flows/automation_triggers/automation_executions - 设计文档:
docs/design/modules/61_工作流自动化引擎.md
使用示例
# 1. 从模板创建 + 激活
tpl=$(chainlesschain auto templates --json | jq -r '.[0].id')
fid=$(chainlesschain auto import-template $tpl | grep flow-id)
chainlesschain auto activate $fid
# 2. 添加 webhook 触发器
chainlesschain auto add-trigger $fid --type webhook --config '{"path":"/hooks/foo"}'
# 3. 定时触发(工作日 9:00)
chainlesschain auto schedule $fid --cron "0 9 * * 1-5"
# npm 0.163.8:统一 Scheduler + migration/adjudication/recovery
chainlesschain auto run-scheduled
chainlesschain auto run-scheduled --json
chainlesschain auto run-scheduled --lease-ms 60000
# 4. 手动测试
chainlesschain auto execute $fid --input '{"subject":"test"}'
chainlesschain auto logs $fid --limit 5
# 5. 全局统计
chainlesschain auto stats --json连接器与触发器目录
chainlesschain auto connectors # 列出 12 个 SaaS 连接器
chainlesschain auto trigger-types # 列出触发器类型
chainlesschain auto statuses # 列出工作流状态
chainlesschain auto config # 查看配置常量工作流 CRUD
# 创建工作流
chainlesschain auto create --name "新 Issue 通知" --description "GitHub issue → Slack"
# 列出工作流
chainlesschain auto flows
chainlesschain auto flows --json
# 查看详情
chainlesschain auto show <flow-id>
# 生命周期管理
chainlesschain auto activate <flow-id> # 激活
chainlesschain auto pause <flow-id> # 暂停
chainlesschain auto archive <flow-id> # 归档
chainlesschain auto delete <flow-id> # 删除
# 定时调度
chainlesschain auto schedule <flow-id> --cron "0 9 * * 1-5"
# 运行所有当前到期的 active cron flow
chainlesschain auto run-scheduled [--json] [--lease-ms 60000]
# 分享与模板
chainlesschain auto share <flow-id> --public
chainlesschain auto templates # 列出模板
chainlesschain auto import-template <template-id> # 导入模板执行权限、预算与 channel event
无人值守执行前先为 flow 设置固定窗口预算,再查看 live RBAC 与剩余额度:
chainlesschain auto set-execution-budget <flow-id> \
--window-ms 3600000 --max-runs 20 --max-action-steps 200
chainlesschain auto execution-preflight <flow-id> --json
# Webhook / Telegram 接入层传入稳定事件 ID;相同 ID 会被持久去重
chainlesschain auto dispatch-channel-event \
--event-id webhook-20260812-001 --origin webhook \
--sender build-service --text "production build failed" \
--meta '{"repository":"acme/app"}' --jsonexecution-preflight 同时展示 principal、每个连接器权限以及剩余 run/action-step 配额。它通过不代表未来永久可用;实际执行仍会再次读取 live revocation、flow budget 与共享 scheduler policy revision。
Automation Center 与 IDE
IDE 只消费 center-projection,不直接编辑 Automation/Routine 的 SQLite 或 JSON 文件。每个 mutation 都必须携带投影展示的 exact revision;投影过期时失败闭合并要求刷新。
# IDE/集成方读取版本化投影
chainlesschain auto center-projection --limit 100 --json
# Flow 动作:run_now | retry_failed | pause | resume | disable | delete
chainlesschain auto center-action <flow-id> pause \
--expected-revision <revision> --json
# Routine 动作:run_now | retry_failed | pause | resume | disable | delete
chainlesschain auto center-routine-action <routine-id> run_now \
--expected-revision <revision> --json
# PowerShell:定义由有界 JSON stdin 输入,禁止 shell 拼接
Get-Content routine.json | chainlesschain auto center-routine-create --expected-revision <catalog-revision> --json-stdin --json
Get-Content routine.json | chainlesschain auto center-routine-edit <routine-id> --expected-revision <item-revision> --json-stdin --jsonVS Code 在 Activity Bar 打开 ChainlessChain Automation;JetBrains 在 View → Tool Windows → ChainlessChain Automation 打开。两端都显示 scope、preflight、运行历史与可用动作,最终权威仍由 CLI 持有。
0.163.8:运行中暂停/恢复与 incident 操作
0.163.8 的 center-projection 会投影可控 scheduler occurrence、 exact fence、control revision、checkpoint_v1 capability/safe point,以及脱敏 incident。 集成方必须执行投影生成的 exact argv;旧投影会因 fence/revision/capability 变化而失败闭合。
# 合作式 pause/resume;pause 只在声明的 checkpoint safe point 生效,不是强杀
chainlesschain auto center-runtime-action <occurrence-id> pause \
--expected-fence <fence> \
--expected-control-revision <control-revision> --json
chainlesschain auto center-runtime-action <occurrence-id> resume \
--expected-fence <fence> \
--expected-control-revision <control-revision> --json
# 只对 scheduler-backed schedule/event dead letter 开放 retry
chainlesschain auto center-incident-action <incident-id> retry \
--expected-revision <incident-revision> --json
chainlesschain auto center-incident-action <incident-id> cancel \
--expected-revision <incident-revision> --jsonretry 会重新匹配 incident 与 occurrence 的 flow/job/run/trigger/fence/error code, 重复点击使用确定性 request id 去重;原 incident 在重试产生权威 success evidence 前保持 open。 manual incident 因无法证明外部效果未发生而禁止 retry,只能 cancel。IDE 不接收持久化的 authority、boundary 或 detail evidence,也不直接修改 Automation/Scheduler 存储。
这些命令已经通过 0.163.8 的 exact-SHA 三平台门禁、发布与公网回读;操作时仍必须使用刚获取的投影,旧 fence/revision 不得复用。
0.163.7:outcome-unknown 人工裁决
当外部连接器可能已产生副作用、但本地终态无法证明时,scheduler 会写入 *_OUTCOME_UNKNOWN 死信并拒绝自动重放。稳定版提供统一操作入口:
cc daemon scheduler adjudication list
cc daemon scheduler adjudication show <occurrence-id>
cc daemon scheduler adjudication decide <occurrence-id> \
--decision confirmed_applied \
--expected-evidence-digest sha256:<digest> \
--expected-attempt <attempt> \
--expected-fence <fence>运行 decide 前必须停止每一个 scheduler host、排空已分发任务,并在目标 SaaS/外部系统核验真实结果。命令只接受交互式 TTY 和逐字 typed challenge;理由与操作员身份只保存摘要。选择 confirmed_applied 会从证据结算且绝不重放,选择 confirmed_not_applied 只授权一次有界执行。任何旧 digest、attempt/fence 变化、重复裁决或非 outcome-unknown 状态都会失败闭合。决策写入后再重启一个 scheduler host 应用。
这不是全局 exactly-once,也不是机器范围锁。chainlesschain@0.163.8 继续包含这些子命令,但生产操作仍必须保持死信、完成外部核验并使用 exact evidence;不要绕过存储直接改状态。
触发器管理
chainlesschain auto add-trigger <flow-id> --type webhook --config '{"url":"..."}'
chainlesschain auto triggers <flow-id>
chainlesschain auto enable-trigger <trigger-id>
chainlesschain auto disable-trigger <trigger-id>
chainlesschain auto fire-trigger <trigger-id> --payload '{"key":"value"}'执行与日志
run-scheduled 使用 occurrence 派生的确定性 execution id。若同一 occurrence 已有成功 execution evidence,只补齐 scheduler settlement;若只有 running、非成功终态或副作用后持久化结果未知,则失败闭合,不自动重跑连接器。该约束不等于外部 SaaS 的全局 exactly-once。
# 手动执行工作流
chainlesschain auto execute <flow-id> --input '{"data":"test"}'
# 查看执行详情
chainlesschain auto exec-show <execution-id>
# 执行日志
chainlesschain auto logs <flow-id>
chainlesschain auto logs <flow-id> --limit 50 --json统计
chainlesschain auto stats # 自动化引擎统计
chainlesschain auto stats --json相关文档
- 设计文档:
docs/design/modules/61_工作流自动化引擎.md - CLI 总索引:
docs/CLI_COMMANDS_REFERENCE.md - Workflow Engine V2 →
- Pipeline Orchestrator →
- Hook Manager →
