| name | description |
|---|---|
github-project |
GitHub repository setup and platform-specific features. This skill should be used when creating new GitHub repositories, configuring branch protection rules, setting up GitHub Issues/Discussions/Projects, creating sub-issues and issue hierarchies, managing PR review workflows, configuring Dependabot/Renovate auto-merge, setting up merge queues with GraphQL enqueuePullRequest mutations, or checking GitHub project configuration. Focuses on GitHub platform features, not CI/CD pipelines or language-specific tooling. By Netresearch. |
GitHub platform configuration and repository management patterns. This skill focuses exclusively on GitHub-specific features.
This Skill Covers:
- Branch protection rules and PR workflows
- CODEOWNERS configuration
- GitHub Issues, Discussions, Projects
- Sub-issues and issue hierarchies (parent/child relationships)
- Dependabot/Renovate auto-merge
- GitHub Releases configuration
- Repository collaboration features
Delegate to Other Skills:
- CI/CD pipelines →
go-development,php-modernization,typo3-testing - Security scanning (CodeQL, gosec) →
security-audit - SLSA, SBOMs, supply chain →
enterprise-readiness - Git branching strategies, conventional commits →
git-workflow
Setup & Configuration:
- Creating a new GitHub repository
- "Check my GitHub project setup"
- "Configure branch protection"
- "Set up GitHub Issues/Discussions"
- "How do I require PR reviews?"
- "Auto-merge Dependabot PRs"
- "Configure CODEOWNERS"
Sub-Issues & Issue Hierarchies:
- "Create sub-issues"
- "Add child issues to parent"
- "Link issues as parent/child"
- "Break down issue into sub-tasks"
- "Set up issue hierarchy"
- "Convert checklist to sub-issues"
Troubleshooting (PR Merge Blocked):
- "PR can't be merged" / "merge is blocked"
- "unresolved conversations" / "unresolved comments"
- "required reviews not met"
- "CODEOWNERS review required"
- "status checks failed" (for branch protection context)
gh pr mergereturns error
Troubleshooting (Auto-Merge Failures):
- "auto-merge not working" / "Dependabot PR not merging"
- "Merge method squash merging is not allowed"
- "Merge method merge commit is not allowed"
- "required status check not found"
- "status check name mismatch"
- PRs stuck with auto-merge enabled
- "Protected branch rules not configured" (--auto requires branch protection)
- Merge queue not processing PRs
Merge Queue Configuration:
- "set up merge queue"
- "enqueuePullRequest"
- "auto-merge with merge queue"
- "GraphQL merge queue mutation"
Branch Migration:
- "rename master to main"
- "change default branch"
- "migrate from master"
- "prevent master branch"
- "block master from being created"
/plugin marketplace add netresearch/claude-code-marketplaceThen browse skills with /plugin.
Download the latest release and extract to ~/.claude/skills/github-project/
Clone or download this repository to your Claude Code skills directory.
To set up a new GitHub repository:
- Create essential files: README.md, LICENSE, SECURITY.md
- Configure
.github/directory structure (seereferences/repository-structure.md) - Set up branch protection on
mainbranch - Configure CODEOWNERS for automatic reviewer assignment
- Create issue and PR templates
- Enable Dependabot or Renovate for dependency updates
- Configure auto-merge workflow for dependency PRs
- Set up release notes configuration
Run verification: ./scripts/verify-github-project.sh /path/to/repo
Required branch settings:
| Setting | Value | Rationale |
|---|---|---|
| Default branch name | main |
Industry standard |
| Default branch protected | ✅ | Prevent direct pushes |
| Allowed merge method | Rebase only | Clean linear history |
| Delete branch on merge | ✅ | Keep repo clean |
To configure via GitHub CLI:
# Ensure default branch is named "main"
gh api repos/{owner}/{repo} --jq '.default_branch'
# Configure merge settings (rebase only, delete on merge)
gh repo edit --enable-rebase-merge --disable-merge-commit --disable-squash-merge --delete-branch-on-mergeFor complete migration steps from master to main as default branch, see references/branch-migration.md.
Quick start:
git branch -m master main
git push -u origin main
gh repo edit --default-branch main
git push origin --delete masterTo configure branch protection via GitHub CLI:
# View current protection
gh api repos/{owner}/{repo}/branches/main/protection
# Set branch protection
gh api repos/{owner}/{repo}/branches/main/protection \
--method PUT \
-f required_status_checks='{"strict":true,"contexts":["test","lint"]}' \
-f enforce_admins=true \
-f required_pull_request_reviews='{"required_approving_review_count":1,"dismiss_stale_reviews":true,"require_code_owner_reviews":true}' \
-f restrictions=null \
-f required_conversation_resolution=trueRecommended Settings:
| Setting | Value | Purpose |
|---|---|---|
| Require pull request | ✅ | Enforce code review |
| Required approvals | 1+ | Based on team size |
| Dismiss stale reviews | ✅ | Re-review after changes |
| Require CODEOWNERS review | ✅ | Domain expert review |
| Require conversation resolution | ✅ | All comments addressed |
| Do not allow force pushes | ✅ | Protect history |
| Allow rebase merge | ✅ | Clean linear history |
| Disable merge commits | ✅ | No merge bubbles |
| Disable squash merge | ✅ | Preserve commit granularity |
| Delete branch on merge | ✅ | Auto-cleanup merged branches |
To enforce PR comment resolution:
- Enable "Require conversation resolution" in branch protection
- During review:
- Reviewers leave line-specific comments
- Author responds to each comment
- Author clicks "Resolve conversation" after addressing
- PR cannot merge until all conversations are resolved
- Options for each thread:
- "Resolve conversation" → Mark as addressed
- Reply with explanation → Then resolve
- "Won't fix" with reason → Then resolve
To configure automatic reviewer assignment:
- Create
.github/CODEOWNERS - Define ownership patterns (last matching pattern wins):
# Default owners for everything
* @org/maintainers
# Directory ownership
/src/auth/ @org/security-team
/docs/ @org/docs-team
# File pattern ownership
*.sql @org/dba-team
/.github/ @org/maintainers
- Enable "Require review from CODEOWNERS" in branch protection
To configure automatic merging of dependency updates:
- Configure Dependabot or Renovate (see
references/dependency-management.md) - Create auto-merge workflow using appropriate template (see decision matrix below)
- Workflow auto-approves and merges minor/patch updates
- Major updates require manual review
Auto-Merge Decision Matrix:
| Repository Configuration | Template | Merge Method |
|---|---|---|
| Merge queue enabled | auto-merge-queue.yml.template |
GraphQL enqueuePullRequest |
| Branch protection (no queue) | auto-merge.yml.template |
gh pr merge --auto |
| No branch protection | auto-merge-direct.yml.template |
gh pr merge --rebase (direct) |
For repositories with merge queues enabled, the --auto flag and direct merge commands don't work. Use the GraphQL enqueuePullRequest mutation instead.
Key points:
- The
mergeMethodparameter is NOT valid forenqueuePullRequest- merge method is set by queue configuration - Use
github.event.pull_request.node_idto get the PR's GraphQL node ID - The mutation adds the PR to the queue; actual merge happens when queue processes it
# .github/workflows/auto-merge-deps.yml
name: Auto-merge dependency PRs
on:
pull_request_target:
types: [opened, synchronize, reopened]
permissions:
contents: write
pull-requests: write
jobs:
auto-merge:
runs-on: ubuntu-latest
if: github.actor == 'dependabot[bot]' || github.actor == 'renovate[bot]'
steps:
- name: Approve PR
env:
PR_URL: ${{ github.event.pull_request.html_url }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: gh pr review --approve "$PR_URL"
- name: Add to merge queue
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_NODE_ID: ${{ github.event.pull_request.node_id }}
run: |
gh api graphql -f query='
mutation($pullRequestId: ID!) {
enqueuePullRequest(input: {pullRequestId: $pullRequestId}) {
mergeQueueEntry { id }
}
}' -f pullRequestId="$PR_NODE_ID"For repositories without branch protection rules, the --auto flag fails with "Protected branch rules not configured". Use direct merge instead:
# .github/workflows/auto-merge-deps.yml
- name: Merge PR
env:
PR_URL: ${{ github.event.pull_request.html_url }}
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: gh pr merge --rebase "$PR_URL"When auto-merge is enabled but PRs aren't merging automatically:
Step 1: Check repo merge settings vs workflow merge method
# View current merge method settings
gh api repos/{owner}/{repo} --jq '{
allow_squash_merge,
allow_merge_commit,
allow_rebase_merge,
delete_branch_on_merge
}'Step 2: Identify merge method mismatch
| Workflow Uses | Repo Setting Required | Error Message |
|---|---|---|
gh pr merge --squash |
allow_squash_merge: true |
"Merge method squash merging is not allowed" |
gh pr merge --merge |
allow_merge_commit: true |
"Merge method merge commit is not allowed" |
gh pr merge --rebase |
allow_rebase_merge: true |
"Merge method rebase is not allowed" |
Step 3: Fix merge method alignment
Either update workflow to match repo settings (gh pr merge --rebase) or update repo:
gh api repos/{owner}/{repo} --method PATCH -f allow_rebase_merge=trueStep 4: Validate required status checks
Status check names must exactly match what workflows produce:
# Compare expected vs actual check names
gh api repos/{owner}/{repo}/branches/main/protection/required_status_checks --jq '.contexts[]'
gh pr checks <number> --json name --jq '.[].name'Common status check name mismatches:
| Expected | Actual | Issue |
|---|---|---|
Analyze (javascript-typescript) |
Analyze (javascript) |
Language detection |
build |
Build / build |
Workflow name prefix |
test |
test (ubuntu-latest, 18) |
Matrix parameters |
Step 5: Fix and re-trigger
# Update branch protection check names
gh api repos/{owner}/{repo}/branches/main/protection/required_status_checks \
--method PATCH -f strict=true --input - <<< '{"contexts":["actual-check-name"]}'
# Re-trigger stuck PRs
gh pr update-branch <number> --rebaseAuto-merge compatibility checklist:
| Check | Command | Expected |
|---|---|---|
| Merge method alignment | gh api repos/{owner}/{repo} --jq '.allow_rebase_merge' |
Matches workflow flag |
| Status checks pass | gh pr checks <number> |
All green |
| Status check names match | Compare gh pr checks vs branch protection |
Exact match |
| Reviews complete | gh pr view <number> --json reviewDecision |
APPROVED |
| No merge conflicts | gh pr view <number> --json mergeable |
MERGEABLE |
| Auto-merge enabled | gh pr view <number> --json autoMergeRequest |
Not null |
To enable Discussions:
- Go to Settings → Features → Discussions
- Create categories:
- 📣 Announcements (maintainers only)
- 💬 General
- 💡 Ideas
- 🙏 Q&A (Question/Answer format)
- Add Discussions link to issue template chooser
Use Discussions for: Questions, ideas, announcements Use Issues for: Bug reports, confirmed features, actionable tasks
To configure automatic release notes:
- Create
.github/release.yml:
changelog:
exclude:
authors: [dependabot, renovate]
categories:
- title: 🚀 Features
labels: [enhancement]
- title: 🐛 Bug Fixes
labels: [bug]
- title: 📚 Documentation
labels: [documentation]- Create releases via CLI:
gh release create v1.0.0 --generate-notesGitHub's sub-issues feature enables parent-child relationships between issues (up to 8 levels, 100 sub-issues per parent). For complete GraphQL API reference, see references/sub-issues.md.
Important: The gh CLI does not support sub-issues directly. Use GraphQL API.
Quick reference:
# Get issue node ID
gh api graphql -f query='{repository(owner:"OWNER",name:"REPO"){issue(number:123){id}}}'
# Add sub-issue (requires node IDs)
gh api graphql -f query='mutation{addSubIssue(input:{issueId:"PARENT_ID",subIssueId:"CHILD_ID"}){issue{number}subIssue{number}}}'
# List sub-issues
gh api graphql -f query='{repository(owner:"OWNER",name:"REPO"){issue(number:123){subIssues(first:50){nodes{number title state}}}}}'When a PR cannot be merged, diagnose the cause:
Step 1: Check PR status
# View PR details including merge state
gh pr view <number> --json mergeable,mergeStateStatus,reviewDecision,statusCheckRollup
# Check for blocking issues
gh pr checks <number>Step 2: Identify the blocker
| Symptom | Cause | Resolution |
|---|---|---|
BLOCKED mergeStateStatus |
Unresolved conversations | Resolve all review threads |
REVIEW_REQUIRED reviewDecision |
Missing approvals | Request reviews from required reviewers |
CHANGES_REQUESTED reviewDecision |
Changes requested | Address feedback, request re-review |
Failed checks in statusCheckRollup |
CI/CD failures | Fix failing tests/lints |
CODEOWNERS review required |
Missing code owner approval | Get approval from designated owners |
Step 3: Resolution actions
# For unresolved conversations: view and resolve threads
gh pr view <number> --comments
# For missing reviews: request specific reviewers
gh pr edit <number> --add-reviewer username
# For CODEOWNERS blocking: check which files need review
gh pr view <number> --json filesCommon gh pr merge errors:
| Error Message | Meaning | Fix |
|---|---|---|
Pull request is not mergeable |
Branch protection blocking | Run diagnosis steps above |
Required status check "X" is expected |
CI not run or pending | Wait for CI or trigger manually |
At least 1 approving review is required |
No approvals yet | Request and obtain review |
Changes were made after the most recent approval |
Stale approval | Request re-review |
Protected branch rules not configured |
--auto requires branch protection |
Use direct merge or enable branch protection |
InputObject 'EnqueuePullRequestInput' doesn't accept argument 'mergeMethod' |
Invalid GraphQL parameter | Remove mergeMethod from mutation - it's set by queue config |
# Repository
gh repo view
gh repo edit --enable-discussions
# Issues
gh issue list
gh issue create
gh issue edit 123 --add-label "priority: high"
# Pull requests
gh pr list
gh pr create
gh pr review --approve
gh pr merge --squash
# Releases
gh release create v1.0.0 --generate-notes
# Labels
gh label create "name" --color "hex" --description "desc"
# Projects
gh project create --title "Project Name"| Resource | Purpose |
|---|---|
references/repository-structure.md |
Standard files and directory layout |
references/dependency-management.md |
Dependabot/Renovate and auto-merge patterns |
references/sub-issues.md |
GitHub sub-issues GraphQL API |
references/branch-migration.md |
Master to main migration guide |
templates/auto-merge.yml.template |
Auto-merge with branch protection (--auto flag) |
templates/auto-merge-queue.yml.template |
Auto-merge with merge queue (GraphQL mutation) |
templates/auto-merge-direct.yml.template |
Auto-merge without branch protection |
scripts/verify-github-project.sh |
Verification script for project setup |
Made with ❤️ for Open Source by Netresearch
To check GitHub project configuration:
./scripts/verify-github-project.sh /path/to/repositoryChecks: documentation files, CODEOWNERS, dependency management, issue/PR templates, auto-merge workflow, release configuration.