ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Beads bd gate 指南:用异步门控(Gate)编排编码 Agent 工作流

Beads bd gate 指南:用异步门控(Gate)编排编码 Agent 工作流 Beads bd gate 指南用异步门控Gate编排编码 Agent 工作流【免费下载链接】beadsBeads - A memory upgrade for your coding agent项目地址: https://gitcode.com/GitHub_Trending/beads1/beads导读bd gate是 Beads 中用于异步协调工作流的核心命令族它以门控Gate这一特殊 issue 类型表达等待条件阻塞下游步骤直到外部条件人工审批、定时器、GitHub Actions 运行、PR 合并、跨 rig 的 bead 关闭被满足。本文将围绕 docs/cli-reference/gate.md 完整讲解 gate 的七个子命令与五种门控类型并结合 cmd/bd/gate.go、cmd/bd/gate_discover.go 的源码与 cmd/bd/gate_test.go 中的测试说明其底层判定逻辑。读完你将掌握如何创建 gate 阻塞某 issue、如何用bd gate check自动评估并关闭已满足的 gate、如何用bd gate discover为 CI 门控自动发现 GitHub run ID以及如何在多 Agent 场景中通过 waiters 实现完工唤醒。Gate 是什么异步等待条件在 Beads 中gate 是一种特殊的 issueissue 类型为gate作为异步等待条件阻塞工作流步骤。它的核心语义见 cmd/bd/gate.gogate 会在 formula 步骤带有gate字段时被自动创建必须被关闭人工或通过 watcher被阻塞的步骤才能继续被 gate 阻塞的 issue不会出现在bd ready中直到 gate 被 resolve。从依赖图的角度看gate 是一个 issue可以像普通 issue 一样被接入依赖图docs/core-concepts/dependencies.md 演示了用bd dep add issue-2 gate-id让 issue-2 等待一个 gate。五种 Gate 类型类型等待条件自动判定方式human人工确认手动执行bd gate resolve idPhase 1timer时间到期当前时间超过created_at timeoutPhase 2gh:runGitHub Actions workflow 运行完成且成功gh run view id --json status,conclusionPhase 3gh:prPR 被合并gh pr view id --json state,titlePhase 3bead另一个 rig 的 bead 关闭通过路由查询目标 bead 状态Phase 4对于beadgateawait_id的格式为rig:bead-id例如other-project:op-abc123。从 cmd/bd/gate.go 的实现看checkBeadGate会剥离rig:前缀以bead-id作为路由查找键若格式非法前缀或 ID 为空会保持 pending 并给出错误提示TestCheckBeadGate_InvalidCrossRigFormatcmd/bd/gate_test.go专门验证了这一行为。bd gate list查看门控列出当前 beads 数据库中所有 gate issue。默认只显示**打开open**的 gate使用--all包含已关闭的。bd gate list [flags]Flags-a, --all Show all gates including closed -n, --limit int Limit results (default 50) (default 50)源码细节bd gate list支持可选 issue-id 参数见 cmd/bd/gate.go。不带参数时按IssueTypegate且排除StatusClosed过滤全库带参数时只列出阻塞该 issue 的依赖 gatefilterIssueGates通过GetDependencies取得依赖集后过滤出 gate 类型避免误把全库 gate 当成目标 issue 的门控。列表输出会把打开与关闭的 gate 分开展示并提示To resolve a gate: bd close gate-id。bd gate show查看单个门控详情显示某个 gate issue 的详细信息包括其 waiters。与bd show类似但会校验该 issue 确实是 gateIssueType ! gate时报错见 cmd/bd/gate.go。bd gate show gate-id [flags]输出字段renderGateShow包括状态符号、gate ID、标题、Status、Await Type、Await ID如有、Timeout如有、Waiters 列表、Description。配合--json全局开关可输出结构化 JSON。bd gate resolve手动关闭门控关闭一个 gate issue解除等待该 gate 的步骤。其语义等价于bd close gate-id只是名字更明确可用--reason说明解决原因。bd gate resolve gate-id [flags]Flags-r, --reason string Reason for resolving the gate对应human类型 gate 的默认关闭路径store.CloseIssue(ctx, gateID, reason, actor, )见 cmd/bd/gate.go成功后输出✓ Gate resolved: id。humangate 也出现在 docs/core-concepts/dependencies.md 的 Gate Types 表中是唯一完全依赖人工判定的类型。bd gate create创建临时门控创建一个临时 gate issue 阻塞另一个 issue直到该 gate 被 resolve。被阻塞的 issue 在 gate 解决前不会出现在bd ready中。bd gate create [flags]Flags--await-id string Condition identifier (run ID, PR number, etc.) --blocks string Issue ID to block (required) -r, --reason string Reason for the gate --timeout string Timeout duration (e.g., 2h, 30m) -t, --type string Gate type (human, timer, gh:run, gh:pr) (default human) --title string Custom gate title (default: Gate: type)示例bd gate create --blocks bd-abc bd gate create --typehuman --blocks bd-abc --reasonNeed design review bd gate create --typetimer --blocks bd-abc --timeout2h bd gate create --typegh:pr --blocks bd-abc --await-id42 bd gate create --blocks bd-abc --titleGate: awaiting owner sign-off底层实现要点见 cmd/bd/gate.go--blocks为必填缺失时直接报错MarkFlagRequired--timeout通过time.ParseDuration解析支持2h、30m等 Go duration 格式新 gate 的 title 默认为Gate: type若带await-id则为Gate: type await-id也可用--title完全自定义创建后会自动为 gate 与目标 issue 建立DepBlocks类型的依赖边使被阻塞 issue 在 gate 打开时保持非 ready对gh:run/gh:pr类型repoMetadataForGate会从被阻塞 issue 的 metadata 中继承并校验 GitHub 仓库选择器OWNER/REPO或HOST/OWNER/REPO供后续 check 跨仓库查询使用见 cmd/bd/gate.go成功后输出✓ Created gate id (type: ...)并提示Resolve with: bd gate resolve id。bd gate check评估并自动关闭已满足的门控评估 gate 条件自动关闭已满足的 gate。默认检查所有打开的 gate可用--type按类型过滤。bd gate check [flags]Flags--dry-run Show what would happen without making changes -e, --escalate Escalate failed/expired gates -l, --limit int Limit results (default 100) (default 100) -t, --type string Gate type to check (gh, gh:run, gh:pr, timer, bead, all)--type的取值与过滤语义shouldCheckGate见 cmd/bd/gate.go--type匹配范围空或all全部类型gh所有gh:前缀类型gh:rungh:prgh:run仅 GitHub Actions workflow 运行gh:pr仅 PR 合并状态timer仅定时器bead仅跨 rig bead 门控GitHub gate 通过ghCLI 查询状态gh:run执行gh run view id --json status,conclusiongh:pr执行gh pr view id --json state,title。判定规则resolve / escalate / pending来自 cmd/bd/gate.go 及checkGHRunStatusInRepoWithRunnercmd/bd/gate.go、checkGHPRWithRunnercmd/bd/gate.go、checkTimercmd/bd/gate.go类型已满足resolve升级escalate挂起pendinggh:runstatuscompleted且conclusionsuccessskipped 也视为成功completed且conclusion为 failure / canceled / 其他非成功值或 run 不存在运行中in_progress / queued / pending / waitinggh:prstateMERGEDstateCLOSED未合并关闭或 PR 不存在stateOPENtimer当前时间 created_at timeout设计上永不开级escalated恒为 false未到期报告剩余时间bead目标 beadstatusclosed不适用目标 bead 仍打开或查找失败示例bd gate check # Check all gates bd gate check --typegh # Check only GitHub gates bd gate check --typegh:run # Check only workflow run gates bd gate check --typetimer # Check only timer gates bd gate check --typebead # Check only cross-rig bead gates bd gate check --dry-run # Show what would happen without changes bd gate check --escalate # Escalate expired/failed gates输出与汇总每个 gate 显示✓ resolved / ⚠ ESCALATE / ○ pending状态行最后汇总Checked N gates: X resolved, Y escalated, Z errors配合全局--json会输出结构化结果checked / resolved / escalated / errors / dry_run见printGateCheckSummary。--dry-run只打印would resolve / would escalate而不落库--escalate开启后升级的 gate 会调用gt escalate主题为Gate escalation: id严重级别 HIGH通知相关方见escalateGatecmd/bd/gate.go。bd gate add-waiter注册完工唤醒将某个 Agent 注册为 gate bead 上的 waiter。gate 关闭时waiter 会通过bd gate wake收到唤醒通知。waiter 通常是 worker 的地址如my-project/workers/agent-1。bd gate add-waiter gate-id waiter [flags]典型使用场景bd done --phase-complete用它注册 gate 唤醒通知。实现上cmd/bd/gate.go会先校验该 issue 确实是 gate再检查 waiter 是否已注册已注册则幂等返回最后把 waiter 追加写入 issue 的waiters字段。这一机制让多 Agent 流水线中的下游 Agent 可以睡着直到上游 gate 关闭被唤醒而不是忙轮询。bd gate discover自动发现 GitHub run ID为等待 CI/CD 完成的 gate 自动发现 GitHub workflow run ID。它找出await_typegh:run且没有 await_id或 await_id 是非数字的 workflow 名称提示的打开 gate查询最近的 GitHub workflow runs用启发式规则匹配并把匹配到的 run ID 写回 gate 的await_id使后续bd gate check轮询能查询该 run 的状态。bd gate discover [flags]Flags-b, --branch string Filter runs by branch (default: current branch) -n, --dry-run Preview mode: show matches without updating -l, --limit int Max runs to query from GitHub (default 10) -a, --max-age duration Max age for gate/run matching (default 30m0s)匹配启发式matchGateToRun见 cmd/bd/gate_discover.goWorkflow 名称提示匹配200当await_id是非数字的 workflow 名时只考虑该 workflow 的 runworkflowNameMatches兼容大小写不敏感精确匹配、.yml/.yaml后缀归一化Commit SHA 匹配100run 的headSha等于当前本地 git commit SHA分支匹配50run 的headBranch等于当前分支默认取当前 git 分支getGitBranchForGateDiscovery失败回退main时间邻近度30/20/10run 创建时间与 gate 创建时间相差小于 5 分钟得 30 分小于 10 分钟得 20 分小于 30 分钟得 10 分运行状态偏好5in_progress或queued的 run 更可能是当前这次。总得分 ≥ 30 才接受匹配有 workflow 提示时仅 workflow 匹配 200 分即足够无提示时需分支/commit 加分否则视为无匹配。--max-age控制匹配的时间窗口上限默认 30 分钟。跨仓库cross-repo行为matchGatesToRuns、branchFilterForRepo当 gate 的metadata.repo指向其他仓库时发现过程只查询该仓库的 runs绝不会用当前仓库同名 workflow 的 run 去匹配自动检测到的本地分支不会套用到外部仓库用户显式传入的--branch除外且无 workflow 提示的外部 gate 会被跳过查询避免错误地把另一个仓库的 run ID 永久钉在 gate 上。示例bd gate discover # Auto-discover run IDs for all matching gates bd gate discover --dry-run # Preview what would be matched (no updates) bd gate discover --branch main --limit 10 # Only match runs on main branch完整实战从 CI 门控到多 Agent 编排场景一等待 CI 通过再继续# 1. 创建等待 CI 的 gate阻塞 deploy 任务 bd gate create --typegh:run --blocks bd-deploy-7 \ --await-idci.yml --reasonWait for CI green on main # 2. 在 CI 尚未产生 run 时自动发现并钉住 run ID bd gate discover --dry-run # 先预览 bd gate discover # 应用匹配 # 3. 定期评估成功则自动关闭 bd gate check # CI 成功后自动 resolve bd gate check --escalate # CI 失败时升级告警 # 4. 人工兜底关闭 bd gate resolve bd-deploy-7.gate-abc123 --reason Verified manually场景二定时冷却门控bd gate create --typetimer --blocks bd-hotfix-9 --timeout30m --reason Cooldown bd gate check --typetimer # 到期后自动 resolve场景三PR 合并门控bd gate create --typegh:pr --blocks bd-issue-2 --await-id42 bd gate check --typegh:pr # PR 合并MERGED后自动放行场景四多 Agent 阶段衔接配合 waiters# Agent A 完成阶段注册下游 Agent B 作为 waiter bd gate add-waiter bd-deploy-7.gate-abc123 my-project/workers/agent-2 # gate 关闭后Agent B 收到 bd gate wake 唤醒通知无需轮询定期自动化建议docs/core-concepts/dependencies.md 建议周期性运行bd gate check自动关闭已满足的 gate例如 cron*/5 * * * * cd /path/to/repo bd gate check常见问题与边界gh CLI 缺失gh:run/gh:pr/discover依赖ghCLI源码通过exec.LookPath(gh)检查见 cmd/bd/gate.go未安装时报错gh CLI not foundtimer gate 没有 timeoutcheckTimer在Timeout 0时返回错误no timeout set保持 pendinggate 不是 issueshow/resolve/add-waiter均会校验IssueType非 gate 类型直接报错bead gate 路由跨 rig 的 bead gate 通过 bead ID 前缀在routes.jsonl中路由解析见 cmd/bd/gate.go本地未命中时会按 local → prefix route → contributor 的顺序回退routedBeadGateGetterdiscover不支持 proxied-server 模式源码中runGateDiscover在usesProxiedServer()时直接报错cmd/bd/gate_discover.go。相关文档与源码CLI 参考docs/cli-reference/gate.md、docs/CLI_REFERENCE.md核心概念docs/core-concepts/dependencies.mdGate Types 表格、bd create --typegate的另一种创建方式与依赖接线源码实现cmd/bd/gate.gogate 命令族与判定逻辑、cmd/bd/gate_discover.gorun ID 发现与跨仓库匹配测试验证cmd/bd/gate_test.go类型过滤、bead 跨 rig 路由、gh状态判定、workflow 发现持久化、metadata 校验等覆盖【免费下载链接】beadsBeads - A memory upgrade for your coding agent项目地址: https://gitcode.com/GitHub_Trending/beads1/beads创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表