feat(delivery/mcp): get_delivery_status 支持按 pr_number/branch 查询,结论绑定 Gitea head SHA(使者回传 #203) #32
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "feat/delivery-status-by-pr"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
目标
使者回传 #203(Enterprise 2026-10-03 实测):为避开主工作区里其他会话的在制品,在独立 worktree 分支上开 PR 交付时,
get_delivery_status只读项目主工作区当前分支——返回「当前分支没有开放 PR」,CI 停在主工作区 HEAD,传pr_number也被忽略,只能改用git ls-remote+get_ci_status(commit_sha)兜底。本 PR 让
get_delivery_status支持可选pr_number(优先)与branch:给定时经 Gitea 取该 PR / 分支的 head 分支与 head SHA,PR/CI/review 结论绑定该 head SHA;都不给时保持原行为。蓝图卡:project-capability-control-planeP3-F。改动
commands/delivery_status.rsDeliveryQuery:取值校验单点实现(pr_number须为正整数;branch按 git check-ref-format 主要约束校验),显式给出的非法值直接报错,不静默回退主工作区。DeliveryStatus新增顶层target:mode(local_branch/pull_request/branch)、pr_number、branch、head_sha、source(gitea/local_git)、detail。git字段仍始终反映主工作区。_with_store变体供合成 Gitea 测试),不在内部pool().get()。commands/gitea.rsDeliverySignalTarget::{Local, PullRequest, Branch},共用GiteaRepoApi(沿用gitea_get_json/api_err脱敏)。pr_number:GET /pulls/{n}取 head 分支与 head SHA →statuses/{head_sha}→pulls/{n}/reviews;PR 状态归一为open/merged/closed;404 返回not_found(与不可达的unavailable区分);同时传入的branch与 PR head 分支不一致时以pr_number为准并在 detail 提示。branch:匹配该分支的开放 PR,以其 head SHA 查 CI;没有开放 PR 时读GET /branches/{branch}的 head SHA;远端分支不存在时 CI 为unknown。pull_request.data增加head_sha(增量字段)。merge_pull_request门禁代码未改。mcp_tools.rs:schema 增加可选pr_number(integer, minimum 1)与branch,描述说明默认行为与 worktree 场景;dispatch 只做 JSON 类型解析后交给DeliveryQuery::new;文本摘要加入「目标=PR #n(head 分支 …,head SHA <完整 40 位>)」,不读 structuredContent 的客户端也能看到要确认的 SHA。get_delivery_status(project_id, pr_number);BASE_ONBOARDING_PACK_VERSION、模板capability-packs.json1.8.0 → 1.9.0,TEMPLATE_FINGERPRINTS更新。Codex 插件 skill(plugins/lian-jing-codex)第 5 条同步。docs/ai-context/project-context.yaml「MCP 工具接口」补充新参数、target字段与回退规则。自验
cargo test --locked(CARGO_TARGET_DIR独立):lib 282 passed / 0 failed / 5 ignored;main 与 doctest 0 项,全部通过。pr_number_target_binds_pr_ci_and_review_to_gitea_head_sha:合成 Gitea,主工作区路径不存在(git=unavailable)时,target.head_sha、pull_request.data.head_sha、ci.data.target_sha都是 PR head SHA,review 读取/pulls/7/reviews,branch 不一致时给出提示。missing_pr_is_not_found_rather_than_main_workspace_fallback:404 →not_found,CIunknown,不编造 head SHA。branch_target_prefers_open_pr_head_then_remote_branch_head:分支有开放 PR / 无开放 PR(GET /branches/feat/no-pr)/ 远端分支不存在三种情况。delivery_query_rejects_invalid_explicit_targets_instead_of_falling_back、delivery_status_rejects_invalid_target_before_io(MCP 层在任何 IO 前拒绝0、"31"、非字符串 branch、../main)。delivery_status_schema_offers_optional_pr_and_branch_targets(全局与 scoped catalog)、delivery_summary_names_the_queried_target_and_full_head_sha、delivery_pr_state_prefers_merged_and_never_guesses_unknown、branch_path_keeps_separators_and_encodes_segments。no_gitea_binding_does_not_fabricate_delivery_success增加默认target.mode=local_branch与未绑定时按 PR 查询不编造 SHA 的断言。merge_gate_*测试原样通过;managed_template_fingerprints_track_versions以 1.9.0 新摘要通过。rustfmt --check,git diff --check通过。没验什么
get_delivery_status(project_id, pr_number),核对target.head_sha与 Gitea PR head 一致、CI 与 review 指向该 PR。GET /branches/feat/x(分支名中的/不编码、逐段编码其余字符)的路由只在合成服务器上验证过。依据是 Gitea 的/branches/*通配路由,未在真实实例上实测。statuses/{head_sha}查询。branch模式下开放 PR 超过 50 个时可能匹配不到,此时会转为读远端分支 head。apply_onboarding_pack才会分发;Enterprise 等子项目尚未升级。炼境自身根目录的.agents/skills/lian-jing副本未同步,按惯例由 apply 更新。git-workflow.md.tmpl与docs/ai-context/git-workflow.md中get_delivery_status的说明只描述默认行为。内容仍然准确,但没有提到pr_number;改这个托管块需要另升块版本,本 PR 未处理。pnpm typecheck:本 PR 不改前端代码或类型(get_delivery_status不是 Tauri command,commands.ts无对应封装),PR CI 会跑。gitea_get_json没有显式超时(原有行为),PR / 分支模式沿用。兼容性
pr_number/branch时,PR/CI/review 的取值与原行为一致。新增的顶层target和pull_request.data.head_sha都是增量字段。merge_pull_request没有改动,合并前仍会重新读取 PR、head SHA、CI 与 review。🤖 Generated with Claude Code
Enterprise 2026-10-03 实测:在独立 worktree 分支开 PR 交付时,get_delivery_status 只读主工作区当前分支,PR/CI 结论与目标 PR 脱节。本卡开始执行,标 🔵。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>Enterprise 2026-10-03 实测:为避开主工作区里其他会话的在制品,在独立 worktree 分支上开 PR 交付时,get_delivery_status 只读主工作区当前分支,返回「当前分支没有 开放 PR」、CI 停在主工作区 HEAD,传 pr_number 也被忽略,只能用 git ls-remote 与 get_ci_status(commit_sha) 兜底。 - MCP schema 新增可选 pr_number(优先)与 branch;都不给时保持原行为 - pr_number:GET /pulls/{n} 取 head 分支与 head SHA,CI 与 review 均绑定该 PR; PR 不存在(404)返回 not_found,与 Gitea 不可达(unavailable)区分; 同时传 branch 且与 PR head 分支不一致时以 pr_number 为准并在 detail 提示 - branch:匹配该分支的开放 PR 并以其 head SHA 查 CI;无开放 PR 时取 Gitea 上 该分支 head SHA;远端分支不存在时 CI 为 unknown - 顶层新增 target(mode/pr_number/branch/head_sha/source/detail), pull_request.data 增 head_sha;git 字段仍反映主工作区,既有字段兼容 - 取值校验在能力本体 DeliveryQuery 单点实现,MCP 只解析 JSON 类型;显式给出的 非法值直接报错,不静默回退主工作区 - Gitea 读取拆为本地/PR/分支三种目标,凭证存储注入以便合成 Gitea 测试; merge_pull_request 门禁代码未改 - lian-jing skill 第 6 条改为 get_delivery_status(project_id, pr_number), base-onboarding 1.8.0→1.9.0(BASE_ONBOARDING_PACK_VERSION、模板 capability-packs.json、TEMPLATE_FINGERPRINTS);Codex 插件 skill 同步 - 契约说明同步 docs/ai-context/project-context.yaml;蓝图 P3-F 标 ✅ Feature-Confirmed: true Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>