Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file not shown.
Binary file not shown.
9 changes: 6 additions & 3 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ PM(项目经理)工作契约(ADR-0085,索引型;治理仓豁免行数
6. front-desk 命令(卡 issue 评论,conductor 转介 arbiter 处理):/claim 认领 · /release 释放租约 · /retry 隔离回流

<!-- /entry-protocol -->

迷路了(从别的仓/入口进来)?全入口路由表:docs/NAVIGATION.md(入口矩阵+高频困惑 FAQ,ADR-0055/0085,#363 收口)。

## PM 优先(ADR-0085)

- **入职三步**:① `governance/REPOS.yaml` 看版图 → ② `docs/pm/PLAYBOOK.md`(阶段手册:资源/用法/代价/报告格式)→ ③ 最近 4 周运行报告(`Cloudbird-Software/archive` 仓 `runs/`)
Expand All @@ -32,7 +35,7 @@ PM(项目经理)工作契约(ADR-0085,索引型;治理仓豁免行数

## 硬规则

- 治理文件(governance/ standards/ scripts/ .github/ CODEOWNERS profile/ Makefile docs/)= C1 路径:PR 必须引用 ADR-NNNN(家园=archive/adr/,ADR-0085),owner-only review
- 治理文件(governance/ standards/ scripts/ .github/ CODEOWNERS profile/ Makefile docs/)= C1 路径:PR 必须引用 ADR-NNNN(家园=archive/adr/,ADR-0085),owner-only review;**治理变更不需要卡**(卡只承载 spec 派生的实现工作)。spec 位置:治理 specs=`specs/IR-XXXX/`(本仓),产品 feature specs=产品仓 `specs/<IR-NNNN>/`

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

2. C1 gate漏判docs/makefile 🐞 Bug ≡ Correctness

AGENTS.md/NAVIGATION.md 把 docs/ 与 Makefile 视为 C1,但 gate.yml 的 adr-required C1 路径匹配未包含 docs/ 与
Makefile,导致修改这些路径的 PR 可能错误跳过 ADR-required 与相应治理约束。该 PR 本身修改了 docs/ 与 Makefile,使这一不一致在当前变更上直接生效。
Agent Prompt
## Issue description
AGENTS.md/NAVIGATION.md 将 `docs/` 与 `Makefile` 纳入 C1,但 `.github/workflows/gate.yml` 中 `adr-required` 的 C1 判定正则仍只覆盖 `governance/ standards/ scripts/ .github/ CODEOWNERS profile/`。这会导致修改 `docs/` 或 `Makefile` 的 PR 可能被当作“非 C1”而跳过 ADR-required。

## Issue Context
- 本 PR 明确宣称:`docs/` 与 `Makefile` 视同 C1。
- gate 的 `C1_HIT` 判定是 ADR-required 是否执行的前置条件,漏判将直接绕过门禁。

## Fix Focus Areas
- .github/workflows/gate.yml[236-255]
- AGENTS.md[38-38]
- docs/NAVIGATION.md[14-16]

## Expected change
1) 扩展 gate.yml 中 `any(test("^(...)")` 的路径集合,至少加入:
   - `docs/`
   - `Makefile`
2) 同步更新相关错误提示文案(目前错误提示枚举的 C1 路径也未包含 docs/ 与 Makefile),避免排障误导。
3)(可选但建议)若仓内还有其他“C1 路径判断”的正则/列表(如脚本或其他 workflow),一并对齐,避免再次分叉。

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

- 写仓身份 = GitHub App `cloudbrid-agent`(AG-1);令牌经 scripts/gh-app-token.sh,单仓作用域、1h 过期(本仓驻留 agent 直接用 `scripts/ghcb`)。例外:org 级 Project 写与成员判定用 GOVERNANCE_TOKEN(仅 workflow secrets 面,不落 agent 手)
- ADR 落盘:PR 至 `archive/adr/ADR-NNNN-*.md` + 更新同目录 INDEX.yaml(家园单仓化,ADR-0085)
- 红队守门(ADR-0082):spec/测试设计路径 PR 必须经红队审计;g060 锁定 specs/*/suite/**(ADR-0061/0081)
Expand All @@ -42,14 +45,14 @@ PM(项目经理)工作契约(ADR-0085,索引型;治理仓豁免行数
## 常用命令(本仓驻留)

- 校验本仓声明:`.github/workflows/gate.yml`(本地等价:`make gates-pr`)
- 漂移检测/修复(owner/CI 专属,需 org admin PAT):`GH_TOKEN=<org admin> bash governance/drift-check.sh`每日 CI 自动跑)· `GH_TOKEN=<org admin> bash governance/apply.sh`(幂等)
- 漂移检测/修复(owner/CI 专属,需 org admin PAT):`GH_TOKEN=<org admin> make drift-check`(等价 `bash governance/drift-check.sh`每日 CI 自动跑;agent 侧预检=`make gates-pr`)· `GH_TOKEN=<org admin> bash governance/apply.sh`(幂等)
- 修复循环上限执法:`GH_TOKEN=<org admin> bash governance/auto-fix-limit.sh` · 成本熔断:`GH_TOKEN=<org admin> bash governance/cost-check.sh`
- 取 App 令牌:`GH_TOKEN=$(scripts/ghcb <repo>)`(缓存命中零网络,ADR-0044)
- CNB 池运维:`Cloudbird-Software/cnb-bridge` 仓(accounts.yaml/cnb_pool.py/REMOVAL.md);周审计=本仓 cnb-audit 工作流(EX-1 三接缝之一)

## 索引(用到再读)

- 治理总声明 governance/GOVERNANCE.yaml(agent_runtime/external_compute 域=ADR-0085 新范式)· 组织地图 governance/REPOS.yaml · 期望状态 governance/expected-state.json
- 全入口路由 docs/NAVIGATION.md(从哪进来→去哪→怎么走;断链=test-navigation.sh 红)· 治理总声明 governance/GOVERNANCE.yaml(agent_runtime/external_compute 域=ADR-0085 新范式)· 组织地图 governance/REPOS.yaml · 期望状态 governance/expected-state.json
- 政策集 governance/policy/(languages/testing/automation-limits 含 cnb: 节)
- 状态机 governance/transitions.yaml(T7 卡就绪/T8 卡完成/T9 IR 验收——conductor 唯一定义源)
- PM 手册 docs/pm/PLAYBOOK.md · 工具目录 governance/providers.yaml(无密钥) · 运行报告 archive 仓 runs/
6 changes: 5 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ CARD ?=
# 注释须独立成行:行尾注释会把 # 前的尾随空格并入 REPO 值,gh -R 解析失败且被吞。
REPO ?= Cloudbird-Software/.github

.PHONY: card-test gates-pr
.PHONY: card-test gates-pr drift-check
card-test: ## 读卡 AC 列表并提示测试先行:make card-test CARD=<issue#>
@test -n "$(CARD)" || { echo "用法: make card-test CARD=<issue#>(缺 CARD)" >&2; exit 2; }
@echo "== 卡 $(REPO)#$(CARD) 的 AC(测试先行:先按 AC 写红测试再实现)=="
Expand All @@ -28,3 +28,7 @@ gates-pr: ## 本地等价关卡清单(gate.yml 语义):make gates-pr
&& echo "OK 治理自测(governance/tests;需 jq)"
@python3 -c "import glob,yaml;[yaml.safe_load(open(f,encoding='utf-8')) for f in glob.glob('governance/**/*.yaml',recursive=True)+glob.glob('standards/**/*.yaml',recursive=True)+glob.glob('.github/workflows/*.yml')];print('OK yaml 解析(governance/standards/workflows)')"
@echo "== 开 PR 前检查单(机器不可判部分):PR body 引用 ADR-NNNN(C1)/ body 带 Card: 元数据行 / diff<400 行 =="


drift-check: ## C1 本地预检(owner/CI 面,需 org admin PAT):GH_TOKEN=<org admin> make drift-check
@bash governance/drift-check.sh
67 changes: 67 additions & 0 deletions docs/NAVIGATION.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# NAVIGATION —— 全入口路由(从哪进来 → 该做什么 → 怎么做)

> 目的:任何 agent / 人从任意入口(org 首页、任意仓、issue 表单、Actions)落地后,
> 30 秒内定位「该做什么、怎么做」。这是 #362 治理可达性审计(32 次 PM 模拟运行,
> 置信度 4.8/10)的收口件之一。
> 依据:ADR-0055(统一入口协议)· ADR-0085(PM 优先范式)· ADR-0064(Bug 流)。
> 维护契约:新增入口面(仓 / 模板 / 表单 / 工作流)须同步本表;本表引用的本仓文件
> 必须真实存在——断链由 `governance/tests/test-navigation.sh` 机械检测(gate 每 PR 跑)。

## §0 三句话版本

1. **在产品/支撑仓干活** → 唯一工作凭证是卡:`bash ghcb next <owner/repo>` 找
`state:ready` 卡 → `bash ghcb claim <n>` 认领 → 实现 → PR body 带 `Card: <owner>/<repo>#<n>` 行。
2. **要改治理面**(governance/ standards/ scripts/ .github/ specs/ profile/ CODEOWNERS,
以及按 AGENTS.md 硬规则视同 C1 的 docs/ 与 Makefile)→ **不需要卡**:直接开 PR +
Comment on lines +12 to +15

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remediation recommended

1. Missing card: metadata line 📘 Rule violation § Compliance

The PR description does not include a required Card: <owner>/<repo>#<n> metadata line, so
downstream tooling cannot reliably parse the work item linkage. This violates the compliance
requirement for PR body card metadata.
Agent Prompt
## Issue description
The PR description/body must contain exactly one line starting with `Card: ` followed by `<owner>/<repo>#<n>`, but the current PR description (as provided) has no such line.

## Issue Context
This PR changes C1/governance-related paths (e.g., `docs/`, `profile/`, `Makefile`, `governance/tests/`), so PR metadata is expected to be machine-parseable. `docs/NAVIGATION.md` also documents the required `Card:` line format.

## Fix Focus Areas
- docs/NAVIGATION.md[12-15]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

引用 ADR-NNNN + owner review(C1 流程,见 §2)。
3. **带全局职责进来(PM)** → [AGENTS.md](../AGENTS.md)「PM 优先」节 +
[docs/pm/PLAYBOOK.md](pm/PLAYBOOK.md) 全文 + archive 仓 `runs/` 最近 4 周运行报告。

## §1 入口矩阵

| 你在哪 / 你是谁 | 先读 | 然后 |
|---|---|---|
| org 首页(profile/README.md) | 本表 §0 | 按角色下钻;仓库全量真源 [governance/REPOS.yaml](../governance/REPOS.yaml) |
| 产品仓(AI_Web_School / mutual / QW_Arena1 …) | 该仓根部 AGENTS.md 的入口协议块 | 取 ghcb(AGENTS.md 内钉 SHA 命令)→ `ghcb next <owner/repo>` 找卡;无卡不开工,新想法走 intent 表单 |
| 治理仓 .github | [AGENTS.md](../AGENTS.md)(本仓契约) | 治理变更走 C1(§2,无需卡);卡工作照入口协议块 |
| 治理仓 CI-Workflows | 该仓 AGENTS.md | workflow/pipeline 变更=C1 面(.github/ 路径):PR 引 ADR + owner review |
| 治理仓 archive | `runs/README.md` | 运行报告只追加(append-only);ADR 落 `adr/` + 更新 INDEX.yaml |
| 支撑仓 cnb-bridge | 仓内 `REMOVAL.md` + `accounts.yaml` | 池运维 owner 面;派单一律经 .github 仓 `cnb-dispatch` 工作流(key 不入上下文) |
| 支撑仓 arbiter / holdout | —(owner 直管) | 你不直接调用(见 §2「conductor/arbiter」);holdout 对 agent 只读 |
| 发现 bug | [.github/ISSUE_TEMPLATE/bug.yml](../.github/ISSUE_TEMPLATE/bug.yml) | 提交即机器复现(B1–B5,ADR-0064):reproduced → 修复合入 → fixed → done |
| 有新意图(feature/治理意图) | [.github/ISSUE_TEMPLATE/intent.yml](../.github/ISSUE_TEMPLATE/intent.yml) | IR 流:owner 签署 → spec(自著合法)→ 红队 → 开卡(PLAYBOOK §2–§3) |
| 想看全局进度 | `bash ghcb board` | 全状态流水线(ir-draft…done 的 IR 与卡,非只 ready 卡) |

## §2 高频困惑(#362 实测断裂点,逐条落点)

- **spec 放哪**:治理 specs 在 `.github/specs/IR-XXXX/`;产品 feature specs 落产品仓
本仓 `specs/<IR-NNNN>/`(IR 一律在 .github 仓开,编号全局唯一;spec 与 suite 随实现仓走,
suite 门 T-14/T5 按所在仓生效)。
- **治理变更要不要开卡**:不要。卡流程(T7→T8)只承载 spec 派生的实现工作;
治理变更走 C1:PR + 引用 ADR-NNNN(新建或引既有)+ owner-only review + merge。
同一 PR 不混两种性质。
- **C1 的「drift-check 本地预检」跑不了**:drift-check 需 org admin PAT(owner/CI 专属面)。
agent 侧等价预检 = `make gates-pr`(.github 仓);owner 可 `make drift-check`。
治理漂移的最终判定是每日 CI drift(GOVERNANCE_TOKEN),不靠你本地。
- **g060 拦截了你的 suite 变更**:不是故障,是设计。`specs/*/suite/**` 被锁定
(ADR-0061/0081),授权身份仅 owner 与 verifier-app;你的 spec PR 含 suite 变更会被
g060 拦下(exit 2)并自动开裁决 issue,owner 以 `/g060-adopt <证据>` 采纳或
`/g060-reject` 驳回(TTL 72h)。首次创建 suite 同样走此路径——无豁免通道是刻意的。
- **conductor / arbiter 怎么触发**:不用也无法手动调用。conductor 监听 issue 事件
(`state:*` 标签、评论 `/start` `/claim` `/retry`),arbiter 由 conductor 转介执行
CAS 租约。你只管评论与打标签,状态换签是机器的事。
- **测试先行 vs gate 要绿**:红测试不进 main。spec PR 的 suite 断言制度/结构不变量,
合入时必须绿;修 bug 的失败复现测试走 bug 流(B2 reproduced 锚定 base 红,
fix PR 合入时转绿)。
- **PM 能不能改 .github/workflows/**:能提 PR——但这是 C1 面:引用 ADR、owner-only
review;PM 的自主性在生成侧,判定与合并归 owner 与 gate(PLAYBOOK §0 红线)。
- **根目录文件归属(C1 还是 C3)**:GOVERNANCE.yaml `flows.governance_change` 的
classes 是分类真源;AGENTS.md 硬规则把 docs/ 与 Makefile 一并视同 C1(宁严勿松)。
拿不准就按 C1 走:多引一个 ADR 的成本远低于走错流程的返工。

## §3 机器护栏

本文件的断链由 [governance/tests/test-navigation.sh](../governance/tests/test-navigation.sh)
机械检测(随 gate 与 `make gates-pr` 每次运行):入口引用的本仓文件必须存在、
AGENTS.md 行数 ≤ 60(治理仓豁免上限)、入口协议块标记完整、本表必须保留 g060/C1/
drift-check 等高频困惑锚点。
30 changes: 30 additions & 0 deletions docs/pm/PLAYBOOK.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,13 @@ worker 视角的认领/开工协议(AGENTS.md entry-protocol v1 块)对 PM
- 你自己写——完全合法,且是深度理解 IR 的最好方式;
- spec-author 快速通道:CI-Workflows `spec-author.yml` 流水线生成骨架你再修。
模板:CI-Workflows `pipeline/spec-template.md`(正文条款结构 / AC given-when-then / INV-BEH-IFACE 分节)。
- **spec 放哪**(#363 落点):治理 specs 在 `.github/specs/IR-XXXX/`;
产品 feature specs 落产品仓本仓 `specs/<IR-NNNN>/`——IR 一律在 .github 仓开
(编号全局唯一),spec 与 suite 随实现仓走(suite 门 T-14/T5 按所在仓生效)。
- **g060 会拦你的 suite**(不是故障,是设计):`specs/*/suite/**` 被锁定
(ADR-0061/0081),授权身份仅 owner 与 verifier-app;你的 spec PR 含 suite 变更
会被 g060 拦下(exit 2)并自动开裁决 issue,owner 以 `/g060-adopt <证据>` 采纳
(TTL 72h,dead-man 兜底)。首次创建 suite 同样走此路径——无豁免通道。
- **spec PR 必带**:
- `suite/` 目录(ADR-0083 suite 门;至少一个非空可解析测试文件——T5 `suite_ready_required`
谓词会现场重查,T-14 亦要求);注意 `specs/*/suite/**` 在 g060 锁定集内
Expand Down Expand Up @@ -132,3 +139,26 @@ IR 级收口,证据可机械回查。门禁=T9 谓词(ADR-0085 决策 5)
| 验证者 | 独立验收/封存场景考试 | holdout 仓(owner 直管)+ CI-Workflows `pipeline/verifier-exam/`、`verifier-exam.yml` | verifier 档 token(计量入账,automation-limits.yaml) |
| 治理政策 | 无人值守阈值/测试政策/语言准入 | `governance/policy/`(automation-limits.yaml ADR-0040 · testing.yaml T-01..T-15 · languages.yaml) | 读它比违约便宜 |
| 运行报告 | 经验沉淀与改进燃料 | `archive/runs/YYYY-WNN.md`(追加);digest=archive `runs-digest.yml` | 10 分钟/次;不写=下周 PM 重复踩坑 |
| conductor / arbiter | 生命周期转移与 CAS 租约(T1–T9) | **无需也无法手动调用**:conductor 监听 issue 事件(`state:*` 标签、`/start` `/claim` `/retry` 评论),arbiter 由 conductor 转介 | 零(App 身份自动执行) |
| 全入口路由 | 任何入口落地后 30 秒定位该做什么 | `.github` 仓 `docs/NAVIGATION.md`(入口矩阵+高频困惑 FAQ) | 一次阅读 |

## §9 发起治理变更(C1 runbook,#363 落点)

你主动改治理面(governance/ standards/ scripts/ .github/ specs/ profile/ CODEOWNERS,
及按 AGENTS.md 硬规则视同 C1 的 docs/ 与 Makefile)时:**不需要卡**——卡流程
(T7→T8)只承载 spec 派生的实现工作,治理变更的授权凭证是 ADR + PR 记录
(GOVERNANCE.yaml `flows.governance_change`)。

1. **分类**:查 `flows.governance_change` classes(C1/C2/C3 真源);拿不准按 C1
走——多引一个 ADR 的成本远低于走错流程的返工。
2. **ADR**:新决策=新写 ADR(PR 至 archive `adr/ADR-NNNN-*.md` + 更新 INDEX.yaml);
执行性变更(既有决策的落地)=引用既有 ADR-NNNN 即可。
3. **本地预检**:`make gates-pr`(gate.yml 本地等价面)。drift-check 是 owner/CI 面
(org admin PAT)——你跑不了不是你的问题,agent 侧等价预检就是 gates-pr。
4. **PR**:title/body 引用 ADR-NNNN(gate adr-required 机器拦,幽灵 ADR 不放行);
bug 修复关联 bug 单(B3 状态回写靠它)。
5. **合并**:owner-only review + merge。你的自主性在生成侧(写什么、怎么写),
判定与合并归 owner 与 gate(§0 红线)——包括 `.github/workflows/`:能提 PR,
不能自批。

迷路时先读 `docs/NAVIGATION.md`(全入口路由),再回来翻本手册对应阶段。
90 changes: 90 additions & 0 deletions ghcb
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
#!/usr/bin/env bash
# ghcb —— cloudbrid-agent 便捷入口(ADR-0044 令牌 + ADR-0051 找活协议 + ADR-0055 front-desk 扩展)
#
# 用法:
# GH_TOKEN=$(ghcb <repo> [--refresh]) # 铸 App 单仓安装令牌(ADR-0044,原用法不变)
# ghcb next [repo] # 找活:列出 <repo>(缺省=origin 所在仓)state:ready 的卡
# ghcb claim <n> [repo] # 认领:在卡 #n 评论 /claim——conductor 校验先到先得并置
# # state:in-progress(ADR-0049 T3);ghcb 不持有状态写权
# ghcb release <n> [repo] # 释放:评论 /release——conductor 转介 arbiter 删租约
# # (仅 holder 本人或 owner 可成,ADR-0054 §4)
# ghcb status <n> [repo] # 只读:卡标签态(真相源)+ arbiter 租约持有者/到期
# ghcb card-meta <n> [repo] # 输出 PR body 应贴的卡元数据行(Card: <org>/<repo>#<n>)
#
# next/claim/release 用调用方自己的 gh 凭据(gh auth login);认领合法性单一真源=conductor guard
# + arbiter CAS(ADR-0055 转介)。status 读 arbiter 仓 refs/leases/*(只读,无写权要求)。
set -euo pipefail

origin_repo() { # 从 origin 远端推断 owner/name;非 git 仓则空
git remote get-url origin 2>/dev/null | sed -E 's#.*github\.com[:/]##; s#\.git$##' || true
}

ORG="Cloudbird-Software" # 本 CLI 是组织内部入口(org 段固定,仓段可省略)
LEAS_REPO="$ORG/arbiter" # 租约宿主仓(arbiter,ADR-0054)

norm_repo() { # 'repo' | 'owner/repo' → 'owner/repo'(org 段缺省补全)
local r="${1:?}"
[[ "$r" == */* ]] || r="$ORG/$r"
printf '%s' "$r"
}

CMD="${1:-}"
case "$CMD" in
next)
REPO_ARG="${2:-$(origin_repo)}"
[[ -n "$REPO_ARG" ]] || { echo "错误:不在 git 仓内且未指定仓(用法: ghcb next [repo])" >&2; exit 2; }
gh issue list --repo "$REPO_ARG" --label state:ready --state open --json number,title --jq '.[] | "#\(.number) \(.title)"' || { echo "查询失败:检查 gh 凭据(gh auth login)与仓权限" >&2; exit 2; }
;;
claim)
# 参数序 <issue#> [repo](首版误把 $1 当 repo,PR#157 修正)
N="${2:?用法: ghcb claim <issue#> [repo]}"
REPO_ARG="${3:-$(origin_repo)}"
[[ -n "$REPO_ARG" ]] || { echo "错误:不在 git 仓内且未指定仓" >&2; exit 2; }
# MSYS 路径转换豁免:Git Bash 会把以 / 开头的参数改写成 Windows 路径
# (实测 "/claim"→"D:/development/Git/claim",conductor 白名单不认);
# 非 MSYS 环境该 env 为无害空设
MSYS2_ARG_CONV_EXCL='/claim' MSYS_NO_PATHCONV=1 gh issue comment "$N" --repo "$REPO_ARG" --body "/claim" >/dev/null
echo "已评论 /claim(#$N @$REPO_ARG)——conductor 转介 arbiter CAS 裁决并置 state:in-progress;确认:ghcb status $N"
;;
release)
# 释放租约(ADR-0055):/release 评论由 conductor 转介 arbiter——非 holder/无租约=deny
N="${2:?用法: ghcb release <issue#> [repo]}"
REPO_ARG="${3:-$(origin_repo)}"
[[ -n "$REPO_ARG" ]] || { echo "错误:不在 git 仓内且未指定仓" >&2; exit 2; }
MSYS2_ARG_CONV_EXCL='/release' MSYS_NO_PATHCONV=1 gh issue comment "$N" --repo "$REPO_ARG" --body "/release" >/dev/null
echo "已评论 /release(#$N @$REPO_ARG)——conductor 转介 arbiter 释放租约(仅 holder/owner);确认:ghcb status $N"
;;
status)
# 只读:标签态(宪法 §12 真相源)+ 租约视图(arbiter refs/leases/<org>__<repo>__<n>)
N="${2:?用法: ghcb status <issue#> [repo]}"
REPO_ARG="${3:-$(origin_repo)}"
[[ -n "$REPO_ARG" ]] || { echo "错误:不在 git 仓内且未指定仓" >&2; exit 2; }
FULL="$(norm_repo "$REPO_ARG")"; NAME="${FULL##*/}"
gh issue view "$N" --repo "$FULL" --json number,title,state,labels,assignees \
--jq '"#\(.number) \(.title)\n 状态: \(.state) | 标签: \([.labels[].name] | join(", ")) | assignee: \([.assignees[].login] | join(", "))"' \
|| { echo "查询失败:检查 gh 凭据与仓权限" >&2; exit 2; }
REF="refs/leases/${ORG}__${NAME}__${N}"
if SHA=$(gh api "repos/$LEAS_REPO/git/ref/$REF" --jq '.object.sha' 2>/dev/null); then
MSG=$(gh api "repos/$LEAS_REPO/git/commits/$SHA" --jq '.message' 2>/dev/null || true)
HOLDER=$(grep -o '"holder": *"[^"]*"' <<<"$MSG" | head -1 | sed 's/.*"holder": *"//; s/"$//' || true)
EXP=$(grep -o '"expires_at": *"[^"]*"' <<<"$MSG" | head -1 | sed 's/.*"expires_at": *"//; s/"$//' || true)
echo " 租约: holder=${HOLDER:-?} expires_at=${EXP:-?}(ref $REF)"
else
echo " 租约: 无活跃租约(ref $REF 不存在)"
fi
;;
card-meta)
# 输出 PR body 必贴的卡元数据行(ADR-0055 决策 1:缺失=后续关卡 exit 3)
N="${2:?用法: ghcb card-meta <issue#> [repo]}"
REPO_ARG="${3:-$(origin_repo)}"
[[ -n "$REPO_ARG" ]] || { echo "错误:不在 git 仓内且未指定仓" >&2; exit 2; }
echo "Card: $(norm_repo "$REPO_ARG")#$N"
echo "提示:把上面一行原样贴进 PR body(缺失=后续关卡 exit 3)" >&2
;;
*)
export REPO="${1:?用法: GH_TOKEN=$(ghcb <repo> [--refresh]) | ghcb next [repo] | ghcb claim <n> [repo] | ghcb release <n> [repo] | ghcb status <n> [repo] | ghcb card-meta <n> [repo]}"
shift || true
DIR="$(cd "$(dirname "$0")" && pwd)"
exec bash "$DIR/gh-app-token.sh" "$@"
;;
esac
Loading