openhound-github 0.9.0__tar.gz → 0.10.1__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.
- {openhound_github-0.9.0 → openhound_github-0.10.1}/PKG-INFO +1 -1
- openhound_github-0.10.1/descriptions/edges/GH_CanAccessSecret.md +30 -0
- openhound_github-0.10.1/descriptions/edges/GH_CanInterceptJob.md +24 -0
- openhound_github-0.10.1/descriptions/edges/GH_CanRequestOIDCTokenFor.md +26 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_EnterpriseRunner.md +4 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Environment.md +3 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_OrgRunner.md +4 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_RepoRunner.md +4 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_WorkflowJob.md +10 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/README.md +26 -14
- openhound_github-0.10.1/extension/saved_searches/self-hosted-runners-can-intercept-broad-token-jobs.json +5 -0
- openhound_github-0.10.1/extension/saved_searches/shared-self-hosted-runners-can-intercept-secret-bearing-jobs.json +5 -0
- openhound_github-0.10.1/extension/saved_searches/workflow-jobs-interceptable-by-self-hosted-runners.json +5 -0
- openhound_github-0.10.1/extension/saved_searches/workflow-jobs-with-id-token-write-on-self-hosted-runners.json +5 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/schema.json +15 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/kinds/edges.py +3 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/lookup.py +98 -12
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/runner.py +5 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/workflow_job.py +191 -64
- openhound_github-0.10.1/src/openhound_github/models/workflow_reference.py +58 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/workflow_step.py +27 -60
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/transforms.py +21 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_lookup.py +22 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_repository_rulesets.py +2 -1
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_runner_models.py +57 -10
- openhound_github-0.10.1/tests/test_workflow_interception_path.py +299 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_workflow_model.py +329 -0
- openhound_github-0.10.1/tests/test_workflow_resources.py +213 -0
- openhound_github-0.9.0/extension/saved_searches/workflow-jobs-with-id-token-write-on-self-hosted-runners.json +0 -5
- openhound_github-0.9.0/tests/test_workflow_resources.py +0 -98
- {openhound_github-0.9.0 → openhound_github-0.10.1}/.github/CODE_OF_CONDUCT.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/.github/CONTRIBUTING.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/.github/GOVERNANCE.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/.github/GitHub-COC-Header.png +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/.github/GitHub-CONTRIB-Header.png +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/.github/GitHub-GOV-Header.png +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/.github/GitHub-Header.png +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/.github/GitHub-LIC-Header.png +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/.github/GitHub-SEC-Header.png +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/.github/SECURITY.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/.github/SO-Dark.svg +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/.github/SO-FOSS-Dark.svg +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/.github/SO-FOSS-Light.svg +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/.github/SO-Light.svg +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/.github/workflows/publish.yml +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/.github/workflows/release-on-merge.yml +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/.github/workflows/validate-branch.yml +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/.gitignore +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/.gitmodules +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/.pre-commit-config.yaml +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/LICENSE.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/README.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_AddAssignee.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_AddCollaborator.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_AddLabel.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_AddMember.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_AdminTo.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ApprovesDeploymentTo.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_AssignedTo.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_BypassBranchProtection.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_BypassPullRequestAllowances.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_CallsWorkflow.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanAccess.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanAssumeIdentity.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanCreateBranch.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanCreateEnvironment.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanCreateInternalRepositories.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanCreatePrivateRepositories.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanCreatePublicRepositories.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanCreateRepositories.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanCreateRepositoryWithRunnerAccess.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanDeployToEnvironment.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanEditEnvironment.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanEditProtection.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanPwnRequest.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanReadSecret.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanReadSecretScanningAlert.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanUseRunner.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_CanWriteBranch.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_CloseDiscussion.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_CloseIssue.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ClosePullRequest.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_Contains.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ConvertIssuesToDiscussions.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_CreateDiscussionCategory.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_CreateEnterpriseOrganizations.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_CreateRepository.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_CreateSoloMergeQueueEntry.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_CreateTag.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_CreateTeam.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_DeleteAlertsCodeScanning.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_DeleteDiscussion.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_DeleteDiscussionComment.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_DeleteIssue.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_DeleteTag.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_DependsOn.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_DeploysTo.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_EditCategoryOnDiscussion.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_EditDiscussionCategory.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_EditDiscussionComment.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_EditEnterpriseCustomPropertiesForOrganizations.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_EditRepoAnnouncementBanners.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_EditRepoCustomPropertiesValues.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_EditRepoMetadata.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_EditRepoProtections.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasBaseRole.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasExternalIdentity.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasMember.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasPersonalAccessToken.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasPersonalAccessTokenRequest.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasRole.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasRunner.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasSamlIdentityProvider.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasSecret.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_HasVariable.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_InheritedFrom.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_InstalledAs.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_InviteMember.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_IsEligibleFor.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_JumpMergeQueue.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageDeployKeys.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageDiscussionBadges.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageEnterpriseAdmins.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageEnterpriseIdentityProvider.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageEnterpriseMembers.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageEnterpriseOrganizationAdmins.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageEnterpriseOrganizations.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageEnterpriseReferrals.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageEnterpriseTeams.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageOrganizationWebhooks.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageRepoSecurityProducts.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageSecurityProducts.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageSettingsMergeTypes.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageSettingsPages.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageSettingsProjects.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageSettingsWiki.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageTopics.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ManageWebhooks.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_MapsToUser.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_MarkAsDuplicate.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_MatchesEnvironmentPolicy.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_MemberOf.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_OrgBypassCodeScanningDismissalRequests.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_OrgBypassSecretScanningClosureRequests.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_OrgReviewAndManageSecretScanningBypassRequests.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_OrgReviewAndManageSecretScanningClosureRequests.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_Owns.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ProtectedBy.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_PushProtectedBranch.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadCodeScanning.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadEnterpriseAuditLog.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadEnterpriseDomainVerification.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadEnterpriseMembers.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadEnterpriseOrgProjects.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadEnterpriseOrganizationAdmin.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadOrganizationActionsUsageMetrics.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadOrganizationCustomOrgRole.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadOrganizationCustomRepoRole.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReadRepoContents.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_RemoveAssignee.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_RemoveLabel.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReopenDiscussion.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReopenIssue.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ReopenPullRequest.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_RequestPrReview.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ResolveDependabotAlerts.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ResolveSecretScanningAlerts.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_RestrictionsCanPush.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_RunOrgMigration.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_RunsOn.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_SetEnterpriseInteractionLimits.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_SetInteractionLimits.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_SetIssueType.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_SetMilestone.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_SetSocialPreview.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_SyncedTo.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ToggleDiscussionAnswer.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ToggleDiscussionCommentMinimize.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_TransferRepository.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_UsesSecret.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_UsesVariable.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ValidToken.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ViewDependabotAlerts.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ViewEnterpriseActionsUsageMetrics.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ViewEnterpriseBilling.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ViewEnterpriseSecretScanningAlerts.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_ViewSecretScanningAlerts.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteCodeScanning.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteEnterpriseActionsPolicies.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteEnterpriseBilling.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteEnterprisePersonalAccessTokenPolicies.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteEnterpriseSso.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteEnterpriseTeamMembers.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteOrganizationActionsSecrets.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteOrganizationActionsSettings.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteOrganizationActionsVariables.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteOrganizationCustomOrgRole.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteOrganizationCustomRepoRole.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteOrganizationNetworkConfigurations.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteRepoContents.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/edges/GH_WriteRepoPullRequests.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_App.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_AppInstallation.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Branch.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_BranchProtectionRule.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Enterprise.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_EnterpriseManagedUser.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_EnterpriseRole.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_EnterpriseRunnerGroup.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_EnterpriseTeam.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_EnvironmentBranchPolicy.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_EnvironmentSecret.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_EnvironmentVariable.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_ExternalIdentity.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_OrgRole.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_OrgRunnerGroup.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_OrgSecret.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_OrgVariable.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Organization.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_PersonalAccessToken.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_PersonalAccessTokenRequest.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_RepoRole.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_RepoSecret.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_RepoVariable.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Repository.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Runner.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_RunnerGroup.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_SamlIdentityProvider.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Secret.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_SecretScanningAlert.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Team.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_TeamRole.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_User.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Variable.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_Workflow.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_WorkflowStep.md +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/docs/og-docs.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-all-repo-admin-role.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-app-installations-all-repos.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-apps-all-repos.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-enterprise-owners-role.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-external-identities-owners.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-organizations.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-owner-users.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-owners-role.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-pats-all-repos.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-privilege-escalation-roles.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-privilege-escalation-users.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/privilege_zone_rules/t0-saml-identity-providers.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/actions-sha-pinning-not-required.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/active-leaked-secrets.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/advanced-security-disabled-new-repos.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/all-actions-allowed.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/app-installations-all-repos.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/branch-protection-admins-not-enforced.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/branch-protection-deletions-allowed.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/branch-protection-force-pushes.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/branch-protection-no-code-owner-reviews.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/branch-protection-no-pr-reviews.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/branch-protection-no-status-checks.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/branch-protection-self-approval.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/branch-protection-stale-reviews.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/bypass-pr-requirements.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/dangerous-branch-perms.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/default-repository-permissions.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/demo-sso-to-cloud-round-trip.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/dependabot-alerts-disabled-new-repos.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/dependabot-updates-disabled-new-repos.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/dependency-graph-disabled-new-repos.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/environments-admin-bypass.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/expired-pats.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/external-identities-without-scim.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/github-to-azure-identity.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/global-repo-perms.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/hybrid-identities.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/members-can-change-repo-visibility.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/members-can-create-pages.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/members-can-create-public-repos.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/members-can-delete-repos.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/members-can-fork-private-repos.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/members-can-invite-outside-collaborators.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/org-owners.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/orgs-without-2fa.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/pats-all-repo-access.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/pending-pat-requests.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/private-repos-forking-allowed.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/privileged-custom-org-roles.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/privileged-hybrid-identities.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/public-repos.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/push-protection-disabled-new-repos.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/push-to-protected-branches.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/repos-secret-scanning-disabled.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/repos-vulnerable-to-workflow-secret-exfil.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/repository-workflows.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/saml-configuration.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/secret-scanning-alerts.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/secret-scanning-disabled-new-repos.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/secrets-reachable-by-user.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/team-membership-admin.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/team-structure.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/unprotected-branches.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/unprotected-default-branch-with-workflow.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/unprotected-default-branches.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/web-commit-signoff-not-required.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/workflow-jobs-with-broad-token-write-permissions.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/workflow-jobs-with-id-token-write.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/extension/saved_searches/workflow-jobs-with-observed-oidc-auth-steps.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/justfile +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/pyproject.toml +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/scripts/generate_gh_description_docs.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/main.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/__init__.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/auth.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/extension.yaml +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/github_rest_client.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/github_retry.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/graph.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/graphql.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/helpers.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/kinds/nodes.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/main.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/__init__.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/actions_permission.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/app_installation.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/branch.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/branch_pr_bypass_allowance.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/branch_protection_rule.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/branch_push_allowance.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_admin.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_helpers.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_managed_user.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_member.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_organization.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_role.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_role_team.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_role_user.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_team.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_team_member.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_team_organization.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_team_role.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/enterprise_user.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/env_secret.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/env_variable.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/environment.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/environment_branch_policy.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/external_identity.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/org.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/org_role.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/org_role_member.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/org_role_team.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/org_secret.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/org_variable.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/personal_access_token.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/personal_access_token_access.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/personal_access_token_request.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/projected_enterprise_team.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/repo_role_assignment.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/repository.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/repository_role.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/repository_secret.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/repository_variable.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/saml_assertion_consumer_service.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/saml_helpers.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/saml_issuer.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/saml_provider.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/saml_service_provider.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/scim_user.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/secret_scanning_alert.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/team.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/team_member.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/team_role.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/user.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/models/workflow.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/resources/__init__.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/resources/enterprise.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/resources/organization.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/runner_ids.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/src/openhound_github/source.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_app_auth.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_branch_collection_gate.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_branch_protection_traversability.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_data/api/actions-permissions.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_data/api/actionsecrets.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_data/api/app.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_data/api/appinstalls.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_data/api/branch-policies.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_data/api/branch-prot-rules.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_data/api/branches.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_data/api/custom-roles.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_data/api/environments.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_data/api/org-pat-request.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_data/api/org-pat.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_data/api/org-role-teams.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_data/api/org-role-users.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_data/api/org-roles.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_data/api/org.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_data/api/pat-repositories.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_data/api/repo-collaborators.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_data/api/repo-teams.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_data/api/repositories.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_data/api/scimusers.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_data/api/secrets.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_data/api/secretscanningalert.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_data/api/selected-org-secrets.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_data/api/variables.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_data/api/workflows.json +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_description_docs.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_enterprise_capabilities.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_enterprise_organization.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_enterprise_resources.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_environment_model.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_environment_resources.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_environment_reviewer_lookup.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_error_resilience.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_github_app_retry.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_github_rest_client.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_github_retry.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_helpers.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_org_scim_resources.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_org_secret_models.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_runner_ids.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_runner_resources.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_saml_helpers.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_saml_models.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_scim_models.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_source_endpoints.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_source_org_canonicalization.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_team_external_groups.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/tests/test_variable_models.py +0 -0
- {openhound_github-0.9.0 → openhound_github-0.10.1}/uv.lock +0 -0
|
@@ -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
|
+
```
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# GH_CanRequestOIDCTokenFor
|
|
2
|
+
|
|
3
|
+
## General Information
|
|
4
|
+
|
|
5
|
+
The traversable GH_CanRequestOIDCTokenFor edge represents a static upper-bound capability: based on the collected workflow configuration, a GitHub Actions workflow job execution context may be able to request a GitHub-signed OIDC token containing claims for its associated GitHub Environment.
|
|
6
|
+
|
|
7
|
+
This edge is derived from the existing GH_DeploysTo relationship and the job's calculated `effective_github_token_permissions`. The collector emits it only when the job targets a statically resolved environment and its effective permissions include `id-token:write`.
|
|
8
|
+
|
|
9
|
+
This is a capability edge, not evidence that the workflow has historically requested a token or contains an explicit OIDC-related step. Code executing in a job with `id-token:write` can request the token directly.
|
|
10
|
+
|
|
11
|
+
The edge does not model run-specific permission recalculation. In particular, a `pull_request` run originating from a fork may receive downgraded `GITHUB_TOKEN` permissions at runtime and therefore may not be able to request an OIDC token even when this edge exists. The edge should not be interpreted as proof that every execution of the job can request OIDC.
|
|
12
|
+
|
|
13
|
+
## Edge Schema
|
|
14
|
+
|
|
15
|
+
| Source | Destination | Traversable |
|
|
16
|
+
| --- | --- | --- |
|
|
17
|
+
| `GH_WorkflowJob` | `GH_Environment` | `true` |
|
|
18
|
+
|
|
19
|
+
## Diagram
|
|
20
|
+
|
|
21
|
+
```mermaid
|
|
22
|
+
graph LR
|
|
23
|
+
n0["GH_WorkflowJob"]
|
|
24
|
+
n1["GH_Environment"]
|
|
25
|
+
n0 -->|GH_CanRequestOIDCTokenFor| n1
|
|
26
|
+
```
|
{openhound_github-0.9.0 → openhound_github-0.10.1}/descriptions/nodes/GH_EnterpriseRunner.md
RENAMED
|
@@ -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
|
```
|
|
@@ -6,6 +6,8 @@ Represents a GitHub Actions deployment environment configured on a repository. E
|
|
|
6
6
|
|
|
7
7
|
Repositories always contain their environments. When custom branch policies are configured, the environment also contains one or more GH_EnvironmentBranchPolicy nodes that describe which branches are allowed to deploy. Environment-scoped secrets and variables are modeled as child nodes of the environment and become available to workflow jobs that reference it.
|
|
8
8
|
|
|
9
|
+
GH_CanRequestOIDCTokenFor edges from GH_WorkflowJob nodes identify jobs with a static upper-bound capability to request a GitHub-signed OIDC token for this environment because their effective `GITHUB_TOKEN` permissions include `id-token:write`. Runtime permission recalculation, such as forked `pull_request` permission downgrades, may prevent a specific execution from requesting OIDC even when this edge exists.
|
|
10
|
+
|
|
9
11
|
## Properties
|
|
10
12
|
|
|
11
13
|
| Property | Type | Description |
|
|
@@ -57,4 +59,5 @@ graph LR
|
|
|
57
59
|
n8 -.->|GH_ApprovesDeploymentTo| n1
|
|
58
60
|
n8 -->|GH_CanDeployToEnvironment| n1
|
|
59
61
|
n9 -.->|GH_DeploysTo| n1
|
|
62
|
+
n9 -->|GH_CanRequestOIDCTokenFor| n1
|
|
60
63
|
```
|
|
@@ -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
|
```
|
|
@@ -8,6 +8,10 @@ When the job has a statically resolvable self-hosted `runs-on` selector, GH_Runs
|
|
|
8
8
|
|
|
9
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
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. When a job targets an environment and its effective permissions include `id-token:write`, GH_CanRequestOIDCTokenFor identifies a static upper-bound OIDC capability for that environment. Runtime permission recalculation, such as forked `pull_request` permission downgrades, may prevent a specific execution from requesting OIDC even when this edge exists.
|
|
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
|
+
|
|
11
15
|
## Properties
|
|
12
16
|
|
|
13
17
|
| Property | Type | Description |
|
|
@@ -37,6 +41,7 @@ When present, `job_permissions` captures the job-level `permissions` declaration
|
|
|
37
41
|
| `query_steps` | `string` | Query for workflow steps. |
|
|
38
42
|
| `query_references` | `string` | Query for workflow references (secrets and variables). |
|
|
39
43
|
| `query_runners` | `string` | Query for eligible self-hosted runners. |
|
|
44
|
+
| `query_accessible_secrets` | `string` | Query for secrets accessible to the job execution context. |
|
|
40
45
|
|
|
41
46
|
## Diagram
|
|
42
47
|
|
|
@@ -62,6 +67,11 @@ graph LR
|
|
|
62
67
|
n1 -.->|GH_UsesSecret| n7
|
|
63
68
|
n1 -.->|GH_UsesVariable| n8
|
|
64
69
|
n1 -.->|GH_RunsOn| n9
|
|
70
|
+
n1 -->|GH_CanAccessSecret| n3
|
|
71
|
+
n1 -->|GH_CanAccessSecret| n5
|
|
72
|
+
n1 -->|GH_CanAccessSecret| n7
|
|
73
|
+
n1 -->|GH_CanRequestOIDCTokenFor| n2
|
|
74
|
+
n9 -->|GH_CanInterceptJob| n1
|
|
65
75
|
n1 -.->|GH_CallsWorkflow| n0
|
|
66
76
|
n1 -.->|GH_DependsOn| n1
|
|
67
77
|
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 |
|
|
@@ -80,24 +89,27 @@ Pre-built Cypher queries for identifying security-relevant configurations across
|
|
|
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. |
|
|
82
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`. |
|
|
83
|
-
| 43 | `workflow-jobs-with-id-token-write-on-self-hosted-runners.json` | OIDC-Capable Workflow Jobs
|
|
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. |
|
|
84
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. |
|
|
85
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. |
|
|
86
98
|
|
|
87
99
|
### :white_circle: Low — Hygiene & Governance
|
|
88
100
|
|
|
89
101
|
| # | File | Name | Description |
|
|
90
102
|
|---|------|------|-------------|
|
|
91
|
-
|
|
|
92
|
-
|
|
|
93
|
-
|
|
|
94
|
-
|
|
|
95
|
-
|
|
|
96
|
-
|
|
|
97
|
-
|
|
|
98
|
-
|
|
|
99
|
-
|
|
|
100
|
-
|
|
|
101
|
-
|
|
|
102
|
-
|
|
|
103
|
-
|
|
|
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: 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
|
+
}
|
|
@@ -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,16 @@
|
|
|
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
|
+
},
|
|
1058
|
+
{
|
|
1059
|
+
"name": "GH_CanRequestOIDCTokenFor",
|
|
1060
|
+
"description": "[Computed] Workflow job has a static upper-bound capability to request a GitHub OIDC token for its deployment environment — GH_WorkflowJob → GH_Environment",
|
|
1061
|
+
"is_traversable": true
|
|
1062
|
+
},
|
|
1048
1063
|
{
|
|
1049
1064
|
"name": "GH_UsesVariable",
|
|
1050
1065
|
"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,9 @@ 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" # noqa: S105 - OpenGraph edge kind
|
|
24
|
+
CAN_REQUEST_OIDC_TOKEN_FOR = "GH_CanRequestOIDCTokenFor" # noqa: S105 - OpenGraph edge kind
|
|
22
25
|
IS_ELIGIBLE_FOR = "GH_IsEligibleFor"
|
|
23
26
|
CAN_CREATE_REPOSITORY_WITH_RUNNER_ACCESS = "GH_CanCreateRepositoryWithRunnerAccess"
|
|
24
27
|
CAN_CREATE_BRANCH = "GH_CanCreateBranch"
|
|
@@ -218,13 +218,13 @@ class GithubLookup(LookupManager):
|
|
|
218
218
|
return True
|
|
219
219
|
|
|
220
220
|
@lru_cache
|
|
221
|
-
def
|
|
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,29 +243,36 @@ class GithubLookup(LookupManager):
|
|
|
243
243
|
|
|
244
244
|
repository_visibility, actions_enabled = repository
|
|
245
245
|
required_labels = {str(label).casefold() for label in labels}
|
|
246
|
-
|
|
246
|
+
matching_runners: list[tuple[int, str, bool | None]] = []
|
|
247
247
|
seen_runner_node_ids: set[str] = set()
|
|
248
248
|
|
|
249
|
-
def add_matching_runner(
|
|
249
|
+
def add_matching_runner(
|
|
250
|
+
source_order: int,
|
|
251
|
+
node_id: str,
|
|
252
|
+
raw_labels: Any,
|
|
253
|
+
ephemeral: bool | None,
|
|
254
|
+
) -> None:
|
|
250
255
|
if node_id in seen_runner_node_ids:
|
|
251
256
|
return
|
|
252
257
|
if not required_labels.issubset(self._runner_label_names(raw_labels)):
|
|
253
258
|
return
|
|
254
259
|
seen_runner_node_ids.add(node_id)
|
|
255
|
-
|
|
260
|
+
matching_runners.append((source_order, node_id, ephemeral))
|
|
256
261
|
|
|
257
262
|
if group_name is None:
|
|
258
|
-
for runner_id, raw_labels in self._find_all_objects(
|
|
263
|
+
for runner_id, raw_labels, ephemeral in self._find_all_objects(
|
|
259
264
|
f"""
|
|
260
|
-
SELECT id, labels
|
|
265
|
+
SELECT id, labels, ephemeral
|
|
261
266
|
FROM {self.schema}.repo_runners
|
|
262
267
|
WHERE repository_node_id = ?
|
|
263
268
|
""",
|
|
264
269
|
[repository_node_id],
|
|
265
270
|
):
|
|
266
271
|
add_matching_runner(
|
|
272
|
+
0,
|
|
267
273
|
runner_node_id(repository_node_id, int(runner_id)),
|
|
268
274
|
raw_labels,
|
|
275
|
+
ephemeral,
|
|
269
276
|
)
|
|
270
277
|
|
|
271
278
|
if actions_enabled is not True:
|
|
@@ -329,9 +336,9 @@ class GithubLookup(LookupManager):
|
|
|
329
336
|
if not identity:
|
|
330
337
|
continue
|
|
331
338
|
enterprise_node_id, enterprise_runner_group_id = identity
|
|
332
|
-
for runner_id, raw_labels in self._find_all_objects(
|
|
339
|
+
for runner_id, raw_labels, ephemeral in self._find_all_objects(
|
|
333
340
|
f"""
|
|
334
|
-
SELECT r.id, r.labels
|
|
341
|
+
SELECT r.id, r.labels, r.ephemeral
|
|
335
342
|
FROM {self.schema}.enterprise_runner_group_memberships m
|
|
336
343
|
JOIN {self.schema}.enterprise_runners r
|
|
337
344
|
ON r.enterprise_node_id = m.enterprise_node_id
|
|
@@ -342,14 +349,16 @@ class GithubLookup(LookupManager):
|
|
|
342
349
|
[enterprise_node_id, enterprise_runner_group_id],
|
|
343
350
|
):
|
|
344
351
|
add_matching_runner(
|
|
352
|
+
2,
|
|
345
353
|
runner_node_id(enterprise_node_id, int(runner_id)),
|
|
346
354
|
raw_labels,
|
|
355
|
+
ephemeral,
|
|
347
356
|
)
|
|
348
357
|
continue
|
|
349
358
|
|
|
350
|
-
for runner_id, raw_labels in self._find_all_objects(
|
|
359
|
+
for runner_id, raw_labels, ephemeral in self._find_all_objects(
|
|
351
360
|
f"""
|
|
352
|
-
SELECT r.id, r.labels
|
|
361
|
+
SELECT r.id, r.labels, r.ephemeral
|
|
353
362
|
FROM {self.schema}.org_runner_group_memberships m
|
|
354
363
|
JOIN {self.schema}.org_runners r
|
|
355
364
|
ON r.org_login = m.org_login
|
|
@@ -360,11 +369,85 @@ class GithubLookup(LookupManager):
|
|
|
360
369
|
[org_login, runner_group_id],
|
|
361
370
|
):
|
|
362
371
|
add_matching_runner(
|
|
372
|
+
1,
|
|
363
373
|
runner_node_id(self.org_id_for_login(org_login), int(runner_id)),
|
|
364
374
|
raw_labels,
|
|
375
|
+
ephemeral,
|
|
365
376
|
)
|
|
366
377
|
|
|
367
|
-
return
|
|
378
|
+
return [
|
|
379
|
+
(node_id, ephemeral)
|
|
380
|
+
for _source_order, node_id, ephemeral in sorted(
|
|
381
|
+
matching_runners,
|
|
382
|
+
key=lambda runner: (runner[0], runner[1]),
|
|
383
|
+
)
|
|
384
|
+
]
|
|
385
|
+
|
|
386
|
+
@lru_cache
|
|
387
|
+
def workflow_job_runner_node_ids(
|
|
388
|
+
self,
|
|
389
|
+
repository_node_id: str,
|
|
390
|
+
org_login: str,
|
|
391
|
+
group_name: str | None,
|
|
392
|
+
labels: tuple[str, ...],
|
|
393
|
+
) -> list[str]:
|
|
394
|
+
"""Return accessible self-hosted runner node IDs matching a static selector."""
|
|
395
|
+
return [
|
|
396
|
+
runner_node_id
|
|
397
|
+
for runner_node_id, _ephemeral in self._workflow_job_runner_matches(
|
|
398
|
+
repository_node_id,
|
|
399
|
+
org_login,
|
|
400
|
+
group_name,
|
|
401
|
+
labels,
|
|
402
|
+
)
|
|
403
|
+
]
|
|
404
|
+
|
|
405
|
+
@lru_cache
|
|
406
|
+
def workflow_job_interceptable_runner_node_ids(
|
|
407
|
+
self,
|
|
408
|
+
repository_node_id: str,
|
|
409
|
+
org_login: str,
|
|
410
|
+
group_name: str | None,
|
|
411
|
+
labels: tuple[str, ...],
|
|
412
|
+
) -> list[str]:
|
|
413
|
+
"""Return matching runner node IDs not explicitly marked ephemeral."""
|
|
414
|
+
return [
|
|
415
|
+
runner_node_id
|
|
416
|
+
for runner_node_id, ephemeral in self._workflow_job_runner_matches(
|
|
417
|
+
repository_node_id,
|
|
418
|
+
org_login,
|
|
419
|
+
group_name,
|
|
420
|
+
labels,
|
|
421
|
+
)
|
|
422
|
+
if ephemeral is not True
|
|
423
|
+
]
|
|
424
|
+
|
|
425
|
+
@lru_cache
|
|
426
|
+
def workflow_step_secret_reference_names(self, job_node_id: str) -> list[str]:
|
|
427
|
+
"""Return unique secret names statically referenced by steps in a job."""
|
|
428
|
+
names: list[str] = []
|
|
429
|
+
seen: set[str] = set()
|
|
430
|
+
for (raw_references,) in self._find_all_objects(
|
|
431
|
+
f"""
|
|
432
|
+
SELECT secret_references
|
|
433
|
+
FROM {self.schema}.workflow_steps
|
|
434
|
+
WHERE job_node_id = ?
|
|
435
|
+
""",
|
|
436
|
+
[job_node_id],
|
|
437
|
+
):
|
|
438
|
+
for reference in self._json_list(raw_references):
|
|
439
|
+
if not isinstance(reference, dict):
|
|
440
|
+
continue
|
|
441
|
+
name = reference.get("name")
|
|
442
|
+
if name is None:
|
|
443
|
+
continue
|
|
444
|
+
name = str(name)
|
|
445
|
+
key = name.casefold()
|
|
446
|
+
if key in seen:
|
|
447
|
+
continue
|
|
448
|
+
seen.add(key)
|
|
449
|
+
names.append(name)
|
|
450
|
+
return names
|
|
368
451
|
|
|
369
452
|
@lru_cache
|
|
370
453
|
def enterprise_idp_for_scope(
|
|
@@ -523,6 +606,9 @@ class GithubLookup(LookupManager):
|
|
|
523
606
|
repository_can_approve_pull_request_reviews
|
|
524
607
|
FROM {self.schema}.workflows
|
|
525
608
|
WHERE repository_node_id = ?
|
|
609
|
+
ORDER BY
|
|
610
|
+
repository_default_workflow_permissions IS NULL,
|
|
611
|
+
repository_can_approve_pull_request_reviews IS NULL
|
|
526
612
|
LIMIT 1
|
|
527
613
|
""",
|
|
528
614
|
[repository_node_id],
|
|
@@ -317,6 +317,7 @@ class GHRunnerProperties(GHNodeProperties):
|
|
|
317
317
|
query_group: Query for group.
|
|
318
318
|
query_repositories: Query for repositories.
|
|
319
319
|
query_jobs: Query for workflow jobs that can be scheduled on the runner.
|
|
320
|
+
query_interceptable_jobs: Query for workflow jobs the runner can intercept.
|
|
320
321
|
"""
|
|
321
322
|
|
|
322
323
|
scope: str | None = None
|
|
@@ -336,6 +337,7 @@ class GHRunnerProperties(GHNodeProperties):
|
|
|
336
337
|
query_group: str | None = None
|
|
337
338
|
query_repositories: str | None = None
|
|
338
339
|
query_jobs: str | None = None
|
|
340
|
+
query_interceptable_jobs: str | None = None
|
|
339
341
|
|
|
340
342
|
|
|
341
343
|
@app.asset(
|
|
@@ -387,6 +389,7 @@ class OrgRunner(BaseAsset):
|
|
|
387
389
|
query_group=f"MATCH p=(:GH_OrgRunnerGroup)-[:GH_HasRunner]->(:GH_OrgRunner {{node_id:'{rid}'}}) RETURN p",
|
|
388
390
|
query_repositories=f"MATCH p=(:GH_Repository)-[:GH_CanUseRunner]->(:GH_OrgRunnerGroup)-[:GH_HasRunner]->(:GH_OrgRunner {{node_id:'{rid}'}}) RETURN p",
|
|
389
391
|
query_jobs=f"MATCH p=(:GH_WorkflowJob)-[:GH_RunsOn]->(:GH_Runner {{node_id:'{rid}'}}) RETURN p",
|
|
392
|
+
query_interceptable_jobs=f"MATCH p=(:GH_Runner {{node_id:'{rid}'}})-[:GH_CanInterceptJob]->(:GH_WorkflowJob) RETURN p",
|
|
390
393
|
),
|
|
391
394
|
)
|
|
392
395
|
|
|
@@ -441,6 +444,7 @@ class EnterpriseRunner(BaseAsset):
|
|
|
441
444
|
query_group=f"MATCH p=(:GH_EnterpriseRunnerGroup)-[:GH_HasRunner]->(:GH_EnterpriseRunner {{node_id:'{rid}'}}) RETURN p",
|
|
442
445
|
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
446
|
query_jobs=f"MATCH p=(:GH_WorkflowJob)-[:GH_RunsOn]->(:GH_Runner {{node_id:'{rid}'}}) RETURN p",
|
|
447
|
+
query_interceptable_jobs=f"MATCH p=(:GH_Runner {{node_id:'{rid}'}})-[:GH_CanInterceptJob]->(:GH_WorkflowJob) RETURN p",
|
|
444
448
|
),
|
|
445
449
|
)
|
|
446
450
|
|
|
@@ -878,6 +882,7 @@ class RepoRunner(BaseAsset):
|
|
|
878
882
|
environmentid=self.org_node_id,
|
|
879
883
|
query_repositories=f"MATCH p=(:GH_Repository {{node_id:'{self.repository_node_id}'}})-[:GH_CanUseRunner]->(:GH_RepoRunner {{node_id:'{rid}'}}) RETURN p",
|
|
880
884
|
query_jobs=f"MATCH p=(:GH_WorkflowJob)-[:GH_RunsOn]->(:GH_Runner {{node_id:'{rid}'}}) RETURN p",
|
|
885
|
+
query_interceptable_jobs=f"MATCH p=(:GH_Runner {{node_id:'{rid}'}})-[:GH_CanInterceptJob]->(:GH_WorkflowJob) RETURN p",
|
|
881
886
|
),
|
|
882
887
|
)
|
|
883
888
|
|