openhound-github 0.8.0__tar.gz → 0.10.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 (429) hide show
  1. {openhound_github-0.8.0 → openhound_github-0.10.0}/PKG-INFO +1 -1
  2. openhound_github-0.10.0/descriptions/edges/GH_CanAccessSecret.md +30 -0
  3. openhound_github-0.10.0/descriptions/edges/GH_CanInterceptJob.md +24 -0
  4. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanPwnRequest.md +1 -1
  5. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_EnterpriseRunner.md +4 -0
  6. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_OrgRunner.md +4 -0
  7. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_RepoRunner.md +4 -0
  8. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_Repository.md +4 -0
  9. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_Workflow.md +3 -0
  10. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_WorkflowJob.md +14 -1
  11. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/README.md +29 -13
  12. openhound_github-0.10.0/extension/saved_searches/self-hosted-runners-can-intercept-broad-token-jobs.json +5 -0
  13. openhound_github-0.10.0/extension/saved_searches/shared-self-hosted-runners-can-intercept-secret-bearing-jobs.json +5 -0
  14. openhound_github-0.10.0/extension/saved_searches/workflow-jobs-interceptable-by-self-hosted-runners.json +5 -0
  15. openhound_github-0.10.0/extension/saved_searches/workflow-jobs-with-broad-token-write-permissions.json +5 -0
  16. openhound_github-0.10.0/extension/saved_searches/workflow-jobs-with-id-token-write-on-self-hosted-runners.json +5 -0
  17. openhound_github-0.10.0/extension/saved_searches/workflow-jobs-with-id-token-write.json +5 -0
  18. openhound_github-0.10.0/extension/saved_searches/workflow-jobs-with-observed-oidc-auth-steps.json +5 -0
  19. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/schema.json +10 -0
  20. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/kinds/edges.py +2 -0
  21. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/lookup.py +111 -12
  22. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/repository.py +10 -0
  23. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/runner.py +5 -0
  24. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/workflow.py +149 -0
  25. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/workflow_job.py +186 -78
  26. openhound_github-0.10.0/src/openhound_github/models/workflow_reference.py +58 -0
  27. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/workflow_step.py +27 -60
  28. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/resources/organization.py +34 -2
  29. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/source.py +3 -0
  30. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/transforms.py +39 -0
  31. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_lookup.py +22 -0
  32. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_repository_rulesets.py +24 -0
  33. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_runner_models.py +56 -9
  34. openhound_github-0.10.0/tests/test_workflow_interception_path.py +264 -0
  35. openhound_github-0.10.0/tests/test_workflow_model.py +668 -0
  36. openhound_github-0.10.0/tests/test_workflow_resources.py +98 -0
  37. openhound_github-0.8.0/tests/test_workflow_model.py +0 -282
  38. {openhound_github-0.8.0 → openhound_github-0.10.0}/.github/CODE_OF_CONDUCT.md +0 -0
  39. {openhound_github-0.8.0 → openhound_github-0.10.0}/.github/CONTRIBUTING.md +0 -0
  40. {openhound_github-0.8.0 → openhound_github-0.10.0}/.github/GOVERNANCE.md +0 -0
  41. {openhound_github-0.8.0 → openhound_github-0.10.0}/.github/GitHub-COC-Header.png +0 -0
  42. {openhound_github-0.8.0 → openhound_github-0.10.0}/.github/GitHub-CONTRIB-Header.png +0 -0
  43. {openhound_github-0.8.0 → openhound_github-0.10.0}/.github/GitHub-GOV-Header.png +0 -0
  44. {openhound_github-0.8.0 → openhound_github-0.10.0}/.github/GitHub-Header.png +0 -0
  45. {openhound_github-0.8.0 → openhound_github-0.10.0}/.github/GitHub-LIC-Header.png +0 -0
  46. {openhound_github-0.8.0 → openhound_github-0.10.0}/.github/GitHub-SEC-Header.png +0 -0
  47. {openhound_github-0.8.0 → openhound_github-0.10.0}/.github/SECURITY.md +0 -0
  48. {openhound_github-0.8.0 → openhound_github-0.10.0}/.github/SO-Dark.svg +0 -0
  49. {openhound_github-0.8.0 → openhound_github-0.10.0}/.github/SO-FOSS-Dark.svg +0 -0
  50. {openhound_github-0.8.0 → openhound_github-0.10.0}/.github/SO-FOSS-Light.svg +0 -0
  51. {openhound_github-0.8.0 → openhound_github-0.10.0}/.github/SO-Light.svg +0 -0
  52. {openhound_github-0.8.0 → openhound_github-0.10.0}/.github/workflows/publish.yml +0 -0
  53. {openhound_github-0.8.0 → openhound_github-0.10.0}/.github/workflows/release-on-merge.yml +0 -0
  54. {openhound_github-0.8.0 → openhound_github-0.10.0}/.github/workflows/validate-branch.yml +0 -0
  55. {openhound_github-0.8.0 → openhound_github-0.10.0}/.gitignore +0 -0
  56. {openhound_github-0.8.0 → openhound_github-0.10.0}/.gitmodules +0 -0
  57. {openhound_github-0.8.0 → openhound_github-0.10.0}/.pre-commit-config.yaml +0 -0
  58. {openhound_github-0.8.0 → openhound_github-0.10.0}/LICENSE.md +0 -0
  59. {openhound_github-0.8.0 → openhound_github-0.10.0}/README.md +0 -0
  60. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_AddAssignee.md +0 -0
  61. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_AddCollaborator.md +0 -0
  62. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_AddLabel.md +0 -0
  63. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_AddMember.md +0 -0
  64. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_AdminTo.md +0 -0
  65. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ApprovesDeploymentTo.md +0 -0
  66. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_AssignedTo.md +0 -0
  67. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_BypassBranchProtection.md +0 -0
  68. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_BypassPullRequestAllowances.md +0 -0
  69. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_CallsWorkflow.md +0 -0
  70. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanAccess.md +0 -0
  71. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanAssumeIdentity.md +0 -0
  72. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanCreateBranch.md +0 -0
  73. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanCreateEnvironment.md +0 -0
  74. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanCreateInternalRepositories.md +0 -0
  75. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanCreatePrivateRepositories.md +0 -0
  76. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanCreatePublicRepositories.md +0 -0
  77. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanCreateRepositories.md +0 -0
  78. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanCreateRepositoryWithRunnerAccess.md +0 -0
  79. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanDeployToEnvironment.md +0 -0
  80. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanEditEnvironment.md +0 -0
  81. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanEditProtection.md +0 -0
  82. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanReadSecret.md +0 -0
  83. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanReadSecretScanningAlert.md +0 -0
  84. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanUseRunner.md +0 -0
  85. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_CanWriteBranch.md +0 -0
  86. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_CloseDiscussion.md +0 -0
  87. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_CloseIssue.md +0 -0
  88. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ClosePullRequest.md +0 -0
  89. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_Contains.md +0 -0
  90. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ConvertIssuesToDiscussions.md +0 -0
  91. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_CreateDiscussionCategory.md +0 -0
  92. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_CreateEnterpriseOrganizations.md +0 -0
  93. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_CreateRepository.md +0 -0
  94. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_CreateSoloMergeQueueEntry.md +0 -0
  95. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_CreateTag.md +0 -0
  96. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_CreateTeam.md +0 -0
  97. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_DeleteAlertsCodeScanning.md +0 -0
  98. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_DeleteDiscussion.md +0 -0
  99. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_DeleteDiscussionComment.md +0 -0
  100. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_DeleteIssue.md +0 -0
  101. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_DeleteTag.md +0 -0
  102. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_DependsOn.md +0 -0
  103. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_DeploysTo.md +0 -0
  104. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_EditCategoryOnDiscussion.md +0 -0
  105. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_EditDiscussionCategory.md +0 -0
  106. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_EditDiscussionComment.md +0 -0
  107. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_EditEnterpriseCustomPropertiesForOrganizations.md +0 -0
  108. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_EditRepoAnnouncementBanners.md +0 -0
  109. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_EditRepoCustomPropertiesValues.md +0 -0
  110. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_EditRepoMetadata.md +0 -0
  111. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_EditRepoProtections.md +0 -0
  112. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_HasBaseRole.md +0 -0
  113. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_HasExternalIdentity.md +0 -0
  114. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_HasMember.md +0 -0
  115. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_HasPersonalAccessToken.md +0 -0
  116. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_HasPersonalAccessTokenRequest.md +0 -0
  117. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_HasRole.md +0 -0
  118. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_HasRunner.md +0 -0
  119. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_HasSamlIdentityProvider.md +0 -0
  120. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_HasSecret.md +0 -0
  121. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_HasVariable.md +0 -0
  122. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_InheritedFrom.md +0 -0
  123. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_InstalledAs.md +0 -0
  124. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_InviteMember.md +0 -0
  125. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_IsEligibleFor.md +0 -0
  126. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_JumpMergeQueue.md +0 -0
  127. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageDeployKeys.md +0 -0
  128. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageDiscussionBadges.md +0 -0
  129. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageEnterpriseAdmins.md +0 -0
  130. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageEnterpriseIdentityProvider.md +0 -0
  131. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageEnterpriseMembers.md +0 -0
  132. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageEnterpriseOrganizationAdmins.md +0 -0
  133. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageEnterpriseOrganizations.md +0 -0
  134. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageEnterpriseReferrals.md +0 -0
  135. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageEnterpriseTeams.md +0 -0
  136. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageOrganizationWebhooks.md +0 -0
  137. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageRepoSecurityProducts.md +0 -0
  138. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageSecurityProducts.md +0 -0
  139. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageSettingsMergeTypes.md +0 -0
  140. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageSettingsPages.md +0 -0
  141. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageSettingsProjects.md +0 -0
  142. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageSettingsWiki.md +0 -0
  143. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageTopics.md +0 -0
  144. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ManageWebhooks.md +0 -0
  145. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_MapsToUser.md +0 -0
  146. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_MarkAsDuplicate.md +0 -0
  147. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_MatchesEnvironmentPolicy.md +0 -0
  148. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_MemberOf.md +0 -0
  149. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_OrgBypassCodeScanningDismissalRequests.md +0 -0
  150. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_OrgBypassSecretScanningClosureRequests.md +0 -0
  151. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_OrgReviewAndManageSecretScanningBypassRequests.md +0 -0
  152. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_OrgReviewAndManageSecretScanningClosureRequests.md +0 -0
  153. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_Owns.md +0 -0
  154. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ProtectedBy.md +0 -0
  155. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_PushProtectedBranch.md +0 -0
  156. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ReadCodeScanning.md +0 -0
  157. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ReadEnterpriseAuditLog.md +0 -0
  158. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ReadEnterpriseDomainVerification.md +0 -0
  159. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ReadEnterpriseMembers.md +0 -0
  160. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ReadEnterpriseOrgProjects.md +0 -0
  161. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ReadEnterpriseOrganizationAdmin.md +0 -0
  162. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ReadOrganizationActionsUsageMetrics.md +0 -0
  163. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ReadOrganizationCustomOrgRole.md +0 -0
  164. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ReadOrganizationCustomRepoRole.md +0 -0
  165. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ReadRepoContents.md +0 -0
  166. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_RemoveAssignee.md +0 -0
  167. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_RemoveLabel.md +0 -0
  168. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ReopenDiscussion.md +0 -0
  169. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ReopenIssue.md +0 -0
  170. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ReopenPullRequest.md +0 -0
  171. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_RequestPrReview.md +0 -0
  172. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ResolveDependabotAlerts.md +0 -0
  173. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ResolveSecretScanningAlerts.md +0 -0
  174. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_RestrictionsCanPush.md +0 -0
  175. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_RunOrgMigration.md +0 -0
  176. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_RunsOn.md +0 -0
  177. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_SetEnterpriseInteractionLimits.md +0 -0
  178. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_SetInteractionLimits.md +0 -0
  179. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_SetIssueType.md +0 -0
  180. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_SetMilestone.md +0 -0
  181. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_SetSocialPreview.md +0 -0
  182. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_SyncedTo.md +0 -0
  183. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ToggleDiscussionAnswer.md +0 -0
  184. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ToggleDiscussionCommentMinimize.md +0 -0
  185. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_TransferRepository.md +0 -0
  186. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_UsesSecret.md +0 -0
  187. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_UsesVariable.md +0 -0
  188. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ValidToken.md +0 -0
  189. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ViewDependabotAlerts.md +0 -0
  190. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ViewEnterpriseActionsUsageMetrics.md +0 -0
  191. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ViewEnterpriseBilling.md +0 -0
  192. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ViewEnterpriseSecretScanningAlerts.md +0 -0
  193. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_ViewSecretScanningAlerts.md +0 -0
  194. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_WriteCodeScanning.md +0 -0
  195. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_WriteEnterpriseActionsPolicies.md +0 -0
  196. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_WriteEnterpriseBilling.md +0 -0
  197. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_WriteEnterprisePersonalAccessTokenPolicies.md +0 -0
  198. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_WriteEnterpriseSso.md +0 -0
  199. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_WriteEnterpriseTeamMembers.md +0 -0
  200. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_WriteOrganizationActionsSecrets.md +0 -0
  201. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_WriteOrganizationActionsSettings.md +0 -0
  202. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_WriteOrganizationActionsVariables.md +0 -0
  203. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_WriteOrganizationCustomOrgRole.md +0 -0
  204. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_WriteOrganizationCustomRepoRole.md +0 -0
  205. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_WriteOrganizationNetworkConfigurations.md +0 -0
  206. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_WriteRepoContents.md +0 -0
  207. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/edges/GH_WriteRepoPullRequests.md +0 -0
  208. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_App.md +0 -0
  209. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_AppInstallation.md +0 -0
  210. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_Branch.md +0 -0
  211. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_BranchProtectionRule.md +0 -0
  212. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_Enterprise.md +0 -0
  213. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_EnterpriseManagedUser.md +0 -0
  214. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_EnterpriseRole.md +0 -0
  215. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_EnterpriseRunnerGroup.md +0 -0
  216. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_EnterpriseTeam.md +0 -0
  217. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_Environment.md +0 -0
  218. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_EnvironmentBranchPolicy.md +0 -0
  219. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_EnvironmentSecret.md +0 -0
  220. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_EnvironmentVariable.md +0 -0
  221. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_ExternalIdentity.md +0 -0
  222. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_OrgRole.md +0 -0
  223. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_OrgRunnerGroup.md +0 -0
  224. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_OrgSecret.md +0 -0
  225. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_OrgVariable.md +0 -0
  226. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_Organization.md +0 -0
  227. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_PersonalAccessToken.md +0 -0
  228. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_PersonalAccessTokenRequest.md +0 -0
  229. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_RepoRole.md +0 -0
  230. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_RepoSecret.md +0 -0
  231. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_RepoVariable.md +0 -0
  232. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_Runner.md +0 -0
  233. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_RunnerGroup.md +0 -0
  234. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_SamlIdentityProvider.md +0 -0
  235. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_Secret.md +0 -0
  236. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_SecretScanningAlert.md +0 -0
  237. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_Team.md +0 -0
  238. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_TeamRole.md +0 -0
  239. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_User.md +0 -0
  240. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_Variable.md +0 -0
  241. {openhound_github-0.8.0 → openhound_github-0.10.0}/descriptions/nodes/GH_WorkflowStep.md +0 -0
  242. {openhound_github-0.8.0 → openhound_github-0.10.0}/docs/og-docs.json +0 -0
  243. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/privilege_zone_rules/t0-all-repo-admin-role.json +0 -0
  244. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/privilege_zone_rules/t0-app-installations-all-repos.json +0 -0
  245. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/privilege_zone_rules/t0-apps-all-repos.json +0 -0
  246. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/privilege_zone_rules/t0-enterprise-owners-role.json +0 -0
  247. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/privilege_zone_rules/t0-external-identities-owners.json +0 -0
  248. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/privilege_zone_rules/t0-organizations.json +0 -0
  249. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/privilege_zone_rules/t0-owner-users.json +0 -0
  250. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/privilege_zone_rules/t0-owners-role.json +0 -0
  251. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/privilege_zone_rules/t0-pats-all-repos.json +0 -0
  252. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/privilege_zone_rules/t0-privilege-escalation-roles.json +0 -0
  253. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/privilege_zone_rules/t0-privilege-escalation-users.json +0 -0
  254. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/privilege_zone_rules/t0-saml-identity-providers.json +0 -0
  255. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/actions-sha-pinning-not-required.json +0 -0
  256. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/active-leaked-secrets.json +0 -0
  257. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/advanced-security-disabled-new-repos.json +0 -0
  258. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/all-actions-allowed.json +0 -0
  259. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/app-installations-all-repos.json +0 -0
  260. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/branch-protection-admins-not-enforced.json +0 -0
  261. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/branch-protection-deletions-allowed.json +0 -0
  262. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/branch-protection-force-pushes.json +0 -0
  263. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/branch-protection-no-code-owner-reviews.json +0 -0
  264. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/branch-protection-no-pr-reviews.json +0 -0
  265. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/branch-protection-no-status-checks.json +0 -0
  266. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/branch-protection-self-approval.json +0 -0
  267. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/branch-protection-stale-reviews.json +0 -0
  268. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/bypass-pr-requirements.json +0 -0
  269. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/dangerous-branch-perms.json +0 -0
  270. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/default-repository-permissions.json +0 -0
  271. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/demo-sso-to-cloud-round-trip.json +0 -0
  272. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/dependabot-alerts-disabled-new-repos.json +0 -0
  273. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/dependabot-updates-disabled-new-repos.json +0 -0
  274. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/dependency-graph-disabled-new-repos.json +0 -0
  275. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/environments-admin-bypass.json +0 -0
  276. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/expired-pats.json +0 -0
  277. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/external-identities-without-scim.json +0 -0
  278. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/github-to-azure-identity.json +0 -0
  279. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/global-repo-perms.json +0 -0
  280. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/hybrid-identities.json +0 -0
  281. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/members-can-change-repo-visibility.json +0 -0
  282. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/members-can-create-pages.json +0 -0
  283. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/members-can-create-public-repos.json +0 -0
  284. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/members-can-delete-repos.json +0 -0
  285. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/members-can-fork-private-repos.json +0 -0
  286. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/members-can-invite-outside-collaborators.json +0 -0
  287. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/org-owners.json +0 -0
  288. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/orgs-without-2fa.json +0 -0
  289. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/pats-all-repo-access.json +0 -0
  290. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/pending-pat-requests.json +0 -0
  291. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/private-repos-forking-allowed.json +0 -0
  292. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/privileged-custom-org-roles.json +0 -0
  293. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/privileged-hybrid-identities.json +0 -0
  294. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/public-repos.json +0 -0
  295. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/push-protection-disabled-new-repos.json +0 -0
  296. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/push-to-protected-branches.json +0 -0
  297. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/repos-secret-scanning-disabled.json +0 -0
  298. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/repos-vulnerable-to-workflow-secret-exfil.json +0 -0
  299. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/repository-workflows.json +0 -0
  300. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/saml-configuration.json +0 -0
  301. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/secret-scanning-alerts.json +0 -0
  302. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/secret-scanning-disabled-new-repos.json +0 -0
  303. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/secrets-reachable-by-user.json +0 -0
  304. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/team-membership-admin.json +0 -0
  305. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/team-structure.json +0 -0
  306. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/unprotected-branches.json +0 -0
  307. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/unprotected-default-branch-with-workflow.json +0 -0
  308. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/unprotected-default-branches.json +0 -0
  309. {openhound_github-0.8.0 → openhound_github-0.10.0}/extension/saved_searches/web-commit-signoff-not-required.json +0 -0
  310. {openhound_github-0.8.0 → openhound_github-0.10.0}/justfile +0 -0
  311. {openhound_github-0.8.0 → openhound_github-0.10.0}/pyproject.toml +0 -0
  312. {openhound_github-0.8.0 → openhound_github-0.10.0}/scripts/generate_gh_description_docs.py +0 -0
  313. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/main.py +0 -0
  314. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/__init__.py +0 -0
  315. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/auth.py +0 -0
  316. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/extension.yaml +0 -0
  317. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/github_rest_client.py +0 -0
  318. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/github_retry.py +0 -0
  319. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/graph.py +0 -0
  320. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/graphql.py +0 -0
  321. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/helpers.py +0 -0
  322. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/kinds/nodes.py +0 -0
  323. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/main.py +0 -0
  324. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/__init__.py +0 -0
  325. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/actions_permission.py +0 -0
  326. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/app_installation.py +0 -0
  327. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/branch.py +0 -0
  328. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/branch_pr_bypass_allowance.py +0 -0
  329. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/branch_protection_rule.py +0 -0
  330. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/branch_push_allowance.py +0 -0
  331. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/enterprise.py +0 -0
  332. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/enterprise_admin.py +0 -0
  333. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/enterprise_helpers.py +0 -0
  334. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/enterprise_managed_user.py +0 -0
  335. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/enterprise_member.py +0 -0
  336. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/enterprise_organization.py +0 -0
  337. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/enterprise_role.py +0 -0
  338. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/enterprise_role_team.py +0 -0
  339. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/enterprise_role_user.py +0 -0
  340. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/enterprise_team.py +0 -0
  341. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/enterprise_team_member.py +0 -0
  342. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/enterprise_team_organization.py +0 -0
  343. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/enterprise_team_role.py +0 -0
  344. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/enterprise_user.py +0 -0
  345. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/env_secret.py +0 -0
  346. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/env_variable.py +0 -0
  347. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/environment.py +0 -0
  348. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/environment_branch_policy.py +0 -0
  349. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/external_identity.py +0 -0
  350. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/org.py +0 -0
  351. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/org_role.py +0 -0
  352. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/org_role_member.py +0 -0
  353. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/org_role_team.py +0 -0
  354. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/org_secret.py +0 -0
  355. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/org_variable.py +0 -0
  356. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/personal_access_token.py +0 -0
  357. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/personal_access_token_access.py +0 -0
  358. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/personal_access_token_request.py +0 -0
  359. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/projected_enterprise_team.py +0 -0
  360. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/repo_role_assignment.py +0 -0
  361. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/repository_role.py +0 -0
  362. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/repository_secret.py +0 -0
  363. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/repository_variable.py +0 -0
  364. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/saml_assertion_consumer_service.py +0 -0
  365. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/saml_helpers.py +0 -0
  366. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/saml_issuer.py +0 -0
  367. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/saml_provider.py +0 -0
  368. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/saml_service_provider.py +0 -0
  369. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/scim_user.py +0 -0
  370. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/secret_scanning_alert.py +0 -0
  371. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/team.py +0 -0
  372. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/team_member.py +0 -0
  373. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/team_role.py +0 -0
  374. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/models/user.py +0 -0
  375. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/resources/__init__.py +0 -0
  376. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/resources/enterprise.py +0 -0
  377. {openhound_github-0.8.0 → openhound_github-0.10.0}/src/openhound_github/runner_ids.py +0 -0
  378. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_app_auth.py +0 -0
  379. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_branch_collection_gate.py +0 -0
  380. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_branch_protection_traversability.py +0 -0
  381. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_data/api/actions-permissions.json +0 -0
  382. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_data/api/actionsecrets.json +0 -0
  383. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_data/api/app.json +0 -0
  384. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_data/api/appinstalls.json +0 -0
  385. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_data/api/branch-policies.json +0 -0
  386. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_data/api/branch-prot-rules.json +0 -0
  387. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_data/api/branches.json +0 -0
  388. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_data/api/custom-roles.json +0 -0
  389. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_data/api/environments.json +0 -0
  390. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_data/api/org-pat-request.json +0 -0
  391. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_data/api/org-pat.json +0 -0
  392. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_data/api/org-role-teams.json +0 -0
  393. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_data/api/org-role-users.json +0 -0
  394. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_data/api/org-roles.json +0 -0
  395. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_data/api/org.json +0 -0
  396. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_data/api/pat-repositories.json +0 -0
  397. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_data/api/repo-collaborators.json +0 -0
  398. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_data/api/repo-teams.json +0 -0
  399. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_data/api/repositories.json +0 -0
  400. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_data/api/scimusers.json +0 -0
  401. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_data/api/secrets.json +0 -0
  402. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_data/api/secretscanningalert.json +0 -0
  403. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_data/api/selected-org-secrets.json +0 -0
  404. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_data/api/variables.json +0 -0
  405. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_data/api/workflows.json +0 -0
  406. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_description_docs.py +0 -0
  407. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_enterprise_capabilities.py +0 -0
  408. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_enterprise_organization.py +0 -0
  409. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_enterprise_resources.py +0 -0
  410. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_environment_model.py +0 -0
  411. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_environment_resources.py +0 -0
  412. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_environment_reviewer_lookup.py +0 -0
  413. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_error_resilience.py +0 -0
  414. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_github_app_retry.py +0 -0
  415. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_github_rest_client.py +0 -0
  416. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_github_retry.py +0 -0
  417. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_helpers.py +0 -0
  418. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_org_scim_resources.py +0 -0
  419. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_org_secret_models.py +0 -0
  420. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_runner_ids.py +0 -0
  421. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_runner_resources.py +0 -0
  422. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_saml_helpers.py +0 -0
  423. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_saml_models.py +0 -0
  424. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_scim_models.py +0 -0
  425. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_source_endpoints.py +0 -0
  426. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_source_org_canonicalization.py +0 -0
  427. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_team_external_groups.py +0 -0
  428. {openhound_github-0.8.0 → openhound_github-0.10.0}/tests/test_variable_models.py +0 -0
  429. {openhound_github-0.8.0 → openhound_github-0.10.0}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: openhound-github
3
- Version: 0.8.0
3
+ Version: 0.10.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
@@ -0,0 +1,30 @@
1
+ # GH_CanAccessSecret
2
+
3
+ ## General Information
4
+
5
+ The traversable GH_CanAccessSecret edge represents that a GitHub Actions workflow job execution context can access a statically referenced secret.
6
+
7
+ This edge is derived from the existing non-traversable GH_UsesSecret relationships on the job's contained steps and from job-level `env` declarations. It is intended for attack-path analysis from a compromised job execution context to the secrets that context can read.
8
+
9
+ The collector only emits this edge when one of the workflow job's modeled steps or the job's `env` block statically references the secret. The existence of a secret in the repository, organization, or environment scope alone is not enough. For this initial implementation, secrets passed through `jobs.<job_id>.secrets` to reusable workflows are retained as structural references but are not projected as runtime access for the caller job.
10
+
11
+ ## Edge Schema
12
+
13
+ | Source | Destination | Traversable |
14
+ | --- | --- | --- |
15
+ | `GH_WorkflowJob` | `GH_EnvironmentSecret` | `true` |
16
+ | `GH_WorkflowJob` | `GH_OrgSecret` | `true` |
17
+ | `GH_WorkflowJob` | `GH_RepoSecret` | `true` |
18
+
19
+ ## Diagram
20
+
21
+ ```mermaid
22
+ graph LR
23
+ n0["GH_WorkflowJob"]
24
+ n1["GH_EnvironmentSecret"]
25
+ n2["GH_OrgSecret"]
26
+ n3["GH_RepoSecret"]
27
+ n0 -->|GH_CanAccessSecret| n1
28
+ n0 -->|GH_CanAccessSecret| n2
29
+ n0 -->|GH_CanAccessSecret| n3
30
+ ```
@@ -0,0 +1,24 @@
1
+ # GH_CanInterceptJob
2
+
3
+ ## General Information
4
+
5
+ The traversable GH_CanInterceptJob edge represents that a self-hosted runner not explicitly marked ephemeral can intercept a GitHub Actions workflow job that GitHub could schedule on it.
6
+
7
+ This edge is derived from GH_RunsOn and is intended for attack-path analysis. It does not mean that the job has historically executed on the runner. It means that control of the runner may expose the future execution context of the job when the runner is not ephemeral.
8
+
9
+ The collector does not emit this edge for runners GitHub explicitly marks as ephemeral.
10
+
11
+ ## Edge Schema
12
+
13
+ | Source | Destination | Traversable |
14
+ | --- | --- | --- |
15
+ | `GH_Runner` | `GH_WorkflowJob` | `true` |
16
+
17
+ ## Diagram
18
+
19
+ ```mermaid
20
+ graph LR
21
+ n0["GH_Runner"]
22
+ n1["GH_WorkflowJob"]
23
+ n0 -->|GH_CanInterceptJob| n1
24
+ ```
@@ -41,7 +41,7 @@ An attacker who exploits a pwn request gains code execution in the workflow runn
41
41
 
42
42
  ### Caveats
43
43
 
44
- - **OIDC traversal requires `id-token: write`**: The attack chain from GH_CanPwnRequest through GH_CanAssumeIdentity to a cloud role is only valid if the pwn-requestable workflow (or job) explicitly declares `id-token: write` in its `permissions:` block. The `id-token` permission defaults to `none` and is never implicitly granted — even when the workflow has no `permissions:` block at all. The `permissions` property on the GH_WorkflowJob node can be inspected to verify this.
44
+ - **OIDC traversal requires `id-token: write`**: The attack chain from GH_CanPwnRequest through GH_CanAssumeIdentity to a cloud role is only valid if the pwn-requestable job's calculated `effective_github_token_permissions` includes `id-token:write`. The `id-token` permission defaults to `none` and is never implicitly granted — even when the workflow has no `permissions:` block at all. Inspect `workflow_permissions` on GH_Workflow, `job_permissions` on GH_WorkflowJob, and the job's `effective_github_token_permissions` to understand how the effective value was derived.
45
45
  - **GITHUB_TOKEN permissions**: The `permissions:` block controls what the `GITHUB_TOKEN` can do (e.g., push commits, create releases), but has no effect on secret access, OIDC token requests (governed separately by `id-token`), or arbitrary code execution. A workflow with `contents: read` is still fully exploitable via pwn request for secret exfiltration and lateral movement — only write-back to the repository is limited.
46
46
 
47
47
  ## Edge Schema
@@ -8,6 +8,8 @@ The node captures runner metadata such as operating system, status, busy state,
8
8
 
9
9
  GH_RunsOn edges from GH_WorkflowJob nodes identify statically resolvable jobs that GitHub could schedule on this runner through the inherited enterprise runner-group topology. These edges do not indicate that the job has actually executed on the runner.
10
10
 
11
+ When the runner is not explicitly marked ephemeral, GH_CanInterceptJob edges identify workflow jobs whose future execution context may be exposed to an actor controlling the runner.
12
+
11
13
  ## Properties
12
14
 
13
15
  | Property | Type | Description |
@@ -34,6 +36,7 @@ GH_RunsOn edges from GH_WorkflowJob nodes identify statically resolvable jobs th
34
36
  | `query_group` | `string` | Query for group. |
35
37
  | `query_repositories` | `string` | Query for repositories. |
36
38
  | `query_jobs` | `string` | Query for workflow jobs that can be scheduled on the runner. |
39
+ | `query_interceptable_jobs` | `string` | Query for workflow jobs the runner can intercept. |
37
40
 
38
41
  ## Diagram
39
42
 
@@ -45,4 +48,5 @@ graph LR
45
48
  n0 -.->|GH_Contains| n1
46
49
  n0 -->|GH_HasRunner| n1
47
50
  n2 -.->|GH_RunsOn| n1
51
+ n1 -->|GH_CanInterceptJob| n2
48
52
  ```
@@ -8,6 +8,8 @@ The node captures runner metadata such as operating system, status, busy state,
8
8
 
9
9
  GH_RunsOn edges from GH_WorkflowJob nodes identify statically resolvable jobs that GitHub could schedule on this runner under the current runner-group access policy. These edges do not indicate that the job has actually executed on the runner.
10
10
 
11
+ When the runner is not explicitly marked ephemeral, GH_CanInterceptJob edges identify workflow jobs whose future execution context may be exposed to an actor controlling the runner.
12
+
11
13
  ## Properties
12
14
 
13
15
  | Property | Type | Description |
@@ -34,6 +36,7 @@ GH_RunsOn edges from GH_WorkflowJob nodes identify statically resolvable jobs th
34
36
  | `query_group` | `string` | Query for group. |
35
37
  | `query_repositories` | `string` | Query for repositories. |
36
38
  | `query_jobs` | `string` | Query for workflow jobs that can be scheduled on the runner. |
39
+ | `query_interceptable_jobs` | `string` | Query for workflow jobs the runner can intercept. |
37
40
 
38
41
  ## Diagram
39
42
 
@@ -45,4 +48,5 @@ graph LR
45
48
  n0 -.->|GH_Contains| n1
46
49
  n0 -->|GH_HasRunner| n1
47
50
  n2 -.->|GH_RunsOn| n1
51
+ n1 -->|GH_CanInterceptJob| n2
48
52
  ```
@@ -8,6 +8,8 @@ The node captures runner metadata such as operating system, status, busy state,
8
8
 
9
9
  GH_RunsOn edges from GH_WorkflowJob nodes identify statically resolvable jobs in the containing repository that GitHub could schedule on this runner. These edges do not indicate that the job has actually executed on the runner.
10
10
 
11
+ When the runner is not explicitly marked ephemeral, GH_CanInterceptJob edges identify workflow jobs whose future execution context may be exposed to an actor controlling the runner.
12
+
11
13
  ## Properties
12
14
 
13
15
  | Property | Type | Description |
@@ -34,6 +36,7 @@ GH_RunsOn edges from GH_WorkflowJob nodes identify statically resolvable jobs in
34
36
  | `query_group` | `string` | Query for group. |
35
37
  | `query_repositories` | `string` | Query for repositories. |
36
38
  | `query_jobs` | `string` | Query for workflow jobs that can be scheduled on the runner. |
39
+ | `query_interceptable_jobs` | `string` | Query for workflow jobs the runner can intercept. |
37
40
 
38
41
  ## Diagram
39
42
 
@@ -45,4 +48,5 @@ graph LR
45
48
  n0 -.->|GH_CanUseRunner| n1
46
49
  n0 -.->|GH_Contains| n1
47
50
  n2 -.->|GH_RunsOn| n1
51
+ n1 -->|GH_CanInterceptJob| n2
48
52
  ```
@@ -4,6 +4,8 @@
4
4
 
5
5
  Represents a GitHub repository within the organization. Repository nodes capture metadata about the repo including visibility, Actions enablement status, and security configuration. Repository role nodes (GH_RepoRole) are created alongside each repository to represent the permission levels available.
6
6
 
7
+ For repositories with active workflows, the collector records the applicable default workflow permissions and whether workflows may approve pull request reviews. These properties preserve the repository-level policy input later used to derive effective GITHUB_TOKEN permissions for GH_WorkflowJob nodes.
8
+
7
9
  ## Properties
8
10
 
9
11
  | Property | Type | Description |
@@ -40,6 +42,8 @@ Represents a GitHub repository within the organization. Repository nodes capture
40
42
  | `secret_scanning` | `string` | Status of secret scanning (e.g., `enabled`, `disabled`). |
41
43
  | `branch_ruleset_count` | `integer` | Number of branch-targeted rulesets that apply to this repository. |
42
44
  | `has_branch_rulesets` | `boolean` | Whether at least one branch-targeted ruleset applies to this repository. |
45
+ | `default_workflow_permissions` | `string` | The repository's applicable default GITHUB_TOKEN workflow permissions. |
46
+ | `can_approve_pull_request_reviews` | `boolean` | Whether workflows may approve pull request reviews. |
43
47
  | `query_branches` | `string` | Query for branches. |
44
48
  | `query_protected_branches` | `string` | Query for protected branches. |
45
49
  | `query_branch_protection_rules` | `string` | Query for branch protection rules. |
@@ -4,6 +4,8 @@
4
4
 
5
5
  Represents a GitHub Actions workflow defined in a repository. Workflow nodes capture the workflow definition metadata including its file path, state, containing repository, and the full YAML contents of the workflow file. Only repositories with GitHub Actions enabled are queried for workflows.
6
6
 
7
+ When present, `workflow_permissions` captures the top-level `permissions` declaration from the workflow YAML.
8
+
7
9
  ## Properties
8
10
 
9
11
  | Property | Type | Description |
@@ -25,6 +27,7 @@ Represents a GitHub Actions workflow defined in a repository. Workflow nodes cap
25
27
  | `triggers` | `list[string]` | The triggers value. |
26
28
  | `trigger_dispatch_inputs` | `list[string]` | The trigger dispatch inputs value. |
27
29
  | `is_pwn_requestable` | `boolean` | The is pwn requestable value. |
30
+ | `workflow_permissions` | `list[string]` | Permissions declared at the workflow level. |
28
31
  | `query_repository` | `string` | Query for repository. |
29
32
  | `query_jobs` | `string` | Query for workflow jobs. |
30
33
  | `query_execution` | `string` | Query for workflow executions. |
@@ -6,6 +6,12 @@ Represents a single job within a GitHub Actions workflow. Jobs are the top-level
6
6
 
7
7
  When the job has a statically resolvable self-hosted `runs-on` selector, GH_RunsOn edges identify each GH_Runner that currently satisfies the declared label and runner-group constraints under the repository's runner access policy. These edges represent schedulability, not historical execution.
8
8
 
9
+ When present, `job_permissions` captures the job-level `permissions` declaration from the workflow YAML. `effective_github_token_permissions` captures the calculated static `GITHUB_TOKEN` permissions after applying the repository default, workflow-level declaration, and job-level declaration.
10
+
11
+ GH_CanAccessSecret edges identify secrets statically referenced by the job's modeled steps or job-level `env` block that the job execution context can access. GH_CanInterceptJob edges from GH_Runner nodes not explicitly marked ephemeral identify jobs whose future execution context may be exposed if that runner is controlled.
12
+
13
+ When `runs_on_is_dynamic` is true, runner matching and interception status remain unresolved: the collector does not emit GH_CanInterceptJob edges for the job, so `query_interceptable_jobs` cannot match it and the absence of an edge must not be treated as evidence that the job is definitively non-interceptable.
14
+
9
15
  ## Properties
10
16
 
11
17
  | Property | Type | Description |
@@ -23,7 +29,9 @@ When the job has a statically resolvable self-hosted `runs-on` selector, GH_Runs
23
29
  | `is_self_hosted` | `boolean` | Whether the job targets self-hosted runners. |
24
30
  | `container` | `string` | The optional container configuration. |
25
31
  | `environment` | `string` | The deployment environment name. |
26
- | `permissions` | `list[string]` | Effective job permissions. |
32
+ | `permissions` | `list[string]` | Applicable declared workflow or job permissions after job-over-workflow precedence. |
33
+ | `job_permissions` | `list[string]` | Optional permissions declared at the job level; absent when the job has no declaration. |
34
+ | `effective_github_token_permissions` | `list[string]` | Calculated GITHUB_TOKEN permissions after repository defaults and declarations are applied. |
27
35
  | `uses_reusable` | `string` | The reusable workflow reference used by this job. |
28
36
  | `workflow_node_id` | `string` | The parent workflow node ID. |
29
37
  | `repository_name` | `string` | The containing repository name. |
@@ -33,6 +41,7 @@ When the job has a statically resolvable self-hosted `runs-on` selector, GH_Runs
33
41
  | `query_steps` | `string` | Query for workflow steps. |
34
42
  | `query_references` | `string` | Query for workflow references (secrets and variables). |
35
43
  | `query_runners` | `string` | Query for eligible self-hosted runners. |
44
+ | `query_accessible_secrets` | `string` | Query for secrets accessible to the job execution context. |
36
45
 
37
46
  ## Diagram
38
47
 
@@ -58,6 +67,10 @@ graph LR
58
67
  n1 -.->|GH_UsesSecret| n7
59
68
  n1 -.->|GH_UsesVariable| n8
60
69
  n1 -.->|GH_RunsOn| n9
70
+ n1 -->|GH_CanAccessSecret| n3
71
+ n1 -->|GH_CanAccessSecret| n5
72
+ n1 -->|GH_CanAccessSecret| n7
73
+ n9 -->|GH_CanInterceptJob| n1
61
74
  n1 -.->|GH_CallsWorkflow| n0
62
75
  n1 -.->|GH_DependsOn| n1
63
76
  n1 -.->|GH_Contains| n10
@@ -2,6 +2,15 @@
2
2
 
3
3
  Pre-built Cypher queries for identifying security-relevant configurations across your GitHub organization. Each query is stored as an individual JSON file with `name`, `query`, and `description` fields, designed to be imported into BloodHound's saved queries feature.
4
4
 
5
+ ## Runner Interception Analysis
6
+
7
+ Use the runner interception searches as a progression:
8
+
9
+ 1. Start with `workflow-jobs-interceptable-by-self-hosted-runners.json` to inventory jobs whose future execution context may be exposed to collected self-hosted runners.
10
+ 2. Prioritize `shared-self-hosted-runners-can-intercept-secret-bearing-jobs.json` because organization- and enterprise-scoped runners can create cross-repository blast radius.
11
+ 3. Use `self-hosted-runners-can-intercept-broad-token-jobs.json` and `workflow-jobs-with-id-token-write-on-self-hosted-runners.json` to find interceptable jobs with high-impact GITHUB_TOKEN or OIDC permissions.
12
+ 4. For a specific finding, follow `GH_RunsOn`, `GH_CanUseRunner`, `GH_CanAccessSecret`, and the workflow/job/step nodes to verify why the runner is eligible and what the job can access.
13
+
5
14
  ## Severity Levels
6
15
 
7
16
  | Indicator | Severity | Description |
@@ -79,21 +88,28 @@ Pre-built Cypher queries for identifying security-relevant configurations across
79
88
  | 39 | `dangerous-branch-perms.json` | Dangerous Branch Permissions | Identifies users with dangerous branch permissions in a GitHub organization, including bypass allowances on protection rules. |
80
89
  | 40 | `org-roles-bypass-security-scanning.json` | Org Roles That Can Bypass Security Scanning | Finds organization roles with permissions to bypass or manage security scanning dismissals. These roles can suppress secret scanning and code scanning findings. |
81
90
  | 41 | `github-to-azure-identity.json` | GitHub-to-Azure Identity Assumptions | Finds GitHub entities (repositories, branches, environments) that can assume Azure identities via OIDC federation. Verify that each trust relationship is intentional and scoped appropriately. |
91
+ | 42 | `workflow-jobs-with-id-token-write.json` | Workflow Jobs with OIDC Token Permission | Returns workflow jobs whose effective GITHUB_TOKEN permissions include `id-token:write`. |
92
+ | 43 | `workflow-jobs-with-id-token-write-on-self-hosted-runners.json` | OIDC-Capable Workflow Jobs Interceptable by Self-Hosted Runners | Returns OIDC-capable jobs whose execution context may be exposed to collected self-hosted runners. |
93
+ | 44 | `workflow-jobs-with-broad-token-write-permissions.json` | Workflow Jobs with Broad GITHUB_TOKEN Write Permissions | Returns jobs with effective write access to repository contents, Actions, or pull requests. |
94
+ | 45 | `workflow-jobs-with-observed-oidc-auth-steps.json` | Workflow Jobs with Observed OIDC Authentication Steps | Returns OIDC-capable jobs with descendant steps that show likely token consumption. |
95
+ | 46 | `workflow-jobs-interceptable-by-self-hosted-runners.json` | Workflow Jobs Interceptable by Self-Hosted Runners | Returns workflow jobs whose future execution context may be exposed to collected self-hosted runners. |
96
+ | 47 | `shared-self-hosted-runners-can-intercept-secret-bearing-jobs.json` | Shared Self-Hosted Runners Can Intercept Secret-Bearing Jobs | Returns shared organization- and enterprise-scoped runners that can intercept jobs with secret access. |
97
+ | 48 | `self-hosted-runners-can-intercept-broad-token-jobs.json` | Self-Hosted Runners Can Intercept Broad-Token Jobs | Returns self-hosted runners that can intercept jobs with high-impact GITHUB_TOKEN write permissions. |
82
98
 
83
99
  ### :white_circle: Low &mdash; Hygiene & Governance
84
100
 
85
101
  | # | File | Name | Description |
86
102
  |---|------|------|-------------|
87
- | 42 | `environments-admin-bypass.json` | Environments Where Admins Can Bypass Protections | 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. |
88
- | 43 | `app-installations-all-repos.json` | App Installations with Access to All Repositories | Finds GitHub App installations that have access to every repository in the organization. A compromised app credential would affect all repositories. |
89
- | 44 | `users-without-external-identity.json` | GitHub Users Without External Identity Mapping | Finds GitHub users that are not linked to any external identity via SAML or SCIM. These users cannot be centrally offboarded through the identity provider and may retain access after employment ends. |
90
- | 45 | `external-identities-without-scim.json` | External Identities Without SCIM Provisioning | Finds external identities that lack SCIM synchronization. Without SCIM, user deprovisioning in the identity provider will not automatically revoke GitHub access. |
91
- | 46 | `org-owners.json` | Organization Owners | Returns all users who hold the organization owners role. |
92
- | 47 | `privileged-custom-org-roles.json` | Privileged Custom Org Roles | Returns all custom organization roles that are privileged (i.e., have permissions that are not default). |
93
- | 48 | `global-repo-perms.json` | Global Repo Permissions | Returns all users who hold a global repository permission role (i.e., roles that are not default). |
94
- | 49 | `hybrid-identities.json` | External Identities | Returns all external identities (e.g., Azure or Okta users) that are associated with GitHub users. |
95
- | 50 | `privileged-hybrid-identities.json` | Privileged Hybrid Identities | Returns all hybrid identities (e.g., Azure or Okta users) that are associated with GitHub users who hold the organization owners role. |
96
- | 51 | `saml-configuration.json` | SAML Configuration Mapping | Finds SAML Identity Providers, their external identities, and mapped users. |
97
- | 52 | `team-membership-admin.json` | Team Membership Admins | Returns all users who hold the maintainer role over a team, including team nesting. |
98
- | 53 | `team-structure.json` | Team Structure | Returns the structure of teams within organizations, including team roles and their members. |
99
- | 54 | `repository-workflows.json` | Repository Workflows | Returns all repository workflows. |
103
+ | 49 | `environments-admin-bypass.json` | Environments Where Admins Can Bypass Protections | 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. |
104
+ | 50 | `app-installations-all-repos.json` | App Installations with Access to All Repositories | Finds GitHub App installations that have access to every repository in the organization. A compromised app credential would affect all repositories. |
105
+ | 51 | `users-without-external-identity.json` | GitHub Users Without External Identity Mapping | Finds GitHub users that are not linked to any external identity via SAML or SCIM. These users cannot be centrally offboarded through the identity provider and may retain access after employment ends. |
106
+ | 52 | `external-identities-without-scim.json` | External Identities Without SCIM Provisioning | Finds external identities that lack SCIM synchronization. Without SCIM, user deprovisioning in the identity provider will not automatically revoke GitHub access. |
107
+ | 53 | `org-owners.json` | Organization Owners | Returns all users who hold the organization owners role. |
108
+ | 54 | `privileged-custom-org-roles.json` | Privileged Custom Org Roles | Returns all custom organization roles that are privileged (i.e., have permissions that are not default). |
109
+ | 55 | `global-repo-perms.json` | Global Repo Permissions | Returns all users who hold a global repository permission role (i.e., roles that are not default). |
110
+ | 56 | `hybrid-identities.json` | External Identities | Returns all external identities (e.g., Azure or Okta users) that are associated with GitHub users. |
111
+ | 57 | `privileged-hybrid-identities.json` | Privileged Hybrid Identities | Returns all hybrid identities (e.g., Azure or Okta users) that are associated with GitHub users who hold the organization owners role. |
112
+ | 58 | `saml-configuration.json` | SAML Configuration Mapping | Finds SAML Identity Providers, their external identities, and mapped users. |
113
+ | 59 | `team-membership-admin.json` | Team Membership Admins | Returns all users who hold the maintainer role over a team, including team nesting. |
114
+ | 60 | `team-structure.json` | Team Structure | Returns the structure of teams within organizations, including team roles and their members. |
115
+ | 61 | `repository-workflows.json` | Repository Workflows | Returns all repository workflows. |
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "GitHub: Self-Hosted Runners Can Intercept Broad-Token Jobs",
3
+ "query": "MATCH p=(runner:GH_Runner)-[:GH_CanInterceptJob]->(job:GH_WorkflowJob)\nWHERE 'contents:write' IN job.effective_github_token_permissions\nOR 'actions:write' IN job.effective_github_token_permissions\nOR 'pull-requests:write' IN job.effective_github_token_permissions\nRETURN p\nLIMIT 1000",
4
+ "description": "Returns self-hosted runners that can intercept workflow jobs whose effective GITHUB_TOKEN has high-impact write permissions. These jobs can materially increase the blast radius of runner compromise."
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "GitHub: Shared Self-Hosted Runners Can Intercept Secret-Bearing Jobs",
3
+ "query": "MATCH p=(runner:GH_Runner)-[:GH_CanInterceptJob]->(job:GH_WorkflowJob)-[:GH_CanAccessSecret]->(secret:GH_Secret)\nWHERE runner:GH_OrgRunner\nOR runner:GH_EnterpriseRunner\nRETURN p\nLIMIT 1000",
4
+ "description": "Returns organization- and enterprise-scoped self-hosted runners that can intercept workflow jobs with statically resolvable secret access. Shared runners are especially important to review because compromise can expose execution contexts across multiple repositories."
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "GitHub: Workflow Jobs Interceptable by Self-Hosted Runners",
3
+ "query": "MATCH p=(runner:GH_Runner)-[:GH_CanInterceptJob]->(job:GH_WorkflowJob)\nRETURN p\nLIMIT 1000",
4
+ "description": "Returns workflow jobs whose future execution context may be exposed to an actor controlling a collected self-hosted runner that is not explicitly marked ephemeral."
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "GitHub: Workflow Jobs with Broad GITHUB_TOKEN Write Permissions",
3
+ "query": "MATCH p=(repo:GH_Repository)-[:GH_Contains]->(:GH_Workflow)-[:GH_Contains]->(job:GH_WorkflowJob)\nWHERE 'contents:write' IN job.effective_github_token_permissions\nOR 'actions:write' IN job.effective_github_token_permissions\nOR 'pull-requests:write' IN job.effective_github_token_permissions\nRETURN p\nLIMIT 1000",
4
+ "description": "Returns workflow jobs whose calculated effective GITHUB_TOKEN permissions include write access to repository contents, Actions, or pull requests. These permissions can materially increase the impact of workflow compromise."
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "GitHub: OIDC-Capable Workflow Jobs Interceptable by Self-Hosted Runners",
3
+ "query": "MATCH p=(runner:GH_Runner)-[:GH_CanInterceptJob]->(job:GH_WorkflowJob)\nWHERE 'id-token:write' IN job.effective_github_token_permissions\nRETURN p\nLIMIT 1000",
4
+ "description": "Returns OIDC-capable workflow jobs whose execution context may be exposed to an actor controlling a collected self-hosted runner that is not explicitly marked ephemeral. These jobs are especially important to review because runner compromise could expose short-lived cloud federation tokens."
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "GitHub: Workflow Jobs with OIDC Token Permission",
3
+ "query": "MATCH p=(repo:GH_Repository)-[:GH_Contains]->(:GH_Workflow)-[:GH_Contains]->(job:GH_WorkflowJob)\nWHERE 'id-token:write' IN job.effective_github_token_permissions\nRETURN p\nLIMIT 1000",
4
+ "description": "Returns workflow jobs whose calculated effective GITHUB_TOKEN permissions include id-token:write. These jobs can request GitHub OIDC tokens, though additional step analysis is needed to determine whether the token is actually used."
5
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "name": "GitHub: Workflow Jobs with Observed OIDC Authentication Steps",
3
+ "query": "MATCH p=(repo:GH_Repository)-[:GH_Contains]->(:GH_Workflow)-[:GH_Contains]->(job:GH_WorkflowJob)-[:GH_Contains]->(step:GH_WorkflowStep)\nWHERE 'id-token:write' IN job.effective_github_token_permissions\nAND (\n step.action_slug = 'aws-actions/configure-aws-credentials'\n OR step.action_slug = 'azure/login'\n OR step.action_slug = 'Azure/login'\n OR step.action_slug = 'actions/deploy-pages'\n OR step.contents CONTAINS 'getIDToken'\n OR step.contents CONTAINS 'ACTIONS_ID_TOKEN_REQUEST_URL'\n OR step.contents CONTAINS 'ACTIONS_ID_TOKEN_REQUEST_TOKEN'\n)\nRETURN p\nLIMIT 1000",
4
+ "description": "Returns OIDC-capable workflow jobs with direct descendant steps that show likely OIDC token consumption, including common AWS, Azure, GitHub Pages, and direct token-request patterns. This is evidence of likely use, not a complete classifier for every possible OIDC consumer; reusable workflow callers may require following GH_CallsWorkflow to find the consuming steps."
5
+ }
@@ -1035,6 +1035,11 @@
1035
1035
  "description": "[Workflow] Job can be scheduled on this self-hosted runner based on its static runs-on selector — GH_WorkflowJob → GH_Runner",
1036
1036
  "is_traversable": false
1037
1037
  },
1038
+ {
1039
+ "name": "GH_CanInterceptJob",
1040
+ "description": "[Computed] Persistent self-hosted runner can intercept a workflow job that may be scheduled on it — GH_Runner → GH_WorkflowJob",
1041
+ "is_traversable": true
1042
+ },
1038
1043
  {
1039
1044
  "name": "GH_HasMember",
1040
1045
  "description": "Enterprise or organization has this user as a member",
@@ -1045,6 +1050,11 @@
1045
1050
  "description": "[Workflow] Job or step references a secret by name — GH_WorkflowJob / GH_WorkflowStep → GH_RepoSecret / GH_OrgSecret / GH_EnvironmentSecret (scope match)",
1046
1051
  "is_traversable": false
1047
1052
  },
1053
+ {
1054
+ "name": "GH_CanAccessSecret",
1055
+ "description": "[Computed] Workflow job execution context can access a statically referenced secret — GH_WorkflowJob → GH_RepoSecret / GH_OrgSecret / GH_EnvironmentSecret",
1056
+ "is_traversable": true
1057
+ },
1048
1058
  {
1049
1059
  "name": "GH_UsesVariable",
1050
1060
  "description": "[Workflow] Job or step references a variable by name — GH_WorkflowJob / GH_WorkflowStep → GH_RepoVariable / GH_OrgVariable / GH_EnvironmentVariable (scope match)",
@@ -19,6 +19,8 @@ MEMBER_OF = "GH_MemberOf"
19
19
  CAN_ACCESS = "GH_CanAccess"
20
20
  CAN_USE_RUNNER = "GH_CanUseRunner"
21
21
  RUNS_ON = "GH_RunsOn"
22
+ CAN_INTERCEPT_JOB = "GH_CanInterceptJob"
23
+ CAN_ACCESS_SECRET = "GH_CanAccessSecret"
22
24
  IS_ELIGIBLE_FOR = "GH_IsEligibleFor"
23
25
  CAN_CREATE_REPOSITORY_WITH_RUNNER_ACCESS = "GH_CanCreateRepositoryWithRunnerAccess"
24
26
  CAN_CREATE_BRANCH = "GH_CanCreateBranch"
@@ -218,13 +218,13 @@ class GithubLookup(LookupManager):
218
218
  return True
219
219
 
220
220
  @lru_cache
221
- def workflow_job_runner_node_ids(
221
+ def _workflow_job_runner_matches(
222
222
  self,
223
223
  repository_node_id: str,
224
224
  org_login: str,
225
225
  group_name: str | None,
226
226
  labels: tuple[str, ...],
227
- ) -> list[str]:
227
+ ) -> list[tuple[str, bool | None]]:
228
228
  """Return accessible self-hosted runners matching a static runs-on selector."""
229
229
  if not group_name and not labels:
230
230
  return []
@@ -243,21 +243,23 @@ class GithubLookup(LookupManager):
243
243
 
244
244
  repository_visibility, actions_enabled = repository
245
245
  required_labels = {str(label).casefold() for label in labels}
246
- matching_runner_node_ids: list[str] = []
246
+ matching_runners: list[tuple[str, bool | None]] = []
247
247
  seen_runner_node_ids: set[str] = set()
248
248
 
249
- def add_matching_runner(node_id: str, raw_labels: Any) -> None:
249
+ def add_matching_runner(
250
+ node_id: str, raw_labels: Any, ephemeral: bool | None
251
+ ) -> None:
250
252
  if node_id in seen_runner_node_ids:
251
253
  return
252
254
  if not required_labels.issubset(self._runner_label_names(raw_labels)):
253
255
  return
254
256
  seen_runner_node_ids.add(node_id)
255
- matching_runner_node_ids.append(node_id)
257
+ matching_runners.append((node_id, ephemeral))
256
258
 
257
259
  if group_name is None:
258
- for runner_id, raw_labels in self._find_all_objects(
260
+ for runner_id, raw_labels, ephemeral in self._find_all_objects(
259
261
  f"""
260
- SELECT id, labels
262
+ SELECT id, labels, ephemeral
261
263
  FROM {self.schema}.repo_runners
262
264
  WHERE repository_node_id = ?
263
265
  """,
@@ -266,6 +268,7 @@ class GithubLookup(LookupManager):
266
268
  add_matching_runner(
267
269
  runner_node_id(repository_node_id, int(runner_id)),
268
270
  raw_labels,
271
+ ephemeral,
269
272
  )
270
273
 
271
274
  if actions_enabled is not True:
@@ -329,9 +332,9 @@ class GithubLookup(LookupManager):
329
332
  if not identity:
330
333
  continue
331
334
  enterprise_node_id, enterprise_runner_group_id = identity
332
- for runner_id, raw_labels in self._find_all_objects(
335
+ for runner_id, raw_labels, ephemeral in self._find_all_objects(
333
336
  f"""
334
- SELECT r.id, r.labels
337
+ SELECT r.id, r.labels, r.ephemeral
335
338
  FROM {self.schema}.enterprise_runner_group_memberships m
336
339
  JOIN {self.schema}.enterprise_runners r
337
340
  ON r.enterprise_node_id = m.enterprise_node_id
@@ -344,12 +347,13 @@ class GithubLookup(LookupManager):
344
347
  add_matching_runner(
345
348
  runner_node_id(enterprise_node_id, int(runner_id)),
346
349
  raw_labels,
350
+ ephemeral,
347
351
  )
348
352
  continue
349
353
 
350
- for runner_id, raw_labels in self._find_all_objects(
354
+ for runner_id, raw_labels, ephemeral in self._find_all_objects(
351
355
  f"""
352
- SELECT r.id, r.labels
356
+ SELECT r.id, r.labels, r.ephemeral
353
357
  FROM {self.schema}.org_runner_group_memberships m
354
358
  JOIN {self.schema}.org_runners r
355
359
  ON r.org_login = m.org_login
@@ -362,9 +366,76 @@ class GithubLookup(LookupManager):
362
366
  add_matching_runner(
363
367
  runner_node_id(self.org_id_for_login(org_login), int(runner_id)),
364
368
  raw_labels,
369
+ ephemeral,
365
370
  )
366
371
 
367
- return matching_runner_node_ids
372
+ return matching_runners
373
+
374
+ @lru_cache
375
+ def workflow_job_runner_node_ids(
376
+ self,
377
+ repository_node_id: str,
378
+ org_login: str,
379
+ group_name: str | None,
380
+ labels: tuple[str, ...],
381
+ ) -> list[str]:
382
+ """Return accessible self-hosted runner node IDs matching a static selector."""
383
+ return [
384
+ runner_node_id
385
+ for runner_node_id, _ephemeral in self._workflow_job_runner_matches(
386
+ repository_node_id,
387
+ org_login,
388
+ group_name,
389
+ labels,
390
+ )
391
+ ]
392
+
393
+ @lru_cache
394
+ def workflow_job_interceptable_runner_node_ids(
395
+ self,
396
+ repository_node_id: str,
397
+ org_login: str,
398
+ group_name: str | None,
399
+ labels: tuple[str, ...],
400
+ ) -> list[str]:
401
+ """Return matching runner node IDs not explicitly marked ephemeral."""
402
+ return [
403
+ runner_node_id
404
+ for runner_node_id, ephemeral in self._workflow_job_runner_matches(
405
+ repository_node_id,
406
+ org_login,
407
+ group_name,
408
+ labels,
409
+ )
410
+ if ephemeral is not True
411
+ ]
412
+
413
+ @lru_cache
414
+ def workflow_step_secret_reference_names(self, job_node_id: str) -> list[str]:
415
+ """Return unique secret names statically referenced by steps in a job."""
416
+ names: list[str] = []
417
+ seen: set[str] = set()
418
+ for (raw_references,) in self._find_all_objects(
419
+ f"""
420
+ SELECT secret_references
421
+ FROM {self.schema}.workflow_steps
422
+ WHERE job_node_id = ?
423
+ """,
424
+ [job_node_id],
425
+ ):
426
+ for reference in self._json_list(raw_references):
427
+ if not isinstance(reference, dict):
428
+ continue
429
+ name = reference.get("name")
430
+ if name is None:
431
+ continue
432
+ name = str(name)
433
+ key = name.casefold()
434
+ if key in seen:
435
+ continue
436
+ seen.add(key)
437
+ names.append(name)
438
+ return names
368
439
 
369
440
  @lru_cache
370
441
  def enterprise_idp_for_scope(
@@ -512,6 +583,34 @@ class GithubLookup(LookupManager):
512
583
  return None
513
584
  return int(row[0])
514
585
 
586
+ @lru_cache
587
+ def repository_workflow_permissions(
588
+ self, repository_node_id: str
589
+ ) -> tuple[str | None, bool | None] | None:
590
+ row = self._find_single_row(
591
+ f"""
592
+ SELECT
593
+ repository_default_workflow_permissions,
594
+ repository_can_approve_pull_request_reviews
595
+ FROM {self.schema}.workflows
596
+ WHERE repository_node_id = ?
597
+ LIMIT 1
598
+ """,
599
+ [repository_node_id],
600
+ )
601
+ if row is None:
602
+ return None
603
+
604
+ default_workflow_permissions, can_approve_pull_request_reviews = row
605
+ return (
606
+ default_workflow_permissions,
607
+ (
608
+ None
609
+ if can_approve_pull_request_reviews is None
610
+ else bool(can_approve_pull_request_reviews)
611
+ ),
612
+ )
613
+
515
614
  @lru_cache
516
615
  def repository_default_branch_collected(self, repository_node_id: str) -> bool:
517
616
  """Return whether the repository's REST default branch was collected."""
@@ -41,6 +41,8 @@ class GHRepositoryProperties(GHNodeProperties):
41
41
  environment_name: The name of the environment (GitHub organization).
42
42
  actions_enabled: Whether GitHub Actions is enabled for this repository.
43
43
  self_hosted_runners_enabled: Whether the repository may use self-hosted runners.
44
+ default_workflow_permissions: The repository's applicable default GITHUB_TOKEN workflow permissions.
45
+ can_approve_pull_request_reviews: Whether workflows may approve pull request reviews.
44
46
  secret_scanning: Status of secret scanning (e.g., `enabled`, `disabled`).
45
47
  branch_ruleset_count: Number of branch-targeted rulesets that apply to this repository.
46
48
  has_branch_rulesets: Whether at least one branch-targeted ruleset applies to this repository.
@@ -87,6 +89,8 @@ class GHRepositoryProperties(GHNodeProperties):
87
89
  environment_name: str | None = None
88
90
  actions_enabled: bool | None = None
89
91
  self_hosted_runners_enabled: bool | None = None
92
+ default_workflow_permissions: str | None = None
93
+ can_approve_pull_request_reviews: bool | None = None
90
94
  secret_scanning: str | None = None
91
95
  branch_ruleset_count: int | None = None
92
96
  has_branch_rulesets: bool | None = None
@@ -226,6 +230,10 @@ class Repository(BaseAsset):
226
230
  def as_node(self) -> GHNode:
227
231
  rid = self.node_id
228
232
  branch_ruleset_count = self._lookup.repository_branch_ruleset_count(rid)
233
+ workflow_permissions = self._lookup.repository_workflow_permissions(rid)
234
+ default_workflow_permissions, can_approve_pull_request_reviews = (
235
+ workflow_permissions if workflow_permissions else (None, None)
236
+ )
229
237
  return GHNode(
230
238
  kinds=[nk.REPOSITORY],
231
239
  properties=GHRepositoryProperties(
@@ -256,6 +264,8 @@ class Repository(BaseAsset):
256
264
  environmentid=self.org_node_id,
257
265
  actions_enabled=self.actions_enabled,
258
266
  self_hosted_runners_enabled=self.self_hosted_runners_enabled,
267
+ default_workflow_permissions=default_workflow_permissions,
268
+ can_approve_pull_request_reviews=can_approve_pull_request_reviews,
259
269
  branch_ruleset_count=branch_ruleset_count,
260
270
  has_branch_rulesets=(
261
271
  branch_ruleset_count > 0