openhound-github 0.3.6__tar.gz → 0.4.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 (373) hide show
  1. {openhound_github-0.3.6 → openhound_github-0.4.0}/PKG-INFO +9 -1
  2. {openhound_github-0.3.6 → openhound_github-0.4.0}/README.md +8 -0
  3. openhound_github-0.4.0/descriptions/edges/GH_AddMember.md +3 -0
  4. openhound_github-0.4.0/descriptions/edges/GH_AdminTo.md +3 -0
  5. openhound_github-0.4.0/descriptions/edges/GH_ApprovesDeploymentTo.md +7 -0
  6. openhound_github-0.4.0/descriptions/edges/GH_CanCreateEnvironment.md +5 -0
  7. openhound_github-0.4.0/descriptions/edges/GH_CanDeployToEnvironment.md +7 -0
  8. openhound_github-0.4.0/descriptions/edges/GH_CanEditEnvironment.md +15 -0
  9. openhound_github-0.4.0/descriptions/edges/GH_Contains.md +3 -0
  10. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_DeploysTo.md +1 -1
  11. openhound_github-0.4.0/descriptions/edges/GH_HasBranch.md +3 -0
  12. openhound_github-0.4.0/descriptions/edges/GH_HasEnvironment.md +3 -0
  13. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_HasSecret.md +1 -1
  14. openhound_github-0.4.0/descriptions/edges/GH_HasVariable.md +3 -0
  15. openhound_github-0.4.0/descriptions/edges/GH_MatchesEnvironmentPolicy.md +7 -0
  16. openhound_github-0.4.0/descriptions/edges/GH_UsesSecret.md +20 -0
  17. openhound_github-0.4.0/descriptions/edges/GH_UsesVariable.md +20 -0
  18. openhound_github-0.4.0/descriptions/nodes/GH_Environment.md +5 -0
  19. openhound_github-0.4.0/descriptions/nodes/GH_EnvironmentBranchPolicy.md +5 -0
  20. openhound_github-0.4.0/descriptions/nodes/GH_EnvironmentSecret.md +5 -0
  21. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/nodes/GH_EnvironmentVariable.md +2 -0
  22. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/environments-admin-bypass.json +1 -1
  23. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/repository-workflows.json +1 -1
  24. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/unprotected-branches.json +1 -1
  25. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/unprotected-default-branch-with-workflow.json +1 -1
  26. openhound_github-0.4.0/extension/saved_searches/unprotected-default-branches.json +5 -0
  27. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/schema.json +188 -34
  28. {openhound_github-0.3.6 → openhound_github-0.4.0}/pyproject.toml +1 -1
  29. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/graphql.py +36 -62
  30. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/helpers.py +2 -5
  31. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/kinds/edges.py +53 -3
  32. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/kinds/nodes.py +19 -1
  33. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/lookup.py +97 -4
  34. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/main.py +1 -0
  35. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/__init__.py +10 -5
  36. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/branch.py +6 -6
  37. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/enterprise_organization.py +3 -1
  38. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/enterprise_role.py +78 -0
  39. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/enterprise_team.py +14 -0
  40. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/enterprise_team_organization.py +1 -1
  41. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/enterprise_user.py +19 -0
  42. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/env_secret.py +14 -1
  43. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/env_variable.py +14 -1
  44. openhound_github-0.4.0/src/openhound_github/models/environment.py +494 -0
  45. openhound_github-0.4.0/src/openhound_github/models/environment_branch_policy.py +172 -0
  46. openhound_github-0.4.0/src/openhound_github/models/external_identity.py +367 -0
  47. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/org_role.py +71 -29
  48. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/org_secret.py +44 -7
  49. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/org_variable.py +47 -11
  50. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/repo_role_assignment.py +3 -0
  51. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/repository.py +16 -4
  52. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/repository_role.py +49 -1
  53. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/repository_variable.py +2 -2
  54. openhound_github-0.4.0/src/openhound_github/models/saml_assertion_consumer_service.py +126 -0
  55. openhound_github-0.4.0/src/openhound_github/models/saml_helpers.py +332 -0
  56. openhound_github-0.4.0/src/openhound_github/models/saml_issuer.py +117 -0
  57. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/saml_provider.py +37 -16
  58. openhound_github-0.4.0/src/openhound_github/models/saml_service_provider.py +134 -0
  59. openhound_github-0.4.0/src/openhound_github/models/scim_user.py +337 -0
  60. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/secret_scanning_alert.py +4 -2
  61. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/team.py +3 -3
  62. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/user.py +2 -2
  63. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/workflow.py +24 -21
  64. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/workflow_job.py +14 -4
  65. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/workflow_step.py +71 -18
  66. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/resources/enterprise.py +306 -74
  67. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/resources/organization.py +102 -13
  68. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/source.py +70 -15
  69. openhound_github-0.4.0/src/openhound_github/transforms.py +202 -0
  70. openhound_github-0.4.0/tests/test_branch_collection_gate.py +103 -0
  71. openhound_github-0.4.0/tests/test_branch_protection_traversability.py +75 -0
  72. openhound_github-0.4.0/tests/test_enterprise_capabilities.py +135 -0
  73. openhound_github-0.4.0/tests/test_enterprise_organization.py +94 -0
  74. openhound_github-0.4.0/tests/test_enterprise_resources.py +161 -0
  75. openhound_github-0.4.0/tests/test_environment_model.py +259 -0
  76. openhound_github-0.4.0/tests/test_external_identity_tenant_matching.py +242 -0
  77. openhound_github-0.4.0/tests/test_org_secret_models.py +112 -0
  78. openhound_github-0.4.0/tests/test_repository_rulesets.py +137 -0
  79. openhound_github-0.4.0/tests/test_saml_helpers.py +70 -0
  80. openhound_github-0.4.0/tests/test_saml_models.py +278 -0
  81. openhound_github-0.4.0/tests/test_scim_models.py +162 -0
  82. openhound_github-0.4.0/tests/test_variable_models.py +19 -0
  83. openhound_github-0.4.0/tests/test_workflow_model.py +147 -0
  84. openhound_github-0.3.6/descriptions/edges/GH_AddMember.md +0 -3
  85. openhound_github-0.3.6/descriptions/edges/GH_AdminTo.md +0 -3
  86. openhound_github-0.3.6/descriptions/edges/GH_Contains.md +0 -3
  87. openhound_github-0.3.6/descriptions/edges/GH_HasBranch.md +0 -3
  88. openhound_github-0.3.6/descriptions/edges/GH_HasEnvironment.md +0 -3
  89. openhound_github-0.3.6/descriptions/edges/GH_HasVariable.md +0 -3
  90. openhound_github-0.3.6/descriptions/edges/GH_UsesSecret.md +0 -19
  91. openhound_github-0.3.6/descriptions/edges/GH_UsesVariable.md +0 -19
  92. openhound_github-0.3.6/descriptions/nodes/GH_Environment.md +0 -3
  93. openhound_github-0.3.6/descriptions/nodes/GH_EnvironmentSecret.md +0 -3
  94. openhound_github-0.3.6/extension/saved_searches/unprotected-default-branches.json +0 -5
  95. openhound_github-0.3.6/src/openhound_github/models/enterprise_external_identity.py +0 -202
  96. openhound_github-0.3.6/src/openhound_github/models/enterprise_saml_provider.py +0 -122
  97. openhound_github-0.3.6/src/openhound_github/models/environment.py +0 -171
  98. openhound_github-0.3.6/src/openhound_github/models/environment_branch_policy.py +0 -56
  99. openhound_github-0.3.6/src/openhound_github/models/external_identity.py +0 -262
  100. openhound_github-0.3.6/src/openhound_github/models/scim_user.py +0 -25
  101. openhound_github-0.3.6/src/openhound_github/transforms.py +0 -100
  102. {openhound_github-0.3.6 → openhound_github-0.4.0}/.github/CODE_OF_CONDUCT.md +0 -0
  103. {openhound_github-0.3.6 → openhound_github-0.4.0}/.github/CONTRIBUTING.md +0 -0
  104. {openhound_github-0.3.6 → openhound_github-0.4.0}/.github/GOVERNANCE.md +0 -0
  105. {openhound_github-0.3.6 → openhound_github-0.4.0}/.github/GitHub-COC-Header.png +0 -0
  106. {openhound_github-0.3.6 → openhound_github-0.4.0}/.github/GitHub-CONTRIB-Header.png +0 -0
  107. {openhound_github-0.3.6 → openhound_github-0.4.0}/.github/GitHub-GOV-Header.png +0 -0
  108. {openhound_github-0.3.6 → openhound_github-0.4.0}/.github/GitHub-Header.png +0 -0
  109. {openhound_github-0.3.6 → openhound_github-0.4.0}/.github/GitHub-LIC-Header.png +0 -0
  110. {openhound_github-0.3.6 → openhound_github-0.4.0}/.github/GitHub-SEC-Header.png +0 -0
  111. {openhound_github-0.3.6 → openhound_github-0.4.0}/.github/SECURITY.md +0 -0
  112. {openhound_github-0.3.6 → openhound_github-0.4.0}/.github/SO-Dark.svg +0 -0
  113. {openhound_github-0.3.6 → openhound_github-0.4.0}/.github/SO-FOSS-Dark.svg +0 -0
  114. {openhound_github-0.3.6 → openhound_github-0.4.0}/.github/SO-FOSS-Light.svg +0 -0
  115. {openhound_github-0.3.6 → openhound_github-0.4.0}/.github/SO-Light.svg +0 -0
  116. {openhound_github-0.3.6 → openhound_github-0.4.0}/.github/workflows/publish.yml +0 -0
  117. {openhound_github-0.3.6 → openhound_github-0.4.0}/.github/workflows/release-on-merge.yml +0 -0
  118. {openhound_github-0.3.6 → openhound_github-0.4.0}/.github/workflows/validate-branch.yml +0 -0
  119. {openhound_github-0.3.6 → openhound_github-0.4.0}/.gitignore +0 -0
  120. {openhound_github-0.3.6 → openhound_github-0.4.0}/.gitmodules +0 -0
  121. {openhound_github-0.3.6 → openhound_github-0.4.0}/.pre-commit-config.yaml +0 -0
  122. {openhound_github-0.3.6 → openhound_github-0.4.0}/LICENSE.md +0 -0
  123. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_AddAssignee.md +0 -0
  124. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_AddCollaborator.md +0 -0
  125. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_AddLabel.md +0 -0
  126. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_BypassBranchProtection.md +0 -0
  127. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_BypassPullRequestAllowances.md +0 -0
  128. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_CallsWorkflow.md +0 -0
  129. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_CanAccess.md +0 -0
  130. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_CanAssumeIdentity.md +0 -0
  131. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_CanCreateBranch.md +0 -0
  132. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_CanEditProtection.md +0 -0
  133. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_CanPwnRequest.md +0 -0
  134. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_CanReadSecretScanningAlert.md +0 -0
  135. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_CanWriteBranch.md +0 -0
  136. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_CloseDiscussion.md +0 -0
  137. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_CloseIssue.md +0 -0
  138. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_ClosePullRequest.md +0 -0
  139. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_ConvertIssuesToDiscussions.md +0 -0
  140. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_CreateDiscussionCategory.md +0 -0
  141. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_CreateRepository.md +0 -0
  142. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_CreateSoloMergeQueueEntry.md +0 -0
  143. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_CreateTag.md +0 -0
  144. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_CreateTeam.md +0 -0
  145. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_DeleteAlertsCodeScanning.md +0 -0
  146. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_DeleteDiscussion.md +0 -0
  147. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_DeleteDiscussionComment.md +0 -0
  148. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_DeleteIssue.md +0 -0
  149. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_DeleteTag.md +0 -0
  150. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_DependsOn.md +0 -0
  151. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_EditCategoryOnDiscussion.md +0 -0
  152. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_EditDiscussionCategory.md +0 -0
  153. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_EditDiscussionComment.md +0 -0
  154. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_EditRepoAnnouncementBanners.md +0 -0
  155. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_EditRepoCustomPropertiesValues.md +0 -0
  156. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_EditRepoMetadata.md +0 -0
  157. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_EditRepoProtections.md +0 -0
  158. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_HasBaseRole.md +0 -0
  159. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_HasExternalIdentity.md +0 -0
  160. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_HasJob.md +0 -0
  161. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_HasMember.md +0 -0
  162. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_HasPersonalAccessToken.md +0 -0
  163. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_HasPersonalAccessTokenRequest.md +0 -0
  164. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_HasRole.md +0 -0
  165. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_HasSamlIdentityProvider.md +0 -0
  166. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_HasStep.md +0 -0
  167. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_HasWorkflow.md +0 -0
  168. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_InstalledAs.md +0 -0
  169. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_InviteMember.md +0 -0
  170. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_JumpMergeQueue.md +0 -0
  171. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_ManageDeployKeys.md +0 -0
  172. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_ManageDiscussionBadges.md +0 -0
  173. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_ManageOrganizationWebhooks.md +0 -0
  174. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_ManageRepoSecurityProducts.md +0 -0
  175. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_ManageSecurityProducts.md +0 -0
  176. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_ManageSettingsMergeTypes.md +0 -0
  177. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_ManageSettingsPages.md +0 -0
  178. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_ManageSettingsProjects.md +0 -0
  179. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_ManageSettingsWiki.md +0 -0
  180. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_ManageTopics.md +0 -0
  181. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_ManageWebhooks.md +0 -0
  182. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_MapsToUser.md +0 -0
  183. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_MarkAsDuplicate.md +0 -0
  184. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_MemberOf.md +0 -0
  185. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_OrgBypassCodeScanningDismissalRequests.md +0 -0
  186. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_OrgBypassSecretScanningClosureRequests.md +0 -0
  187. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_OrgReviewAndManageSecretScanningBypassRequests.md +0 -0
  188. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_OrgReviewAndManageSecretScanningClosureRequests.md +0 -0
  189. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_Owns.md +0 -0
  190. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_ProtectedBy.md +0 -0
  191. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_PushProtectedBranch.md +0 -0
  192. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_ReadCodeScanning.md +0 -0
  193. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_ReadOrganizationActionsUsageMetrics.md +0 -0
  194. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_ReadOrganizationCustomOrgRole.md +0 -0
  195. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_ReadOrganizationCustomRepoRole.md +0 -0
  196. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_ReadRepoContents.md +0 -0
  197. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_RemoveAssignee.md +0 -0
  198. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_RemoveLabel.md +0 -0
  199. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_ReopenDiscussion.md +0 -0
  200. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_ReopenIssue.md +0 -0
  201. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_ReopenPullRequest.md +0 -0
  202. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_RequestPrReview.md +0 -0
  203. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_ResolveDependabotAlerts.md +0 -0
  204. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_ResolveSecretScanningAlerts.md +0 -0
  205. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_RestrictionsCanPush.md +0 -0
  206. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_RunOrgMigration.md +0 -0
  207. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_SetInteractionLimits.md +0 -0
  208. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_SetIssueType.md +0 -0
  209. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_SetMilestone.md +0 -0
  210. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_SetSocialPreview.md +0 -0
  211. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_SyncedTo.md +0 -0
  212. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_ToggleDiscussionAnswer.md +0 -0
  213. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_ToggleDiscussionCommentMinimize.md +0 -0
  214. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_TransferRepository.md +0 -0
  215. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_ValidToken.md +0 -0
  216. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_ViewDependabotAlerts.md +0 -0
  217. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_ViewSecretScanningAlerts.md +0 -0
  218. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_WriteCodeScanning.md +0 -0
  219. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_WriteOrganizationActionsSecrets.md +0 -0
  220. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_WriteOrganizationActionsSettings.md +0 -0
  221. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_WriteOrganizationActionsVariables.md +0 -0
  222. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_WriteOrganizationCustomOrgRole.md +0 -0
  223. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_WriteOrganizationCustomRepoRole.md +0 -0
  224. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_WriteOrganizationNetworkConfigurations.md +0 -0
  225. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_WriteRepoContents.md +0 -0
  226. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/edges/GH_WriteRepoPullRequests.md +0 -0
  227. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/nodes/GH_App.md +0 -0
  228. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/nodes/GH_AppInstallation.md +0 -0
  229. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/nodes/GH_Branch.md +0 -0
  230. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/nodes/GH_BranchProtectionRule.md +0 -0
  231. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/nodes/GH_ExternalIdentity.md +0 -0
  232. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/nodes/GH_OrgRole.md +0 -0
  233. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/nodes/GH_OrgSecret.md +0 -0
  234. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/nodes/GH_OrgVariable.md +0 -0
  235. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/nodes/GH_Organization.md +0 -0
  236. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/nodes/GH_PersonalAccessToken.md +0 -0
  237. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/nodes/GH_PersonalAccessTokenRequest.md +0 -0
  238. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/nodes/GH_RepoRole.md +0 -0
  239. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/nodes/GH_RepoSecret.md +0 -0
  240. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/nodes/GH_RepoVariable.md +0 -0
  241. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/nodes/GH_Repository.md +0 -0
  242. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/nodes/GH_SamlIdentityProvider.md +0 -0
  243. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/nodes/GH_SecretScanningAlert.md +0 -0
  244. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/nodes/GH_Team.md +0 -0
  245. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/nodes/GH_TeamRole.md +0 -0
  246. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/nodes/GH_User.md +0 -0
  247. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/nodes/GH_Workflow.md +0 -0
  248. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/nodes/GH_WorkflowJob.md +0 -0
  249. {openhound_github-0.3.6 → openhound_github-0.4.0}/descriptions/nodes/GH_WorkflowStep.md +0 -0
  250. {openhound_github-0.3.6 → openhound_github-0.4.0}/docs/og-docs.json +0 -0
  251. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/privilege_zone_rules/t0-all-repo-admin-role.json +0 -0
  252. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/privilege_zone_rules/t0-app-installations-all-repos.json +0 -0
  253. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/privilege_zone_rules/t0-apps-all-repos.json +0 -0
  254. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/privilege_zone_rules/t0-external-identities-owners.json +0 -0
  255. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/privilege_zone_rules/t0-organizations.json +0 -0
  256. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/privilege_zone_rules/t0-owner-users.json +0 -0
  257. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/privilege_zone_rules/t0-owners-role.json +0 -0
  258. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/privilege_zone_rules/t0-pats-all-repos.json +0 -0
  259. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/privilege_zone_rules/t0-privilege-escalation-roles.json +0 -0
  260. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/privilege_zone_rules/t0-privilege-escalation-users.json +0 -0
  261. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/privilege_zone_rules/t0-saml-identity-providers.json +0 -0
  262. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/README.md +0 -0
  263. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/actions-sha-pinning-not-required.json +0 -0
  264. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/active-leaked-secrets.json +0 -0
  265. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/advanced-security-disabled-new-repos.json +0 -0
  266. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/all-actions-allowed.json +0 -0
  267. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/app-installations-all-repos.json +0 -0
  268. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/branch-protection-admins-not-enforced.json +0 -0
  269. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/branch-protection-deletions-allowed.json +0 -0
  270. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/branch-protection-force-pushes.json +0 -0
  271. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/branch-protection-no-code-owner-reviews.json +0 -0
  272. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/branch-protection-no-pr-reviews.json +0 -0
  273. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/branch-protection-no-status-checks.json +0 -0
  274. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/branch-protection-self-approval.json +0 -0
  275. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/branch-protection-stale-reviews.json +0 -0
  276. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/bypass-pr-requirements.json +0 -0
  277. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/dangerous-branch-perms.json +0 -0
  278. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/default-repository-permissions.json +0 -0
  279. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/demo-sso-to-cloud-round-trip.json +0 -0
  280. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/dependabot-alerts-disabled-new-repos.json +0 -0
  281. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/dependabot-updates-disabled-new-repos.json +0 -0
  282. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/dependency-graph-disabled-new-repos.json +0 -0
  283. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/expired-pats.json +0 -0
  284. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/external-identities-without-scim.json +0 -0
  285. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/github-to-azure-identity.json +0 -0
  286. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/global-repo-perms.json +0 -0
  287. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/hybrid-identities.json +0 -0
  288. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/members-can-change-repo-visibility.json +0 -0
  289. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/members-can-create-pages.json +0 -0
  290. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/members-can-create-public-repos.json +0 -0
  291. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/members-can-delete-repos.json +0 -0
  292. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/members-can-fork-private-repos.json +0 -0
  293. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/members-can-invite-outside-collaborators.json +0 -0
  294. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/org-owners.json +0 -0
  295. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/orgs-without-2fa.json +0 -0
  296. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/pats-all-repo-access.json +0 -0
  297. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/pending-pat-requests.json +0 -0
  298. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/private-repos-forking-allowed.json +0 -0
  299. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/privileged-custom-org-roles.json +0 -0
  300. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/privileged-hybrid-identities.json +0 -0
  301. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/public-repos.json +0 -0
  302. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/push-protection-disabled-new-repos.json +0 -0
  303. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/push-to-protected-branches.json +0 -0
  304. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/repos-secret-scanning-disabled.json +0 -0
  305. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/repos-vulnerable-to-workflow-secret-exfil.json +0 -0
  306. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/saml-configuration.json +0 -0
  307. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/secret-scanning-alerts.json +0 -0
  308. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/secret-scanning-disabled-new-repos.json +0 -0
  309. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/secrets-reachable-by-user.json +0 -0
  310. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/team-membership-admin.json +0 -0
  311. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/team-structure.json +0 -0
  312. {openhound_github-0.3.6 → openhound_github-0.4.0}/extension/saved_searches/web-commit-signoff-not-required.json +0 -0
  313. {openhound_github-0.3.6 → openhound_github-0.4.0}/justfile +0 -0
  314. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/main.py +0 -0
  315. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/__init__.py +0 -0
  316. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/auth.py +0 -0
  317. {openhound_github-0.3.6 → openhound_github-0.4.0/src/openhound_github}/extension.yaml +0 -0
  318. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/graph.py +0 -0
  319. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/actions_permission.py +0 -0
  320. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/app_installation.py +0 -0
  321. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/branch_pr_bypass_allowance.py +0 -0
  322. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/branch_protection_rule.py +0 -0
  323. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/branch_push_allowance.py +0 -0
  324. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/enterprise.py +0 -0
  325. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/enterprise_admin.py +0 -0
  326. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/enterprise_helpers.py +0 -0
  327. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/enterprise_managed_user.py +0 -0
  328. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/enterprise_member.py +0 -0
  329. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/enterprise_role_team.py +0 -0
  330. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/enterprise_role_user.py +0 -0
  331. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/enterprise_team_member.py +0 -0
  332. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/enterprise_team_role.py +0 -0
  333. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/org.py +0 -0
  334. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/org_role_member.py +0 -0
  335. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/org_role_team.py +0 -0
  336. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/personal_access_token.py +0 -0
  337. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/personal_access_token_access.py +0 -0
  338. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/personal_access_token_request.py +0 -0
  339. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/projected_enterprise_team.py +0 -0
  340. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/repository_secret.py +0 -0
  341. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/runner.py +0 -0
  342. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/team_member.py +0 -0
  343. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/models/team_role.py +0 -0
  344. {openhound_github-0.3.6 → openhound_github-0.4.0}/src/openhound_github/resources/__init__.py +0 -0
  345. {openhound_github-0.3.6 → openhound_github-0.4.0}/tests/test_data/api/actions-permissions.json +0 -0
  346. {openhound_github-0.3.6 → openhound_github-0.4.0}/tests/test_data/api/actionsecrets.json +0 -0
  347. {openhound_github-0.3.6 → openhound_github-0.4.0}/tests/test_data/api/app.json +0 -0
  348. {openhound_github-0.3.6 → openhound_github-0.4.0}/tests/test_data/api/appinstalls.json +0 -0
  349. {openhound_github-0.3.6 → openhound_github-0.4.0}/tests/test_data/api/branch-policies.json +0 -0
  350. {openhound_github-0.3.6 → openhound_github-0.4.0}/tests/test_data/api/branch-prot-rules.json +0 -0
  351. {openhound_github-0.3.6 → openhound_github-0.4.0}/tests/test_data/api/branches.json +0 -0
  352. {openhound_github-0.3.6 → openhound_github-0.4.0}/tests/test_data/api/custom-roles.json +0 -0
  353. {openhound_github-0.3.6 → openhound_github-0.4.0}/tests/test_data/api/environments.json +0 -0
  354. {openhound_github-0.3.6 → openhound_github-0.4.0}/tests/test_data/api/org-pat-request.json +0 -0
  355. {openhound_github-0.3.6 → openhound_github-0.4.0}/tests/test_data/api/org-pat.json +0 -0
  356. {openhound_github-0.3.6 → openhound_github-0.4.0}/tests/test_data/api/org-role-teams.json +0 -0
  357. {openhound_github-0.3.6 → openhound_github-0.4.0}/tests/test_data/api/org-role-users.json +0 -0
  358. {openhound_github-0.3.6 → openhound_github-0.4.0}/tests/test_data/api/org-roles.json +0 -0
  359. {openhound_github-0.3.6 → openhound_github-0.4.0}/tests/test_data/api/org.json +0 -0
  360. {openhound_github-0.3.6 → openhound_github-0.4.0}/tests/test_data/api/pat-repositories.json +0 -0
  361. {openhound_github-0.3.6 → openhound_github-0.4.0}/tests/test_data/api/repo-collaborators.json +0 -0
  362. {openhound_github-0.3.6 → openhound_github-0.4.0}/tests/test_data/api/repo-teams.json +0 -0
  363. {openhound_github-0.3.6 → openhound_github-0.4.0}/tests/test_data/api/repositories.json +0 -0
  364. {openhound_github-0.3.6 → openhound_github-0.4.0}/tests/test_data/api/scimusers.json +0 -0
  365. {openhound_github-0.3.6 → openhound_github-0.4.0}/tests/test_data/api/secrets.json +0 -0
  366. {openhound_github-0.3.6 → openhound_github-0.4.0}/tests/test_data/api/secretscanningalert.json +0 -0
  367. {openhound_github-0.3.6 → openhound_github-0.4.0}/tests/test_data/api/selected-org-secrets.json +0 -0
  368. {openhound_github-0.3.6 → openhound_github-0.4.0}/tests/test_data/api/variables.json +0 -0
  369. {openhound_github-0.3.6 → openhound_github-0.4.0}/tests/test_data/api/workflows.json +0 -0
  370. {openhound_github-0.3.6 → openhound_github-0.4.0}/tests/test_error_resilience.py +0 -0
  371. {openhound_github-0.3.6 → openhound_github-0.4.0}/tests/test_github_rest_client.py +0 -0
  372. {openhound_github-0.3.6 → openhound_github-0.4.0}/tests/test_github_retry.py +0 -0
  373. {openhound_github-0.3.6 → openhound_github-0.4.0}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: openhound-github
3
- Version: 0.3.6
3
+ Version: 0.4.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,14 @@ The openhound-github extension collects resources from Github organizations and
45
45
  edges for
46
46
  BloodHound.
47
47
 
48
+ ### Enterprise SCIM and hybrid correlations
49
+
50
+ When `SOURCES__GITHUB__COLLECT_ENTERPRISE_SCIM=true`, 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.
51
+
52
+ `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.
53
+
54
+ 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.
55
+
48
56
  [![Python Version](https://img.shields.io/badge/Python-3.13-brightgreen.svg)](#about)
49
57
 
50
58
  ## Getting Started
@@ -34,6 +34,14 @@ The openhound-github extension collects resources from Github organizations and
34
34
  edges for
35
35
  BloodHound.
36
36
 
37
+ ### Enterprise SCIM and hybrid correlations
38
+
39
+ When `SOURCES__GITHUB__COLLECT_ENTERPRISE_SCIM=true`, 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.
40
+
41
+ `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.
42
+
43
+ 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.
44
+
37
45
  [![Python Version](https://img.shields.io/badge/Python-3.13-brightgreen.svg)](#about)
38
46
 
39
47
  ## Getting Started
@@ -0,0 +1,3 @@
1
+ ## General Information
2
+
3
+ The non-traversable GH_AddMember edge indicates that a team role with the Maintainer permission level can add new members to the team. Maintainers already inherit the team's repository permissions through GH_MemberOf, so this edge preserves the membership-management capability as context without creating a second access path to the same team.
@@ -0,0 +1,3 @@
1
+ ## General Information
2
+
3
+ The traversable GH_AdminTo edge represents a role's full administrative access to the repository. Admin is the highest built-in repository role and grants control over all repository settings, including dangerous operations like deleting the repository or modifying its visibility. Admin access bypasses most protections including branch protection rules, unless `enforce_admins` is explicitly enabled on the branch protection rule. This edge is a key permission in the computed branch access model and is a high-value target in attack path analysis.
@@ -0,0 +1,7 @@
1
+ ## General Information
2
+
3
+ The non-traversable GH_ApprovesDeploymentTo edge represents that a user or team is configured as a required reviewer for a GitHub Environment.
4
+
5
+ This edge is emitted from GH_User or GH_Team nodes to GH_Environment nodes when the environment includes a required reviewer protection rule. Required reviewers act as an approval gate before jobs referencing the environment can continue.
6
+
7
+ The edge is non-traversable because it records reviewer configuration rather than direct deployment access. When self-review is allowed, the same reviewer may also receive a traversable GH_CanDeployToEnvironment edge because they can satisfy the approval gate themselves. When prevent_self_review is enabled, GH_ApprovesDeploymentTo remains context only because the split-principal approval flow is not currently modeled.
@@ -0,0 +1,5 @@
1
+ ## General Information
2
+
3
+ The traversable GH_CanCreateEnvironment edge is a computed edge indicating that a repository role can cause a new GitHub environment to be created in the repository. This is derived from the ability to create and modify runnable branches/workflows: if a workflow references an environment name that does not already exist, GitHub will create that environment automatically.
4
+
5
+ This edge is useful for modeling OIDC and deployment scenarios where trust is tied to an environment name. An attacker who can create a new environment through workflow changes may be able to instantiate a trusted environment on demand, even if it was not previously configured.
@@ -0,0 +1,7 @@
1
+ ## General Information
2
+
3
+ The traversable GH_CanDeployToEnvironment edge represents the ability for a repository, branch, repository role, or self-approving reviewer to satisfy the modeled deployment constraints for a GitHub Environment.
4
+
5
+ This edge is computed from environment deployment branch policy, branch protection state, required reviewer behavior, and administrator bypass behavior. For environments without required reviewers, unrestricted environments emit repository and branch edges, protected-branch-only environments emit edges only for protected branches unless no branch protection rules exist, and custom branch policies emit edges only for matching branches.
6
+
7
+ When required reviewers are configured and self-review is allowed, the configured GH_User or GH_Team reviewer receives GH_CanDeployToEnvironment because that reviewer can satisfy the approval gate themselves. When prevent_self_review is enabled, no direct deploy edge is emitted for the reviewer because the required split-principal flow is not currently modeled. GH_ApprovesDeploymentTo remains non-traversable reviewer context in both cases.
@@ -0,0 +1,15 @@
1
+ ## General Information
2
+
3
+ The traversable GH_CanEditEnvironment edge indicates that a repository role can modify the configuration of a GitHub environment. In the current model, this edge is emitted for the repository's built-in `admin` role to every environment contained in that repository.
4
+
5
+ Editing an environment is security-relevant because environment configuration controls deployment protections such as required reviewers, self-review restrictions, wait timers, deployment branch policies, and the "allow administrators to bypass configured protection rules" setting. An attacker who can edit an environment may be able to weaken or remove those controls, making later deployment and secret access paths possible.
6
+
7
+ This edge is distinct from GH_CanDeployToEnvironment:
8
+
9
+ - **GH_CanEditEnvironment** means the role can manage the environment's settings.
10
+ - **GH_CanDeployToEnvironment** means the source satisfies the modeled deployment policy, reviewer gate, or administrator bypass condition for the environment.
11
+
12
+ ```mermaid
13
+ graph LR
14
+ role["GH_RepoRole admin"] ==>|GH_CanEditEnvironment| env["GH_Environment production"]
15
+ ```
@@ -0,0 +1,3 @@
1
+ ## General Information
2
+
3
+ The non-traversable GH_Contains edge represents structural containment within the GitHub resource hierarchy. The organization serves as the top-level container for users, teams, repositories, roles, secrets, app installations, and personal access tokens. Repositories contain branches, workflows, branch protection rules, environments, and repo-level secrets and variables. 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.
@@ -1,3 +1,3 @@
1
1
  ## General Information
2
2
 
3
- The non-traversable GH_DeploysTo edge links a workflow job to the GitHub Environment it targets via the `environment:` key. This edge records which jobs deploy to which environments. Environments can gate deployments with protection rules (required reviewers, wait timers, deployment branch policies) and can expose environment-scoped secrets.
3
+ The non-traversable GH_DeploysTo edge links a workflow job to the GitHub Environment it targets via the `environment:` key. This edge records which jobs deploy to which environments. Environments can gate deployments with protection rules (required reviewers, wait timers, deployment branch policies) and can expose environment-scoped secrets and variables.
@@ -0,0 +1,3 @@
1
+ ## General Information
2
+
3
+ The non-traversable GH_Contains edge represents the relationship between a repository and its branches. This edge links each collected branch to its parent repository. It is a structural edge that provides the foundation for understanding branch-level protections and access controls. While not traversable itself, it connects repositories to branches where traversable edges like GH_CanWriteBranch and GH_CanEditProtection model the effective access.
@@ -0,0 +1,3 @@
1
+ ## General Information
2
+
3
+ Environment containment is modeled with the non-traversable GH_Contains edge from a repository to each deployment environment it defines. Branch deployment eligibility is modeled separately with GH_CanDeployToEnvironment and GH_MatchesEnvironmentPolicy rather than a containment edge. Environments are security-relevant because they can gate access to secrets and cloud credentials, and their deployment branch policies control which branches can trigger deployments.
@@ -1,3 +1,3 @@
1
1
  ## General Information
2
2
 
3
- The traversable GH_HasSecret edge represents the relationship between a repository or environment and the secrets accessible within that context. This edge shows which secrets are available in which scopes. Repositories can have access to both organization-level secrets (scoped to selected repositories) and repository-level secrets, while environments contain their own environment-scoped secrets. This edge is traversable because any principal that can push code to a repository (via GH_CanWriteBranch or GH_CanCreateBranch) can write a workflow that exfiltrates the secret values at runtime, making this a meaningful link in attack path analysis.
3
+ The traversable GH_HasSecret edge represents the relationship between a repository or environment and the secrets accessible within that context. This edge shows which secrets are available in which scopes. Repositories can have access to both organization-level secrets (scoped to selected repositories) and repository-level secrets, while environments expose their own environment-scoped secrets to jobs that target them. This edge is traversable because any principal that can execute a workflow in the relevant context may be able to exfiltrate secret values at runtime, making this a meaningful link in attack path analysis.
@@ -0,0 +1,3 @@
1
+ ## General Information
2
+
3
+ The traversable GH_HasVariable edge represents the relationship between a repository or environment and the variables accessible within that context. This edge shows which variables are available in which scopes. Repositories can have access to both organization-level variables (scoped by visibility to all, private, or selected repositories) and repository-level variables defined directly on the repo, while environments expose their own environment-scoped variables to jobs that target them. This edge is traversable because any principal that can execute a workflow in the relevant context may be able to read variable values at runtime, and variables may contain configuration data useful for lateral movement such as deployment URLs, service names, or environment identifiers.
@@ -0,0 +1,7 @@
1
+ ## General Information
2
+
3
+ The non-traversable GH_MatchesEnvironmentPolicy edge links a branch to a GitHub Environment deployment branch policy that it satisfies.
4
+
5
+ This edge is emitted when a branch name matches the pattern defined by a GH_EnvironmentBranchPolicy node, such as `main`, `release/*`, or `release/**/*`. The edge is structural rather than directly traversable because matching a policy alone does not guarantee deployment access; the environment may still require protected branches, reviewers, wait timers, or other controls.
6
+
7
+ GH_MatchesEnvironmentPolicy is primarily used as supporting evidence for computed GH_CanDeployToEnvironment edges.
@@ -0,0 +1,20 @@
1
+ ## General Information
2
+
3
+ The non-traversable GH_UsesSecret edge links a workflow job or step to the secret it references via a `${{ secrets.NAME }}` expression. This edge reveals which secrets a workflow component can access at runtime, enabling analysts to trace the blast radius of a compromised workflow.
4
+
5
+ ### Matching strategy
6
+
7
+ Edges use `match_by: property` with scope-specific matchers to disambiguate between secrets with the same name across repositories and environments:
8
+
9
+ - **GH_RepoSecret** is matched by `name` + `repository_id` (the GitHub node_id of the repository).
10
+ - **GH_OrgSecret** is matched by `name` + `environmentid` (the node_id of the organization, which acts as the org-level secret scope).
11
+ - **GH_EnvironmentSecret** is matched by `name` + `deployment_environment_name` + `repository_id` when the parent job targets a concrete environment name.
12
+
13
+ This means one `${{ secrets.MY_SECRET }}` expression in a workflow can produce edges to repo-level, org-level, and environment-level secrets that share the same name in the applicable scopes. The environment-level edge is only emitted when the workflow job references a literal environment name rather than a dynamic expression.
14
+
15
+ ### Context property
16
+
17
+ The edge carries a `context` property indicating where the reference was found:
18
+ - `with` — inside a `with:` input block of a `uses:` action step
19
+ - `env` — inside the step's `env:` block
20
+ - `run` — inline within a `run:` shell script
@@ -0,0 +1,20 @@
1
+ ## General Information
2
+
3
+ The non-traversable GH_UsesVariable edge links a workflow job or step to the variable it references via a `${{ vars.NAME }}` expression. This edge maps variable consumption within workflows. Unlike secrets, variable values are readable via the API, making them lower sensitivity — but they can still influence workflow behavior (e.g., controlling target environments or feature flags).
4
+
5
+ ### Matching strategy
6
+
7
+ Edges use `match_by: property` with scope-specific matchers to disambiguate between variables with the same name across repositories and environments:
8
+
9
+ - **GH_RepoVariable** is matched by `name` + `repository_id` (the GitHub node_id of the repository).
10
+ - **GH_OrgVariable** is matched by `name` + `environmentid` (the node_id of the organization, which acts as the org-level variable scope).
11
+ - **GH_EnvironmentVariable** is matched by `name` + `deployment_environment_name` + `repository_id` when the parent job targets a concrete environment name.
12
+
13
+ This means one `${{ vars.MY_VAR }}` expression can produce edges to repo-level, org-level, and environment-level variables that share the same name in the applicable scopes. The environment-level edge is only emitted when the workflow job references a literal environment name rather than a dynamic expression.
14
+
15
+ ### Context property
16
+
17
+ The edge carries a `context` property indicating where the reference was found:
18
+ - `with` — inside a `with:` input block of a `uses:` action step
19
+ - `env` — inside the step's `env:` block
20
+ - `run` — inline within a `run:` shell script
@@ -0,0 +1,5 @@
1
+ ## Description
2
+
3
+ Represents a GitHub Actions deployment environment configured on a repository. Environments can have protection rules including required reviewers, wait timers, administrator bypass behavior, and deployment branch policies.
4
+
5
+ Repositories always contain their environments. When custom branch policies are configured, the environment also contains one or more GH_EnvironmentBranchPolicy nodes that describe which branches are allowed to deploy. Environment-scoped secrets and variables are modeled as child nodes of the environment and become available to workflow jobs that reference it.
@@ -0,0 +1,5 @@
1
+ ## Description
2
+
3
+ Represents a deployment branch policy attached to a GitHub Environment. These policies define which branches or branch patterns are allowed to deploy to the environment, such as `main`, `release/*`, or `release/**/*`.
4
+
5
+ Environment branch policies are modeled as their own nodes so analysts can distinguish between the environment itself and the matching rules that govern deployment eligibility.
@@ -0,0 +1,5 @@
1
+ ## Description
2
+
3
+ Represents an environment-level GitHub Actions secret. These secrets are scoped to a specific deployment environment and are only available to workflow jobs that reference that environment.
4
+
5
+ The containing environment is linked to the secret with GH_Contains and GH_HasSecret edges. Workflow steps that reference the secret by name receive GH_UsesSecret edges when their job targets the same environment.
@@ -1,3 +1,5 @@
1
1
  ## Description
2
2
 
3
3
  Represents an environment-level GitHub Actions variable. These variables are scoped to a specific deployment environment and are only available to workflow jobs that reference that environment. Unlike secrets, variable values are readable via the API.
4
+
5
+ The containing environment is linked to the variable with GH_Contains and GH_HasVariable edges. Workflow steps that reference the variable by name receive GH_UsesVariable edges when their job targets the same environment.
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "GitHub: Environments Where Admins Can Bypass Protections",
3
- "query": "MATCH p=(:GH_Repository)-[:GH_HasEnvironment]->(env:GH_Environment {can_admins_bypass: true})\nRETURN p\nLIMIT 1000",
3
+ "query": "MATCH p=(:GH_Repository)-[:GH_Contains]->(env:GH_Environment {can_admins_bypass: true})\nRETURN p\nLIMIT 1000",
4
4
  "description": "Finds deployment environments where administrators can bypass protection rules such as required reviewers and wait timers. Admins can deploy to these environments without any approval."
5
5
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "GitHub: Repository Workflows",
3
- "query": "MATCH p=(:GH_Repository)-[:GH_HasWorkflow]->(:GH_Workflow)\nRETURN p\nLIMIT 1000",
3
+ "query": "MATCH p=(:GH_Repository)-[:GH_Contains]->(:GH_Workflow)\nRETURN p\nLIMIT 1000",
4
4
  "description": "Returns all repository workflows"
5
5
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "GitHub: Unprotected Branches",
3
- "query": "MATCH p=(repo:GH_Repository)-[:GH_HasBranch]-(:GH_Branch {protected: false})\nRETURN p\nLIMIT 1000",
3
+ "query": "MATCH p=(repo:GH_Repository)-[:GH_Contains]-(:GH_Branch {protected: false})\nRETURN p\nLIMIT 1000",
4
4
  "description": "Returns all unprotected branches in repositories."
5
5
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "GitHub: Repositories with Workflows and Unprotected Default Branch",
3
- "query": "MATCH p=(repo:GH_Repository)-[:GH_HasWorkflow]->(:GH_Workflow)\nMATCH p1=(repo)-[:GH_HasBranch]->(branch:GH_Branch)\nWHERE repo.default_branch = branch.short_name\nAND branch.protected = false\nRETURN p1\nLIMIT 1000",
3
+ "query": "MATCH p=(repo:GH_Repository)-[:GH_Contains]->(:GH_Workflow)\nMATCH p1=(repo)-[:GH_Contains]->(branch:GH_Branch)\nWHERE repo.default_branch = branch.short_name\nAND branch.protected = false\nRETURN p1\nLIMIT 1000",
4
4
  "description": "Returns all repositories that have GitHub Actions workflows and an unprotected default branch. This means that users with GH_WriteRepoContents to the Repository can overwrite or change the workflow."
5
5
  }
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "GitHub: Unprotected Default Branches",
3
+ "query": "MATCH p=(repo:GH_Repository)-[:GH_Contains]-(branch:GH_Branch {protected: false})\nWHERE repo.default_branch = branch.short_name\nRETURN p\nLIMIT 1000",
4
+ "description": "Returns all default branches in repositories that are not protected."
5
+ }
@@ -2,7 +2,7 @@
2
2
  "schema": {
3
3
  "name": "SOGitHub",
4
4
  "display_name": "GitHub Extension (by SpecterOps)",
5
- "version": "v1.2.3",
5
+ "version": "v1.3.0",
6
6
  "namespace": "GH"
7
7
  },
8
8
  "node_kinds": [
@@ -142,6 +142,14 @@
142
142
  "icon": "leaf",
143
143
  "color": "#D5F2C2"
144
144
  },
145
+ {
146
+ "name": "GH_EnvironmentBranchPolicy",
147
+ "display_name": "GitHub Environment Branch Policy",
148
+ "description": "A deployment branch policy attached to a GitHub environment, such as an exact branch name or wildcard pattern like release/*",
149
+ "is_display_kind": true,
150
+ "icon": "code-branch",
151
+ "color": "#B7E3A1"
152
+ },
145
153
  {
146
154
  "name": "GH_OrgSecret",
147
155
  "display_name": "GitHub Org Secret",
@@ -277,6 +285,126 @@
277
285
  "description": "Container relationship for organizational hierarchy (org contains secrets/variables, repo contains secrets/variables, environment contains secrets/variables)",
278
286
  "is_traversable": false
279
287
  },
288
+ {
289
+ "name": "GH_CreateEnterpriseOrganizations",
290
+ "description": "[Enterprise] Enterprise role can create organizations",
291
+ "is_traversable": false
292
+ },
293
+ {
294
+ "name": "GH_EditEnterpriseCustomPropertiesForOrganizations",
295
+ "description": "[Enterprise] Enterprise role can edit custom properties for organizations",
296
+ "is_traversable": false
297
+ },
298
+ {
299
+ "name": "GH_ManageEnterpriseAdmins",
300
+ "description": "[Enterprise] Enterprise role can manage enterprise administrators",
301
+ "is_traversable": true
302
+ },
303
+ {
304
+ "name": "GH_ManageEnterpriseIdentityProvider",
305
+ "description": "[Enterprise] Enterprise role can manage the enterprise identity provider",
306
+ "is_traversable": false
307
+ },
308
+ {
309
+ "name": "GH_ManageEnterpriseMembers",
310
+ "description": "[Enterprise] Enterprise role can manage enterprise members",
311
+ "is_traversable": true
312
+ },
313
+ {
314
+ "name": "GH_ManageEnterpriseOrganizationAdmins",
315
+ "description": "[Enterprise] Enterprise role can manage organization administrators",
316
+ "is_traversable": true
317
+ },
318
+ {
319
+ "name": "GH_ManageEnterpriseOrganizations",
320
+ "description": "[Enterprise] Enterprise role can manage organizations",
321
+ "is_traversable": false
322
+ },
323
+ {
324
+ "name": "GH_ManageEnterpriseReferrals",
325
+ "description": "[Enterprise] Enterprise role can manage referrals",
326
+ "is_traversable": false
327
+ },
328
+ {
329
+ "name": "GH_ManageEnterpriseTeams",
330
+ "description": "[Enterprise] Enterprise role can manage enterprise teams",
331
+ "is_traversable": false
332
+ },
333
+ {
334
+ "name": "GH_ReadEnterpriseAuditLog",
335
+ "description": "[Enterprise] Enterprise role can read the audit log",
336
+ "is_traversable": false
337
+ },
338
+ {
339
+ "name": "GH_ReadEnterpriseDomainVerification",
340
+ "description": "[Enterprise] Enterprise role can read domain verification data",
341
+ "is_traversable": false
342
+ },
343
+ {
344
+ "name": "GH_ReadEnterpriseMembers",
345
+ "description": "[Enterprise] Enterprise role can read enterprise members",
346
+ "is_traversable": false
347
+ },
348
+ {
349
+ "name": "GH_ReadEnterpriseOrgProjects",
350
+ "description": "[Enterprise] Enterprise role can read organization projects",
351
+ "is_traversable": false
352
+ },
353
+ {
354
+ "name": "GH_ReadEnterpriseOrganizationAdmin",
355
+ "description": "[Enterprise] Enterprise role can read organization administration data",
356
+ "is_traversable": false
357
+ },
358
+ {
359
+ "name": "GH_SetEnterpriseInteractionLimits",
360
+ "description": "[Enterprise] Enterprise role can set interaction limits",
361
+ "is_traversable": false
362
+ },
363
+ {
364
+ "name": "GH_ViewEnterpriseActionsUsageMetrics",
365
+ "description": "[Enterprise] Enterprise role can view Actions usage metrics",
366
+ "is_traversable": false
367
+ },
368
+ {
369
+ "name": "GH_ViewEnterpriseBilling",
370
+ "description": "[Enterprise] Enterprise role can view billing data",
371
+ "is_traversable": false
372
+ },
373
+ {
374
+ "name": "GH_ViewEnterpriseSecretScanningAlerts",
375
+ "description": "[Enterprise] Enterprise role can view secret-scanning alerts",
376
+ "is_traversable": false
377
+ },
378
+ {
379
+ "name": "GH_WriteEnterpriseActionsPolicies",
380
+ "description": "[Enterprise] Enterprise role can write Actions policies",
381
+ "is_traversable": false
382
+ },
383
+ {
384
+ "name": "GH_WriteEnterpriseBilling",
385
+ "description": "[Enterprise] Enterprise role can write billing settings",
386
+ "is_traversable": false
387
+ },
388
+ {
389
+ "name": "GH_WriteEnterprisePersonalAccessTokenPolicies",
390
+ "description": "[Enterprise] Enterprise role can write personal access token policies",
391
+ "is_traversable": false
392
+ },
393
+ {
394
+ "name": "GH_WriteEnterpriseSso",
395
+ "description": "[Enterprise] Enterprise role can write SSO settings",
396
+ "is_traversable": false
397
+ },
398
+ {
399
+ "name": "GH_WriteEnterpriseTeamMembers",
400
+ "description": "[Enterprise] Enterprise role can write enterprise team membership",
401
+ "is_traversable": false
402
+ },
403
+ {
404
+ "name": "GH_AssignedTo",
405
+ "description": "Enterprise team is assigned to an organization",
406
+ "is_traversable": false
407
+ },
280
408
  {
281
409
  "name": "GH_Owns",
282
410
  "description": "Organization owns a repository",
@@ -295,13 +423,33 @@
295
423
  {
296
424
  "name": "GH_AddMember",
297
425
  "description": "Team role can add members to the team (maintainer privilege)",
298
- "is_traversable": true
426
+ "is_traversable": false
299
427
  },
300
428
  {
301
429
  "name": "GH_HasBaseRole",
302
430
  "description": "Role inherits permissions from another role",
303
431
  "is_traversable": true
304
432
  },
433
+ {
434
+ "name": "GH_CanCreateRepositories",
435
+ "description": "Role can create repositories in the organization",
436
+ "is_traversable": false
437
+ },
438
+ {
439
+ "name": "GH_CanCreatePublicRepositories",
440
+ "description": "Role can create public repositories in the organization",
441
+ "is_traversable": false
442
+ },
443
+ {
444
+ "name": "GH_CanCreateInternalRepositories",
445
+ "description": "Role can create internal repositories in the organization",
446
+ "is_traversable": false
447
+ },
448
+ {
449
+ "name": "GH_CanCreatePrivateRepositories",
450
+ "description": "Role can create private repositories in the organization",
451
+ "is_traversable": false
452
+ },
305
453
  {
306
454
  "name": "GH_ReadRepoContents",
307
455
  "description": "[Repository] Repo role can read repository contents",
@@ -320,7 +468,7 @@
320
468
  {
321
469
  "name": "GH_AdminTo",
322
470
  "description": "[Repository] Repo role has admin access to the repository.",
323
- "is_traversable": false
471
+ "is_traversable": true
324
472
  },
325
473
  {
326
474
  "name": "GH_BypassBranchProtection",
@@ -697,16 +845,16 @@
697
845
  "description": "User or team is allowed to push to branches protected by this rule",
698
846
  "is_traversable": false
699
847
  },
700
- {
701
- "name": "GH_HasBranch",
702
- "description": "Repository has this branch",
703
- "is_traversable": false
704
- },
705
848
  {
706
849
  "name": "GH_CanEditProtection",
707
850
  "description": "[Repository - Computed] Repo role can modify or remove branch protection rules for the repository/branch (computed from GH_EditRepoProtections + GH_ProtectedBy)",
708
851
  "is_traversable": true
709
852
  },
853
+ {
854
+ "name": "GH_CanReadSecret",
855
+ "description": "Org role can read an organization secret by creating a repository in scope",
856
+ "is_traversable": true
857
+ },
710
858
  {
711
859
  "name": "GH_CanReadSecretScanningAlert",
712
860
  "description": "[Computed] Role can read secret scanning alerts (computed from GH_ViewSecretScanningAlerts permission + GH_Contains)",
@@ -717,16 +865,6 @@
717
865
  "description": "Branch protection rule protects this branch",
718
866
  "is_traversable": false
719
867
  },
720
- {
721
- "name": "GH_HasWorkflow",
722
- "description": "Repository has this workflow",
723
- "is_traversable": false
724
- },
725
- {
726
- "name": "GH_HasEnvironment",
727
- "description": "Repository or branch has/can deploy to this environment",
728
- "is_traversable": false
729
- },
730
868
  {
731
869
  "name": "GH_HasSecret",
732
870
  "description": "Repository or environment has access to this secret",
@@ -734,7 +872,7 @@
734
872
  },
735
873
  {
736
874
  "name": "GH_HasVariable",
737
- "description": "Repository has access to this variable (org-level or repo-level)",
875
+ "description": "Repository or environment has access to this variable",
738
876
  "is_traversable": true
739
877
  },
740
878
  {
@@ -777,6 +915,11 @@
777
915
  "description": "Personal access token or app installation can access this repository or organization",
778
916
  "is_traversable": false
779
917
  },
918
+ {
919
+ "name": "GH_CanUseRunner",
920
+ "description": "Repository can dispatch jobs to this runner",
921
+ "is_traversable": false
922
+ },
780
923
  {
781
924
  "name": "GH_CanWriteBranch",
782
925
  "description": "[Repository - Computed] Role can push to this branch after evaluating branch protection rules, push restrictions, and bypass allowances",
@@ -787,6 +930,16 @@
787
930
  "description": "[Repository - Computed] Role can create new branches in this repository (unprotected branches that bypass the merge gate)",
788
931
  "is_traversable": true
789
932
  },
933
+ {
934
+ "name": "GH_CanCreateEnvironment",
935
+ "description": "Repo role can create new GitHub environments in this repository by editing a workflow that references a nonexistent environment name",
936
+ "is_traversable": true
937
+ },
938
+ {
939
+ "name": "GH_CanEditEnvironment",
940
+ "description": "Repo admin role can edit the configuration of this GitHub environment",
941
+ "is_traversable": true
942
+ },
790
943
  {
791
944
  "name": "GH_CanAssumeIdentity",
792
945
  "description": "Repository can assume this cloud identity via OIDC federation (Azure workload identity or AWS IAM role)",
@@ -818,28 +971,33 @@
818
971
  "is_traversable": false
819
972
  },
820
973
  {
821
- "name": "GH_HasJob",
822
- "description": "[Workflow] Workflow contains this job GH_Workflow → GH_WorkflowJob",
974
+ "name": "GH_HasMember",
975
+ "description": "Enterprise or organization has this user as a member",
823
976
  "is_traversable": false
824
977
  },
825
978
  {
826
- "name": "GH_HasMember",
827
- "description": "Enterprise or organization has this user as a member",
979
+ "name": "GH_UsesSecret",
980
+ "description": "[Workflow] Job or step references a secret by name — GH_WorkflowJob / GH_WorkflowStep → GH_RepoSecret / GH_OrgSecret / GH_EnvironmentSecret (scope match)",
828
981
  "is_traversable": false
829
982
  },
830
983
  {
831
- "name": "GH_HasStep",
832
- "description": "[Workflow] Job contains this step — GH_WorkflowJob → GH_WorkflowStep",
984
+ "name": "GH_UsesVariable",
985
+ "description": "[Workflow] Job or step references a variable by name — GH_WorkflowJob / GH_WorkflowStep GH_RepoVariable / GH_OrgVariable / GH_EnvironmentVariable (scope match)",
833
986
  "is_traversable": false
834
987
  },
835
988
  {
836
- "name": "GH_UsesSecret",
837
- "description": "[Workflow] Step references a secret by name GH_WorkflowStep GH_RepoSecret / GH_OrgSecret (name match)",
989
+ "name": "GH_CanDeployToEnvironment",
990
+ "description": "[Computed] Repository, branch, repo role, or self-approving reviewer can deploy to this GitHub environment after evaluating deployment branch policy, reviewer gates, and admin bypass behavior",
991
+ "is_traversable": true
992
+ },
993
+ {
994
+ "name": "GH_MatchesEnvironmentPolicy",
995
+ "description": "Branch matches this environment deployment branch policy",
838
996
  "is_traversable": false
839
997
  },
840
998
  {
841
- "name": "GH_UsesVariable",
842
- "description": "[Workflow] Step references a variable by name GH_WorkflowStep GH_RepoVariable / GH_OrgVariable (name match)",
999
+ "name": "GH_ApprovesDeploymentTo",
1000
+ "description": "User or team is configured as a required reviewer for this environment",
843
1001
  "is_traversable": false
844
1002
  }
845
1003
  ],
@@ -848,11 +1006,7 @@
848
1006
  "environment_kind": "GH_Organization",
849
1007
  "source_kind": "GitHub",
850
1008
  "principal_kinds": [
851
- "GH_User",
852
- "GH_Team",
853
- "GH_Repository",
854
- "GH_Branch",
855
- "GH_Environment"
1009
+ "GH_User"
856
1010
  ]
857
1011
  }
858
1012
  ],
@@ -24,7 +24,7 @@ source = "vcs"
24
24
  local_scheme = "no-local-version"
25
25
 
26
26
  [tool.hatch.build.targets.wheel.force-include]
27
- "extension.yaml" = "openhound_github/extension.yaml"
27
+ "src/openhound_github/extension.yaml" = "openhound_github/extension.yaml"
28
28
 
29
29
  [dependency-groups]
30
30
  dev = [