npx claudepluginhub jacobpevans/claude-code-plugins --plugin codeql-resolverThis skill uses the workspace's default tool permissions.
Single source of truth for GitHub Actions permission requirements.
Creates isolated Git worktrees for feature branches with prioritized directory selection, gitignore safety checks, auto project setup for Node/Python/Rust/Go, and baseline verification.
Executes implementation plans in current session by dispatching fresh subagents per independent task, with two-stage reviews: spec compliance then code quality.
Dispatches parallel agents to independently tackle 2+ tasks like separate test failures or subsystems without shared state or dependencies.
Single source of truth for GitHub Actions permission requirements.
GitHub Actions provides these permission scopes:
contents # Read/write repository content (checkout, tags, releases)
pull-requests # Read/write PR comments, reviews, assignments
issues # Read/write issue comments, labels, projects
deployments # Read/write deployment status
packages # Read/write packages
actions # Read/write GitHub Actions (runners, artifacts, caches)
checks # Read/write check runs and annotations
statuses # Read/write commit statuses
security-events # Read/write code scanning and secret scanning results
| Action | Required Permissions | Use Case |
|---|---|---|
actions/checkout@v6 | contents: read | Clone repository |
actions/upload-artifact@v6 | None (usually) | Store build artifacts |
actions/download-artifact@v6 | None (usually) | Retrieve artifacts |
actions/setup-node@v6 | None | Install Node.js |
actions/github-script@v6 | Depends on script | Usually contents: read minimum |
actions/create-release@v1 | contents: write | Create GitHub release |
github/codeql-action/upload-sarif@v2 | security-events: write | Upload CodeQL results |
Q1: Does your job use actions/checkout?
contents: readQ2: Does your job modify repository (create PR, tag, release)?
contents: writeQ3: Does your job post comments to PR or issues?
pull-requests: write (PR) or issues: write (issues)Q4: Does your job modify deployments?
deployments: writeQ5: Does your job use github.rest API?
Q6: Does your job call a reusable workflow?
Q7: Is your job just aggregating results with no API access?
permissions: {} (empty - no token needed)test:
runs-on: ubuntu-latest
permissions:
contents: read # For checkout
steps:
- uses: actions/checkout@v6
- run: npm test
release:
runs-on: ubuntu-latest
permissions:
contents: write # For creating release
steps:
- uses: actions/checkout@v6
- uses: actions/create-release@v1
with:
tag_name: v1.0.0
comment:
runs-on: ubuntu-latest
permissions:
contents: read # For checkout
pull-requests: write # For creating comment
steps:
- uses: actions/checkout@v6
- run: npm run lint | tee lint-result.txt
- uses: actions/github-script@v6
with:
script: |
github.rest.pulls.createReview({
pull_number: context.issue.number,
body: 'Lint check passed'
})
If .github/workflows/_validate.yml contains:
jobs:
validate:
permissions:
contents: read
pull-requests: write # This job posts comments
steps: ...
Then the caller must declare:
validate:
permissions:
contents: read
pull-requests: write # Union of nested job permissions
uses: ./.github/workflows/_validate.yml
gate:
runs-on: ubuntu-latest
permissions: {} # Explicitly no permissions needed
steps:
- uses: re-actors/alls-green@release/v1
with:
allowed-skips: job1, job2
jobs: ${{ toJSON(needs) }}
Important: When a job calls a reusable workflow via uses:, the caller job must declare permissions for all jobs within the reusable workflow.
Why: The reusable workflow's nested jobs inherit the permissions from the caller's GITHUB_TOKEN, so the caller must declare everything the callee needs.
Example mismatch (WRONG):
# ci-gate.yml
validate:
# Missing permissions!
uses: ./.github/workflows/_validate.yml
# _validate.yml
jobs:
check:
permissions:
contents: read
pull-requests: write
steps: ...
Correct:
# ci-gate.yml
validate:
permissions:
contents: read
pull-requests: write # Declare what _validate.yml needs
uses: ./.github/workflows/_validate.yml
Without explicit permissions:
GITHUB_TOKEN: read-all (dangerous!)GITHUB_TOKEN: read-write (very dangerous!)With explicit permissions:
❌ Mistake 1: Forgetting PR/issues permissions
# WRONG - Creates comment but no permission
comment:
steps:
- uses: actions/github-script@v6
with:
script: github.rest.issues.createComment({...})
✅ Correct:
comment:
permissions:
issues: write # ← Add this
steps:
- uses: actions/github-script@v6
with:
script: github.rest.issues.createComment({...})
❌ Mistake 2: Not declaring union of reusable workflow permissions
# WRONG - Reusable workflow's jobs need more permissions
my-job:
permissions:
contents: read # But reusable also needs pull-requests: write
uses: ./.github/workflows/_validate.yml
✅ Correct:
my-job:
permissions:
contents: read
pull-requests: write # Include all permissions from reusable
uses: ./.github/workflows/_validate.yml
❌ Mistake 3: Excessive permissions
# WRONG - Too much permission
build:
permissions:
contents: write # Unnecessary - only reads files
steps:
- uses: actions/checkout@v6
- run: npm build
✅ Correct (least-privilege):
build:
permissions:
contents: read # Minimum needed for checkout
steps:
- uses: actions/checkout@v6
- run: npm build
Run CodeQL scan locally:
codeql database create my_db --language=actions --source-root=.
codeql database analyze my_db actions/security-and-quality.qls --format=sarif-latest --output=results.sarif
Or wait for GitHub to scan and check:
gh pr checks # See if CodeQL permission alerts appear