@volter/twin-github 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +80 -0
- package/client/github-mirror.css +958 -0
- package/client/github-mirror.tsx +1513 -0
- package/package.json +73 -0
- package/src/cli.ts +40 -0
- package/src/github-capabilities.ts +2144 -0
- package/src/github-conformance.ts +94 -0
- package/src/github-connector.ts +644 -0
- package/src/github-events.ts +95 -0
- package/src/github-graphql.ts +187 -0
- package/src/github-mirror-ui.ts +416 -0
- package/src/github-server.ts +35 -0
- package/src/github-twin.ts +6568 -0
- package/src/github-ui-conformance.ts +112 -0
- package/src/github-ui-structure.ts +256 -0
- package/src/index.ts +23 -0
- package/test-fixtures/github-a11y-reference.pr-list.json +1447 -0
- package/test-fixtures/github-comment-schema.json +702 -0
- package/test-fixtures/github-known-deviations.json +95 -0
- package/test-fixtures/github-openapi-operations.json +110 -0
- package/test-fixtures/github-pull-schema.json +3601 -0
- package/test-fixtures/github-review-schema.json +236 -0
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
{
|
|
2
|
+
"_doc": "Declared evidence-twin scope: GitHub fields the twin does NOT model, each with a reason. Applies to ALL GitHub objects the twin serves (pull_request, pull_request_review, review-comment, pull-file, pull-commit, label, assignee, issue, issue_comment, commit_status, check_run, milestone, requested_reviewer, issue cross-reference event) — the shared gaps (node_id, _links, author_association) are unmodeled identically across them. Object-specific gaps are namespaced (label.*, assignee.*, reviewComment.*, pullFile.*, pullCommit.*, status.*, checkRun.*, milestone.*, requestedReviewer.*, issueEvent.*). The spec-conformance gate (github-conformance.ts) treats a missing-required field as a BUG unless it is declared here, so 'what we don't serve' is explicit and reviewable, not silently absent. See github-twin.ts header: the `github` world is an EVIDENCE mirror (metadata), not a content mirror. A trailing `.*` covers a whole unmodeled sub-object. NOTE: issues, commit statuses, check runs, and milestones are LOCAL simulator/fork constructs (no observed evidence fold — observed PR evidence never carries CI/checks/milestones/review-requests) and have no vendored conformance schema yet, so those objects are not run through the spec gate; their simplifications below are recorded for honesty.",
|
|
3
|
+
"deviations": [
|
|
4
|
+
{ "path": "issue.id", "kind": "missing-required", "reason": "issue object: no real GitHub integer id is observed on pull (the issue body carries number/title/body/state); a fabricated id would be invented" },
|
|
5
|
+
{ "path": "issue.node_id", "kind": "missing-required", "reason": "no real GraphQL node id for a local issue" },
|
|
6
|
+
{ "path": "issue.user", "kind": "missing-required", "reason": "issue author not modeled; a synthetic simple-user would fabricate a login/id" },
|
|
7
|
+
{ "path": "issue.reactions", "kind": "missing-required", "reason": "reaction rollup not modeled by the local issue construct" },
|
|
8
|
+
{ "path": "issue.timeline_url", "kind": "missing-required", "reason": "timeline hypermedia not modeled" },
|
|
9
|
+
{ "path": "id", "kind": "missing-required", "reason": "PR object: evidence mirror has no real GitHub id (reviews/comments DO emit an integer id from the local sequence)" },
|
|
10
|
+
{ "path": "node_id", "kind": "missing-required", "reason": "no real GraphQL node id observed (applies to PR, review, comment)" },
|
|
11
|
+
{ "path": "created_at", "kind": "missing-required", "reason": "observed PR-evidence events do not carry PR creation timestamps" },
|
|
12
|
+
{ "path": "updated_at", "kind": "missing-required", "reason": "see created_at — no PR timestamps in evidence" },
|
|
13
|
+
{ "path": "title", "kind": "missing-required", "reason": "title IS folded on pull (content mirror) and on local writes; declared only for the edge case of a PR that surfaced solely via a review/comment reference (no PR-list entry), which has no title to emit" },
|
|
14
|
+
{ "path": "user.*", "kind": "missing-required", "reason": "evidence does not identify the PR author; a synthetic simple-user would fabricate a login/id" },
|
|
15
|
+
{ "path": "user", "kind": "missing-required", "reason": "PR author not modeled (see user.*)" },
|
|
16
|
+
{ "path": "_links.*", "kind": "missing-required", "reason": "hypermedia _links block not modeled by the evidence twin" },
|
|
17
|
+
{ "path": "_links", "kind": "missing-required", "reason": "see _links.*" },
|
|
18
|
+
{ "path": "author_association", "kind": "missing-required", "reason": "author relationship to repo not observed" },
|
|
19
|
+
{ "path": "mergeable_state", "kind": "missing-required", "reason": "mergeability is a live-computed GitHub field, not observable evidence" },
|
|
20
|
+
{ "path": "merged", "kind": "missing-required", "reason": "observed evidence carries no merge outcome, so a not-yet-merged PR emits merged=null (present-and-nullable); a local merge write (PUT .../merge) sets it to a typed boolean" },
|
|
21
|
+
{ "path": "maintainer_can_modify", "kind": "missing-required", "reason": "permission flag not observed" },
|
|
22
|
+
{ "path": "additions", "kind": "missing-required", "reason": "line-addition count is NOT in observed PR evidence (only file/commit counts are), so an observed PR omits it; a LOCAL write that carries a `files` list rolls additions up from the diff and emits a typed integer. Declared for the observed scope only." },
|
|
23
|
+
{ "path": "deletions", "kind": "missing-required", "reason": "line-deletion count is NOT in observed PR evidence; observed PRs omit it, while a LOCAL write with a `files` list rolls deletions up from the diff and emits a typed integer. Declared for the observed scope only." },
|
|
24
|
+
{ "path": "comments", "kind": "missing-required", "reason": "issue-comment count surfaced under _twin.comment_count, not the GitHub-typed field" },
|
|
25
|
+
{ "path": "review_comments", "kind": "missing-required", "reason": "review-comment count surfaced under _twin, not the GitHub-typed field" },
|
|
26
|
+
{ "path": "commits", "kind": "missing-required", "reason": "emitted as a typed integer when observed; declared only for PRs whose evidence lacked a commit count" },
|
|
27
|
+
{ "path": "changed_files", "kind": "missing-required", "reason": "emitted as a typed integer when observed; declared only for PRs whose evidence lacked a changed-files count" },
|
|
28
|
+
{ "path": "base.label", "kind": "missing-required", "reason": "evidence tracks base ref only, not the owner:ref label" },
|
|
29
|
+
{ "path": "base.sha", "kind": "missing-required", "reason": "evidence tracks head sha only; base sha is not observed" },
|
|
30
|
+
{ "path": "base.user.*", "kind": "missing-required", "reason": "base repo owner not modeled (evidence twin)" },
|
|
31
|
+
{ "path": "base.user", "kind": "missing-required", "reason": "see base.user.*" },
|
|
32
|
+
{ "path": "base.repo.*", "kind": "missing-required", "reason": "full base Repository object (30+ url templates, settings) not modeled by the evidence twin" },
|
|
33
|
+
{ "path": "base.repo", "kind": "missing-required", "reason": "see base.repo.*" },
|
|
34
|
+
{ "path": "head.label", "kind": "missing-required", "reason": "evidence tracks head sha only, not the owner:ref label" },
|
|
35
|
+
{ "path": "head.ref", "kind": "missing-required", "reason": "evidence tracks head sha; head branch ref is not observed" },
|
|
36
|
+
{ "path": "head.user.*", "kind": "missing-required", "reason": "head repo owner not modeled (evidence twin)" },
|
|
37
|
+
{ "path": "head.user", "kind": "missing-required", "reason": "see head.user.*" },
|
|
38
|
+
{ "path": "head.repo.*", "kind": "missing-required", "reason": "full head Repository object not modeled by the evidence twin" },
|
|
39
|
+
{ "path": "head.repo", "kind": "missing-required", "reason": "see head.repo.*" },
|
|
40
|
+
{ "path": "submitted_at", "kind": "missing-required", "reason": "review object: OBSERVED reviews carry no submission timestamp (only existence); a LOCAL review write sets submitted_at to the write time. Omitted, not faked, when unknown." },
|
|
41
|
+
{ "path": "label.id", "kind": "missing-required", "reason": "labels are written/read by NAME; the twin stores only the name and emits {name}. id/node_id/url/color/default/description would be fabricated, so the label object carries the name alone." },
|
|
42
|
+
{ "path": "label.node_id", "kind": "missing-required", "reason": "see label.id — no real GraphQL node id for a name-only label" },
|
|
43
|
+
{ "path": "label.url", "kind": "missing-required", "reason": "label url template not modeled (name-only label)" },
|
|
44
|
+
{ "path": "label.color", "kind": "missing-required", "reason": "label color not supplied on write; would be fabricated" },
|
|
45
|
+
{ "path": "label.default", "kind": "missing-required", "reason": "is-default flag not modeled for a name-only label" },
|
|
46
|
+
{ "path": "label.description", "kind": "missing-required", "reason": "label description not modeled for a name-only label" },
|
|
47
|
+
{ "path": "assignee.*", "kind": "missing-required", "reason": "assignees are written/read by LOGIN; the twin stores only the login and emits {login}. The rest of the simple-user object (id, node_id, avatar_url, urls, type) would be fabricated." },
|
|
48
|
+
{ "path": "reviewComment.node_id", "kind": "missing-required", "reason": "PR review-comment object: no real GraphQL node id for a local comment" },
|
|
49
|
+
{ "path": "reviewComment.diff_hunk", "kind": "missing-required", "reason": "OBSERVED review comments carry no diff evidence, so they omit diff_hunk; a LOCAL diff-threaded write (POST /pulls/:n/comments with path) anchors the comment and emits diff_hunk (the supplied hunk or ''). Declared for the observed scope only." },
|
|
50
|
+
{ "path": "reviewComment.path", "kind": "missing-required", "reason": "OBSERVED review comments carry no diff path; a LOCAL diff-threaded write supplies path + line + side (+ optional start_line) and surfaces them on the comment. Declared for the observed scope only." },
|
|
51
|
+
{ "path": "reviewComment.commit_id", "kind": "missing-required", "reason": "commit a review comment pins to is not observed" },
|
|
52
|
+
{ "path": "reviewComment.original_commit_id", "kind": "missing-required", "reason": "original commit not observed" },
|
|
53
|
+
{ "path": "reviewComment.author_association", "kind": "missing-required", "reason": "author relationship to repo not observed" },
|
|
54
|
+
{ "path": "reviewComment._links.*", "kind": "missing-required", "reason": "hypermedia _links block not modeled" },
|
|
55
|
+
{ "path": "pullFile.*", "kind": "behavior", "reason": "GET /pulls/:n/files: OBSERVED PR evidence carries a changed-files COUNT but no per-file detail, so an observed PR returns an EMPTY file list (never fabricated). A LOCAL PR write (POST/PATCH with a `files` list of {filename,status,additions,deletions,changes,patch}) carries real per-file diffs, returned here paginated; the remaining file sub-fields the write didn't supply (blob sha when omitted, contents/raw url templates beyond what's derived) stay unmodeled. The carried files also roll up changed_files/additions/deletions on the PR object." },
|
|
56
|
+
{ "path": "pullCommit.*", "kind": "behavior", "reason": "GET /pulls/:n/commits: OBSERVED PR evidence carries a commit COUNT but no per-commit detail, so an observed PR returns an EMPTY commit list (never fabricated). A LOCAL PR write (POST/PATCH with a `commits` list of {sha, commit.message, commit.author{name,email,date}}) carries real commits, returned here paginated; the author/committer simple-user objects, tree, parents and verification are not modeled (the twin emits the message + commit.author it was given, with author/committer simple-users null). A missing sha is derived deterministically (sha256 of repo+index+message), never random." },
|
|
57
|
+
{ "path": "checksStatus", "kind": "behavior", "reason": "CI status checks (commit statuses + check runs) are NOT in observed PR evidence — observed mirrors carry no CI. They are modeled as LOCAL-write constructs: POST /statuses/:sha + POST /check-runs persist via the action log, and GET .../commits/:ref/status|statuses|check-runs read them back. An observed-only PR therefore reports a 'pending' combined status with total_count 0 (the faithful empty), never a fabricated check." },
|
|
58
|
+
{ "path": "requestedReviewers", "kind": "behavior", "reason": "Review REQUESTS are distinct from submitted reviews and are NOT in observed evidence (the fold sees submitted reviews only). Modeled as a LOCAL write (POST/DELETE /pulls/:n/requested_reviewers, body {reviewers:[login]}) storing bare logins; surfaced on the PR object (requested_reviewers) and GET /pulls/:n/requested_reviewers as {users:[{login}], teams:[]}. Observed-only PRs have none." },
|
|
59
|
+
{ "path": "requestedReviewer.*", "kind": "missing-required", "reason": "requested reviewers are stored by LOGIN; the twin emits {login} and declares the rest of the simple-user object (id, node_id, avatar_url, urls, type) — it would be fabricated. requested_teams is not modeled (always empty)." },
|
|
60
|
+
{ "path": "status.node_id", "kind": "missing-required", "reason": "commit_status object: no real GraphQL node id for a local status" },
|
|
61
|
+
{ "path": "status.creator.*", "kind": "missing-required", "reason": "the user that created a status is not modeled (local CI construct); a synthetic simple-user would fabricate a login/id, so creator is null" },
|
|
62
|
+
{ "path": "status.avatar_url", "kind": "missing-required", "reason": "status avatar_url not modeled (no creator)" },
|
|
63
|
+
{ "path": "checkRun.node_id", "kind": "missing-required", "reason": "check_run object: no real GraphQL node id for a local check run" },
|
|
64
|
+
{ "path": "checkRun.external_id", "kind": "missing-required", "reason": "check run external id not supplied on write" },
|
|
65
|
+
{ "path": "checkRun.output.*", "kind": "missing-required", "reason": "check run output (title/summary/annotations) not modeled — would be fabricated" },
|
|
66
|
+
{ "path": "checkRun.check_suite.*", "kind": "missing-required", "reason": "check run is not grouped into a modeled check suite (no suite evidence)" },
|
|
67
|
+
{ "path": "checkRun.app.*", "kind": "missing-required", "reason": "the GitHub App that produced a check run is not modeled (local construct)" },
|
|
68
|
+
{ "path": "checkRun.pull_requests", "kind": "missing-required", "reason": "the back-link from a check run to its PRs is not modeled (keyed by head_sha only)" },
|
|
69
|
+
{ "path": "milestone.id", "kind": "missing-required", "reason": "milestone object: local construct emits a deterministic sequence id, but the real GitHub integer id / GraphQL node_id are not observed and not fabricated as the canonical id" },
|
|
70
|
+
{ "path": "milestone.node_id", "kind": "missing-required", "reason": "no real GraphQL node id for a local milestone" },
|
|
71
|
+
{ "path": "milestone.creator.*", "kind": "missing-required", "reason": "milestone creator not modeled; a synthetic simple-user would fabricate a login/id, so creator is omitted" },
|
|
72
|
+
{ "path": "milestone.open_issues", "kind": "behavior", "reason": "issue/PR-per-milestone rollup counts are emitted as 0 — the twin does not yet aggregate how many issues/PRs reference a milestone, so it reports 0 rather than fabricating a count" },
|
|
73
|
+
{ "path": "milestone.closed_issues", "kind": "behavior", "reason": "see milestone.open_issues — closed-issue rollup emitted as 0" },
|
|
74
|
+
{ "path": "issueEvent.*", "kind": "behavior", "reason": "GET /issues/:n/events|timeline: real GitHub returns the full timeline (labeled/assigned/referenced/cross-referenced/...). The twin models ONLY the cross-referenced linked-PR/issue relation (set via the twin-extension _twin_linked field — GitHub has no direct link-write endpoint, links are inferred from body text). actor/created_at and the rich source object are emitted null/minimal rather than fabricated; other event types are not modeled." },
|
|
75
|
+
{ "path": "issue.linked", "kind": "behavior", "reason": "linked PRs/issues are a simple LOCAL relation ([{type,number}]) the twin surfaces via the events endpoint as cross-referenced events. Real GitHub infers links from body cross-references / the timeline; the twin lets a simulator declare them explicitly (PATCH issue with _twin_linked) rather than parsing prose." },
|
|
76
|
+
{ "path": "issue.milestone", "kind": "behavior", "reason": "an issue/PR milestone is set by NUMBER via PATCH {milestone:n}; the twin looks up the local milestone object (created via POST /milestones) and surfaces it, or null when none/unknown — it never fabricates a milestone object for an unknown number" },
|
|
77
|
+
{ "path": "release.node_id", "kind": "missing-required", "reason": "release object: local construct emits a deterministic sequence id, but no real GraphQL node id is observed or fabricated" },
|
|
78
|
+
{ "path": "release.author.*", "kind": "missing-required", "reason": "release author not modeled (local construct); a synthetic simple-user would fabricate a login/id, so author is null" },
|
|
79
|
+
{ "path": "release.reactions", "kind": "missing-required", "reason": "reaction rollup not modeled by the local release construct" },
|
|
80
|
+
{ "path": "release.discussion_url", "kind": "missing-required", "reason": "release-discussion hypermedia not modeled (Discussions are a separate todo)" },
|
|
81
|
+
{ "path": "release.published_at", "kind": "behavior", "reason": "a DRAFT release emits published_at=null (real GitHub behavior — a draft has no publish time); a published (draft:false) release stamps published_at to the write time. Omitted/null, never faked." },
|
|
82
|
+
{ "path": "asset.*", "kind": "behavior", "reason": "release ASSETS are MODELED AS METADATA ONLY: the twin carries name/label/content_type/size/state/download_count + derivable url templates (POST /releases/:id/assets persists via the action log; GET .../assets reads them back). The actual asset binary BYTES are a declared Non-goal (large + redundant — the same boundary as repo blob bytes); browser_download_url points at the asset path but the twin serves NO real content. uploader simple-user + node_id are not modeled (would be fabricated)." },
|
|
83
|
+
{ "path": "tag.*", "kind": "behavior", "reason": "GET /tags + GET /git/refs/tags: tags are DERIVED from the LOCAL published (non-draft) releases the twin created — there is no observed git-data evidence, and git commit/blob BYTES are the Non-goal. The commit sha is deterministic (sha256 of repo+tag), the ref is a lightweight 'commit' ref (no annotated-tag object), and the full commit object (author/message/tree) + node_id are not modeled." },
|
|
84
|
+
{ "path": "discussion.*", "kind": "behavior", "reason": "DISCUSSIONS TRANSPORT DEVIATION: on real GitHub, Discussions (and their categories/comments/answers) are served by the GraphQL v4 API, NOT REST — there is no public REST Discussions endpoint. The twin models them over its OWN REST handler (POST/GET/PATCH/DELETE /repos/:o/:r/discussions[/:num][/comments][/categories]) for CONSISTENCY with the rest of the twin's REST surface; the OBJECT shapes mirror the GraphQL node fields projected into a REST-style body (number/title/body/state/category/answer). This is an honest, declared transport+shape deviation, not a fidelity claim about GitHub's REST API. Discussions are LOCAL constructs (no observed evidence fold)." },
|
|
85
|
+
{ "path": "discussion.node_id", "kind": "missing-required", "reason": "discussion object: no real GraphQL node id is observed for a local discussion (Discussions are a GraphQL product; the twin emits node_id=null rather than fabricating one)" },
|
|
86
|
+
{ "path": "discussion.user", "kind": "missing-required", "reason": "discussion author not modeled (local construct); a synthetic simple-user would fabricate a login/id, so user is null" },
|
|
87
|
+
{ "path": "discussion.reactions", "kind": "missing-required", "reason": "reaction rollup not modeled by the local discussion construct" },
|
|
88
|
+
{ "path": "discussion.answer", "kind": "behavior", "reason": "the accepted answer is surfaced as answer_comment_id (the chosen comment's local id, null when none) + answer_chosen_at; the full GraphQL answer node (the embedded comment object) is not duplicated — the comment is fetchable via the comments list. Marking is only valid for an ANSWERABLE (Q&A) category; a mark on a non-answerable discussion 422s." },
|
|
89
|
+
{ "path": "discussionCategory.*", "kind": "behavior", "reason": "discussion CATEGORIES are SEEDED per-repo with GitHub's default set (Announcements/General/Ideas/Q&A/Show and tell), only Q&A answerable; a custom category is a LOCAL construct (POST /discussions/categories). Ids are deterministic (sha256 of repo+slug), repository_id is a deterministic short hash, and node_id is not modeled. The real GraphQL category node carries more (createdAt/updatedAt/repository) that the twin omits." },
|
|
90
|
+
{ "path": "discussionComment.node_id", "kind": "missing-required", "reason": "discussion-comment object: no real GraphQL node id for a local comment" },
|
|
91
|
+
{ "path": "discussionComment.user", "kind": "missing-required", "reason": "discussion-comment author not modeled (local construct); user is null rather than a fabricated simple-user" },
|
|
92
|
+
{ "path": "discussionComment.reactions", "kind": "missing-required", "reason": "reaction rollup not modeled by the local discussion-comment construct" },
|
|
93
|
+
{ "path": "discussionComment.parent_id", "kind": "behavior", "reason": "a threaded REPLY pins to its parent comment via parent_id (set on the create body); a top-level comment has parent_id=null. The twin models a single reply level (parent → reply), matching GitHub's two-level discussion threading; is_answer marks the accepted answer (Q&A only)." }
|
|
94
|
+
]
|
|
95
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
{
|
|
2
|
+
"openapi": "3.0.3",
|
|
3
|
+
"info": {
|
|
4
|
+
"title": "GitHub REST API (spec-census pilot subset)",
|
|
5
|
+
"version": "2026-06-14",
|
|
6
|
+
"description": "A curated, hand-vendored SUBSET of GitHub's published REST OpenAPI (github/rest-api-description, https://github.com/github/rest-api-description), used ONLY as the operation-inventory denominator for the TWIN-15 spec census (see ../github-spec-census.json). Domain covered: issues, pull requests, repos, git refs, and commit/review comments -- the surface the @volter/twin-github pack models -- PLUS a deliberate handful of adjacent real GitHub operations the pack does NOT model, so the census genuinely exercises its `unmapped` and `outOfScope` buckets instead of mapping 1:1. This is NOT a full GitHub OpenAPI document (GitHub's real spec is multi-megabyte); it is bounded to ~30-40 operations by design, offline and deterministic -- see github-openapi-operations.SOURCE.md for exactly how each path/method was curated."
|
|
7
|
+
},
|
|
8
|
+
"x-source": {
|
|
9
|
+
"vendor": "github",
|
|
10
|
+
"upstream": "https://github.com/github/rest-api-description",
|
|
11
|
+
"upstreamFile": "descriptions/api.github.com/api.github.com.json",
|
|
12
|
+
"vendored": "hand-authored from the operator's knowledge of GitHub's published REST API paths/methods -- NOT fetched over the network (offline/deterministic build requirement)",
|
|
13
|
+
"curatedOn": "2026-07-04",
|
|
14
|
+
"scope": "issues, pulls, repos, git-data refs, commit/review comments -- the domain the github pack models -- plus adjacent real GitHub operations the pack intentionally leaves unmapped/out-of-scope"
|
|
15
|
+
},
|
|
16
|
+
"paths": {
|
|
17
|
+
"/repos/{owner}/{repo}/issues": {
|
|
18
|
+
"get": { "operationId": "issues/list-for-repo", "summary": "List repository issues", "tags": ["issues"], "responses": { "200": { "description": "list of issues" } } },
|
|
19
|
+
"post": { "operationId": "issues/create", "summary": "Create an issue", "tags": ["issues"], "responses": { "201": { "description": "issue created" } } }
|
|
20
|
+
},
|
|
21
|
+
"/repos/{owner}/{repo}/issues/{issue_number}": {
|
|
22
|
+
"patch": { "operationId": "issues/update", "summary": "Update an issue (title/body/state/labels/assignees/milestone)", "tags": ["issues"], "responses": { "200": { "description": "issue updated" } } }
|
|
23
|
+
},
|
|
24
|
+
"/repos/{owner}/{repo}/issues/{issue_number}/comments": {
|
|
25
|
+
"get": { "operationId": "issues/list-comments", "summary": "List issue comments", "tags": ["issues"], "responses": { "200": { "description": "list of comments" } } },
|
|
26
|
+
"post": { "operationId": "issues/create-comment", "summary": "Create an issue comment", "tags": ["issues"], "responses": { "201": { "description": "comment created" } } }
|
|
27
|
+
},
|
|
28
|
+
"/repos/{owner}/{repo}/issues/{issue_number}/labels": {
|
|
29
|
+
"post": { "operationId": "issues/add-labels", "summary": "Add labels to an issue", "tags": ["issues"], "responses": { "200": { "description": "labels added" } } }
|
|
30
|
+
},
|
|
31
|
+
"/repos/{owner}/{repo}/issues/{issue_number}/lock": {
|
|
32
|
+
"put": { "operationId": "issues/lock", "summary": "Lock an issue conversation", "tags": ["issues"], "responses": { "204": { "description": "locked" } } }
|
|
33
|
+
},
|
|
34
|
+
"/repos/{owner}/{repo}/issues/comments": {
|
|
35
|
+
"get": { "operationId": "issues/list-comments-for-repo", "summary": "List issue comments for a repository (repo-wide, across all issues)", "tags": ["issues"], "responses": { "200": { "description": "list of comments" } } }
|
|
36
|
+
},
|
|
37
|
+
"/repos/{owner}/{repo}/issues/events": {
|
|
38
|
+
"get": { "operationId": "issues/list-events-for-repo", "summary": "List issue events for a repository (repo-wide, across all issues)", "tags": ["issues"], "responses": { "200": { "description": "list of events" } } }
|
|
39
|
+
},
|
|
40
|
+
"/repos/{owner}/{repo}/pulls": {
|
|
41
|
+
"get": { "operationId": "pulls/list", "summary": "List pull requests", "tags": ["pulls"], "responses": { "200": { "description": "list of pull requests" } } },
|
|
42
|
+
"post": { "operationId": "pulls/create", "summary": "Create a pull request", "tags": ["pulls"], "responses": { "201": { "description": "pull request created" } } }
|
|
43
|
+
},
|
|
44
|
+
"/repos/{owner}/{repo}/pulls/{pull_number}": {
|
|
45
|
+
"get": { "operationId": "pulls/get", "summary": "Get a pull request", "tags": ["pulls"], "responses": { "200": { "description": "pull request" } } },
|
|
46
|
+
"patch": { "operationId": "pulls/update", "summary": "Update a pull request", "tags": ["pulls"], "responses": { "200": { "description": "pull request updated" } } }
|
|
47
|
+
},
|
|
48
|
+
"/repos/{owner}/{repo}/pulls/{pull_number}/merge": {
|
|
49
|
+
"put": { "operationId": "pulls/merge", "summary": "Merge a pull request", "tags": ["pulls"], "responses": { "200": { "description": "merged" } } }
|
|
50
|
+
},
|
|
51
|
+
"/repos/{owner}/{repo}/pulls/{pull_number}/files": {
|
|
52
|
+
"get": { "operationId": "pulls/list-files", "summary": "List pull request files", "tags": ["pulls"], "responses": { "200": { "description": "list of changed files" } } }
|
|
53
|
+
},
|
|
54
|
+
"/repos/{owner}/{repo}/pulls/{pull_number}/reviews": {
|
|
55
|
+
"get": { "operationId": "pulls/list-reviews", "summary": "List reviews for a pull request", "tags": ["pulls"], "responses": { "200": { "description": "list of reviews" } } },
|
|
56
|
+
"post": { "operationId": "pulls/create-review", "summary": "Create a review for a pull request", "tags": ["pulls"], "responses": { "200": { "description": "review created" } } }
|
|
57
|
+
},
|
|
58
|
+
"/repos/{owner}/{repo}/pulls/{pull_number}/comments": {
|
|
59
|
+
"post": { "operationId": "pulls/create-review-comment", "summary": "Create a diff-anchored review comment", "tags": ["pulls"], "responses": { "201": { "description": "review comment created" } } }
|
|
60
|
+
},
|
|
61
|
+
"/repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers": {
|
|
62
|
+
"post": { "operationId": "pulls/request-reviewers", "summary": "Request reviewers for a pull request", "tags": ["pulls"], "responses": { "201": { "description": "reviewers requested" } } }
|
|
63
|
+
},
|
|
64
|
+
"/repos/{owner}/{repo}/pulls/comments": {
|
|
65
|
+
"get": { "operationId": "pulls/list-review-comments-for-repo", "summary": "List review comments in a repository (repo-wide, across all pull requests)", "tags": ["pulls"], "responses": { "200": { "description": "list of review comments" } } }
|
|
66
|
+
},
|
|
67
|
+
"/repos/{owner}/{repo}": {
|
|
68
|
+
"get": { "operationId": "repos/get", "summary": "Get a repository", "tags": ["repos"], "responses": { "200": { "description": "repository" } } }
|
|
69
|
+
},
|
|
70
|
+
"/repos/{owner}/{repo}/branches": {
|
|
71
|
+
"get": { "operationId": "repos/list-branches", "summary": "List branches", "tags": ["repos"], "responses": { "200": { "description": "list of branches" } } }
|
|
72
|
+
},
|
|
73
|
+
"/repos/{owner}/{repo}/contents/{path}": {
|
|
74
|
+
"get": { "operationId": "repos/get-content", "summary": "Get repository content", "tags": ["repos"], "responses": { "200": { "description": "file content" } } }
|
|
75
|
+
},
|
|
76
|
+
"/repos/{owner}/{repo}/community/profile": {
|
|
77
|
+
"get": { "operationId": "repos/get-community-profile-metrics", "summary": "Get community profile metrics", "tags": ["repos"], "responses": { "200": { "description": "community profile" } } }
|
|
78
|
+
},
|
|
79
|
+
"/repos/{owner}/{repo}/merge-upstream": {
|
|
80
|
+
"post": { "operationId": "repos/merge-upstream", "summary": "Sync a fork branch with the upstream repository", "tags": ["repos"], "responses": { "200": { "description": "merge result" } } }
|
|
81
|
+
},
|
|
82
|
+
"/repos/{owner}/{repo}/vulnerability-alerts": {
|
|
83
|
+
"get": { "operationId": "repos/check-vulnerability-alerts", "summary": "Check if Dependabot vulnerability alerts are enabled", "tags": ["repos"], "responses": { "204": { "description": "enabled" }, "404": { "description": "disabled" } } }
|
|
84
|
+
},
|
|
85
|
+
"/repos/{owner}/{repo}/git/refs": {
|
|
86
|
+
"post": { "operationId": "git/create-ref", "summary": "Create a reference", "tags": ["git"], "responses": { "201": { "description": "ref created" } } }
|
|
87
|
+
},
|
|
88
|
+
"/repos/{owner}/{repo}/git/ref/{ref}": {
|
|
89
|
+
"get": { "operationId": "git/get-ref", "summary": "Get a reference", "tags": ["git"], "responses": { "200": { "description": "ref" } } }
|
|
90
|
+
},
|
|
91
|
+
"/repos/{owner}/{repo}/git/matching-refs/{ref}": {
|
|
92
|
+
"get": { "operationId": "git/list-matching-refs", "summary": "List matching references", "tags": ["git"], "responses": { "200": { "description": "list of matching refs" } } }
|
|
93
|
+
},
|
|
94
|
+
"/repos/{owner}/{repo}/commits/{commit_sha}/comments": {
|
|
95
|
+
"get": { "operationId": "repos/list-commit-comments", "summary": "List commit comments", "tags": ["repos"], "responses": { "200": { "description": "list of commit comments" } } }
|
|
96
|
+
},
|
|
97
|
+
"/repos/{owner}/{repo}/stats/contributors": {
|
|
98
|
+
"get": { "operationId": "repos/get-contributors-stats", "summary": "Get all contributor commit activity (async-computed statistics)", "tags": ["repos"], "responses": { "200": { "description": "contributor stats" }, "202": { "description": "stats being computed" } } }
|
|
99
|
+
},
|
|
100
|
+
"/repos/{owner}/{repo}/stats/commit_activity": {
|
|
101
|
+
"get": { "operationId": "repos/get-commit-activity-stats", "summary": "Get the last year of commit activity (async-computed statistics)", "tags": ["repos"], "responses": { "200": { "description": "commit activity" }, "202": { "description": "stats being computed" } } }
|
|
102
|
+
},
|
|
103
|
+
"/repos/{owner}/{repo}/transfer": {
|
|
104
|
+
"post": { "operationId": "repos/transfer", "summary": "Transfer a repository to another owner", "tags": ["repos"], "responses": { "202": { "description": "transfer accepted" } } }
|
|
105
|
+
},
|
|
106
|
+
"/repos/{owner}/{repo}/automated-security-fixes": {
|
|
107
|
+
"delete": { "operationId": "repos/disable-automated-security-fixes", "summary": "Disable automated security fixes (Dependabot security updates toggle)", "tags": ["repos"], "responses": { "204": { "description": "disabled" } } }
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|