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