Skip to main content
An account and its organization, the repositories in them, the issues and pull requests in those, the conversation on top, and the Projects v2 boards they sit on. Both surfaces answer: the REST API and POST /graphql, which is the only place Projects v2 exists. The conformance suite drives the twin through octokit 5.0.5, the SDK GitHub publishes, against REST API version 2022-11-28. GitHub publishes no Python client, so there is no Python target. Slug: github

What it models

The account, one collaborator, the organization and one repository are the same in every container, so a seed plan can name them before any container exists: twinbay owns everything, hubot is the one assignable collaborator, twinbay-labs is the organization both belong to, and twinbay/sandbox is a repository with GitHub’s nine default labels and a main branch. The sandbox numbers whatever you create afterwards. Advancing opens whichever rate-limit window had anything spent in it, and settles the mergeability of every open pull request, which GitHub computes in the background.

Scenarios

busy-repository, pull-request-in-review, merge-conflict, organization-workspace, project-board, archived-repository, issues-disabled, locked-issue, rate-limited-token.

Not modelled

Actions, releases, webhooks, gists, search, teams, reviews and review comments, and git data beyond the one route that creates a branch. Four refusals are worth naming, because each one is a route or field GitHub has and the twin declines on purpose: GET /graphql, which is a full schema introspection on the live API; a pull request’s files and commits, because there is no git here to diff; editing or labelling a pull request through the issue routes; and setting a project field value, or a board owned by anything but the organization. An unmodelled route answers 501 in GitHub’s own envelope, and an unmodelled GraphQL field answers 501 with extensions.code: "notModelled" rather than null.