openhound-github 0.7.3__tar.gz → 0.8.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 (417) hide show
  1. {openhound_github-0.7.3 → openhound_github-0.8.0}/PKG-INFO +1 -1
  2. openhound_github-0.8.0/descriptions/edges/GH_RunsOn.md +24 -0
  3. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_EnterpriseRunner.md +5 -0
  4. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_OrgRunner.md +5 -0
  5. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_RepoRunner.md +5 -0
  6. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_WorkflowJob.md +10 -2
  7. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/schema.json +5 -0
  8. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/kinds/edges.py +1 -0
  9. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/lookup.py +199 -0
  10. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/main.py +6 -0
  11. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/runner.py +5 -0
  12. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/workflow.py +52 -0
  13. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/workflow_job.py +61 -29
  14. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/transforms.py +87 -0
  15. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_runner_models.py +144 -0
  16. openhound_github-0.8.0/tests/test_workflow_model.py +282 -0
  17. openhound_github-0.7.3/tests/test_workflow_model.py +0 -147
  18. {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/CODE_OF_CONDUCT.md +0 -0
  19. {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/CONTRIBUTING.md +0 -0
  20. {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/GOVERNANCE.md +0 -0
  21. {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/GitHub-COC-Header.png +0 -0
  22. {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/GitHub-CONTRIB-Header.png +0 -0
  23. {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/GitHub-GOV-Header.png +0 -0
  24. {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/GitHub-Header.png +0 -0
  25. {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/GitHub-LIC-Header.png +0 -0
  26. {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/GitHub-SEC-Header.png +0 -0
  27. {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/SECURITY.md +0 -0
  28. {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/SO-Dark.svg +0 -0
  29. {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/SO-FOSS-Dark.svg +0 -0
  30. {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/SO-FOSS-Light.svg +0 -0
  31. {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/SO-Light.svg +0 -0
  32. {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/workflows/publish.yml +0 -0
  33. {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/workflows/release-on-merge.yml +0 -0
  34. {openhound_github-0.7.3 → openhound_github-0.8.0}/.github/workflows/validate-branch.yml +0 -0
  35. {openhound_github-0.7.3 → openhound_github-0.8.0}/.gitignore +0 -0
  36. {openhound_github-0.7.3 → openhound_github-0.8.0}/.gitmodules +0 -0
  37. {openhound_github-0.7.3 → openhound_github-0.8.0}/.pre-commit-config.yaml +0 -0
  38. {openhound_github-0.7.3 → openhound_github-0.8.0}/LICENSE.md +0 -0
  39. {openhound_github-0.7.3 → openhound_github-0.8.0}/README.md +0 -0
  40. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_AddAssignee.md +0 -0
  41. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_AddCollaborator.md +0 -0
  42. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_AddLabel.md +0 -0
  43. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_AddMember.md +0 -0
  44. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_AdminTo.md +0 -0
  45. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ApprovesDeploymentTo.md +0 -0
  46. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_AssignedTo.md +0 -0
  47. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_BypassBranchProtection.md +0 -0
  48. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_BypassPullRequestAllowances.md +0 -0
  49. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CallsWorkflow.md +0 -0
  50. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanAccess.md +0 -0
  51. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanAssumeIdentity.md +0 -0
  52. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanCreateBranch.md +0 -0
  53. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanCreateEnvironment.md +0 -0
  54. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanCreateInternalRepositories.md +0 -0
  55. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanCreatePrivateRepositories.md +0 -0
  56. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanCreatePublicRepositories.md +0 -0
  57. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanCreateRepositories.md +0 -0
  58. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanCreateRepositoryWithRunnerAccess.md +0 -0
  59. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanDeployToEnvironment.md +0 -0
  60. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanEditEnvironment.md +0 -0
  61. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanEditProtection.md +0 -0
  62. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanPwnRequest.md +0 -0
  63. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanReadSecret.md +0 -0
  64. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanReadSecretScanningAlert.md +0 -0
  65. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanUseRunner.md +0 -0
  66. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CanWriteBranch.md +0 -0
  67. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CloseDiscussion.md +0 -0
  68. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CloseIssue.md +0 -0
  69. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ClosePullRequest.md +0 -0
  70. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_Contains.md +0 -0
  71. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ConvertIssuesToDiscussions.md +0 -0
  72. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CreateDiscussionCategory.md +0 -0
  73. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CreateEnterpriseOrganizations.md +0 -0
  74. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CreateRepository.md +0 -0
  75. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CreateSoloMergeQueueEntry.md +0 -0
  76. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CreateTag.md +0 -0
  77. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_CreateTeam.md +0 -0
  78. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_DeleteAlertsCodeScanning.md +0 -0
  79. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_DeleteDiscussion.md +0 -0
  80. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_DeleteDiscussionComment.md +0 -0
  81. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_DeleteIssue.md +0 -0
  82. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_DeleteTag.md +0 -0
  83. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_DependsOn.md +0 -0
  84. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_DeploysTo.md +0 -0
  85. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_EditCategoryOnDiscussion.md +0 -0
  86. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_EditDiscussionCategory.md +0 -0
  87. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_EditDiscussionComment.md +0 -0
  88. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_EditEnterpriseCustomPropertiesForOrganizations.md +0 -0
  89. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_EditRepoAnnouncementBanners.md +0 -0
  90. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_EditRepoCustomPropertiesValues.md +0 -0
  91. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_EditRepoMetadata.md +0 -0
  92. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_EditRepoProtections.md +0 -0
  93. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_HasBaseRole.md +0 -0
  94. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_HasExternalIdentity.md +0 -0
  95. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_HasMember.md +0 -0
  96. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_HasPersonalAccessToken.md +0 -0
  97. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_HasPersonalAccessTokenRequest.md +0 -0
  98. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_HasRole.md +0 -0
  99. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_HasRunner.md +0 -0
  100. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_HasSamlIdentityProvider.md +0 -0
  101. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_HasSecret.md +0 -0
  102. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_HasVariable.md +0 -0
  103. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_InheritedFrom.md +0 -0
  104. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_InstalledAs.md +0 -0
  105. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_InviteMember.md +0 -0
  106. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_IsEligibleFor.md +0 -0
  107. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_JumpMergeQueue.md +0 -0
  108. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageDeployKeys.md +0 -0
  109. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageDiscussionBadges.md +0 -0
  110. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageEnterpriseAdmins.md +0 -0
  111. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageEnterpriseIdentityProvider.md +0 -0
  112. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageEnterpriseMembers.md +0 -0
  113. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageEnterpriseOrganizationAdmins.md +0 -0
  114. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageEnterpriseOrganizations.md +0 -0
  115. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageEnterpriseReferrals.md +0 -0
  116. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageEnterpriseTeams.md +0 -0
  117. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageOrganizationWebhooks.md +0 -0
  118. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageRepoSecurityProducts.md +0 -0
  119. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageSecurityProducts.md +0 -0
  120. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageSettingsMergeTypes.md +0 -0
  121. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageSettingsPages.md +0 -0
  122. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageSettingsProjects.md +0 -0
  123. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageSettingsWiki.md +0 -0
  124. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageTopics.md +0 -0
  125. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ManageWebhooks.md +0 -0
  126. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_MapsToUser.md +0 -0
  127. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_MarkAsDuplicate.md +0 -0
  128. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_MatchesEnvironmentPolicy.md +0 -0
  129. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_MemberOf.md +0 -0
  130. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_OrgBypassCodeScanningDismissalRequests.md +0 -0
  131. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_OrgBypassSecretScanningClosureRequests.md +0 -0
  132. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_OrgReviewAndManageSecretScanningBypassRequests.md +0 -0
  133. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_OrgReviewAndManageSecretScanningClosureRequests.md +0 -0
  134. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_Owns.md +0 -0
  135. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ProtectedBy.md +0 -0
  136. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_PushProtectedBranch.md +0 -0
  137. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ReadCodeScanning.md +0 -0
  138. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ReadEnterpriseAuditLog.md +0 -0
  139. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ReadEnterpriseDomainVerification.md +0 -0
  140. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ReadEnterpriseMembers.md +0 -0
  141. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ReadEnterpriseOrgProjects.md +0 -0
  142. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ReadEnterpriseOrganizationAdmin.md +0 -0
  143. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ReadOrganizationActionsUsageMetrics.md +0 -0
  144. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ReadOrganizationCustomOrgRole.md +0 -0
  145. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ReadOrganizationCustomRepoRole.md +0 -0
  146. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ReadRepoContents.md +0 -0
  147. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_RemoveAssignee.md +0 -0
  148. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_RemoveLabel.md +0 -0
  149. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ReopenDiscussion.md +0 -0
  150. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ReopenIssue.md +0 -0
  151. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ReopenPullRequest.md +0 -0
  152. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_RequestPrReview.md +0 -0
  153. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ResolveDependabotAlerts.md +0 -0
  154. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ResolveSecretScanningAlerts.md +0 -0
  155. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_RestrictionsCanPush.md +0 -0
  156. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_RunOrgMigration.md +0 -0
  157. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_SetEnterpriseInteractionLimits.md +0 -0
  158. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_SetInteractionLimits.md +0 -0
  159. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_SetIssueType.md +0 -0
  160. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_SetMilestone.md +0 -0
  161. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_SetSocialPreview.md +0 -0
  162. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_SyncedTo.md +0 -0
  163. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ToggleDiscussionAnswer.md +0 -0
  164. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ToggleDiscussionCommentMinimize.md +0 -0
  165. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_TransferRepository.md +0 -0
  166. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_UsesSecret.md +0 -0
  167. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_UsesVariable.md +0 -0
  168. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ValidToken.md +0 -0
  169. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ViewDependabotAlerts.md +0 -0
  170. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ViewEnterpriseActionsUsageMetrics.md +0 -0
  171. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ViewEnterpriseBilling.md +0 -0
  172. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ViewEnterpriseSecretScanningAlerts.md +0 -0
  173. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_ViewSecretScanningAlerts.md +0 -0
  174. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_WriteCodeScanning.md +0 -0
  175. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_WriteEnterpriseActionsPolicies.md +0 -0
  176. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_WriteEnterpriseBilling.md +0 -0
  177. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_WriteEnterprisePersonalAccessTokenPolicies.md +0 -0
  178. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_WriteEnterpriseSso.md +0 -0
  179. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_WriteEnterpriseTeamMembers.md +0 -0
  180. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_WriteOrganizationActionsSecrets.md +0 -0
  181. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_WriteOrganizationActionsSettings.md +0 -0
  182. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_WriteOrganizationActionsVariables.md +0 -0
  183. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_WriteOrganizationCustomOrgRole.md +0 -0
  184. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_WriteOrganizationCustomRepoRole.md +0 -0
  185. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_WriteOrganizationNetworkConfigurations.md +0 -0
  186. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_WriteRepoContents.md +0 -0
  187. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/edges/GH_WriteRepoPullRequests.md +0 -0
  188. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_App.md +0 -0
  189. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_AppInstallation.md +0 -0
  190. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_Branch.md +0 -0
  191. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_BranchProtectionRule.md +0 -0
  192. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_Enterprise.md +0 -0
  193. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_EnterpriseManagedUser.md +0 -0
  194. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_EnterpriseRole.md +0 -0
  195. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_EnterpriseRunnerGroup.md +0 -0
  196. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_EnterpriseTeam.md +0 -0
  197. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_Environment.md +0 -0
  198. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_EnvironmentBranchPolicy.md +0 -0
  199. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_EnvironmentSecret.md +0 -0
  200. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_EnvironmentVariable.md +0 -0
  201. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_ExternalIdentity.md +0 -0
  202. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_OrgRole.md +0 -0
  203. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_OrgRunnerGroup.md +0 -0
  204. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_OrgSecret.md +0 -0
  205. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_OrgVariable.md +0 -0
  206. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_Organization.md +0 -0
  207. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_PersonalAccessToken.md +0 -0
  208. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_PersonalAccessTokenRequest.md +0 -0
  209. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_RepoRole.md +0 -0
  210. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_RepoSecret.md +0 -0
  211. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_RepoVariable.md +0 -0
  212. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_Repository.md +0 -0
  213. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_Runner.md +0 -0
  214. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_RunnerGroup.md +0 -0
  215. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_SamlIdentityProvider.md +0 -0
  216. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_Secret.md +0 -0
  217. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_SecretScanningAlert.md +0 -0
  218. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_Team.md +0 -0
  219. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_TeamRole.md +0 -0
  220. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_User.md +0 -0
  221. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_Variable.md +0 -0
  222. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_Workflow.md +0 -0
  223. {openhound_github-0.7.3 → openhound_github-0.8.0}/descriptions/nodes/GH_WorkflowStep.md +0 -0
  224. {openhound_github-0.7.3 → openhound_github-0.8.0}/docs/og-docs.json +0 -0
  225. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/privilege_zone_rules/t0-all-repo-admin-role.json +0 -0
  226. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/privilege_zone_rules/t0-app-installations-all-repos.json +0 -0
  227. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/privilege_zone_rules/t0-apps-all-repos.json +0 -0
  228. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/privilege_zone_rules/t0-enterprise-owners-role.json +0 -0
  229. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/privilege_zone_rules/t0-external-identities-owners.json +0 -0
  230. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/privilege_zone_rules/t0-organizations.json +0 -0
  231. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/privilege_zone_rules/t0-owner-users.json +0 -0
  232. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/privilege_zone_rules/t0-owners-role.json +0 -0
  233. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/privilege_zone_rules/t0-pats-all-repos.json +0 -0
  234. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/privilege_zone_rules/t0-privilege-escalation-roles.json +0 -0
  235. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/privilege_zone_rules/t0-privilege-escalation-users.json +0 -0
  236. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/privilege_zone_rules/t0-saml-identity-providers.json +0 -0
  237. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/README.md +0 -0
  238. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/actions-sha-pinning-not-required.json +0 -0
  239. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/active-leaked-secrets.json +0 -0
  240. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/advanced-security-disabled-new-repos.json +0 -0
  241. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/all-actions-allowed.json +0 -0
  242. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/app-installations-all-repos.json +0 -0
  243. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/branch-protection-admins-not-enforced.json +0 -0
  244. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/branch-protection-deletions-allowed.json +0 -0
  245. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/branch-protection-force-pushes.json +0 -0
  246. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/branch-protection-no-code-owner-reviews.json +0 -0
  247. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/branch-protection-no-pr-reviews.json +0 -0
  248. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/branch-protection-no-status-checks.json +0 -0
  249. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/branch-protection-self-approval.json +0 -0
  250. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/branch-protection-stale-reviews.json +0 -0
  251. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/bypass-pr-requirements.json +0 -0
  252. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/dangerous-branch-perms.json +0 -0
  253. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/default-repository-permissions.json +0 -0
  254. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/demo-sso-to-cloud-round-trip.json +0 -0
  255. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/dependabot-alerts-disabled-new-repos.json +0 -0
  256. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/dependabot-updates-disabled-new-repos.json +0 -0
  257. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/dependency-graph-disabled-new-repos.json +0 -0
  258. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/environments-admin-bypass.json +0 -0
  259. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/expired-pats.json +0 -0
  260. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/external-identities-without-scim.json +0 -0
  261. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/github-to-azure-identity.json +0 -0
  262. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/global-repo-perms.json +0 -0
  263. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/hybrid-identities.json +0 -0
  264. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/members-can-change-repo-visibility.json +0 -0
  265. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/members-can-create-pages.json +0 -0
  266. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/members-can-create-public-repos.json +0 -0
  267. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/members-can-delete-repos.json +0 -0
  268. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/members-can-fork-private-repos.json +0 -0
  269. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/members-can-invite-outside-collaborators.json +0 -0
  270. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/org-owners.json +0 -0
  271. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/orgs-without-2fa.json +0 -0
  272. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/pats-all-repo-access.json +0 -0
  273. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/pending-pat-requests.json +0 -0
  274. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/private-repos-forking-allowed.json +0 -0
  275. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/privileged-custom-org-roles.json +0 -0
  276. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/privileged-hybrid-identities.json +0 -0
  277. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/public-repos.json +0 -0
  278. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/push-protection-disabled-new-repos.json +0 -0
  279. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/push-to-protected-branches.json +0 -0
  280. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/repos-secret-scanning-disabled.json +0 -0
  281. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/repos-vulnerable-to-workflow-secret-exfil.json +0 -0
  282. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/repository-workflows.json +0 -0
  283. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/saml-configuration.json +0 -0
  284. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/secret-scanning-alerts.json +0 -0
  285. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/secret-scanning-disabled-new-repos.json +0 -0
  286. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/secrets-reachable-by-user.json +0 -0
  287. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/team-membership-admin.json +0 -0
  288. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/team-structure.json +0 -0
  289. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/unprotected-branches.json +0 -0
  290. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/unprotected-default-branch-with-workflow.json +0 -0
  291. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/unprotected-default-branches.json +0 -0
  292. {openhound_github-0.7.3 → openhound_github-0.8.0}/extension/saved_searches/web-commit-signoff-not-required.json +0 -0
  293. {openhound_github-0.7.3 → openhound_github-0.8.0}/justfile +0 -0
  294. {openhound_github-0.7.3 → openhound_github-0.8.0}/pyproject.toml +0 -0
  295. {openhound_github-0.7.3 → openhound_github-0.8.0}/scripts/generate_gh_description_docs.py +0 -0
  296. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/main.py +0 -0
  297. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/__init__.py +0 -0
  298. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/auth.py +0 -0
  299. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/extension.yaml +0 -0
  300. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/github_rest_client.py +0 -0
  301. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/github_retry.py +0 -0
  302. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/graph.py +0 -0
  303. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/graphql.py +0 -0
  304. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/helpers.py +0 -0
  305. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/kinds/nodes.py +0 -0
  306. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/__init__.py +0 -0
  307. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/actions_permission.py +0 -0
  308. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/app_installation.py +0 -0
  309. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/branch.py +0 -0
  310. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/branch_pr_bypass_allowance.py +0 -0
  311. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/branch_protection_rule.py +0 -0
  312. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/branch_push_allowance.py +0 -0
  313. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/enterprise.py +0 -0
  314. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/enterprise_admin.py +0 -0
  315. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/enterprise_helpers.py +0 -0
  316. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/enterprise_managed_user.py +0 -0
  317. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/enterprise_member.py +0 -0
  318. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/enterprise_organization.py +0 -0
  319. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/enterprise_role.py +0 -0
  320. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/enterprise_role_team.py +0 -0
  321. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/enterprise_role_user.py +0 -0
  322. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/enterprise_team.py +0 -0
  323. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/enterprise_team_member.py +0 -0
  324. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/enterprise_team_organization.py +0 -0
  325. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/enterprise_team_role.py +0 -0
  326. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/enterprise_user.py +0 -0
  327. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/env_secret.py +0 -0
  328. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/env_variable.py +0 -0
  329. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/environment.py +0 -0
  330. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/environment_branch_policy.py +0 -0
  331. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/external_identity.py +0 -0
  332. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/org.py +0 -0
  333. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/org_role.py +0 -0
  334. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/org_role_member.py +0 -0
  335. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/org_role_team.py +0 -0
  336. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/org_secret.py +0 -0
  337. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/org_variable.py +0 -0
  338. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/personal_access_token.py +0 -0
  339. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/personal_access_token_access.py +0 -0
  340. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/personal_access_token_request.py +0 -0
  341. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/projected_enterprise_team.py +0 -0
  342. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/repo_role_assignment.py +0 -0
  343. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/repository.py +0 -0
  344. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/repository_role.py +0 -0
  345. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/repository_secret.py +0 -0
  346. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/repository_variable.py +0 -0
  347. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/saml_assertion_consumer_service.py +0 -0
  348. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/saml_helpers.py +0 -0
  349. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/saml_issuer.py +0 -0
  350. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/saml_provider.py +0 -0
  351. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/saml_service_provider.py +0 -0
  352. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/scim_user.py +0 -0
  353. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/secret_scanning_alert.py +0 -0
  354. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/team.py +0 -0
  355. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/team_member.py +0 -0
  356. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/team_role.py +0 -0
  357. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/user.py +0 -0
  358. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/models/workflow_step.py +0 -0
  359. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/resources/__init__.py +0 -0
  360. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/resources/enterprise.py +0 -0
  361. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/resources/organization.py +0 -0
  362. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/runner_ids.py +0 -0
  363. {openhound_github-0.7.3 → openhound_github-0.8.0}/src/openhound_github/source.py +0 -0
  364. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_app_auth.py +0 -0
  365. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_branch_collection_gate.py +0 -0
  366. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_branch_protection_traversability.py +0 -0
  367. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/actions-permissions.json +0 -0
  368. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/actionsecrets.json +0 -0
  369. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/app.json +0 -0
  370. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/appinstalls.json +0 -0
  371. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/branch-policies.json +0 -0
  372. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/branch-prot-rules.json +0 -0
  373. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/branches.json +0 -0
  374. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/custom-roles.json +0 -0
  375. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/environments.json +0 -0
  376. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/org-pat-request.json +0 -0
  377. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/org-pat.json +0 -0
  378. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/org-role-teams.json +0 -0
  379. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/org-role-users.json +0 -0
  380. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/org-roles.json +0 -0
  381. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/org.json +0 -0
  382. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/pat-repositories.json +0 -0
  383. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/repo-collaborators.json +0 -0
  384. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/repo-teams.json +0 -0
  385. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/repositories.json +0 -0
  386. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/scimusers.json +0 -0
  387. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/secrets.json +0 -0
  388. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/secretscanningalert.json +0 -0
  389. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/selected-org-secrets.json +0 -0
  390. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/variables.json +0 -0
  391. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_data/api/workflows.json +0 -0
  392. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_description_docs.py +0 -0
  393. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_enterprise_capabilities.py +0 -0
  394. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_enterprise_organization.py +0 -0
  395. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_enterprise_resources.py +0 -0
  396. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_environment_model.py +0 -0
  397. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_environment_resources.py +0 -0
  398. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_environment_reviewer_lookup.py +0 -0
  399. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_error_resilience.py +0 -0
  400. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_github_app_retry.py +0 -0
  401. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_github_rest_client.py +0 -0
  402. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_github_retry.py +0 -0
  403. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_helpers.py +0 -0
  404. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_lookup.py +0 -0
  405. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_org_scim_resources.py +0 -0
  406. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_org_secret_models.py +0 -0
  407. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_repository_rulesets.py +0 -0
  408. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_runner_ids.py +0 -0
  409. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_runner_resources.py +0 -0
  410. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_saml_helpers.py +0 -0
  411. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_saml_models.py +0 -0
  412. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_scim_models.py +0 -0
  413. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_source_endpoints.py +0 -0
  414. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_source_org_canonicalization.py +0 -0
  415. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_team_external_groups.py +0 -0
  416. {openhound_github-0.7.3 → openhound_github-0.8.0}/tests/test_variable_models.py +0 -0
  417. {openhound_github-0.7.3 → openhound_github-0.8.0}/uv.lock +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: openhound-github
3
- Version: 0.7.3
3
+ Version: 0.8.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,24 @@
1
+ # GH_RunsOn
2
+
3
+ ## General Information
4
+
5
+ The non-traversable GH_RunsOn edge represents that a GitHub Actions workflow job can be scheduled on a self-hosted runner based on the job's statically declared `runs-on` selector and the runner topology visible to the containing repository.
6
+
7
+ This edge is schedulability evidence, not historical execution evidence. It does not mean that the job has previously executed on the runner. It means that the runner satisfies the job's static label and runner-group requirements and is reachable through the repository's current runner access policy.
8
+
9
+ The collector emits GH_RunsOn only for static selectors. Dynamic selectors that contain GitHub Actions expressions such as `${{ matrix.runner }}` or `${{ inputs.runner }}` are intentionally left unresolved in this first implementation.
10
+
11
+ ## Edge Schema
12
+
13
+ | Source | Destination | Traversable |
14
+ | --- | --- | --- |
15
+ | `GH_WorkflowJob` | `GH_Runner` | `false` |
16
+
17
+ ## Diagram
18
+
19
+ ```mermaid
20
+ graph LR
21
+ n0["GH_WorkflowJob"]
22
+ n1["GH_Runner"]
23
+ n0 -.->|GH_RunsOn| n1
24
+ ```
@@ -6,6 +6,8 @@ Represents a self-hosted runner owned at the GitHub Enterprise level. Enterprise
6
6
 
7
7
  The node captures runner metadata such as operating system, status, busy state, labels, and whether the runner is ephemeral when GitHub returns that property.
8
8
 
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
+
9
11
  ## Properties
10
12
 
11
13
  | Property | Type | Description |
@@ -31,6 +33,7 @@ The node captures runner metadata such as operating system, status, busy state,
31
33
  | `environment_name` | `string` | The name of the environment (GitHub organization). |
32
34
  | `query_group` | `string` | Query for group. |
33
35
  | `query_repositories` | `string` | Query for repositories. |
36
+ | `query_jobs` | `string` | Query for workflow jobs that can be scheduled on the runner. |
34
37
 
35
38
  ## Diagram
36
39
 
@@ -38,6 +41,8 @@ The node captures runner metadata such as operating system, status, busy state,
38
41
  graph LR
39
42
  n0["GH_EnterpriseRunnerGroup"]
40
43
  n1["GH_EnterpriseRunner"]
44
+ n2["GH_WorkflowJob"]
41
45
  n0 -.->|GH_Contains| n1
42
46
  n0 -->|GH_HasRunner| n1
47
+ n2 -.->|GH_RunsOn| n1
43
48
  ```
@@ -6,6 +6,8 @@ Represents a self-hosted runner owned by a GitHub organization. Organization run
6
6
 
7
7
  The node captures runner metadata such as operating system, status, busy state, labels, and whether the runner is ephemeral when GitHub returns that property.
8
8
 
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
+
9
11
  ## Properties
10
12
 
11
13
  | Property | Type | Description |
@@ -31,6 +33,7 @@ The node captures runner metadata such as operating system, status, busy state,
31
33
  | `environment_name` | `string` | The name of the environment (GitHub organization). |
32
34
  | `query_group` | `string` | Query for group. |
33
35
  | `query_repositories` | `string` | Query for repositories. |
36
+ | `query_jobs` | `string` | Query for workflow jobs that can be scheduled on the runner. |
34
37
 
35
38
  ## Diagram
36
39
 
@@ -38,6 +41,8 @@ The node captures runner metadata such as operating system, status, busy state,
38
41
  graph LR
39
42
  n0["GH_OrgRunnerGroup"]
40
43
  n1["GH_OrgRunner"]
44
+ n2["GH_WorkflowJob"]
41
45
  n0 -.->|GH_Contains| n1
42
46
  n0 -->|GH_HasRunner| n1
47
+ n2 -.->|GH_RunsOn| n1
43
48
  ```
@@ -6,6 +6,8 @@ Represents a self-hosted runner registered directly to a single GitHub repositor
6
6
 
7
7
  The node captures runner metadata such as operating system, status, busy state, labels, and whether the runner is ephemeral when GitHub returns that property.
8
8
 
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
+
9
11
  ## Properties
10
12
 
11
13
  | Property | Type | Description |
@@ -31,6 +33,7 @@ The node captures runner metadata such as operating system, status, busy state,
31
33
  | `environment_name` | `string` | The name of the environment (GitHub organization). |
32
34
  | `query_group` | `string` | Query for group. |
33
35
  | `query_repositories` | `string` | Query for repositories. |
36
+ | `query_jobs` | `string` | Query for workflow jobs that can be scheduled on the runner. |
34
37
 
35
38
  ## Diagram
36
39
 
@@ -38,6 +41,8 @@ The node captures runner metadata such as operating system, status, busy state,
38
41
  graph LR
39
42
  n0["GH_Repository"]
40
43
  n1["GH_RepoRunner"]
44
+ n2["GH_WorkflowJob"]
41
45
  n0 -.->|GH_CanUseRunner| n1
42
46
  n0 -.->|GH_Contains| n1
47
+ n2 -.->|GH_RunsOn| n1
43
48
  ```
@@ -4,6 +4,8 @@
4
4
 
5
5
  Represents a single job within a GitHub Actions workflow. Jobs are the top-level execution units of a workflow — they run on a runner, hold a set of steps, and can declare permissions, environments, and dependencies on other jobs.
6
6
 
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
+
7
9
  ## Properties
8
10
 
9
11
  | Property | Type | Description |
@@ -15,6 +17,9 @@ Represents a single job within a GitHub Actions workflow. Jobs are the top-level
15
17
  | `node_id` | `string` | The stable identifier used as the OpenGraph node ID; this is the native GitHub node ID where available. |
16
18
  | `job_key` | `string` | The YAML key for the job. |
17
19
  | `runs_on` | `list[string]` | The runner label expression for the job. |
20
+ | `runs_on_group` | `string` | The statically declared runner group, if any. |
21
+ | `runs_on_labels` | `list[string]` | The normalized runner labels from runs-on. |
22
+ | `runs_on_is_dynamic` | `boolean` | Whether runs-on contains a GitHub Actions expression. |
18
23
  | `is_self_hosted` | `boolean` | Whether the job targets self-hosted runners. |
19
24
  | `container` | `string` | The optional container configuration. |
20
25
  | `environment` | `string` | The deployment environment name. |
@@ -27,6 +32,7 @@ Represents a single job within a GitHub Actions workflow. Jobs are the top-level
27
32
  | `query_repository` | `string` | Query for repository. |
28
33
  | `query_steps` | `string` | Query for workflow steps. |
29
34
  | `query_references` | `string` | Query for workflow references (secrets and variables). |
35
+ | `query_runners` | `string` | Query for eligible self-hosted runners. |
30
36
 
31
37
  ## Diagram
32
38
 
@@ -41,7 +47,8 @@ graph LR
41
47
  n6["GH_OrgVariable"]
42
48
  n7["GH_RepoSecret"]
43
49
  n8["GH_RepoVariable"]
44
- n9["GH_WorkflowStep"]
50
+ n9["GH_Runner"]
51
+ n10["GH_WorkflowStep"]
45
52
  n0 -.->|GH_Contains| n1
46
53
  n1 -.->|GH_DeploysTo| n2
47
54
  n1 -.->|GH_UsesSecret| n3
@@ -50,7 +57,8 @@ graph LR
50
57
  n1 -.->|GH_UsesVariable| n6
51
58
  n1 -.->|GH_UsesSecret| n7
52
59
  n1 -.->|GH_UsesVariable| n8
60
+ n1 -.->|GH_RunsOn| n9
53
61
  n1 -.->|GH_CallsWorkflow| n0
54
62
  n1 -.->|GH_DependsOn| n1
55
- n1 -.->|GH_Contains| n9
63
+ n1 -.->|GH_Contains| n10
56
64
  ```
@@ -1030,6 +1030,11 @@
1030
1030
  "description": "[Workflow] Job deploys to a GitHub Environment — GH_WorkflowJob → GH_Environment",
1031
1031
  "is_traversable": false
1032
1032
  },
1033
+ {
1034
+ "name": "GH_RunsOn",
1035
+ "description": "[Workflow] Job can be scheduled on this self-hosted runner based on its static runs-on selector — GH_WorkflowJob → GH_Runner",
1036
+ "is_traversable": false
1037
+ },
1033
1038
  {
1034
1039
  "name": "GH_HasMember",
1035
1040
  "description": "Enterprise or organization has this user as a member",
@@ -18,6 +18,7 @@ MEMBER_OF = "GH_MemberOf"
18
18
  # Access and capability edges
19
19
  CAN_ACCESS = "GH_CanAccess"
20
20
  CAN_USE_RUNNER = "GH_CanUseRunner"
21
+ RUNS_ON = "GH_RunsOn"
21
22
  IS_ELIGIBLE_FOR = "GH_IsEligibleFor"
22
23
  CAN_CREATE_REPOSITORY_WITH_RUNNER_ACCESS = "GH_CanCreateRepositoryWithRunnerAccess"
23
24
  CAN_CREATE_BRANCH = "GH_CanCreateBranch"
@@ -1,6 +1,7 @@
1
1
  import json
2
2
  import re
3
3
  from functools import lru_cache
4
+ from typing import Any
4
5
 
5
6
  import duckdb
6
7
  from duckdb import DuckDBPyConnection
@@ -167,6 +168,204 @@ class GithubLookup(LookupManager):
167
168
  )
168
169
  return [(runner_node_id(enterprise_node_id, int(runner_id)),) for (runner_id,) in rows]
169
170
 
171
+ @staticmethod
172
+ def _json_list(raw_value: Any) -> list[Any]:
173
+ if raw_value is None:
174
+ return []
175
+ if isinstance(raw_value, str):
176
+ try:
177
+ raw_value = json.loads(raw_value)
178
+ except json.JSONDecodeError:
179
+ return []
180
+ if isinstance(raw_value, list):
181
+ return raw_value
182
+ return []
183
+
184
+ @classmethod
185
+ def _runner_label_names(cls, raw_labels: Any) -> set[str]:
186
+ names: set[str] = set()
187
+ for label in cls._json_list(raw_labels):
188
+ if isinstance(label, dict):
189
+ name = label.get("name")
190
+ else:
191
+ name = label
192
+ if name is not None:
193
+ names.add(str(name).casefold())
194
+ return names
195
+
196
+ @staticmethod
197
+ def _runner_group_allows_repository(
198
+ *,
199
+ repository_node_id: str,
200
+ repository_visibility: str | None,
201
+ runner_group_visibility: str | None,
202
+ allows_public_repositories: bool | None,
203
+ accessible_repo_node_ids: set[str],
204
+ ) -> bool:
205
+ if runner_group_visibility == "all":
206
+ in_scope = True
207
+ elif runner_group_visibility == "private":
208
+ in_scope = repository_visibility in {"private", "internal"}
209
+ else:
210
+ in_scope = repository_node_id in accessible_repo_node_ids
211
+
212
+ if not in_scope:
213
+ return False
214
+
215
+ if allows_public_repositories is False:
216
+ return repository_visibility in {"private", "internal"}
217
+
218
+ return True
219
+
220
+ @lru_cache
221
+ def workflow_job_runner_node_ids(
222
+ self,
223
+ repository_node_id: str,
224
+ org_login: str,
225
+ group_name: str | None,
226
+ labels: tuple[str, ...],
227
+ ) -> list[str]:
228
+ """Return accessible self-hosted runners matching a static runs-on selector."""
229
+ if not group_name and not labels:
230
+ return []
231
+
232
+ repository = self._find_single_row(
233
+ f"""
234
+ SELECT visibility, actions_enabled
235
+ FROM {self.schema}.repositories
236
+ WHERE node_id = ?
237
+ AND org_login = ?
238
+ """,
239
+ [repository_node_id, org_login],
240
+ )
241
+ if not repository:
242
+ return []
243
+
244
+ repository_visibility, actions_enabled = repository
245
+ required_labels = {str(label).casefold() for label in labels}
246
+ matching_runner_node_ids: list[str] = []
247
+ seen_runner_node_ids: set[str] = set()
248
+
249
+ def add_matching_runner(node_id: str, raw_labels: Any) -> None:
250
+ if node_id in seen_runner_node_ids:
251
+ return
252
+ if not required_labels.issubset(self._runner_label_names(raw_labels)):
253
+ return
254
+ seen_runner_node_ids.add(node_id)
255
+ matching_runner_node_ids.append(node_id)
256
+
257
+ if group_name is None:
258
+ for runner_id, raw_labels in self._find_all_objects(
259
+ f"""
260
+ SELECT id, labels
261
+ FROM {self.schema}.repo_runners
262
+ WHERE repository_node_id = ?
263
+ """,
264
+ [repository_node_id],
265
+ ):
266
+ add_matching_runner(
267
+ runner_node_id(repository_node_id, int(runner_id)),
268
+ raw_labels,
269
+ )
270
+
271
+ if actions_enabled is not True:
272
+ return []
273
+
274
+ for (
275
+ runner_group_id,
276
+ runner_group_name,
277
+ runner_group_visibility,
278
+ allows_public_repositories,
279
+ restricted_to_workflows,
280
+ inherited,
281
+ raw_accessible_repo_node_ids,
282
+ ) in self._find_all_objects(
283
+ f"""
284
+ SELECT
285
+ runner_group_id,
286
+ runner_group_name,
287
+ runner_group_visibility,
288
+ allows_public_repositories,
289
+ restricted_to_workflows,
290
+ inherited,
291
+ accessible_repo_node_ids
292
+ FROM {self.schema}.org_runner_group_access
293
+ WHERE org_login = ?
294
+ """,
295
+ [org_login],
296
+ ):
297
+ if group_name is not None and runner_group_name != group_name:
298
+ continue
299
+ if restricted_to_workflows is not False:
300
+ continue
301
+
302
+ accessible_repo_node_ids = {
303
+ str(node_id)
304
+ for node_id in self._json_list(raw_accessible_repo_node_ids)
305
+ }
306
+ if not self._runner_group_allows_repository(
307
+ repository_node_id=repository_node_id,
308
+ repository_visibility=repository_visibility,
309
+ runner_group_visibility=runner_group_visibility,
310
+ allows_public_repositories=allows_public_repositories,
311
+ accessible_repo_node_ids=accessible_repo_node_ids,
312
+ ):
313
+ continue
314
+
315
+ if inherited:
316
+ org_node_id = self.org_id_for_login(org_login)
317
+ if not org_node_id:
318
+ continue
319
+ if (
320
+ self.enterprise_runner_group_restricted_to_workflows_for_inherited_org_group(
321
+ org_node_id, runner_group_name
322
+ )
323
+ is not False
324
+ ):
325
+ continue
326
+ identity = self._enterprise_runner_group_identity_for_inherited_org_group(
327
+ org_node_id, runner_group_name
328
+ )
329
+ if not identity:
330
+ continue
331
+ enterprise_node_id, enterprise_runner_group_id = identity
332
+ for runner_id, raw_labels in self._find_all_objects(
333
+ f"""
334
+ SELECT r.id, r.labels
335
+ FROM {self.schema}.enterprise_runner_group_memberships m
336
+ JOIN {self.schema}.enterprise_runners r
337
+ ON r.enterprise_node_id = m.enterprise_node_id
338
+ AND r.id = m.runner_id
339
+ WHERE m.enterprise_node_id = ?
340
+ AND m.runner_group_id = ?
341
+ """,
342
+ [enterprise_node_id, enterprise_runner_group_id],
343
+ ):
344
+ add_matching_runner(
345
+ runner_node_id(enterprise_node_id, int(runner_id)),
346
+ raw_labels,
347
+ )
348
+ continue
349
+
350
+ for runner_id, raw_labels in self._find_all_objects(
351
+ f"""
352
+ SELECT r.id, r.labels
353
+ FROM {self.schema}.org_runner_group_memberships m
354
+ JOIN {self.schema}.org_runners r
355
+ ON r.org_login = m.org_login
356
+ AND r.id = m.runner_id
357
+ WHERE m.org_login = ?
358
+ AND m.runner_group_id = ?
359
+ """,
360
+ [org_login, runner_group_id],
361
+ ):
362
+ add_matching_runner(
363
+ runner_node_id(self.org_id_for_login(org_login), int(runner_id)),
364
+ raw_labels,
365
+ )
366
+
367
+ return matching_runner_node_ids
368
+
170
369
  @lru_cache
171
370
  def enterprise_idp_for_scope(
172
371
  self, enterprise_node_id: str
@@ -72,6 +72,12 @@ def preproc(ctx: PreProcContext):
72
72
  "enterprise_runner_groups": "enterprise_runner_groups",
73
73
  "enterprise_runner_group_organizations": "enterprise_runner_group_organizations",
74
74
  "enterprise_runner_group_memberships": "enterprise_runner_group_memberships",
75
+ "enterprise_runners": "enterprise_runners",
76
+ "runner_groups": "runner_groups",
77
+ "org_runners": "org_runners",
78
+ "org_runner_group_access": "org_runner_group_access",
79
+ "org_runner_group_memberships": "org_runner_group_memberships",
80
+ "repo_runners": "repo_runners",
75
81
  "org_roles": "org_roles",
76
82
  "org_role_members": "org_role_members",
77
83
  "org_role_teams": "org_role_teams",
@@ -316,6 +316,7 @@ class GHRunnerProperties(GHNodeProperties):
316
316
  environment_name: The name of the environment (GitHub organization).
317
317
  query_group: Query for group.
318
318
  query_repositories: Query for repositories.
319
+ query_jobs: Query for workflow jobs that can be scheduled on the runner.
319
320
  """
320
321
 
321
322
  scope: str | None = None
@@ -334,6 +335,7 @@ class GHRunnerProperties(GHNodeProperties):
334
335
  environment_name: str | None = None
335
336
  query_group: str | None = None
336
337
  query_repositories: str | None = None
338
+ query_jobs: str | None = None
337
339
 
338
340
 
339
341
  @app.asset(
@@ -384,6 +386,7 @@ class OrgRunner(BaseAsset):
384
386
  environmentid=self.org_node_id,
385
387
  query_group=f"MATCH p=(:GH_OrgRunnerGroup)-[:GH_HasRunner]->(:GH_OrgRunner {{node_id:'{rid}'}}) RETURN p",
386
388
  query_repositories=f"MATCH p=(:GH_Repository)-[:GH_CanUseRunner]->(:GH_OrgRunnerGroup)-[:GH_HasRunner]->(:GH_OrgRunner {{node_id:'{rid}'}}) RETURN p",
389
+ query_jobs=f"MATCH p=(:GH_WorkflowJob)-[:GH_RunsOn]->(:GH_Runner {{node_id:'{rid}'}}) RETURN p",
387
390
  ),
388
391
  )
389
392
 
@@ -437,6 +440,7 @@ class EnterpriseRunner(BaseAsset):
437
440
  environmentid=self.enterprise_node_id,
438
441
  query_group=f"MATCH p=(:GH_EnterpriseRunnerGroup)-[:GH_HasRunner]->(:GH_EnterpriseRunner {{node_id:'{rid}'}}) RETURN p",
439
442
  query_repositories=f"MATCH p=(:GH_Repository)-[:GH_CanUseRunner]->(:GH_OrgRunnerGroup)-[:GH_InheritedFrom]->(:GH_EnterpriseRunnerGroup)-[:GH_HasRunner]->(:GH_EnterpriseRunner {{node_id:'{rid}'}}) RETURN p",
443
+ query_jobs=f"MATCH p=(:GH_WorkflowJob)-[:GH_RunsOn]->(:GH_Runner {{node_id:'{rid}'}}) RETURN p",
440
444
  ),
441
445
  )
442
446
 
@@ -873,6 +877,7 @@ class RepoRunner(BaseAsset):
873
877
  environment_name=self.org_login,
874
878
  environmentid=self.org_node_id,
875
879
  query_repositories=f"MATCH p=(:GH_Repository {{node_id:'{self.repository_node_id}'}})-[:GH_CanUseRunner]->(:GH_RepoRunner {{node_id:'{rid}'}}) RETURN p",
880
+ query_jobs=f"MATCH p=(:GH_WorkflowJob)-[:GH_RunsOn]->(:GH_Runner {{node_id:'{rid}'}}) RETURN p",
876
881
  ),
877
882
  )
878
883
 
@@ -43,6 +43,7 @@ SECRET_REFERENCE_RE = re.compile(r"\$\{\{\s*secrets\.(\w+)\s*\}\}")
43
43
  VARIABLE_REFERENCE_RE = re.compile(r"\$\{\{\s*vars\.(\w+)\s*\}\}")
44
44
  ACTION_RE = re.compile(r"^(?P<owner>[^/]+)/(?P<name>[^@]+)@(?P<ref>.+)$")
45
45
  PINNED_REF_RE = re.compile(r"^[0-9a-f]{40}$")
46
+ TEMPLATE_RE = re.compile(r"\$\{\{\s*[^}]+?\s*\}\}")
46
47
 
47
48
 
48
49
  class WorkflowStepDefinition(BaseModel):
@@ -94,6 +95,49 @@ class RunsOn(BaseModel):
94
95
  labels: list[str] | str | None = None
95
96
 
96
97
 
98
+ class RunsOnSelector(BaseModel):
99
+ group: str | None = None
100
+ labels: list[str] = Field(default_factory=list)
101
+ is_dynamic: bool = False
102
+
103
+
104
+ def parse_runs_on_selector(value: Any) -> RunsOnSelector:
105
+ """Normalize a workflow job's runs-on declaration without losing group data."""
106
+ if value is None:
107
+ return RunsOnSelector()
108
+
109
+ if isinstance(value, RunsOn):
110
+ value = value.model_dump()
111
+
112
+ group: str | None = None
113
+ labels: list[str] = []
114
+
115
+ if isinstance(value, str):
116
+ labels = [value]
117
+ elif isinstance(value, list):
118
+ labels = [str(item) for item in value]
119
+ elif isinstance(value, dict):
120
+ raw_group = value.get("group")
121
+ if raw_group is not None:
122
+ group = str(raw_group)
123
+
124
+ raw_labels = value.get("labels")
125
+ if isinstance(raw_labels, str):
126
+ labels = [raw_labels]
127
+ elif isinstance(raw_labels, list):
128
+ labels = [str(item) for item in raw_labels]
129
+ elif raw_labels is not None:
130
+ labels = [str(raw_labels)]
131
+ else:
132
+ labels = [str(value)]
133
+
134
+ is_dynamic = any(TEMPLATE_RE.search(item) for item in labels)
135
+ if group:
136
+ is_dynamic = is_dynamic or bool(TEMPLATE_RE.search(group))
137
+
138
+ return RunsOnSelector(group=group, labels=labels, is_dynamic=is_dynamic)
139
+
140
+
97
141
  class WorkflowJobDefinition(BaseModel):
98
142
  model_config = ConfigDict(extra="allow", populate_by_name=True)
99
143
 
@@ -149,6 +193,10 @@ class WorkflowJobDefinition(BaseModel):
149
193
  def container_value(self) -> str | None:
150
194
  return str(self.container) if self.container else None
151
195
 
196
+ @property
197
+ def runs_on_selector(self) -> RunsOnSelector:
198
+ return parse_runs_on_selector(self.runs_on)
199
+
152
200
 
153
201
  class WorkflowDocument(BaseModel):
154
202
  model_config = ConfigDict(extra="allow")
@@ -498,6 +546,7 @@ class Workflow(BaseAsset):
498
546
  }
499
547
  rows = []
500
548
  for job_key, job in document.jobs.items():
549
+ runs_on_selector = job.runs_on_selector
501
550
  secret_refs = []
502
551
  variable_refs = []
503
552
  secret_refs.extend(
@@ -514,6 +563,9 @@ class Workflow(BaseAsset):
514
563
  "name": f"{self.repository_name}\\{job_key}",
515
564
  "job_key": job_key,
516
565
  "runs_on": job.runs_on,
566
+ "runs_on_group": runs_on_selector.group,
567
+ "runs_on_labels": runs_on_selector.labels or None,
568
+ "runs_on_is_dynamic": runs_on_selector.is_dynamic,
517
569
  "container": job.container_value,
518
570
  "environment": job.environment_name,
519
571
  "permissions": job.permissions