openhound-github 0.5.2__tar.gz → 0.6.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.5.2 → openhound_github-0.6.0}/PKG-INFO +1 -1
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ApprovesDeploymentTo.md +1 -1
- openhound_github-0.6.0/descriptions/edges/GH_AssignedTo.md +5 -0
- openhound_github-0.6.0/descriptions/edges/GH_CanCreateRepositoryWithRunnerAccess.md +9 -0
- openhound_github-0.6.0/descriptions/edges/GH_CanDeployToEnvironment.md +9 -0
- openhound_github-0.6.0/descriptions/edges/GH_CanUseRunner.md +7 -0
- openhound_github-0.6.0/descriptions/edges/GH_HasRunner.md +5 -0
- openhound_github-0.6.0/descriptions/edges/GH_InheritedFrom.md +5 -0
- openhound_github-0.6.0/descriptions/edges/GH_IsEligibleFor.md +5 -0
- openhound_github-0.6.0/descriptions/nodes/GH_EnterpriseRunner.md +5 -0
- openhound_github-0.6.0/descriptions/nodes/GH_EnterpriseRunnerGroup.md +5 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/nodes/GH_OrgRunner.md +1 -1
- openhound_github-0.6.0/descriptions/nodes/GH_OrgRunnerGroup.md +5 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/schema.json +14 -9
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/kinds/edges.py +2 -1
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/lookup.py +311 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/main.py +6 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/environment.py +168 -9
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/environment_branch_policy.py +9 -4
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/repository.py +7 -1
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/runner.py +142 -125
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/resources/organization.py +1 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/transforms.py +118 -3
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_environment_model.py +152 -0
- openhound_github-0.6.0/tests/test_environment_reviewer_lookup.py +193 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_runner_models.py +216 -81
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_runner_resources.py +2 -0
- openhound_github-0.5.2/descriptions/edges/GH_AssignedTo.md +0 -5
- openhound_github-0.5.2/descriptions/edges/GH_CanCreateRepositoryWithRunnerAccess.md +0 -9
- openhound_github-0.5.2/descriptions/edges/GH_CanDeployToEnvironment.md +0 -7
- openhound_github-0.5.2/descriptions/edges/GH_CanUseRunner.md +0 -5
- openhound_github-0.5.2/descriptions/edges/GH_GrantsAccessTo.md +0 -5
- openhound_github-0.5.2/descriptions/edges/GH_InheritedFrom.md +0 -5
- openhound_github-0.5.2/descriptions/nodes/GH_EnterpriseRunner.md +0 -5
- openhound_github-0.5.2/descriptions/nodes/GH_EnterpriseRunnerGroup.md +0 -5
- openhound_github-0.5.2/descriptions/nodes/GH_OrgRunnerGroup.md +0 -5
- {openhound_github-0.5.2 → openhound_github-0.6.0}/.github/CODE_OF_CONDUCT.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/.github/CONTRIBUTING.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/.github/GOVERNANCE.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/.github/GitHub-COC-Header.png +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/.github/GitHub-CONTRIB-Header.png +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/.github/GitHub-GOV-Header.png +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/.github/GitHub-Header.png +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/.github/GitHub-LIC-Header.png +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/.github/GitHub-SEC-Header.png +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/.github/SECURITY.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/.github/SO-Dark.svg +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/.github/SO-FOSS-Dark.svg +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/.github/SO-FOSS-Light.svg +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/.github/SO-Light.svg +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/.github/workflows/publish.yml +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/.github/workflows/release-on-merge.yml +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/.github/workflows/validate-branch.yml +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/.gitignore +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/.gitmodules +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/.pre-commit-config.yaml +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/LICENSE.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/README.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_AddAssignee.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_AddCollaborator.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_AddLabel.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_AddMember.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_AdminTo.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_BypassBranchProtection.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_BypassPullRequestAllowances.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_CallsWorkflow.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_CanAccess.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_CanAssumeIdentity.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_CanCreateBranch.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_CanCreateEnvironment.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_CanEditEnvironment.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_CanEditProtection.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_CanPwnRequest.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_CanReadSecretScanningAlert.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_CanWriteBranch.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_CloseDiscussion.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_CloseIssue.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ClosePullRequest.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_Contains.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ConvertIssuesToDiscussions.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_CreateDiscussionCategory.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_CreateRepository.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_CreateSoloMergeQueueEntry.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_CreateTag.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_CreateTeam.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_DeleteAlertsCodeScanning.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_DeleteDiscussion.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_DeleteDiscussionComment.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_DeleteIssue.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_DeleteTag.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_DependsOn.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_DeploysTo.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_EditCategoryOnDiscussion.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_EditDiscussionCategory.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_EditDiscussionComment.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_EditRepoAnnouncementBanners.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_EditRepoCustomPropertiesValues.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_EditRepoMetadata.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_EditRepoProtections.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_HasBaseRole.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_HasBranch.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_HasEnvironment.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_HasExternalIdentity.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_HasJob.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_HasMember.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_HasPersonalAccessToken.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_HasPersonalAccessTokenRequest.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_HasRole.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_HasSamlIdentityProvider.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_HasSecret.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_HasStep.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_HasVariable.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_HasWorkflow.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_InstalledAs.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_InviteMember.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_JumpMergeQueue.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ManageDeployKeys.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ManageDiscussionBadges.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ManageOrganizationWebhooks.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ManageRepoSecurityProducts.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ManageSecurityProducts.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ManageSettingsMergeTypes.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ManageSettingsPages.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ManageSettingsProjects.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ManageSettingsWiki.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ManageTopics.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ManageWebhooks.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_MapsToUser.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_MarkAsDuplicate.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_MatchesEnvironmentPolicy.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_MemberOf.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_OrgBypassCodeScanningDismissalRequests.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_OrgBypassSecretScanningClosureRequests.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_OrgReviewAndManageSecretScanningBypassRequests.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_OrgReviewAndManageSecretScanningClosureRequests.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_Owns.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ProtectedBy.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_PushProtectedBranch.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ReadCodeScanning.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ReadOrganizationActionsUsageMetrics.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ReadOrganizationCustomOrgRole.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ReadOrganizationCustomRepoRole.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ReadRepoContents.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_RemoveAssignee.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_RemoveLabel.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ReopenDiscussion.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ReopenIssue.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ReopenPullRequest.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_RequestPrReview.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ResolveDependabotAlerts.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ResolveSecretScanningAlerts.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_RestrictionsCanPush.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_RunOrgMigration.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_SetInteractionLimits.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_SetIssueType.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_SetMilestone.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_SetSocialPreview.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_SyncedTo.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ToggleDiscussionAnswer.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ToggleDiscussionCommentMinimize.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_TransferRepository.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_UsesSecret.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_UsesVariable.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ValidToken.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ViewDependabotAlerts.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ViewSecretScanningAlerts.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_WriteCodeScanning.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_WriteOrganizationActionsSecrets.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_WriteOrganizationActionsSettings.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_WriteOrganizationActionsVariables.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_WriteOrganizationCustomOrgRole.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_WriteOrganizationCustomRepoRole.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_WriteOrganizationNetworkConfigurations.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_WriteRepoContents.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_WriteRepoPullRequests.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/nodes/GH_App.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/nodes/GH_AppInstallation.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/nodes/GH_Branch.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/nodes/GH_BranchProtectionRule.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/nodes/GH_Environment.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/nodes/GH_EnvironmentBranchPolicy.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/nodes/GH_EnvironmentSecret.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/nodes/GH_EnvironmentVariable.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/nodes/GH_ExternalIdentity.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/nodes/GH_OrgRole.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/nodes/GH_OrgSecret.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/nodes/GH_OrgVariable.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/nodes/GH_Organization.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/nodes/GH_PersonalAccessToken.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/nodes/GH_PersonalAccessTokenRequest.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/nodes/GH_RepoRole.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/nodes/GH_RepoRunner.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/nodes/GH_RepoSecret.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/nodes/GH_RepoVariable.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/nodes/GH_Repository.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/nodes/GH_SamlIdentityProvider.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/nodes/GH_SecretScanningAlert.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/nodes/GH_Team.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/nodes/GH_TeamRole.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/nodes/GH_User.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/nodes/GH_Workflow.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/nodes/GH_WorkflowJob.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/nodes/GH_WorkflowStep.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/docs/og-docs.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/privilege_zone_rules/t0-all-repo-admin-role.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/privilege_zone_rules/t0-app-installations-all-repos.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/privilege_zone_rules/t0-apps-all-repos.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/privilege_zone_rules/t0-external-identities-owners.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/privilege_zone_rules/t0-organizations.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/privilege_zone_rules/t0-owner-users.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/privilege_zone_rules/t0-owners-role.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/privilege_zone_rules/t0-pats-all-repos.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/privilege_zone_rules/t0-privilege-escalation-roles.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/privilege_zone_rules/t0-privilege-escalation-users.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/privilege_zone_rules/t0-saml-identity-providers.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/README.md +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/actions-sha-pinning-not-required.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/active-leaked-secrets.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/advanced-security-disabled-new-repos.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/all-actions-allowed.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/app-installations-all-repos.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/branch-protection-admins-not-enforced.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/branch-protection-deletions-allowed.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/branch-protection-force-pushes.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/branch-protection-no-code-owner-reviews.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/branch-protection-no-pr-reviews.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/branch-protection-no-status-checks.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/branch-protection-self-approval.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/branch-protection-stale-reviews.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/bypass-pr-requirements.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/dangerous-branch-perms.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/default-repository-permissions.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/demo-sso-to-cloud-round-trip.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/dependabot-alerts-disabled-new-repos.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/dependabot-updates-disabled-new-repos.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/dependency-graph-disabled-new-repos.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/environments-admin-bypass.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/expired-pats.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/external-identities-without-scim.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/github-to-azure-identity.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/global-repo-perms.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/hybrid-identities.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/members-can-change-repo-visibility.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/members-can-create-pages.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/members-can-create-public-repos.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/members-can-delete-repos.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/members-can-fork-private-repos.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/members-can-invite-outside-collaborators.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/org-owners.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/orgs-without-2fa.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/pats-all-repo-access.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/pending-pat-requests.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/private-repos-forking-allowed.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/privileged-custom-org-roles.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/privileged-hybrid-identities.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/public-repos.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/push-protection-disabled-new-repos.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/push-to-protected-branches.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/repos-secret-scanning-disabled.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/repos-vulnerable-to-workflow-secret-exfil.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/repository-workflows.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/saml-configuration.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/secret-scanning-alerts.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/secret-scanning-disabled-new-repos.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/secrets-reachable-by-user.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/team-membership-admin.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/team-structure.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/unprotected-branches.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/unprotected-default-branch-with-workflow.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/unprotected-default-branches.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/extension/saved_searches/web-commit-signoff-not-required.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/justfile +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/pyproject.toml +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/main.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/__init__.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/auth.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/extension.yaml +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/graph.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/graphql.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/helpers.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/kinds/nodes.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/__init__.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/actions_permission.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/app_installation.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/branch.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/branch_pr_bypass_allowance.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/branch_protection_rule.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/branch_push_allowance.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/enterprise.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/enterprise_admin.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/enterprise_helpers.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/enterprise_managed_user.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/enterprise_member.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/enterprise_organization.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/enterprise_role.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/enterprise_role_team.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/enterprise_role_user.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/enterprise_team.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/enterprise_team_member.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/enterprise_team_organization.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/enterprise_team_role.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/enterprise_user.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/env_secret.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/env_variable.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/external_identity.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/org.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/org_role.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/org_role_member.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/org_role_team.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/org_secret.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/org_variable.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/personal_access_token.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/personal_access_token_access.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/personal_access_token_request.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/projected_enterprise_team.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/repo_role_assignment.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/repository_role.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/repository_secret.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/repository_variable.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/saml_assertion_consumer_service.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/saml_helpers.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/saml_issuer.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/saml_provider.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/saml_service_provider.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/scim_user.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/secret_scanning_alert.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/team.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/team_member.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/team_role.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/user.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/workflow.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/workflow_job.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/models/workflow_step.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/resources/__init__.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/resources/enterprise.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/runner_ids.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/src/openhound_github/source.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_app_auth.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_branch_collection_gate.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_branch_protection_traversability.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_data/api/actions-permissions.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_data/api/actionsecrets.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_data/api/app.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_data/api/appinstalls.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_data/api/branch-policies.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_data/api/branch-prot-rules.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_data/api/branches.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_data/api/custom-roles.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_data/api/environments.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_data/api/org-pat-request.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_data/api/org-pat.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_data/api/org-role-teams.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_data/api/org-role-users.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_data/api/org-roles.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_data/api/org.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_data/api/pat-repositories.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_data/api/repo-collaborators.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_data/api/repo-teams.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_data/api/repositories.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_data/api/scimusers.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_data/api/secrets.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_data/api/secretscanningalert.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_data/api/selected-org-secrets.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_data/api/variables.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_data/api/workflows.json +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_enterprise_capabilities.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_enterprise_organization.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_enterprise_resources.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_environment_resources.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_error_resilience.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_external_identity_tenant_matching.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_github_rest_client.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_github_retry.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_org_secret_models.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_repository_rulesets.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_runner_ids.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_saml_helpers.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_saml_models.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_scim_models.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_variable_models.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/tests/test_workflow_model.py +0 -0
- {openhound_github-0.5.2 → openhound_github-0.6.0}/uv.lock +0 -0
{openhound_github-0.5.2 → openhound_github-0.6.0}/descriptions/edges/GH_ApprovesDeploymentTo.md
RENAMED
|
@@ -4,4 +4,4 @@ The non-traversable GH_ApprovesDeploymentTo edge represents that a user or team
|
|
|
4
4
|
|
|
5
5
|
This edge is emitted from GH_User or GH_Team nodes to GH_Environment nodes when the environment includes a required reviewer protection rule. Required reviewers act as an approval gate before jobs referencing the environment can continue.
|
|
6
6
|
|
|
7
|
-
The edge is non-traversable because it records reviewer configuration rather than direct deployment access. When self-review is allowed, the same reviewer may also receive a traversable GH_CanDeployToEnvironment edge
|
|
7
|
+
The edge is non-traversable because it records reviewer configuration rather than direct deployment access. When self-review is allowed, the same reviewer may also receive a traversable GH_CanDeployToEnvironment edge only if they can also supply deployable code through GH_CanCreateBranch or GH_CanWriteBranch under the environment's branch policy. When prevent_self_review is enabled, GH_ApprovesDeploymentTo remains context only because the split-principal approval flow is not currently modeled.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
## General Information
|
|
2
|
+
|
|
3
|
+
The traversable GH_CanCreateRepositoryWithRunnerAccess edge is a computed edge indicating that a GH_OrgRole can create a repository that will immediately be able to dispatch workflows to a GH_OrgRunnerGroup.
|
|
4
|
+
|
|
5
|
+
This edge is emitted only for runner groups with `visibility=all` or `visibility=private`. Groups with `visibility=selected` require explicit repository assignment, so creating a repository does not automatically grant access to the group. For `visibility=all`, public repository creation is included only when `allows_public_repositories=true`; otherwise the composition is limited to private and internal repository creation.
|
|
6
|
+
|
|
7
|
+
The collector emits this edge only when new repositories in the organization have GitHub Actions enabled by default (`actions_enabled_repositories=all`), the organization-facing runner group has `restricted_to_workflows=false`, and inherited enterprise-backed access also has `restricted_to_workflows=false` on the source GH_EnterpriseRunnerGroup.
|
|
8
|
+
|
|
9
|
+
The computation follows repository-creation capability edges from the org role to the organization and then GH_Contains to the runner group. Each edge includes a `query_composition` Cypher query showing the repository-creation path and the Actions and runner-group policy predicates that make the path immediately usable.
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
## General Information
|
|
2
|
+
|
|
3
|
+
The traversable GH_CanDeployToEnvironment edge represents the ability for a repository, branch, repository role, or reviewer to satisfy the modeled deployment constraints for a GitHub Environment.
|
|
4
|
+
|
|
5
|
+
This edge is computed from environment deployment branch policy, branch protection state, required reviewer behavior, and administrator bypass behavior. For environments without required reviewers, unrestricted environments emit repository and branch edges, protected-branch-only environments emit edges only for protected branches unless no branch protection rules exist, and custom branch policies emit edges only for matching branches.
|
|
6
|
+
|
|
7
|
+
When required reviewers are configured and self-review is allowed, a configured GH_User or GH_Team reviewer receives GH_CanDeployToEnvironment only when the same actor can also supply deployable code. For unrestricted environments this means the actor can create a branch in the repository. For protected-branch-only or custom branch policy environments this means the actor can write to an eligible branch under the existing GH_CanWriteBranch rules.
|
|
8
|
+
|
|
9
|
+
Self-review alone is not sufficient for this edge. GH_ApprovesDeploymentTo remains the non-traversable representation of reviewer authority, while GH_CanDeployToEnvironment represents the combined ability to satisfy both the approval gate and the code-supply path. When prevent_self_review is enabled, no direct deploy edge is emitted for the reviewer because the required split-principal flow is not currently modeled.
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
## General Information
|
|
2
|
+
|
|
3
|
+
For runner-group-backed access, the traversable GH_CanUseRunner edge is a computed edge representing that a repository or branch can dispatch workflows to a self-hosted runner execution surface under the modeled runner-group controls.
|
|
4
|
+
|
|
5
|
+
The collector derives this edge from GH_IsEligibleFor rather than directly from repository visibility. It emits GH_CanUseRunner only when the repository is within the runner group's repository-access scope, GitHub Actions is enabled for the repository, and `restricted_to_workflows=false` on the organization-facing runner group. Inherited enterprise-backed access also requires `restricted_to_workflows=false` on the source GH_EnterpriseRunnerGroup. Every collected branch in a repository that satisfies those conditions receives the same edge so branch write paths can reach the execution surface.
|
|
6
|
+
|
|
7
|
+
Organization and inherited enterprise-backed access terminate at the organization-facing GH_OrgRunnerGroup, then continue through GH_HasRunner for native organization runners or through GH_InheritedFrom and GH_HasRunner for inherited enterprise runners. Repository-scoped runners currently receive GH_CanUseRunner directly from their containing repository and are not part of this runner-group traversability change.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
## General Information
|
|
2
|
+
|
|
3
|
+
The traversable GH_HasRunner edge represents that a runner group exposes a directly assigned self-hosted runner to repositories or workflows that satisfy the runner group's access policy.
|
|
4
|
+
|
|
5
|
+
This edge is distinct from GH_Contains. GH_Contains records structural membership only, while GH_HasRunner represents the runner-group-to-runner capability hop used for attack-path composition. This edge is emitted only for direct organization and enterprise runner group memberships; inherited organization runner group access to enterprise runners is modeled as GH_Repository or GH_Branch -[:GH_CanUseRunner]-> GH_OrgRunnerGroup -[:GH_InheritedFrom]-> GH_EnterpriseRunnerGroup -[:GH_HasRunner]-> GH_EnterpriseRunner.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
## General Information
|
|
2
|
+
|
|
3
|
+
The traversable GH_InheritedFrom edge links an inherited GH_OrgRunnerGroup to the GH_EnterpriseRunnerGroup that owns the underlying runner set. This preserves the organization-local view of a runner group while still identifying the enterprise source that provides the runners.
|
|
4
|
+
|
|
5
|
+
This edge is traversable because an inherited organization runner group is the organization-facing policy boundary for the enterprise runner group. Repository access flows through the organization runner group, then through GH_InheritedFrom to the enterprise group, and finally through GH_HasRunner to directly assigned enterprise runners.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
## General Information
|
|
2
|
+
|
|
3
|
+
The non-traversable GH_IsEligibleFor edge represents that a repository is within the repository-access scope of an organization runner group.
|
|
4
|
+
|
|
5
|
+
For runner groups, this edge evaluates the group's `visibility`, selected repository assignments, and `allows_public_repositories` setting. It does not prove that workflows in the repository can dispatch to the group's runners, because GitHub Actions may be disabled for the repository or the runner group may be restricted to selected workflows.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
## Description
|
|
2
|
+
|
|
3
|
+
Represents a self-hosted runner owned at the GitHub Enterprise level. Enterprise runners are contained by GH_EnterpriseRunnerGroup nodes and exposed through GH_HasRunner. Repositories become eligible for the organization-facing runner group through GH_IsEligibleFor. Repositories and branches that can dispatch workflows then reach the runner through GH_CanUseRunner to an inherited GH_OrgRunnerGroup, GH_InheritedFrom to the enterprise group, and finally GH_HasRunner to the runner.
|
|
4
|
+
|
|
5
|
+
The node captures runner metadata such as operating system, status, busy state, labels, and whether the runner is ephemeral when GitHub returns that property.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
## Description
|
|
2
|
+
|
|
3
|
+
Represents a self-hosted runner group owned by a GitHub Enterprise account. Enterprise runner groups control which organizations may use a shared set of enterprise runners. That organization-level visibility is reflected by which inherited GH_OrgRunnerGroup nodes point back to the enterprise group through GH_InheritedFrom.
|
|
4
|
+
|
|
5
|
+
Enterprise runner groups contain GH_EnterpriseRunner nodes and emit GH_HasRunner for directly assigned runners to represent the traversable capability hop from the group to the runner. They may be projected into organizations as inherited GH_OrgRunnerGroup nodes. The GH_InheritedFrom edge links the organization view back to the enterprise-owned group.
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
## Description
|
|
2
2
|
|
|
3
|
-
Represents a self-hosted runner owned by a GitHub organization. Organization runners are contained by native GH_OrgRunnerGroup nodes and become
|
|
3
|
+
Represents a self-hosted runner owned by a GitHub organization. Organization runners are contained by native GH_OrgRunnerGroup nodes and exposed through GH_HasRunner. Repositories become eligible for those groups through GH_IsEligibleFor, while repositories and branches that can dispatch workflows to them are linked through GH_CanUseRunner.
|
|
4
4
|
|
|
5
5
|
The node captures runner metadata such as operating system, status, busy state, labels, and whether the runner is ephemeral when GitHub returns that property.
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
## Description
|
|
2
|
+
|
|
3
|
+
Represents a self-hosted runner group visible within a GitHub organization. Organization runner groups may either be native to the organization or inherited from an enterprise runner group.
|
|
4
|
+
|
|
5
|
+
Native organization runner groups contain GH_OrgRunner nodes directly. Direct memberships also emit GH_HasRunner to represent the traversable capability hop from the group to its runners. Inherited organization runner groups do not directly contain organization runners; instead, they link to the source GH_EnterpriseRunnerGroup through GH_InheritedFrom and gain access to the enterprise runners contained there. GH_IsEligibleFor edges from repositories describe repository access policy scope, while GH_CanUseRunner edges identify repositories and branches that can dispatch workflows to the group under the collected Actions and workflow-restriction settings.
|
|
@@ -442,18 +442,18 @@
|
|
|
442
442
|
},
|
|
443
443
|
{
|
|
444
444
|
"name": "GH_AssignedTo",
|
|
445
|
-
"description": "Enterprise-scoped team
|
|
445
|
+
"description": "Enterprise-scoped team is assigned to an organization",
|
|
446
446
|
"is_traversable": false
|
|
447
447
|
},
|
|
448
448
|
{
|
|
449
449
|
"name": "GH_InheritedFrom",
|
|
450
450
|
"description": "Organization runner group is inherited from an enterprise runner group",
|
|
451
|
-
"is_traversable":
|
|
451
|
+
"is_traversable": true
|
|
452
452
|
},
|
|
453
453
|
{
|
|
454
|
-
"name": "
|
|
455
|
-
"description": "
|
|
456
|
-
"is_traversable":
|
|
454
|
+
"name": "GH_HasRunner",
|
|
455
|
+
"description": "Runner group exposes a directly assigned self-hosted runner to authorized repositories or workflows",
|
|
456
|
+
"is_traversable": true
|
|
457
457
|
},
|
|
458
458
|
{
|
|
459
459
|
"name": "GH_Owns",
|
|
@@ -967,13 +967,18 @@
|
|
|
967
967
|
},
|
|
968
968
|
{
|
|
969
969
|
"name": "GH_CanUseRunner",
|
|
970
|
-
"description": "Repository can dispatch
|
|
970
|
+
"description": "Repository or branch can dispatch workflows to this self-hosted runner execution surface",
|
|
971
|
+
"is_traversable": true
|
|
972
|
+
},
|
|
973
|
+
{
|
|
974
|
+
"name": "GH_IsEligibleFor",
|
|
975
|
+
"description": "Repository is within the repository-access scope of this runner group",
|
|
971
976
|
"is_traversable": false
|
|
972
977
|
},
|
|
973
978
|
{
|
|
974
979
|
"name": "GH_CanCreateRepositoryWithRunnerAccess",
|
|
975
|
-
"description": "Org role can create a repository that
|
|
976
|
-
"is_traversable":
|
|
980
|
+
"description": "Org role can create a repository that can dispatch workflows to this runner group",
|
|
981
|
+
"is_traversable": true
|
|
977
982
|
},
|
|
978
983
|
{
|
|
979
984
|
"name": "GH_CanWriteBranch",
|
|
@@ -1042,7 +1047,7 @@
|
|
|
1042
1047
|
},
|
|
1043
1048
|
{
|
|
1044
1049
|
"name": "GH_CanDeployToEnvironment",
|
|
1045
|
-
"description": "[Computed] Repository, branch, repo role, or
|
|
1050
|
+
"description": "[Computed] Repository, branch, repo role, or reviewer can deploy to this GitHub environment after evaluating deployment branch policy, reviewer gates, and admin bypass behavior; reviewer edges require both self-approval and a deployable code path",
|
|
1046
1051
|
"is_traversable": true
|
|
1047
1052
|
},
|
|
1048
1053
|
{
|
|
@@ -2,7 +2,6 @@
|
|
|
2
2
|
CONTAINS = "GH_Contains"
|
|
3
3
|
ASSIGNED_TO = "GH_AssignedTo"
|
|
4
4
|
INHERITED_FROM = "GH_InheritedFrom"
|
|
5
|
-
GRANTS_ACCESS_TO = "GH_GrantsAccessTo"
|
|
6
5
|
|
|
7
6
|
# Administrative edges
|
|
8
7
|
ADMIN_TO = "GH_AdminTo"
|
|
@@ -12,12 +11,14 @@ OWNS = "GH_Owns"
|
|
|
12
11
|
HAS_MEMBER = "GH_HasMember"
|
|
13
12
|
HAS_ROLE = "GH_HasRole"
|
|
14
13
|
HAS_BASE_ROLE = "GH_HasBaseRole"
|
|
14
|
+
HAS_RUNNER = "GH_HasRunner"
|
|
15
15
|
ADD_MEMBER = "GH_AddMember"
|
|
16
16
|
MEMBER_OF = "GH_MemberOf"
|
|
17
17
|
|
|
18
18
|
# Access and capability edges
|
|
19
19
|
CAN_ACCESS = "GH_CanAccess"
|
|
20
20
|
CAN_USE_RUNNER = "GH_CanUseRunner"
|
|
21
|
+
IS_ELIGIBLE_FOR = "GH_IsEligibleFor"
|
|
21
22
|
CAN_CREATE_REPOSITORY_WITH_RUNNER_ACCESS = "GH_CanCreateRepositoryWithRunnerAccess"
|
|
22
23
|
CAN_CREATE_BRANCH = "GH_CanCreateBranch"
|
|
23
24
|
CAN_CREATE_ENVIRONMENT = "GH_CanCreateEnvironment"
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import json
|
|
1
2
|
from functools import lru_cache
|
|
2
3
|
|
|
3
4
|
import duckdb
|
|
@@ -109,6 +110,30 @@ class GithubLookup(LookupManager):
|
|
|
109
110
|
enterprise_node_id, runner_group_id = identity
|
|
110
111
|
return runner_group_node_id(enterprise_node_id, runner_group_id)
|
|
111
112
|
|
|
113
|
+
@lru_cache
|
|
114
|
+
def enterprise_runner_group_restricted_to_workflows_for_inherited_org_group(
|
|
115
|
+
self, org_node_id: str, group_name: str
|
|
116
|
+
) -> bool | None:
|
|
117
|
+
identity = self._enterprise_runner_group_identity_for_inherited_org_group(
|
|
118
|
+
org_node_id, group_name
|
|
119
|
+
)
|
|
120
|
+
if not identity:
|
|
121
|
+
return None
|
|
122
|
+
|
|
123
|
+
enterprise_node_id, runner_group_id = identity
|
|
124
|
+
row = self._find_single_row(
|
|
125
|
+
f"""
|
|
126
|
+
SELECT restricted_to_workflows
|
|
127
|
+
FROM {self.schema}.enterprise_runner_groups
|
|
128
|
+
WHERE enterprise_node_id = ?
|
|
129
|
+
AND id = ?
|
|
130
|
+
""",
|
|
131
|
+
[enterprise_node_id, runner_group_id],
|
|
132
|
+
)
|
|
133
|
+
if row is None or row[0] is None:
|
|
134
|
+
return None
|
|
135
|
+
return bool(row[0])
|
|
136
|
+
|
|
112
137
|
@lru_cache
|
|
113
138
|
def enterprise_runner_node_ids_for_inherited_org_group(
|
|
114
139
|
self, org_node_id: str, group_name: str
|
|
@@ -195,6 +220,33 @@ class GithubLookup(LookupManager):
|
|
|
195
220
|
[org_login],
|
|
196
221
|
)
|
|
197
222
|
|
|
223
|
+
@lru_cache
|
|
224
|
+
def actions_enabled_repository_node_ids_for_org(self, org_login: str):
|
|
225
|
+
return self._find_all_objects(
|
|
226
|
+
f"""SELECT node_id FROM {self.schema}.repositories WHERE org_login = ? AND actions_enabled = true""",
|
|
227
|
+
[org_login],
|
|
228
|
+
)
|
|
229
|
+
|
|
230
|
+
@lru_cache
|
|
231
|
+
def actions_enabled_repositories_for_org(self, org_login: str) -> str | None:
|
|
232
|
+
return self._find_single_object(
|
|
233
|
+
f"""SELECT actions_enabled_repositories FROM {self.schema}.organizations WHERE login = ?""",
|
|
234
|
+
[org_login],
|
|
235
|
+
)
|
|
236
|
+
|
|
237
|
+
@lru_cache
|
|
238
|
+
def branch_node_ids_for_org(self, org_login: str):
|
|
239
|
+
return self._find_all_objects(
|
|
240
|
+
f"""
|
|
241
|
+
SELECT b.repository_node_id, b.id
|
|
242
|
+
FROM {self.schema}.branches b
|
|
243
|
+
JOIN {self.schema}.repositories r
|
|
244
|
+
ON r.node_id = b.repository_node_id
|
|
245
|
+
WHERE r.org_login = ?
|
|
246
|
+
""",
|
|
247
|
+
[org_login],
|
|
248
|
+
)
|
|
249
|
+
|
|
198
250
|
@lru_cache
|
|
199
251
|
def repository_branch_ruleset_count(self, repository_node_id: str) -> int | None:
|
|
200
252
|
row = self._find_single_row(
|
|
@@ -584,6 +636,265 @@ class GithubLookup(LookupManager):
|
|
|
584
636
|
[repository_node_id],
|
|
585
637
|
)
|
|
586
638
|
|
|
639
|
+
@lru_cache
|
|
640
|
+
def environment_branch_policy_names(self, environment_node_id: str):
|
|
641
|
+
return self._find_all_objects(
|
|
642
|
+
f"""
|
|
643
|
+
SELECT name
|
|
644
|
+
FROM {self.schema}.environment_branch_policies
|
|
645
|
+
WHERE environment_node_id = ?
|
|
646
|
+
""",
|
|
647
|
+
[environment_node_id],
|
|
648
|
+
)
|
|
649
|
+
|
|
650
|
+
@lru_cache
|
|
651
|
+
def reviewer_repo_role_assignments(
|
|
652
|
+
self, reviewer_node_id: str, reviewer_kind: str, repository_node_id: str
|
|
653
|
+
):
|
|
654
|
+
reviewer_kind = reviewer_kind.lower()
|
|
655
|
+
return self._find_all_objects(
|
|
656
|
+
f"""
|
|
657
|
+
WITH RECURSIVE
|
|
658
|
+
repository_org(org_login) AS (
|
|
659
|
+
SELECT org_login
|
|
660
|
+
FROM {self.schema}.repositories
|
|
661
|
+
WHERE node_id = ?
|
|
662
|
+
),
|
|
663
|
+
seed_teams(team_id) AS (
|
|
664
|
+
SELECT ? WHERE ? = 'team'
|
|
665
|
+
|
|
666
|
+
UNION
|
|
667
|
+
|
|
668
|
+
SELECT tm.team_id
|
|
669
|
+
FROM {self.schema}.team_members tm
|
|
670
|
+
WHERE ? = 'user'
|
|
671
|
+
AND tm.id = ?
|
|
672
|
+
),
|
|
673
|
+
actor_teams(team_id) AS (
|
|
674
|
+
SELECT team_id
|
|
675
|
+
FROM seed_teams
|
|
676
|
+
|
|
677
|
+
UNION
|
|
678
|
+
|
|
679
|
+
SELECT json_extract_string(t.parent_team, '$.id')
|
|
680
|
+
FROM {self.schema}.teams t
|
|
681
|
+
JOIN actor_teams actor_team ON t.id = actor_team.team_id
|
|
682
|
+
WHERE t.parent_team IS NOT NULL
|
|
683
|
+
AND json_extract_string(t.parent_team, '$.id') IS NOT NULL
|
|
684
|
+
),
|
|
685
|
+
direct_repo_roles(
|
|
686
|
+
assignment_actor_id,
|
|
687
|
+
role_id,
|
|
688
|
+
role_name,
|
|
689
|
+
base_role,
|
|
690
|
+
role_permissions
|
|
691
|
+
) AS (
|
|
692
|
+
SELECT DISTINCT
|
|
693
|
+
rra.node_id,
|
|
694
|
+
rr.id,
|
|
695
|
+
rra.role_name,
|
|
696
|
+
coalesce(rra.base_role, rr.base_role),
|
|
697
|
+
rra.role_permissions
|
|
698
|
+
FROM {self.schema}.repo_role_assignments rra
|
|
699
|
+
LEFT JOIN {self.schema}.repo_roles rr
|
|
700
|
+
ON rr.repository_node_id = rra.repo_node_id
|
|
701
|
+
AND rr.name = rra.role_name
|
|
702
|
+
WHERE rra.repo_node_id = ?
|
|
703
|
+
AND (
|
|
704
|
+
(lower(rra.assignee_type) = ? AND rra.node_id = ?)
|
|
705
|
+
OR (
|
|
706
|
+
lower(rra.assignee_type) = 'team'
|
|
707
|
+
AND rra.node_id IN (SELECT team_id FROM actor_teams)
|
|
708
|
+
)
|
|
709
|
+
)
|
|
710
|
+
),
|
|
711
|
+
actor_org_roles(assignment_actor_id, org_role_name, base_role) AS (
|
|
712
|
+
SELECT
|
|
713
|
+
u.id,
|
|
714
|
+
CASE WHEN u.role = 'ADMIN' THEN 'owners' ELSE 'members' END,
|
|
715
|
+
org_role.base_role
|
|
716
|
+
FROM {self.schema}.users u
|
|
717
|
+
JOIN repository_org repo_org ON repo_org.org_login = u.org_login
|
|
718
|
+
JOIN {self.schema}.org_roles org_role
|
|
719
|
+
ON org_role.org_login = u.org_login
|
|
720
|
+
AND org_role.name = CASE
|
|
721
|
+
WHEN u.role = 'ADMIN' THEN 'owners'
|
|
722
|
+
ELSE 'members'
|
|
723
|
+
END
|
|
724
|
+
WHERE ? = 'user'
|
|
725
|
+
AND u.id = ?
|
|
726
|
+
|
|
727
|
+
UNION
|
|
728
|
+
|
|
729
|
+
SELECT
|
|
730
|
+
orm.node_id,
|
|
731
|
+
orm.org_role_name,
|
|
732
|
+
org_role.base_role
|
|
733
|
+
FROM {self.schema}.org_role_members orm
|
|
734
|
+
JOIN repository_org repo_org ON repo_org.org_login = orm.org_login
|
|
735
|
+
JOIN {self.schema}.org_roles org_role
|
|
736
|
+
ON org_role.org_login = orm.org_login
|
|
737
|
+
AND org_role.name = orm.org_role_name
|
|
738
|
+
WHERE ? = 'user'
|
|
739
|
+
AND orm.node_id = ?
|
|
740
|
+
|
|
741
|
+
UNION
|
|
742
|
+
|
|
743
|
+
SELECT
|
|
744
|
+
ort.node_id,
|
|
745
|
+
ort.org_role_name,
|
|
746
|
+
org_role.base_role
|
|
747
|
+
FROM {self.schema}.org_role_teams ort
|
|
748
|
+
JOIN repository_org repo_org ON repo_org.org_login = ort.org_login
|
|
749
|
+
JOIN {self.schema}.org_roles org_role
|
|
750
|
+
ON org_role.org_login = ort.org_login
|
|
751
|
+
AND org_role.name = ort.org_role_name
|
|
752
|
+
WHERE ort.node_id IN (SELECT team_id FROM actor_teams)
|
|
753
|
+
),
|
|
754
|
+
org_repo_roles(
|
|
755
|
+
assignment_actor_id,
|
|
756
|
+
role_id,
|
|
757
|
+
role_name,
|
|
758
|
+
base_role,
|
|
759
|
+
role_permissions
|
|
760
|
+
) AS (
|
|
761
|
+
SELECT DISTINCT
|
|
762
|
+
actor_org_role.assignment_actor_id,
|
|
763
|
+
rr.id,
|
|
764
|
+
rr.name,
|
|
765
|
+
rr.base_role,
|
|
766
|
+
rr.permissions
|
|
767
|
+
FROM actor_org_roles actor_org_role
|
|
768
|
+
JOIN {self.schema}.repo_roles rr
|
|
769
|
+
ON rr.repository_node_id = ?
|
|
770
|
+
AND rr.name = actor_org_role.base_role
|
|
771
|
+
)
|
|
772
|
+
SELECT * FROM direct_repo_roles
|
|
773
|
+
UNION
|
|
774
|
+
SELECT * FROM org_repo_roles
|
|
775
|
+
""",
|
|
776
|
+
[
|
|
777
|
+
repository_node_id,
|
|
778
|
+
reviewer_node_id,
|
|
779
|
+
reviewer_kind,
|
|
780
|
+
reviewer_kind,
|
|
781
|
+
reviewer_node_id,
|
|
782
|
+
repository_node_id,
|
|
783
|
+
reviewer_kind,
|
|
784
|
+
reviewer_node_id,
|
|
785
|
+
reviewer_kind,
|
|
786
|
+
reviewer_node_id,
|
|
787
|
+
reviewer_kind,
|
|
788
|
+
reviewer_node_id,
|
|
789
|
+
repository_node_id,
|
|
790
|
+
],
|
|
791
|
+
)
|
|
792
|
+
|
|
793
|
+
@staticmethod
|
|
794
|
+
def _role_permissions(raw_permissions) -> set[str]:
|
|
795
|
+
if raw_permissions is None:
|
|
796
|
+
return set()
|
|
797
|
+
if isinstance(raw_permissions, str):
|
|
798
|
+
try:
|
|
799
|
+
raw_permissions = json.loads(raw_permissions)
|
|
800
|
+
except json.JSONDecodeError:
|
|
801
|
+
return set()
|
|
802
|
+
if not isinstance(raw_permissions, list):
|
|
803
|
+
return set()
|
|
804
|
+
return {str(permission) for permission in raw_permissions}
|
|
805
|
+
|
|
806
|
+
@lru_cache
|
|
807
|
+
def reviewer_deployment_path(
|
|
808
|
+
self,
|
|
809
|
+
reviewer_node_id: str,
|
|
810
|
+
reviewer_kind: str,
|
|
811
|
+
repository_node_id: str,
|
|
812
|
+
eligible_branch_ids: tuple[str, ...],
|
|
813
|
+
allow_create_branch: bool,
|
|
814
|
+
) -> tuple[str, str | None] | None:
|
|
815
|
+
if not self.repository_default_branch_collected(repository_node_id):
|
|
816
|
+
return None
|
|
817
|
+
|
|
818
|
+
eligible_branches = set(eligible_branch_ids)
|
|
819
|
+
write_roles = {"write", "maintain", "admin"}
|
|
820
|
+
bypass_roles = {"maintain"}
|
|
821
|
+
|
|
822
|
+
for (
|
|
823
|
+
assignment_actor_id,
|
|
824
|
+
role_id,
|
|
825
|
+
role_name,
|
|
826
|
+
base_role,
|
|
827
|
+
raw_permissions,
|
|
828
|
+
) in self.reviewer_repo_role_assignments(
|
|
829
|
+
reviewer_node_id, reviewer_kind, repository_node_id
|
|
830
|
+
):
|
|
831
|
+
permissions = self._role_permissions(raw_permissions)
|
|
832
|
+
has_write_access = role_name in write_roles or base_role in write_roles
|
|
833
|
+
if not has_write_access:
|
|
834
|
+
continue
|
|
835
|
+
|
|
836
|
+
if (
|
|
837
|
+
allow_create_branch
|
|
838
|
+
and role_id is not None
|
|
839
|
+
and self.role_can_create_branch(role_id, repository_node_id)
|
|
840
|
+
):
|
|
841
|
+
return ("create_branch", None)
|
|
842
|
+
|
|
843
|
+
writable_branches = {
|
|
844
|
+
branch_id
|
|
845
|
+
for (branch_id,) in self.unprotected_branches(repository_node_id)
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
has_push_protected_branch = (
|
|
849
|
+
("push_protected_branch" in permissions and base_role in write_roles)
|
|
850
|
+
or role_name in bypass_roles
|
|
851
|
+
or base_role in bypass_roles
|
|
852
|
+
)
|
|
853
|
+
has_bypass_branch_protection = (
|
|
854
|
+
"bypass_branch_protection" in permissions and base_role in write_roles
|
|
855
|
+
)
|
|
856
|
+
|
|
857
|
+
if role_name == "admin" or base_role == "admin":
|
|
858
|
+
writable_branches.update(
|
|
859
|
+
branch_id
|
|
860
|
+
for (branch_id,) in self._write_admin_bypass(repository_node_id)
|
|
861
|
+
)
|
|
862
|
+
if has_push_protected_branch:
|
|
863
|
+
writable_branches.update(
|
|
864
|
+
branch_id
|
|
865
|
+
for (branch_id,) in self._write_push_restricted_branch_bypass(
|
|
866
|
+
repository_node_id
|
|
867
|
+
)
|
|
868
|
+
)
|
|
869
|
+
if has_bypass_branch_protection:
|
|
870
|
+
writable_branches.update(
|
|
871
|
+
branch_id
|
|
872
|
+
for (branch_id,) in self._write_branch_protection_bypass(
|
|
873
|
+
repository_node_id
|
|
874
|
+
)
|
|
875
|
+
)
|
|
876
|
+
if has_push_protected_branch and has_bypass_branch_protection:
|
|
877
|
+
writable_branches.update(
|
|
878
|
+
branch_id
|
|
879
|
+
for (branch_id,) in self._write_combined_bypass(repository_node_id)
|
|
880
|
+
)
|
|
881
|
+
|
|
882
|
+
writable_branches.update(
|
|
883
|
+
branch_id
|
|
884
|
+
for (branch_id,) in self.actor_gate_bypass(
|
|
885
|
+
assignment_actor_id,
|
|
886
|
+
repository_node_id,
|
|
887
|
+
has_bypass_branch_protection,
|
|
888
|
+
has_push_protected_branch,
|
|
889
|
+
)
|
|
890
|
+
)
|
|
891
|
+
|
|
892
|
+
for branch_id in eligible_branch_ids:
|
|
893
|
+
if branch_id in writable_branches and branch_id in eligible_branches:
|
|
894
|
+
return ("write_branch", branch_id)
|
|
895
|
+
|
|
896
|
+
return None
|
|
897
|
+
|
|
587
898
|
@lru_cache
|
|
588
899
|
def members_can_fork_private_repositories(self, org_login: str):
|
|
589
900
|
return self._find_all_objects(
|
|
@@ -59,6 +59,9 @@ def preproc(ctx: PreProcContext):
|
|
|
59
59
|
"repo_role_assignments": "repo_role_assignments",
|
|
60
60
|
"branches": "branches",
|
|
61
61
|
"repo_roles": "repo_roles",
|
|
62
|
+
"users": "users",
|
|
63
|
+
"teams": "teams",
|
|
64
|
+
"team_members": "team_members",
|
|
62
65
|
"saml_provider": "saml_provider",
|
|
63
66
|
"applications": "applications",
|
|
64
67
|
"enterprise": "enterprise",
|
|
@@ -67,8 +70,11 @@ def preproc(ctx: PreProcContext):
|
|
|
67
70
|
"enterprise_runner_group_organizations": "enterprise_runner_group_organizations",
|
|
68
71
|
"enterprise_runner_group_memberships": "enterprise_runner_group_memberships",
|
|
69
72
|
"org_roles": "org_roles",
|
|
73
|
+
"org_role_members": "org_role_members",
|
|
74
|
+
"org_role_teams": "org_role_teams",
|
|
70
75
|
"projected_enterprise_teams": "projected_enterprise_teams",
|
|
71
76
|
"environments": "environments",
|
|
77
|
+
"environment_branch_policies": "environment_branch_policies",
|
|
72
78
|
"environment_secrets": "environment_secrets",
|
|
73
79
|
"environment_variables": "environment_variables",
|
|
74
80
|
"organization_secrets": "organization_secrets",
|