@crvouga/mockingbird-service-github (英语)
本地模拟器。 真正的API合同. 部分 嘲笑鸟。 。 。 .
WIP GitHub REST 模拟器 X-GitHub-Api-Version: 2026-03-10。 。 。 .
仓库观察、承诺支持的参考资料和同一仓库拉动请求
已执行创建/获取/列表/更新。 不支持的特性返回模拟器 - 只返回 501.
API 证据.md 针入源并区分研究
运行时间验证 . 支助 由合同产生.
安装
bun add @crvouga/mockingbird-service-github
API 密码
便携式进口 GitHubAPI, (中文(简体) ), createRuntime, (中文(简体) ), prepareFixtures, (中文(简体) ), GITHUB_NAMESPACE, (中文(简体) ),
GITHUB_API_VERSION, (中文(简体) ), document, (中文(简体) ), operationIds,以及 supportedOperationIds。 。 。 .
类型包括: GitHubAPIOptions, (中文(简体) ), GitHubRuntime, (中文(简体) ), GitHubRuntimeOptions, (中文(简体) ),
GitHubFixtures, (中文(简体) ), PreparedGitHubFixtures, (中文(简体) ),
Repository, (中文(简体) ), Commit, (中文(简体) ), PullRequest, (中文(简体) ), OperationId,以及 SupportedOperationId。 。 。 .
只有节点 /server 进口 createServer, (中文(简体) ), DEFAULT_PORT, (中文(简体) ), serveTarget, (中文(简体) ),
GitHubServerOptions,以及 GitHubServer可执行文件是 mockingbird-github。 。 。 .
prepareFixtures(input) 生成带有 WebCrypto 的合成 App 私钥。 传过来
fixtures 改为 createRuntime 和使用情况 generatedPrivateKeys 在测试的 JWT 签名器中; 提供了
该列表中不包括密钥。 重新使用已准备好的固定装置保留了整个重置的特性.
运行时间 mount(prefix) 将它的获取和请求方法处理器嵌入到应用程序源头.
国家行动倡议接受 --fixtures <json-file> 财务报告和审定财务报表 --base-url <url>; 机队条目也接受内置
固定装置。 见 设置示例。 。 。 .
使用量
示例使用官员 @octokit/rest SDK(22.0.1) (英语).
import { Octokit } from "@octokit/rest"
import { createRuntime } from "@crvouga/mockingbird-service-github"
// Test setup: the emulator, seeded with a synthetic repository and commit graph.
const emulator = createRuntime({ seed: 42 })
await emulator.fetch(new Request("http://github.mock/__admin/github/repositories", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({
owner: "synthetic-org", name: "example", default_branch: "main",
commits: [
{ sha: "a".repeat(40), parents: [] },
{ sha: "b".repeat(40), parents: ["a".repeat(40)] },
],
branches: { main: "a".repeat(40) },
}),
}))
// The app's own Octokit. Only its fetch changes: requests reach the emulator
// in this process instead of api.github.com.
const octokit = new Octokit({
request: { fetch: (url: string, init: RequestInit) => emulator.fetch(new Request(url, init)) },
})
const repo = { owner: "synthetic-org", repo: "example" }
const { data: repository } = await octokit.rest.repos.get(repo)
console.log(repository.full_name) // "synthetic-org/example"
// Publish a synthetic branch and PR.
const branch = await octokit.rest.git.createRef({ ...repo, ref: "refs/heads/topic", sha: "b".repeat(40) })
console.log(branch.status) // 201
const { status, data: pr } = await octokit.rest.pulls.create({
...repo, title: "Synthetic change", head: "topic", base: "main", body: "Description",
})
console.log(status, pr.number) // 201, 1
const lookup = await octokit.rest.pulls.list({ ...repo, head: "synthetic-org:topic", base: "main", state: "open" })
console.log(lookup.data[0]?.number === pr.number) // true
const edited = await octokit.rest.pulls.update({ ...repo, pull_number: pr.number, body: "" })
console.log(edited.data.body === null) // true
以上所有请求都停留在本地获取运行时间内 。 分支目标必须 已经存在于合成承诺图中;这不是Git推.
createRuntime 添加健康、 命名空间、 时钟、 范围缺陷、 编辑请求
日记和共享时间线。 选择命名空间 x-mockingbird-namespace
或者说 /__admin/ns/<name>/... 根据种子和供应商的要求, 重置删除
寄存器、 拥有者、 父系和分支状态
和错误设置保留其共享运行时间寿命。 恢复检查点
所有存储的提供者状态通过共享的时间线.
GitHubAPI 是便携式的仅供货商获取/霍诺条目; createServer 从
@crvouga/mockingbird-service-github/server 显示节点 HTTP并返回 a
close 函数。 程序服务器默认为电子回路端口 .
CLI是: 校对: mockingbird-github serve --port 8828。 。 。 .
合成设置和边界
POST /__admin/github/repositories 接受所有者/ 名称, 可选 private 财务报告和审定财务报表
default_branch页:1 commits 小写 40-hex SHA/父母记录和 a
branches 种子 SHA 的分支名称地图 。 犯罪/犯罪导致
空合成库. 每个母体和分支目标必须被播种;周期,
重复和不空分支图中缺失的默认分支被拒绝.
在突变前完成验证; 无法覆盖现有寄存器
由这个控制。 使用新的命名空间或重置不同的固定区域 .
这些是模拟器固定约束,而不是GitHub REST请求规则.
种子只创建组织所有者. 同所有者仓库共享所有者 身份证明 Repository 搜索是大小写不敏感; 分支名称保存大小写 . 只有身份、所有权、能见度、默认分支、URL和时间戳 返回;寄存器设置、统计、权限和完整的上游响应 保险没有索赔。 丢失的寄存器返回一个提供者形状的404. 没有实施基于证书的命名空间绘图或授权政策.
选定的 API 版本返回到 x-github-api-version-selected. 弃权
请求头选择此模拟器的 2026-03- 10 合同, 不同于 GitHub 当前
2022-11-28 默认. 其他版本只返回模拟器 501,而非声称的提供者
错误。 这是一个明确的单版模拟器.
没有Git运输,真正的承诺创建, 象征性发行,GitHub App身份, 分支保护、存储规则、合并执行或发送通知是 提供。 种子祖先不能证明一个真正的寄存器的内容. 没有 增加了预期的 " SHA " 或普遍拉动要求的 " 能力 " 保障. 只使用合成固定名称; 日记记录省略正文和证书/查询 数值。 软件包测试不需要 GitHub 账户或网络服务.
参考资料
GET /repos/{owner}/{repo}/git/ref/heads/topic/nested 读取准确的注释;
GET .../git/matching-refs/heads/topic 返回前缀匹配。 关闭后缀
(有或无后继斜线)列出所有合成回放. 姓名对案件有敏感认识;
所有者/仓库的查询仍然对案件不敏感。 匹配的参考文献按全名排序.
创建方式 POST .../git/refs 财务报告和审定财务报表 { "ref": "refs/heads/topic", "sha": "<seeded SHA>" }。 。 。 .
更新方式 PATCH .../git/refs/heads/topic 财务报告和审定财务报表 { "sha": "<seeded SHA>" }。 。 。 .
默认 force: false 需要变异时从头流出祖先.
force: true 允许合成非快向前更新; 它从不引用 Git 或
GitHub (英语). 未知的字段不授予预期的SHA租约或一能.
只有承诺支持的引用被建模;注释标记对象和提供者管理 拉调校对不支持 。 与成功调试操作和 一个非快速前进的422信封。 其他错误措辞、条件/状态映射和 验证优先级仍为临时;参见 API EVIDEENCE.md.
调取请求
创建方式 POST /repos/{owner}/{repo}/pulls 和标题、头分支和基分支:
{ "title": "Synthetic change", "head": "topic", "base": "main" }。 。 。 .
两个分支必须存在 并且头部必须包含种子 祖先离开
基础。 接受拥有者资格的同级仓库主管;交叉仓库主管
和发行转换是明确的501限制。 没有发出通知.
读取 GET .../pulls/{number} 或列表 GET .../pulls列表支持状态
(单位:千美元)open 默认, closed, (中文(简体) ), all, (中文(简体) ), head=owner:branch,基础,创建/更新排序,
方向、 页面( 默认 1) 和 per page( 默认 30, 夹住 100) 。 跟踪链接关系;
过滤器和清晰的命名空间头/路径选择在 Pagination 存活. 继续
如果您选择了时光线分支, 则发送共享历史/ 分支标题 。 大众性
和长跑类还原501,因为评论/活动没有被建模.
更新标题、正文、 基础、 状态和维护者 可用 PATCH .../pulls/{number}。 。 。 .
空体字符串清除描述并返回为无效 。 头不是更新字段 。 数字
c. 保持稳定。 减少的响应包括:
头名/基名,仓库身份和SHA. 打开 PR 解析当前分支提示 ;
关闭的公关保留最后抓取的提示,直到明确更新。 PR 时间戳
音轨创建/更新呼叫,而非背景提供者事件。 合并和合并
执行SHA无效;合并后不成立。 作者身份,评论,标签,
没有模拟审查、合并执行和提供者事件传播.
同一头/基产量的公开PR 422,并附有拉活请求/海关验证 错误。 消费者-私营业务ID和Idepotency-Key从未造成重复. 如果丢失了响应, 请逐行列出首页/ 基准, 然后检索匹配 数字; 重试创建可以产生重复错误。 受限活的神谕 在API版本2026-03-10中确认了这个相同的存储器复制信封. 见API EVIDENCE.md 对于未经测试的案例和出错-先入后出的差距.
出版过失设想
激活命名空间扫描预设 POST /__admin/faults 与
{ "preset": "github_pr_create_accepted_drop" }列表预设
GET /__admin/faults/presets。现有的共享断层覆盖可以缩小
操作/路径,在选定计数后改变响应或退休.
github_pr_create_accepted_drop, (中文(简体) ),github_pr_update_accepted_drop, (中文(简体) ),github_ref_create_accepted_drop, (中文(简体) ),github_ref_update_accepted_drop下一个 匹配请求达到正常验证。 只有一个成功的突变 接受、检查和随后撤回答复。 无效的请求 保留他们的普通错误 并使用一发规则。 进程获取 用 TypeError 拒绝; 节点 HTTP 适配器关闭连接 。 回收 通过提供者读取;重试一个创建可能返回重复错误.github_unavailable: 1,503 为4个写作操作中的每个操作进行突变前.github_denied: 1 403 有脚本集成- 拒绝写入每封信 操作。 这不检查证书,也不评估许可/规则.github_rate_limited: 每笔操作一次二级限值429, 重试- 60后 和一个合成的剩余数。 静态信头练习客户端反向; 在那里 没有自动配额引擎、定时器驱动的过期,或声称每个 GitHub 比率限制有这种状态/消息/标题组合.
接受日记条目记录 accepted检查站和参考/PR号码
元数据,即使响应状态为 0。 尸体被略去。 错误设置随之而来
共享运行时间寿命, 不会被提供者状态的检出重接 .
做一个单独的演员,打电话 POST /__admin/github/refs/move 与
{ "owner": "synthetic-org", "repo": "example", "ref": "refs/heads/topic", "sha": "<seeded SHA>" }
在客户端读写之间 此模拟器唯一的控制需要已有的
分支和种子快速前进的目标, 创建一个单独的检查站
返回时 simulated: true。它不能创建 refs 、 强制重写或变异另一个
名称空间。 无效的控制使状态/历史保持不变。 随后的写法使用
当前的提示的先祖; 仅停留观察不能成为拒绝的理由.
这种控制模型相互分离,而不是原子出版或真正的分支执行.
当地合同核查
bun test 包括所有9个行动的种子自我均等和成功
进行行动反应检查。 一个有意的、有计划有效的存储库
观测结果必须低于对等参照数。 这些都是两个孤立的模拟实例;
自平不是GitHub与此执行匹配的证据.
test/node-consumer.mjs 使用本地节点HTTP和字面公共合同反对
已建本地服务器。 它在套接字丢失后回收 PR , 观察到重复
跟踪超过31P的Pagination, 检查干扰的Ref运动
不使用 CAS , 并使用逻辑测试时钟从 Retry- After 重试 .
它不进口供货商或国家助手。 之前运行软件包构建
直接运行这个消费者。 它只创造当地固定资源.
对等元数据可以实现所有9个操作;4个写法是标记不安全的 需要明确纳入。 实际提供者的比较仍然需要 单独的有限度的甲骨文和明确的可支配资源授权。 WIP 状态 直至独立的相容性证据支持更强有力的主张.
确定现场证据和出版限额
单独批准的2026-09-29甲骨文核查与12个对照
修复其中发现的空体更新不匹配后的所有9个操作
首先运行。 每次运行关闭了固定的PR并删除了两个不变的固定
分支;关闭的PR历史和Git对象依然存在. 赛跑者只能使用
在寄存器检出中; 参见
甲骨文指南。 。 。 .
它需要经过审查的清楚明了的书面/通知/清理批准,
加号 MOCKINGBIRD_GITHUB_TOKEN 或明确选定的认证 gh 用途.
普通的包件测试从不引用.
这一证据涵盖选定的身份/状态/ref/PR字段和两个出错案件. 它没有建立完整的上游反应计划, 所有验证优先, 现场多页行为、实际利率配额或真正的网络损失担保。 这个 软件包残存 妇女脚本拒绝的回复不能证明GitHub App的身份, 符号权限、分支保护或规则。 没有吉特运输或 代号签发,无预期的旧SHA比较和扫描,无原子交易 包括参考文献和公关出版物。 消费者协调政策 跨组成部分倡议的接受程度仍处在这一模拟器之外.