openhound-github 0.22.0__tar.gz → 0.23.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (465) hide show
  1. {openhound_github-0.22.0 → openhound_github-0.23.0}/PKG-INFO +52 -1
  2. {openhound_github-0.22.0 → openhound_github-0.23.0}/README.md +51 -0
  3. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_Contains.md +3 -1
  4. openhound_github-0.23.0/descriptions/edges/GH_HasExternalIdentity.md +22 -0
  5. openhound_github-0.23.0/descriptions/edges/GH_HasOidcIdentityProvider.md +20 -0
  6. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_App.md +4 -2
  7. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_AppInstallation.md +11 -4
  8. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_ExternalIdentity.md +1 -1
  9. openhound_github-0.23.0/descriptions/nodes/GH_IdentityProvider.md +24 -0
  10. openhound_github-0.23.0/descriptions/nodes/GH_OidcIdentityProvider.md +34 -0
  11. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_SamlIdentityProvider.md +2 -0
  12. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/privilege_zone_rules/t0-all-repo-admin-role.json +1 -1
  13. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/privilege_zone_rules/t0-pats-all-repos.json +1 -1
  14. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/schema.json +86 -9
  15. openhound_github-0.23.0/src/openhound_github/github_rest_client.py +90 -0
  16. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/graphql.py +27 -3
  17. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/helpers.py +15 -8
  18. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/kinds/edges.py +1 -0
  19. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/kinds/nodes.py +2 -0
  20. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/lookup.py +24 -7
  21. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/main.py +1 -0
  22. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/__init__.py +2 -0
  23. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/app_installation.py +93 -26
  24. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/external_identity.py +18 -10
  25. openhound_github-0.23.0/src/openhound_github/models/oidc_provider.py +92 -0
  26. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/saml_provider.py +1 -1
  27. openhound_github-0.23.0/src/openhound_github/resources/app_helpers.py +26 -0
  28. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/resources/enterprise.py +216 -37
  29. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/resources/organization.py +47 -13
  30. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/source.py +4 -5
  31. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/transforms.py +15 -0
  32. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_app_installation_repo_access.py +5 -2
  33. openhound_github-0.23.0/tests/test_collection_continuation.py +153 -0
  34. openhound_github-0.23.0/tests/test_enterprise_app_installation.py +412 -0
  35. openhound_github-0.23.0/tests/test_external_identity_federation.py +319 -0
  36. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_github_app_retry.py +36 -0
  37. openhound_github-0.23.0/tests/test_github_rest_client.py +161 -0
  38. openhound_github-0.23.0/tests/test_graphql_retry_budget.py +100 -0
  39. openhound_github-0.23.0/tests/test_oidc_provider.py +153 -0
  40. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_saml_models.py +11 -5
  41. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_workflow_resources.py +61 -2
  42. openhound_github-0.22.0/descriptions/edges/GH_HasExternalIdentity.md +0 -20
  43. openhound_github-0.22.0/src/openhound_github/github_rest_client.py +0 -3
  44. openhound_github-0.22.0/tests/test_github_rest_client.py +0 -52
  45. {openhound_github-0.22.0 → openhound_github-0.23.0}/.dockerignore +0 -0
  46. {openhound_github-0.22.0 → openhound_github-0.23.0}/.github/CODE_OF_CONDUCT.md +0 -0
  47. {openhound_github-0.22.0 → openhound_github-0.23.0}/.github/CONTRIBUTING.md +0 -0
  48. {openhound_github-0.22.0 → openhound_github-0.23.0}/.github/GOVERNANCE.md +0 -0
  49. {openhound_github-0.22.0 → openhound_github-0.23.0}/.github/SECURITY.md +0 -0
  50. {openhound_github-0.22.0 → openhound_github-0.23.0}/.github/SO-Dark.svg +0 -0
  51. {openhound_github-0.22.0 → openhound_github-0.23.0}/.github/SO-FOSS-Dark.svg +0 -0
  52. {openhound_github-0.22.0 → openhound_github-0.23.0}/.github/SO-FOSS-Light.svg +0 -0
  53. {openhound_github-0.22.0 → openhound_github-0.23.0}/.github/SO-Light.svg +0 -0
  54. {openhound_github-0.22.0 → openhound_github-0.23.0}/.github/workflows/publish-container.yml +0 -0
  55. {openhound_github-0.22.0 → openhound_github-0.23.0}/.github/workflows/publish.yml +0 -0
  56. {openhound_github-0.22.0 → openhound_github-0.23.0}/.github/workflows/release-on-merge.yml +0 -0
  57. {openhound_github-0.22.0 → openhound_github-0.23.0}/.github/workflows/validate-branch.yml +0 -0
  58. {openhound_github-0.22.0 → openhound_github-0.23.0}/.gitignore +0 -0
  59. {openhound_github-0.22.0 → openhound_github-0.23.0}/.pre-commit-config.yaml +0 -0
  60. {openhound_github-0.22.0 → openhound_github-0.23.0}/Dockerfile +0 -0
  61. {openhound_github-0.22.0 → openhound_github-0.23.0}/LICENSE.md +0 -0
  62. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_AddAssignee.md +0 -0
  63. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_AddCollaborator.md +0 -0
  64. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_AddLabel.md +0 -0
  65. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_AddMember.md +0 -0
  66. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_AddedDeployKey.md +0 -0
  67. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_AdminTo.md +0 -0
  68. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ApprovesDeploymentTo.md +0 -0
  69. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_AssignedTo.md +0 -0
  70. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_AuthorizedForOrganization.md +0 -0
  71. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_BypassBranchProtection.md +0 -0
  72. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_BypassPullRequestAllowances.md +0 -0
  73. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_CallsWorkflow.md +0 -0
  74. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_CanAccess.md +0 -0
  75. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_CanAccessSecret.md +0 -0
  76. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_CanAssumeIdentity.md +0 -0
  77. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_CanCreateBranch.md +0 -0
  78. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_CanCreateEnvironment.md +0 -0
  79. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_CanCreateInternalRepositories.md +0 -0
  80. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_CanCreatePrivateRepositories.md +0 -0
  81. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_CanCreatePublicRepositories.md +0 -0
  82. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_CanCreateRepositories.md +0 -0
  83. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_CanCreateRepositoryWithRunnerAccess.md +0 -0
  84. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_CanDeployToEnvironment.md +0 -0
  85. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_CanEditEnvironment.md +0 -0
  86. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_CanEditProtection.md +0 -0
  87. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_CanInterceptJob.md +0 -0
  88. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_CanPwnRequest.md +0 -0
  89. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_CanReadSecret.md +0 -0
  90. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_CanReadSecretScanningAlert.md +0 -0
  91. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_CanRequestOIDCTokenFor.md +0 -0
  92. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_CanUseRunner.md +0 -0
  93. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_CanWriteBranch.md +0 -0
  94. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_CloseDiscussion.md +0 -0
  95. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_CloseIssue.md +0 -0
  96. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ClosePullRequest.md +0 -0
  97. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ConvertIssuesToDiscussions.md +0 -0
  98. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_CreateDiscussionCategory.md +0 -0
  99. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_CreateEnterpriseOrganizations.md +0 -0
  100. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_CreateRepository.md +0 -0
  101. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_CreateSoloMergeQueueEntry.md +0 -0
  102. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_CreateTag.md +0 -0
  103. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_CreateTeam.md +0 -0
  104. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_DeleteAlertsCodeScanning.md +0 -0
  105. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_DeleteDiscussion.md +0 -0
  106. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_DeleteDiscussionComment.md +0 -0
  107. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_DeleteIssue.md +0 -0
  108. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_DeleteTag.md +0 -0
  109. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_DependsOn.md +0 -0
  110. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_DeploysTo.md +0 -0
  111. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_EditCategoryOnDiscussion.md +0 -0
  112. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_EditDiscussionCategory.md +0 -0
  113. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_EditDiscussionComment.md +0 -0
  114. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_EditEnterpriseCustomPropertiesForOrganizations.md +0 -0
  115. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_EditRepoAnnouncementBanners.md +0 -0
  116. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_EditRepoCustomPropertiesValues.md +0 -0
  117. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_EditRepoMetadata.md +0 -0
  118. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_EditRepoProtections.md +0 -0
  119. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_HasBaseRole.md +0 -0
  120. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_HasMember.md +0 -0
  121. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_HasPersonalAccessToken.md +0 -0
  122. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_HasPersonalAccessTokenRequest.md +0 -0
  123. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_HasRole.md +0 -0
  124. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_HasRunner.md +0 -0
  125. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_HasSamlIdentityProvider.md +0 -0
  126. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_HasSecret.md +0 -0
  127. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_HasVariable.md +0 -0
  128. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_InheritedFrom.md +0 -0
  129. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_InstalledAs.md +0 -0
  130. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_InviteMember.md +0 -0
  131. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_IsEligibleFor.md +0 -0
  132. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_JumpMergeQueue.md +0 -0
  133. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ManageDeployKeys.md +0 -0
  134. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ManageDiscussionBadges.md +0 -0
  135. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ManageEnterpriseAdmins.md +0 -0
  136. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ManageEnterpriseIdentityProvider.md +0 -0
  137. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ManageEnterpriseMembers.md +0 -0
  138. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ManageEnterpriseOrganizationAdmins.md +0 -0
  139. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ManageEnterpriseOrganizations.md +0 -0
  140. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ManageEnterpriseReferrals.md +0 -0
  141. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ManageEnterpriseTeams.md +0 -0
  142. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ManageOrganizationWebhooks.md +0 -0
  143. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ManageRepoSecurityProducts.md +0 -0
  144. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ManageSecurityProducts.md +0 -0
  145. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ManageSettingsMergeTypes.md +0 -0
  146. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ManageSettingsPages.md +0 -0
  147. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ManageSettingsProjects.md +0 -0
  148. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ManageSettingsWiki.md +0 -0
  149. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ManageTopics.md +0 -0
  150. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ManageWebhooks.md +0 -0
  151. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_MapsToUser.md +0 -0
  152. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_MarkAsDuplicate.md +0 -0
  153. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_MatchesEnvironmentPolicy.md +0 -0
  154. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_MemberOf.md +0 -0
  155. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_OrgBypassCodeScanningDismissalRequests.md +0 -0
  156. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_OrgBypassSecretScanningClosureRequests.md +0 -0
  157. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_OrgReviewAndManageSecretScanningBypassRequests.md +0 -0
  158. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_OrgReviewAndManageSecretScanningClosureRequests.md +0 -0
  159. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_Owns.md +0 -0
  160. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ProtectedBy.md +0 -0
  161. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_PushProtectedBranch.md +0 -0
  162. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ReadCodeScanning.md +0 -0
  163. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ReadEnterpriseAuditLog.md +0 -0
  164. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ReadEnterpriseDomainVerification.md +0 -0
  165. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ReadEnterpriseMembers.md +0 -0
  166. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ReadEnterpriseOrgProjects.md +0 -0
  167. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ReadEnterpriseOrganizationAdmin.md +0 -0
  168. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ReadOrganizationActionsUsageMetrics.md +0 -0
  169. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ReadOrganizationCustomOrgRole.md +0 -0
  170. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ReadOrganizationCustomRepoRole.md +0 -0
  171. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ReadRepoContents.md +0 -0
  172. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_RemoveAssignee.md +0 -0
  173. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_RemoveLabel.md +0 -0
  174. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ReopenDiscussion.md +0 -0
  175. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ReopenIssue.md +0 -0
  176. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ReopenPullRequest.md +0 -0
  177. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_RequestPrReview.md +0 -0
  178. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_RequestsAccessTo.md +0 -0
  179. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ResolveDependabotAlerts.md +0 -0
  180. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ResolveSecretScanningAlerts.md +0 -0
  181. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_RestrictionsCanPush.md +0 -0
  182. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_RunOrgMigration.md +0 -0
  183. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_RunsOn.md +0 -0
  184. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ScopedTo.md +0 -0
  185. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_SetEnterpriseInteractionLimits.md +0 -0
  186. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_SetInteractionLimits.md +0 -0
  187. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_SetIssueType.md +0 -0
  188. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_SetMilestone.md +0 -0
  189. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_SetSocialPreview.md +0 -0
  190. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_SyncedTo.md +0 -0
  191. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ToggleDiscussionAnswer.md +0 -0
  192. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ToggleDiscussionCommentMinimize.md +0 -0
  193. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_TransferRepository.md +0 -0
  194. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_UsesSecret.md +0 -0
  195. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_UsesVariable.md +0 -0
  196. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ValidToken.md +0 -0
  197. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ViewDependabotAlerts.md +0 -0
  198. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ViewEnterpriseActionsUsageMetrics.md +0 -0
  199. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ViewEnterpriseBilling.md +0 -0
  200. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ViewEnterpriseSecretScanningAlerts.md +0 -0
  201. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_ViewSecretScanningAlerts.md +0 -0
  202. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_WriteCodeScanning.md +0 -0
  203. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_WriteEnterpriseActionsPolicies.md +0 -0
  204. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_WriteEnterpriseBilling.md +0 -0
  205. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_WriteEnterprisePersonalAccessTokenPolicies.md +0 -0
  206. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_WriteEnterpriseSso.md +0 -0
  207. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_WriteEnterpriseTeamMembers.md +0 -0
  208. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_WriteOrganizationActionsSecrets.md +0 -0
  209. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_WriteOrganizationActionsSettings.md +0 -0
  210. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_WriteOrganizationActionsVariables.md +0 -0
  211. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_WriteOrganizationCustomOrgRole.md +0 -0
  212. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_WriteOrganizationCustomRepoRole.md +0 -0
  213. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_WriteOrganizationNetworkConfigurations.md +0 -0
  214. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_WriteRepoContents.md +0 -0
  215. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/edges/GH_WriteRepoPullRequests.md +0 -0
  216. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_Branch.md +0 -0
  217. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_BranchProtectionRule.md +0 -0
  218. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_ClassicPersonalAccessToken.md +0 -0
  219. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_DeployKey.md +0 -0
  220. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_Enterprise.md +0 -0
  221. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_EnterpriseManagedUser.md +0 -0
  222. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_EnterpriseRole.md +0 -0
  223. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_EnterpriseRunner.md +0 -0
  224. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_EnterpriseRunnerGroup.md +0 -0
  225. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_EnterpriseTeam.md +0 -0
  226. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_Environment.md +0 -0
  227. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_EnvironmentBranchPolicy.md +0 -0
  228. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_EnvironmentSecret.md +0 -0
  229. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_EnvironmentVariable.md +0 -0
  230. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_OrgRole.md +0 -0
  231. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_OrgRunner.md +0 -0
  232. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_OrgRunnerGroup.md +0 -0
  233. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_OrgSecret.md +0 -0
  234. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_OrgVariable.md +0 -0
  235. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_Organization.md +0 -0
  236. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_PersonalAccessToken.md +0 -0
  237. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_PersonalAccessTokenRequest.md +0 -0
  238. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_RepoRole.md +0 -0
  239. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_RepoRunner.md +0 -0
  240. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_RepoSecret.md +0 -0
  241. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_RepoVariable.md +0 -0
  242. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_Repository.md +0 -0
  243. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_Runner.md +0 -0
  244. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_RunnerGroup.md +0 -0
  245. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_Scope.md +0 -0
  246. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_Secret.md +0 -0
  247. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_SecretScanningAlert.md +0 -0
  248. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_Team.md +0 -0
  249. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_TeamRole.md +0 -0
  250. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_User.md +0 -0
  251. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_Variable.md +0 -0
  252. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_Workflow.md +0 -0
  253. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_WorkflowJob.md +0 -0
  254. {openhound_github-0.22.0 → openhound_github-0.23.0}/descriptions/nodes/GH_WorkflowStep.md +0 -0
  255. {openhound_github-0.22.0 → openhound_github-0.23.0}/docker-compose/.dlt/config.toml.example +0 -0
  256. {openhound_github-0.22.0 → openhound_github-0.23.0}/docker-compose/.dlt/secrets.toml.example +0 -0
  257. {openhound_github-0.22.0 → openhound_github-0.23.0}/docker-compose/.env.example +0 -0
  258. {openhound_github-0.22.0 → openhound_github-0.23.0}/docker-compose/README.md +0 -0
  259. {openhound_github-0.22.0 → openhound_github-0.23.0}/docker-compose/check_config.py +0 -0
  260. {openhound_github-0.22.0 → openhound_github-0.23.0}/docker-compose/compose.yaml +0 -0
  261. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/privilege_zone_rules/t0-app-installations-all-repos.json +0 -0
  262. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/privilege_zone_rules/t0-apps-all-repos.json +0 -0
  263. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/privilege_zone_rules/t0-enterprise-owners-role.json +0 -0
  264. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/privilege_zone_rules/t0-external-identities-owners.json +0 -0
  265. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/privilege_zone_rules/t0-organizations.json +0 -0
  266. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/privilege_zone_rules/t0-owner-users.json +0 -0
  267. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/privilege_zone_rules/t0-owners-role.json +0 -0
  268. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/privilege_zone_rules/t0-privilege-escalation-roles.json +0 -0
  269. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/privilege_zone_rules/t0-privilege-escalation-users.json +0 -0
  270. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/privilege_zone_rules/t0-saml-identity-providers.json +0 -0
  271. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/README.md +0 -0
  272. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/actions-sha-pinning-not-required.json +0 -0
  273. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/active-leaked-secrets.json +0 -0
  274. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/advanced-security-disabled-new-repos.json +0 -0
  275. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/all-actions-allowed.json +0 -0
  276. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/app-installations-all-repos.json +0 -0
  277. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/branch-protection-admins-not-enforced.json +0 -0
  278. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/branch-protection-deletions-allowed.json +0 -0
  279. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/branch-protection-force-pushes.json +0 -0
  280. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/branch-protection-no-code-owner-reviews.json +0 -0
  281. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/branch-protection-no-pr-reviews.json +0 -0
  282. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/branch-protection-no-status-checks.json +0 -0
  283. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/branch-protection-self-approval.json +0 -0
  284. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/branch-protection-stale-reviews.json +0 -0
  285. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/bypass-pr-requirements.json +0 -0
  286. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/dangerous-branch-perms.json +0 -0
  287. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/default-repository-permissions.json +0 -0
  288. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/demo-sso-to-cloud-round-trip.json +0 -0
  289. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/dependabot-alerts-disabled-new-repos.json +0 -0
  290. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/dependabot-updates-disabled-new-repos.json +0 -0
  291. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/dependency-graph-disabled-new-repos.json +0 -0
  292. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/environments-admin-bypass.json +0 -0
  293. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/expired-pats.json +0 -0
  294. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/external-identities-without-scim.json +0 -0
  295. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/github-to-azure-identity.json +0 -0
  296. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/global-repo-perms.json +0 -0
  297. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/hybrid-identities.json +0 -0
  298. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/members-can-change-repo-visibility.json +0 -0
  299. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/members-can-create-pages.json +0 -0
  300. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/members-can-create-public-repos.json +0 -0
  301. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/members-can-delete-repos.json +0 -0
  302. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/members-can-fork-private-repos.json +0 -0
  303. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/members-can-invite-outside-collaborators.json +0 -0
  304. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/org-owners.json +0 -0
  305. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/orgs-without-2fa.json +0 -0
  306. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/pats-all-repo-access.json +0 -0
  307. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/pending-pat-requests.json +0 -0
  308. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/private-repos-forking-allowed.json +0 -0
  309. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/privileged-custom-org-roles.json +0 -0
  310. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/privileged-hybrid-identities.json +0 -0
  311. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/public-repos.json +0 -0
  312. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/push-protection-disabled-new-repos.json +0 -0
  313. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/push-to-protected-branches.json +0 -0
  314. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/repos-secret-scanning-disabled.json +0 -0
  315. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/repos-vulnerable-to-workflow-secret-exfil.json +0 -0
  316. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/repository-workflows.json +0 -0
  317. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/saml-configuration.json +0 -0
  318. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/secret-scanning-alerts.json +0 -0
  319. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/secret-scanning-disabled-new-repos.json +0 -0
  320. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/secrets-reachable-by-user.json +0 -0
  321. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/self-hosted-runners-can-intercept-broad-token-jobs.json +0 -0
  322. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/shared-self-hosted-runners-can-intercept-secret-bearing-jobs.json +0 -0
  323. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/team-membership-admin.json +0 -0
  324. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/team-structure.json +0 -0
  325. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/unprotected-branches.json +0 -0
  326. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/unprotected-default-branch-with-workflow.json +0 -0
  327. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/unprotected-default-branches.json +0 -0
  328. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/web-commit-signoff-not-required.json +0 -0
  329. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/workflow-jobs-interceptable-by-self-hosted-runners.json +0 -0
  330. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/workflow-jobs-with-broad-token-write-permissions.json +0 -0
  331. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/workflow-jobs-with-id-token-write-on-self-hosted-runners.json +0 -0
  332. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/workflow-jobs-with-id-token-write.json +0 -0
  333. {openhound_github-0.22.0 → openhound_github-0.23.0}/extension/saved_searches/workflow-jobs-with-observed-oidc-auth-steps.json +0 -0
  334. {openhound_github-0.22.0 → openhound_github-0.23.0}/justfile +0 -0
  335. {openhound_github-0.22.0 → openhound_github-0.23.0}/pyproject.toml +0 -0
  336. {openhound_github-0.22.0 → openhound_github-0.23.0}/scripts/generate_gh_description_docs.py +0 -0
  337. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/main.py +0 -0
  338. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/__init__.py +0 -0
  339. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/auth.py +0 -0
  340. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/extension.yaml +0 -0
  341. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/github_retry.py +0 -0
  342. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/graph.py +0 -0
  343. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/actions_permission.py +0 -0
  344. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/branch.py +0 -0
  345. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/branch_pr_bypass_allowance.py +0 -0
  346. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/branch_protection_rule.py +0 -0
  347. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/branch_push_allowance.py +0 -0
  348. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/classic_personal_access_token.py +0 -0
  349. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/deploy_key.py +0 -0
  350. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/enterprise.py +0 -0
  351. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/enterprise_admin.py +0 -0
  352. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/enterprise_credential_inventory.py +0 -0
  353. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/enterprise_helpers.py +0 -0
  354. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/enterprise_managed_user.py +0 -0
  355. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/enterprise_member.py +0 -0
  356. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/enterprise_organization.py +0 -0
  357. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/enterprise_role.py +0 -0
  358. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/enterprise_role_team.py +0 -0
  359. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/enterprise_role_user.py +0 -0
  360. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/enterprise_team.py +0 -0
  361. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/enterprise_team_member.py +0 -0
  362. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/enterprise_team_organization.py +0 -0
  363. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/enterprise_team_role.py +0 -0
  364. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/enterprise_user.py +0 -0
  365. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/env_secret.py +0 -0
  366. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/env_variable.py +0 -0
  367. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/environment.py +0 -0
  368. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/environment_branch_policy.py +0 -0
  369. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/org.py +0 -0
  370. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/org_role.py +0 -0
  371. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/org_role_member.py +0 -0
  372. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/org_role_team.py +0 -0
  373. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/org_secret.py +0 -0
  374. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/org_variable.py +0 -0
  375. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/permissions.py +0 -0
  376. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/personal_access_token.py +0 -0
  377. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/personal_access_token_access.py +0 -0
  378. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/personal_access_token_request.py +0 -0
  379. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/projected_enterprise_team.py +0 -0
  380. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/repo_role_assignment.py +0 -0
  381. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/repository.py +0 -0
  382. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/repository_role.py +0 -0
  383. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/repository_secret.py +0 -0
  384. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/repository_variable.py +0 -0
  385. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/runner.py +0 -0
  386. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/saml_assertion_consumer_service.py +0 -0
  387. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/saml_helpers.py +0 -0
  388. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/saml_issuer.py +0 -0
  389. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/saml_service_provider.py +0 -0
  390. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/scim_user.py +0 -0
  391. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/scope.py +0 -0
  392. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/secret_scanning_alert.py +0 -0
  393. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/team.py +0 -0
  394. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/team_member.py +0 -0
  395. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/team_role.py +0 -0
  396. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/user.py +0 -0
  397. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/workflow.py +0 -0
  398. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/workflow_job.py +0 -0
  399. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/workflow_reference.py +0 -0
  400. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/models/workflow_step.py +0 -0
  401. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/resources/__init__.py +0 -0
  402. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/openhound_github/runner_ids.py +0 -0
  403. {openhound_github-0.22.0 → openhound_github-0.23.0}/src/scheduler.py +0 -0
  404. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_app_auth.py +0 -0
  405. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_app_model.py +0 -0
  406. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_branch_collection_gate.py +0 -0
  407. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_branch_protection_traversability.py +0 -0
  408. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_classic_personal_access_tokens.py +0 -0
  409. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_credential_permission_models.py +0 -0
  410. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_data/api/actions-permissions.json +0 -0
  411. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_data/api/actionsecrets.json +0 -0
  412. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_data/api/app.json +0 -0
  413. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_data/api/appinstalls.json +0 -0
  414. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_data/api/branch-policies.json +0 -0
  415. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_data/api/branch-prot-rules.json +0 -0
  416. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_data/api/branches.json +0 -0
  417. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_data/api/custom-roles.json +0 -0
  418. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_data/api/environments.json +0 -0
  419. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_data/api/org-pat-request.json +0 -0
  420. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_data/api/org-pat.json +0 -0
  421. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_data/api/org-role-teams.json +0 -0
  422. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_data/api/org-role-users.json +0 -0
  423. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_data/api/org-roles.json +0 -0
  424. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_data/api/org.json +0 -0
  425. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_data/api/pat-repositories.json +0 -0
  426. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_data/api/repo-collaborators.json +0 -0
  427. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_data/api/repo-teams.json +0 -0
  428. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_data/api/repositories.json +0 -0
  429. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_data/api/scimusers.json +0 -0
  430. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_data/api/secrets.json +0 -0
  431. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_data/api/secretscanningalert.json +0 -0
  432. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_data/api/selected-org-secrets.json +0 -0
  433. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_data/api/variables.json +0 -0
  434. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_data/api/workflows.json +0 -0
  435. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_deploy_key_models.py +0 -0
  436. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_deploy_key_resources.py +0 -0
  437. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_description_docs.py +0 -0
  438. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_enterprise_capabilities.py +0 -0
  439. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_enterprise_organization.py +0 -0
  440. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_enterprise_resources.py +0 -0
  441. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_environment_model.py +0 -0
  442. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_environment_resources.py +0 -0
  443. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_environment_reviewer_lookup.py +0 -0
  444. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_error_resilience.py +0 -0
  445. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_github_retry.py +0 -0
  446. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_helpers.py +0 -0
  447. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_lookup.py +0 -0
  448. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_org_role_model.py +0 -0
  449. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_org_scim_resources.py +0 -0
  450. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_org_secret_models.py +0 -0
  451. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_preproc.py +0 -0
  452. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_repository_rulesets.py +0 -0
  453. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_repository_scopes.py +0 -0
  454. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_runner_ids.py +0 -0
  455. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_runner_models.py +0 -0
  456. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_runner_resources.py +0 -0
  457. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_saml_helpers.py +0 -0
  458. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_scim_models.py +0 -0
  459. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_source_endpoints.py +0 -0
  460. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_source_org_canonicalization.py +0 -0
  461. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_team_external_groups.py +0 -0
  462. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_variable_models.py +0 -0
  463. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_workflow_interception_path.py +0 -0
  464. {openhound_github-0.22.0 → openhound_github-0.23.0}/tests/test_workflow_model.py +0 -0
  465. {openhound_github-0.22.0 → openhound_github-0.23.0}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: openhound-github
3
- Version: 0.22.0
3
+ Version: 0.23.0
4
4
  Summary: Github collector for OpenHound
5
5
  Author-email: "jdreijer@specterops.io" <jdreijer@specterops.io>, Jared Atkinson <jatkinson@specterops.io>
6
6
  License-File: LICENSE.md
@@ -45,6 +45,12 @@ The openhound-github extension collects resources from Github organizations and
45
45
  edges for
46
46
  BloodHound.
47
47
 
48
+ ### Version 0.23.0
49
+
50
+ This release adds enterprise OIDC providers and external identities, collects the
51
+ authenticating GitHub App's enterprise installation metadata, and corrects Tier
52
+ Zero role matching and expired-token filtering.
53
+
48
54
  ### GitHub App JWT issuer
49
55
 
50
56
  Enterprise GitHub App credentials accept either `client_id` or `app_id` as the
@@ -66,14 +72,59 @@ Both values must be provided together when overriding the GitHub.com defaults.
66
72
  Endpoint URLs must use HTTPS and share the same origin. GitHub App
67
73
  `credentials.api_uri` may override only the path on that same origin.
68
74
 
75
+ ### Request timeouts and retries
76
+
77
+ REST and GraphQL collection requests use a 10-second connection timeout and a
78
+ 30-second read timeout. Transient HTTP 5xx errors, connection failures, and
79
+ timeouts share a limit of three attempts (the initial attempt plus two retries).
80
+ Adaptive GraphQL pagination shares that limit across page sizes: HTTP 502/504
81
+ responses trigger smaller-page attempts instead of a new retry budget.
82
+
83
+ After retries are exhausted, existing resource handlers log the failure and
84
+ continue with unaffected scopes. Already emitted records are retained, but the
85
+ affected scope may be incomplete. Resources that require all pages before
86
+ emitting records retain that behavior.
87
+
88
+ Workflow collection skips `dynamic/` paths. Missing workflow files are logged
89
+ and skipped without passing failed items to job or step parsing.
90
+
91
+ Rate-limit responses and GitHub App token refresh retain their existing retry
92
+ handling and do not consume the transient-failure budget. These timeouts are
93
+ not an overall request deadline. App authentication requests and credential
94
+ inventory CSV downloads retain their separate timeout settings.
95
+
69
96
  ### Enterprise SCIM and hybrid correlations
70
97
 
71
98
  A token with enterprise SCIM access is used to collect both `/scim/v2/enterprises/{enterprise}/Users` and `/scim/v2/enterprises/{enterprise}/Groups`. The collector emits normalized `SCIM_Organization`, `SCIM_User`, and `SCIM_Group` nodes plus `SCIM_Contains`, `SCIM_MemberOf`, and `SCIM_Provisioned` relationships. Install the BloodHound SCIM extension alongside this extension to register the shared SCIM kinds.
72
99
 
73
100
  `SOURCES__GITHUB__EMIT_LEGACY_SCIM_CORRELATIONS=true` temporarily reproduces GitHound-style Okta-to-SCIM correlation relationships. It defaults to false because a dedicated hybrid correlator should own IdP-to-SCIM matching; GitHub remains authoritative for GitHub's SCIM resources and target-system provisioning relationships.
74
101
 
102
+ In enterprise app authentication mode, the collector separately retrieves its own enterprise installation for configuration troubleshooting, including granted permissions, timestamps, and suspension status. It also retrieves the parent app's requested permissions and owner metadata using the enterprise installation token. This does not enumerate other enterprise-target app installations or imply organization/repository access. App and installation records use `environment_slug` for the organization login or enterprise slug. Installations also retain `target_type` to distinguish targets; older collected records remain compatible. Existing DLT app schemas are migrated to allow empty legacy `org_login` fields and absent `repository_selection`. A load already stuck in normalization retains its saved schema and needs recovery or restart; do not delete the pipeline or collected output to apply this change.
103
+
75
104
  Enterprise roles, including the built-in `members` role, are emitted through `GH_HasRole` and granular enterprise capability relationships. Only capability relationships with a confirmed privilege path are traversable; descriptive permissions such as `GH_WriteEnterpriseSso` remain non-traversable.
76
105
 
106
+ ### Enterprise OIDC collection
107
+
108
+ A supplemental classic PAT owned by an enterprise owner with `read:enterprise`
109
+ enables discovery of `enterprise.ownerInfo.oidcProvider`. The collector stores
110
+ provider metadata in `oidc_provider` and emits `GH_OidcIdentityProvider` with
111
+ `provider_type` and `tenant_id`, linked to the enterprise through the
112
+ non-traversable `GH_HasOidcIdentityProvider` relationship.
113
+
114
+ SAML and OIDC providers both carry the secondary kind `GH_IdentityProvider`.
115
+ Provider queries run independently, so an unavailable OIDC field or denied
116
+ request does not prevent existing SAML collection. An absent OIDC provider is
117
+ logged separately from query failures.
118
+
119
+ External identities from both enterprise provider types are paginated into the
120
+ existing `external_identities` table. Conversion resolves their provider through
121
+ the SAML and OIDC metadata tables and emits `GH_HasExternalIdentity` and, when a
122
+ linked user exists, `GH_MapsToUser`. These edges remain non-traversable. Nullable
123
+ identity attributes and unlinked identities are retained. OIDC identities do not
124
+ produce SAML account relationships. If provider lookup is missing or ambiguous,
125
+ conversion omits the provider edge while preserving the identity and user mapping;
126
+ ambiguous matches are logged.
127
+
77
128
  ### Optional privileged collection
78
129
 
79
130
  The collector runs successfully with the documented read-only permission set. Some higher-fidelity relationships require optional non-read-only permissions because GitHub exposes the supporting read APIs behind privileged permission names:
@@ -34,6 +34,12 @@ The openhound-github extension collects resources from Github organizations and
34
34
  edges for
35
35
  BloodHound.
36
36
 
37
+ ### Version 0.23.0
38
+
39
+ This release adds enterprise OIDC providers and external identities, collects the
40
+ authenticating GitHub App's enterprise installation metadata, and corrects Tier
41
+ Zero role matching and expired-token filtering.
42
+
37
43
  ### GitHub App JWT issuer
38
44
 
39
45
  Enterprise GitHub App credentials accept either `client_id` or `app_id` as the
@@ -55,14 +61,59 @@ Both values must be provided together when overriding the GitHub.com defaults.
55
61
  Endpoint URLs must use HTTPS and share the same origin. GitHub App
56
62
  `credentials.api_uri` may override only the path on that same origin.
57
63
 
64
+ ### Request timeouts and retries
65
+
66
+ REST and GraphQL collection requests use a 10-second connection timeout and a
67
+ 30-second read timeout. Transient HTTP 5xx errors, connection failures, and
68
+ timeouts share a limit of three attempts (the initial attempt plus two retries).
69
+ Adaptive GraphQL pagination shares that limit across page sizes: HTTP 502/504
70
+ responses trigger smaller-page attempts instead of a new retry budget.
71
+
72
+ After retries are exhausted, existing resource handlers log the failure and
73
+ continue with unaffected scopes. Already emitted records are retained, but the
74
+ affected scope may be incomplete. Resources that require all pages before
75
+ emitting records retain that behavior.
76
+
77
+ Workflow collection skips `dynamic/` paths. Missing workflow files are logged
78
+ and skipped without passing failed items to job or step parsing.
79
+
80
+ Rate-limit responses and GitHub App token refresh retain their existing retry
81
+ handling and do not consume the transient-failure budget. These timeouts are
82
+ not an overall request deadline. App authentication requests and credential
83
+ inventory CSV downloads retain their separate timeout settings.
84
+
58
85
  ### Enterprise SCIM and hybrid correlations
59
86
 
60
87
  A token with enterprise SCIM access is used to collect both `/scim/v2/enterprises/{enterprise}/Users` and `/scim/v2/enterprises/{enterprise}/Groups`. The collector emits normalized `SCIM_Organization`, `SCIM_User`, and `SCIM_Group` nodes plus `SCIM_Contains`, `SCIM_MemberOf`, and `SCIM_Provisioned` relationships. Install the BloodHound SCIM extension alongside this extension to register the shared SCIM kinds.
61
88
 
62
89
  `SOURCES__GITHUB__EMIT_LEGACY_SCIM_CORRELATIONS=true` temporarily reproduces GitHound-style Okta-to-SCIM correlation relationships. It defaults to false because a dedicated hybrid correlator should own IdP-to-SCIM matching; GitHub remains authoritative for GitHub's SCIM resources and target-system provisioning relationships.
63
90
 
91
+ In enterprise app authentication mode, the collector separately retrieves its own enterprise installation for configuration troubleshooting, including granted permissions, timestamps, and suspension status. It also retrieves the parent app's requested permissions and owner metadata using the enterprise installation token. This does not enumerate other enterprise-target app installations or imply organization/repository access. App and installation records use `environment_slug` for the organization login or enterprise slug. Installations also retain `target_type` to distinguish targets; older collected records remain compatible. Existing DLT app schemas are migrated to allow empty legacy `org_login` fields and absent `repository_selection`. A load already stuck in normalization retains its saved schema and needs recovery or restart; do not delete the pipeline or collected output to apply this change.
92
+
64
93
  Enterprise roles, including the built-in `members` role, are emitted through `GH_HasRole` and granular enterprise capability relationships. Only capability relationships with a confirmed privilege path are traversable; descriptive permissions such as `GH_WriteEnterpriseSso` remain non-traversable.
65
94
 
95
+ ### Enterprise OIDC collection
96
+
97
+ A supplemental classic PAT owned by an enterprise owner with `read:enterprise`
98
+ enables discovery of `enterprise.ownerInfo.oidcProvider`. The collector stores
99
+ provider metadata in `oidc_provider` and emits `GH_OidcIdentityProvider` with
100
+ `provider_type` and `tenant_id`, linked to the enterprise through the
101
+ non-traversable `GH_HasOidcIdentityProvider` relationship.
102
+
103
+ SAML and OIDC providers both carry the secondary kind `GH_IdentityProvider`.
104
+ Provider queries run independently, so an unavailable OIDC field or denied
105
+ request does not prevent existing SAML collection. An absent OIDC provider is
106
+ logged separately from query failures.
107
+
108
+ External identities from both enterprise provider types are paginated into the
109
+ existing `external_identities` table. Conversion resolves their provider through
110
+ the SAML and OIDC metadata tables and emits `GH_HasExternalIdentity` and, when a
111
+ linked user exists, `GH_MapsToUser`. These edges remain non-traversable. Nullable
112
+ identity attributes and unlinked identities are retained. OIDC identities do not
113
+ produce SAML account relationships. If provider lookup is missing or ambiguous,
114
+ conversion omits the provider edge while preserving the identity and user mapping;
115
+ ambiguous matches are logged.
116
+
66
117
  ### Optional privileged collection
67
118
 
68
119
  The collector runs successfully with the documented read-only permission set. Some higher-fidelity relationships require optional non-read-only permissions because GitHub exposes the supporting read APIs behind privileged permission names:
@@ -2,12 +2,13 @@
2
2
 
3
3
  ## General Information
4
4
 
5
- The non-traversable GH_Contains edge represents structural containment within the GitHub resource hierarchy. The enterprise contains enterprise teams, roles, managed users, classic personal access tokens, runner groups, and enterprise runners through their groups. The organization serves as a top-level container for users, teams, repositories, roles, scopes, secrets, app installations, fine-grained personal access tokens, and organization runner groups. Native organization runner groups contain organization runners. Repositories contain branches, workflows, branch protection rules, environments, repo-level secrets and variables, and repository-scoped runners. Environments contain environment branch policies, environment-scoped secrets, and environment-scoped variables. This edge is created by the collector to establish the resource hierarchy and is not traversable because containment alone does not imply privilege escalation.
5
+ The non-traversable GH_Contains edge represents structural containment within the GitHub resource hierarchy. The enterprise contains enterprise teams, roles, managed users, classic personal access tokens, the collector app installation, runner groups, and enterprise runners through their groups. The organization serves as a top-level container for users, teams, repositories, roles, scopes, secrets, app installations, fine-grained personal access tokens, and organization runner groups. Native organization runner groups contain organization runners. Repositories contain branches, workflows, branch protection rules, environments, repo-level secrets and variables, and repository-scoped runners. Environments contain environment branch policies, environment-scoped secrets, and environment-scoped variables. This edge is created by the collector to establish the resource hierarchy and is not traversable because containment alone does not imply privilege escalation.
6
6
 
7
7
  ## Edge Schema
8
8
 
9
9
  | Source | Destination | Traversable |
10
10
  | --- | --- | --- |
11
+ | `GH_Enterprise` | `GH_AppInstallation` | `false` |
11
12
  | `GH_Enterprise` | `GH_ClassicPersonalAccessToken` | `false` |
12
13
  | `GH_Enterprise` | `GH_EnterpriseRole` | `false` |
13
14
  | `GH_Enterprise` | `GH_EnterpriseRunnerGroup` | `false` |
@@ -75,6 +76,7 @@ graph LR
75
76
  n29["GH_WorkflowJob"]
76
77
  n30["GH_WorkflowStep"]
77
78
  n0 -.->|GH_Contains| n1
79
+ n0 -.->|GH_Contains| n13
78
80
  n0 -.->|GH_Contains| n2
79
81
  n0 -.->|GH_Contains| n3
80
82
  n0 -.->|GH_Contains| n4
@@ -0,0 +1,22 @@
1
+ # GH_HasExternalIdentity
2
+
3
+ ## General Information
4
+
5
+ The non-traversable GH_HasExternalIdentity edge represents the relationship between a SAML or OIDC identity provider and the external identities (SSO users) it manages. This edge links each external identity to its identity provider. External identities are a key component in cross-platform attack path analysis because they bridge the gap between corporate identity providers and GitHub user accounts via the GH_MapsToUser edge. Enumerating external identities reveals which corporate users have linked GitHub accounts and enables mapping from IdP compromise to GitHub access.
6
+
7
+ ## Edge Schema
8
+
9
+ | Source | Destination | Traversable |
10
+ | --- | --- | --- |
11
+ | `GH_IdentityProvider` | `GH_ExternalIdentity` | `false` |
12
+
13
+ ## Diagram
14
+
15
+ ```mermaid
16
+ graph LR
17
+ n0["GH_IdentityProvider"]
18
+ n1["GH_ExternalIdentity"]
19
+ n0 -.->|GH_HasExternalIdentity| n1
20
+ ```
21
+
22
+ `GH_IdentityProvider` is a shared secondary kind on SAML and OIDC providers. Provider association is resolved from collected provider metadata, without duplicating provider properties on external identity nodes.
@@ -0,0 +1,20 @@
1
+ # GH_HasOidcIdentityProvider
2
+
3
+ ## General Information
4
+
5
+ Links a GitHub Enterprise account to its configured OIDC identity provider.
6
+
7
+ ## Edge Schema
8
+
9
+ | Source | Destination | Traversable |
10
+ | --- | --- | --- |
11
+ | `GH_Enterprise` | `GH_OidcIdentityProvider` | `false` |
12
+
13
+ This relationship provides configuration context and does not itself represent an attack path.
14
+
15
+ ## Diagram
16
+
17
+ ```mermaid
18
+ graph LR
19
+ enterprise["GH_Enterprise"] -.->|GH_HasOidcIdentityProvider| provider["GH_OidcIdentityProvider"]
20
+ ```
@@ -2,9 +2,9 @@
2
2
 
3
3
  ## General Information
4
4
 
5
- Represents a GitHub App definition — the registered application entity. The app owner holds the private key that can generate installation access tokens for **every** GH_AppInstallation of this app. If the private key is compromised, all installations across all organizations are affected.
5
+ Represents a GitHub App definition — the registered application entity. The app owner holds the private key that can generate installation access tokens for **every** GH_AppInstallation of this app. If the private key is compromised, all installations across all organizations and enterprises are affected.
6
6
 
7
- App definitions are retrieved via the public `GET /apps/{app_slug}` endpoint (no authentication required) after discovering unique app slugs from the organization's app installations.
7
+ App definitions are retrieved via `GET /apps/{app_slug}` after discovering app slugs from organization installations or the collector app's enterprise installation. Authenticated lookup can also retrieve private/internal apps where GitHub permits access. The `permissions` property records requested app permissions; each installation separately records its granted permissions.
8
8
 
9
9
  ## Properties
10
10
 
@@ -12,6 +12,7 @@ App definitions are retrieved via the public `GET /apps/{app_slug}` endpoint (no
12
12
  | --- | --- | --- |
13
13
  | `name` | `string` | The node name used for matching and display. |
14
14
  | `displayname` | `string` | The human-readable display name. |
15
+ | `environment_slug` | `string` | The organization login or enterprise slug where the app was collected. |
15
16
  | `environmentid` | `string` | The identifier of the GitHub environment where this node was collected. |
16
17
  | `last_seen` | `datetime` | The timestamp when this node was last observed during collection. |
17
18
  | `node_id` | `string` | The stable identifier used as the OpenGraph node ID; this is the native GitHub node ID where available. |
@@ -24,6 +25,7 @@ App definitions are retrieved via the public `GET /apps/{app_slug}` endpoint (no
24
25
  | `owner_login` | `string` | The login of the user or organization that owns the app. |
25
26
  | `owner_node_id` | `string` | The node_id of the user or organization that owns the app. |
26
27
  | `owner_type` | `string` | The type of the owner (e.g., `User`, `Organization`). |
28
+ | `permissions` | `list[string]` | Requested app permissions in `scope:access` form. |
27
29
  | `registration_origin` | `string` | Whether the app is tenant-owned, third-party, or unknown. |
28
30
  | `events` | `list[string]` | JSON string of the default webhook events the app subscribes to. |
29
31
  | `installations_count` | `integer` | The total number of installations of this app across all organizations. |
@@ -2,11 +2,15 @@
2
2
 
3
3
  ## General Information
4
4
 
5
- Represents a GitHub App installed on an organization. App installations have specific permissions and can be scoped to all repositories or a selection of repositories. The permissions granted to the installation are stored as `scope:access` values such as `contents:write` in the `permissions` property.
5
+ Represents a GitHub App installed on an organization or enterprise. Organization app installations have specific permissions and can be scoped to all repositories or a selection of repositories. The permissions granted to the installation are stored as `scope:access` values such as `contents:write` in the `permissions` property.
6
6
 
7
7
  Unlike fine-grained personal access tokens, GitHub does not expose separate organization and repository permission buckets for app installations, so this property remains a single flat permission list.
8
8
 
9
- Each installation is linked to its parent GH_App via a GH_InstalledAs edge. Installations with `repository_selection` set to `all` use one GH_CanAccess edge to the organization's repository/all GH_Scope; GH_ScopedTo edges enumerate the repositories in that reusable scope. For installations with `repository_selection` set to `selected`, the collector uses the enterprise organization-installation repositories API to enumerate the granted repositories when the enterprise installation has `Enterprise organization installations: read` or `Enterprise organization installation repositories: read`. If that permission is unavailable, selected repository edges are skipped.
9
+ Each installation is linked to its parent GH_App via a GH_InstalledAs edge. Organization installations with `repository_selection` set to `all` use one GH_CanAccess edge to the organization's repository/all GH_Scope; GH_ScopedTo edges enumerate the repositories in that reusable scope. For installations with `repository_selection` set to `selected`, the collector uses the enterprise organization-installation repositories API to enumerate the granted repositories when the enterprise installation has `Enterprise organization installations: read` or `Enterprise organization installation repositories: read`. If that permission is unavailable, selected repository edges are skipped.
10
+
11
+ Enterprise collection includes the authenticating collector app's installation, fetched independently of authentication discovery with `GET /enterprises/{enterprise}/installation`. It records granted enterprise permissions, timestamps, and suspension status, and is contained by `GH_Enterprise`. This is not a complete inventory of apps installed on the enterprise. Enterprise installations do not produce repository access edges. Parent app enrichment failures do not discard the installation.
12
+
13
+ `environment_slug` identifies the target account for both installation types. `target_type` distinguishes organization and enterprise targets. Older records using `org_login` or `enterprise_name` remain readable; these fields are no longer used for new installation context. Organization repository access is evaluated only for organization targets.
10
14
 
11
15
  ## Properties
12
16
 
@@ -14,6 +18,7 @@ Each installation is linked to its parent GH_App via a GH_InstalledAs edge. Inst
14
18
  | --- | --- | --- |
15
19
  | `name` | `string` | The node name used for matching and display. |
16
20
  | `displayname` | `string` | The human-readable display name. |
21
+ | `environment_slug` | `string` | The organization login or enterprise slug of the installation target. |
17
22
  | `environmentid` | `string` | The identifier of the GitHub environment where this node was collected. |
18
23
  | `last_seen` | `datetime` | The timestamp when this node was last observed during collection. |
19
24
  | `node_id` | `string` | The stable identifier used as the OpenGraph node ID; this is the native GitHub node ID where available. |
@@ -25,13 +30,13 @@ Each installation is linked to its parent GH_App via a GH_InstalledAs edge. Inst
25
30
  | `access_tokens_url` | `string` | API URL to create installation access tokens. |
26
31
  | `repositories_url` | `string` | API URL to list repositories accessible to this installation. |
27
32
  | `repository_selection` | `string` | Whether the app has access to `all` repositories or `selected` repositories. |
28
- | `target_type` | `string` | The target type of the installation (e.g., `Organization`). |
33
+ | `target_type` | `string` | The target type of the installation (e.g., `Organization` or `Enterprise`). |
29
34
  | `permissions` | `list[string]` | Permissions granted to the installation in `scope:access` form. |
30
35
  | `events` | `string` | JSON string of the webhook events the app subscribes to. |
31
36
  | `created_at` | `datetime` | When the app was installed. |
32
37
  | `updated_at` | `datetime` | When the installation was last updated. |
33
38
  | `suspended_at` | `datetime` | When the installation was suspended, if applicable. |
34
- | `environment_name` | `string` | The name of the environment (GitHub organization) where the app is installed. |
39
+ | `environment_name` | `string` | The name of the environment (GitHub organization or enterprise) where the app is installed. |
35
40
  | `query_repositories` | `string` | Query for repositories. |
36
41
  | `query_app` | `string` | Query for app. |
37
42
 
@@ -48,4 +53,6 @@ graph LR
48
53
  n1 -.->|GH_CanAccess| n2
49
54
  n1 -.->|GH_CanAccess| n3
50
55
  n4 -.->|GH_Contains| n1
56
+ n5["GH_Enterprise"]
57
+ n5 -.->|GH_Contains| n1
51
58
  ```
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## General Information
4
4
 
5
- Represents an external identity from a SAML or SCIM identity provider that is linked to a GitHub user. External identities map corporate user accounts (from providers like Okta, Azure AD, etc.) to GitHub user accounts, enabling single sign-on authentication. Each external identity can have both SAML and SCIM identity attributes.
5
+ Represents an external identity collected through a SAML or OIDC provider, with a linked GitHub user when available. External identities map corporate user accounts (from providers like Okta, Azure AD, etc.) to GitHub user accounts, enabling single sign-on authentication. SAML attributes, SCIM attributes, and the linked user may be absent.
6
6
 
7
7
  ## Properties
8
8
 
@@ -0,0 +1,24 @@
1
+ # GH_IdentityProvider
2
+
3
+ ## General Information
4
+
5
+ A shared, non-display secondary kind on `GH_SamlIdentityProvider` and `GH_OidcIdentityProvider` nodes. Provider-specific kinds retain their display settings and protocol-specific properties.
6
+
7
+ Use this kind to query providers across both federation strategies:
8
+
9
+ ```cypher
10
+ MATCH (provider:GH_IdentityProvider)
11
+ RETURN provider
12
+ ```
13
+
14
+ ## Properties
15
+
16
+ This secondary kind adds no properties. Nodes retain the properties defined by their provider-specific kind.
17
+
18
+ ## Diagram
19
+
20
+ ```mermaid
21
+ graph LR
22
+ provider["GH_IdentityProvider"] -.->|GH_HasExternalIdentity| identity["GH_ExternalIdentity"]
23
+ identity -.->|GH_MapsToUser| user["GH_User"]
24
+ ```
@@ -0,0 +1,34 @@
1
+ # GH_OidcIdentityProvider
2
+
3
+ ## General Information
4
+
5
+ Represents an OIDC identity provider configured for a GitHub Enterprise account. Collection queries `enterprise.ownerInfo.oidcProvider` using the supplemental classic PAT. The PAT must belong to an enterprise owner and have `read:enterprise` access.
6
+
7
+ The node carries `GH_OidcIdentityProvider`, the shared secondary kind `GH_IdentityProvider`, and the source kind `GitHub`.
8
+
9
+ ## Properties
10
+
11
+ | Property | Description |
12
+ | --- | --- |
13
+ | `node_id` | GitHub's native GraphQL provider ID. |
14
+ | `provider_type` | The OIDC provider type returned by GitHub. |
15
+ | `tenant_id` | The identity provider's tenant ID. |
16
+ | `environmentid` | The GitHub Enterprise node ID. |
17
+ | `environment_name` | The enterprise name. |
18
+ | `github_deployment_id` | The GitHub deployment identifier. |
19
+ | `github_web_origin` | The GitHub web origin. |
20
+
21
+ ## Relationships
22
+
23
+ `GH_Enterprise` connects to this node through the non-traversable `GH_HasOidcIdentityProvider` relationship. Provider collection does not emit SAML service provider or SAML account relationships.
24
+
25
+ The provider connects to its `GH_ExternalIdentity` nodes through non-traversable `GH_HasExternalIdentity` edges. Those identities map to linked `GH_User` nodes through `GH_MapsToUser` when available.
26
+
27
+ ## Diagram
28
+
29
+ ```mermaid
30
+ graph LR
31
+ enterprise["GH_Enterprise"] -.->|GH_HasOidcIdentityProvider| provider["GH_OidcIdentityProvider"]
32
+ provider -.->|GH_HasExternalIdentity| identity["GH_ExternalIdentity"]
33
+ identity -.->|GH_MapsToUser| user["GH_User"]
34
+ ```
@@ -37,3 +37,5 @@ graph LR
37
37
  n2 -.->|GH_HasSamlIdentityProvider| n1
38
38
  n1 -.->|GH_HasExternalIdentity| n3
39
39
  ```
40
+
41
+ This node also carries the non-display secondary kind `GH_IdentityProvider`, shared with enterprise OIDC providers.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "GitHub: Tier Zero All-Repo Admin Role",
3
3
  "description": "The synthetic all_repo_admin role grants admin access to every repository in the organization. This role is inherited by the owners role via GH_HasBaseRole and cascades admin permissions including branch protection editing, secret access, and deploy key management to all repositories.",
4
- "cypher": "MATCH (n:GH_OrgRole)\nWHERE n.name CONTAINS 'ALL_REPO_ADMIN'\nRETURN n",
4
+ "cypher": "MATCH (n:GH_OrgRole)\nWHERE n.name CONTAINS 'all_repo_admin'\nRETURN n",
5
5
  "enabled": true,
6
6
  "zone": "Tier Zero",
7
7
  "allow_disable": true
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "GitHub: Tier Zero PATs (All Repositories)",
3
3
  "description": "Fine-grained personal access tokens scoped to all repositories in the organization that have repository-control write permissions. A single compromised token may grant code, workflow, Actions, or administrative control across every repository. PATs with only read or lower-impact write permissions are excluded.",
4
- "cypher": "MATCH (n:GH_PersonalAccessToken)-[:GH_CanAccess]->(:GH_Scope {scope_type:'repository', scope:'all'})\nWHERE ANY(permission IN n.repository_permissions WHERE permission IN ['contents:write', 'administration:write', 'workflows:write', 'actions:write'])\nRETURN n",
4
+ "cypher": "MATCH (n:GH_PersonalAccessToken {token_expired:false})-[:GH_CanAccess]->(:GH_Scope {scope_type:'repository', scope:'all'})\nWHERE ANY(permission IN n.repository_permissions WHERE permission IN ['contents:write', 'administration:write', 'workflows:write', 'actions:write'])\nRETURN n",
5
5
  "enabled": true,
6
6
  "zone": "Tier Zero",
7
7
  "allow_disable": true
@@ -2,7 +2,7 @@
2
2
  "schema": {
3
3
  "name": "SOGitHub",
4
4
  "display_name": "GitHub Extension (by SpecterOps)",
5
- "version": "v1.4.0",
5
+ "version": "v1.4.3",
6
6
  "namespace": "GH"
7
7
  },
8
8
  "node_kinds": [
@@ -74,7 +74,7 @@
74
74
  "title": "Identity Provider",
75
75
  "position": 9,
76
76
  "markdown": {
77
- "content": "{{ $objectID := .Properties.objectid | default \"\" | trim }}\n{{ $escapedObjectID := $objectID | replace \"\\\\\" \"\\\\\\\\\" | replace \"'\" \"\\\\'\" }}\n{{ if ne $objectID \"\" }}\n{{ $query := printf \"MATCH p = (selected:GH_Enterprise {objectid: '%s'})-[:GH_HasSamlIdentityProvider]->(idp:GH_SamlIdentityProvider)\\nOPTIONAL MATCH p1 = (idp)-[:GH_HasExternalIdentity]->(:GH_ExternalIdentity)-[:GH_MapsToUser]->(:GH_User)\\nRETURN p, p1\\nLIMIT 500\" $escapedObjectID }}\n{{ $encodedQuery := $query | b64enc | urlquery }}\n[View the identity provider and mapped users for this enterprise in Explore](/ui/explore?exploreSearchTab=cypher&searchType=cypher&cypherSearch={{ $encodedQuery }})\n{{ else }}\nExplore navigation is unavailable because this object has no stable identifier.\n{{ end }}"
77
+ "content": "{{ $objectID := .Properties.objectid | default \"\" | trim }}\n{{ $escapedObjectID := $objectID | replace \"\\\\\" \"\\\\\\\\\" | replace \"'\" \"\\\\'\" }}\n{{ if ne $objectID \"\" }}\n{{ $query := printf \"MATCH p = (selected:GH_Enterprise {objectid: '%s'})-[:GH_HasSamlIdentityProvider|GH_HasOidcIdentityProvider]->(idp:GH_IdentityProvider)\\nOPTIONAL MATCH p1 = (idp)-[:GH_HasExternalIdentity]->(:GH_ExternalIdentity)-[:GH_MapsToUser]->(:GH_User)\\nRETURN p, p1\\nLIMIT 500\" $escapedObjectID }}\n{{ $encodedQuery := $query | b64enc | urlquery }}\n[View the identity provider and mapped users for this enterprise in Explore](/ui/explore?exploreSearchTab=cypher&searchType=cypher&cypherSearch={{ $encodedQuery }})\n{{ else }}\nExplore navigation is unavailable because this object has no stable identifier.\n{{ end }}"
78
78
  }
79
79
  },
80
80
  "classic_personal_access_tokens": {
@@ -83,6 +83,13 @@
83
83
  "markdown": {
84
84
  "content": "{{ $objectID := .Properties.objectid | default \"\" | trim }}\n{{ $escapedObjectID := $objectID | replace \"\\\\\" \"\\\\\\\\\" | replace \"'\" \"\\\\'\" }}\n{{ if ne $objectID \"\" }}\n{{ $query := printf \"MATCH p = (selected:GH_Enterprise {objectid: '%s'})-[:GH_Contains]->(:GH_ClassicPersonalAccessToken)\\nRETURN p\\nLIMIT 500\" $escapedObjectID }}\n{{ $encodedQuery := $query | b64enc | urlquery }}\n[View classic personal access tokens in this enterprise in Explore](/ui/explore?exploreSearchTab=cypher&searchType=cypher&cypherSearch={{ $encodedQuery }})\n{{ else }}\nExplore navigation is unavailable because this object has no stable identifier.\n{{ end }}"
85
85
  }
86
+ },
87
+ "collector_app_installation": {
88
+ "title": "Collector App Installation",
89
+ "position": 11,
90
+ "markdown": {
91
+ "content": "{{ $objectID := .Properties.objectid | default \"\" | trim }}\n{{ $escapedObjectID := $objectID | replace \"\\\\\" \"\\\\\\\\\" | replace \"'\" \"\\\\'\" }}\n{{ if ne $objectID \"\" }}\n{{ $query := printf \"MATCH p = (selected:GH_Enterprise {objectid: '%s'})-[:GH_Contains]->(:GH_AppInstallation)\\nRETURN p\\nLIMIT 500\" $escapedObjectID }}\n{{ $encodedQuery := $query | b64enc | urlquery }}\n[View the collector app installation in this enterprise in Explore](/ui/explore?exploreSearchTab=cypher&searchType=cypher&cypherSearch={{ $encodedQuery }})\n{{ else }}\nExplore navigation is unavailable because this object has no stable identifier.\n{{ end }}"
92
+ }
86
93
  }
87
94
  }
88
95
  },
@@ -1631,10 +1638,62 @@
1631
1638
  }
1632
1639
  }
1633
1640
  },
1641
+ {
1642
+ "name": "GH_OidcIdentityProvider",
1643
+ "display_name": "GitHub OIDC Identity Provider",
1644
+ "description": "An OIDC identity provider configured for a GitHub Enterprise account",
1645
+ "is_display_kind": true,
1646
+ "icon": "id-badge",
1647
+ "color": "#5A6C8F",
1648
+ "info": {
1649
+ "description": {
1650
+ "title": "Description",
1651
+ "position": 1,
1652
+ "markdown": {
1653
+ "content": "## Overview\n\nRepresents an enterprise OIDC identity provider. The provider_type and tenant_id properties identify the provider and its tenant."
1654
+ }
1655
+ },
1656
+ "inbound_traversable_relationships": {
1657
+ "title": "Inbound Traversable GH Relationships",
1658
+ "position": 2,
1659
+ "markdown": {
1660
+ "content": "{{ $objectID := .Properties.objectid | default \"\" | trim }}\n{{ $escapedObjectID := $objectID | replace \"\\\\\" \"\\\\\\\\\" | replace \"'\" \"\\\\'\" }}\n{{ if ne $objectID \"\" }}\n{{ $query := printf \"MATCH p = (selected:GH_OidcIdentityProvider {objectid: '%s'})\\nWHERE false\\nRETURN p\\nLIMIT 500\" $escapedObjectID }}\n{{ $encodedQuery := $query | b64enc | urlquery }}\n[View direct inbound relationships in Explore](/ui/explore?exploreSearchTab=cypher&searchType=cypher&cypherSearch={{ $encodedQuery }})\n{{ else }}\nExplore navigation is unavailable because this object has no stable identifier.\n{{ end }}"
1661
+ }
1662
+ },
1663
+ "outbound_traversable_relationships": {
1664
+ "title": "Outbound Traversable GH Relationships",
1665
+ "position": 3,
1666
+ "markdown": {
1667
+ "content": "{{ $objectID := .Properties.objectid | default \"\" | trim }}\n{{ $escapedObjectID := $objectID | replace \"\\\\\" \"\\\\\\\\\" | replace \"'\" \"\\\\'\" }}\n{{ if ne $objectID \"\" }}\n{{ $query := printf \"MATCH p = (selected:GH_OidcIdentityProvider {objectid: '%s'})\\nWHERE false\\nRETURN p\\nLIMIT 500\" $escapedObjectID }}\n{{ $encodedQuery := $query | b64enc | urlquery }}\n[View direct outbound relationships in Explore](/ui/explore?exploreSearchTab=cypher&searchType=cypher&cypherSearch={{ $encodedQuery }})\n{{ else }}\nExplore navigation is unavailable because this object has no stable identifier.\n{{ end }}"
1668
+ }
1669
+ },
1670
+ "environment_context": {
1671
+ "title": "Environment Context",
1672
+ "position": 4,
1673
+ "markdown": {
1674
+ "content": "{{ $objectID := .Properties.objectid | default \"\" | trim }}\n{{ $escapedObjectID := $objectID | replace \"\\\\\" \"\\\\\\\\\" | replace \"'\" \"\\\\'\" }}\n{{ if ne $objectID \"\" }}\n{{ $query := printf \"MATCH p = (environment)-[:GH_HasOidcIdentityProvider]->(selected:GH_OidcIdentityProvider {objectid: '%s'})\\nWHERE environment:GH_Enterprise\\nRETURN p\\nLIMIT 500\" $escapedObjectID }}\n{{ $encodedQuery := $query | b64enc | urlquery }}\n[View the enterprise using this identity provider in Explore](/ui/explore?exploreSearchTab=cypher&searchType=cypher&cypherSearch={{ $encodedQuery }})\n{{ else }}\nExplore navigation is unavailable because this object has no stable identifier.\n{{ end }}"
1675
+ }
1676
+ },
1677
+ "external_identities": {
1678
+ "title": "External Identities",
1679
+ "position": 5,
1680
+ "markdown": {
1681
+ "content": "{{ $objectID := .Properties.objectid | default \"\" | trim }}\n{{ $escapedObjectID := $objectID | replace \"\\\\\" \"\\\\\\\\\" | replace \"'\" \"\\\\'\" }}\n{{ if ne $objectID \"\" }}\n{{ $query := printf \"MATCH p = (selected:GH_OidcIdentityProvider {objectid: '%s'})-[:GH_HasExternalIdentity]->(:GH_ExternalIdentity)\\nRETURN p\\nLIMIT 500\" $escapedObjectID }}\n{{ $encodedQuery := $query | b64enc | urlquery }}\n[View external identities from this provider in Explore](/ui/explore?exploreSearchTab=cypher&searchType=cypher&cypherSearch={{ $encodedQuery }})\n{{ else }}\nExplore navigation is unavailable because this object has no stable identifier.\n{{ end }}"
1682
+ }
1683
+ },
1684
+ "mapped_users": {
1685
+ "title": "Mapped Users",
1686
+ "position": 6,
1687
+ "markdown": {
1688
+ "content": "{{ $objectID := .Properties.objectid | default \"\" | trim }}\n{{ $escapedObjectID := $objectID | replace \"\\\\\" \"\\\\\\\\\" | replace \"'\" \"\\\\'\" }}\n{{ if ne $objectID \"\" }}\n{{ $query := printf \"MATCH p = (selected:GH_OidcIdentityProvider {objectid: '%s'})-[:GH_HasExternalIdentity]->(:GH_ExternalIdentity)-[:GH_MapsToUser]->(:GH_User)\\nRETURN p\\nLIMIT 500\" $escapedObjectID }}\n{{ $encodedQuery := $query | b64enc | urlquery }}\n[View GitHub users mapped through this identity provider in Explore](/ui/explore?exploreSearchTab=cypher&searchType=cypher&cypherSearch={{ $encodedQuery }})\n{{ else }}\nExplore navigation is unavailable because this object has no stable identifier.\n{{ end }}"
1689
+ }
1690
+ }
1691
+ }
1692
+ },
1634
1693
  {
1635
1694
  "name": "GH_ExternalIdentity",
1636
1695
  "display_name": "GitHub External Identity",
1637
- "description": "An external identity from a SAML/SCIM provider linked to a GitHub user for SSO authentication",
1696
+ "description": "An external identity from a SAML or OIDC provider with optional SCIM attributes and a linked GitHub user when available",
1638
1697
  "is_display_kind": true,
1639
1698
  "icon": "arrows-left-right",
1640
1699
  "color": "#8A8F98",
@@ -1643,7 +1702,7 @@
1643
1702
  "title": "Description",
1644
1703
  "position": 1,
1645
1704
  "markdown": {
1646
- "content": "## Overview\n\nRepresents an external identity from a SAML or SCIM identity provider that is linked to a GitHub user. This node preserves the identity-provider attributes used to understand how a corporate identity maps into GitHub."
1705
+ "content": "## Overview\n\nRepresents an external identity collected through a SAML or OIDC provider, with a linked GitHub user when available. This node preserves the identity-provider attributes used to understand how a corporate identity maps into GitHub."
1647
1706
  }
1648
1707
  },
1649
1708
  "inbound_traversable_relationships": {
@@ -1664,7 +1723,7 @@
1664
1723
  "title": "Identity Provider",
1665
1724
  "position": 4,
1666
1725
  "markdown": {
1667
- "content": "{{ $objectID := .Properties.objectid | default \"\" | trim }}\n{{ $escapedObjectID := $objectID | replace \"\\\\\" \"\\\\\\\\\" | replace \"'\" \"\\\\'\" }}\n{{ if ne $objectID \"\" }}\n{{ $query := printf \"MATCH p = (:GH_SamlIdentityProvider)-[:GH_HasExternalIdentity]->(selected:GH_ExternalIdentity {objectid: '%s'})\\nRETURN p\\nLIMIT 500\" $escapedObjectID }}\n{{ $encodedQuery := $query | b64enc | urlquery }}\n[View the identity provider containing this external identity in Explore](/ui/explore?exploreSearchTab=cypher&searchType=cypher&cypherSearch={{ $encodedQuery }})\n{{ else }}\nExplore navigation is unavailable because this object has no stable identifier.\n{{ end }}"
1726
+ "content": "{{ $objectID := .Properties.objectid | default \"\" | trim }}\n{{ $escapedObjectID := $objectID | replace \"\\\\\" \"\\\\\\\\\" | replace \"'\" \"\\\\'\" }}\n{{ if ne $objectID \"\" }}\n{{ $query := printf \"MATCH p = (:GH_IdentityProvider)-[:GH_HasExternalIdentity]->(selected:GH_ExternalIdentity {objectid: '%s'})\\nRETURN p\\nLIMIT 500\" $escapedObjectID }}\n{{ $encodedQuery := $query | b64enc | urlquery }}\n[View the identity provider containing this external identity in Explore](/ui/explore?exploreSearchTab=cypher&searchType=cypher&cypherSearch={{ $encodedQuery }})\n{{ else }}\nExplore navigation is unavailable because this object has no stable identifier.\n{{ end }}"
1668
1727
  }
1669
1728
  },
1670
1729
  "mapped_user": {
@@ -1688,7 +1747,7 @@
1688
1747
  "title": "Description",
1689
1748
  "position": 1,
1690
1749
  "markdown": {
1691
- "content": "## Overview\n\nRepresents a GitHub App definition. The app owner controls the private key used to generate installation tokens for every installation of this app, so compromise of the app can affect every organization where it is installed."
1750
+ "content": "## Overview\n\nRepresents a GitHub App definition. The `permissions` property records requested app permissions. Each installation records its own granted permissions. The app owner controls the private key used to generate installation tokens for its installations on organizations and enterprises.\n\n`environment_slug` records the organization login or enterprise slug for this collection context."
1692
1751
  }
1693
1752
  },
1694
1753
  "inbound_traversable_relationships": {
@@ -1769,7 +1828,7 @@
1769
1828
  {
1770
1829
  "name": "GH_AppInstallation",
1771
1830
  "display_name": "GitHub App Installation",
1772
- "description": "A GitHub App installed on the organization with specific permissions and repository access",
1831
+ "description": "A GitHub App installed on an organization or enterprise with a specific set of granted permissions",
1773
1832
  "is_display_kind": true,
1774
1833
  "icon": "plug",
1775
1834
  "color": "#A8D8EA",
@@ -1778,7 +1837,7 @@
1778
1837
  "title": "Description",
1779
1838
  "position": 1,
1780
1839
  "markdown": {
1781
- "content": "## Overview\n\nRepresents a GitHub App installed on an organization. Installations have a permission set and repository scope, and are linked back to the parent `GH_App` that owns the private key used to mint installation tokens."
1840
+ "content": "## Overview\n\nRepresents a GitHub App installed on an organization or enterprise. The `permissions` property records permissions granted to this installation; the parent `GH_App` records requested permissions.\n\nEnterprise collection currently includes only the authenticating collector app installation. Enterprise installations do not automatically grant access to organizations or repositories.\n\n`environment_slug` records the organization login or enterprise slug for this collection context."
1782
1841
  }
1783
1842
  },
1784
1843
  "inbound_traversable_relationships": {
@@ -1815,6 +1874,13 @@
1815
1874
  "markdown": {
1816
1875
  "content": "{{ $objectID := .Properties.objectid | default \"\" | trim }}\n{{ $escapedObjectID := $objectID | replace \"\\\\\" \"\\\\\\\\\" | replace \"'\" \"\\\\'\" }}\n{{ if ne $objectID \"\" }}\n{{ $query := printf \"MATCH p = (selected:GH_AppInstallation {objectid: '%s'})-[:GH_CanAccess|GH_ScopedTo*1..2]->(:GH_Repository)\\nRETURN p\\nLIMIT 500\" $escapedObjectID }}\n{{ $encodedQuery := $query | b64enc | urlquery }}\n[View repositories accessible to this app installation in Explore](/ui/explore?exploreSearchTab=cypher&searchType=cypher&cypherSearch={{ $encodedQuery }})\n{{ else }}\nExplore navigation is unavailable because this object has no stable identifier.\n{{ end }}"
1817
1876
  }
1877
+ },
1878
+ "enterprise_context": {
1879
+ "title": "Enterprise Context",
1880
+ "position": 7,
1881
+ "markdown": {
1882
+ "content": "{{ $objectID := .Properties.objectid | default \"\" | trim }}\n{{ $escapedObjectID := $objectID | replace \"\\\\\" \"\\\\\\\\\" | replace \"'\" \"\\\\'\" }}\n{{ if ne $objectID \"\" }}\n{{ $query := printf \"MATCH p = (:GH_Enterprise)-[:GH_Contains]->(selected:GH_AppInstallation {objectid: '%s'})\\nRETURN p\\nLIMIT 500\" $escapedObjectID }}\n{{ $encodedQuery := $query | b64enc | urlquery }}\n[View the enterprise containing this app installation in Explore](/ui/explore?exploreSearchTab=cypher&searchType=cypher&cypherSearch={{ $encodedQuery }})\n{{ else }}\nExplore navigation is unavailable because this object has no stable identifier.\n{{ end }}"
1883
+ }
1818
1884
  }
1819
1885
  }
1820
1886
  },
@@ -1966,6 +2032,12 @@
1966
2032
  }
1967
2033
  }
1968
2034
  }
2035
+ },
2036
+ {
2037
+ "name": "GH_IdentityProvider",
2038
+ "display_name": "GitHub Identity Provider",
2039
+ "description": "Shared secondary kind for GitHub SAML and OIDC identity providers",
2040
+ "is_display_kind": false
1969
2041
  }
1970
2042
  ],
1971
2043
  "relationship_kinds": [
@@ -2601,7 +2673,7 @@
2601
2673
  },
2602
2674
  {
2603
2675
  "name": "GH_HasExternalIdentity",
2604
- "description": "SAML identity provider has this external identity",
2676
+ "description": "SAML or OIDC identity provider has this external identity",
2605
2677
  "is_traversable": false
2606
2678
  },
2607
2679
  {
@@ -2748,6 +2820,11 @@
2748
2820
  "name": "GH_ApprovesDeploymentTo",
2749
2821
  "description": "User or team is configured as a required reviewer for this environment",
2750
2822
  "is_traversable": false
2823
+ },
2824
+ {
2825
+ "name": "GH_HasOidcIdentityProvider",
2826
+ "description": "Enterprise has this OIDC identity provider configured",
2827
+ "is_traversable": false
2751
2828
  }
2752
2829
  ],
2753
2830
  "environments": [