From 99cd27e1a5aaba23b1028f0ec666958f6e34b866 Mon Sep 17 00:00:00 2001 From: Sam Morrow Date: Fri, 2 Oct 2026 15:24:20 +0200 Subject: [PATCH 1/3] feat(issues): add typed consolidated issue tool contracts Preserve raw helper APIs and exact legacy text while exposing concrete output unions for modern protocols. Retain explicit awaiting statuses and real null responses without exposing SDK-generated error fallbacks. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com> --- docs/error-handling.md | 17 + pkg/github/__toolsnaps__/issue_read.snap | 9328 +++++++++++++++- .../__toolsnaps__/issue_read_typed.snap | 9394 +++++++++++++++++ pkg/github/__toolsnaps__/issue_write.snap | 100 +- .../__toolsnaps__/issue_write_typed.snap | 265 + pkg/github/__toolsnaps__/sub_issue_write.snap | 8693 ++++++++++++++- .../__toolsnaps__/sub_issue_write_typed.snap | 8758 +++++++++++++++ pkg/github/consolidated_issue_types.go | 568 + pkg/github/issues.go | 361 +- ...yped_consolidated_issue_enrichment_test.go | 65 + .../typed_consolidated_issue_outputs_test.go | 542 + pkg/inventory/typed_output.go | 17 +- pkg/inventory/typed_output_test.go | 87 + 13 files changed, 38052 insertions(+), 143 deletions(-) create mode 100644 pkg/github/__toolsnaps__/issue_read_typed.snap create mode 100644 pkg/github/__toolsnaps__/issue_write_typed.snap create mode 100644 pkg/github/__toolsnaps__/sub_issue_write_typed.snap create mode 100644 pkg/github/consolidated_issue_types.go create mode 100644 pkg/github/typed_consolidated_issue_enrichment_test.go create mode 100644 pkg/github/typed_consolidated_issue_outputs_test.go diff --git a/docs/error-handling.md b/docs/error-handling.md index 9bb27e0fa4..72586b1424 100644 --- a/docs/error-handling.md +++ b/docs/error-handling.md @@ -57,6 +57,23 @@ This function: return ghErrors.NewGitHubGraphQLErrorResponse(ctx, message, err), nil ``` +### Typed Tool Results + +Tools registered with concrete `NewTool[In, Out]` types expose output schemas and +`structuredContent` only when the negotiated protocol is `2026-07-28` or newer. +Older or unknown protocols retain the original text responses without these +typed-output additions. Ordinary API and validation errors never expose the +SDK-generated zero-value structured output. + +Handler-provided structured statuses are distinct from generated error output. +For example, `issue_write` can return `IsError: true` with +`status: "awaiting_user_submission"` while an MCP App form is pending. Modern +clients retain that explicit status and its reason; legacy clients retain the +stop message and error flag without structured content. This status does not +mean the issue was created or updated. The output schema includes a strict +status variant alongside the mutation's `id`/`url` variant. Multi-round-trip +`InputRequests` continue to pass through unchanged. + ### Context Management The error handling system uses context to store errors for later inspection: diff --git a/pkg/github/__toolsnaps__/issue_read.snap b/pkg/github/__toolsnaps__/issue_read.snap index faf6085a5e..7d25b5b401 100644 --- a/pkg/github/__toolsnaps__/issue_read.snap +++ b/pkg/github/__toolsnaps__/issue_read.snap @@ -50,5 +50,9331 @@ ], "type": "object" }, - "name": "issue_read" + "name": "issue_read", + "outputSchema": { + "$defs": { + "repository": { + "additionalProperties": false, + "properties": { + "allow_auto_merge": { + "type": [ + "null", + "boolean" + ] + }, + "allow_forking": { + "type": [ + "null", + "boolean" + ] + }, + "allow_merge_commit": { + "type": [ + "null", + "boolean" + ] + }, + "allow_rebase_merge": { + "type": [ + "null", + "boolean" + ] + }, + "allow_squash_merge": { + "type": [ + "null", + "boolean" + ] + }, + "allow_update_branch": { + "type": [ + "null", + "boolean" + ] + }, + "archive_url": { + "type": [ + "null", + "string" + ] + }, + "archived": { + "type": [ + "null", + "boolean" + ] + }, + "assignees_url": { + "type": [ + "null", + "string" + ] + }, + "auto_init": { + "type": [ + "null", + "boolean" + ] + }, + "blobs_url": { + "type": [ + "null", + "string" + ] + }, + "branches_url": { + "type": [ + "null", + "string" + ] + }, + "clone_url": { + "type": [ + "null", + "string" + ] + }, + "code_of_conduct": { + "additionalProperties": false, + "properties": { + "body": { + "type": [ + "null", + "string" + ] + }, + "key": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "collaborators_url": { + "type": [ + "null", + "string" + ] + }, + "comments_url": { + "type": [ + "null", + "string" + ] + }, + "commits_url": { + "type": [ + "null", + "string" + ] + }, + "compare_url": { + "type": [ + "null", + "string" + ] + }, + "contents_url": { + "type": [ + "null", + "string" + ] + }, + "contributors_url": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "custom_properties": { + "additionalProperties": true, + "type": "object" + }, + "default_branch": { + "type": [ + "null", + "string" + ] + }, + "delete_branch_on_merge": { + "type": [ + "null", + "boolean" + ] + }, + "deployments_url": { + "type": [ + "null", + "string" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "disabled": { + "type": [ + "null", + "boolean" + ] + }, + "downloads_url": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "fork": { + "type": [ + "null", + "boolean" + ] + }, + "forks_count": { + "type": [ + "null", + "integer" + ] + }, + "forks_url": { + "type": [ + "null", + "string" + ] + }, + "full_name": { + "type": [ + "null", + "string" + ] + }, + "git_commits_url": { + "type": [ + "null", + "string" + ] + }, + "git_refs_url": { + "type": [ + "null", + "string" + ] + }, + "git_tags_url": { + "type": [ + "null", + "string" + ] + }, + "git_url": { + "type": [ + "null", + "string" + ] + }, + "gitignore_template": { + "type": [ + "null", + "string" + ] + }, + "has_discussions": { + "type": [ + "null", + "boolean" + ] + }, + "has_downloads": { + "type": [ + "null", + "boolean" + ] + }, + "has_issues": { + "type": [ + "null", + "boolean" + ] + }, + "has_pages": { + "type": [ + "null", + "boolean" + ] + }, + "has_projects": { + "type": [ + "null", + "boolean" + ] + }, + "has_pull_requests": { + "type": [ + "null", + "boolean" + ] + }, + "has_wiki": { + "type": [ + "null", + "boolean" + ] + }, + "homepage": { + "type": [ + "null", + "string" + ] + }, + "hooks_url": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "is_template": { + "type": [ + "null", + "boolean" + ] + }, + "issue_comment_url": { + "type": [ + "null", + "string" + ] + }, + "issue_events_url": { + "type": [ + "null", + "string" + ] + }, + "issues_url": { + "type": [ + "null", + "string" + ] + }, + "keys_url": { + "type": [ + "null", + "string" + ] + }, + "labels_url": { + "type": [ + "null", + "string" + ] + }, + "language": { + "type": [ + "null", + "string" + ] + }, + "languages_url": { + "type": [ + "null", + "string" + ] + }, + "license": { + "additionalProperties": false, + "properties": { + "body": { + "type": [ + "null", + "string" + ] + }, + "conditions": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "featured": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "implementation": { + "type": [ + "null", + "string" + ] + }, + "key": { + "type": [ + "null", + "string" + ] + }, + "limitations": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "permissions": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "spdx_id": { + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "license_template": { + "type": [ + "null", + "string" + ] + }, + "master_branch": { + "type": [ + "null", + "string" + ] + }, + "merge_commit_message": { + "type": [ + "null", + "string" + ] + }, + "merge_commit_title": { + "type": [ + "null", + "string" + ] + }, + "merges_url": { + "type": [ + "null", + "string" + ] + }, + "milestones_url": { + "type": [ + "null", + "string" + ] + }, + "mirror_url": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "network_count": { + "type": [ + "null", + "integer" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notifications_url": { + "type": [ + "null", + "string" + ] + }, + "open_issues": { + "type": [ + "null", + "integer" + ] + }, + "open_issues_count": { + "type": [ + "null", + "integer" + ] + }, + "organization": { + "additionalProperties": false, + "properties": { + "advanced_security_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "archived_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "billing_email": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "default_repository_branch": { + "type": [ + "null", + "string" + ] + }, + "default_repository_permission": { + "type": [ + "null", + "string" + ] + }, + "default_repository_settings": { + "type": [ + "null", + "string" + ] + }, + "dependabot_alerts_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "dependabot_security_updates_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "dependency_graph_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "deploy_keys_enabled_for_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "display_commenter_full_name_setting_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "has_organization_projects": { + "type": [ + "null", + "boolean" + ] + }, + "has_repository_projects": { + "type": [ + "null", + "boolean" + ] + }, + "hooks_url": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "is_verified": { + "type": [ + "null", + "boolean" + ] + }, + "issues_url": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "members_allowed_repository_creation_type": { + "type": [ + "null", + "string" + ] + }, + "members_can_change_repo_visibility": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_internal_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_pages": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_private_pages": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_private_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_public_pages": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_public_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_teams": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_delete_issues": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_delete_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_fork_private_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_invite_outside_collaborators": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_view_dependency_insights": { + "type": [ + "null", + "boolean" + ] + }, + "members_url": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_members_url": { + "type": [ + "null", + "string" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "readers_can_create_discussions": { + "type": [ + "null", + "boolean" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "secret_scanning_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "secret_scanning_push_protection_custom_link": { + "type": [ + "null", + "string" + ] + }, + "secret_scanning_push_protection_custom_link_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "secret_scanning_push_protection_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "secret_scanning_validity_checks_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_requirement_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "web_commit_signoff_required": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "owner": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "parent": { + "$ref": "#/$defs/repository", + "type": [ + "null", + "object" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private": { + "type": [ + "null", + "boolean" + ] + }, + "pull_request_creation_policy": { + "type": [ + "null", + "string" + ] + }, + "pulls_url": { + "type": [ + "null", + "string" + ] + }, + "pushed_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "releases_url": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "security_and_analysis": { + "additionalProperties": false, + "properties": { + "advanced_security": { + "additionalProperties": false, + "properties": { + "status": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "code_security": { + "additionalProperties": false, + "properties": { + "status": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "dependabot_security_updates": { + "additionalProperties": false, + "properties": { + "status": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "secret_scanning": { + "additionalProperties": false, + "properties": { + "status": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "secret_scanning_push_protection": { + "additionalProperties": false, + "properties": { + "status": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "secret_scanning_validity_checks": { + "additionalProperties": false, + "properties": { + "status": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "size": { + "type": [ + "null", + "integer" + ] + }, + "source": { + "$ref": "#/$defs/repository", + "type": [ + "null", + "object" + ] + }, + "squash_merge_commit_message": { + "type": [ + "null", + "string" + ] + }, + "squash_merge_commit_title": { + "type": [ + "null", + "string" + ] + }, + "ssh_url": { + "type": [ + "null", + "string" + ] + }, + "stargazers_count": { + "type": [ + "null", + "integer" + ] + }, + "stargazers_url": { + "type": [ + "null", + "string" + ] + }, + "statuses_url": { + "type": [ + "null", + "string" + ] + }, + "subscribers_count": { + "type": [ + "null", + "integer" + ] + }, + "subscribers_url": { + "type": [ + "null", + "string" + ] + }, + "subscription_url": { + "type": [ + "null", + "string" + ] + }, + "svn_url": { + "type": [ + "null", + "string" + ] + }, + "tags_url": { + "type": [ + "null", + "string" + ] + }, + "team_id": { + "type": [ + "null", + "integer" + ] + }, + "teams_url": { + "type": [ + "null", + "string" + ] + }, + "template_repository": { + "$ref": "#/$defs/repository", + "type": [ + "null", + "object" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "topics": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "trees_url": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "use_squash_pr_title_as_default": { + "type": [ + "null", + "boolean" + ] + }, + "visibility": { + "type": [ + "null", + "string" + ] + }, + "watchers": { + "type": [ + "null", + "integer" + ] + }, + "watchers_count": { + "type": [ + "null", + "integer" + ] + }, + "web_commit_signoff_required": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "object", + "null" + ] + }, + "team": { + "additionalProperties": false, + "properties": { + "access_source": { + "type": [ + "null", + "string" + ] + }, + "assignment": { + "type": [ + "null", + "string" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "members_count": { + "type": [ + "null", + "integer" + ] + }, + "members_url": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_setting": { + "type": [ + "null", + "string" + ] + }, + "organization": { + "additionalProperties": false, + "properties": { + "advanced_security_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "archived_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "billing_email": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "default_repository_branch": { + "type": [ + "null", + "string" + ] + }, + "default_repository_permission": { + "type": [ + "null", + "string" + ] + }, + "default_repository_settings": { + "type": [ + "null", + "string" + ] + }, + "dependabot_alerts_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "dependabot_security_updates_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "dependency_graph_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "deploy_keys_enabled_for_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "display_commenter_full_name_setting_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "has_organization_projects": { + "type": [ + "null", + "boolean" + ] + }, + "has_repository_projects": { + "type": [ + "null", + "boolean" + ] + }, + "hooks_url": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "is_verified": { + "type": [ + "null", + "boolean" + ] + }, + "issues_url": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "members_allowed_repository_creation_type": { + "type": [ + "null", + "string" + ] + }, + "members_can_change_repo_visibility": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_internal_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_pages": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_private_pages": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_private_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_public_pages": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_public_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_teams": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_delete_issues": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_delete_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_fork_private_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_invite_outside_collaborators": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_view_dependency_insights": { + "type": [ + "null", + "boolean" + ] + }, + "members_url": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_members_url": { + "type": [ + "null", + "string" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "readers_can_create_discussions": { + "type": [ + "null", + "boolean" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "secret_scanning_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "secret_scanning_push_protection_custom_link": { + "type": [ + "null", + "string" + ] + }, + "secret_scanning_push_protection_custom_link_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "secret_scanning_push_protection_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "secret_scanning_validity_checks_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_requirement_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "web_commit_signoff_required": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "parent": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "permission": { + "type": [ + "null", + "string" + ] + }, + "permissions": { + "additionalProperties": { + "type": "boolean" + }, + "type": "object" + }, + "privacy": { + "type": [ + "null", + "string" + ] + }, + "repos_count": { + "type": [ + "null", + "integer" + ] + }, + "repositories_url": { + "type": [ + "null", + "string" + ] + }, + "slug": { + "type": [ + "null", + "string" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "object", + "null" + ] + } + }, + "oneOf": [ + { + "type": "null" + }, + { + "additionalProperties": false, + "properties": { + "assignees": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "author_association": { + "type": "string" + }, + "body": { + "type": "string" + }, + "closed_at": { + "type": "string" + }, + "closed_by": { + "type": "string" + }, + "closed_by_pull_requests": { + "additionalProperties": false, + "properties": { + "references": { + "items": { + "additionalProperties": false, + "properties": { + "number": { + "type": "integer" + }, + "repository": { + "type": "string" + }, + "state": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "number", + "title", + "state", + "url" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + }, + "total_count": { + "type": "integer" + } + }, + "required": [ + "total_count", + "references" + ], + "type": [ + "null", + "object" + ] + }, + "comments": { + "type": "integer" + }, + "created_at": { + "type": "string" + }, + "draft": { + "type": "boolean" + }, + "field_values": { + "items": { + "additionalProperties": false, + "properties": { + "field": { + "type": "string" + }, + "value": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + } + }, + "required": [ + "field" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + }, + "has_children": { + "type": [ + "null", + "boolean" + ] + }, + "has_parent": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": "string" + }, + "issue_type": { + "type": "string" + }, + "labels": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "locked": { + "type": "boolean" + }, + "milestone": { + "type": "string" + }, + "number": { + "type": "integer" + }, + "parent": { + "additionalProperties": false, + "properties": { + "number": { + "type": "integer" + }, + "repository": { + "type": "string" + }, + "state": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "number", + "title", + "state", + "url" + ], + "type": [ + "null", + "object" + ] + }, + "reactions": { + "additionalProperties": false, + "properties": { + "+1": { + "type": "integer" + }, + "-1": { + "type": "integer" + }, + "confused": { + "type": "integer" + }, + "eyes": { + "type": "integer" + }, + "heart": { + "type": "integer" + }, + "hooray": { + "type": "integer" + }, + "laugh": { + "type": "integer" + }, + "rocket": { + "type": "integer" + }, + "total_count": { + "type": "integer" + } + }, + "required": [ + "total_count", + "+1", + "-1", + "laugh", + "confused", + "heart", + "hooray", + "rocket", + "eyes" + ], + "type": [ + "null", + "object" + ] + }, + "state": { + "type": "string" + }, + "state_reason": { + "type": "string" + }, + "sub_issues_summary": { + "additionalProperties": false, + "properties": { + "completed": { + "type": "integer" + }, + "percent_completed": { + "type": "integer" + }, + "total": { + "type": "integer" + } + }, + "required": [ + "total", + "completed", + "percent_completed" + ], + "type": [ + "null", + "object" + ] + }, + "title": { + "type": "string" + }, + "updated_at": { + "type": "string" + }, + "user": { + "additionalProperties": false, + "properties": { + "avatar_url": { + "type": "string" + }, + "details": { + "additionalProperties": false, + "properties": { + "bio": { + "type": "string" + }, + "blog": { + "type": "string" + }, + "company": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "email": { + "type": "string" + }, + "followers": { + "type": "integer" + }, + "following": { + "type": "integer" + }, + "hireable": { + "type": "boolean" + }, + "location": { + "type": "string" + }, + "name": { + "type": "string" + }, + "owned_private_repos": { + "type": "integer" + }, + "private_gists": { + "type": "integer" + }, + "public_gists": { + "type": "integer" + }, + "public_repos": { + "type": "integer" + }, + "total_private_repos": { + "type": "integer" + }, + "twitter_username": { + "type": "string" + }, + "updated_at": { + "type": "string" + } + }, + "required": [ + "public_repos", + "public_gists", + "followers", + "following", + "created_at", + "updated_at" + ], + "type": [ + "null", + "object" + ] + }, + "id": { + "type": "integer" + }, + "login": { + "type": "string" + }, + "profile_url": { + "type": "string" + } + }, + "required": [ + "login" + ], + "type": [ + "null", + "object" + ] + } + }, + "required": [ + "number", + "title", + "state", + "assignees" + ], + "type": "object" + }, + { + "anyOf": [ + { + "items": { + "additionalProperties": false, + "properties": { + "author_association": { + "type": "string" + }, + "body": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "html_url": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "reactions": { + "additionalProperties": false, + "properties": { + "+1": { + "type": "integer" + }, + "-1": { + "type": "integer" + }, + "confused": { + "type": "integer" + }, + "eyes": { + "type": "integer" + }, + "heart": { + "type": "integer" + }, + "hooray": { + "type": "integer" + }, + "laugh": { + "type": "integer" + }, + "rocket": { + "type": "integer" + }, + "total_count": { + "type": "integer" + } + }, + "required": [ + "total_count", + "+1", + "-1", + "laugh", + "confused", + "heart", + "hooray", + "rocket", + "eyes" + ], + "type": [ + "null", + "object" + ] + }, + "updated_at": { + "type": "string" + }, + "user": { + "additionalProperties": false, + "properties": { + "avatar_url": { + "type": "string" + }, + "details": { + "additionalProperties": false, + "properties": { + "bio": { + "type": "string" + }, + "blog": { + "type": "string" + }, + "company": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "email": { + "type": "string" + }, + "followers": { + "type": "integer" + }, + "following": { + "type": "integer" + }, + "hireable": { + "type": "boolean" + }, + "location": { + "type": "string" + }, + "name": { + "type": "string" + }, + "owned_private_repos": { + "type": "integer" + }, + "private_gists": { + "type": "integer" + }, + "public_gists": { + "type": "integer" + }, + "public_repos": { + "type": "integer" + }, + "total_private_repos": { + "type": "integer" + }, + "twitter_username": { + "type": "string" + }, + "updated_at": { + "type": "string" + } + }, + "required": [ + "public_repos", + "public_gists", + "followers", + "following", + "created_at", + "updated_at" + ], + "type": [ + "null", + "object" + ] + }, + "id": { + "type": "integer" + }, + "login": { + "type": "string" + }, + "profile_url": { + "type": "string" + } + }, + "required": [ + "login" + ], + "type": [ + "null", + "object" + ] + } + }, + "required": [ + "id", + "html_url" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + }, + { + "items": { + "additionalProperties": false, + "properties": { + "active_lock_reason": { + "type": [ + "null", + "string" + ] + }, + "assignee": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "assignees": { + "items": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "author_association": { + "type": [ + "null", + "string" + ] + }, + "body": { + "type": [ + "null", + "string" + ] + }, + "closed_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "closed_by": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "comments": { + "type": [ + "null", + "integer" + ] + }, + "comments_url": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "draft": { + "type": [ + "null", + "boolean" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "issue_dependencies_summary": { + "additionalProperties": false, + "properties": { + "blocked_by": { + "type": [ + "null", + "integer" + ] + }, + "blocking": { + "type": [ + "null", + "integer" + ] + }, + "total_blocked_by": { + "type": [ + "null", + "integer" + ] + }, + "total_blocking": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "issue_field_values": { + "items": { + "additionalProperties": false, + "properties": { + "data_type": { + "type": "string" + }, + "issue_field_id": { + "type": "integer" + }, + "node_id": { + "type": "string" + }, + "single_select_option": { + "additionalProperties": false, + "properties": { + "color": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "color" + ], + "type": [ + "null", + "object" + ] + }, + "value": { + "type": [ + "string", + "number", + "boolean", + "null" + ] + } + }, + "required": [ + "issue_field_id", + "node_id", + "data_type", + "value" + ], + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "labels": { + "items": { + "additionalProperties": false, + "properties": { + "color": { + "type": "string" + }, + "default": { + "type": "boolean" + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "node_id": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "url", + "name", + "color", + "description", + "default", + "node_id" + ], + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "labels_url": { + "type": [ + "null", + "string" + ] + }, + "locked": { + "type": [ + "null", + "boolean" + ] + }, + "milestone": { + "additionalProperties": false, + "properties": { + "closed_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "closed_issues": { + "type": [ + "null", + "integer" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "creator": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "due_on": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "labels_url": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "number": { + "type": [ + "null", + "integer" + ] + }, + "open_issues": { + "type": [ + "null", + "integer" + ] + }, + "state": { + "type": [ + "null", + "string" + ] + }, + "title": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "number": { + "type": [ + "null", + "integer" + ] + }, + "parent_issue_url": { + "type": [ + "null", + "string" + ] + }, + "performed_via_github_app": { + "additionalProperties": false, + "properties": { + "client_id": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "events": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "external_url": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "installations_count": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "owner": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "actions": { + "type": [ + "null", + "string" + ] + }, + "actions_variables": { + "type": [ + "null", + "string" + ] + }, + "administration": { + "type": [ + "null", + "string" + ] + }, + "attestations": { + "type": [ + "null", + "string" + ] + }, + "blocking": { + "type": [ + "null", + "string" + ] + }, + "checks": { + "type": [ + "null", + "string" + ] + }, + "codespaces": { + "type": [ + "null", + "string" + ] + }, + "codespaces_lifecycle_admin": { + "type": [ + "null", + "string" + ] + }, + "codespaces_metadata": { + "type": [ + "null", + "string" + ] + }, + "codespaces_secrets": { + "type": [ + "null", + "string" + ] + }, + "codespaces_user_secrets": { + "type": [ + "null", + "string" + ] + }, + "content_references": { + "type": [ + "null", + "string" + ] + }, + "contents": { + "type": [ + "null", + "string" + ] + }, + "copilot_messages": { + "type": [ + "null", + "string" + ] + }, + "dependabot_secrets": { + "type": [ + "null", + "string" + ] + }, + "deployments": { + "type": [ + "null", + "string" + ] + }, + "discussions": { + "type": [ + "null", + "string" + ] + }, + "emails": { + "type": [ + "null", + "string" + ] + }, + "enterprise_ai_controls": { + "type": [ + "null", + "string" + ] + }, + "enterprise_copilot_metrics": { + "type": [ + "null", + "string" + ] + }, + "enterprise_credentials": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_enterprise_roles": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_org_roles": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_properties": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_properties_for_organizations": { + "type": [ + "null", + "string" + ] + }, + "enterprise_organization_installation_repositories": { + "type": [ + "null", + "string" + ] + }, + "enterprise_organization_installations": { + "type": [ + "null", + "string" + ] + }, + "enterprise_organizations": { + "type": [ + "null", + "string" + ] + }, + "enterprise_people": { + "type": [ + "null", + "string" + ] + }, + "enterprise_sso": { + "type": [ + "null", + "string" + ] + }, + "enterprise_teams": { + "type": [ + "null", + "string" + ] + }, + "environments": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "string" + ] + }, + "gists": { + "type": [ + "null", + "string" + ] + }, + "git_signing_ssh_public_keys": { + "type": [ + "null", + "string" + ] + }, + "gpg_keys": { + "type": [ + "null", + "string" + ] + }, + "interaction_limits": { + "type": [ + "null", + "string" + ] + }, + "issues": { + "type": [ + "null", + "string" + ] + }, + "keys": { + "type": [ + "null", + "string" + ] + }, + "members": { + "type": [ + "null", + "string" + ] + }, + "merge_queues": { + "type": [ + "null", + "string" + ] + }, + "metadata": { + "type": [ + "null", + "string" + ] + }, + "organization_actions_variables": { + "type": [ + "null", + "string" + ] + }, + "organization_administration": { + "type": [ + "null", + "string" + ] + }, + "organization_announcement_banners": { + "type": [ + "null", + "string" + ] + }, + "organization_api_insights": { + "type": [ + "null", + "string" + ] + }, + "organization_codespaces": { + "type": [ + "null", + "string" + ] + }, + "organization_codespaces_secrets": { + "type": [ + "null", + "string" + ] + }, + "organization_codespaces_settings": { + "type": [ + "null", + "string" + ] + }, + "organization_copilot_metrics": { + "type": [ + "null", + "string" + ] + }, + "organization_copilot_seat_management": { + "type": [ + "null", + "string" + ] + }, + "organization_custom_org_roles": { + "type": [ + "null", + "string" + ] + }, + "organization_custom_properties": { + "type": [ + "null", + "string" + ] + }, + "organization_custom_roles": { + "type": [ + "null", + "string" + ] + }, + "organization_dependabot_secrets": { + "type": [ + "null", + "string" + ] + }, + "organization_events": { + "type": [ + "null", + "string" + ] + }, + "organization_hooks": { + "type": [ + "null", + "string" + ] + }, + "organization_knowledge_bases": { + "type": [ + "null", + "string" + ] + }, + "organization_packages": { + "type": [ + "null", + "string" + ] + }, + "organization_personal_access_token_requests": { + "type": [ + "null", + "string" + ] + }, + "organization_personal_access_tokens": { + "type": [ + "null", + "string" + ] + }, + "organization_plan": { + "type": [ + "null", + "string" + ] + }, + "organization_pre_receive_hooks": { + "type": [ + "null", + "string" + ] + }, + "organization_projects": { + "type": [ + "null", + "string" + ] + }, + "organization_secrets": { + "type": [ + "null", + "string" + ] + }, + "organization_self_hosted_runners": { + "type": [ + "null", + "string" + ] + }, + "organization_user_blocking": { + "type": [ + "null", + "string" + ] + }, + "packages": { + "type": [ + "null", + "string" + ] + }, + "pages": { + "type": [ + "null", + "string" + ] + }, + "plan": { + "type": [ + "null", + "string" + ] + }, + "profile": { + "type": [ + "null", + "string" + ] + }, + "pull_requests": { + "type": [ + "null", + "string" + ] + }, + "repository_advisories": { + "type": [ + "null", + "string" + ] + }, + "repository_custom_properties": { + "type": [ + "null", + "string" + ] + }, + "repository_hooks": { + "type": [ + "null", + "string" + ] + }, + "repository_pre_receive_hooks": { + "type": [ + "null", + "string" + ] + }, + "repository_projects": { + "type": [ + "null", + "string" + ] + }, + "secret_scanning_alerts": { + "type": [ + "null", + "string" + ] + }, + "secrets": { + "type": [ + "null", + "string" + ] + }, + "security_events": { + "type": [ + "null", + "string" + ] + }, + "single_file": { + "type": [ + "null", + "string" + ] + }, + "starring": { + "type": [ + "null", + "string" + ] + }, + "statuses": { + "type": [ + "null", + "string" + ] + }, + "team_discussions": { + "type": [ + "null", + "string" + ] + }, + "user_events": { + "type": [ + "null", + "string" + ] + }, + "vulnerability_alerts": { + "type": [ + "null", + "string" + ] + }, + "watching": { + "type": [ + "null", + "string" + ] + }, + "workflows": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "slug": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "pinned_comment": { + "additionalProperties": false, + "properties": { + "author_association": { + "type": [ + "null", + "string" + ] + }, + "body": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "issue_url": { + "type": [ + "null", + "string" + ] + }, + "minimized": { + "additionalProperties": false, + "properties": { + "reason": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "performed_via_github_app": { + "additionalProperties": false, + "properties": { + "client_id": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "events": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "external_url": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "installations_count": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "owner": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "actions": { + "type": [ + "null", + "string" + ] + }, + "actions_variables": { + "type": [ + "null", + "string" + ] + }, + "administration": { + "type": [ + "null", + "string" + ] + }, + "attestations": { + "type": [ + "null", + "string" + ] + }, + "blocking": { + "type": [ + "null", + "string" + ] + }, + "checks": { + "type": [ + "null", + "string" + ] + }, + "codespaces": { + "type": [ + "null", + "string" + ] + }, + "codespaces_lifecycle_admin": { + "type": [ + "null", + "string" + ] + }, + "codespaces_metadata": { + "type": [ + "null", + "string" + ] + }, + "codespaces_secrets": { + "type": [ + "null", + "string" + ] + }, + "codespaces_user_secrets": { + "type": [ + "null", + "string" + ] + }, + "content_references": { + "type": [ + "null", + "string" + ] + }, + "contents": { + "type": [ + "null", + "string" + ] + }, + "copilot_messages": { + "type": [ + "null", + "string" + ] + }, + "dependabot_secrets": { + "type": [ + "null", + "string" + ] + }, + "deployments": { + "type": [ + "null", + "string" + ] + }, + "discussions": { + "type": [ + "null", + "string" + ] + }, + "emails": { + "type": [ + "null", + "string" + ] + }, + "enterprise_ai_controls": { + "type": [ + "null", + "string" + ] + }, + "enterprise_copilot_metrics": { + "type": [ + "null", + "string" + ] + }, + "enterprise_credentials": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_enterprise_roles": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_org_roles": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_properties": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_properties_for_organizations": { + "type": [ + "null", + "string" + ] + }, + "enterprise_organization_installation_repositories": { + "type": [ + "null", + "string" + ] + }, + "enterprise_organization_installations": { + "type": [ + "null", + "string" + ] + }, + "enterprise_organizations": { + "type": [ + "null", + "string" + ] + }, + "enterprise_people": { + "type": [ + "null", + "string" + ] + }, + "enterprise_sso": { + "type": [ + "null", + "string" + ] + }, + "enterprise_teams": { + "type": [ + "null", + "string" + ] + }, + "environments": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "string" + ] + }, + "gists": { + "type": [ + "null", + "string" + ] + }, + "git_signing_ssh_public_keys": { + "type": [ + "null", + "string" + ] + }, + "gpg_keys": { + "type": [ + "null", + "string" + ] + }, + "interaction_limits": { + "type": [ + "null", + "string" + ] + }, + "issues": { + "type": [ + "null", + "string" + ] + }, + "keys": { + "type": [ + "null", + "string" + ] + }, + "members": { + "type": [ + "null", + "string" + ] + }, + "merge_queues": { + "type": [ + "null", + "string" + ] + }, + "metadata": { + "type": [ + "null", + "string" + ] + }, + "organization_actions_variables": { + "type": [ + "null", + "string" + ] + }, + "organization_administration": { + "type": [ + "null", + "string" + ] + }, + "organization_announcement_banners": { + "type": [ + "null", + "string" + ] + }, + "organization_api_insights": { + "type": [ + "null", + "string" + ] + }, + "organization_codespaces": { + "type": [ + "null", + "string" + ] + }, + "organization_codespaces_secrets": { + "type": [ + "null", + "string" + ] + }, + "organization_codespaces_settings": { + "type": [ + "null", + "string" + ] + }, + "organization_copilot_metrics": { + "type": [ + "null", + "string" + ] + }, + "organization_copilot_seat_management": { + "type": [ + "null", + "string" + ] + }, + "organization_custom_org_roles": { + "type": [ + "null", + "string" + ] + }, + "organization_custom_properties": { + "type": [ + "null", + "string" + ] + }, + "organization_custom_roles": { + "type": [ + "null", + "string" + ] + }, + "organization_dependabot_secrets": { + "type": [ + "null", + "string" + ] + }, + "organization_events": { + "type": [ + "null", + "string" + ] + }, + "organization_hooks": { + "type": [ + "null", + "string" + ] + }, + "organization_knowledge_bases": { + "type": [ + "null", + "string" + ] + }, + "organization_packages": { + "type": [ + "null", + "string" + ] + }, + "organization_personal_access_token_requests": { + "type": [ + "null", + "string" + ] + }, + "organization_personal_access_tokens": { + "type": [ + "null", + "string" + ] + }, + "organization_plan": { + "type": [ + "null", + "string" + ] + }, + "organization_pre_receive_hooks": { + "type": [ + "null", + "string" + ] + }, + "organization_projects": { + "type": [ + "null", + "string" + ] + }, + "organization_secrets": { + "type": [ + "null", + "string" + ] + }, + "organization_self_hosted_runners": { + "type": [ + "null", + "string" + ] + }, + "organization_user_blocking": { + "type": [ + "null", + "string" + ] + }, + "packages": { + "type": [ + "null", + "string" + ] + }, + "pages": { + "type": [ + "null", + "string" + ] + }, + "plan": { + "type": [ + "null", + "string" + ] + }, + "profile": { + "type": [ + "null", + "string" + ] + }, + "pull_requests": { + "type": [ + "null", + "string" + ] + }, + "repository_advisories": { + "type": [ + "null", + "string" + ] + }, + "repository_custom_properties": { + "type": [ + "null", + "string" + ] + }, + "repository_hooks": { + "type": [ + "null", + "string" + ] + }, + "repository_pre_receive_hooks": { + "type": [ + "null", + "string" + ] + }, + "repository_projects": { + "type": [ + "null", + "string" + ] + }, + "secret_scanning_alerts": { + "type": [ + "null", + "string" + ] + }, + "secrets": { + "type": [ + "null", + "string" + ] + }, + "security_events": { + "type": [ + "null", + "string" + ] + }, + "single_file": { + "type": [ + "null", + "string" + ] + }, + "starring": { + "type": [ + "null", + "string" + ] + }, + "statuses": { + "type": [ + "null", + "string" + ] + }, + "team_discussions": { + "type": [ + "null", + "string" + ] + }, + "user_events": { + "type": [ + "null", + "string" + ] + }, + "vulnerability_alerts": { + "type": [ + "null", + "string" + ] + }, + "watching": { + "type": [ + "null", + "string" + ] + }, + "workflows": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "slug": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "pin": { + "additionalProperties": false, + "properties": { + "pinned_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "pinned_by": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "reactions": { + "additionalProperties": false, + "properties": { + "+1": { + "type": [ + "null", + "integer" + ] + }, + "-1": { + "type": [ + "null", + "integer" + ] + }, + "confused": { + "type": [ + "null", + "integer" + ] + }, + "eyes": { + "type": [ + "null", + "integer" + ] + }, + "heart": { + "type": [ + "null", + "integer" + ] + }, + "hooray": { + "type": [ + "null", + "integer" + ] + }, + "laugh": { + "type": [ + "null", + "integer" + ] + }, + "rocket": { + "type": [ + "null", + "integer" + ] + }, + "total_count": { + "type": [ + "null", + "integer" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "pull_request": { + "additionalProperties": false, + "properties": { + "diff_url": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "merged_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "patch_url": { + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "reactions": { + "additionalProperties": false, + "properties": { + "+1": { + "type": [ + "null", + "integer" + ] + }, + "-1": { + "type": [ + "null", + "integer" + ] + }, + "confused": { + "type": [ + "null", + "integer" + ] + }, + "eyes": { + "type": [ + "null", + "integer" + ] + }, + "heart": { + "type": [ + "null", + "integer" + ] + }, + "hooray": { + "type": [ + "null", + "integer" + ] + }, + "laugh": { + "type": [ + "null", + "integer" + ] + }, + "rocket": { + "type": [ + "null", + "integer" + ] + }, + "total_count": { + "type": [ + "null", + "integer" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "repository": { + "$ref": "#/$defs/repository", + "type": [ + "null", + "object" + ] + }, + "repository_url": { + "type": [ + "null", + "string" + ] + }, + "state": { + "type": [ + "null", + "string" + ] + }, + "state_reason": { + "type": [ + "null", + "string" + ] + }, + "sub_issues_summary": { + "additionalProperties": false, + "properties": { + "completed": { + "type": [ + "null", + "integer" + ] + }, + "percent_completed": { + "type": [ + "null", + "integer" + ] + }, + "total": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "title": { + "type": [ + "null", + "string" + ] + }, + "type": { + "additionalProperties": false, + "properties": { + "color": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "is_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + } + ], + "type": "array" + }, + { + "additionalProperties": false, + "properties": { + "parent": { + "additionalProperties": false, + "properties": { + "number": { + "type": "integer" + }, + "repository": { + "type": "string" + }, + "state": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "number", + "repository", + "state", + "title", + "url" + ], + "type": [ + "null", + "object" + ] + } + }, + "required": [ + "parent" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "labels": { + "items": { + "additionalProperties": false, + "properties": { + "color": { + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "color", + "description", + "id", + "name" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + }, + "totalCount": { + "type": "integer" + } + }, + "required": [ + "labels", + "totalCount" + ], + "type": "object" + } + ] + } } \ No newline at end of file diff --git a/pkg/github/__toolsnaps__/issue_read_typed.snap b/pkg/github/__toolsnaps__/issue_read_typed.snap new file mode 100644 index 0000000000..ffd85506fc --- /dev/null +++ b/pkg/github/__toolsnaps__/issue_read_typed.snap @@ -0,0 +1,9394 @@ +{ + "annotations": { + "idempotentHint": false, + "readOnlyHint": true, + "title": "Get issue details" + }, + "description": "Get information about a specific issue in a GitHub repository.", + "icons": [ + { + "mimeType": "image/png", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAC2UlEQVRIicWVMUyTaRjHf/+vVUpOJOdilOYoUvVreq2CDmLOwdlAS5xMbrrhBifjYG7QjYuJw108nZx1huLgYlw0QshxChUK2koxHHcuCmgsFfieG0or3kGPSoz/8X3f5/97nvfN8z7wmaVqm9FodFfR/EnMugy5giCAwYwgI9Ff9Hl9L9Lp1zUBgsGO+rqGwnlhF4CdwBSyAUwvS1G220zHBSFgHtmVxYWvfp2ZGSj8LyAcjgfZphTQZtAr7OdsZvSP9RIJR+LtQhcNusF+d1aUfPp05M8NAavmg8AOk3cmN56+s1Hpa7U/cviUYbcw3jgex9ZCKoBgsKM+0PDuAdBq2He5zOiTzZiXtc+NxRw598GeLRcWTuTz+UUAp3ygrqFwHmgzeWdqNQd4PpFOy/gedNQfaDz3UQXRaHRX0fNPGdzNZUZO12q+VuHIoV7g5Hu/1/IinX7tABTNnwR2SvRsxRzAzOsBGuuWfAkoX5FZFzCVHR95tFVAbiI9DEwj6wLwl5YVMTRYLTDsxjuRrgGYYz/kxkbvbXRWMOBB24cKYI9ks1X8hXQDaAaa5XG9WjImZgV71wI+m8qAv8y0t1pSmP0ITANTmHO2qqvRZDALlTdgHKyjWkx2YvQ2cHtTacMxYBhWK5DoF4TCkXj7Jg02VKsbOwI0Y+qvALZrOQXMC13cKkDSJWBuJUCqAhgbG3uF7IpBcn/k8KlPNQ+78U5QQuhy/vHjuQoAYPndwi9gw4bd2ufGYrWatxz8No50ExhaKsz9Vl6vAPL5/KKzoiTGG0fOg1oqCbvxTp/juw/M+zynu/yTwjoD58CBQ02ez/pAR4E+M69ntf3/o1Y3dqR050oAQz7P6Z6cfPRRw647MkOhUMAfaDyH+AloBKYNPRT292rQHoMOSp09J3TZlt5ezWazxX97VR3638RiX9ct+RImSyBcrDT0ETMyMp4ptRIgVX7QL6J/ALSUEwJ5rdg2AAAAAElFTkSuQmCC", + "theme": "light" + }, + { + "mimeType": "image/png", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAABxElEQVRIibWVvW4TURCFv0vlNEDcIHAkKAERJOIKSjoUArwBPwUFFaKIIngAJARCPIgdh4cgRBYt6ZIAEYEqdhpEw0fhCbkKa68dxyNtsfNzzpnZu3NhwpYGBdUqcA+4A1wEZiK0DawD74FWSml3JAJ1CngGLAIngU1gFfgZKWeAG8AFoAu8At6mlH6VtqTOqJ/UP2pDnRuQO6c27VlbrQ0Dvq121Fulag7q5qPmW18SdSqUd9Qrw4Jn9bNR21YrRQkvYixDKy/AuB3jWjocqKpdtXFU8AxrOTqZzp2PgvnaMRDUA+tB7mypG+OCZ3hbahPgRPguAR9LihaicEu9WcKxClzOi/fU1wPAk7rjgX0uEfNG3cs7mJjtE+wA5/olpZQEHgNf6K2NJyW4NeD7v7c4WptjSc0svlMjdzyM2fbdOyOA7x/T+7mzGj9H8xgIWuquevpw4HmsivkxwBdC/WJRsBKLqqPOHgH8aqybtcJlF0m1WLndUToJ5V31q9r3NOYk7Wh1Wa0PyK3HzA3l/4H3uzIrwFNgCThF7/x/AH5EylngOnAe6AAvgXcppd9DEWRE08DdeIou/RVgJaXUGYQzUfsL+zmwV7BtIq0AAAAASUVORK5CYII=", + "theme": "dark" + } + ], + "inputSchema": { + "properties": { + "issue_number": { + "description": "The number of the issue", + "type": "number" + }, + "method": { + "description": "The read operation to perform on a single issue.\nOptions are:\n1. get - Get issue details. Also returns best-effort hierarchy flags (`has_parent`, `has_children`); `parent` and `sub_issues_summary` are optional relationship summaries, and `closed_by_pull_requests` summarizes the pull requests configured to close the issue as `total_count` plus up to 5 `references`.\n2. get_comments - Get issue comments.\n3. get_sub_issues - Get sub-issues (children) of the issue.\n4. get_parent - Get the parent issue, if this issue is a sub-issue of another.\n5. get_labels - Get labels assigned to the issue.\n", + "enum": [ + "get", + "get_comments", + "get_sub_issues", + "get_parent", + "get_labels" + ], + "type": "string" + }, + "owner": { + "description": "The owner of the repository", + "type": "string", + "x-mcp-header": "owner" + }, + "page": { + "description": "Page number for pagination (min 1)", + "minimum": 1, + "type": "number" + }, + "perPage": { + "description": "Results per page for pagination (min 1, max 100)", + "maximum": 100, + "minimum": 1, + "type": "number" + }, + "repo": { + "description": "The name of the repository", + "type": "string", + "x-mcp-header": "repo" + } + }, + "required": [ + "method", + "owner", + "repo", + "issue_number" + ], + "type": "object" + }, + "name": "issue_read", + "outputSchema": { + "$defs": { + "repository": { + "additionalProperties": false, + "properties": { + "allow_auto_merge": { + "type": [ + "null", + "boolean" + ] + }, + "allow_forking": { + "type": [ + "null", + "boolean" + ] + }, + "allow_merge_commit": { + "type": [ + "null", + "boolean" + ] + }, + "allow_rebase_merge": { + "type": [ + "null", + "boolean" + ] + }, + "allow_squash_merge": { + "type": [ + "null", + "boolean" + ] + }, + "allow_update_branch": { + "type": [ + "null", + "boolean" + ] + }, + "archive_url": { + "type": [ + "null", + "string" + ] + }, + "archived": { + "type": [ + "null", + "boolean" + ] + }, + "assignees_url": { + "type": [ + "null", + "string" + ] + }, + "auto_init": { + "type": [ + "null", + "boolean" + ] + }, + "blobs_url": { + "type": [ + "null", + "string" + ] + }, + "branches_url": { + "type": [ + "null", + "string" + ] + }, + "clone_url": { + "type": [ + "null", + "string" + ] + }, + "code_of_conduct": { + "additionalProperties": false, + "properties": { + "body": { + "type": [ + "null", + "string" + ] + }, + "key": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "collaborators_url": { + "type": [ + "null", + "string" + ] + }, + "comments_url": { + "type": [ + "null", + "string" + ] + }, + "commits_url": { + "type": [ + "null", + "string" + ] + }, + "compare_url": { + "type": [ + "null", + "string" + ] + }, + "contents_url": { + "type": [ + "null", + "string" + ] + }, + "contributors_url": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "custom_properties": { + "additionalProperties": true, + "type": "object" + }, + "default_branch": { + "type": [ + "null", + "string" + ] + }, + "delete_branch_on_merge": { + "type": [ + "null", + "boolean" + ] + }, + "deployments_url": { + "type": [ + "null", + "string" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "disabled": { + "type": [ + "null", + "boolean" + ] + }, + "downloads_url": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "fork": { + "type": [ + "null", + "boolean" + ] + }, + "forks_count": { + "type": [ + "null", + "integer" + ] + }, + "forks_url": { + "type": [ + "null", + "string" + ] + }, + "full_name": { + "type": [ + "null", + "string" + ] + }, + "git_commits_url": { + "type": [ + "null", + "string" + ] + }, + "git_refs_url": { + "type": [ + "null", + "string" + ] + }, + "git_tags_url": { + "type": [ + "null", + "string" + ] + }, + "git_url": { + "type": [ + "null", + "string" + ] + }, + "gitignore_template": { + "type": [ + "null", + "string" + ] + }, + "has_discussions": { + "type": [ + "null", + "boolean" + ] + }, + "has_downloads": { + "type": [ + "null", + "boolean" + ] + }, + "has_issues": { + "type": [ + "null", + "boolean" + ] + }, + "has_pages": { + "type": [ + "null", + "boolean" + ] + }, + "has_projects": { + "type": [ + "null", + "boolean" + ] + }, + "has_pull_requests": { + "type": [ + "null", + "boolean" + ] + }, + "has_wiki": { + "type": [ + "null", + "boolean" + ] + }, + "homepage": { + "type": [ + "null", + "string" + ] + }, + "hooks_url": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "is_template": { + "type": [ + "null", + "boolean" + ] + }, + "issue_comment_url": { + "type": [ + "null", + "string" + ] + }, + "issue_events_url": { + "type": [ + "null", + "string" + ] + }, + "issues_url": { + "type": [ + "null", + "string" + ] + }, + "keys_url": { + "type": [ + "null", + "string" + ] + }, + "labels_url": { + "type": [ + "null", + "string" + ] + }, + "language": { + "type": [ + "null", + "string" + ] + }, + "languages_url": { + "type": [ + "null", + "string" + ] + }, + "license": { + "additionalProperties": false, + "properties": { + "body": { + "type": [ + "null", + "string" + ] + }, + "conditions": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "featured": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "implementation": { + "type": [ + "null", + "string" + ] + }, + "key": { + "type": [ + "null", + "string" + ] + }, + "limitations": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "permissions": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "spdx_id": { + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "license_template": { + "type": [ + "null", + "string" + ] + }, + "master_branch": { + "type": [ + "null", + "string" + ] + }, + "merge_commit_message": { + "type": [ + "null", + "string" + ] + }, + "merge_commit_title": { + "type": [ + "null", + "string" + ] + }, + "merges_url": { + "type": [ + "null", + "string" + ] + }, + "milestones_url": { + "type": [ + "null", + "string" + ] + }, + "mirror_url": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "network_count": { + "type": [ + "null", + "integer" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notifications_url": { + "type": [ + "null", + "string" + ] + }, + "open_issues": { + "type": [ + "null", + "integer" + ] + }, + "open_issues_count": { + "type": [ + "null", + "integer" + ] + }, + "organization": { + "additionalProperties": false, + "properties": { + "advanced_security_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "archived_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "billing_email": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "default_repository_branch": { + "type": [ + "null", + "string" + ] + }, + "default_repository_permission": { + "type": [ + "null", + "string" + ] + }, + "default_repository_settings": { + "type": [ + "null", + "string" + ] + }, + "dependabot_alerts_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "dependabot_security_updates_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "dependency_graph_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "deploy_keys_enabled_for_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "display_commenter_full_name_setting_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "has_organization_projects": { + "type": [ + "null", + "boolean" + ] + }, + "has_repository_projects": { + "type": [ + "null", + "boolean" + ] + }, + "hooks_url": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "is_verified": { + "type": [ + "null", + "boolean" + ] + }, + "issues_url": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "members_allowed_repository_creation_type": { + "type": [ + "null", + "string" + ] + }, + "members_can_change_repo_visibility": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_internal_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_pages": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_private_pages": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_private_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_public_pages": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_public_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_teams": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_delete_issues": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_delete_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_fork_private_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_invite_outside_collaborators": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_view_dependency_insights": { + "type": [ + "null", + "boolean" + ] + }, + "members_url": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_members_url": { + "type": [ + "null", + "string" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "readers_can_create_discussions": { + "type": [ + "null", + "boolean" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "secret_scanning_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "secret_scanning_push_protection_custom_link": { + "type": [ + "null", + "string" + ] + }, + "secret_scanning_push_protection_custom_link_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "secret_scanning_push_protection_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "secret_scanning_validity_checks_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_requirement_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "web_commit_signoff_required": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "owner": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "parent": { + "$ref": "#/$defs/repository", + "type": [ + "null", + "object" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private": { + "type": [ + "null", + "boolean" + ] + }, + "pull_request_creation_policy": { + "type": [ + "null", + "string" + ] + }, + "pulls_url": { + "type": [ + "null", + "string" + ] + }, + "pushed_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "releases_url": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "security_and_analysis": { + "additionalProperties": false, + "properties": { + "advanced_security": { + "additionalProperties": false, + "properties": { + "status": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "code_security": { + "additionalProperties": false, + "properties": { + "status": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "dependabot_security_updates": { + "additionalProperties": false, + "properties": { + "status": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "secret_scanning": { + "additionalProperties": false, + "properties": { + "status": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "secret_scanning_push_protection": { + "additionalProperties": false, + "properties": { + "status": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "secret_scanning_validity_checks": { + "additionalProperties": false, + "properties": { + "status": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "size": { + "type": [ + "null", + "integer" + ] + }, + "source": { + "$ref": "#/$defs/repository", + "type": [ + "null", + "object" + ] + }, + "squash_merge_commit_message": { + "type": [ + "null", + "string" + ] + }, + "squash_merge_commit_title": { + "type": [ + "null", + "string" + ] + }, + "ssh_url": { + "type": [ + "null", + "string" + ] + }, + "stargazers_count": { + "type": [ + "null", + "integer" + ] + }, + "stargazers_url": { + "type": [ + "null", + "string" + ] + }, + "statuses_url": { + "type": [ + "null", + "string" + ] + }, + "subscribers_count": { + "type": [ + "null", + "integer" + ] + }, + "subscribers_url": { + "type": [ + "null", + "string" + ] + }, + "subscription_url": { + "type": [ + "null", + "string" + ] + }, + "svn_url": { + "type": [ + "null", + "string" + ] + }, + "tags_url": { + "type": [ + "null", + "string" + ] + }, + "team_id": { + "type": [ + "null", + "integer" + ] + }, + "teams_url": { + "type": [ + "null", + "string" + ] + }, + "template_repository": { + "$ref": "#/$defs/repository", + "type": [ + "null", + "object" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "topics": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "trees_url": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "use_squash_pr_title_as_default": { + "type": [ + "null", + "boolean" + ] + }, + "visibility": { + "type": [ + "null", + "string" + ] + }, + "watchers": { + "type": [ + "null", + "integer" + ] + }, + "watchers_count": { + "type": [ + "null", + "integer" + ] + }, + "web_commit_signoff_required": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "object", + "null" + ] + }, + "team": { + "additionalProperties": false, + "properties": { + "access_source": { + "type": [ + "null", + "string" + ] + }, + "assignment": { + "type": [ + "null", + "string" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "members_count": { + "type": [ + "null", + "integer" + ] + }, + "members_url": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_setting": { + "type": [ + "null", + "string" + ] + }, + "organization": { + "additionalProperties": false, + "properties": { + "advanced_security_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "archived_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "billing_email": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "default_repository_branch": { + "type": [ + "null", + "string" + ] + }, + "default_repository_permission": { + "type": [ + "null", + "string" + ] + }, + "default_repository_settings": { + "type": [ + "null", + "string" + ] + }, + "dependabot_alerts_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "dependabot_security_updates_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "dependency_graph_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "deploy_keys_enabled_for_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "display_commenter_full_name_setting_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "has_organization_projects": { + "type": [ + "null", + "boolean" + ] + }, + "has_repository_projects": { + "type": [ + "null", + "boolean" + ] + }, + "hooks_url": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "is_verified": { + "type": [ + "null", + "boolean" + ] + }, + "issues_url": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "members_allowed_repository_creation_type": { + "type": [ + "null", + "string" + ] + }, + "members_can_change_repo_visibility": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_internal_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_pages": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_private_pages": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_private_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_public_pages": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_public_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_teams": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_delete_issues": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_delete_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_fork_private_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_invite_outside_collaborators": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_view_dependency_insights": { + "type": [ + "null", + "boolean" + ] + }, + "members_url": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_members_url": { + "type": [ + "null", + "string" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "readers_can_create_discussions": { + "type": [ + "null", + "boolean" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "secret_scanning_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "secret_scanning_push_protection_custom_link": { + "type": [ + "null", + "string" + ] + }, + "secret_scanning_push_protection_custom_link_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "secret_scanning_push_protection_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "secret_scanning_validity_checks_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_requirement_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "web_commit_signoff_required": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "parent": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "permission": { + "type": [ + "null", + "string" + ] + }, + "permissions": { + "additionalProperties": { + "type": "boolean" + }, + "type": "object" + }, + "privacy": { + "type": [ + "null", + "string" + ] + }, + "repos_count": { + "type": [ + "null", + "integer" + ] + }, + "repositories_url": { + "type": [ + "null", + "string" + ] + }, + "slug": { + "type": [ + "null", + "string" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "object", + "null" + ] + } + }, + "oneOf": [ + { + "type": "null" + }, + { + "additionalProperties": false, + "properties": { + "assignees": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "author_association": { + "type": "string" + }, + "body": { + "type": "string" + }, + "closed_at": { + "type": "string" + }, + "closed_by": { + "type": "string" + }, + "closed_by_pull_requests": { + "additionalProperties": false, + "properties": { + "references": { + "items": { + "additionalProperties": false, + "properties": { + "number": { + "type": "integer" + }, + "repository": { + "type": "string" + }, + "state": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "number", + "title", + "state", + "url" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + }, + "total_count": { + "type": "integer" + } + }, + "required": [ + "total_count", + "references" + ], + "type": [ + "null", + "object" + ] + }, + "comments": { + "type": "integer" + }, + "created_at": { + "type": "string" + }, + "draft": { + "type": "boolean" + }, + "field_values": { + "items": { + "additionalProperties": false, + "properties": { + "field": { + "type": "string" + }, + "value": { + "type": "string" + }, + "values": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + } + }, + "required": [ + "field" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + }, + "has_children": { + "type": [ + "null", + "boolean" + ] + }, + "has_parent": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": "string" + }, + "issue_type": { + "type": "string" + }, + "labels": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "locked": { + "type": "boolean" + }, + "milestone": { + "type": "string" + }, + "number": { + "type": "integer" + }, + "parent": { + "additionalProperties": false, + "properties": { + "number": { + "type": "integer" + }, + "repository": { + "type": "string" + }, + "state": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "number", + "title", + "state", + "url" + ], + "type": [ + "null", + "object" + ] + }, + "reactions": { + "additionalProperties": false, + "properties": { + "+1": { + "type": "integer" + }, + "-1": { + "type": "integer" + }, + "confused": { + "type": "integer" + }, + "eyes": { + "type": "integer" + }, + "heart": { + "type": "integer" + }, + "hooray": { + "type": "integer" + }, + "laugh": { + "type": "integer" + }, + "rocket": { + "type": "integer" + }, + "total_count": { + "type": "integer" + } + }, + "required": [ + "total_count", + "+1", + "-1", + "laugh", + "confused", + "heart", + "hooray", + "rocket", + "eyes" + ], + "type": [ + "null", + "object" + ] + }, + "state": { + "type": "string" + }, + "state_reason": { + "type": "string" + }, + "sub_issues_summary": { + "additionalProperties": false, + "properties": { + "completed": { + "type": "integer" + }, + "percent_completed": { + "type": "integer" + }, + "total": { + "type": "integer" + } + }, + "required": [ + "total", + "completed", + "percent_completed" + ], + "type": [ + "null", + "object" + ] + }, + "title": { + "type": "string" + }, + "updated_at": { + "type": "string" + }, + "user": { + "additionalProperties": false, + "properties": { + "avatar_url": { + "type": "string" + }, + "details": { + "additionalProperties": false, + "properties": { + "bio": { + "type": "string" + }, + "blog": { + "type": "string" + }, + "company": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "email": { + "type": "string" + }, + "followers": { + "type": "integer" + }, + "following": { + "type": "integer" + }, + "hireable": { + "type": "boolean" + }, + "location": { + "type": "string" + }, + "name": { + "type": "string" + }, + "owned_private_repos": { + "type": "integer" + }, + "private_gists": { + "type": "integer" + }, + "public_gists": { + "type": "integer" + }, + "public_repos": { + "type": "integer" + }, + "total_private_repos": { + "type": "integer" + }, + "twitter_username": { + "type": "string" + }, + "updated_at": { + "type": "string" + } + }, + "required": [ + "public_repos", + "public_gists", + "followers", + "following", + "created_at", + "updated_at" + ], + "type": [ + "null", + "object" + ] + }, + "id": { + "type": "integer" + }, + "login": { + "type": "string" + }, + "profile_url": { + "type": "string" + } + }, + "required": [ + "login" + ], + "type": [ + "null", + "object" + ] + } + }, + "required": [ + "number", + "title", + "state", + "assignees" + ], + "type": "object" + }, + { + "anyOf": [ + { + "items": { + "additionalProperties": false, + "properties": { + "author_association": { + "type": "string" + }, + "body": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "html_url": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "reactions": { + "additionalProperties": false, + "properties": { + "+1": { + "type": "integer" + }, + "-1": { + "type": "integer" + }, + "confused": { + "type": "integer" + }, + "eyes": { + "type": "integer" + }, + "heart": { + "type": "integer" + }, + "hooray": { + "type": "integer" + }, + "laugh": { + "type": "integer" + }, + "rocket": { + "type": "integer" + }, + "total_count": { + "type": "integer" + } + }, + "required": [ + "total_count", + "+1", + "-1", + "laugh", + "confused", + "heart", + "hooray", + "rocket", + "eyes" + ], + "type": [ + "null", + "object" + ] + }, + "updated_at": { + "type": "string" + }, + "user": { + "additionalProperties": false, + "properties": { + "avatar_url": { + "type": "string" + }, + "details": { + "additionalProperties": false, + "properties": { + "bio": { + "type": "string" + }, + "blog": { + "type": "string" + }, + "company": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "email": { + "type": "string" + }, + "followers": { + "type": "integer" + }, + "following": { + "type": "integer" + }, + "hireable": { + "type": "boolean" + }, + "location": { + "type": "string" + }, + "name": { + "type": "string" + }, + "owned_private_repos": { + "type": "integer" + }, + "private_gists": { + "type": "integer" + }, + "public_gists": { + "type": "integer" + }, + "public_repos": { + "type": "integer" + }, + "total_private_repos": { + "type": "integer" + }, + "twitter_username": { + "type": "string" + }, + "updated_at": { + "type": "string" + } + }, + "required": [ + "public_repos", + "public_gists", + "followers", + "following", + "created_at", + "updated_at" + ], + "type": [ + "null", + "object" + ] + }, + "id": { + "type": "integer" + }, + "login": { + "type": "string" + }, + "profile_url": { + "type": "string" + } + }, + "required": [ + "login" + ], + "type": [ + "null", + "object" + ] + } + }, + "required": [ + "id", + "html_url" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + }, + { + "items": { + "additionalProperties": false, + "properties": { + "active_lock_reason": { + "type": [ + "null", + "string" + ] + }, + "assignee": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "assignees": { + "items": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "author_association": { + "type": [ + "null", + "string" + ] + }, + "body": { + "type": [ + "null", + "string" + ] + }, + "closed_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "closed_by": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "comments": { + "type": [ + "null", + "integer" + ] + }, + "comments_url": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "draft": { + "type": [ + "null", + "boolean" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "issue_dependencies_summary": { + "additionalProperties": false, + "properties": { + "blocked_by": { + "type": [ + "null", + "integer" + ] + }, + "blocking": { + "type": [ + "null", + "integer" + ] + }, + "total_blocked_by": { + "type": [ + "null", + "integer" + ] + }, + "total_blocking": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "issue_field_values": { + "items": { + "additionalProperties": false, + "properties": { + "data_type": { + "type": "string" + }, + "issue_field_id": { + "type": "integer" + }, + "node_id": { + "type": "string" + }, + "single_select_option": { + "additionalProperties": false, + "properties": { + "color": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "color" + ], + "type": [ + "null", + "object" + ] + }, + "value": { + "type": [ + "string", + "number", + "boolean", + "null" + ] + } + }, + "required": [ + "issue_field_id", + "node_id", + "data_type", + "value" + ], + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "labels": { + "items": { + "additionalProperties": false, + "properties": { + "color": { + "type": "string" + }, + "default": { + "type": "boolean" + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "node_id": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "url", + "name", + "color", + "description", + "default", + "node_id" + ], + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "labels_url": { + "type": [ + "null", + "string" + ] + }, + "locked": { + "type": [ + "null", + "boolean" + ] + }, + "milestone": { + "additionalProperties": false, + "properties": { + "closed_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "closed_issues": { + "type": [ + "null", + "integer" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "creator": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "due_on": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "labels_url": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "number": { + "type": [ + "null", + "integer" + ] + }, + "open_issues": { + "type": [ + "null", + "integer" + ] + }, + "state": { + "type": [ + "null", + "string" + ] + }, + "title": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "number": { + "type": [ + "null", + "integer" + ] + }, + "parent_issue_url": { + "type": [ + "null", + "string" + ] + }, + "performed_via_github_app": { + "additionalProperties": false, + "properties": { + "client_id": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "events": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "external_url": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "installations_count": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "owner": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "actions": { + "type": [ + "null", + "string" + ] + }, + "actions_variables": { + "type": [ + "null", + "string" + ] + }, + "administration": { + "type": [ + "null", + "string" + ] + }, + "attestations": { + "type": [ + "null", + "string" + ] + }, + "blocking": { + "type": [ + "null", + "string" + ] + }, + "checks": { + "type": [ + "null", + "string" + ] + }, + "codespaces": { + "type": [ + "null", + "string" + ] + }, + "codespaces_lifecycle_admin": { + "type": [ + "null", + "string" + ] + }, + "codespaces_metadata": { + "type": [ + "null", + "string" + ] + }, + "codespaces_secrets": { + "type": [ + "null", + "string" + ] + }, + "codespaces_user_secrets": { + "type": [ + "null", + "string" + ] + }, + "content_references": { + "type": [ + "null", + "string" + ] + }, + "contents": { + "type": [ + "null", + "string" + ] + }, + "copilot_messages": { + "type": [ + "null", + "string" + ] + }, + "dependabot_secrets": { + "type": [ + "null", + "string" + ] + }, + "deployments": { + "type": [ + "null", + "string" + ] + }, + "discussions": { + "type": [ + "null", + "string" + ] + }, + "emails": { + "type": [ + "null", + "string" + ] + }, + "enterprise_ai_controls": { + "type": [ + "null", + "string" + ] + }, + "enterprise_copilot_metrics": { + "type": [ + "null", + "string" + ] + }, + "enterprise_credentials": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_enterprise_roles": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_org_roles": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_properties": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_properties_for_organizations": { + "type": [ + "null", + "string" + ] + }, + "enterprise_organization_installation_repositories": { + "type": [ + "null", + "string" + ] + }, + "enterprise_organization_installations": { + "type": [ + "null", + "string" + ] + }, + "enterprise_organizations": { + "type": [ + "null", + "string" + ] + }, + "enterprise_people": { + "type": [ + "null", + "string" + ] + }, + "enterprise_sso": { + "type": [ + "null", + "string" + ] + }, + "enterprise_teams": { + "type": [ + "null", + "string" + ] + }, + "environments": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "string" + ] + }, + "gists": { + "type": [ + "null", + "string" + ] + }, + "git_signing_ssh_public_keys": { + "type": [ + "null", + "string" + ] + }, + "gpg_keys": { + "type": [ + "null", + "string" + ] + }, + "interaction_limits": { + "type": [ + "null", + "string" + ] + }, + "issues": { + "type": [ + "null", + "string" + ] + }, + "keys": { + "type": [ + "null", + "string" + ] + }, + "members": { + "type": [ + "null", + "string" + ] + }, + "merge_queues": { + "type": [ + "null", + "string" + ] + }, + "metadata": { + "type": [ + "null", + "string" + ] + }, + "organization_actions_variables": { + "type": [ + "null", + "string" + ] + }, + "organization_administration": { + "type": [ + "null", + "string" + ] + }, + "organization_announcement_banners": { + "type": [ + "null", + "string" + ] + }, + "organization_api_insights": { + "type": [ + "null", + "string" + ] + }, + "organization_codespaces": { + "type": [ + "null", + "string" + ] + }, + "organization_codespaces_secrets": { + "type": [ + "null", + "string" + ] + }, + "organization_codespaces_settings": { + "type": [ + "null", + "string" + ] + }, + "organization_copilot_metrics": { + "type": [ + "null", + "string" + ] + }, + "organization_copilot_seat_management": { + "type": [ + "null", + "string" + ] + }, + "organization_custom_org_roles": { + "type": [ + "null", + "string" + ] + }, + "organization_custom_properties": { + "type": [ + "null", + "string" + ] + }, + "organization_custom_roles": { + "type": [ + "null", + "string" + ] + }, + "organization_dependabot_secrets": { + "type": [ + "null", + "string" + ] + }, + "organization_events": { + "type": [ + "null", + "string" + ] + }, + "organization_hooks": { + "type": [ + "null", + "string" + ] + }, + "organization_knowledge_bases": { + "type": [ + "null", + "string" + ] + }, + "organization_packages": { + "type": [ + "null", + "string" + ] + }, + "organization_personal_access_token_requests": { + "type": [ + "null", + "string" + ] + }, + "organization_personal_access_tokens": { + "type": [ + "null", + "string" + ] + }, + "organization_plan": { + "type": [ + "null", + "string" + ] + }, + "organization_pre_receive_hooks": { + "type": [ + "null", + "string" + ] + }, + "organization_projects": { + "type": [ + "null", + "string" + ] + }, + "organization_secrets": { + "type": [ + "null", + "string" + ] + }, + "organization_self_hosted_runners": { + "type": [ + "null", + "string" + ] + }, + "organization_user_blocking": { + "type": [ + "null", + "string" + ] + }, + "packages": { + "type": [ + "null", + "string" + ] + }, + "pages": { + "type": [ + "null", + "string" + ] + }, + "plan": { + "type": [ + "null", + "string" + ] + }, + "profile": { + "type": [ + "null", + "string" + ] + }, + "pull_requests": { + "type": [ + "null", + "string" + ] + }, + "repository_advisories": { + "type": [ + "null", + "string" + ] + }, + "repository_custom_properties": { + "type": [ + "null", + "string" + ] + }, + "repository_hooks": { + "type": [ + "null", + "string" + ] + }, + "repository_pre_receive_hooks": { + "type": [ + "null", + "string" + ] + }, + "repository_projects": { + "type": [ + "null", + "string" + ] + }, + "secret_scanning_alerts": { + "type": [ + "null", + "string" + ] + }, + "secrets": { + "type": [ + "null", + "string" + ] + }, + "security_events": { + "type": [ + "null", + "string" + ] + }, + "single_file": { + "type": [ + "null", + "string" + ] + }, + "starring": { + "type": [ + "null", + "string" + ] + }, + "statuses": { + "type": [ + "null", + "string" + ] + }, + "team_discussions": { + "type": [ + "null", + "string" + ] + }, + "user_events": { + "type": [ + "null", + "string" + ] + }, + "vulnerability_alerts": { + "type": [ + "null", + "string" + ] + }, + "watching": { + "type": [ + "null", + "string" + ] + }, + "workflows": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "slug": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "pinned_comment": { + "additionalProperties": false, + "properties": { + "author_association": { + "type": [ + "null", + "string" + ] + }, + "body": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "issue_url": { + "type": [ + "null", + "string" + ] + }, + "minimized": { + "additionalProperties": false, + "properties": { + "reason": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "performed_via_github_app": { + "additionalProperties": false, + "properties": { + "client_id": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "events": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "external_url": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "installations_count": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "owner": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "actions": { + "type": [ + "null", + "string" + ] + }, + "actions_variables": { + "type": [ + "null", + "string" + ] + }, + "administration": { + "type": [ + "null", + "string" + ] + }, + "attestations": { + "type": [ + "null", + "string" + ] + }, + "blocking": { + "type": [ + "null", + "string" + ] + }, + "checks": { + "type": [ + "null", + "string" + ] + }, + "codespaces": { + "type": [ + "null", + "string" + ] + }, + "codespaces_lifecycle_admin": { + "type": [ + "null", + "string" + ] + }, + "codespaces_metadata": { + "type": [ + "null", + "string" + ] + }, + "codespaces_secrets": { + "type": [ + "null", + "string" + ] + }, + "codespaces_user_secrets": { + "type": [ + "null", + "string" + ] + }, + "content_references": { + "type": [ + "null", + "string" + ] + }, + "contents": { + "type": [ + "null", + "string" + ] + }, + "copilot_messages": { + "type": [ + "null", + "string" + ] + }, + "dependabot_secrets": { + "type": [ + "null", + "string" + ] + }, + "deployments": { + "type": [ + "null", + "string" + ] + }, + "discussions": { + "type": [ + "null", + "string" + ] + }, + "emails": { + "type": [ + "null", + "string" + ] + }, + "enterprise_ai_controls": { + "type": [ + "null", + "string" + ] + }, + "enterprise_copilot_metrics": { + "type": [ + "null", + "string" + ] + }, + "enterprise_credentials": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_enterprise_roles": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_org_roles": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_properties": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_properties_for_organizations": { + "type": [ + "null", + "string" + ] + }, + "enterprise_organization_installation_repositories": { + "type": [ + "null", + "string" + ] + }, + "enterprise_organization_installations": { + "type": [ + "null", + "string" + ] + }, + "enterprise_organizations": { + "type": [ + "null", + "string" + ] + }, + "enterprise_people": { + "type": [ + "null", + "string" + ] + }, + "enterprise_sso": { + "type": [ + "null", + "string" + ] + }, + "enterprise_teams": { + "type": [ + "null", + "string" + ] + }, + "environments": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "string" + ] + }, + "gists": { + "type": [ + "null", + "string" + ] + }, + "git_signing_ssh_public_keys": { + "type": [ + "null", + "string" + ] + }, + "gpg_keys": { + "type": [ + "null", + "string" + ] + }, + "interaction_limits": { + "type": [ + "null", + "string" + ] + }, + "issues": { + "type": [ + "null", + "string" + ] + }, + "keys": { + "type": [ + "null", + "string" + ] + }, + "members": { + "type": [ + "null", + "string" + ] + }, + "merge_queues": { + "type": [ + "null", + "string" + ] + }, + "metadata": { + "type": [ + "null", + "string" + ] + }, + "organization_actions_variables": { + "type": [ + "null", + "string" + ] + }, + "organization_administration": { + "type": [ + "null", + "string" + ] + }, + "organization_announcement_banners": { + "type": [ + "null", + "string" + ] + }, + "organization_api_insights": { + "type": [ + "null", + "string" + ] + }, + "organization_codespaces": { + "type": [ + "null", + "string" + ] + }, + "organization_codespaces_secrets": { + "type": [ + "null", + "string" + ] + }, + "organization_codespaces_settings": { + "type": [ + "null", + "string" + ] + }, + "organization_copilot_metrics": { + "type": [ + "null", + "string" + ] + }, + "organization_copilot_seat_management": { + "type": [ + "null", + "string" + ] + }, + "organization_custom_org_roles": { + "type": [ + "null", + "string" + ] + }, + "organization_custom_properties": { + "type": [ + "null", + "string" + ] + }, + "organization_custom_roles": { + "type": [ + "null", + "string" + ] + }, + "organization_dependabot_secrets": { + "type": [ + "null", + "string" + ] + }, + "organization_events": { + "type": [ + "null", + "string" + ] + }, + "organization_hooks": { + "type": [ + "null", + "string" + ] + }, + "organization_knowledge_bases": { + "type": [ + "null", + "string" + ] + }, + "organization_packages": { + "type": [ + "null", + "string" + ] + }, + "organization_personal_access_token_requests": { + "type": [ + "null", + "string" + ] + }, + "organization_personal_access_tokens": { + "type": [ + "null", + "string" + ] + }, + "organization_plan": { + "type": [ + "null", + "string" + ] + }, + "organization_pre_receive_hooks": { + "type": [ + "null", + "string" + ] + }, + "organization_projects": { + "type": [ + "null", + "string" + ] + }, + "organization_secrets": { + "type": [ + "null", + "string" + ] + }, + "organization_self_hosted_runners": { + "type": [ + "null", + "string" + ] + }, + "organization_user_blocking": { + "type": [ + "null", + "string" + ] + }, + "packages": { + "type": [ + "null", + "string" + ] + }, + "pages": { + "type": [ + "null", + "string" + ] + }, + "plan": { + "type": [ + "null", + "string" + ] + }, + "profile": { + "type": [ + "null", + "string" + ] + }, + "pull_requests": { + "type": [ + "null", + "string" + ] + }, + "repository_advisories": { + "type": [ + "null", + "string" + ] + }, + "repository_custom_properties": { + "type": [ + "null", + "string" + ] + }, + "repository_hooks": { + "type": [ + "null", + "string" + ] + }, + "repository_pre_receive_hooks": { + "type": [ + "null", + "string" + ] + }, + "repository_projects": { + "type": [ + "null", + "string" + ] + }, + "secret_scanning_alerts": { + "type": [ + "null", + "string" + ] + }, + "secrets": { + "type": [ + "null", + "string" + ] + }, + "security_events": { + "type": [ + "null", + "string" + ] + }, + "single_file": { + "type": [ + "null", + "string" + ] + }, + "starring": { + "type": [ + "null", + "string" + ] + }, + "statuses": { + "type": [ + "null", + "string" + ] + }, + "team_discussions": { + "type": [ + "null", + "string" + ] + }, + "user_events": { + "type": [ + "null", + "string" + ] + }, + "vulnerability_alerts": { + "type": [ + "null", + "string" + ] + }, + "watching": { + "type": [ + "null", + "string" + ] + }, + "workflows": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "slug": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "pin": { + "additionalProperties": false, + "properties": { + "pinned_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "pinned_by": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "reactions": { + "additionalProperties": false, + "properties": { + "+1": { + "type": [ + "null", + "integer" + ] + }, + "-1": { + "type": [ + "null", + "integer" + ] + }, + "confused": { + "type": [ + "null", + "integer" + ] + }, + "eyes": { + "type": [ + "null", + "integer" + ] + }, + "heart": { + "type": [ + "null", + "integer" + ] + }, + "hooray": { + "type": [ + "null", + "integer" + ] + }, + "laugh": { + "type": [ + "null", + "integer" + ] + }, + "rocket": { + "type": [ + "null", + "integer" + ] + }, + "total_count": { + "type": [ + "null", + "integer" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "pull_request": { + "additionalProperties": false, + "properties": { + "diff_url": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "merged_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "patch_url": { + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "reactions": { + "additionalProperties": false, + "properties": { + "+1": { + "type": [ + "null", + "integer" + ] + }, + "-1": { + "type": [ + "null", + "integer" + ] + }, + "confused": { + "type": [ + "null", + "integer" + ] + }, + "eyes": { + "type": [ + "null", + "integer" + ] + }, + "heart": { + "type": [ + "null", + "integer" + ] + }, + "hooray": { + "type": [ + "null", + "integer" + ] + }, + "laugh": { + "type": [ + "null", + "integer" + ] + }, + "rocket": { + "type": [ + "null", + "integer" + ] + }, + "total_count": { + "type": [ + "null", + "integer" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "repository": { + "$ref": "#/$defs/repository", + "type": [ + "null", + "object" + ] + }, + "repository_url": { + "type": [ + "null", + "string" + ] + }, + "state": { + "type": [ + "null", + "string" + ] + }, + "state_reason": { + "type": [ + "null", + "string" + ] + }, + "sub_issues_summary": { + "additionalProperties": false, + "properties": { + "completed": { + "type": [ + "null", + "integer" + ] + }, + "percent_completed": { + "type": [ + "null", + "integer" + ] + }, + "total": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "title": { + "type": [ + "null", + "string" + ] + }, + "type": { + "additionalProperties": false, + "properties": { + "color": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "is_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + } + ], + "type": "array" + }, + { + "additionalProperties": false, + "properties": { + "parent": { + "additionalProperties": false, + "properties": { + "number": { + "type": "integer" + }, + "repository": { + "type": "string" + }, + "state": { + "type": "string" + }, + "title": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "number", + "repository", + "state", + "title", + "url" + ], + "type": [ + "null", + "object" + ] + } + }, + "required": [ + "parent" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "labels": { + "items": { + "additionalProperties": false, + "properties": { + "color": { + "type": "string" + }, + "description": { + "type": "string" + }, + "id": { + "type": "string" + }, + "name": { + "type": "string" + } + }, + "required": [ + "color", + "description", + "id", + "name" + ], + "type": "object" + }, + "type": [ + "null", + "array" + ] + }, + "totalCount": { + "type": "integer" + } + }, + "required": [ + "labels", + "totalCount" + ], + "type": "object" + } + ] + } +} \ No newline at end of file diff --git a/pkg/github/__toolsnaps__/issue_write.snap b/pkg/github/__toolsnaps__/issue_write.snap index 20cc730f51..8d991f9ab6 100644 --- a/pkg/github/__toolsnaps__/issue_write.snap +++ b/pkg/github/__toolsnaps__/issue_write.snap @@ -35,6 +35,65 @@ "description": "Issue field values to set or clear. Each item requires 'field_name' and exactly one of 'value', 'field_option_name', or 'delete: true'.", "items": { "additionalProperties": false, + "oneOf": [ + { + "properties": { + "delete": { + "enum": [ + false + ], + "type": "boolean" + }, + "field_option_name": { + "enum": [ + "" + ], + "type": "string" + } + }, + "required": [ + "value" + ] + }, + { + "properties": { + "delete": { + "enum": [ + false + ], + "type": "boolean" + }, + "field_option_name": { + "minLength": 1, + "type": "string" + }, + "value": false + }, + "required": [ + "field_option_name" + ] + }, + { + "properties": { + "delete": { + "enum": [ + true + ], + "type": "boolean" + }, + "field_option_name": { + "enum": [ + "" + ], + "type": "string" + }, + "value": false + }, + "required": [ + "delete" + ] + } + ], "properties": { "delete": { "description": "Set to true to clear this field's current value on the issue. When false or omitted, this property is ignored. Cannot be true when 'value' or 'field_option_name' is provided.", @@ -149,5 +208,44 @@ ], "type": "object" }, - "name": "issue_write" + "name": "issue_write", + "outputSchema": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "url" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "reason": { + "type": "string" + }, + "status": { + "enum": [ + "awaiting_user_submission" + ], + "type": "string" + } + }, + "required": [ + "status", + "reason" + ], + "type": "object" + } + ] + } } \ No newline at end of file diff --git a/pkg/github/__toolsnaps__/issue_write_typed.snap b/pkg/github/__toolsnaps__/issue_write_typed.snap new file mode 100644 index 0000000000..012453dbfd --- /dev/null +++ b/pkg/github/__toolsnaps__/issue_write_typed.snap @@ -0,0 +1,265 @@ +{ + "_meta": { + "ui": { + "resourceUri": "ui://github-mcp-server/issue-write", + "visibility": [ + "model", + "app" + ] + } + }, + "annotations": { + "idempotentHint": false, + "readOnlyHint": false, + "title": "Create or update issue/pull request" + }, + "description": "Create a new or update an existing issue in a GitHub repository.", + "icons": [ + { + "mimeType": "image/png", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAC2UlEQVRIicWVMUyTaRjHf/+vVUpOJOdilOYoUvVreq2CDmLOwdlAS5xMbrrhBifjYG7QjYuJw108nZx1huLgYlw0QshxChUK2koxHHcuCmgsFfieG0or3kGPSoz/8X3f5/97nvfN8z7wmaVqm9FodFfR/EnMugy5giCAwYwgI9Ff9Hl9L9Lp1zUBgsGO+rqGwnlhF4CdwBSyAUwvS1G220zHBSFgHtmVxYWvfp2ZGSj8LyAcjgfZphTQZtAr7OdsZvSP9RIJR+LtQhcNusF+d1aUfPp05M8NAavmg8AOk3cmN56+s1Hpa7U/cviUYbcw3jgex9ZCKoBgsKM+0PDuAdBq2He5zOiTzZiXtc+NxRw598GeLRcWTuTz+UUAp3ygrqFwHmgzeWdqNQd4PpFOy/gedNQfaDz3UQXRaHRX0fNPGdzNZUZO12q+VuHIoV7g5Hu/1/IinX7tABTNnwR2SvRsxRzAzOsBGuuWfAkoX5FZFzCVHR95tFVAbiI9DEwj6wLwl5YVMTRYLTDsxjuRrgGYYz/kxkbvbXRWMOBB24cKYI9ks1X8hXQDaAaa5XG9WjImZgV71wI+m8qAv8y0t1pSmP0ITANTmHO2qqvRZDALlTdgHKyjWkx2YvQ2cHtTacMxYBhWK5DoF4TCkXj7Jg02VKsbOwI0Y+qvALZrOQXMC13cKkDSJWBuJUCqAhgbG3uF7IpBcn/k8KlPNQ+78U5QQuhy/vHjuQoAYPndwi9gw4bd2ufGYrWatxz8No50ExhaKsz9Vl6vAPL5/KKzoiTGG0fOg1oqCbvxTp/juw/M+zynu/yTwjoD58CBQ02ez/pAR4E+M69ntf3/o1Y3dqR050oAQz7P6Z6cfPRRw647MkOhUMAfaDyH+AloBKYNPRT292rQHoMOSp09J3TZlt5ezWazxX97VR3638RiX9ct+RImSyBcrDT0ETMyMp4ptRIgVX7QL6J/ALSUEwJ5rdg2AAAAAElFTkSuQmCC", + "theme": "light" + }, + { + "mimeType": "image/png", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAABxElEQVRIibWVvW4TURCFv0vlNEDcIHAkKAERJOIKSjoUArwBPwUFFaKIIngAJARCPIgdh4cgRBYt6ZIAEYEqdhpEw0fhCbkKa68dxyNtsfNzzpnZu3NhwpYGBdUqcA+4A1wEZiK0DawD74FWSml3JAJ1CngGLAIngU1gFfgZKWeAG8AFoAu8At6mlH6VtqTOqJ/UP2pDnRuQO6c27VlbrQ0Dvq121Fulag7q5qPmW18SdSqUd9Qrw4Jn9bNR21YrRQkvYixDKy/AuB3jWjocqKpdtXFU8AxrOTqZzp2PgvnaMRDUA+tB7mypG+OCZ3hbahPgRPguAR9LihaicEu9WcKxClzOi/fU1wPAk7rjgX0uEfNG3cs7mJjtE+wA5/olpZQEHgNf6K2NJyW4NeD7v7c4WptjSc0svlMjdzyM2fbdOyOA7x/T+7mzGj9H8xgIWuquevpw4HmsivkxwBdC/WJRsBKLqqPOHgH8aqybtcJlF0m1WLndUToJ5V31q9r3NOYk7Wh1Wa0PyK3HzA3l/4H3uzIrwFNgCThF7/x/AH5EylngOnAe6AAvgXcppd9DEWRE08DdeIou/RVgJaXUGYQzUfsL+zmwV7BtIq0AAAAASUVORK5CYII=", + "theme": "dark" + } + ], + "inputSchema": { + "properties": { + "assignees": { + "description": "Usernames to assign to this issue", + "items": { + "type": "string" + }, + "type": "array" + }, + "body": { + "description": "Issue body content", + "type": "string" + }, + "duplicate_of": { + "description": "Issue number that this issue is a duplicate of. Required when state_reason is 'duplicate'.", + "type": "number" + }, + "issue_fields": { + "description": "Issue field values to set or clear. Each item requires 'field_name' and exactly one of 'value', 'field_option_name', or 'delete: true'.", + "items": { + "additionalProperties": false, + "oneOf": [ + { + "properties": { + "delete": { + "enum": [ + false + ], + "type": "boolean" + }, + "field_option_name": { + "enum": [ + "" + ], + "type": "string" + } + }, + "required": [ + "value" + ] + }, + { + "properties": { + "delete": { + "enum": [ + false + ], + "type": "boolean" + }, + "field_option_name": { + "minLength": 1, + "type": "string" + }, + "value": false + }, + "required": [ + "field_option_name" + ] + }, + { + "properties": { + "delete": { + "enum": [ + true + ], + "type": "boolean" + }, + "field_option_name": { + "enum": [ + "" + ], + "type": "string" + }, + "value": false + }, + "required": [ + "delete" + ] + } + ], + "properties": { + "delete": { + "description": "Set to true to clear this field's current value on the issue. When false or omitted, this property is ignored. Cannot be true when 'value' or 'field_option_name' is provided.", + "type": "boolean" + }, + "field_name": { + "description": "Issue field name (case-insensitive). Must match a field returned by list_issue_fields for this repository or its organization.", + "type": "string" + }, + "field_option_name": { + "description": "Option name for single-select fields. Validated against the field's options before the API call. Cannot be combined with 'value' or 'delete: true'.", + "type": "string" + }, + "value": { + "description": "Value to set. Use for text, number, and date fields (date as YYYY-MM-DD). For single-select fields, prefer 'field_option_name' so the option is validated before the API call. Cannot be combined with 'field_option_name' or 'delete: true'.", + "type": [ + "string", + "number", + "boolean" + ] + } + }, + "required": [ + "field_name" + ], + "type": "object" + }, + "type": "array" + }, + "issue_number": { + "description": "Issue number to update", + "type": "number" + }, + "labels": { + "description": "Labels to apply to this issue", + "items": { + "type": "string" + }, + "type": "array" + }, + "method": { + "description": "Write operation to perform on a single issue.\nOptions are:\n- 'create' - creates a new issue.\n- 'update' - updates an existing issue.\n", + "enum": [ + "create", + "update" + ], + "type": "string" + }, + "milestone": { + "description": "Milestone number", + "type": "number" + }, + "owner": { + "description": "Repository owner", + "type": "string", + "x-mcp-header": "owner" + }, + "parent_issue_number": { + "description": "Issue number of the parent issue. Only used when method is 'create' and cannot be combined with issue_fields. The new issue is created and attached to this parent in the same operation.", + "minimum": 1, + "type": "number" + }, + "parent_owner": { + "description": "Repository owner of the parent issue. Must be provided with parent_repo. Omit both to use owner and repo. Only used when method is 'create' and parent_issue_number is provided.", + "type": "string" + }, + "parent_repo": { + "description": "Repository name of the parent issue. Must be provided with parent_owner. Omit both to use owner and repo. Only used when method is 'create' and parent_issue_number is provided.", + "type": "string" + }, + "repo": { + "description": "Repository name", + "type": "string", + "x-mcp-header": "repo" + }, + "state": { + "description": "New state", + "enum": [ + "open", + "closed" + ], + "type": "string" + }, + "state_reason": { + "description": "Reason for the state change. Ignored unless state is changed.", + "enum": [ + "completed", + "not_planned", + "duplicate" + ], + "type": "string" + }, + "title": { + "description": "Issue title", + "type": "string" + }, + "type": { + "anyOf": [ + { + "minLength": 1, + "type": "string" + }, + { + "type": "null" + } + ], + "description": "Type of this issue. For updates, pass null to remove the current type. Only use if issue types are enabled for this repository. Use list_issue_types to get valid type values for this repository or its owner organization. If the repository doesn't support issue types, omit this parameter." + } + }, + "required": [ + "method", + "owner", + "repo" + ], + "type": "object" + }, + "name": "issue_write", + "outputSchema": { + "oneOf": [ + { + "additionalProperties": false, + "properties": { + "id": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "url" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "reason": { + "type": "string" + }, + "status": { + "enum": [ + "awaiting_user_submission" + ], + "type": "string" + } + }, + "required": [ + "status", + "reason" + ], + "type": "object" + } + ] + } +} \ No newline at end of file diff --git a/pkg/github/__toolsnaps__/sub_issue_write.snap b/pkg/github/__toolsnaps__/sub_issue_write.snap index 9dc2776c32..3be3f2b835 100644 --- a/pkg/github/__toolsnaps__/sub_issue_write.snap +++ b/pkg/github/__toolsnaps__/sub_issue_write.snap @@ -49,5 +49,8696 @@ ], "type": "object" }, - "name": "sub_issue_write" + "name": "sub_issue_write", + "outputSchema": { + "$defs": { + "repository": { + "additionalProperties": false, + "properties": { + "allow_auto_merge": { + "type": [ + "null", + "boolean" + ] + }, + "allow_forking": { + "type": [ + "null", + "boolean" + ] + }, + "allow_merge_commit": { + "type": [ + "null", + "boolean" + ] + }, + "allow_rebase_merge": { + "type": [ + "null", + "boolean" + ] + }, + "allow_squash_merge": { + "type": [ + "null", + "boolean" + ] + }, + "allow_update_branch": { + "type": [ + "null", + "boolean" + ] + }, + "archive_url": { + "type": [ + "null", + "string" + ] + }, + "archived": { + "type": [ + "null", + "boolean" + ] + }, + "assignees_url": { + "type": [ + "null", + "string" + ] + }, + "auto_init": { + "type": [ + "null", + "boolean" + ] + }, + "blobs_url": { + "type": [ + "null", + "string" + ] + }, + "branches_url": { + "type": [ + "null", + "string" + ] + }, + "clone_url": { + "type": [ + "null", + "string" + ] + }, + "code_of_conduct": { + "additionalProperties": false, + "properties": { + "body": { + "type": [ + "null", + "string" + ] + }, + "key": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "collaborators_url": { + "type": [ + "null", + "string" + ] + }, + "comments_url": { + "type": [ + "null", + "string" + ] + }, + "commits_url": { + "type": [ + "null", + "string" + ] + }, + "compare_url": { + "type": [ + "null", + "string" + ] + }, + "contents_url": { + "type": [ + "null", + "string" + ] + }, + "contributors_url": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "custom_properties": { + "additionalProperties": true, + "type": "object" + }, + "default_branch": { + "type": [ + "null", + "string" + ] + }, + "delete_branch_on_merge": { + "type": [ + "null", + "boolean" + ] + }, + "deployments_url": { + "type": [ + "null", + "string" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "disabled": { + "type": [ + "null", + "boolean" + ] + }, + "downloads_url": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "fork": { + "type": [ + "null", + "boolean" + ] + }, + "forks_count": { + "type": [ + "null", + "integer" + ] + }, + "forks_url": { + "type": [ + "null", + "string" + ] + }, + "full_name": { + "type": [ + "null", + "string" + ] + }, + "git_commits_url": { + "type": [ + "null", + "string" + ] + }, + "git_refs_url": { + "type": [ + "null", + "string" + ] + }, + "git_tags_url": { + "type": [ + "null", + "string" + ] + }, + "git_url": { + "type": [ + "null", + "string" + ] + }, + "gitignore_template": { + "type": [ + "null", + "string" + ] + }, + "has_discussions": { + "type": [ + "null", + "boolean" + ] + }, + "has_downloads": { + "type": [ + "null", + "boolean" + ] + }, + "has_issues": { + "type": [ + "null", + "boolean" + ] + }, + "has_pages": { + "type": [ + "null", + "boolean" + ] + }, + "has_projects": { + "type": [ + "null", + "boolean" + ] + }, + "has_pull_requests": { + "type": [ + "null", + "boolean" + ] + }, + "has_wiki": { + "type": [ + "null", + "boolean" + ] + }, + "homepage": { + "type": [ + "null", + "string" + ] + }, + "hooks_url": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "is_template": { + "type": [ + "null", + "boolean" + ] + }, + "issue_comment_url": { + "type": [ + "null", + "string" + ] + }, + "issue_events_url": { + "type": [ + "null", + "string" + ] + }, + "issues_url": { + "type": [ + "null", + "string" + ] + }, + "keys_url": { + "type": [ + "null", + "string" + ] + }, + "labels_url": { + "type": [ + "null", + "string" + ] + }, + "language": { + "type": [ + "null", + "string" + ] + }, + "languages_url": { + "type": [ + "null", + "string" + ] + }, + "license": { + "additionalProperties": false, + "properties": { + "body": { + "type": [ + "null", + "string" + ] + }, + "conditions": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "featured": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "implementation": { + "type": [ + "null", + "string" + ] + }, + "key": { + "type": [ + "null", + "string" + ] + }, + "limitations": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "permissions": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "spdx_id": { + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "license_template": { + "type": [ + "null", + "string" + ] + }, + "master_branch": { + "type": [ + "null", + "string" + ] + }, + "merge_commit_message": { + "type": [ + "null", + "string" + ] + }, + "merge_commit_title": { + "type": [ + "null", + "string" + ] + }, + "merges_url": { + "type": [ + "null", + "string" + ] + }, + "milestones_url": { + "type": [ + "null", + "string" + ] + }, + "mirror_url": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "network_count": { + "type": [ + "null", + "integer" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notifications_url": { + "type": [ + "null", + "string" + ] + }, + "open_issues": { + "type": [ + "null", + "integer" + ] + }, + "open_issues_count": { + "type": [ + "null", + "integer" + ] + }, + "organization": { + "additionalProperties": false, + "properties": { + "advanced_security_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "archived_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "billing_email": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "default_repository_branch": { + "type": [ + "null", + "string" + ] + }, + "default_repository_permission": { + "type": [ + "null", + "string" + ] + }, + "default_repository_settings": { + "type": [ + "null", + "string" + ] + }, + "dependabot_alerts_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "dependabot_security_updates_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "dependency_graph_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "deploy_keys_enabled_for_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "display_commenter_full_name_setting_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "has_organization_projects": { + "type": [ + "null", + "boolean" + ] + }, + "has_repository_projects": { + "type": [ + "null", + "boolean" + ] + }, + "hooks_url": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "is_verified": { + "type": [ + "null", + "boolean" + ] + }, + "issues_url": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "members_allowed_repository_creation_type": { + "type": [ + "null", + "string" + ] + }, + "members_can_change_repo_visibility": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_internal_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_pages": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_private_pages": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_private_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_public_pages": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_public_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_teams": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_delete_issues": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_delete_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_fork_private_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_invite_outside_collaborators": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_view_dependency_insights": { + "type": [ + "null", + "boolean" + ] + }, + "members_url": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_members_url": { + "type": [ + "null", + "string" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "readers_can_create_discussions": { + "type": [ + "null", + "boolean" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "secret_scanning_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "secret_scanning_push_protection_custom_link": { + "type": [ + "null", + "string" + ] + }, + "secret_scanning_push_protection_custom_link_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "secret_scanning_push_protection_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "secret_scanning_validity_checks_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_requirement_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "web_commit_signoff_required": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "owner": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "parent": { + "$ref": "#/$defs/repository", + "type": [ + "null", + "object" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private": { + "type": [ + "null", + "boolean" + ] + }, + "pull_request_creation_policy": { + "type": [ + "null", + "string" + ] + }, + "pulls_url": { + "type": [ + "null", + "string" + ] + }, + "pushed_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "releases_url": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "security_and_analysis": { + "additionalProperties": false, + "properties": { + "advanced_security": { + "additionalProperties": false, + "properties": { + "status": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "code_security": { + "additionalProperties": false, + "properties": { + "status": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "dependabot_security_updates": { + "additionalProperties": false, + "properties": { + "status": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "secret_scanning": { + "additionalProperties": false, + "properties": { + "status": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "secret_scanning_push_protection": { + "additionalProperties": false, + "properties": { + "status": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "secret_scanning_validity_checks": { + "additionalProperties": false, + "properties": { + "status": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "size": { + "type": [ + "null", + "integer" + ] + }, + "source": { + "$ref": "#/$defs/repository", + "type": [ + "null", + "object" + ] + }, + "squash_merge_commit_message": { + "type": [ + "null", + "string" + ] + }, + "squash_merge_commit_title": { + "type": [ + "null", + "string" + ] + }, + "ssh_url": { + "type": [ + "null", + "string" + ] + }, + "stargazers_count": { + "type": [ + "null", + "integer" + ] + }, + "stargazers_url": { + "type": [ + "null", + "string" + ] + }, + "statuses_url": { + "type": [ + "null", + "string" + ] + }, + "subscribers_count": { + "type": [ + "null", + "integer" + ] + }, + "subscribers_url": { + "type": [ + "null", + "string" + ] + }, + "subscription_url": { + "type": [ + "null", + "string" + ] + }, + "svn_url": { + "type": [ + "null", + "string" + ] + }, + "tags_url": { + "type": [ + "null", + "string" + ] + }, + "team_id": { + "type": [ + "null", + "integer" + ] + }, + "teams_url": { + "type": [ + "null", + "string" + ] + }, + "template_repository": { + "$ref": "#/$defs/repository", + "type": [ + "null", + "object" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "topics": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "trees_url": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "use_squash_pr_title_as_default": { + "type": [ + "null", + "boolean" + ] + }, + "visibility": { + "type": [ + "null", + "string" + ] + }, + "watchers": { + "type": [ + "null", + "integer" + ] + }, + "watchers_count": { + "type": [ + "null", + "integer" + ] + }, + "web_commit_signoff_required": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "object", + "null" + ] + }, + "team": { + "additionalProperties": false, + "properties": { + "access_source": { + "type": [ + "null", + "string" + ] + }, + "assignment": { + "type": [ + "null", + "string" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "members_count": { + "type": [ + "null", + "integer" + ] + }, + "members_url": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_setting": { + "type": [ + "null", + "string" + ] + }, + "organization": { + "additionalProperties": false, + "properties": { + "advanced_security_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "archived_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "billing_email": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "default_repository_branch": { + "type": [ + "null", + "string" + ] + }, + "default_repository_permission": { + "type": [ + "null", + "string" + ] + }, + "default_repository_settings": { + "type": [ + "null", + "string" + ] + }, + "dependabot_alerts_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "dependabot_security_updates_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "dependency_graph_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "deploy_keys_enabled_for_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "display_commenter_full_name_setting_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "has_organization_projects": { + "type": [ + "null", + "boolean" + ] + }, + "has_repository_projects": { + "type": [ + "null", + "boolean" + ] + }, + "hooks_url": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "is_verified": { + "type": [ + "null", + "boolean" + ] + }, + "issues_url": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "members_allowed_repository_creation_type": { + "type": [ + "null", + "string" + ] + }, + "members_can_change_repo_visibility": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_internal_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_pages": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_private_pages": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_private_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_public_pages": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_public_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_teams": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_delete_issues": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_delete_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_fork_private_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_invite_outside_collaborators": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_view_dependency_insights": { + "type": [ + "null", + "boolean" + ] + }, + "members_url": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_members_url": { + "type": [ + "null", + "string" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "readers_can_create_discussions": { + "type": [ + "null", + "boolean" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "secret_scanning_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "secret_scanning_push_protection_custom_link": { + "type": [ + "null", + "string" + ] + }, + "secret_scanning_push_protection_custom_link_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "secret_scanning_push_protection_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "secret_scanning_validity_checks_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_requirement_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "web_commit_signoff_required": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "parent": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "permission": { + "type": [ + "null", + "string" + ] + }, + "permissions": { + "additionalProperties": { + "type": "boolean" + }, + "type": "object" + }, + "privacy": { + "type": [ + "null", + "string" + ] + }, + "repos_count": { + "type": [ + "null", + "integer" + ] + }, + "repositories_url": { + "type": [ + "null", + "string" + ] + }, + "slug": { + "type": [ + "null", + "string" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "object", + "null" + ] + } + }, + "additionalProperties": false, + "properties": { + "active_lock_reason": { + "type": [ + "null", + "string" + ] + }, + "assignee": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "assignees": { + "items": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "author_association": { + "type": [ + "null", + "string" + ] + }, + "body": { + "type": [ + "null", + "string" + ] + }, + "closed_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "closed_by": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "comments": { + "type": [ + "null", + "integer" + ] + }, + "comments_url": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "draft": { + "type": [ + "null", + "boolean" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "issue_dependencies_summary": { + "additionalProperties": false, + "properties": { + "blocked_by": { + "type": [ + "null", + "integer" + ] + }, + "blocking": { + "type": [ + "null", + "integer" + ] + }, + "total_blocked_by": { + "type": [ + "null", + "integer" + ] + }, + "total_blocking": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "issue_field_values": { + "items": { + "additionalProperties": false, + "properties": { + "data_type": { + "type": "string" + }, + "issue_field_id": { + "type": "integer" + }, + "node_id": { + "type": "string" + }, + "single_select_option": { + "additionalProperties": false, + "properties": { + "color": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "color" + ], + "type": [ + "null", + "object" + ] + }, + "value": { + "type": [ + "string", + "number", + "boolean", + "null" + ] + } + }, + "required": [ + "issue_field_id", + "node_id", + "data_type", + "value" + ], + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "labels": { + "items": { + "additionalProperties": false, + "properties": { + "color": { + "type": "string" + }, + "default": { + "type": "boolean" + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "node_id": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "url", + "name", + "color", + "description", + "default", + "node_id" + ], + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "labels_url": { + "type": [ + "null", + "string" + ] + }, + "locked": { + "type": [ + "null", + "boolean" + ] + }, + "milestone": { + "additionalProperties": false, + "properties": { + "closed_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "closed_issues": { + "type": [ + "null", + "integer" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "creator": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "due_on": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "labels_url": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "number": { + "type": [ + "null", + "integer" + ] + }, + "open_issues": { + "type": [ + "null", + "integer" + ] + }, + "state": { + "type": [ + "null", + "string" + ] + }, + "title": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "number": { + "type": [ + "null", + "integer" + ] + }, + "parent_issue_url": { + "type": [ + "null", + "string" + ] + }, + "performed_via_github_app": { + "additionalProperties": false, + "properties": { + "client_id": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "events": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "external_url": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "installations_count": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "owner": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "actions": { + "type": [ + "null", + "string" + ] + }, + "actions_variables": { + "type": [ + "null", + "string" + ] + }, + "administration": { + "type": [ + "null", + "string" + ] + }, + "attestations": { + "type": [ + "null", + "string" + ] + }, + "blocking": { + "type": [ + "null", + "string" + ] + }, + "checks": { + "type": [ + "null", + "string" + ] + }, + "codespaces": { + "type": [ + "null", + "string" + ] + }, + "codespaces_lifecycle_admin": { + "type": [ + "null", + "string" + ] + }, + "codespaces_metadata": { + "type": [ + "null", + "string" + ] + }, + "codespaces_secrets": { + "type": [ + "null", + "string" + ] + }, + "codespaces_user_secrets": { + "type": [ + "null", + "string" + ] + }, + "content_references": { + "type": [ + "null", + "string" + ] + }, + "contents": { + "type": [ + "null", + "string" + ] + }, + "copilot_messages": { + "type": [ + "null", + "string" + ] + }, + "dependabot_secrets": { + "type": [ + "null", + "string" + ] + }, + "deployments": { + "type": [ + "null", + "string" + ] + }, + "discussions": { + "type": [ + "null", + "string" + ] + }, + "emails": { + "type": [ + "null", + "string" + ] + }, + "enterprise_ai_controls": { + "type": [ + "null", + "string" + ] + }, + "enterprise_copilot_metrics": { + "type": [ + "null", + "string" + ] + }, + "enterprise_credentials": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_enterprise_roles": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_org_roles": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_properties": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_properties_for_organizations": { + "type": [ + "null", + "string" + ] + }, + "enterprise_organization_installation_repositories": { + "type": [ + "null", + "string" + ] + }, + "enterprise_organization_installations": { + "type": [ + "null", + "string" + ] + }, + "enterprise_organizations": { + "type": [ + "null", + "string" + ] + }, + "enterprise_people": { + "type": [ + "null", + "string" + ] + }, + "enterprise_sso": { + "type": [ + "null", + "string" + ] + }, + "enterprise_teams": { + "type": [ + "null", + "string" + ] + }, + "environments": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "string" + ] + }, + "gists": { + "type": [ + "null", + "string" + ] + }, + "git_signing_ssh_public_keys": { + "type": [ + "null", + "string" + ] + }, + "gpg_keys": { + "type": [ + "null", + "string" + ] + }, + "interaction_limits": { + "type": [ + "null", + "string" + ] + }, + "issues": { + "type": [ + "null", + "string" + ] + }, + "keys": { + "type": [ + "null", + "string" + ] + }, + "members": { + "type": [ + "null", + "string" + ] + }, + "merge_queues": { + "type": [ + "null", + "string" + ] + }, + "metadata": { + "type": [ + "null", + "string" + ] + }, + "organization_actions_variables": { + "type": [ + "null", + "string" + ] + }, + "organization_administration": { + "type": [ + "null", + "string" + ] + }, + "organization_announcement_banners": { + "type": [ + "null", + "string" + ] + }, + "organization_api_insights": { + "type": [ + "null", + "string" + ] + }, + "organization_codespaces": { + "type": [ + "null", + "string" + ] + }, + "organization_codespaces_secrets": { + "type": [ + "null", + "string" + ] + }, + "organization_codespaces_settings": { + "type": [ + "null", + "string" + ] + }, + "organization_copilot_metrics": { + "type": [ + "null", + "string" + ] + }, + "organization_copilot_seat_management": { + "type": [ + "null", + "string" + ] + }, + "organization_custom_org_roles": { + "type": [ + "null", + "string" + ] + }, + "organization_custom_properties": { + "type": [ + "null", + "string" + ] + }, + "organization_custom_roles": { + "type": [ + "null", + "string" + ] + }, + "organization_dependabot_secrets": { + "type": [ + "null", + "string" + ] + }, + "organization_events": { + "type": [ + "null", + "string" + ] + }, + "organization_hooks": { + "type": [ + "null", + "string" + ] + }, + "organization_knowledge_bases": { + "type": [ + "null", + "string" + ] + }, + "organization_packages": { + "type": [ + "null", + "string" + ] + }, + "organization_personal_access_token_requests": { + "type": [ + "null", + "string" + ] + }, + "organization_personal_access_tokens": { + "type": [ + "null", + "string" + ] + }, + "organization_plan": { + "type": [ + "null", + "string" + ] + }, + "organization_pre_receive_hooks": { + "type": [ + "null", + "string" + ] + }, + "organization_projects": { + "type": [ + "null", + "string" + ] + }, + "organization_secrets": { + "type": [ + "null", + "string" + ] + }, + "organization_self_hosted_runners": { + "type": [ + "null", + "string" + ] + }, + "organization_user_blocking": { + "type": [ + "null", + "string" + ] + }, + "packages": { + "type": [ + "null", + "string" + ] + }, + "pages": { + "type": [ + "null", + "string" + ] + }, + "plan": { + "type": [ + "null", + "string" + ] + }, + "profile": { + "type": [ + "null", + "string" + ] + }, + "pull_requests": { + "type": [ + "null", + "string" + ] + }, + "repository_advisories": { + "type": [ + "null", + "string" + ] + }, + "repository_custom_properties": { + "type": [ + "null", + "string" + ] + }, + "repository_hooks": { + "type": [ + "null", + "string" + ] + }, + "repository_pre_receive_hooks": { + "type": [ + "null", + "string" + ] + }, + "repository_projects": { + "type": [ + "null", + "string" + ] + }, + "secret_scanning_alerts": { + "type": [ + "null", + "string" + ] + }, + "secrets": { + "type": [ + "null", + "string" + ] + }, + "security_events": { + "type": [ + "null", + "string" + ] + }, + "single_file": { + "type": [ + "null", + "string" + ] + }, + "starring": { + "type": [ + "null", + "string" + ] + }, + "statuses": { + "type": [ + "null", + "string" + ] + }, + "team_discussions": { + "type": [ + "null", + "string" + ] + }, + "user_events": { + "type": [ + "null", + "string" + ] + }, + "vulnerability_alerts": { + "type": [ + "null", + "string" + ] + }, + "watching": { + "type": [ + "null", + "string" + ] + }, + "workflows": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "slug": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "pinned_comment": { + "additionalProperties": false, + "properties": { + "author_association": { + "type": [ + "null", + "string" + ] + }, + "body": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "issue_url": { + "type": [ + "null", + "string" + ] + }, + "minimized": { + "additionalProperties": false, + "properties": { + "reason": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "performed_via_github_app": { + "additionalProperties": false, + "properties": { + "client_id": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "events": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "external_url": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "installations_count": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "owner": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "actions": { + "type": [ + "null", + "string" + ] + }, + "actions_variables": { + "type": [ + "null", + "string" + ] + }, + "administration": { + "type": [ + "null", + "string" + ] + }, + "attestations": { + "type": [ + "null", + "string" + ] + }, + "blocking": { + "type": [ + "null", + "string" + ] + }, + "checks": { + "type": [ + "null", + "string" + ] + }, + "codespaces": { + "type": [ + "null", + "string" + ] + }, + "codespaces_lifecycle_admin": { + "type": [ + "null", + "string" + ] + }, + "codespaces_metadata": { + "type": [ + "null", + "string" + ] + }, + "codespaces_secrets": { + "type": [ + "null", + "string" + ] + }, + "codespaces_user_secrets": { + "type": [ + "null", + "string" + ] + }, + "content_references": { + "type": [ + "null", + "string" + ] + }, + "contents": { + "type": [ + "null", + "string" + ] + }, + "copilot_messages": { + "type": [ + "null", + "string" + ] + }, + "dependabot_secrets": { + "type": [ + "null", + "string" + ] + }, + "deployments": { + "type": [ + "null", + "string" + ] + }, + "discussions": { + "type": [ + "null", + "string" + ] + }, + "emails": { + "type": [ + "null", + "string" + ] + }, + "enterprise_ai_controls": { + "type": [ + "null", + "string" + ] + }, + "enterprise_copilot_metrics": { + "type": [ + "null", + "string" + ] + }, + "enterprise_credentials": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_enterprise_roles": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_org_roles": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_properties": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_properties_for_organizations": { + "type": [ + "null", + "string" + ] + }, + "enterprise_organization_installation_repositories": { + "type": [ + "null", + "string" + ] + }, + "enterprise_organization_installations": { + "type": [ + "null", + "string" + ] + }, + "enterprise_organizations": { + "type": [ + "null", + "string" + ] + }, + "enterprise_people": { + "type": [ + "null", + "string" + ] + }, + "enterprise_sso": { + "type": [ + "null", + "string" + ] + }, + "enterprise_teams": { + "type": [ + "null", + "string" + ] + }, + "environments": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "string" + ] + }, + "gists": { + "type": [ + "null", + "string" + ] + }, + "git_signing_ssh_public_keys": { + "type": [ + "null", + "string" + ] + }, + "gpg_keys": { + "type": [ + "null", + "string" + ] + }, + "interaction_limits": { + "type": [ + "null", + "string" + ] + }, + "issues": { + "type": [ + "null", + "string" + ] + }, + "keys": { + "type": [ + "null", + "string" + ] + }, + "members": { + "type": [ + "null", + "string" + ] + }, + "merge_queues": { + "type": [ + "null", + "string" + ] + }, + "metadata": { + "type": [ + "null", + "string" + ] + }, + "organization_actions_variables": { + "type": [ + "null", + "string" + ] + }, + "organization_administration": { + "type": [ + "null", + "string" + ] + }, + "organization_announcement_banners": { + "type": [ + "null", + "string" + ] + }, + "organization_api_insights": { + "type": [ + "null", + "string" + ] + }, + "organization_codespaces": { + "type": [ + "null", + "string" + ] + }, + "organization_codespaces_secrets": { + "type": [ + "null", + "string" + ] + }, + "organization_codespaces_settings": { + "type": [ + "null", + "string" + ] + }, + "organization_copilot_metrics": { + "type": [ + "null", + "string" + ] + }, + "organization_copilot_seat_management": { + "type": [ + "null", + "string" + ] + }, + "organization_custom_org_roles": { + "type": [ + "null", + "string" + ] + }, + "organization_custom_properties": { + "type": [ + "null", + "string" + ] + }, + "organization_custom_roles": { + "type": [ + "null", + "string" + ] + }, + "organization_dependabot_secrets": { + "type": [ + "null", + "string" + ] + }, + "organization_events": { + "type": [ + "null", + "string" + ] + }, + "organization_hooks": { + "type": [ + "null", + "string" + ] + }, + "organization_knowledge_bases": { + "type": [ + "null", + "string" + ] + }, + "organization_packages": { + "type": [ + "null", + "string" + ] + }, + "organization_personal_access_token_requests": { + "type": [ + "null", + "string" + ] + }, + "organization_personal_access_tokens": { + "type": [ + "null", + "string" + ] + }, + "organization_plan": { + "type": [ + "null", + "string" + ] + }, + "organization_pre_receive_hooks": { + "type": [ + "null", + "string" + ] + }, + "organization_projects": { + "type": [ + "null", + "string" + ] + }, + "organization_secrets": { + "type": [ + "null", + "string" + ] + }, + "organization_self_hosted_runners": { + "type": [ + "null", + "string" + ] + }, + "organization_user_blocking": { + "type": [ + "null", + "string" + ] + }, + "packages": { + "type": [ + "null", + "string" + ] + }, + "pages": { + "type": [ + "null", + "string" + ] + }, + "plan": { + "type": [ + "null", + "string" + ] + }, + "profile": { + "type": [ + "null", + "string" + ] + }, + "pull_requests": { + "type": [ + "null", + "string" + ] + }, + "repository_advisories": { + "type": [ + "null", + "string" + ] + }, + "repository_custom_properties": { + "type": [ + "null", + "string" + ] + }, + "repository_hooks": { + "type": [ + "null", + "string" + ] + }, + "repository_pre_receive_hooks": { + "type": [ + "null", + "string" + ] + }, + "repository_projects": { + "type": [ + "null", + "string" + ] + }, + "secret_scanning_alerts": { + "type": [ + "null", + "string" + ] + }, + "secrets": { + "type": [ + "null", + "string" + ] + }, + "security_events": { + "type": [ + "null", + "string" + ] + }, + "single_file": { + "type": [ + "null", + "string" + ] + }, + "starring": { + "type": [ + "null", + "string" + ] + }, + "statuses": { + "type": [ + "null", + "string" + ] + }, + "team_discussions": { + "type": [ + "null", + "string" + ] + }, + "user_events": { + "type": [ + "null", + "string" + ] + }, + "vulnerability_alerts": { + "type": [ + "null", + "string" + ] + }, + "watching": { + "type": [ + "null", + "string" + ] + }, + "workflows": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "slug": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "pin": { + "additionalProperties": false, + "properties": { + "pinned_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "pinned_by": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "reactions": { + "additionalProperties": false, + "properties": { + "+1": { + "type": [ + "null", + "integer" + ] + }, + "-1": { + "type": [ + "null", + "integer" + ] + }, + "confused": { + "type": [ + "null", + "integer" + ] + }, + "eyes": { + "type": [ + "null", + "integer" + ] + }, + "heart": { + "type": [ + "null", + "integer" + ] + }, + "hooray": { + "type": [ + "null", + "integer" + ] + }, + "laugh": { + "type": [ + "null", + "integer" + ] + }, + "rocket": { + "type": [ + "null", + "integer" + ] + }, + "total_count": { + "type": [ + "null", + "integer" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "pull_request": { + "additionalProperties": false, + "properties": { + "diff_url": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "merged_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "patch_url": { + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "reactions": { + "additionalProperties": false, + "properties": { + "+1": { + "type": [ + "null", + "integer" + ] + }, + "-1": { + "type": [ + "null", + "integer" + ] + }, + "confused": { + "type": [ + "null", + "integer" + ] + }, + "eyes": { + "type": [ + "null", + "integer" + ] + }, + "heart": { + "type": [ + "null", + "integer" + ] + }, + "hooray": { + "type": [ + "null", + "integer" + ] + }, + "laugh": { + "type": [ + "null", + "integer" + ] + }, + "rocket": { + "type": [ + "null", + "integer" + ] + }, + "total_count": { + "type": [ + "null", + "integer" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "repository": { + "$ref": "#/$defs/repository", + "type": [ + "null", + "object" + ] + }, + "repository_url": { + "type": [ + "null", + "string" + ] + }, + "state": { + "type": [ + "null", + "string" + ] + }, + "state_reason": { + "type": [ + "null", + "string" + ] + }, + "sub_issues_summary": { + "additionalProperties": false, + "properties": { + "completed": { + "type": [ + "null", + "integer" + ] + }, + "percent_completed": { + "type": [ + "null", + "integer" + ] + }, + "total": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "title": { + "type": [ + "null", + "string" + ] + }, + "type": { + "additionalProperties": false, + "properties": { + "color": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "is_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + } + }, + "type": [ + "object", + "null" + ] + } } \ No newline at end of file diff --git a/pkg/github/__toolsnaps__/sub_issue_write_typed.snap b/pkg/github/__toolsnaps__/sub_issue_write_typed.snap new file mode 100644 index 0000000000..11a73092a5 --- /dev/null +++ b/pkg/github/__toolsnaps__/sub_issue_write_typed.snap @@ -0,0 +1,8758 @@ +{ + "annotations": { + "idempotentHint": false, + "readOnlyHint": false, + "title": "Change sub-issue" + }, + "description": "Add a sub-issue to a parent issue in a GitHub repository.", + "icons": [ + { + "mimeType": "image/png", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAAC2UlEQVRIicWVMUyTaRjHf/+vVUpOJOdilOYoUvVreq2CDmLOwdlAS5xMbrrhBifjYG7QjYuJw108nZx1huLgYlw0QshxChUK2koxHHcuCmgsFfieG0or3kGPSoz/8X3f5/97nvfN8z7wmaVqm9FodFfR/EnMugy5giCAwYwgI9Ff9Hl9L9Lp1zUBgsGO+rqGwnlhF4CdwBSyAUwvS1G220zHBSFgHtmVxYWvfp2ZGSj8LyAcjgfZphTQZtAr7OdsZvSP9RIJR+LtQhcNusF+d1aUfPp05M8NAavmg8AOk3cmN56+s1Hpa7U/cviUYbcw3jgex9ZCKoBgsKM+0PDuAdBq2He5zOiTzZiXtc+NxRw598GeLRcWTuTz+UUAp3ygrqFwHmgzeWdqNQd4PpFOy/gedNQfaDz3UQXRaHRX0fNPGdzNZUZO12q+VuHIoV7g5Hu/1/IinX7tABTNnwR2SvRsxRzAzOsBGuuWfAkoX5FZFzCVHR95tFVAbiI9DEwj6wLwl5YVMTRYLTDsxjuRrgGYYz/kxkbvbXRWMOBB24cKYI9ks1X8hXQDaAaa5XG9WjImZgV71wI+m8qAv8y0t1pSmP0ITANTmHO2qqvRZDALlTdgHKyjWkx2YvQ2cHtTacMxYBhWK5DoF4TCkXj7Jg02VKsbOwI0Y+qvALZrOQXMC13cKkDSJWBuJUCqAhgbG3uF7IpBcn/k8KlPNQ+78U5QQuhy/vHjuQoAYPndwi9gw4bd2ufGYrWatxz8No50ExhaKsz9Vl6vAPL5/KKzoiTGG0fOg1oqCbvxTp/juw/M+zynu/yTwjoD58CBQ02ez/pAR4E+M69ntf3/o1Y3dqR050oAQz7P6Z6cfPRRw647MkOhUMAfaDyH+AloBKYNPRT292rQHoMOSp09J3TZlt5ezWazxX97VR3638RiX9ct+RImSyBcrDT0ETMyMp4ptRIgVX7QL6J/ALSUEwJ5rdg2AAAAAElFTkSuQmCC", + "theme": "light" + }, + { + "mimeType": "image/png", + "src": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAABxElEQVRIibWVvW4TURCFv0vlNEDcIHAkKAERJOIKSjoUArwBPwUFFaKIIngAJARCPIgdh4cgRBYt6ZIAEYEqdhpEw0fhCbkKa68dxyNtsfNzzpnZu3NhwpYGBdUqcA+4A1wEZiK0DawD74FWSml3JAJ1CngGLAIngU1gFfgZKWeAG8AFoAu8At6mlH6VtqTOqJ/UP2pDnRuQO6c27VlbrQ0Dvq121Fulag7q5qPmW18SdSqUd9Qrw4Jn9bNR21YrRQkvYixDKy/AuB3jWjocqKpdtXFU8AxrOTqZzp2PgvnaMRDUA+tB7mypG+OCZ3hbahPgRPguAR9LihaicEu9WcKxClzOi/fU1wPAk7rjgX0uEfNG3cs7mJjtE+wA5/olpZQEHgNf6K2NJyW4NeD7v7c4WptjSc0svlMjdzyM2fbdOyOA7x/T+7mzGj9H8xgIWuquevpw4HmsivkxwBdC/WJRsBKLqqPOHgH8aqybtcJlF0m1WLndUToJ5V31q9r3NOYk7Wh1Wa0PyK3HzA3l/4H3uzIrwFNgCThF7/x/AH5EylngOnAe6AAvgXcppd9DEWRE08DdeIou/RVgJaXUGYQzUfsL+zmwV7BtIq0AAAAASUVORK5CYII=", + "theme": "dark" + } + ], + "inputSchema": { + "properties": { + "after_id": { + "description": "The ID of the sub-issue to be prioritized after (either after_id OR before_id should be specified)", + "type": "number" + }, + "before_id": { + "description": "The ID of the sub-issue to be prioritized before (either after_id OR before_id should be specified)", + "type": "number" + }, + "issue_number": { + "description": "The number of the parent issue", + "type": "number" + }, + "method": { + "description": "The action to perform on a single sub-issue\nOptions are:\n- 'add' - add a sub-issue to a parent issue in a GitHub repository.\n- 'remove' - remove a sub-issue from a parent issue in a GitHub repository.\n- 'reprioritize' - change the order of sub-issues within a parent issue in a GitHub repository. Use either 'after_id' or 'before_id' to specify the new position.\nWrites issue hierarchy. To move a sub-issue to a new parent, use `add` with `replace_parent=true`; there is no writable parent field.\n", + "type": "string" + }, + "owner": { + "description": "Repository owner", + "type": "string", + "x-mcp-header": "owner" + }, + "replace_parent": { + "description": "When true, replaces the sub-issue's current parent issue. Use with 'add' method only.", + "type": "boolean" + }, + "repo": { + "description": "Repository name", + "type": "string", + "x-mcp-header": "repo" + }, + "sub_issue_id": { + "description": "The ID of the sub-issue to add. ID is not the same as issue number", + "type": "number" + } + }, + "required": [ + "method", + "owner", + "repo", + "issue_number", + "sub_issue_id" + ], + "type": "object" + }, + "name": "sub_issue_write", + "outputSchema": { + "$defs": { + "repository": { + "additionalProperties": false, + "properties": { + "allow_auto_merge": { + "type": [ + "null", + "boolean" + ] + }, + "allow_forking": { + "type": [ + "null", + "boolean" + ] + }, + "allow_merge_commit": { + "type": [ + "null", + "boolean" + ] + }, + "allow_rebase_merge": { + "type": [ + "null", + "boolean" + ] + }, + "allow_squash_merge": { + "type": [ + "null", + "boolean" + ] + }, + "allow_update_branch": { + "type": [ + "null", + "boolean" + ] + }, + "archive_url": { + "type": [ + "null", + "string" + ] + }, + "archived": { + "type": [ + "null", + "boolean" + ] + }, + "assignees_url": { + "type": [ + "null", + "string" + ] + }, + "auto_init": { + "type": [ + "null", + "boolean" + ] + }, + "blobs_url": { + "type": [ + "null", + "string" + ] + }, + "branches_url": { + "type": [ + "null", + "string" + ] + }, + "clone_url": { + "type": [ + "null", + "string" + ] + }, + "code_of_conduct": { + "additionalProperties": false, + "properties": { + "body": { + "type": [ + "null", + "string" + ] + }, + "key": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "collaborators_url": { + "type": [ + "null", + "string" + ] + }, + "comments_url": { + "type": [ + "null", + "string" + ] + }, + "commits_url": { + "type": [ + "null", + "string" + ] + }, + "compare_url": { + "type": [ + "null", + "string" + ] + }, + "contents_url": { + "type": [ + "null", + "string" + ] + }, + "contributors_url": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "custom_properties": { + "additionalProperties": true, + "type": "object" + }, + "default_branch": { + "type": [ + "null", + "string" + ] + }, + "delete_branch_on_merge": { + "type": [ + "null", + "boolean" + ] + }, + "deployments_url": { + "type": [ + "null", + "string" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "disabled": { + "type": [ + "null", + "boolean" + ] + }, + "downloads_url": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "fork": { + "type": [ + "null", + "boolean" + ] + }, + "forks_count": { + "type": [ + "null", + "integer" + ] + }, + "forks_url": { + "type": [ + "null", + "string" + ] + }, + "full_name": { + "type": [ + "null", + "string" + ] + }, + "git_commits_url": { + "type": [ + "null", + "string" + ] + }, + "git_refs_url": { + "type": [ + "null", + "string" + ] + }, + "git_tags_url": { + "type": [ + "null", + "string" + ] + }, + "git_url": { + "type": [ + "null", + "string" + ] + }, + "gitignore_template": { + "type": [ + "null", + "string" + ] + }, + "has_discussions": { + "type": [ + "null", + "boolean" + ] + }, + "has_downloads": { + "type": [ + "null", + "boolean" + ] + }, + "has_issues": { + "type": [ + "null", + "boolean" + ] + }, + "has_pages": { + "type": [ + "null", + "boolean" + ] + }, + "has_projects": { + "type": [ + "null", + "boolean" + ] + }, + "has_pull_requests": { + "type": [ + "null", + "boolean" + ] + }, + "has_wiki": { + "type": [ + "null", + "boolean" + ] + }, + "homepage": { + "type": [ + "null", + "string" + ] + }, + "hooks_url": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "is_template": { + "type": [ + "null", + "boolean" + ] + }, + "issue_comment_url": { + "type": [ + "null", + "string" + ] + }, + "issue_events_url": { + "type": [ + "null", + "string" + ] + }, + "issues_url": { + "type": [ + "null", + "string" + ] + }, + "keys_url": { + "type": [ + "null", + "string" + ] + }, + "labels_url": { + "type": [ + "null", + "string" + ] + }, + "language": { + "type": [ + "null", + "string" + ] + }, + "languages_url": { + "type": [ + "null", + "string" + ] + }, + "license": { + "additionalProperties": false, + "properties": { + "body": { + "type": [ + "null", + "string" + ] + }, + "conditions": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "featured": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "implementation": { + "type": [ + "null", + "string" + ] + }, + "key": { + "type": [ + "null", + "string" + ] + }, + "limitations": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "permissions": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "spdx_id": { + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "license_template": { + "type": [ + "null", + "string" + ] + }, + "master_branch": { + "type": [ + "null", + "string" + ] + }, + "merge_commit_message": { + "type": [ + "null", + "string" + ] + }, + "merge_commit_title": { + "type": [ + "null", + "string" + ] + }, + "merges_url": { + "type": [ + "null", + "string" + ] + }, + "milestones_url": { + "type": [ + "null", + "string" + ] + }, + "mirror_url": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "network_count": { + "type": [ + "null", + "integer" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notifications_url": { + "type": [ + "null", + "string" + ] + }, + "open_issues": { + "type": [ + "null", + "integer" + ] + }, + "open_issues_count": { + "type": [ + "null", + "integer" + ] + }, + "organization": { + "additionalProperties": false, + "properties": { + "advanced_security_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "archived_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "billing_email": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "default_repository_branch": { + "type": [ + "null", + "string" + ] + }, + "default_repository_permission": { + "type": [ + "null", + "string" + ] + }, + "default_repository_settings": { + "type": [ + "null", + "string" + ] + }, + "dependabot_alerts_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "dependabot_security_updates_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "dependency_graph_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "deploy_keys_enabled_for_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "display_commenter_full_name_setting_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "has_organization_projects": { + "type": [ + "null", + "boolean" + ] + }, + "has_repository_projects": { + "type": [ + "null", + "boolean" + ] + }, + "hooks_url": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "is_verified": { + "type": [ + "null", + "boolean" + ] + }, + "issues_url": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "members_allowed_repository_creation_type": { + "type": [ + "null", + "string" + ] + }, + "members_can_change_repo_visibility": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_internal_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_pages": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_private_pages": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_private_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_public_pages": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_public_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_teams": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_delete_issues": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_delete_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_fork_private_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_invite_outside_collaborators": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_view_dependency_insights": { + "type": [ + "null", + "boolean" + ] + }, + "members_url": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_members_url": { + "type": [ + "null", + "string" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "readers_can_create_discussions": { + "type": [ + "null", + "boolean" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "secret_scanning_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "secret_scanning_push_protection_custom_link": { + "type": [ + "null", + "string" + ] + }, + "secret_scanning_push_protection_custom_link_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "secret_scanning_push_protection_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "secret_scanning_validity_checks_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_requirement_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "web_commit_signoff_required": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "owner": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "parent": { + "$ref": "#/$defs/repository", + "type": [ + "null", + "object" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private": { + "type": [ + "null", + "boolean" + ] + }, + "pull_request_creation_policy": { + "type": [ + "null", + "string" + ] + }, + "pulls_url": { + "type": [ + "null", + "string" + ] + }, + "pushed_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "releases_url": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "security_and_analysis": { + "additionalProperties": false, + "properties": { + "advanced_security": { + "additionalProperties": false, + "properties": { + "status": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "code_security": { + "additionalProperties": false, + "properties": { + "status": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "dependabot_security_updates": { + "additionalProperties": false, + "properties": { + "status": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "secret_scanning": { + "additionalProperties": false, + "properties": { + "status": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "secret_scanning_push_protection": { + "additionalProperties": false, + "properties": { + "status": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "secret_scanning_validity_checks": { + "additionalProperties": false, + "properties": { + "status": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "size": { + "type": [ + "null", + "integer" + ] + }, + "source": { + "$ref": "#/$defs/repository", + "type": [ + "null", + "object" + ] + }, + "squash_merge_commit_message": { + "type": [ + "null", + "string" + ] + }, + "squash_merge_commit_title": { + "type": [ + "null", + "string" + ] + }, + "ssh_url": { + "type": [ + "null", + "string" + ] + }, + "stargazers_count": { + "type": [ + "null", + "integer" + ] + }, + "stargazers_url": { + "type": [ + "null", + "string" + ] + }, + "statuses_url": { + "type": [ + "null", + "string" + ] + }, + "subscribers_count": { + "type": [ + "null", + "integer" + ] + }, + "subscribers_url": { + "type": [ + "null", + "string" + ] + }, + "subscription_url": { + "type": [ + "null", + "string" + ] + }, + "svn_url": { + "type": [ + "null", + "string" + ] + }, + "tags_url": { + "type": [ + "null", + "string" + ] + }, + "team_id": { + "type": [ + "null", + "integer" + ] + }, + "teams_url": { + "type": [ + "null", + "string" + ] + }, + "template_repository": { + "$ref": "#/$defs/repository", + "type": [ + "null", + "object" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "topics": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "trees_url": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "use_squash_pr_title_as_default": { + "type": [ + "null", + "boolean" + ] + }, + "visibility": { + "type": [ + "null", + "string" + ] + }, + "watchers": { + "type": [ + "null", + "integer" + ] + }, + "watchers_count": { + "type": [ + "null", + "integer" + ] + }, + "web_commit_signoff_required": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "object", + "null" + ] + }, + "team": { + "additionalProperties": false, + "properties": { + "access_source": { + "type": [ + "null", + "string" + ] + }, + "assignment": { + "type": [ + "null", + "string" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "members_count": { + "type": [ + "null", + "integer" + ] + }, + "members_url": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_setting": { + "type": [ + "null", + "string" + ] + }, + "organization": { + "additionalProperties": false, + "properties": { + "advanced_security_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "archived_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "billing_email": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "default_repository_branch": { + "type": [ + "null", + "string" + ] + }, + "default_repository_permission": { + "type": [ + "null", + "string" + ] + }, + "default_repository_settings": { + "type": [ + "null", + "string" + ] + }, + "dependabot_alerts_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "dependabot_security_updates_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "dependency_graph_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "deploy_keys_enabled_for_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "display_commenter_full_name_setting_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "has_organization_projects": { + "type": [ + "null", + "boolean" + ] + }, + "has_repository_projects": { + "type": [ + "null", + "boolean" + ] + }, + "hooks_url": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "is_verified": { + "type": [ + "null", + "boolean" + ] + }, + "issues_url": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "members_allowed_repository_creation_type": { + "type": [ + "null", + "string" + ] + }, + "members_can_change_repo_visibility": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_internal_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_pages": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_private_pages": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_private_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_public_pages": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_public_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_create_teams": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_delete_issues": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_delete_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_fork_private_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_invite_outside_collaborators": { + "type": [ + "null", + "boolean" + ] + }, + "members_can_view_dependency_insights": { + "type": [ + "null", + "boolean" + ] + }, + "members_url": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_members_url": { + "type": [ + "null", + "string" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "readers_can_create_discussions": { + "type": [ + "null", + "boolean" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "secret_scanning_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "secret_scanning_push_protection_custom_link": { + "type": [ + "null", + "string" + ] + }, + "secret_scanning_push_protection_custom_link_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "secret_scanning_push_protection_enabled_for_new_repositories": { + "type": [ + "null", + "boolean" + ] + }, + "secret_scanning_validity_checks_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_requirement_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "web_commit_signoff_required": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "parent": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "permission": { + "type": [ + "null", + "string" + ] + }, + "permissions": { + "additionalProperties": { + "type": "boolean" + }, + "type": "object" + }, + "privacy": { + "type": [ + "null", + "string" + ] + }, + "repos_count": { + "type": [ + "null", + "integer" + ] + }, + "repositories_url": { + "type": [ + "null", + "string" + ] + }, + "slug": { + "type": [ + "null", + "string" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "object", + "null" + ] + } + }, + "additionalProperties": false, + "properties": { + "active_lock_reason": { + "type": [ + "null", + "string" + ] + }, + "assignee": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "assignees": { + "items": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "author_association": { + "type": [ + "null", + "string" + ] + }, + "body": { + "type": [ + "null", + "string" + ] + }, + "closed_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "closed_by": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "comments": { + "type": [ + "null", + "integer" + ] + }, + "comments_url": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "draft": { + "type": [ + "null", + "boolean" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "issue_dependencies_summary": { + "additionalProperties": false, + "properties": { + "blocked_by": { + "type": [ + "null", + "integer" + ] + }, + "blocking": { + "type": [ + "null", + "integer" + ] + }, + "total_blocked_by": { + "type": [ + "null", + "integer" + ] + }, + "total_blocking": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "issue_field_values": { + "items": { + "additionalProperties": false, + "properties": { + "data_type": { + "type": "string" + }, + "issue_field_id": { + "type": "integer" + }, + "node_id": { + "type": "string" + }, + "single_select_option": { + "additionalProperties": false, + "properties": { + "color": { + "type": "string" + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + } + }, + "required": [ + "id", + "name", + "color" + ], + "type": [ + "null", + "object" + ] + }, + "value": { + "type": [ + "string", + "number", + "boolean", + "null" + ] + } + }, + "required": [ + "issue_field_id", + "node_id", + "data_type", + "value" + ], + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "labels": { + "items": { + "additionalProperties": false, + "properties": { + "color": { + "type": "string" + }, + "default": { + "type": "boolean" + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": "integer" + }, + "name": { + "type": "string" + }, + "node_id": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "url", + "name", + "color", + "description", + "default", + "node_id" + ], + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "labels_url": { + "type": [ + "null", + "string" + ] + }, + "locked": { + "type": [ + "null", + "boolean" + ] + }, + "milestone": { + "additionalProperties": false, + "properties": { + "closed_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "closed_issues": { + "type": [ + "null", + "integer" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "creator": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "due_on": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "labels_url": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "number": { + "type": [ + "null", + "integer" + ] + }, + "open_issues": { + "type": [ + "null", + "integer" + ] + }, + "state": { + "type": [ + "null", + "string" + ] + }, + "title": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "number": { + "type": [ + "null", + "integer" + ] + }, + "parent_issue_url": { + "type": [ + "null", + "string" + ] + }, + "performed_via_github_app": { + "additionalProperties": false, + "properties": { + "client_id": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "events": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "external_url": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "installations_count": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "owner": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "actions": { + "type": [ + "null", + "string" + ] + }, + "actions_variables": { + "type": [ + "null", + "string" + ] + }, + "administration": { + "type": [ + "null", + "string" + ] + }, + "attestations": { + "type": [ + "null", + "string" + ] + }, + "blocking": { + "type": [ + "null", + "string" + ] + }, + "checks": { + "type": [ + "null", + "string" + ] + }, + "codespaces": { + "type": [ + "null", + "string" + ] + }, + "codespaces_lifecycle_admin": { + "type": [ + "null", + "string" + ] + }, + "codespaces_metadata": { + "type": [ + "null", + "string" + ] + }, + "codespaces_secrets": { + "type": [ + "null", + "string" + ] + }, + "codespaces_user_secrets": { + "type": [ + "null", + "string" + ] + }, + "content_references": { + "type": [ + "null", + "string" + ] + }, + "contents": { + "type": [ + "null", + "string" + ] + }, + "copilot_messages": { + "type": [ + "null", + "string" + ] + }, + "dependabot_secrets": { + "type": [ + "null", + "string" + ] + }, + "deployments": { + "type": [ + "null", + "string" + ] + }, + "discussions": { + "type": [ + "null", + "string" + ] + }, + "emails": { + "type": [ + "null", + "string" + ] + }, + "enterprise_ai_controls": { + "type": [ + "null", + "string" + ] + }, + "enterprise_copilot_metrics": { + "type": [ + "null", + "string" + ] + }, + "enterprise_credentials": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_enterprise_roles": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_org_roles": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_properties": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_properties_for_organizations": { + "type": [ + "null", + "string" + ] + }, + "enterprise_organization_installation_repositories": { + "type": [ + "null", + "string" + ] + }, + "enterprise_organization_installations": { + "type": [ + "null", + "string" + ] + }, + "enterprise_organizations": { + "type": [ + "null", + "string" + ] + }, + "enterprise_people": { + "type": [ + "null", + "string" + ] + }, + "enterprise_sso": { + "type": [ + "null", + "string" + ] + }, + "enterprise_teams": { + "type": [ + "null", + "string" + ] + }, + "environments": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "string" + ] + }, + "gists": { + "type": [ + "null", + "string" + ] + }, + "git_signing_ssh_public_keys": { + "type": [ + "null", + "string" + ] + }, + "gpg_keys": { + "type": [ + "null", + "string" + ] + }, + "interaction_limits": { + "type": [ + "null", + "string" + ] + }, + "issues": { + "type": [ + "null", + "string" + ] + }, + "keys": { + "type": [ + "null", + "string" + ] + }, + "members": { + "type": [ + "null", + "string" + ] + }, + "merge_queues": { + "type": [ + "null", + "string" + ] + }, + "metadata": { + "type": [ + "null", + "string" + ] + }, + "organization_actions_variables": { + "type": [ + "null", + "string" + ] + }, + "organization_administration": { + "type": [ + "null", + "string" + ] + }, + "organization_announcement_banners": { + "type": [ + "null", + "string" + ] + }, + "organization_api_insights": { + "type": [ + "null", + "string" + ] + }, + "organization_codespaces": { + "type": [ + "null", + "string" + ] + }, + "organization_codespaces_secrets": { + "type": [ + "null", + "string" + ] + }, + "organization_codespaces_settings": { + "type": [ + "null", + "string" + ] + }, + "organization_copilot_metrics": { + "type": [ + "null", + "string" + ] + }, + "organization_copilot_seat_management": { + "type": [ + "null", + "string" + ] + }, + "organization_custom_org_roles": { + "type": [ + "null", + "string" + ] + }, + "organization_custom_properties": { + "type": [ + "null", + "string" + ] + }, + "organization_custom_roles": { + "type": [ + "null", + "string" + ] + }, + "organization_dependabot_secrets": { + "type": [ + "null", + "string" + ] + }, + "organization_events": { + "type": [ + "null", + "string" + ] + }, + "organization_hooks": { + "type": [ + "null", + "string" + ] + }, + "organization_knowledge_bases": { + "type": [ + "null", + "string" + ] + }, + "organization_packages": { + "type": [ + "null", + "string" + ] + }, + "organization_personal_access_token_requests": { + "type": [ + "null", + "string" + ] + }, + "organization_personal_access_tokens": { + "type": [ + "null", + "string" + ] + }, + "organization_plan": { + "type": [ + "null", + "string" + ] + }, + "organization_pre_receive_hooks": { + "type": [ + "null", + "string" + ] + }, + "organization_projects": { + "type": [ + "null", + "string" + ] + }, + "organization_secrets": { + "type": [ + "null", + "string" + ] + }, + "organization_self_hosted_runners": { + "type": [ + "null", + "string" + ] + }, + "organization_user_blocking": { + "type": [ + "null", + "string" + ] + }, + "packages": { + "type": [ + "null", + "string" + ] + }, + "pages": { + "type": [ + "null", + "string" + ] + }, + "plan": { + "type": [ + "null", + "string" + ] + }, + "profile": { + "type": [ + "null", + "string" + ] + }, + "pull_requests": { + "type": [ + "null", + "string" + ] + }, + "repository_advisories": { + "type": [ + "null", + "string" + ] + }, + "repository_custom_properties": { + "type": [ + "null", + "string" + ] + }, + "repository_hooks": { + "type": [ + "null", + "string" + ] + }, + "repository_pre_receive_hooks": { + "type": [ + "null", + "string" + ] + }, + "repository_projects": { + "type": [ + "null", + "string" + ] + }, + "secret_scanning_alerts": { + "type": [ + "null", + "string" + ] + }, + "secrets": { + "type": [ + "null", + "string" + ] + }, + "security_events": { + "type": [ + "null", + "string" + ] + }, + "single_file": { + "type": [ + "null", + "string" + ] + }, + "starring": { + "type": [ + "null", + "string" + ] + }, + "statuses": { + "type": [ + "null", + "string" + ] + }, + "team_discussions": { + "type": [ + "null", + "string" + ] + }, + "user_events": { + "type": [ + "null", + "string" + ] + }, + "vulnerability_alerts": { + "type": [ + "null", + "string" + ] + }, + "watching": { + "type": [ + "null", + "string" + ] + }, + "workflows": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "slug": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "pinned_comment": { + "additionalProperties": false, + "properties": { + "author_association": { + "type": [ + "null", + "string" + ] + }, + "body": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "issue_url": { + "type": [ + "null", + "string" + ] + }, + "minimized": { + "additionalProperties": false, + "properties": { + "reason": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "performed_via_github_app": { + "additionalProperties": false, + "properties": { + "client_id": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "events": { + "items": { + "type": "string" + }, + "type": [ + "null", + "array" + ] + }, + "external_url": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "installations_count": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "owner": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "actions": { + "type": [ + "null", + "string" + ] + }, + "actions_variables": { + "type": [ + "null", + "string" + ] + }, + "administration": { + "type": [ + "null", + "string" + ] + }, + "attestations": { + "type": [ + "null", + "string" + ] + }, + "blocking": { + "type": [ + "null", + "string" + ] + }, + "checks": { + "type": [ + "null", + "string" + ] + }, + "codespaces": { + "type": [ + "null", + "string" + ] + }, + "codespaces_lifecycle_admin": { + "type": [ + "null", + "string" + ] + }, + "codespaces_metadata": { + "type": [ + "null", + "string" + ] + }, + "codespaces_secrets": { + "type": [ + "null", + "string" + ] + }, + "codespaces_user_secrets": { + "type": [ + "null", + "string" + ] + }, + "content_references": { + "type": [ + "null", + "string" + ] + }, + "contents": { + "type": [ + "null", + "string" + ] + }, + "copilot_messages": { + "type": [ + "null", + "string" + ] + }, + "dependabot_secrets": { + "type": [ + "null", + "string" + ] + }, + "deployments": { + "type": [ + "null", + "string" + ] + }, + "discussions": { + "type": [ + "null", + "string" + ] + }, + "emails": { + "type": [ + "null", + "string" + ] + }, + "enterprise_ai_controls": { + "type": [ + "null", + "string" + ] + }, + "enterprise_copilot_metrics": { + "type": [ + "null", + "string" + ] + }, + "enterprise_credentials": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_enterprise_roles": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_org_roles": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_properties": { + "type": [ + "null", + "string" + ] + }, + "enterprise_custom_properties_for_organizations": { + "type": [ + "null", + "string" + ] + }, + "enterprise_organization_installation_repositories": { + "type": [ + "null", + "string" + ] + }, + "enterprise_organization_installations": { + "type": [ + "null", + "string" + ] + }, + "enterprise_organizations": { + "type": [ + "null", + "string" + ] + }, + "enterprise_people": { + "type": [ + "null", + "string" + ] + }, + "enterprise_sso": { + "type": [ + "null", + "string" + ] + }, + "enterprise_teams": { + "type": [ + "null", + "string" + ] + }, + "environments": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "string" + ] + }, + "gists": { + "type": [ + "null", + "string" + ] + }, + "git_signing_ssh_public_keys": { + "type": [ + "null", + "string" + ] + }, + "gpg_keys": { + "type": [ + "null", + "string" + ] + }, + "interaction_limits": { + "type": [ + "null", + "string" + ] + }, + "issues": { + "type": [ + "null", + "string" + ] + }, + "keys": { + "type": [ + "null", + "string" + ] + }, + "members": { + "type": [ + "null", + "string" + ] + }, + "merge_queues": { + "type": [ + "null", + "string" + ] + }, + "metadata": { + "type": [ + "null", + "string" + ] + }, + "organization_actions_variables": { + "type": [ + "null", + "string" + ] + }, + "organization_administration": { + "type": [ + "null", + "string" + ] + }, + "organization_announcement_banners": { + "type": [ + "null", + "string" + ] + }, + "organization_api_insights": { + "type": [ + "null", + "string" + ] + }, + "organization_codespaces": { + "type": [ + "null", + "string" + ] + }, + "organization_codespaces_secrets": { + "type": [ + "null", + "string" + ] + }, + "organization_codespaces_settings": { + "type": [ + "null", + "string" + ] + }, + "organization_copilot_metrics": { + "type": [ + "null", + "string" + ] + }, + "organization_copilot_seat_management": { + "type": [ + "null", + "string" + ] + }, + "organization_custom_org_roles": { + "type": [ + "null", + "string" + ] + }, + "organization_custom_properties": { + "type": [ + "null", + "string" + ] + }, + "organization_custom_roles": { + "type": [ + "null", + "string" + ] + }, + "organization_dependabot_secrets": { + "type": [ + "null", + "string" + ] + }, + "organization_events": { + "type": [ + "null", + "string" + ] + }, + "organization_hooks": { + "type": [ + "null", + "string" + ] + }, + "organization_knowledge_bases": { + "type": [ + "null", + "string" + ] + }, + "organization_packages": { + "type": [ + "null", + "string" + ] + }, + "organization_personal_access_token_requests": { + "type": [ + "null", + "string" + ] + }, + "organization_personal_access_tokens": { + "type": [ + "null", + "string" + ] + }, + "organization_plan": { + "type": [ + "null", + "string" + ] + }, + "organization_pre_receive_hooks": { + "type": [ + "null", + "string" + ] + }, + "organization_projects": { + "type": [ + "null", + "string" + ] + }, + "organization_secrets": { + "type": [ + "null", + "string" + ] + }, + "organization_self_hosted_runners": { + "type": [ + "null", + "string" + ] + }, + "organization_user_blocking": { + "type": [ + "null", + "string" + ] + }, + "packages": { + "type": [ + "null", + "string" + ] + }, + "pages": { + "type": [ + "null", + "string" + ] + }, + "plan": { + "type": [ + "null", + "string" + ] + }, + "profile": { + "type": [ + "null", + "string" + ] + }, + "pull_requests": { + "type": [ + "null", + "string" + ] + }, + "repository_advisories": { + "type": [ + "null", + "string" + ] + }, + "repository_custom_properties": { + "type": [ + "null", + "string" + ] + }, + "repository_hooks": { + "type": [ + "null", + "string" + ] + }, + "repository_pre_receive_hooks": { + "type": [ + "null", + "string" + ] + }, + "repository_projects": { + "type": [ + "null", + "string" + ] + }, + "secret_scanning_alerts": { + "type": [ + "null", + "string" + ] + }, + "secrets": { + "type": [ + "null", + "string" + ] + }, + "security_events": { + "type": [ + "null", + "string" + ] + }, + "single_file": { + "type": [ + "null", + "string" + ] + }, + "starring": { + "type": [ + "null", + "string" + ] + }, + "statuses": { + "type": [ + "null", + "string" + ] + }, + "team_discussions": { + "type": [ + "null", + "string" + ] + }, + "user_events": { + "type": [ + "null", + "string" + ] + }, + "vulnerability_alerts": { + "type": [ + "null", + "string" + ] + }, + "watching": { + "type": [ + "null", + "string" + ] + }, + "workflows": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "slug": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "pin": { + "additionalProperties": false, + "properties": { + "pinned_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "pinned_by": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "reactions": { + "additionalProperties": false, + "properties": { + "+1": { + "type": [ + "null", + "integer" + ] + }, + "-1": { + "type": [ + "null", + "integer" + ] + }, + "confused": { + "type": [ + "null", + "integer" + ] + }, + "eyes": { + "type": [ + "null", + "integer" + ] + }, + "heart": { + "type": [ + "null", + "integer" + ] + }, + "hooray": { + "type": [ + "null", + "integer" + ] + }, + "laugh": { + "type": [ + "null", + "integer" + ] + }, + "rocket": { + "type": [ + "null", + "integer" + ] + }, + "total_count": { + "type": [ + "null", + "integer" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "pull_request": { + "additionalProperties": false, + "properties": { + "diff_url": { + "type": [ + "null", + "string" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "merged_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "patch_url": { + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "reactions": { + "additionalProperties": false, + "properties": { + "+1": { + "type": [ + "null", + "integer" + ] + }, + "-1": { + "type": [ + "null", + "integer" + ] + }, + "confused": { + "type": [ + "null", + "integer" + ] + }, + "eyes": { + "type": [ + "null", + "integer" + ] + }, + "heart": { + "type": [ + "null", + "integer" + ] + }, + "hooray": { + "type": [ + "null", + "integer" + ] + }, + "laugh": { + "type": [ + "null", + "integer" + ] + }, + "rocket": { + "type": [ + "null", + "integer" + ] + }, + "total_count": { + "type": [ + "null", + "integer" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "repository": { + "$ref": "#/$defs/repository", + "type": [ + "null", + "object" + ] + }, + "repository_url": { + "type": [ + "null", + "string" + ] + }, + "state": { + "type": [ + "null", + "string" + ] + }, + "state_reason": { + "type": [ + "null", + "string" + ] + }, + "sub_issues_summary": { + "additionalProperties": false, + "properties": { + "completed": { + "type": [ + "null", + "integer" + ] + }, + "percent_completed": { + "type": [ + "null", + "integer" + ] + }, + "total": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "title": { + "type": [ + "null", + "string" + ] + }, + "type": { + "additionalProperties": false, + "properties": { + "color": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "description": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "is_enabled": { + "type": [ + "null", + "boolean" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user": { + "additionalProperties": false, + "properties": { + "assignment": { + "type": [ + "null", + "string" + ] + }, + "avatar_url": { + "type": [ + "null", + "string" + ] + }, + "bio": { + "type": [ + "null", + "string" + ] + }, + "blog": { + "type": [ + "null", + "string" + ] + }, + "business_plus": { + "type": [ + "null", + "boolean" + ] + }, + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "company": { + "type": [ + "null", + "string" + ] + }, + "created_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "disk_usage": { + "type": [ + "null", + "integer" + ] + }, + "email": { + "type": [ + "null", + "string" + ] + }, + "events_url": { + "type": [ + "null", + "string" + ] + }, + "followers": { + "type": [ + "null", + "integer" + ] + }, + "followers_url": { + "type": [ + "null", + "string" + ] + }, + "following": { + "type": [ + "null", + "integer" + ] + }, + "following_url": { + "type": [ + "null", + "string" + ] + }, + "gists_url": { + "type": [ + "null", + "string" + ] + }, + "gravatar_id": { + "type": [ + "null", + "string" + ] + }, + "hireable": { + "type": [ + "null", + "boolean" + ] + }, + "html_url": { + "type": [ + "null", + "string" + ] + }, + "id": { + "type": [ + "null", + "integer" + ] + }, + "inherited": { + "type": [ + "null", + "boolean" + ] + }, + "inherited_from": { + "items": { + "$ref": "#/$defs/team", + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "ldap_dn": { + "type": [ + "null", + "string" + ] + }, + "location": { + "type": [ + "null", + "string" + ] + }, + "login": { + "type": [ + "null", + "string" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "node_id": { + "type": [ + "null", + "string" + ] + }, + "notification_email": { + "type": [ + "null", + "string" + ] + }, + "organizations_url": { + "type": [ + "null", + "string" + ] + }, + "owned_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "permissions": { + "additionalProperties": false, + "properties": { + "admin": { + "type": [ + "null", + "boolean" + ] + }, + "maintain": { + "type": [ + "null", + "boolean" + ] + }, + "pull": { + "type": [ + "null", + "boolean" + ] + }, + "push": { + "type": [ + "null", + "boolean" + ] + }, + "triage": { + "type": [ + "null", + "boolean" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "plan": { + "additionalProperties": false, + "properties": { + "collaborators": { + "type": [ + "null", + "integer" + ] + }, + "filled_seats": { + "type": [ + "null", + "integer" + ] + }, + "name": { + "type": [ + "null", + "string" + ] + }, + "private_repos": { + "type": [ + "null", + "integer" + ] + }, + "seats": { + "type": [ + "null", + "integer" + ] + }, + "space": { + "type": [ + "null", + "integer" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "private_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_gists": { + "type": [ + "null", + "integer" + ] + }, + "public_repos": { + "type": [ + "null", + "integer" + ] + }, + "received_events_url": { + "type": [ + "null", + "string" + ] + }, + "repos_url": { + "type": [ + "null", + "string" + ] + }, + "role": { + "type": [ + "null", + "string" + ] + }, + "role_name": { + "type": [ + "null", + "string" + ] + }, + "site_admin": { + "type": [ + "null", + "boolean" + ] + }, + "starred_url": { + "type": [ + "null", + "string" + ] + }, + "subscriptions_url": { + "type": [ + "null", + "string" + ] + }, + "suspended_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "text_matches": { + "items": { + "additionalProperties": false, + "properties": { + "fragment": { + "type": [ + "null", + "string" + ] + }, + "matches": { + "items": { + "additionalProperties": false, + "properties": { + "indices": { + "items": { + "type": "integer" + }, + "type": [ + "null", + "array" + ] + }, + "text": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "object_type": { + "type": [ + "null", + "string" + ] + }, + "object_url": { + "type": [ + "null", + "string" + ] + }, + "property": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + }, + "type": [ + "null", + "array" + ] + }, + "total_private_repos": { + "type": [ + "null", + "integer" + ] + }, + "twitter_username": { + "type": [ + "null", + "string" + ] + }, + "two_factor_authentication": { + "type": [ + "null", + "boolean" + ] + }, + "type": { + "type": [ + "null", + "string" + ] + }, + "updated_at": { + "format": "date-time", + "type": [ + "null", + "string" + ] + }, + "url": { + "type": [ + "null", + "string" + ] + }, + "user_view_type": { + "type": [ + "null", + "string" + ] + } + }, + "type": [ + "null", + "object" + ] + } + }, + "type": [ + "object", + "null" + ] + } +} \ No newline at end of file diff --git a/pkg/github/consolidated_issue_types.go b/pkg/github/consolidated_issue_types.go new file mode 100644 index 0000000000..4a8f9f7977 --- /dev/null +++ b/pkg/github/consolidated_issue_types.go @@ -0,0 +1,568 @@ +package github + +import ( + "encoding/json" + "fmt" + + "github.com/google/go-github/v92/github" + "github.com/google/jsonschema-go/jsonschema" + "github.com/modelcontextprotocol/go-sdk/mcp" +) + +type IssueReadInput struct { + Method string `json:"method"` + Owner string `json:"owner"` + Repo string `json:"repo"` + IssueNumber int `json:"issue_number"` + Page *int `json:"page,omitempty"` + PerPage *int `json:"perPage,omitempty"` + After *string `json:"after,omitempty"` +} + +type SubIssueWriteInput struct { + Method string `json:"method"` + Owner string `json:"owner"` + Repo string `json:"repo"` + IssueNumber int `json:"issue_number"` + SubIssueID int `json:"sub_issue_id"` + ReplaceParent bool `json:"replace_parent,omitempty"` + AfterID *int `json:"after_id,omitempty"` + BeforeID *int `json:"before_id,omitempty"` +} + +type IssueWriteInput struct { + Method string `json:"method"` + Owner string `json:"owner"` + Repo string `json:"repo"` + IssueNumber *int `json:"issue_number,omitempty"` + ParentIssueNumber *int `json:"parent_issue_number,omitempty"` + ParentOwner *string `json:"parent_owner,omitempty"` + ParentRepo *string `json:"parent_repo,omitempty"` + Title *string `json:"title,omitempty"` + Body *string `json:"body,omitempty"` + Assignees *[]string `json:"assignees,omitempty"` + Labels *[]string `json:"labels,omitempty"` + Milestone *int `json:"milestone,omitempty"` + Type *string `json:"type,omitempty"` + State *string `json:"state,omitempty"` + StateReason *string `json:"state_reason,omitempty"` + DuplicateOf *int `json:"duplicate_of,omitempty"` + IssueFields []IssueWriteFieldInput `json:"issue_fields,omitempty"` + TypeProvided bool `json:"-"` +} + +func (input *IssueWriteInput) UnmarshalJSON(raw []byte) error { + type plain IssueWriteInput + var decoded plain + if err := json.Unmarshal(raw, &decoded); err != nil { + return err + } + var presence struct { + Type json.RawMessage `json:"type"` + } + if err := json.Unmarshal(raw, &presence); err != nil { + return err + } + *input = IssueWriteInput(decoded) + input.TypeProvided = len(presence.Type) != 0 + return nil +} + +type IssueWriteFieldInput struct { + FieldName string `json:"field_name"` + Value *IssueFieldValue `json:"value,omitempty"` + FieldOptionName *string `json:"field_option_name,omitempty"` + Delete *bool `json:"delete,omitempty"` +} + +// IssueFieldValue represents the REST scalar without losing its JSON type. +// Boolean inputs were historically accepted and forwarded to the API as well. +type IssueFieldValue struct { + String *string + Number *float64 + Bool *bool +} + +func (value IssueFieldValue) MarshalJSON() ([]byte, error) { + switch { + case value.String != nil: + return json.Marshal(value.String) + case value.Number != nil: + return json.Marshal(value.Number) + case value.Bool != nil: + return json.Marshal(value.Bool) + default: + return []byte("null"), nil + } +} + +func (value *IssueFieldValue) UnmarshalJSON(raw []byte) error { + *value = IssueFieldValue{} + switch { + case len(raw) > 0 && raw[0] == '"': + return json.Unmarshal(raw, &value.String) + case string(raw) == "true" || string(raw) == "false": + return json.Unmarshal(raw, &value.Bool) + case string(raw) == "null": + return nil + default: + return json.Unmarshal(raw, &value.Number) + } +} + +func issueFieldValue(value any) (*IssueFieldValue, error) { + switch value := value.(type) { + case nil: + return nil, nil + case string: + return &IssueFieldValue{String: &value}, nil + case float64: + return &IssueFieldValue{Number: &value}, nil + case bool: + return &IssueFieldValue{Bool: &value}, nil + default: + return nil, fmt.Errorf("unsupported issue field value type %T", value) + } +} + +// The read tool returns different top-level shapes, not an artificial envelope. +type IssueReadOutput struct { + Issue *IssueDetailsOutput + Comments *[]MinimalIssueComment + SubIssues *[]*SubIssueOutput + Parent *IssueParentOutput + Labels *IssueLabelsOutput +} + +func (out IssueReadOutput) MarshalJSON() ([]byte, error) { + switch { + case out.Issue != nil: + return json.Marshal(out.Issue) + case out.Comments != nil: + return json.Marshal(out.Comments) + case out.SubIssues != nil: + return json.Marshal(out.SubIssues) + case out.Parent != nil: + return json.Marshal(out.Parent) + case out.Labels != nil: + return json.Marshal(out.Labels) + default: + // SDK v1.8 validates this zero value even for errors before the + // protocol middleware removes it from the wire result. + return []byte("null"), nil + } +} + +// IssueDetailsOutput excludes REST issue_field_values: get always drops them +// and replaces them with the GraphQL field_values representation. +type IssueDetailsOutput struct { + Number int `json:"number"` + Title string `json:"title"` + Body string `json:"body,omitempty"` + State string `json:"state"` + StateReason string `json:"state_reason,omitempty"` + Draft bool `json:"draft,omitempty"` + Locked bool `json:"locked,omitempty"` + HTMLURL string `json:"html_url,omitempty"` + User *MinimalUser `json:"user,omitempty"` + AuthorAssociation string `json:"author_association,omitempty"` + Labels []string `json:"labels,omitempty"` + Assignees []string `json:"assignees"` + Milestone string `json:"milestone,omitempty"` + Comments int `json:"comments,omitempty"` + Reactions *MinimalReactions `json:"reactions,omitempty"` + CreatedAt string `json:"created_at,omitempty"` + UpdatedAt string `json:"updated_at,omitempty"` + ClosedAt string `json:"closed_at,omitempty"` + ClosedBy string `json:"closed_by,omitempty"` + IssueType string `json:"issue_type,omitempty"` + FieldValues []MinimalFieldValue `json:"field_values,omitempty"` + HasParent *bool `json:"has_parent,omitempty"` + HasChildren *bool `json:"has_children,omitempty"` + Parent *MinimalIssueRef `json:"parent,omitempty"` + SubIssuesSummary *MinimalSubIssuesSummary `json:"sub_issues_summary,omitempty"` + ClosedByPullRequests *MinimalClosingPullRequests `json:"closed_by_pull_requests,omitempty"` +} + +func issueDetailsOutput(issue MinimalIssue) *IssueDetailsOutput { + return &IssueDetailsOutput{ + Number: issue.Number, Title: issue.Title, Body: issue.Body, State: issue.State, + StateReason: issue.StateReason, Draft: issue.Draft, Locked: issue.Locked, + HTMLURL: issue.HTMLURL, User: issue.User, AuthorAssociation: issue.AuthorAssociation, + Labels: issue.Labels, Assignees: issue.Assignees, Milestone: issue.Milestone, + Comments: issue.Comments, Reactions: issue.Reactions, CreatedAt: issue.CreatedAt, + UpdatedAt: issue.UpdatedAt, ClosedAt: issue.ClosedAt, ClosedBy: issue.ClosedBy, + IssueType: issue.IssueType, FieldValues: issue.FieldValues, HasParent: issue.HasParent, + HasChildren: issue.HasChildren, Parent: issue.Parent, SubIssuesSummary: issue.SubIssuesSummary, + ClosedByPullRequests: issue.ClosedByPullRequests, + } +} + +type IssueParentOutput struct { + Parent *IssueParentRef `json:"parent"` +} + +// These fields keep the original map's lexicographic JSON ordering. +type IssueParentRef struct { + Number int `json:"number"` + Repository string `json:"repository"` + State string `json:"state"` + Title string `json:"title"` + URL string `json:"url"` +} + +type IssueLabelsOutput struct { + Labels []IssueLabelOutput `json:"labels"` + TotalCount int `json:"totalCount"` +} + +type IssueWriteOutput struct { + Issue *MinimalResponse + Awaiting *IssueWriteAwaitingOutput +} + +type IssueWriteAwaitingOutput struct { + Status string `json:"status"` + Reason string `json:"reason"` +} + +func (out IssueWriteOutput) MarshalJSON() ([]byte, error) { + if out.Awaiting != nil { + return json.Marshal(out.Awaiting) + } + if out.Issue != nil { + return json.Marshal(out.Issue) + } + return json.Marshal(MinimalResponse{}) +} + +func issueWriteOutputSchema() *jsonschema.Schema { + mutation := repositoryOutputSchema[MinimalResponse]() + awaiting := repositoryOutputSchema[IssueWriteAwaitingOutput]() + awaiting.Properties["status"].Enum = []any{"awaiting_user_submission"} + return repositoryUnionSchema(mutation, awaiting) +} + +func issueWriteResult(result *mcp.CallToolResult, output *MinimalResponse, err error) (*mcp.CallToolResult, *IssueWriteOutput, error) { + if output == nil { + return result, nil, err + } + return result, &IssueWriteOutput{Issue: output}, err +} + +func issueWriteFieldVariants() []*jsonschema.Schema { + return []*jsonschema.Schema{ + { + Required: []string{"value"}, + Properties: map[string]*jsonschema.Schema{ + "field_option_name": {Type: "string", Enum: []any{""}}, "delete": {Type: "boolean", Enum: []any{false}}, + }, + }, + { + Required: []string{"field_option_name"}, + Properties: map[string]*jsonschema.Schema{ + "field_option_name": {Type: "string", MinLength: new(1)}, + "value": {Not: &jsonschema.Schema{}}, "delete": {Type: "boolean", Enum: []any{false}}, + }, + }, + { + Required: []string{"delete"}, + Properties: map[string]*jsonschema.Schema{ + "delete": {Type: "boolean", Enum: []any{true}}, "value": {Not: &jsonschema.Schema{}}, "field_option_name": {Type: "string", Enum: []any{""}}, + }, + }, + } +} + +type IssueLabelOutput struct { + Color string `json:"color"` + Description string `json:"description"` + ID string `json:"id"` + Name string `json:"name"` +} + +type SubIssueOutput struct { + ID *int64 `json:"id,omitempty"` + Number *int `json:"number,omitempty"` + State *string `json:"state,omitempty"` + StateReason *string `json:"state_reason,omitempty"` + Locked *bool `json:"locked,omitempty"` + Title *string `json:"title,omitempty"` + Body *string `json:"body,omitempty"` + AuthorAssociation *string `json:"author_association,omitempty"` + User *github.User `json:"user,omitempty"` + Labels []*github.Label `json:"labels,omitempty"` + Assignee *github.User `json:"assignee,omitempty"` + Comments *int `json:"comments,omitempty"` + ClosedAt *github.Timestamp `json:"closed_at,omitempty"` + CreatedAt *github.Timestamp `json:"created_at,omitempty"` + UpdatedAt *github.Timestamp `json:"updated_at,omitempty"` + ClosedBy *github.User `json:"closed_by,omitempty"` + URL *string `json:"url,omitempty"` + HTMLURL *string `json:"html_url,omitempty"` + CommentsURL *string `json:"comments_url,omitempty"` + EventsURL *string `json:"events_url,omitempty"` + LabelsURL *string `json:"labels_url,omitempty"` + RepositoryURL *string `json:"repository_url,omitempty"` + ParentIssueURL *string `json:"parent_issue_url,omitempty"` + Milestone *github.Milestone `json:"milestone,omitempty"` + PullRequestLinks *github.PullRequestLinks `json:"pull_request,omitempty"` + Repository *github.Repository `json:"repository,omitempty"` + Reactions *github.Reactions `json:"reactions,omitempty"` + Assignees []*github.User `json:"assignees,omitempty"` + NodeID *string `json:"node_id,omitempty"` + Draft *bool `json:"draft,omitempty"` + Type *github.IssueType `json:"type,omitempty"` + PinnedComment *github.IssueComment `json:"pinned_comment,omitempty"` + PerformedViaGithubApp *github.App `json:"performed_via_github_app,omitempty"` + IssueDependenciesSummary *github.IssueDependenciesSummary `json:"issue_dependencies_summary,omitempty"` + SubIssuesSummary *github.SubIssuesSummary `json:"sub_issues_summary,omitempty"` + IssueFieldValues []*SubIssueFieldValueOutput `json:"issue_field_values,omitempty"` + TextMatches []*github.TextMatch `json:"text_matches,omitempty"` + ActiveLockReason *string `json:"active_lock_reason,omitempty"` +} + +type SubIssueFieldValueOutput struct { + IssueFieldID int64 `json:"issue_field_id"` + NodeID string `json:"node_id"` + DataType string `json:"data_type"` + Value *IssueFieldValue `json:"value"` + SingleSelectOption *github.IssueFieldValueSingleSelectOption `json:"single_select_option,omitempty"` +} + +func subIssueOutput(issue *github.SubIssue) (*SubIssueOutput, error) { + if issue == nil { + return nil, nil + } + out := &SubIssueOutput{ + ID: issue.ID, Number: issue.Number, State: issue.State, StateReason: issue.StateReason, + Locked: issue.Locked, Title: issue.Title, Body: issue.Body, + AuthorAssociation: issue.AuthorAssociation, //nolint:staticcheck // Preserve the existing REST response, including legacy fields. + User: issue.User, Labels: issue.Labels, Comments: issue.Comments, + Assignee: issue.Assignee, //nolint:staticcheck // Preserve the singular assignee when supplied by older API versions. + ClosedAt: issue.ClosedAt, CreatedAt: issue.CreatedAt, UpdatedAt: issue.UpdatedAt, + ClosedBy: issue.ClosedBy, URL: issue.URL, HTMLURL: issue.HTMLURL, CommentsURL: issue.CommentsURL, + EventsURL: issue.EventsURL, LabelsURL: issue.LabelsURL, RepositoryURL: issue.RepositoryURL, + ParentIssueURL: issue.ParentIssueURL, Milestone: issue.Milestone, PullRequestLinks: issue.PullRequestLinks, + Repository: issue.Repository, Reactions: issue.Reactions, Assignees: issue.Assignees, + NodeID: issue.NodeID, Draft: issue.Draft, Type: issue.Type, PinnedComment: issue.PinnedComment, + PerformedViaGithubApp: issue.PerformedViaGithubApp, IssueDependenciesSummary: issue.IssueDependenciesSummary, + SubIssuesSummary: issue.SubIssuesSummary, TextMatches: issue.TextMatches, ActiveLockReason: issue.ActiveLockReason, + } + for _, field := range issue.IssueFieldValues { + if field == nil { + out.IssueFieldValues = append(out.IssueFieldValues, nil) + continue + } + value, err := issueFieldValue(field.Value) + if err != nil { + return nil, err + } + out.IssueFieldValues = append(out.IssueFieldValues, &SubIssueFieldValueOutput{ + IssueFieldID: field.IssueFieldID, NodeID: field.NodeID, DataType: field.DataType, + Value: value, SingleSelectOption: field.SingleSelectOption, + }) + } + return out, nil +} + +func issueReadOutputSchema() *jsonschema.Schema { + issue := repositoryOutputSchema[IssueDetailsOutput]() + comments := repositoryOutputSchema[[]MinimalIssueComment]() + subIssues := subIssueArraySchema() + arrayDefinitions := subIssues.Defs + subIssues.Defs = nil + parent := repositoryOutputSchema[IssueParentOutput]() + labels := repositoryOutputSchema[IssueLabelsOutput]() + // Comments and sub-issues are both arrays; an empty array (or an array + // of nulls) is valid for either, so they form one anyOf array variant. + return repositoryUnionSchema( + &jsonschema.Schema{Type: "null"}, + issue, + &jsonschema.Schema{Type: "array", AnyOf: []*jsonschema.Schema{comments, subIssues}, Defs: arrayDefinitions}, + parent, + labels, + ) +} + +type SubIssueWriteOutput struct { + Issue *SubIssueOutput +} + +func (out SubIssueWriteOutput) MarshalJSON() ([]byte, error) { + // Unlike the SDK's default nil-pointer handling, a null API response + // must remain null rather than becoming an empty sub-issue object. + return json.Marshal(out.Issue) +} + +func subIssueWriteResult(result *mcp.CallToolResult, output *SubIssueOutput, err error) (*mcp.CallToolResult, *SubIssueWriteOutput, error) { + return result, &SubIssueWriteOutput{Issue: output}, err +} + +func subIssueWriteOutputSchema() *jsonschema.Schema { + schema := subIssueSchema() + schema.Type = "" + schema.Types = []string{"object", "null"} + return schema +} + +func subIssueSchema() *jsonschema.Schema { + schema := repositoryOutputSchema[SubIssueOutput]() + replaceIssueFieldScalar(schema) + return schema +} + +func subIssueArraySchema() *jsonschema.Schema { + schema := repositoryOutputSchema[[]*SubIssueOutput]() + replaceIssueFieldScalar(schema) + return schema +} + +func replaceIssueFieldScalar(schema *jsonschema.Schema) { + // jsonschema's type override is not needed for the surrounding API + // definitions; replace only the custom scalar's inferred properties. + if schema == nil { + return + } + if fields := schema.Properties["issue_field_values"]; fields != nil && fields.Items != nil { + fields.Items.Properties["value"] = &jsonschema.Schema{Types: []string{"string", "number", "boolean", "null"}} + } + replaceIssueFieldScalar(schema.Items) +} + +func normalizeConsolidatedIssueArguments(kind string) func(json.RawMessage) (json.RawMessage, error) { + return func(raw json.RawMessage) (json.RawMessage, error) { + var args map[string]any + if err := json.Unmarshal(raw, &args); err != nil { + return nil, err + } + for _, field := range []string{"method", "owner", "repo"} { + if _, err := RequiredParam[string](args, field); err != nil { + return nil, err + } + } + requiredInts := []string{"issue_number"} + switch kind { + case "write": + requiredInts = nil + case "sub": + requiredInts = append(requiredInts, "sub_issue_id") + } + for _, field := range requiredInts { + value, err := RequiredInt(args, field) + if err != nil { + return nil, err + } + args[field] = value + } + if kind == "read" { + pagination, err := OptionalPaginationParams(args) + if err != nil { + return nil, err + } + args["page"], args["perPage"] = pagination.Page, pagination.PerPage + } + if kind == "sub" { + if _, err := OptionalParam[bool](args, "replace_parent"); err != nil { + return nil, err + } + for _, field := range []string{"after_id", "before_id"} { + if _, exists := args[field]; exists { + value, err := OptionalIntParam(args, field) + if err != nil { + return nil, err + } + args[field] = value + } + } + } + if kind == "write" { + for _, field := range []string{"title", "body"} { + if _, err := OptionalParam[string](args, field); err != nil { + return nil, err + } + } + for _, field := range []string{"assignees", "labels"} { + if _, err := OptionalStringArrayParam(args, field); err != nil { + return nil, err + } + if args[field] == nil { + delete(args, field) + } + } + milestone, err := OptionalIntParam(args, "milestone") + if err != nil { + return nil, err + } + if _, exists := args["milestone"]; exists { + args["milestone"] = milestone + } + if _, _, err := OptionalNullableStringParam(args, "type"); err != nil { + return nil, err + } + state, err := OptionalParam[string](args, "state") + if err != nil { + return nil, err + } + reason, err := OptionalParam[string](args, "state_reason") + if err != nil { + return nil, err + } + duplicate, err := OptionalIntParam(args, "duplicate_of") + if err != nil { + return nil, err + } + if _, exists := args["duplicate_of"]; exists { + args["duplicate_of"] = duplicate + } + if duplicate != 0 && reason != "duplicate" { + return nil, fmt.Errorf("duplicate_of can only be used when state_reason is 'duplicate'") + } + if err := validateDuplicateState(state, reason, duplicate); err != nil { + return nil, err + } + parent, err := OptionalIntParam(args, "parent_issue_number") + if err != nil { + return nil, err + } + _, parentProvided := args["parent_issue_number"] + if parentProvided { + args["parent_issue_number"] = parent + if parent < 1 { + return nil, fmt.Errorf("parent_issue_number must be greater than 0") + } + if args["method"] != "create" { + return nil, fmt.Errorf("parent_issue_number can only be used with the create method") + } + } + parentOwner, err := OptionalParam[string](args, "parent_owner") + if err != nil { + return nil, err + } + parentRepo, err := OptionalParam[string](args, "parent_repo") + if err != nil { + return nil, err + } + if err := validateParentRepository(parentProvided, parentOwner, parentRepo); err != nil { + return nil, err + } + fields, err := optionalIssueWriteFields(args) + if err != nil { + return nil, err + } + if parentProvided && len(fields) > 0 { + return nil, fmt.Errorf("issue_fields cannot be used with parent_issue_number") + } + if args["method"] != "update" { + delete(args, "issue_number") + } else if _, exists := args["issue_number"]; exists { + value, err := OptionalIntParam(args, "issue_number") + if err != nil { + return nil, err + } + args["issue_number"] = value + } + } + return json.Marshal(args) + } +} diff --git a/pkg/github/issues.go b/pkg/github/issues.go index 413174e25c..56c2a74e20 100644 --- a/pkg/github/issues.go +++ b/pkg/github/issues.go @@ -822,11 +822,12 @@ func IssueRead(t translations.TranslationHelperFunc) inventory.ServerTool { } WithPagination(schema) - return NewTool( + return NewTool[IssueReadInput, *IssueReadOutput]( ToolsetMetadataIssues, mcp.Tool{ - Name: "issue_read", - Description: t("TOOL_ISSUE_READ_DESCRIPTION", "Get information about a specific issue in a GitHub repository."), + Name: "issue_read", + OutputSchema: issueReadOutputSchema(), + Description: t("TOOL_ISSUE_READ_DESCRIPTION", "Get information about a specific issue in a GitHub repository."), Annotations: &mcp.ToolAnnotations{ Title: t("TOOL_ISSUE_READ_USER_TITLE", "Get issue details"), ReadOnlyHint: true, @@ -834,7 +835,11 @@ func IssueRead(t translations.TranslationHelperFunc) inventory.ServerTool { InputSchema: schema, }, scopes.PublicRead(scopes.Repo), - func(ctx context.Context, deps ToolDependencies, _ *mcp.CallToolRequest, args map[string]any) (*mcp.CallToolResult, any, error) { + func(ctx context.Context, deps ToolDependencies, _ *mcp.CallToolRequest, input IssueReadInput) (*mcp.CallToolResult, *IssueReadOutput, error) { + args, err := discussionNotificationArguments(input) + if err != nil { + return nil, nil, err + } method, err := RequiredParam[string](args, "method") if err != nil { return utils.NewToolResultError(err.Error()), nil, nil @@ -875,50 +880,55 @@ func IssueRead(t translations.TranslationHelperFunc) inventory.ServerTool { switch method { case "get": - result, err := GetIssue(ctx, client, deps, owner, repo, issueNumber) - return attachIFC(result), nil, err + result, output, err := getIssue(ctx, client, deps, owner, repo, issueNumber) + return attachIFC(result), output, err case "get_comments": - result, err := GetIssueComments(ctx, client, deps, owner, repo, issueNumber, pagination) - return attachIFC(result), nil, err + result, output, err := getIssueComments(ctx, client, deps, owner, repo, issueNumber, pagination) + return attachIFC(result), output, err case "get_sub_issues": - result, err := GetSubIssues(ctx, client, deps, owner, repo, issueNumber, pagination) - return attachIFC(result), nil, err + result, output, err := getSubIssues(ctx, client, deps, owner, repo, issueNumber, pagination) + return attachIFC(result), output, err case "get_parent": - result, err := GetIssueParent(ctx, gqlClient, deps, owner, repo, issueNumber) - return attachIFC(result), nil, err + result, output, err := getIssueParent(ctx, gqlClient, deps, owner, repo, issueNumber) + return attachIFC(result), output, err case "get_labels": - result, err := GetIssueLabels(ctx, gqlClient, owner, repo, issueNumber) - return attachIFC(result), nil, err + result, output, err := getIssueLabels(ctx, gqlClient, owner, repo, issueNumber) + return attachIFC(result), output, err default: return utils.NewToolResultError(fmt.Sprintf("unknown method: %s", method)), nil, nil } - }) + }, normalizeConsolidatedIssueArguments("read")) } func GetIssue(ctx context.Context, client *github.Client, deps ToolDependencies, owner string, repo string, issueNumber int) (*mcp.CallToolResult, error) { + result, _, err := getIssue(ctx, client, deps, owner, repo, issueNumber) + return result, err +} + +func getIssue(ctx context.Context, client *github.Client, deps ToolDependencies, owner string, repo string, issueNumber int) (*mcp.CallToolResult, *IssueReadOutput, error) { cache, err := deps.GetRepoAccessCache(ctx) if err != nil { - return nil, fmt.Errorf("failed to get repo access cache: %w", err) + return nil, nil, fmt.Errorf("failed to get repo access cache: %w", err) } flags := deps.GetFlags(ctx) issue, resp, err := client.Issues.Get(ctx, owner, repo, issueNumber) if err != nil { - return nil, fmt.Errorf("failed to get issue: %w", err) + return nil, nil, fmt.Errorf("failed to get issue: %w", err) } defer func() { _ = resp.Body.Close() }() if resp.StatusCode != http.StatusOK { body, err := io.ReadAll(resp.Body) if err != nil { - return nil, fmt.Errorf("failed to read response body: %w", err) + return nil, nil, fmt.Errorf("failed to read response body: %w", err) } - return ghErrors.NewGitHubAPIStatusErrorResponse(ctx, "failed to get issue", resp, body), nil + return ghErrors.NewGitHubAPIStatusErrorResponse(ctx, "failed to get issue", resp, body), nil, nil } if flags.LockdownMode { if restricted, err := authorLockdownResult(ctx, cache, owner, repo, issue.GetUser().GetLogin(), lockdownIssueRestrictedMessage); restricted != nil || err != nil { - return restricted, err + return restricted, nil, err } } @@ -937,7 +947,7 @@ func GetIssue(ctx context.Context, client *github.Client, deps ToolDependencies, } } - return MarshalledTextResult(minimalIssue), nil + return MarshalledTextResult(minimalIssue), &IssueReadOutput{Issue: issueDetailsOutput(minimalIssue)}, nil } // applyIssueReadEnrichment populates the hierarchy relationship signals (has_parent/has_children, @@ -1004,9 +1014,14 @@ func isSafeRefContent(ctx context.Context, cache *lockdown.RepoAccessCache, repo } func GetIssueComments(ctx context.Context, client *github.Client, deps ToolDependencies, owner string, repo string, issueNumber int, pagination PaginationParams) (*mcp.CallToolResult, error) { + result, _, err := getIssueComments(ctx, client, deps, owner, repo, issueNumber, pagination) + return result, err +} + +func getIssueComments(ctx context.Context, client *github.Client, deps ToolDependencies, owner string, repo string, issueNumber int, pagination PaginationParams) (*mcp.CallToolResult, *IssueReadOutput, error) { cache, err := deps.GetRepoAccessCache(ctx) if err != nil { - return nil, fmt.Errorf("failed to get repo access cache: %w", err) + return nil, nil, fmt.Errorf("failed to get repo access cache: %w", err) } flags := deps.GetFlags(ctx) @@ -1019,20 +1034,20 @@ func GetIssueComments(ctx context.Context, client *github.Client, deps ToolDepen comments, resp, err := client.Issues.ListComments(ctx, owner, repo, issueNumber, opts) if err != nil { - return nil, fmt.Errorf("failed to get issue comments: %w", err) + return nil, nil, fmt.Errorf("failed to get issue comments: %w", err) } defer func() { _ = resp.Body.Close() }() if resp.StatusCode != http.StatusOK { body, err := io.ReadAll(resp.Body) if err != nil { - return nil, fmt.Errorf("failed to read response body: %w", err) + return nil, nil, fmt.Errorf("failed to read response body: %w", err) } - return ghErrors.NewGitHubAPIStatusErrorResponse(ctx, "failed to get issue comments", resp, body), nil + return ghErrors.NewGitHubAPIStatusErrorResponse(ctx, "failed to get issue comments", resp, body), nil, nil } if flags.LockdownMode { if cache == nil { - return nil, fmt.Errorf("lockdown cache is not configured") + return nil, nil, fmt.Errorf("lockdown cache is not configured") } filteredComments := make([]*github.IssueComment, 0, len(comments)) for _, comment := range comments { @@ -1046,7 +1061,7 @@ func GetIssueComments(ctx context.Context, client *github.Client, deps ToolDepen } isSafeContent, err := cache.IsSafeContent(ctx, login, owner, repo) if err != nil { - return utils.NewToolResultError(fmt.Sprintf("failed to check lockdown mode: %v", err)), nil + return utils.NewToolResultError(fmt.Sprintf("failed to check lockdown mode: %v", err)), nil, nil } if isSafeContent { filteredComments = append(filteredComments, comment) @@ -1060,13 +1075,18 @@ func GetIssueComments(ctx context.Context, client *github.Client, deps ToolDepen minimalComments = append(minimalComments, convertToMinimalIssueComment(comment)) } - return MarshalledTextResult(minimalComments), nil + return MarshalledTextResult(minimalComments), &IssueReadOutput{Comments: &minimalComments}, nil } func GetSubIssues(ctx context.Context, client *github.Client, deps ToolDependencies, owner string, repo string, issueNumber int, pagination PaginationParams) (*mcp.CallToolResult, error) { + result, _, err := getSubIssues(ctx, client, deps, owner, repo, issueNumber, pagination) + return result, err +} + +func getSubIssues(ctx context.Context, client *github.Client, deps ToolDependencies, owner string, repo string, issueNumber int, pagination PaginationParams) (*mcp.CallToolResult, *IssueReadOutput, error) { cache, err := deps.GetRepoAccessCache(ctx) if err != nil { - return nil, fmt.Errorf("failed to get repo access cache: %w", err) + return nil, nil, fmt.Errorf("failed to get repo access cache: %w", err) } featureFlags := deps.GetFlags(ctx) @@ -1081,7 +1101,7 @@ func GetSubIssues(ctx context.Context, client *github.Client, deps ToolDependenc "failed to list sub-issues", resp, err, - ), nil + ), nil, nil } defer func() { _ = resp.Body.Close() }() @@ -1089,14 +1109,14 @@ func GetSubIssues(ctx context.Context, client *github.Client, deps ToolDependenc if resp.StatusCode != http.StatusOK { body, err := io.ReadAll(resp.Body) if err != nil { - return nil, fmt.Errorf("failed to read response body: %w", err) + return nil, nil, fmt.Errorf("failed to read response body: %w", err) } - return ghErrors.NewGitHubAPIStatusErrorResponse(ctx, "failed to list sub-issues", resp, body), nil + return ghErrors.NewGitHubAPIStatusErrorResponse(ctx, "failed to list sub-issues", resp, body), nil, nil } if featureFlags.LockdownMode { if cache == nil { - return nil, fmt.Errorf("lockdown cache is not configured") + return nil, nil, fmt.Errorf("lockdown cache is not configured") } filteredSubIssues := make([]*github.SubIssue, 0, len(subIssues)) for _, subIssue := range subIssues { @@ -1110,7 +1130,7 @@ func GetSubIssues(ctx context.Context, client *github.Client, deps ToolDependenc } isSafeContent, err := cache.IsSafeContent(ctx, login, owner, repo) if err != nil { - return utils.NewToolResultError(fmt.Sprintf("failed to check lockdown mode: %v", err)), nil + return utils.NewToolResultError(fmt.Sprintf("failed to check lockdown mode: %v", err)), nil, nil } if isSafeContent { filteredSubIssues = append(filteredSubIssues, subIssue) @@ -1124,10 +1144,21 @@ func GetSubIssues(ctx context.Context, client *github.Client, deps ToolDependenc } r, err := json.Marshal(subIssues) if err != nil { - return nil, fmt.Errorf("failed to marshal response: %w", err) + return nil, nil, fmt.Errorf("failed to marshal response: %w", err) } - return utils.NewToolResultText(string(r)), nil + var output []*SubIssueOutput + if subIssues != nil { + output = make([]*SubIssueOutput, 0, len(subIssues)) + } + for _, issue := range subIssues { + item, err := subIssueOutput(issue) + if err != nil { + return nil, nil, fmt.Errorf("failed to build sub-issue output: %w", err) + } + output = append(output, item) + } + return utils.NewToolResultText(string(r)), &IssueReadOutput{SubIssues: &output}, nil } // GetIssueParent returns the parent issue of the given issue, or a null @@ -1138,9 +1169,14 @@ func GetSubIssues(ctx context.Context, client *github.Client, deps ToolDependenc // lockdown mode the parent is only returned when its author has push // access to the parent repo (mirroring GetIssue); otherwise it is omitted. func GetIssueParent(ctx context.Context, client *githubv4.Client, deps ToolDependencies, owner string, repo string, issueNumber int) (*mcp.CallToolResult, error) { + result, _, err := getIssueParent(ctx, client, deps, owner, repo, issueNumber) + return result, err +} + +func getIssueParent(ctx context.Context, client *githubv4.Client, deps ToolDependencies, owner string, repo string, issueNumber int) (*mcp.CallToolResult, *IssueReadOutput, error) { cache, err := deps.GetRepoAccessCache(ctx) if err != nil { - return nil, fmt.Errorf("failed to get repo access cache: %w", err) + return nil, nil, fmt.Errorf("failed to get repo access cache: %w", err) } flags := deps.GetFlags(ctx) @@ -1170,43 +1206,48 @@ func GetIssueParent(ctx context.Context, client *githubv4.Client, deps ToolDepen } if err := client.Query(ctx, &query, vars); err != nil { - return ghErrors.NewGitHubGraphQLErrorResponse(ctx, "failed to get issue parent", err), nil + return ghErrors.NewGitHubGraphQLErrorResponse(ctx, "failed to get issue parent", err), nil, nil } parent := query.Repository.Issue.Parent if parent == nil { - return MarshalledTextResult(map[string]any{"parent": nil}), nil + output := &IssueParentOutput{} + return MarshalledTextResult(output), &IssueReadOutput{Parent: output}, nil } if flags.LockdownMode { if cache == nil { - return nil, fmt.Errorf("lockdown cache is not configured") + return nil, nil, fmt.Errorf("lockdown cache is not configured") } // Fail closed: omit the parent if anything needed for the safe-content // check is missing or unverifiable. parentAuthorLogin := string(parent.Author.Login) parentOwner, parentRepo, ok := strings.Cut(string(parent.Repository.NameWithOwner), "/") if parentAuthorLogin == "" || !ok || parentOwner == "" || parentRepo == "" { - return MarshalledTextResult(map[string]any{"parent": nil}), nil + output := &IssueParentOutput{} + return MarshalledTextResult(output), &IssueReadOutput{Parent: output}, nil } isSafeContent, err := cache.IsSafeContent(ctx, parentAuthorLogin, parentOwner, parentRepo) if err != nil || !isSafeContent { - return MarshalledTextResult(map[string]any{"parent": nil}), nil + output := &IssueParentOutput{} + return MarshalledTextResult(output), &IssueReadOutput{Parent: output}, nil } } - return MarshalledTextResult(map[string]any{ - "parent": map[string]any{ - "number": int(parent.Number), - "title": sanitize.PlainText(string(parent.Title)), - "state": string(parent.State), - "url": string(parent.URL), - "repository": string(parent.Repository.NameWithOwner), - }, - }), nil + output := &IssueParentOutput{Parent: &IssueParentRef{ + Number: int(parent.Number), Title: sanitize.PlainText(string(parent.Title)), + State: string(parent.State), URL: string(parent.URL), + Repository: string(parent.Repository.NameWithOwner), + }} + return MarshalledTextResult(output), &IssueReadOutput{Parent: output}, nil } func GetIssueLabels(ctx context.Context, client *githubv4.Client, owner string, repo string, issueNumber int) (*mcp.CallToolResult, error) { + result, _, err := getIssueLabels(ctx, client, owner, repo, issueNumber) + return result, err +} + +func getIssueLabels(ctx context.Context, client *githubv4.Client, owner string, repo string, issueNumber int) (*mcp.CallToolResult, *IssueReadOutput, error) { // Get current labels on the issue using GraphQL var query struct { Repository struct { @@ -1231,31 +1272,28 @@ func GetIssueLabels(ctx context.Context, client *githubv4.Client, owner string, } if err := client.Query(ctx, &query, vars); err != nil { - return ghErrors.NewGitHubGraphQLErrorResponse(ctx, "Failed to get issue labels", err), nil + return ghErrors.NewGitHubGraphQLErrorResponse(ctx, "Failed to get issue labels", err), nil, nil } // Extract label information - issueLabels := make([]map[string]any, len(query.Repository.Issue.Labels.Nodes)) + issueLabels := make([]IssueLabelOutput, len(query.Repository.Issue.Labels.Nodes)) for i, label := range query.Repository.Issue.Labels.Nodes { - issueLabels[i] = map[string]any{ - "id": fmt.Sprintf("%v", label.ID), - "name": string(label.Name), - "color": string(label.Color), - "description": string(label.Description), + issueLabels[i] = IssueLabelOutput{ + ID: fmt.Sprintf("%v", label.ID), Name: string(label.Name), + Color: string(label.Color), Description: string(label.Description), } } - response := map[string]any{ - "labels": issueLabels, - "totalCount": int(query.Repository.Issue.Labels.TotalCount), + response := &IssueLabelsOutput{ + Labels: issueLabels, TotalCount: int(query.Repository.Issue.Labels.TotalCount), } out, err := json.Marshal(response) if err != nil { - return nil, fmt.Errorf("failed to marshal response: %w", err) + return nil, nil, fmt.Errorf("failed to marshal response: %w", err) } - return utils.NewToolResultText(string(out)), nil + return utils.NewToolResultText(string(out)), &IssueReadOutput{Labels: response}, nil } // ListIssueTypes creates a tool to list defined issue types for an organization or repository. @@ -1643,11 +1681,12 @@ func issueNumberFromIssueURL(issueURL string) (int, error) { // SubIssueWrite creates a tool to add a sub-issue to a parent issue. func SubIssueWrite(t translations.TranslationHelperFunc) inventory.ServerTool { - st := NewTool( + st := NewTool[SubIssueWriteInput, *SubIssueWriteOutput]( ToolsetMetadataIssues, mcp.Tool{ - Name: "sub_issue_write", - Description: t("TOOL_SUB_ISSUE_WRITE_DESCRIPTION", "Add a sub-issue to a parent issue in a GitHub repository."), + Name: "sub_issue_write", + OutputSchema: subIssueWriteOutputSchema(), + Description: t("TOOL_SUB_ISSUE_WRITE_DESCRIPTION", "Add a sub-issue to a parent issue in a GitHub repository."), Annotations: &mcp.ToolAnnotations{ Title: t("TOOL_SUB_ISSUE_WRITE_USER_TITLE", "Change sub-issue"), ReadOnlyHint: false, @@ -1697,7 +1736,11 @@ func SubIssueWrite(t translations.TranslationHelperFunc) inventory.ServerTool { }, }, scopes.RequireAll(scopes.Repo), - func(ctx context.Context, deps ToolDependencies, _ *mcp.CallToolRequest, args map[string]any) (*mcp.CallToolResult, any, error) { + func(ctx context.Context, deps ToolDependencies, _ *mcp.CallToolRequest, input SubIssueWriteInput) (*mcp.CallToolResult, *SubIssueWriteOutput, error) { + args, err := discussionNotificationArguments(input) + if err != nil { + return nil, nil, err + } method, err := RequiredParam[string](args, "method") if err != nil { return utils.NewToolResultError(err.Error()), nil, nil @@ -1739,25 +1782,27 @@ func SubIssueWrite(t translations.TranslationHelperFunc) inventory.ServerTool { switch strings.ToLower(method) { case "add": - result, err := AddSubIssue(ctx, client, owner, repo, issueNumber, subIssueID, replaceParent) - return result, nil, err + return subIssueWriteResult(addSubIssue(ctx, client, owner, repo, issueNumber, subIssueID, replaceParent)) case "remove": // Call the remove sub-issue function - result, err := RemoveSubIssue(ctx, client, owner, repo, issueNumber, subIssueID) - return result, nil, err + return subIssueWriteResult(removeSubIssue(ctx, client, owner, repo, issueNumber, subIssueID)) case "reprioritize": // Call the reprioritize sub-issue function - result, err := ReprioritizeSubIssue(ctx, client, owner, repo, issueNumber, subIssueID, afterID, beforeID) - return result, nil, err + return subIssueWriteResult(reprioritizeSubIssue(ctx, client, owner, repo, issueNumber, subIssueID, afterID, beforeID)) default: return utils.NewToolResultError(fmt.Sprintf("unknown method: %s", method)), nil, nil } - }) + }, normalizeConsolidatedIssueArguments("sub")) st.FeatureRule = issuesConsolidatedFeatureRule return st } func AddSubIssue(ctx context.Context, client *github.Client, owner string, repo string, issueNumber int, subIssueID int, replaceParent bool) (*mcp.CallToolResult, error) { + result, _, err := addSubIssue(ctx, client, owner, repo, issueNumber, subIssueID, replaceParent) + return result, err +} + +func addSubIssue(ctx context.Context, client *github.Client, owner string, repo string, issueNumber int, subIssueID int, replaceParent bool) (*mcp.CallToolResult, *SubIssueOutput, error) { subIssueRequest := github.SubIssueRequest{ SubIssueID: int64(subIssueID), ReplaceParent: new(replaceParent), @@ -1769,7 +1814,7 @@ func AddSubIssue(ctx context.Context, client *github.Client, owner string, repo "failed to add sub-issue", resp, err, - ), nil + ), nil, nil } defer func() { _ = resp.Body.Close() }() @@ -1777,21 +1822,27 @@ func AddSubIssue(ctx context.Context, client *github.Client, owner string, repo if resp.StatusCode != http.StatusCreated { body, err := io.ReadAll(resp.Body) if err != nil { - return nil, fmt.Errorf("failed to read response body: %w", err) + return nil, nil, fmt.Errorf("failed to read response body: %w", err) } - return ghErrors.NewGitHubAPIStatusErrorResponse(ctx, "failed to add sub-issue", resp, body), nil + return ghErrors.NewGitHubAPIStatusErrorResponse(ctx, "failed to add sub-issue", resp, body), nil, nil } sanitizeSubIssueTitleAndBody(subIssue) r, err := json.Marshal(subIssue) if err != nil { - return nil, fmt.Errorf("failed to marshal response: %w", err) + return nil, nil, fmt.Errorf("failed to marshal response: %w", err) } - return utils.NewToolResultText(string(r)), nil + output, err := subIssueOutput(subIssue) + return utils.NewToolResultText(string(r)), output, err } func RemoveSubIssue(ctx context.Context, client *github.Client, owner string, repo string, issueNumber int, subIssueID int) (*mcp.CallToolResult, error) { + result, _, err := removeSubIssue(ctx, client, owner, repo, issueNumber, subIssueID) + return result, err +} + +func removeSubIssue(ctx context.Context, client *github.Client, owner string, repo string, issueNumber int, subIssueID int) (*mcp.CallToolResult, *SubIssueOutput, error) { subIssueRequest := github.SubIssueRequest{ SubIssueID: int64(subIssueID), } @@ -1802,34 +1853,40 @@ func RemoveSubIssue(ctx context.Context, client *github.Client, owner string, re "failed to remove sub-issue", resp, err, - ), nil + ), nil, nil } defer func() { _ = resp.Body.Close() }() if resp.StatusCode != http.StatusOK { body, err := io.ReadAll(resp.Body) if err != nil { - return nil, fmt.Errorf("failed to read response body: %w", err) + return nil, nil, fmt.Errorf("failed to read response body: %w", err) } - return ghErrors.NewGitHubAPIStatusErrorResponse(ctx, "failed to remove sub-issue", resp, body), nil + return ghErrors.NewGitHubAPIStatusErrorResponse(ctx, "failed to remove sub-issue", resp, body), nil, nil } sanitizeSubIssueTitleAndBody(subIssue) r, err := json.Marshal(subIssue) if err != nil { - return nil, fmt.Errorf("failed to marshal response: %w", err) + return nil, nil, fmt.Errorf("failed to marshal response: %w", err) } - return utils.NewToolResultText(string(r)), nil + output, err := subIssueOutput(subIssue) + return utils.NewToolResultText(string(r)), output, err } func ReprioritizeSubIssue(ctx context.Context, client *github.Client, owner string, repo string, issueNumber int, subIssueID int, afterID int, beforeID int) (*mcp.CallToolResult, error) { + result, _, err := reprioritizeSubIssue(ctx, client, owner, repo, issueNumber, subIssueID, afterID, beforeID) + return result, err +} + +func reprioritizeSubIssue(ctx context.Context, client *github.Client, owner string, repo string, issueNumber int, subIssueID int, afterID int, beforeID int) (*mcp.CallToolResult, *SubIssueOutput, error) { // Validate that either after_id or before_id is specified, but not both if afterID == 0 && beforeID == 0 { - return utils.NewToolResultError("either after_id or before_id must be specified"), nil + return utils.NewToolResultError("either after_id or before_id must be specified"), nil, nil } if afterID != 0 && beforeID != 0 { - return utils.NewToolResultError("only one of after_id or before_id should be specified, not both"), nil + return utils.NewToolResultError("only one of after_id or before_id should be specified, not both"), nil, nil } subIssueRequest := github.SubIssueRequest{ @@ -1851,7 +1908,7 @@ func ReprioritizeSubIssue(ctx context.Context, client *github.Client, owner stri "failed to reprioritize sub-issue", resp, err, - ), nil + ), nil, nil } defer func() { _ = resp.Body.Close() }() @@ -1859,18 +1916,19 @@ func ReprioritizeSubIssue(ctx context.Context, client *github.Client, owner stri if resp.StatusCode != http.StatusOK { body, err := io.ReadAll(resp.Body) if err != nil { - return nil, fmt.Errorf("failed to read response body: %w", err) + return nil, nil, fmt.Errorf("failed to read response body: %w", err) } - return ghErrors.NewGitHubAPIStatusErrorResponse(ctx, "failed to reprioritize sub-issue", resp, body), nil + return ghErrors.NewGitHubAPIStatusErrorResponse(ctx, "failed to reprioritize sub-issue", resp, body), nil, nil } sanitizeSubIssueTitleAndBody(subIssue) r, err := json.Marshal(subIssue) if err != nil { - return nil, fmt.Errorf("failed to marshal response: %w", err) + return nil, nil, fmt.Errorf("failed to marshal response: %w", err) } - return utils.NewToolResultText(string(r)), nil + output, err := subIssueOutput(subIssue) + return utils.NewToolResultText(string(r)), output, err } // The two search engines want opposite things from a caller, so steering advice @@ -2619,11 +2677,12 @@ func issueWriteAwaitingFormResult(method, owner, repo string, issueNumber int) * // flag is removed, delete LegacyIssueWrite outright and drop the feature-flag // fields on IssueWrite. func IssueWrite(t translations.TranslationHelperFunc) inventory.ServerTool { - st := NewTool( + st := NewTool[IssueWriteInput, *IssueWriteOutput]( ToolsetMetadataIssues, mcp.Tool{ - Name: "issue_write", - Description: t("TOOL_ISSUE_WRITE_DESCRIPTION", "Create a new or update an existing issue in a GitHub repository."), + Name: "issue_write", + OutputSchema: issueWriteOutputSchema(), + Description: t("TOOL_ISSUE_WRITE_DESCRIPTION", "Create a new or update an existing issue in a GitHub repository."), Annotations: &mcp.ToolAnnotations{ Title: t("TOOL_ISSUE_WRITE_USER_TITLE", "Create or update issue/pull request"), ReadOnlyHint: false, @@ -2751,6 +2810,7 @@ Options are: }, }, Required: []string{"field_name"}, + OneOf: issueWriteFieldVariants(), }, }, }, @@ -2758,7 +2818,14 @@ Options are: }, }, publicRepositoryWriteScopeAccess(), - func(ctx context.Context, deps ToolDependencies, req *mcp.CallToolRequest, args map[string]any) (*mcp.CallToolResult, any, error) { + func(ctx context.Context, deps ToolDependencies, req *mcp.CallToolRequest, input IssueWriteInput) (*mcp.CallToolResult, *IssueWriteOutput, error) { + args, err := discussionNotificationArguments(input) + if err != nil { + return nil, nil, err + } + if input.TypeProvided && input.Type == nil { + args["type"] = nil + } method, err := RequiredParam[string](args, "method") if err != nil { return utils.NewToolResultError(err.Error()), nil, nil @@ -2775,7 +2842,13 @@ Options are: // Hand off to the interactive MCP App form unless this call must // execute now (see shouldDeferToForm). - if shouldDeferToForm(ctx, deps, req, args, issueWriteFormParams) { + formArgs := args + if req != nil && req.Params != nil && len(req.Params.Arguments) > 0 { + if err := json.Unmarshal(req.Params.Arguments, &formArgs); err != nil { + return nil, nil, err + } + } + if shouldDeferToForm(ctx, deps, req, formArgs, issueWriteFormParams) { issueNumber := 0 if method == "update" { n, numErr := RequiredInt(args, "issue_number") @@ -2784,7 +2857,13 @@ Options are: } issueNumber = n } - return issueWriteAwaitingFormResult(method, owner, repo, issueNumber), nil, nil + result := issueWriteAwaitingFormResult(method, owner, repo, issueNumber) + output := &IssueWriteAwaitingOutput{ + Status: "awaiting_user_submission", + Reason: "An interactive form is being shown to the user. The operation has not been performed.", + } + result.StructuredContent = output + return result, &IssueWriteOutput{Awaiting: output}, nil } title, err := OptionalParam[string](args, "title") @@ -2912,27 +2991,24 @@ Options are: switch method { case "create": if parentProvided { - result, err := CreateIssueWithParent(ctx, client, gqlClient, owner, repo, title, body, assignees, labels, milestoneNum, issueType, parentIssueNumber, parentOwner, parentRepo) - return result, nil, err + return issueWriteResult(createIssueWithParent(ctx, client, gqlClient, owner, repo, title, body, assignees, labels, milestoneNum, issueType, parentIssueNumber, parentOwner, parentRepo)) } - result, err := CreateIssue(ctx, client, owner, repo, title, body, assignees, labels, milestoneNum, issueType, issueFieldValues) - return result, nil, err + return issueWriteResult(createIssue(ctx, client, owner, repo, title, body, assignees, labels, milestoneNum, issueType, issueFieldValues)) case "update": issueNumber, err := RequiredInt(args, "issue_number") if err != nil { return utils.NewToolResultError(err.Error()), nil, nil } - result, err := UpdateIssue(ctx, client, gqlClient, owner, repo, issueNumber, title, body, assignees, labels, milestoneNum, issueType, issueFieldValues, fieldIDsToDelete, state, stateReason, duplicateOf, UpdateIssueOptions{ + return issueWriteResult(updateIssue(ctx, client, gqlClient, owner, repo, issueNumber, title, body, assignees, labels, milestoneNum, issueType, issueFieldValues, fieldIDsToDelete, state, stateReason, duplicateOf, UpdateIssueOptions{ AssigneesProvided: assigneesProvided, LabelsProvided: labelsProvided, IssueTypeProvided: issueTypeProvided, - }) - return result, nil, err + })) default: return utils.NewToolResultError("invalid method, must be either 'create' or 'update'"), nil, nil } - }) + }, normalizeConsolidatedIssueArguments("write")) st.FeatureRule = issuesConsolidatedFeatureRule return st } @@ -2988,17 +3064,22 @@ func CreateIssueWithParent( parentOwner string, parentRepo string, ) (*mcp.CallToolResult, error) { + result, _, err := createIssueWithParent(ctx, client, gqlClient, owner, repo, title, body, assignees, labels, milestoneNumber, issueType, parentIssueNumber, parentOwner, parentRepo) + return result, err +} + +func createIssueWithParent(ctx context.Context, client *github.Client, gqlClient *githubv4.Client, owner, repo, title, body string, assignees, labels []string, milestoneNumber int, issueType string, parentIssueNumber int, parentOwner, parentRepo string) (*mcp.CallToolResult, *MinimalResponse, error) { if title == "" { - return utils.NewToolResultError("missing required parameter: title"), nil + return utils.NewToolResultError("missing required parameter: title"), nil, nil } if parentIssueNumber < 1 { - return utils.NewToolResultError("parent_issue_number must be greater than 0"), nil + return utils.NewToolResultError("parent_issue_number must be greater than 0"), nil, nil } parentOwner, parentRepo = parentRepository(owner, repo, parentOwner, parentRepo) repositoryID, parentIssueID, err := resolveCreateIssueParent(ctx, gqlClient, owner, repo, parentOwner, parentRepo, parentIssueNumber) if err != nil { - return ghErrors.NewGitHubGraphQLErrorResponse(ctx, "failed to resolve parent issue", err), nil + return ghErrors.NewGitHubGraphQLErrorResponse(ctx, "failed to resolve parent issue", err), nil, nil } input := CreateIssueInput{ @@ -3015,7 +3096,7 @@ func CreateIssueWithParent( for _, label := range labels { labelID, err := getLabelID(ctx, gqlClient, owner, repo, label) if err != nil { - return ghErrors.NewGitHubGraphQLErrorResponse(ctx, fmt.Sprintf("failed to resolve label %q", label), err), nil + return ghErrors.NewGitHubGraphQLErrorResponse(ctx, fmt.Sprintf("failed to resolve label %q", label), err), nil, nil } labelIDs = append(labelIDs, labelID) } @@ -3027,7 +3108,7 @@ func CreateIssueWithParent( for _, assignee := range assignees { assigneeID, err := resolveUserID(ctx, gqlClient, assignee) if err != nil { - return ghErrors.NewGitHubGraphQLErrorResponse(ctx, fmt.Sprintf("failed to resolve assignee %q", assignee), err), nil + return ghErrors.NewGitHubGraphQLErrorResponse(ctx, fmt.Sprintf("failed to resolve assignee %q", assignee), err), nil, nil } assigneeIDs = append(assigneeIDs, assigneeID) } @@ -3037,7 +3118,7 @@ func CreateIssueWithParent( if milestoneNumber != 0 { milestoneID, err := resolveMilestoneID(ctx, gqlClient, owner, repo, milestoneNumber) if err != nil { - return ghErrors.NewGitHubGraphQLErrorResponse(ctx, "failed to resolve milestone", err), nil + return ghErrors.NewGitHubGraphQLErrorResponse(ctx, "failed to resolve milestone", err), nil, nil } input.MilestoneID = &milestoneID } @@ -3045,17 +3126,17 @@ func CreateIssueWithParent( if issueType != "" { issueTypeID, resp, err := resolveIssueTypeID(ctx, client, owner, repo, issueType) if err != nil { - return ghErrors.NewGitHubAPIErrorResponse(ctx, fmt.Sprintf("failed to resolve issue type %q", issueType), resp, err), nil + return ghErrors.NewGitHubAPIErrorResponse(ctx, fmt.Sprintf("failed to resolve issue type %q", issueType), resp, err), nil, nil } input.IssueTypeID = &issueTypeID } var mutation createIssueMutation if err := gqlClient.Mutate(ctx, &mutation, input, nil); err != nil { - return ghErrors.NewGitHubGraphQLErrorResponse(ctx, "failed to create issue", err), nil + return ghErrors.NewGitHubGraphQLErrorResponse(ctx, "failed to create issue", err), nil, nil } if mutation.CreateIssue.Issue.FullDatabaseID == "" || mutation.CreateIssue.Issue.URL.URL == nil { - return utils.NewToolResultError("failed to create issue: response did not include the created issue"), nil + return utils.NewToolResultError("failed to create issue: response did not include the created issue"), nil, nil } response := MinimalResponse{ @@ -3064,9 +3145,9 @@ func CreateIssueWithParent( } encoded, err := json.Marshal(response) if err != nil { - return utils.NewToolResultErrorFromErr("failed to marshal response", err), nil + return utils.NewToolResultErrorFromErr("failed to marshal response", err), nil, nil } - return utils.NewToolResultText(string(encoded)), nil + return utils.NewToolResultText(string(encoded)), &response, nil } func parentRepository(owner, repo, parentOwner, parentRepo string) (string, string) { @@ -3219,8 +3300,13 @@ func containsIssueLabel(labels []string, target string) bool { } func CreateIssue(ctx context.Context, client *github.Client, owner string, repo string, title string, body string, assignees []string, labels []string, milestoneNum int, issueType string, issueFieldValues []*github.IssueRequestFieldValue) (*mcp.CallToolResult, error) { + result, _, err := createIssue(ctx, client, owner, repo, title, body, assignees, labels, milestoneNum, issueType, issueFieldValues) + return result, err +} + +func createIssue(ctx context.Context, client *github.Client, owner string, repo string, title string, body string, assignees []string, labels []string, milestoneNum int, issueType string, issueFieldValues []*github.IssueRequestFieldValue) (*mcp.CallToolResult, *MinimalResponse, error) { if title == "" { - return utils.NewToolResultError("missing required parameter: title"), nil + return utils.NewToolResultError("missing required parameter: title"), nil, nil } // Create the issue request @@ -3246,21 +3332,21 @@ func CreateIssue(ctx context.Context, client *github.Client, owner string, repo "failed to create issue", resp, err, - ), nil + ), nil, nil } defer func() { _ = resp.Body.Close() }() if resp.StatusCode != http.StatusCreated { body, err := io.ReadAll(resp.Body) if err != nil { - return utils.NewToolResultErrorFromErr("failed to read response body", err), nil + return utils.NewToolResultErrorFromErr("failed to read response body", err), nil, nil } - return ghErrors.NewGitHubAPIStatusErrorResponse(ctx, "failed to create issue", resp, body), nil + return ghErrors.NewGitHubAPIStatusErrorResponse(ctx, "failed to create issue", resp, body), nil, nil } if len(labels) > 0 { if err := unappliedIssueLabelsError(labels, issue); err != nil { - return ghErrors.NewGitHubAPIErrorResponse(ctx, "issue created but requested labels were not fully applied", resp, err), nil + return ghErrors.NewGitHubAPIErrorResponse(ctx, "issue created but requested labels were not fully applied", resp, err), nil, nil } } @@ -3272,10 +3358,10 @@ func CreateIssue(ctx context.Context, client *github.Client, owner string, repo r, err := json.Marshal(minimalResponse) if err != nil { - return utils.NewToolResultErrorFromErr("failed to marshal response", err), nil + return utils.NewToolResultErrorFromErr("failed to marshal response", err), nil, nil } - return utils.NewToolResultText(string(r)), nil + return utils.NewToolResultText(string(r)), &minimalResponse, nil } // UpdateIssueOptions controls which optional fields are included in an issue update request. @@ -3289,9 +3375,14 @@ type UpdateIssueOptions struct { } func UpdateIssue(ctx context.Context, client *github.Client, gqlClient *githubv4.Client, owner string, repo string, issueNumber int, title string, body string, assignees []string, labels []string, milestoneNum int, issueType string, issueFieldValues []*github.IssueRequestFieldValue, fieldIDsToDelete []int64, state string, stateReason string, duplicateOf int, opts ...UpdateIssueOptions) (*mcp.CallToolResult, error) { + result, _, err := updateIssue(ctx, client, gqlClient, owner, repo, issueNumber, title, body, assignees, labels, milestoneNum, issueType, issueFieldValues, fieldIDsToDelete, state, stateReason, duplicateOf, opts...) + return result, err +} + +func updateIssue(ctx context.Context, client *github.Client, gqlClient *githubv4.Client, owner string, repo string, issueNumber int, title string, body string, assignees []string, labels []string, milestoneNum int, issueType string, issueFieldValues []*github.IssueRequestFieldValue, fieldIDsToDelete []int64, state string, stateReason string, duplicateOf int, opts ...UpdateIssueOptions) (*mcp.CallToolResult, *MinimalResponse, error) { // UpdateIssue is exported and may be called without the tool handler. if err := validateDuplicateState(state, stateReason, duplicateOf); err != nil { - return utils.NewToolResultError(err.Error()), nil + return utils.NewToolResultError(err.Error()), nil, nil } updateOptions := UpdateIssueOptions{ @@ -3341,7 +3432,7 @@ func UpdateIssue(ctx context.Context, client *github.Client, gqlClient *githubv4 // the new ones, then drop anything explicitly deleted. existing, err := fetchExistingIssueFieldValues(ctx, gqlClient, owner, repo, issueNumber) if err != nil { - return ghErrors.NewGitHubGraphQLErrorResponse(ctx, "failed to fetch existing issue field values", err), nil + return ghErrors.NewGitHubGraphQLErrorResponse(ctx, "failed to fetch existing issue field values", err), nil, nil } merged := mergeIssueFieldValues(existing, issueFieldValues) if len(fieldIDsToDelete) > 0 { @@ -3381,16 +3472,16 @@ func UpdateIssue(ctx context.Context, client *github.Client, gqlClient *githubv4 "failed to update issue", resp, err, - ), nil + ), nil, nil } defer func() { _ = resp.Body.Close() }() if resp.StatusCode != http.StatusOK { body, err := io.ReadAll(resp.Body) if err != nil { - return nil, fmt.Errorf("failed to read response body: %w", err) + return nil, nil, fmt.Errorf("failed to read response body: %w", err) } - return ghErrors.NewGitHubAPIStatusErrorResponse(ctx, "failed to update issue", resp, body), nil + return ghErrors.NewGitHubAPIStatusErrorResponse(ctx, "failed to update issue", resp, body), nil, nil } // Per-field DELETE fallback. The PATCH can't clear field values when the @@ -3426,7 +3517,7 @@ func UpdateIssue(ctx context.Context, client *github.Client, gqlClient *githubv4 } if len(failedIDs) > 0 { msg := fmt.Sprintf("failed to clear issue field values: failed=%v, cleared=%v", failedIDs, succeededIDs) - return ghErrors.NewGitHubAPIErrorResponse(ctx, msg, firstFailureResp, firstFailureErr), nil + return ghErrors.NewGitHubAPIErrorResponse(ctx, msg, firstFailureResp, firstFailureErr), nil, nil } } @@ -3435,7 +3526,7 @@ func UpdateIssue(ctx context.Context, client *github.Client, gqlClient *githubv4 // Get target issue ID (and duplicate issue ID if needed) issueID, duplicateIssueID, err := fetchIssueIDs(ctx, gqlClient, owner, repo, issueNumber, duplicateOf) if err != nil { - return ghErrors.NewGitHubGraphQLErrorResponse(ctx, "Failed to find issues", err), nil + return ghErrors.NewGitHubGraphQLErrorResponse(ctx, "Failed to find issues", err), nil, nil } switch state { @@ -3456,7 +3547,7 @@ func UpdateIssue(ctx context.Context, client *github.Client, gqlClient *githubv4 IssueID: issueID, }, nil) if err != nil { - return ghErrors.NewGitHubGraphQLErrorResponse(ctx, "Failed to reopen issue", err), nil + return ghErrors.NewGitHubGraphQLErrorResponse(ctx, "Failed to reopen issue", err), nil, nil } case "closed": // Use CloseIssue mutation for closing @@ -3484,14 +3575,14 @@ func UpdateIssue(ctx context.Context, client *github.Client, gqlClient *githubv4 err = gqlClient.Mutate(ctx, &mutation, closeInput, nil) if err != nil { - return ghErrors.NewGitHubGraphQLErrorResponse(ctx, "Failed to close issue", err), nil + return ghErrors.NewGitHubGraphQLErrorResponse(ctx, "Failed to close issue", err), nil, nil } } } if updateOptions.LabelsProvided { if err := unappliedIssueLabelsError(labels, updatedIssue); err != nil { - return ghErrors.NewGitHubAPIErrorResponse(ctx, "issue updated but requested labels were not fully applied", resp, err), nil + return ghErrors.NewGitHubAPIErrorResponse(ctx, "issue updated but requested labels were not fully applied", resp, err), nil, nil } } @@ -3503,10 +3594,10 @@ func UpdateIssue(ctx context.Context, client *github.Client, gqlClient *githubv4 r, err := json.Marshal(minimalResponse) if err != nil { - return nil, fmt.Errorf("failed to marshal response: %w", err) + return nil, nil, fmt.Errorf("failed to marshal response: %w", err) } - return utils.NewToolResultText(string(r)), nil + return utils.NewToolResultText(string(r)), &minimalResponse, nil } func validateDuplicateState(state, stateReason string, duplicateOf int) error { diff --git a/pkg/github/typed_consolidated_issue_enrichment_test.go b/pkg/github/typed_consolidated_issue_enrichment_test.go new file mode 100644 index 0000000000..fc45ec2f70 --- /dev/null +++ b/pkg/github/typed_consolidated_issue_enrichment_test.go @@ -0,0 +1,65 @@ +package github + +import ( + "fmt" + "net/http" + "testing" + "time" + + "github.com/github/github-mcp-server/internal/githubv4mock" + "github.com/github/github-mcp-server/pkg/inventory" + "github.com/google/go-github/v92/github" + "github.com/shurcooL/githubv4" +) + +func TestTypedIssueReadEnrichmentAndLockdown(t *testing.T) { + for _, protocol := range []string{inventory.ProtocolVersionMultiRoundTrip, "2025-11-25", ""} { + for _, lockdown := range []bool{false, true} { + t.Run(fmt.Sprintf("protocol=%s/lockdown=%t", protocol, lockdown), func(t *testing.T) { + issue := &github.Issue{ + Number: new(1), NodeID: new("I_1"), Title: new("Child\u202e"), + State: new("open"), User: &github.User{Login: new("author")}, + IssueFieldValues: []*github.IssueFieldValue{{IssueFieldID: 1, Value: "must not leak REST fields"}}, + } + parent := map[string]any{ + "number": 7, "title": "Parent\u202e", "state": "OPEN", "url": "parent", + "author": map[string]any{"login": "unsafe"}, + "repository": map[string]any{"nameWithOwner": "owner/repo"}, + } + closing := map[string]any{ + "number": 8, "title": "Closing\u202e", "state": "OPEN", "url": "closing", + "author": map[string]any{"login": "unsafe"}, + "repository": map[string]any{"nameWithOwner": "owner/repo"}, + } + matcher := newIssueReadEnrichmentMatcher("I_1", githubv4mock.DataResponse(map[string]any{ + "nodes": []map[string]any{{ + "id": "I_1", "issueFieldValues": map[string]any{"nodes": []any{}}, + "parent": parent, "subIssuesSummary": map[string]any{"total": 2, "completed": 1, "percentCompleted": 50}, + "closedByPullRequestsReferences": map[string]any{"totalCount": 1, "nodes": []any{closing}}, + }}, + })) + rest := MockHTTPClientWithHandlers(map[string]http.HandlerFunc{ + GetReposIssuesByOwnerByRepoByIssueNumber: mockResponse(t, http.StatusOK, issue), + }) + deps := BaseDeps{ + Client: mustNewGHClient(t, rest), GQLClient: githubv4.NewClient(githubv4mock.NewMockedHTTPClient(matcher)), + RepoAccessCache: stubRepoAccessCache(mockRESTPermissionServer(t, "read", map[string]string{"author": "write"}), time.Minute), + Flags: stubFeatureFlags(map[string]bool{"lockdown-mode": lockdown}), + } + session, schemas := consolidatedIssueSession(t, deps, protocol, false) + text := `{"number":1,"title":"Child","state":"open","user":{"login":"author"},"assignees":[],"has_parent":true,"has_children":true,` + if !lockdown { + text += `"parent":{"number":7,"title":"Parent","state":"OPEN","url":"parent","repository":"owner/repo"},` + } + text += `"sub_issues_summary":{"total":2,"completed":1,"percent_completed":50},"closed_by_pull_requests":{"total_count":1,"references":[` + if !lockdown { + text += `{"number":8,"title":"Closing","state":"OPEN","url":"closing","repository":"owner/repo"}` + } + text += `]}}` + assertConsolidatedResult(t, session, schemas, "issue_read", map[string]any{ + "method": "get", "owner": "owner", "repo": "repo", "issue_number": 1, + }, text) + }) + } + } +} diff --git a/pkg/github/typed_consolidated_issue_outputs_test.go b/pkg/github/typed_consolidated_issue_outputs_test.go new file mode 100644 index 0000000000..11c2b82ae2 --- /dev/null +++ b/pkg/github/typed_consolidated_issue_outputs_test.go @@ -0,0 +1,542 @@ +package github + +import ( + "context" + "encoding/json" + "maps" + "net/http" + "strings" + "testing" + "time" + + "github.com/github/github-mcp-server/internal/toolsnaps" + ghcontext "github.com/github/github-mcp-server/pkg/context" + "github.com/github/github-mcp-server/pkg/inventory" + "github.com/github/github-mcp-server/pkg/sanitize" + "github.com/github/github-mcp-server/pkg/translations" + "github.com/google/go-github/v92/github" + "github.com/google/jsonschema-go/jsonschema" + "github.com/modelcontextprotocol/go-sdk/mcp" + "github.com/shurcooL/githubv4" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func consolidatedIssueSession(t *testing.T, deps BaseDeps, protocol string, ui bool) (*mcp.ClientSession, map[string]*jsonschema.Resolved) { + t.Helper() + tools := []inventory.ServerTool{ + IssueRead(translations.NullTranslationHelper), IssueWrite(translations.NullTranslationHelper), + SubIssueWrite(translations.NullTranslationHelper), + } + inv, err := inventory.NewBuilder().SetTools(tools).WithToolsets([]string{"all"}). + WithFeatureChecker(featureCheckerFor()).Build() + require.NoError(t, err) + server := mcp.NewServer(&mcp.Implementation{Name: "consolidated-issues", Version: "v1"}, nil) + server.AddReceivingMiddleware(InjectDepsMiddleware(deps)) + inv.RegisterTools(context.Background(), server, deps) + server.AddReceivingMiddleware(func(next mcp.MethodHandler) mcp.MethodHandler { + return func(ctx context.Context, method string, request mcp.Request) (mcp.Result, error) { + if protocol == "" { + switch req := request.(type) { + case *mcp.ListToolsRequest: + req.Params.Meta = mcp.Meta{mcp.MetaKeyProtocolVersion: ""} + case *mcp.CallToolRequest: + req.Params.Meta = mcp.Meta{mcp.MetaKeyProtocolVersion: ""} + } + } + return next(ghcontext.WithUISupport(ctx, ui), method, request) + } + }) + version := protocol + if version == "" { + version = inventory.ProtocolVersionMultiRoundTrip + } + session := connectCommentVisibilityClient(t, server, version) + list, err := session.ListTools(context.Background(), nil) + require.NoError(t, err) + require.Len(t, list.Tools, len(tools)) + schemas := make(map[string]*jsonschema.Resolved) + for _, tool := range list.Tools { + if protocol != inventory.ProtocolVersionMultiRoundTrip { + assert.Nil(t, tool.OutputSchema, tool.Name) + continue + } + require.NotNil(t, tool.OutputSchema) + require.NoError(t, toolsnaps.Test(tool.Name+"_typed", *tool)) + var schema jsonschema.Schema + require.NoError(t, json.Unmarshal([]byte(mustMarshalJSON(t, tool.OutputSchema)), &schema)) + resolved, err := schema.Resolve(nil) + require.NoError(t, err) + schemas[tool.Name] = resolved + } + return session, schemas +} + +func assertConsolidatedResult(t *testing.T, session *mcp.ClientSession, schemas map[string]*jsonschema.Resolved, name string, args map[string]any, text string) *mcp.CallToolResult { + t.Helper() + result, err := session.CallTool(context.Background(), &mcp.CallToolParams{Name: name, Arguments: args}) + require.NoError(t, err) + require.False(t, result.IsError, "%s: %s", name, mustMarshalJSON(t, result)) + require.Len(t, result.Content, 1) + assert.Equal(t, text, getTextResult(t, result).Text) + if schema := schemas[name]; schema != nil { + // A JSON null is a real success for get_sub_issues, not an error. + assert.JSONEq(t, text, mustMarshalJSON(t, result.StructuredContent)) + var value any + require.NoError(t, json.Unmarshal([]byte(mustMarshalJSON(t, result.StructuredContent)), &value)) + require.NoError(t, schema.Validate(value)) + } else { + assert.Nil(t, result.StructuredContent) + } + return result +} + +func consolidatedIssueDeps(t *testing.T) BaseDeps { + t.Helper() + rest := &http.Client{Transport: recorderTransport{handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if strings.Contains(r.URL.Path, "/comments") { + assert.Equal(t, "1", r.URL.Query().Get("page")) + assert.Equal(t, "30", r.URL.Query().Get("per_page")) + switch { + case strings.Contains(r.URL.Path, "/2/"): + _, _ = w.Write([]byte(`[]`)) + case strings.Contains(r.URL.Path, "/3/"): + _, _ = w.Write([]byte(`null`)) + default: + _, _ = w.Write([]byte(`[{"id":42,"body":"hello","html_url":"https://github.com/owner/repo/issues/1#issuecomment-42"}]`)) + } + return + } + if strings.Contains(r.URL.Path, "/sub_issue") { + if r.Method == http.MethodGet && strings.Contains(r.URL.Path, "/1/") { + assert.Equal(t, "2", r.URL.Query().Get("page")) + assert.Equal(t, "5", r.URL.Query().Get("per_page")) + } + switch { + case strings.Contains(r.URL.Path, "/2/"): + _, _ = w.Write([]byte(`[]`)) + return + case strings.Contains(r.URL.Path, "/3/"): + _, _ = w.Write([]byte(`null`)) + return + case strings.Contains(r.URL.Path, "/4/"): + _, _ = w.Write([]byte(`[null]`)) + return + } + if r.Method == http.MethodPost && !strings.HasSuffix(r.URL.Path, "/priority") { + w.WriteHeader(http.StatusCreated) + } + text := `{"id":7,"number":7,"title":"Child","body":"body","created_at":"2026-01-01T00:00:00Z","issue_field_values":[{"issue_field_id":11,"node_id":"IF_11","data_type":"number","value":0}]}` + if r.Method == http.MethodGet { + text = "[" + text + "]" + } + _, _ = w.Write([]byte(text)) + return + } + if r.Method == http.MethodPost { + w.WriteHeader(http.StatusCreated) + } + _, _ = w.Write([]byte(`{"id":123,"number":1,"title":"Subject","state":"open","html_url":"https://github.com/owner/repo/issues/1","assignees":[],"labels":[]}`)) + })}} + gql := &http.Client{Transport: recorderTransport{handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + var req struct { + Query string `json:"query"` + Variables struct { + IssueNumber int `json:"issueNumber"` + Input struct { + IssueID string `json:"issueId"` + StateReason string `json:"stateReason"` + DuplicateIssueID string `json:"duplicateIssueId"` + } `json:"input"` + } `json:"variables"` + } + require.NoError(t, json.NewDecoder(r.Body).Decode(&req)) + switch { + case strings.Contains(req.Query, "createIssue("): + _, _ = w.Write([]byte(`{"data":{"createIssue":{"issue":{"fullDatabaseId":"123","url":"https://github.com/owner/repo/issues/1"}}}}`)) + case strings.Contains(req.Query, "parentRepository:"): + _, _ = w.Write([]byte(`{"data":{"childRepository":{"id":"R_1","nameWithOwner":"owner/repo"},"parentRepository":{"issue":{"id":"I_parent","number":7}}}}`)) + case strings.Contains(req.Query, "parent{"): + parent := `{"number":7,"title":"Parent","state":"OPEN","url":"https://github.com/owner/repo/issues/7","repository":{"nameWithOwner":"owner/repo"},"author":{"login":"octocat"}}` + if req.Variables.IssueNumber == 2 { + parent = "null" + } + _, _ = w.Write([]byte(`{"data":{"repository":{"issue":{"parent":` + parent + `}}}}`)) + case strings.Contains(req.Query, "labels("): + labels := `{"nodes":[{"id":"L_1","name":"bug","color":"red","description":"Bug"}],"totalCount":1}` + if req.Variables.IssueNumber == 2 { + labels = `{"nodes":[],"totalCount":0}` + } + _, _ = w.Write([]byte(`{"data":{"repository":{"issue":{"labels":` + labels + `}}}}`)) + case strings.Contains(req.Query, "reopenIssue("): + assert.Equal(t, "I_1", req.Variables.Input.IssueID) + _, _ = w.Write([]byte(`{"data":{"reopenIssue":{"issue":{"id":"I_1","number":1,"url":"issue","state":"OPEN"}}}}`)) + case strings.Contains(req.Query, "closeIssue("): + assert.Equal(t, "I_1", req.Variables.Input.IssueID) + assert.Contains(t, []string{"COMPLETED", "NOT_PLANNED", "DUPLICATE"}, req.Variables.Input.StateReason) + if req.Variables.Input.StateReason == "DUPLICATE" { + assert.Equal(t, "I_2", req.Variables.Input.DuplicateIssueID) + } + _, _ = w.Write([]byte(`{"data":{"closeIssue":{"issue":{"id":"I_1","number":1,"url":"issue","state":"CLOSED"}}}}`)) + case strings.Contains(req.Query, "issue(number: $issueNumber)"): + if strings.Contains(req.Query, "duplicateIssue:") { + _, _ = w.Write([]byte(`{"data":{"repository":{"issue":{"id":"I_1"},"duplicateIssue":{"id":"I_2"}}}}`)) + } else { + _, _ = w.Write([]byte(`{"data":{"repository":{"issue":{"id":"I_1"}}}}`)) + } + default: + t.Errorf("unexpected GraphQL query: %s", req.Query) + w.WriteHeader(http.StatusInternalServerError) + } + })}} + return BaseDeps{ + Client: mustNewGHClient(t, rest), GQLClient: githubv4.NewClient(gql), + RepoAccessCache: stubRepoAccessCache(nil, time.Minute), + } +} + +func TestTypedConsolidatedIssueOutputs(t *testing.T) { + const mutationText = `{"id":"123","url":"https://github.com/owner/repo/issues/1"}` + const subText = `{"id":7,"number":7,"title":"Child","body":"body","created_at":"2026-01-01T00:00:00Z","issue_field_values":[{"issue_field_id":11,"node_id":"IF_11","data_type":"number","value":0}]}` + cases := []struct { + tool string + args map[string]any + text string + }{ + {"issue_read", map[string]any{"method": "get", "issue_number": "1.0"}, `{"number":1,"title":"Subject","state":"open","html_url":"https://github.com/owner/repo/issues/1","assignees":[]}`}, + {"issue_read", map[string]any{"method": "get_comments", "issue_number": "1", "page": "0", "perPage": "0"}, `[{"id":42,"body":"hello","html_url":"https://github.com/owner/repo/issues/1#issuecomment-42"}]`}, + {"issue_read", map[string]any{"method": "get_comments", "issue_number": 2}, `[]`}, + {"issue_read", map[string]any{"method": "get_comments", "issue_number": 3}, `[]`}, + {"issue_read", map[string]any{"method": "get_sub_issues", "issue_number": "1", "page": "2", "perPage": "5"}, `[` + subText + `]`}, + {"issue_read", map[string]any{"method": "get_sub_issues", "issue_number": 2}, `[]`}, + {"issue_read", map[string]any{"method": "get_sub_issues", "issue_number": 3}, `null`}, + {"issue_read", map[string]any{"method": "get_sub_issues", "issue_number": 4}, `[null]`}, + {"issue_read", map[string]any{"method": "get_parent", "issue_number": "1"}, `{"parent":{"number":7,"repository":"owner/repo","state":"OPEN","title":"Parent","url":"https://github.com/owner/repo/issues/7"}}`}, + {"issue_read", map[string]any{"method": "get_parent", "issue_number": 2}, `{"parent":null}`}, + {"issue_read", map[string]any{"method": "get_labels", "issue_number": 1}, `{"labels":[{"color":"red","description":"Bug","id":"L_1","name":"bug"}],"totalCount":1}`}, + {"issue_read", map[string]any{"method": "get_labels", "issue_number": 2}, `{"labels":[],"totalCount":0}`}, + {"issue_write", map[string]any{"method": "create", "title": "Subject"}, mutationText}, + {"issue_write", map[string]any{"method": "update", "issue_number": "1.0"}, mutationText}, + {"issue_write", map[string]any{"method": "update", "issue_number": "1", "state": "open"}, mutationText}, + {"issue_write", map[string]any{"method": "update", "issue_number": 1, "state": "closed", "state_reason": "completed"}, mutationText}, + {"issue_write", map[string]any{"method": "update", "issue_number": 1, "state": "closed", "state_reason": "not_planned"}, mutationText}, + {"issue_write", map[string]any{"method": "update", "issue_number": 1, "state": "closed", "state_reason": "duplicate", "duplicate_of": "2"}, mutationText}, + {"issue_write", map[string]any{"method": "create", "title": "Subject", "parent_issue_number": "7"}, mutationText}, + {"sub_issue_write", map[string]any{"method": "ADD", "issue_number": "1", "sub_issue_id": "7", "replace_parent": true}, subText}, + {"sub_issue_write", map[string]any{"method": "remove", "issue_number": 1, "sub_issue_id": 7}, subText}, + {"sub_issue_write", map[string]any{"method": "reprioritize", "issue_number": 1, "sub_issue_id": 7, "after_id": "8.0"}, subText}, + {"sub_issue_write", map[string]any{"method": "reprioritize", "issue_number": 1, "sub_issue_id": 7, "before_id": "8"}, subText}, + } + for _, protocol := range []string{inventory.ProtocolVersionMultiRoundTrip, "2025-11-25", ""} { + t.Run("protocol="+protocol, func(t *testing.T) { + session, schemas := consolidatedIssueSession(t, consolidatedIssueDeps(t), protocol, false) + for i, tc := range cases { + t.Run(tc.tool+"/"+tc.args["method"].(string)+"/"+string(rune('A'+i)), func(t *testing.T) { + args := map[string]any{"owner": "owner", "repo": "repo"} + maps.Copy(args, tc.args) + assertConsolidatedResult(t, session, schemas, tc.tool, args, tc.text) + }) + } + for _, tc := range []struct { + tool string + args map[string]any + text string + }{ + {"issue_read", map[string]any{}, "missing required parameter: method"}, + {"issue_read", map[string]any{"method": "get", "issue_number": 0}, "missing required parameter: issue_number"}, + {"issue_read", map[string]any{"method": "get", "issue_number": "1.5"}, "non-integer numeric value"}, + {"issue_read", map[string]any{"method": "GET", "issue_number": 1}, "get"}, + {"issue_read", map[string]any{"method": "get", "issue_number": 1, "page": nil}, "not a valid number"}, + {"issue_write", map[string]any{"method": "create"}, "missing required parameter: title"}, + {"issue_write", map[string]any{"method": "update"}, "missing required parameter: issue_number"}, + {"issue_write", map[string]any{"method": "update", "issue_number": 1, "type": ""}, "must not be empty"}, + {"issue_write", map[string]any{"method": "update", "issue_number": 1, "labels": 42}, "[]string"}, + {"issue_write", map[string]any{"method": "create", "parent_issue_number": 0}, "greater than 0"}, + {"issue_write", map[string]any{"method": "update", "issue_number": 1, "duplicate_of": 2}, "duplicate_of can only"}, + {"issue_write", map[string]any{"method": "create", "issue_fields": []any{map[string]any{"field_name": "Priority", "value": nil}}}, "value cannot be null"}, + {"sub_issue_write", map[string]any{"method": "add", "issue_number": 1}, "missing required parameter: sub_issue_id"}, + {"sub_issue_write", map[string]any{"method": "reprioritize", "issue_number": 1, "sub_issue_id": 7}, "either after_id or before_id"}, + {"sub_issue_write", map[string]any{"method": "reprioritize", "issue_number": 1, "sub_issue_id": 7, "after_id": 8, "before_id": 9}, "only one"}, + } { + args := map[string]any{"owner": "owner", "repo": "repo"} + maps.Copy(args, tc.args) + result, err := session.CallTool(context.Background(), &mcp.CallToolParams{Name: tc.tool, Arguments: args}) + require.NoError(t, err) + require.True(t, result.IsError, "%s: %s", tc.tool, mustMarshalJSON(t, result)) + assert.Contains(t, getErrorResult(t, result).Text, tc.text) + assert.Nil(t, result.StructuredContent) + } + }) + } +} + +func TestTypedIssueWriteAwaitingForm(t *testing.T) { + for _, protocol := range []string{inventory.ProtocolVersionMultiRoundTrip, "2025-11-25", ""} { + t.Run("protocol="+protocol, func(t *testing.T) { + session, schemas := consolidatedIssueSession(t, consolidatedIssueDeps(t), protocol, true) + for _, method := range []string{"create", "update"} { + args := map[string]any{"method": method, "owner": "owner", "repo": "repo", "issue_number": "1", "title": "Subject"} + result, err := session.CallTool(context.Background(), &mcp.CallToolParams{Name: "issue_write", Arguments: args}) + require.NoError(t, err) + require.True(t, result.IsError) + require.Len(t, result.Content, 1) + assert.Contains(t, getErrorResult(t, result).Text, "interactive form has been shown") + assert.Contains(t, getErrorResult(t, result).Text, "NOT been") + if protocol == inventory.ProtocolVersionMultiRoundTrip { + require.NotNil(t, result.StructuredContent) + assert.JSONEq(t, `{"status":"awaiting_user_submission","reason":"An interactive form is being shown to the user. The operation has not been performed."}`, mustMarshalJSON(t, result.StructuredContent)) + require.NoError(t, schemas["issue_write"].Validate(result.StructuredContent)) + } else { + assert.Nil(t, result.StructuredContent) + } + args["_ui_submitted"] = true + assertConsolidatedResult(t, session, schemas, "issue_write", args, `{"id":"123","url":"https://github.com/owner/repo/issues/1"}`) + } + }) + } +} + +func TestTypedConsolidatedIssueAPIErrors(t *testing.T) { + for _, protocol := range []string{inventory.ProtocolVersionMultiRoundTrip, "2025-11-25", ""} { + t.Run("protocol="+protocol, func(t *testing.T) { + client := &http.Client{Transport: recorderTransport{handler: http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { + w.WriteHeader(http.StatusForbidden) + _, _ = w.Write([]byte(`{"message":"Forbidden"}`)) + })}} + deps := BaseDeps{Client: mustNewGHClient(t, client), GQLClient: githubv4.NewClient(client)} + session, _ := consolidatedIssueSession(t, deps, protocol, false) + for tool, methods := range map[string][]string{ + "issue_read": {"get", "get_comments", "get_sub_issues", "get_parent", "get_labels"}, + "issue_write": {"create", "update"}, "sub_issue_write": {"add", "remove", "reprioritize"}, + } { + for _, method := range methods { + args := map[string]any{ + "method": method, "owner": "owner", "repo": "repo", "issue_number": 1, + "title": "Subject", "sub_issue_id": 7, "after_id": 8, + } + result, err := session.CallTool(context.Background(), &mcp.CallToolParams{Name: tool, Arguments: args}) + require.NoError(t, err) + require.True(t, result.IsError) + assert.Nil(t, result.StructuredContent, tool+"/"+method) + assert.Contains(t, getErrorResult(t, result).Text, "Forbidden") + } + } + }) + } +} + +func TestTypedConsolidatedNullMutationResponses(t *testing.T) { + for _, protocol := range []string{inventory.ProtocolVersionMultiRoundTrip, "2025-11-25", ""} { + for _, payload := range []string{`{}`, `null`} { + t.Run("protocol="+protocol+"/payload="+payload, func(t *testing.T) { + client := &http.Client{Transport: recorderTransport{handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method == http.MethodPost && !strings.HasSuffix(r.URL.Path, "/priority") { + w.WriteHeader(http.StatusCreated) + } + _, _ = w.Write([]byte(payload)) + })}} + deps := BaseDeps{Client: mustNewGHClient(t, client), GQLClient: githubv4.NewClient(client)} + session, schemas := consolidatedIssueSession(t, deps, protocol, false) + for _, method := range []string{"create", "update"} { + assertConsolidatedResult(t, session, schemas, "issue_write", map[string]any{ + "method": method, "owner": "owner", "repo": "repo", "issue_number": 1, "title": "Subject", + }, `{"id":"0","url":""}`) + } + for _, method := range []string{"add", "remove", "reprioritize"} { + assertConsolidatedResult(t, session, schemas, "sub_issue_write", map[string]any{ + "method": method, "owner": "owner", "repo": "repo", "issue_number": 1, "sub_issue_id": 7, "after_id": 8, + }, payload) + } + }) + } + } +} + +func TestConsolidatedIssueStrictSchemasAndScalars(t *testing.T) { + for _, tc := range []struct { + schema *jsonschema.Schema + valid []string + invalid []string + }{ + { + issueReadOutputSchema(), + []string{`null`, `[]`, `[null]`, `{"parent":null}`, `{"number":0,"title":"","state":"","assignees":[]}`, `{"labels":[],"totalCount":0}`}, + []string{`{}`, `{"number":1}`, `{"parent":{"number":1}}`, `{"labels":[]}`, `{"labels":[],"totalCount":0,"parent":null}`}, + }, + { + issueWriteOutputSchema(), + []string{`{"id":"","url":""}`, `{"status":"awaiting_user_submission","reason":"wait"}`}, + []string{`{}`, `{"id":"1"}`, `{"status":"created","reason":"wait"}`, `{"status":"awaiting_user_submission"}`, `{"id":"1","url":"url","status":"awaiting_user_submission","reason":"wait"}`}, + }, + { + IssueWrite(translations.NullTranslationHelper).Tool.InputSchema.(*jsonschema.Schema).Properties["issue_fields"].Items, + []string{`{"field_name":"Text","value":""}`, `{"field_name":"Number","value":0,"delete":false}`, `{"field_name":"Date","value":"2026-01-01"}`, `{"field_name":"Priority","field_option_name":"High"}`, `{"field_name":"Text","delete":true}`}, + []string{`{"field_name":"Text"}`, `{"field_name":"Text","value":null}`, `{"field_name":"Text","value":1,"delete":true}`, `{"field_name":"Text","value":1,"field_option_name":"High"}`, `{"field_name":"Text","delete":false}`, `{"value":1}`}, + }, + } { + resolved, err := tc.schema.Resolve(nil) + require.NoError(t, err) + for _, raw := range tc.valid { + var value any + require.NoError(t, json.Unmarshal([]byte(raw), &value)) + require.NoError(t, resolved.Validate(value), raw) + } + for _, raw := range tc.invalid { + var value any + require.NoError(t, json.Unmarshal([]byte(raw), &value)) + require.Error(t, resolved.Validate(value), raw) + } + } + for _, raw := range []string{`""`, `"2026-01-01"`, `"High"`, `0`, `1.5`, `false`, `null`} { + var value IssueFieldValue + require.NoError(t, json.Unmarshal([]byte(raw), &value)) + assert.JSONEq(t, raw, mustMarshalJSON(t, value)) + } + var value IssueFieldValue + require.Error(t, json.Unmarshal([]byte(`{}`), &value)) + require.Error(t, json.Unmarshal([]byte(`[]`), &value)) +} + +func TestSubIssueOutputPreservesCompleteAPIResponse(t *testing.T) { + // Every exported API field is populated, including false/zero pointers, + // nullable collection elements and all custom-field scalar variants. + var issue github.SubIssue + require.NoError(t, json.Unmarshal([]byte(`{ + "id":1,"number":1,"state":"open","state_reason":"reopened","locked":false, + "title":"Child\u202e","body":"body\u202e","author_association":"OWNER", + "user":{"login":"octo","id":1},"labels":[null,{"name":"bug","id":2}], + "assignee":{"login":"octo"},"comments":0,"closed_at":"2026-01-01T00:00:00Z", + "created_at":"2026-01-01T00:00:00Z","updated_at":"2026-01-01T00:00:00Z", + "closed_by":{"login":"octo"},"url":"api","html_url":"html","comments_url":"comments", + "events_url":"events","labels_url":"labels","repository_url":"repo","parent_issue_url":"parent", + "milestone":{"title":"v1","number":1},"pull_request":{"url":"pr"}, + "repository":{"id":1,"name":"repo","owner":{"login":"octo"},"topics":["topic"]}, + "reactions":{"total_count":0},"assignees":[null,{"login":"octo"}], + "node_id":"I_1","draft":false,"type":{"id":1,"name":"Bug"}, + "pinned_comment":{"id":1,"body":"comment"},"performed_via_github_app":{"id":1,"permissions":{"issues":"write"}}, + "issue_dependencies_summary":{"blocked_by":0,"blocking":1}, + "sub_issues_summary":{"total":1,"completed":0,"percent_completed":0}, + "issue_field_values":[null, + {"issue_field_id":1,"node_id":"IF_1","data_type":"text","value":""}, + {"issue_field_id":2,"node_id":"IF_2","data_type":"number","value":0}, + {"issue_field_id":3,"node_id":"IF_3","data_type":"date","value":"2026-01-01"}, + {"issue_field_id":4,"node_id":"IF_4","data_type":"single_select","value":"High","single_select_option":{"id":1,"name":"High","color":"red"}}, + {"issue_field_id":5,"node_id":"IF_5","data_type":"text","value":null} + ], + "text_matches":[{"fragment":"match","matches":[{"text":"match","indices":[0,5]}]}], + "active_lock_reason":"resolved" + }`), &issue)) + sanitizeSubIssueTitleAndBody(&issue) + out, err := subIssueOutput(&issue) + require.NoError(t, err) + assert.Equal(t, sanitize.PlainText("Child\u202e"), *out.Title) + assert.Equal(t, mustMarshalJSON(t, &issue), mustMarshalJSON(t, out), "preserve exact API JSON ordering") + resolved, err := subIssueSchema().Resolve(nil) + require.NoError(t, err) + var value any + require.NoError(t, json.Unmarshal([]byte(mustMarshalJSON(t, out)), &value)) + require.NoError(t, resolved.Validate(value)) +} + +func TestTypedIssueWriteMutationOptionalityAndFields(t *testing.T) { + const resultText = `{"id":"123","url":"https://github.com/owner/repo/issues/1"}` + for _, protocol := range []string{inventory.ProtocolVersionMultiRoundTrip, "2025-11-25", ""} { + t.Run("protocol="+protocol, func(t *testing.T) { + var requestBody string + var deleted []string + rest := &http.Client{Transport: recorderTransport{handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method == http.MethodDelete { + deleted = append(deleted, r.URL.Path) + w.WriteHeader(http.StatusNoContent) + return + } + + var body json.RawMessage + require.NoError(t, json.NewDecoder(r.Body).Decode(&body)) + requestBody = string(body) + if r.Method == http.MethodPost { + w.WriteHeader(http.StatusCreated) + } + var sent struct { + Labels []string `json:"labels"` + } + require.NoError(t, json.Unmarshal(body, &sent)) + response := &github.Issue{ID: new(int64(123)), HTMLURL: new("https://github.com/owner/repo/issues/1")} + for _, label := range sent.Labels { + response.Labels = append(response.Labels, &github.Label{Name: label}) + } + require.NoError(t, json.NewEncoder(w).Encode(response)) + })}} + existing := `[{"__typename":"IssueFieldTextValue","field":{"fullDatabaseId":"1","name":"Text"},"value":"old"},{"__typename":"IssueFieldDateValue","field":{"fullDatabaseId":"3","name":"Date"},"value":"2026-01-01"}]` + gql := &http.Client{Transport: recorderTransport{handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + var request struct { + Query string `json:"query"` + } + require.NoError(t, json.NewDecoder(r.Body).Decode(&request)) + switch { + case strings.Contains(request.Query, "issueFields("): + _, _ = w.Write([]byte(`{"data":{"repository":{"issueFields":{"nodes":[ + {"__typename":"IssueFieldText","fullDatabaseId":"1","name":"Text","dataType":"TEXT"}, + {"__typename":"IssueFieldNumber","fullDatabaseId":"2","name":"Number","dataType":"NUMBER"}, + {"__typename":"IssueFieldDate","fullDatabaseId":"3","name":"Date","dataType":"DATE"}, + {"__typename":"IssueFieldSingleSelect","fullDatabaseId":"4","name":"Priority","dataType":"SINGLE_SELECT","options":[{"fullDatabaseId":"40","name":"High"}]} + ]}}}}`)) + case strings.Contains(request.Query, "issueFieldValues("): + _, _ = w.Write([]byte(`{"data":{"repository":{"issue":{"issueFieldValues":{"nodes":` + existing + `}}}}}`)) + default: + t.Errorf("unexpected GraphQL mutation/query: %s", request.Query) + } + })}} + deps := BaseDeps{Client: mustNewGHClient(t, rest), GQLClient: githubv4.NewClient(gql)} + session, schemas := consolidatedIssueSession(t, deps, protocol, false) + cases := []struct { + args map[string]any + body string + }{ + {map[string]any{}, `{}`}, + {map[string]any{"labels": []string{}, "assignees": []string{}, "type": nil, "milestone": "0"}, `{"labels":[],"assignees":[],"type":null}`}, + {map[string]any{"labels": nil, "assignees": nil}, `{}`}, + {map[string]any{"labels": []string{"bug"}, "assignees": []string{"octo"}, "type": "Bug", "milestone": "2.0"}, `{"labels":["bug"],"assignees":["octo"],"type":"Bug","milestone":2}`}, + {map[string]any{"issue_fields": []any{ + map[string]any{"field_name": "Number", "value": 0}, + map[string]any{"field_name": "Text", "delete": true}, + }}, `{"issue_field_values":[{"field_id":2,"value":0},{"field_id":3,"value":"2026-01-01"}]}`}, + {map[string]any{"method": "create", "title": "Subject", "body": "", "issue_fields": []any{ + map[string]any{"field_name": " text ", "value": ""}, + map[string]any{"field_name": "Number", "value": 0}, + map[string]any{"field_name": "Date", "value": "2026-01-01"}, + map[string]any{"field_name": "Priority", "field_option_name": " high "}, + }}, `{"title":"Subject","body":"","issue_field_values":[{"field_id":1,"value":""},{"field_id":2,"value":0},{"field_id":3,"value":"2026-01-01"},{"field_id":4,"value":"High"}]}`}, + {map[string]any{"method": "create", "title": "Subject", "issue_fields": []any{ + map[string]any{"field_name": "Text", "delete": true}, + }}, `{"title":"Subject","body":""}`}, + } + for _, tc := range cases { + args := map[string]any{"method": "update", "owner": "owner", "repo": "repo", "issue_number": "1"} + maps.Copy(args, tc.args) + assertConsolidatedResult(t, session, schemas, "issue_write", args, resultText) + assert.JSONEq(t, tc.body, requestBody) + } + existing = `[{"__typename":"IssueFieldTextValue","field":{"fullDatabaseId":"1","name":"Text"},"value":"old"}]` + assertConsolidatedResult(t, session, schemas, "issue_write", map[string]any{ + "method": "update", "owner": "owner", "repo": "repo", "issue_number": 1, + "issue_fields": []any{map[string]any{"field_name": "Text", "delete": true}}, + }, resultText) + assert.JSONEq(t, `{}`, requestBody) + assert.Equal(t, []string{"/repos/owner/repo/issues/1/issue-field-values/1"}, deleted) + for _, fields := range []any{ + []any{map[string]any{"field_name": "Missing", "value": "value"}}, + []any{map[string]any{"field_name": "Text", "field_option_name": "High"}}, + []any{map[string]any{"field_name": "Priority", "field_option_name": "Missing"}}, + } { + result, err := session.CallTool(context.Background(), &mcp.CallToolParams{Name: "issue_write", Arguments: map[string]any{ + "method": "create", "owner": "owner", "repo": "repo", "title": "Subject", "issue_fields": fields, + }}) + require.NoError(t, err) + require.True(t, result.IsError) + assert.Nil(t, result.StructuredContent) + assert.Contains(t, getErrorResult(t, result).Text, "failed to resolve issue_fields") + } + }) + } +} diff --git a/pkg/inventory/typed_output.go b/pkg/inventory/typed_output.go index 48d973a497..6aa8f4afe3 100644 --- a/pkg/inventory/typed_output.go +++ b/pkg/inventory/typed_output.go @@ -16,8 +16,9 @@ const typedOutputMetaKey = "github.com/github/github-mcp-server/typed-output" type inputNormalizationContextKey struct{} type typedOutputMetadata struct { - hasOutput bool - contentSet bool + hasOutput bool + contentSet bool + explicitOutput any } func wrapTypedHandler[In, Out any](handler mcp.ToolHandlerFor[In, Out], middleware ...ToolHandlerMiddleware) mcp.ToolHandlerFor[In, Out] { @@ -49,8 +50,9 @@ func wrapTypedHandler[In, Out any](handler mcp.ToolHandlerFor[In, Out], middlewa result.Meta = make(mcp.Meta) } result.Meta[typedOutputMetaKey] = typedOutputMetadata{ - hasOutput: handlerCalled && !result.IsError, - contentSet: result.Content != nil, + hasOutput: handlerCalled && !result.IsError, + contentSet: result.Content != nil, + explicitOutput: result.StructuredContent, } return result, output, nil } @@ -132,7 +134,12 @@ func typedOutputMiddleware(normalizerByName map[string]InputNormalizer) mcp.Midd if err := removeTypedOutputFallback(&resultCopy, metadata); err != nil { return nil, err } - if !metadata.hasOutput || !protocolVersionAllowed(requestProtocolVersion(ctx, req.ProtocolVersion()), ProtocolVersionMultiRoundTrip) { + if metadata.explicitOutput != nil { + // The SDK may replace a handler's explicit status with + // its serialized typed output, including an error zero. + resultCopy.StructuredContent = metadata.explicitOutput + } + if (!metadata.hasOutput && metadata.explicitOutput == nil) || !protocolVersionAllowed(requestProtocolVersion(ctx, req.ProtocolVersion()), ProtocolVersionMultiRoundTrip) { resultCopy.StructuredContent = nil } return &resultCopy, nil diff --git a/pkg/inventory/typed_output_test.go b/pkg/inventory/typed_output_test.go index 84fc42989c..d7fae002f3 100644 --- a/pkg/inventory/typed_output_test.go +++ b/pkg/inventory/typed_output_test.go @@ -26,6 +26,93 @@ type typedTestOutput struct { Query string `json:"query"` } +func TestTypedExplicitErrorOutputProtocolGate(t *testing.T) { + for _, protocol := range []string{ProtocolVersionMultiRoundTrip, "2025-11-25", ""} { + t.Run("protocol="+protocol, func(t *testing.T) { + tool := NewServerToolWithContextHandler( + mcp.Tool{Name: "pending", OutputSchema: &jsonschema.Schema{ + Type: "object", Required: []string{"query"}, + Properties: map[string]*jsonschema.Schema{"query": {Type: "string", Enum: []any{"", "awaiting"}}}, + AdditionalProperties: &jsonschema.Schema{Not: &jsonschema.Schema{}}, + }}, + testToolsetMetadata("test"), + func(_ context.Context, _ *mcp.CallToolRequest, input typedTestOutput) (*mcp.CallToolResult, typedTestOutput, error) { + result := &mcp.CallToolResult{ + IsError: true, Content: []mcp.Content{&mcp.TextContent{Text: "wait for input"}}, + } + switch input.Query { + case "explicit": + result.StructuredContent = typedTestOutput{Query: "awaiting"} + case "invalid": + return result, typedTestOutput{Query: "invalid"}, nil + } + return result, typedTestOutput{}, nil + }, + ) + server := mcp.NewServer(&mcp.Implementation{Name: "explicit-error", Version: "v1"}, nil) + tool.RegisterFunc(server, nil) + if protocol == "" { + server.AddReceivingMiddleware(func(next mcp.MethodHandler) mcp.MethodHandler { + return func(ctx context.Context, method string, request mcp.Request) (mcp.Result, error) { + if call, ok := request.(*mcp.CallToolRequest); ok { + call.Params.Meta = mcp.Meta{mcp.MetaKeyProtocolVersion: ""} + } + return next(ctx, method, request) + } + }) + } + version := protocol + if version == "" || version == ProtocolVersionMultiRoundTrip { + version = "" + } + session := connectTypedTestClient(t, server, version) + for _, query := range []string{"explicit", "ordinary", "invalid"} { + result, err := session.CallTool(context.Background(), &mcp.CallToolParams{ + Name: "pending", Arguments: typedTestOutput{Query: query}, + }) + if query == "invalid" { + require.Error(t, err, "explicit output must still pass SDK schema validation") + continue + } + require.NoError(t, err) + require.True(t, result.IsError) + require.Len(t, result.Content, 1) + assert.Equal(t, "wait for input", result.Content[0].(*mcp.TextContent).Text) + if query == "explicit" && protocol == ProtocolVersionMultiRoundTrip { + assert.JSONEq(t, `{"query":"awaiting"}`, mustMarshalJSON(t, result.StructuredContent)) + } else { + assert.Nil(t, result.StructuredContent, "never expose an SDK-generated error fallback") + } + } + }) + } +} + +func TestTypedInputRequestsBypassOutputGate(t *testing.T) { + pending := &mcp.CallToolResult{ + StructuredContent: typedTestOutput{Query: "awaiting"}, + InputRequests: mcp.InputRequestMap{"form": &mcp.ElicitParams{Mode: "form"}}, + } + handler := wrapTypedHandler(func(context.Context, *mcp.CallToolRequest, struct{}) (*mcp.CallToolResult, typedTestOutput, error) { + return pending, typedTestOutput{}, nil + }) + result, _, err := handler(context.Background(), nil, struct{}{}) + require.NoError(t, err) + assert.Same(t, pending, result) + assert.NotContains(t, result.Meta, typedOutputMetaKey) + for _, protocol := range []string{ProtocolVersionMultiRoundTrip, "2025-11-25", ""} { + middleware := typedOutputMiddleware(nil)(func(context.Context, string, mcp.Request) (mcp.Result, error) { + return result, nil + }) + gated, err := middleware(context.Background(), MCPMethodToolsCall, &mcp.CallToolRequest{ + Params: &mcp.CallToolParamsRaw{Name: "pending", Meta: mcp.Meta{mcp.MetaKeyProtocolVersion: protocol}}, + }) + require.NoError(t, err) + assert.Same(t, pending, gated) + assert.Len(t, pending.InputRequests, 1) + } +} + func TestTypedToolRegistrationInfersSchemasAndValidates(t *testing.T) { handlerCalls := 0 tool := NewServerToolWithContextHandler( From c11e2ec4f4fd39d4f974259922e54ddeb0623506 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 2 Oct 2026 20:52:21 +0000 Subject: [PATCH 2/3] chore: regenerate license files Auto-generated by license-check workflow --- third-party-licenses.darwin.md | 2 +- third-party-licenses.linux.md | 2 +- third-party-licenses.windows.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/third-party-licenses.darwin.md b/third-party-licenses.darwin.md index 817fb7b2a9..d67b374b56 100644 --- a/third-party-licenses.darwin.md +++ b/third-party-licenses.darwin.md @@ -21,7 +21,7 @@ The following packages are included for the amd64, arm64 architectures. - [github.com/google/go-querystring/query](https://pkg.go.dev/github.com/google/go-querystring/query) ([BSD-3-Clause](https://github.com/google/go-querystring/blob/v1.2.0/LICENSE)) - [github.com/google/jsonschema-go/jsonschema](https://pkg.go.dev/github.com/google/jsonschema-go/jsonschema) ([MIT](https://github.com/google/jsonschema-go/blob/v0.4.3/LICENSE)) - [github.com/gorilla/css/scanner](https://pkg.go.dev/github.com/gorilla/css/scanner) ([BSD-3-Clause](https://github.com/gorilla/css/blob/v1.0.1/LICENSE)) - - [github.com/josephburnett/jd/v2](https://pkg.go.dev/github.com/josephburnett/jd/v2) ([MIT](https://github.com/josephburnett/jd/blob/v2.5.0/LICENSE)) + - [github.com/josephburnett/jd/v2](https://pkg.go.dev/github.com/josephburnett/jd/v2) ([MIT](https://github.com/josephburnett/jd/blob/v2.5.0/v2/LICENSE)) - [github.com/lithammer/fuzzysearch/fuzzy](https://pkg.go.dev/github.com/lithammer/fuzzysearch/fuzzy) ([MIT](https://github.com/lithammer/fuzzysearch/blob/v1.1.8/LICENSE)) - [github.com/microcosm-cc/bluemonday](https://pkg.go.dev/github.com/microcosm-cc/bluemonday) ([BSD-3-Clause](https://github.com/microcosm-cc/bluemonday/blob/v1.0.27/LICENSE.md)) - [github.com/modelcontextprotocol/go-sdk](https://pkg.go.dev/github.com/modelcontextprotocol/go-sdk) ([Apache-2.0](https://github.com/modelcontextprotocol/go-sdk/blob/v1.8.0/LICENSE)) diff --git a/third-party-licenses.linux.md b/third-party-licenses.linux.md index ae5e60d8ea..a1abb6821b 100644 --- a/third-party-licenses.linux.md +++ b/third-party-licenses.linux.md @@ -21,7 +21,7 @@ The following packages are included for the 386, amd64, arm64 architectures. - [github.com/google/go-querystring/query](https://pkg.go.dev/github.com/google/go-querystring/query) ([BSD-3-Clause](https://github.com/google/go-querystring/blob/v1.2.0/LICENSE)) - [github.com/google/jsonschema-go/jsonschema](https://pkg.go.dev/github.com/google/jsonschema-go/jsonschema) ([MIT](https://github.com/google/jsonschema-go/blob/v0.4.3/LICENSE)) - [github.com/gorilla/css/scanner](https://pkg.go.dev/github.com/gorilla/css/scanner) ([BSD-3-Clause](https://github.com/gorilla/css/blob/v1.0.1/LICENSE)) - - [github.com/josephburnett/jd/v2](https://pkg.go.dev/github.com/josephburnett/jd/v2) ([MIT](https://github.com/josephburnett/jd/blob/v2.5.0/LICENSE)) + - [github.com/josephburnett/jd/v2](https://pkg.go.dev/github.com/josephburnett/jd/v2) ([MIT](https://github.com/josephburnett/jd/blob/v2.5.0/v2/LICENSE)) - [github.com/lithammer/fuzzysearch/fuzzy](https://pkg.go.dev/github.com/lithammer/fuzzysearch/fuzzy) ([MIT](https://github.com/lithammer/fuzzysearch/blob/v1.1.8/LICENSE)) - [github.com/microcosm-cc/bluemonday](https://pkg.go.dev/github.com/microcosm-cc/bluemonday) ([BSD-3-Clause](https://github.com/microcosm-cc/bluemonday/blob/v1.0.27/LICENSE.md)) - [github.com/modelcontextprotocol/go-sdk](https://pkg.go.dev/github.com/modelcontextprotocol/go-sdk) ([Apache-2.0](https://github.com/modelcontextprotocol/go-sdk/blob/v1.8.0/LICENSE)) diff --git a/third-party-licenses.windows.md b/third-party-licenses.windows.md index adab52cdee..7e6f57aeb7 100644 --- a/third-party-licenses.windows.md +++ b/third-party-licenses.windows.md @@ -22,7 +22,7 @@ The following packages are included for the 386, amd64, arm64 architectures. - [github.com/google/jsonschema-go/jsonschema](https://pkg.go.dev/github.com/google/jsonschema-go/jsonschema) ([MIT](https://github.com/google/jsonschema-go/blob/v0.4.3/LICENSE)) - [github.com/gorilla/css/scanner](https://pkg.go.dev/github.com/gorilla/css/scanner) ([BSD-3-Clause](https://github.com/gorilla/css/blob/v1.0.1/LICENSE)) - [github.com/inconshreveable/mousetrap](https://pkg.go.dev/github.com/inconshreveable/mousetrap) ([Apache-2.0](https://github.com/inconshreveable/mousetrap/blob/v1.1.0/LICENSE)) - - [github.com/josephburnett/jd/v2](https://pkg.go.dev/github.com/josephburnett/jd/v2) ([MIT](https://github.com/josephburnett/jd/blob/v2.5.0/LICENSE)) + - [github.com/josephburnett/jd/v2](https://pkg.go.dev/github.com/josephburnett/jd/v2) ([MIT](https://github.com/josephburnett/jd/blob/v2.5.0/v2/LICENSE)) - [github.com/lithammer/fuzzysearch/fuzzy](https://pkg.go.dev/github.com/lithammer/fuzzysearch/fuzzy) ([MIT](https://github.com/lithammer/fuzzysearch/blob/v1.1.8/LICENSE)) - [github.com/microcosm-cc/bluemonday](https://pkg.go.dev/github.com/microcosm-cc/bluemonday) ([BSD-3-Clause](https://github.com/microcosm-cc/bluemonday/blob/v1.0.27/LICENSE.md)) - [github.com/modelcontextprotocol/go-sdk](https://pkg.go.dev/github.com/modelcontextprotocol/go-sdk) ([Apache-2.0](https://github.com/modelcontextprotocol/go-sdk/blob/v1.8.0/LICENSE)) From a652b26aacd2289d58d0654354bcfb19ec42f984 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 2 Oct 2026 21:03:02 +0000 Subject: [PATCH 3/3] chore: regenerate license files Auto-generated by license-check workflow --- third-party-licenses.windows.md | 49 +++++++++++++++++++++++++++++++-- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/third-party-licenses.windows.md b/third-party-licenses.windows.md index 7e6f57aeb7..a4bf3a1b0d 100644 --- a/third-party-licenses.windows.md +++ b/third-party-licenses.windows.md @@ -4,13 +4,14 @@ The following open source dependencies are used to build the [github/github-mcp- ## Table of Contents -- [386, amd64, arm64](#386-amd64-arm64) +- [386, amd64](#386-amd64) +- [arm64](#arm64) --- -## 386, amd64, arm64 +## 386, amd64 -The following packages are included for the 386, amd64, arm64 architectures. +The following packages are included for the 386, amd64 architectures. - [github.com/aymerick/douceur](https://pkg.go.dev/github.com/aymerick/douceur) ([MIT](https://github.com/aymerick/douceur/blob/v0.2.0/LICENSE)) - [github.com/fsnotify/fsnotify](https://pkg.go.dev/github.com/fsnotify/fsnotify) ([BSD-3-Clause](https://github.com/fsnotify/fsnotify/blob/v1.9.0/LICENSE)) @@ -50,4 +51,46 @@ The following packages are included for the 386, amd64, arm64 architectures. - [golang.org/x/text](https://pkg.go.dev/golang.org/x/text) ([BSD-3-Clause](https://cs.opensource.google/go/x/text/+/v0.42.0:LICENSE)) - [golang.org/x/time/rate](https://pkg.go.dev/golang.org/x/time/rate) ([BSD-3-Clause](https://cs.opensource.google/go/x/time/+/v0.15.0:LICENSE)) +## arm64 + +The following packages are included for the arm64 architectures. + + - [github.com/aymerick/douceur](https://pkg.go.dev/github.com/aymerick/douceur) ([MIT](https://github.com/aymerick/douceur/blob/v0.2.0/LICENSE)) + - [github.com/fsnotify/fsnotify](https://pkg.go.dev/github.com/fsnotify/fsnotify) ([BSD-3-Clause](https://github.com/fsnotify/fsnotify/blob/v1.9.0/LICENSE)) + - [github.com/github/github-mcp-server](https://pkg.go.dev/github.com/github/github-mcp-server) ([MIT](https://github.com/github/github-mcp-server/blob/HEAD/LICENSE)) + - [github.com/go-chi/chi/v5](https://pkg.go.dev/github.com/go-chi/chi/v5) ([MIT](https://github.com/go-chi/chi/blob/v5.3.2/LICENSE)) + - [github.com/go-viper/mapstructure/v2](https://pkg.go.dev/github.com/go-viper/mapstructure/v2) ([MIT](https://github.com/go-viper/mapstructure/blob/v2.5.0/LICENSE)) + - [github.com/google/go-github/v92/github](https://pkg.go.dev/github.com/google/go-github/v92/github) ([BSD-3-Clause](https://github.com/google/go-github/blob/v92.0.0/LICENSE)) + - [github.com/google/go-querystring/query](https://pkg.go.dev/github.com/google/go-querystring/query) ([BSD-3-Clause](https://github.com/google/go-querystring/blob/v1.2.0/LICENSE)) + - [github.com/google/jsonschema-go/jsonschema](https://pkg.go.dev/github.com/google/jsonschema-go/jsonschema) ([MIT](https://github.com/google/jsonschema-go/blob/v0.4.3/LICENSE)) + - [github.com/gorilla/css/scanner](https://pkg.go.dev/github.com/gorilla/css/scanner) ([BSD-3-Clause](https://github.com/gorilla/css/blob/v1.0.1/LICENSE)) + - [github.com/inconshreveable/mousetrap](https://pkg.go.dev/github.com/inconshreveable/mousetrap) ([Apache-2.0](https://github.com/inconshreveable/mousetrap/blob/v1.1.0/LICENSE)) + - [github.com/josephburnett/jd/v2](https://pkg.go.dev/github.com/josephburnett/jd/v2) ([MIT](https://github.com/josephburnett/jd/blob/v2.5.0/LICENSE)) + - [github.com/lithammer/fuzzysearch/fuzzy](https://pkg.go.dev/github.com/lithammer/fuzzysearch/fuzzy) ([MIT](https://github.com/lithammer/fuzzysearch/blob/v1.1.8/LICENSE)) + - [github.com/microcosm-cc/bluemonday](https://pkg.go.dev/github.com/microcosm-cc/bluemonday) ([BSD-3-Clause](https://github.com/microcosm-cc/bluemonday/blob/v1.0.27/LICENSE.md)) + - [github.com/modelcontextprotocol/go-sdk](https://pkg.go.dev/github.com/modelcontextprotocol/go-sdk) ([Apache-2.0](https://github.com/modelcontextprotocol/go-sdk/blob/v1.8.0/LICENSE)) + - [github.com/modelcontextprotocol/go-sdk](https://pkg.go.dev/github.com/modelcontextprotocol/go-sdk) ([MIT](https://github.com/modelcontextprotocol/go-sdk/blob/v1.8.0/LICENSE)) + - [github.com/muesli/cache2go](https://pkg.go.dev/github.com/muesli/cache2go) ([BSD-3-Clause](https://github.com/muesli/cache2go/blob/518229cd8021/LICENSE.txt)) + - [github.com/pelletier/go-toml/v2](https://pkg.go.dev/github.com/pelletier/go-toml/v2) ([MIT](https://github.com/pelletier/go-toml/blob/v2.2.4/LICENSE)) + - [github.com/sagikazarmark/locafero](https://pkg.go.dev/github.com/sagikazarmark/locafero) ([MIT](https://github.com/sagikazarmark/locafero/blob/v0.11.0/LICENSE)) + - [github.com/segmentio/asm](https://pkg.go.dev/github.com/segmentio/asm) ([MIT](https://github.com/segmentio/asm/blob/v1.1.3/LICENSE)) + - [github.com/segmentio/encoding](https://pkg.go.dev/github.com/segmentio/encoding) ([MIT](https://github.com/segmentio/encoding/blob/v0.5.4/LICENSE)) + - [github.com/shurcooL/githubv4](https://pkg.go.dev/github.com/shurcooL/githubv4) ([MIT](https://github.com/shurcooL/githubv4/blob/2402fdf4a9ed/LICENSE)) + - [github.com/shurcooL/graphql](https://pkg.go.dev/github.com/shurcooL/graphql) ([MIT](https://github.com/shurcooL/graphql/blob/7ee5256398cf/LICENSE)) + - [github.com/sourcegraph/conc](https://pkg.go.dev/github.com/sourcegraph/conc) ([MIT](https://github.com/sourcegraph/conc/blob/5f936abd7ae8/LICENSE)) + - [github.com/spf13/afero](https://pkg.go.dev/github.com/spf13/afero) ([Apache-2.0](https://github.com/spf13/afero/blob/v1.15.0/LICENSE.txt)) + - [github.com/spf13/cast](https://pkg.go.dev/github.com/spf13/cast) ([MIT](https://github.com/spf13/cast/blob/v1.10.0/LICENSE)) + - [github.com/spf13/cobra](https://pkg.go.dev/github.com/spf13/cobra) ([Apache-2.0](https://github.com/spf13/cobra/blob/v1.10.2/LICENSE.txt)) + - [github.com/spf13/pflag](https://pkg.go.dev/github.com/spf13/pflag) ([BSD-3-Clause](https://github.com/spf13/pflag/blob/v1.0.10/LICENSE)) + - [github.com/spf13/viper](https://pkg.go.dev/github.com/spf13/viper) ([MIT](https://github.com/spf13/viper/blob/v1.21.0/LICENSE)) + - [github.com/subosito/gotenv](https://pkg.go.dev/github.com/subosito/gotenv) ([MIT](https://github.com/subosito/gotenv/blob/v1.6.0/LICENSE)) + - [github.com/yosida95/uritemplate/v3](https://pkg.go.dev/github.com/yosida95/uritemplate/v3) ([BSD-3-Clause](https://github.com/yosida95/uritemplate/blob/v3.0.2/LICENSE)) + - [go.yaml.in/yaml/v3](https://pkg.go.dev/go.yaml.in/yaml/v3) ([MIT](https://github.com/yaml/go-yaml/blob/v3.0.5/LICENSE)) + - [golang.org/x/net](https://pkg.go.dev/golang.org/x/net) ([BSD-3-Clause](https://cs.opensource.google/go/x/net/+/v0.59.0:LICENSE)) + - [golang.org/x/oauth2](https://pkg.go.dev/golang.org/x/oauth2) ([BSD-3-Clause](https://cs.opensource.google/go/x/oauth2/+/v0.37.0:LICENSE)) + - [golang.org/x/sync/errgroup](https://pkg.go.dev/golang.org/x/sync/errgroup) ([BSD-3-Clause](https://cs.opensource.google/go/x/sync/+/v0.23.0:LICENSE)) + - [golang.org/x/sys](https://pkg.go.dev/golang.org/x/sys) ([BSD-3-Clause](https://cs.opensource.google/go/x/sys/+/v0.48.0:LICENSE)) + - [golang.org/x/text](https://pkg.go.dev/golang.org/x/text) ([BSD-3-Clause](https://cs.opensource.google/go/x/text/+/v0.42.0:LICENSE)) + - [golang.org/x/time/rate](https://pkg.go.dev/golang.org/x/time/rate) ([BSD-3-Clause](https://cs.opensource.google/go/x/time/+/v0.15.0:LICENSE)) + [github/github-mcp-server]: https://github.com/github/github-mcp-server