feat: P1 补齐(自动评审队列、自动化+分诊、并发 caps、运行时审批队列)

This commit is contained in:
host committed 2026-10-27 15:53:50 +08:00
1 parent 29efc6c61f
commit e0cecd70aa
18 files changed
+3474 -27

No files matched your search

+47
View File
@@ -511,6 +511,18 @@ class Server:
raise RuntimeError(f"thread/resume 失败: {resp}")
return resp["result"]
def start_review(self, thread_id, target, timeout=600):
# 协议 review/start:params 必填 threadId 与 target,
# target 四种见 protocol v2 的 ReviewTarget(uncommitted
# Changes / baseBranch / commit / custom);delivery 缺
# 省即 inline,不发 detached(已废弃)。失败直接抛错,
# 调用方不得把 error 响应当成功打印。
params = {"threadId": thread_id, "target": target}
resp = self.request("review/start", params, timeout=timeout)
if not resp or "error" in resp:
raise RuntimeError(f"review/start 失败: {resp}")
return resp["result"]
def fork_thread(self, thread_id, cwd=None, sandbox=None):
params = {"threadId": thread_id}
if cwd:
@@ -2012,6 +2024,13 @@ def main():
p = sub.add_parser("archive"); p.add_argument("--task", required=True)
p = sub.add_parser("fork"); p.add_argument("--task", required=True); p.add_argument("--name", required=True); p.add_argument("--sandbox", default=None)
p = sub.add_parser("compact"); p.add_argument("--task", required=True)
p = sub.add_parser("code-review"); p.add_argument("--task", required=True)
p.add_argument("--base-branch", default=None,
help="评审目标:与该分支的差异(baseBranch)")
p.add_argument("--commit", default=None,
help="评审目标:指定提交 sha(commit)")
p.add_argument("--instructions", default=None,
help="评审目标:自定义评审指令(custom)")
p = sub.add_parser("run"); p.add_argument("--task", required=True); p.add_argument("--prompt", required=True)
p = sub.add_parser("interrupt"); p.add_argument("--task", required=True)
p = sub.add_parser("delegate")
@@ -2460,6 +2479,34 @@ def main():
resp = srv.request("thread/compact/start",
{"threadId": t["thread_id"]}, timeout=120)
print(f"compact {args.task}: {resp}")
elif args.cmd == "code-review":
# 注意命名:host.py 已有另一条线的 review 子命令
# (PR 评审评论),本命令换名 code-review,不覆盖它。
# 目标优先级:commit > instructions > base-branch >
# 缺省 uncommittedChanges;与 cloud/review.py 的
# build_review_target 同款组合,非法组合直接报错。
# compact 同款原因先 resume 再 review(未加载的旧
# thread 直接 review 会报 thread not found)。
# app-server 返回 error 时只打印失败并以非零退出,
# 绝不把失败结果当成评审结论。
t = state["tasks"][args.task]
if args.commit:
target = {"type": "commit", "sha": args.commit}
elif args.instructions:
target = {"type": "custom",
"instructions": args.instructions}
elif args.base_branch:
target = {"type": "baseBranch",
"branch": args.base_branch}
else:
target = {"type": "uncommittedChanges"}
try:
srv.resume_thread(t["thread_id"])
result = srv.start_review(t["thread_id"], target)
except Exception as exc:
print(f"code-review failed: {exc}")
raise SystemExit(1)
print(f"code-review {args.task}: {result}")
elif args.cmd == "archive":
t = state["tasks"][args.task]
srv.archive_thread(t["thread_id"])