Origin 镜像迁移 API
以用户权限重试初始同步、查询迁移状态,或永久解除上游镜像。
Migration API 由运营人员以 Cursor 用户身份调用,不是 Origin App 接口。可以使用 origin auth login 或通过 origin api 提供 Cursor API key;基础地址是 https://api.cursor.com/v1/origin。产品仍为 early beta,更新集成时核对官方 OpenAPI。
权限和接口
| 接口(基础路径之后) | 权限与用途 |
|---|---|
POST /repos/{ownerSlug}/{repoName}/mirror:transition | repository:mirror:write,重试镜像初始同步 |
DELETE /repos/{ownerSlug}/{repoName}/mirror | repository:mirror:delete,需要 Admin,永久 detach |
GET /repos/{ownerSlug}/{repoName}/mirror/transition-jobs/{jobId} | repository:mirror:read,读取指定 job |
GET /repos/{ownerSlug}/{repoName}/mirror/transition-jobs:active | 同上,读取 activeJob 和 lastJob |
用户还必须管理上游 GitHub 仓库。App 不能请求 write/delete scope,也不能调用这些迁移端点;App 的 mirror:read 仅用于 Get Repo 的 mirror 字段。
重试初始同步
Transition 请求体的当前支持值是 {"transition":"initial_to_inbound"}。起始状态不符合要求或已经有活跃 job 会返回 FailedPrecondition / HTTP 400;没有上游管理权限返回 403。响应含 repository 和 job,需继续查询后续状态。
完成判断看 status,不要硬匹配 phase:阶段未来可增加。官方字段列出 queued、running、succeeded、failed_rolled_back、requires_attention、superseded;后三种中的 requires_attention 需人工介入,succeeded、failed_rolled_back、superseded 为终态。
官方样例另将 failed_rolled_back 写成 failed-rolled-back,与枚举不一致。实现时以当前 schema 与实际响应核实,不直接把样例字符串写死。active 查询两个字段都可缺省;activeJob 消失后看 lastJob 判断结束结果,空对象也可能只是从未运行过。
解除镜像
Detach 保留当前仓库内容并变成原生仓库,停止双向同步;部署 key 保留但不使用。对 inbound 仓库会等待正在进行的最后 fetch,最多两分钟,以免覆盖解除后的新推送。
fetch 失败、远端无法解析、超时等会返回错误并保留镜像状态;上游 App 安装已消失/暂停或 GitHub 仓库不存在时可不做最后 fetch。成功返回 204、无响应体。
该 API 无法反向恢复 detach。重复解除已 detached 仓库无效果且成功;从未有镜像、或与其他状态修改竞争则可能返回 FailedPrecondition。调用前应明确这是永久改变同步关系的操作。