Skip to content

feat(git): 远端 Git、Pull Request 与凭证/网络授权 - #81

Merged
Qiyuanqiii merged 5 commits into
mainfrom
codex/issue-45-remote-git-pr
Aug 16, 2026
Merged

Qiyuanqiii merged 5 commits into
mainfrom
codex/issue-45-remote-git-pr

Conversation

@Qiyuanqiii

Copy link
Copy Markdown
Member

背景

Issue #45(Parent #34,依赖 #44):Prayu 需要远端 Git 与 Pull Request 产品工作流。网络与凭证必须与本地 mutation 分离,经 Go 的 Scope/Credential/Approval/审计执行,网络默认关闭、任何远端访问显式授权。

本次改动

  • 封闭 typed 远端操作(repository_remote.v1):fetch / pull_ff(仅 fast-forward)/ push_branch(仅新分支,ls-remote 探测已存在即默认拒绝,永不传 --force)/ create_pr / update_pr。force push、远端分支删除、protected branch 改写不可表达;未知操作直接拒绝。
  • URL/网络边界:仅 HTTPS(拒绝 http/loopback/URL 内凭据/query/fragment);kill-switch:http/https.proxy 置空、core.sshCommand 置空(禁 SSH/ProxyCommand)、protocol.ext.allow=never(禁协议 wrapper);host/port/protocol/TTL/Run 全部进入 request_fingerprint 与 schema v107 台账。
  • 凭证只按引用存在:spec 只携带 credential NAME;secret 经 credential.Store 按名解析——git 路径用临时 GIT_ASKPASS + GIT_PASSWORD 子进程环境变量(用后即删),GitHub API 路径仅 Authorization: Bearer 头;argv/日志/SQLite/Activity/OpenAPI/模型上下文均无明文(端到端测试断言 secret 与名称不进 spec JSON 与 run 事件);stderr 自动脱敏。
  • GitHub PR API(internal/repository/pr_api.go):仅 github.com;响应 ≤64KiB;401/403 限流/403 权限/422/404/网络失败全部映射可解释错误码;收据仅 URL/number/state/title。
  • 台账与事件:schema v107 git_remote_operations(operation key 幂等、脱敏收据)+ run 事件 git.remote_completed。
  • CLI:cyberagent git-remote fetch|pull|push-branch|create-pr|update-pr——先打印审阅(remote/branch/TTL/PR 元数据/credential 引用名),--confirm 后执行并打印脱敏收据。

测试覆盖

  • repository 层:spec 矩阵(http/loopback/URL 凭据/未知操作/PR 缺 base 拒绝);fetch + fast-forward pull 端到端(本地 bare 远端);push 新分支成功、已存在分支默认拒绝;credential 按名解析与输出脱敏;PRClient httptest 错误矩阵(201/401/403 限流/403 权限/422/404 + Bearer 头断言)与未知 host 拒绝。
  • application 层(真实 store + 假 API + MemoryStore credential):create_pr 端到端、凭证卫生断言(secret/名称不进 spec JSON 与 run 事件)、git.remote_completed 事件落库。

验证结果

  • go build ./...、go vet ./... 通过;全量 go test -timeout 30m ./... 进行中。

安全边界与非目标

  • 远端 Issue/PR 描述/评论/仓库文件是不可信证据,不得覆盖用户任务/Policy/审批;无组织级 OAuth/SSO/RBAC、不自动合并 PR、模型不能选择或读取原始 credential、不支持任意协议包装器。
  • 后续 PR(ADR 0109 已记录):Desktop 提交/推送/PR 审阅与取消流程、HTTP/OpenAPI。

Closes #45

repository_remote.v1:fetch/pull_ff/push_branch/create_pr/update_pr 五个封闭操作;force push、远端分支删除、protected branch 改写不可表达。

验证:仅 HTTPS(无凭据/query/fragment、非 loopback),host/branch/TTL 有界;push 前 ls-remote 探测,已存在分支默认拒绝(永不传 --force)。

执行边界:hardened 环境 + http/https.proxy 置空、core.sshCommand 置空(禁 SSH/ProxyCommand)、protocol.ext.allow=never(禁协议 wrapper)、GIT_ASKPASS 临时助手 + GIT_PASSWORD 子进程环境变量(credential 仅按名称引用,不入 argv/日志/存储,用后即删,stderr 自动脱敏)。

测试:https-only/loopback/URL 内凭据/未知操作/PR 缺 base 拒绝;fetch+fast-forward pull 端到端(本地 bare 远端);push 新分支成功、已存在分支默认拒绝;credential 按名解析与输出脱敏。
PRClient:仅 github.com、Bearer token 引用、响应 ≤64KiB、401/403 rate limit/422/404 可解释错误、收据仅 URL/number/state/title。RemoteOperation 移入 gitmutation 包供 store 复用;run 事件 git.remote_completed 常量。
schema v107 git_remote_operations:operation key 幂等、request_fingerprint 绑定 Run/Workspace/host/port/protocol/branch、凭据名称不入库、receipt 脱敏、git.remote_completed run 事件。GitRemoteService:ValidateSpec → 台账 → ExecuteGit(hardened askpass 路径)或 PRClient(Bearer token 引用)→ Complete + 事件。RemoteRecord/PRNumber 类型共享重构。
CLI cyberagent git-remote(先审阅 remote/branch/TTL/PR 元数据,--confirm 执行 + 脱敏收据)。PRClient httptest 错误矩阵(201/401/403 限流/403 权限/422/404 + Bearer 断言);service 端到端(create_pr + credential 按名引用:secret/名称不进 spec JSON 与 run 事件,断言验证)。ADR 0109 与 usage 文档。
CLI cyberagent git-remote(先审阅 remote/branch/TTL/PR 元数据,--confirm 执行 + 脱敏收据)。PRClient httptest 错误矩阵(201/401/403 限流/403 权限/422/404 + Bearer 断言);service 端到端(create_pr + credential 按名引用:secret/名称不进 spec JSON 与 run 事件,断言验证)。ADR 0109 与 usage 文档。
@Qiyuanqiii
Qiyuanqiii force-pushed the codex/issue-45-remote-git-pr branch from 4d2f46e to 8288c85 Compare August 16, 2026 08:40
@Qiyuanqiii
Qiyuanqiii merged commit fa6eca1 into main Aug 16, 2026
5 checks passed
@Qiyuanqiii
Qiyuanqiii deleted the codex/issue-45-remote-git-pr branch August 16, 2026 08:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat(git): 远端 Git、Pull Request 与凭证/网络授权

1 participant