caidaoli / sync-cliproxy-core
同步或审计 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 降级;用户明确缩小范围时只能审计,不得把部分写入报告成完整同步。
权威边界
- 按任务读取 [协议转换边界](../../../.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。 internal/protocol/registry.go定义四协议契约;internal/protocol/builtin/cliproxy_adapter.go处理通用输入验证、JSON/SSE 规范化和流帧封装;internal/protocol/cliproxy/providers/保存 provider-specific 纯转换。- provider 选择留在 ccLoad 请求上下文边界,按实际 wire dialect/AuthType 决定;不要把 provider 注册成第五种通用客户端协议。
- 不引入 CLIProxyAPI 的认证、配置、路由、缓存服务、插件、动态 Registry、executor 或网络刷新代码。Interactions 只有在 ccLoad 正式支持其线协议后才可登记。
- 不添加 CLIProxyAPI 运行时 Go module 依赖或
replace。源码继续使用ccLoad/internal/protocol/cliproxy/...导入路径。 - 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,禁止按字典序或提交时间猜版本:
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 .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 .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 的确定性审计。日常审计可以省略这些参数,但不得据此报告完整同步成功。
完成同步后运行仓库级检查;只读审计根据实际审计范围选择相关检查:
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、许可证和相关项目文档是否更新;- 每条验证命令的结果。