---
name: sync-cliproxy-core
description: 同步或审计 ccLoad 的 CLIProxyAPI 核心与已登记 provider adapter 快照。适用于上游版本对齐，不用于普通渠道配置或独立业务修复。
---

# 同步 CLIProxy 转换核心与渠道适配器

一次同步 CLIProxyAPI 的四协议纯转换核心、已登记 provider adapters 及其对应测试。保持 ccLoad Registry 和 provider wire 契约，不引入上游运行时系统。

- 默认调用 `$sync-cliproxy-core` 时，自动固定上游最新稳定版本，并在同一次操作中完成 core 与全部已登记 provider adapters 的比较、集成、来源更新和验证；用户明确指定 commit/tag 时使用指定目标。
- 仅审计时保持只读：固定比较目标、核对来源与 manifest、报告差异和验证结果，不进入集成变更或更新来源步骤；未指定比较目标时使用 `UPSTREAM.md` 已记录的 commit。
- 阅读或编辑本技能本身不执行同步。

## 原子同步契约

- core 与 provider adapters 必须来自同一 checkout 的同一不可变 commit；只生成一份变化清单，只更新一次来源 commit 和同步日期，只运行一套完成验证。
- 任一同步域无法移植、缺少匹配测试或验证失败时，整个同步未完成。不提供隐式 core-only 降级；用户明确缩小范围时只能审计，不得把部分写入报告成完整同步。

## 权威边界

1. 按任务读取 [协议转换边界](../../../.claude/agent-guide/protocol.md)、`internal/protocol/cliproxy/UPSTREAM.md`、[core snapshot manifest](references/core-snapshot.manifest)、[provider adapter 语义边界](references/provider-adapters.md)和[provider manifest](references/provider-adapters.manifest)。`UPSTREAM.md` 是来源、固定提交和已落地状态的唯一事实源；core manifest 记录直接映射根、特殊映射、明确排除和最近一次 core/provider 原子差异的审查 blob，provider manifest 是 provider、逐文件映射、生产接线和契约测试的唯一 allowlist。
2. `internal/protocol/registry.go` 定义四协议契约；`internal/protocol/builtin/cliproxy_adapter.go` 处理通用输入验证、JSON/SSE 规范化和流帧封装；`internal/protocol/cliproxy/providers/` 保存 provider-specific 纯转换。
3. provider 选择留在 ccLoad 请求上下文边界，按实际 wire dialect/AuthType 决定；不要把 provider 注册成第五种通用客户端协议。
4. 不引入 CLIProxyAPI 的认证、配置、路由、缓存服务、插件、动态 Registry、executor 或网络刷新代码。Interactions 只有在 ccLoad 正式支持其线协议后才可登记。
5. 不添加 CLIProxyAPI 运行时 Go module 依赖或 `replace`。源码继续使用 `ccLoad/internal/protocol/cliproxy/...` 导入路径。
6. Registry 与 provider 边界测试是 ccLoad 兼容性权威。上游行为与本地线协议冲突时，修正根因并保留本地契约，不盲目覆盖。

## 同步流程

### 1. 预检

- 确认当前目录属于 ccLoad，并检查 `git status --short`。
- 保护已有修改。若工作区改动覆盖 core、providers、适配器、Registry、`go.mod`、`go.sum` 或 `UPSTREAM.md`，先区分用户修改与本次同步；无法安全隔离时停止并说明冲突。
- 记录当前同步 commit 和目标 commit。

### 2. 固定目标

- 上游 checkout：本机存在 `~/Source/go/CLIProxyAPI` 时优先使用，否则在临时目录克隆 `UPSTREAM.md` 记录的仓库。core、provider 生产源码与测试必须全部来自这个 checkout 的同一个 commit。
- 用户指定 commit/tag 时，解析成完整不可变 commit SHA。
- 用户未指定目标或只说“同步最新”时，以当前记录 tag 去掉 `MAJOR.MINOR.PATCH` 后的前缀作为稳定 tag 系列（记录为 `fork/vX.Y.Z` 时系列为 `fork/v`），按语义版本选最高版本并解引用为 commit；忽略预发布 tag，禁止按字典序或提交时间猜版本：

```bash
repo=<UPSTREAM.md 的 Repository>; series=<tag 系列>; upstream=<上游 checkout>
tag="$(git ls-remote --tags --refs "$repo" "refs/tags/${series}*" | sed 's#.*refs/tags/##' \
  | grep -E "^${series}[0-9]+\.[0-9]+\.[0-9]+$" | sort -V | tail -1)"
git -C "$upstream" fetch --no-tags "$repo" "refs/tags/$tag:refs/tags/$tag"
git -C "$upstream" rev-parse "$tag^{commit}"
```

- 记录并同步解引用后的 commit，而不是 annotated tag object；报告目标和变化范围后直接继续，不等待确认。无法确定 tag 系列、找不到稳定 tag 或 tag 无法解析为 commit 时停止并说明原因，禁止退回到浮动分支 HEAD。
- 若目标 SHA 与当前同步 SHA 相同，不改写 `UPSTREAM.md` 的同步日期；运行确定性审计和验证后报告已是最新版本。

### 3. 比较范围

- 一次生成目标 commit 相对当前记录 commit 的联合差异：四协议 core、allowlist 中每个 provider 的生产源码及对应 `_test.go`，不要分两次比较。
- 先生成目录级和文件级变化清单，再确认新增文件是纯转换语义。provider 的 `init.go`、动态 Registry 和 noop/分配实现测试按 allowlist 排除。
- 每个上游 core 变更必须由 core manifest 分类为直接映射、特殊映射、明确删除、明确排除或已登记 provider。新增 core 源根或本地特例时更新 core manifest；上游删除已同步文件时登记 `delete` 行并删除本地映射；新增 provider 时更新 provider manifest、语义边界和 `UPSTREAM.md`。脚本只从 manifest 读取这些清单，不复制第二份。审计失败不能靠跳过检查解决。
- 明确列出排除的上游包。不要因为编译缺失就搬入 runtime；删除副作用依赖，或在同步包内用已有纯 `common`/`signature`/`util` 能力替代。
- 上游删除字段注入时，确认行为是否迁移到被排除的 runtime 层；若是，必须在本地转换边界保留，并用 Registry 契约测试验证。
- 复查 `UPSTREAM.md` 已排除项的排除理由是否仍成立：上游重构可能使旧理由失效（该同步的补回来），也可能采纳了本地契约（删掉过期的本地差异注记）。

### 4. 集成变更

- 以可审查的小批次应用源码，但把所有批次视为一个原子同步结果。
- 将上游 import 改为本地 `ccLoad/internal/protocol/cliproxy/...`。
- 将通用传输适配留在 `builtin/cliproxy_adapter.go`，provider envelope/字段补全留在 `providers/<provider>`；只有通用协议语义需要时才修改 core。
- 确保每个同步的 provider adapter 被生产请求路径实际调用，不能只复制成死代码。
- 对工具调用 ID、reasoning/signature、usage/cache、JSON 字段形状、错误 envelope、SSE framing/终止事件和跨 chunk 状态逐项核对 core 与 provider 契约。
- 无法表示的客户端请求继续返回 `RequestTranslationError`，由代理映射为 HTTP 400；不得触发渠道切换或冷却。

### 5. 更新来源记录

- 只有 core 和全部已登记 provider 的生产源码、对应测试、生产接线都完成后，才一次性更新 `internal/protocol/cliproxy/UPSTREAM.md` 的完整 commit、标签说明和同步日期。
- 逐文件审完差异后，用脚本重算 core manifest 的全部 blob 行，不要手算：

```bash
bash .agents/skills/sync-cliproxy-core/scripts/verify_core_scope.sh --refresh-manifest \
  --upstream-repo <上游 checkout> --base-commit <原同步 commit> --target-commit <目标 commit>
```

  它按 base..target 重建 review 块，刷新 `file`/`local` 行 blob，并删除差异范围外的旧 `delete`/`skip-test` 行。只要还有未归类的上游文件、未登记的上游删除或缺失的映射文件，就逐条输出 `TODO` 并拒绝写入。它只负责记账，不代替审查：`delete`、`skip-test`、`exclude` 行及其理由仍需人工填写，写入后检查 `git diff`。
- 两次同步之间若修改了被 blob 固定的快照文件，用 manifest 中 `# Reviewed atomic delta: <base> -> <target>.` 记录的两个 commit 重跑同一命令。
- 在 `UPSTREAM.md` 分别记录 core 与 provider 的上游源目录、本地目录和实际落地状态；逐文件事实和本次差异审查 blob 只保留在 manifest，二者共享同一个 commit/date。
- 保留 `internal/protocol/cliproxy/LICENSE`。许可证或上游归属变化必须显式审查。
- 不在 Skill 中复制 commit、日期或测试数量；这些易变事实只写入 `UPSTREAM.md`。

### 6. 验证

先运行确定性审计：

```bash
bash .agents/skills/sync-cliproxy-core/scripts/verify_core_scope.sh --self-test
bash .agents/skills/sync-cliproxy-core/scripts/verify.sh --tests --require-providers \
  --upstream-repo <上游 checkout> \
  --base-commit <原同步 commit>
```

`--require-providers` 是完整同步的完成门禁，必须同时给出 `--upstream-repo` 和完整的 `--base-commit`。base 必须等于 Git `HEAD` 中修改前 `UPSTREAM.md` 记录的 SHA。脚本据此强制检查 base 到目标之间的每个 core/provider 变更：必须已映射、删除或明确排除，review blob 必须最新，新增的上游测试符号必须已移植或登记为 `skip-test`，allowlist provider 必须全部落地。base 等于目标时，只做目标树、review blob 和 provider 的确定性审计。日常审计可以省略这些参数，但不得据此报告完整同步成功。

完成同步后运行仓库级检查；只读审计根据实际审计范围选择相关检查：

```bash
go test -tags sonic ./internal/...
make build
golangci-lint run ./...
git diff --check
```

只在并发相关代码受影响时运行 `make race-fast` 或 `make race`。根据最终差异更新 `.claude/agent-guide/` 中受影响的专题及必要的 `README.md` / `README.zh-CN.md`、`docs/guide/`；只有通用约束或入口变化才修改 `CLAUDE.md`。

## 完成报告

报告以下事实：

- 原同步 commit、目标 commit 和上游 checkout；
- 同一次同步覆盖的 core、provider 目录/文件与明确排除的上游模块；
- 为维持 ccLoad Registry/provider wire contract 保留或新增的本地差异；
- `UPSTREAM.md`、许可证和相关项目文档是否更新；
- 每条验证命令的结果。
