npx skillsauth add agentdevsl/agentpane gh-workflowInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Every GitHub interaction goes through the gh CLI — no curl, no direct REST calls, no manual token management. The gh CLI handles authentication, pagination, and API versioning for both github.com and GitHub Enterprise.
Run this before any operation. It catches auth problems early and ensures GHE targeting is correct.
# 1. Verify gh is installed
command -v gh >/dev/null 2>&1 || { echo "gh CLI not found — install from https://cli.github.com"; exit 1; }
# 2. For GitHub Enterprise, GH_HOST MUST be set. Without it, gh targets github.com.
# Example: export GH_HOST=github.ibm.com
# This is required for ALL gh commands when working with GHE repos.
if [[ -n "${GH_HOST:-}" ]]; then
echo "Targeting GitHub Enterprise: ${GH_HOST}"
fi
# 3. Verify authentication
gh auth status
If gh auth status fails, the user needs to either:
gh auth login (interactive)GITHUB_TOKEN (or GH_ENTERPRISE_TOKEN for GHE)Use gh issue create. Always include --title, a body, and --label. Add --assignee "@me" when the creator is also the owner.
For multi-line markdown, prefer --body-file with a temporary file. Avoid nested command substitution like --body "$(cat <<EOF ...)" because shell-safety guards may block it.
BODY_FILE="$(mktemp)"
cat > "$BODY_FILE" <<'EOF'
## Summary
The Terraform plan fails because the S3 bucket module uses a deprecated `acl` parameter.
## Steps to Reproduce
1. Run `terraform plan`
2. Observe deprecation error on `aws_s3_bucket.acl`
## Proposed Fix
Remove inline `acl` argument, add `aws_s3_bucket_ownership_controls` resource.
EOF
gh issue create \
--title "Bug: S3 module deprecated ACL parameter" \
--body-file "$BODY_FILE" \
--label "bug"
rm -f "$BODY_FILE"
After creation, capture the issue number — you need it for branch naming:
BODY_FILE="$(mktemp)"
printf '%s\n' 'Issue body goes here' > "$BODY_FILE"
ISSUE_URL="$(gh issue create --title "..." --body-file "$BODY_FILE" --label "bug")"
ISSUE_NUMBER="$(printf '%s\n' "$ISSUE_URL" | grep -o '[0-9]*$')"
rm -f "$BODY_FILE"
Labels are a core part of issue management, not an afterthought. Always apply relevant labels at creation time.
Common label operations:
# Apply label(s) at creation
gh issue create --title "..." --body "..." --label "bug" --label "priority:high"
# Add labels to existing issue
gh issue edit 42 --add-label "in-progress"
# Remove a label
gh issue edit 42 --remove-label "needs-triage"
# List available labels in the repo
gh label list
Typical label taxonomy:
bug, feature, enhancement, documentationpriority:high, priority:lowin-progress, needs-triage, blockedmodule:vpc, module:s3Branches linked to issues use the NNN-short-name naming convention, where NNN is the zero-padded issue number. This convention is how the team links branches to specs and issues — it is not optional.
Preferred: gh issue develop — creates the branch and auto-links it to the issue in GitHub's UI:
PADDED=$(printf "%03d" "$ISSUE_NUMBER")
gh issue develop "$ISSUE_NUMBER" --name "${PADDED}-short-description" --checkout
Fallback (if gh issue develop is unavailable):
PADDED=$(printf "%03d" "$ISSUE_NUMBER")
BRANCH_NAME="${PADDED}-short-description"
git checkout -b "$BRANCH_NAME"
git push -u origin "$BRANCH_NAME"
Example flow — create issue then branch in one sequence:
BODY_FILE="$(mktemp)"
printf '%s\n' 'Issue body goes here' > "$BODY_FILE"
ISSUE_URL="$(gh issue create --title "Add VPC subnets" --body-file "$BODY_FILE" --label "feature")"
ISSUE_NUMBER="$(printf '%s\n' "$ISSUE_URL" | grep -o '[0-9]*$')"
PADDED=$(printf "%03d" "$ISSUE_NUMBER")
gh issue develop "$ISSUE_NUMBER" --name "${PADDED}-vpc-subnets" --checkout
rm -f "$BODY_FILE"
Git handles commits; gh handles everything that touches the GitHub API.
# Stage ONLY the specific files that changed — never use git add . or git add -A
git add modules/vpc/main.tf modules/vpc/variables.tf
# Conventional commit message: type(scope): description
git commit -m "feat(vpc): configure 3-AZ subnet layout"
# Push (set upstream on first push)
git push -u origin HEAD
Commit message types:
feat(scope): — new featurefix(scope): — bug fixdocs(scope): — documentation changerefactor(scope): — no behavior changebuild(deps): — dependency updatePre-commit hook retry: If hooks auto-fix files (terraform fmt, terraform-docs), the commit exits non-zero but the fixes are left on disk. Re-stage and commit again. This function handles it cleanly with set -e:
commit_with_retry() {
local msg="$1"
local files=("${@:2}") # remaining args are file paths
if git commit -m "$msg"; then return 0; fi
# Hooks may have auto-fixed files — re-stage and retry once
git add "${files[@]}"
git commit -m "$msg"
}
git add modules/vpc/main.tf modules/vpc/variables.tf
commit_with_retry "feat(vpc): configure 3-AZ subnet layout" modules/vpc/main.tf modules/vpc/variables.tf
Use gh issue comment for progress updates. For markdown-heavy comments, prefer --body-file with a temporary file.
Simple comment:
gh issue comment 42 --body "Starting investigation on the reported problem."
Structured progress comment — use this template for workflow updates:
BODY_FILE="$(mktemp)"
cat > "$BODY_FILE" <<'EOF'
## ✅ Phase: Implementation
**Status**: Complete
**Result**: All modules deployed successfully
**Summary**:
- Configured VPC with 3 availability zones
- Added NAT gateway for private subnet egress
- All 4 success criteria passing
EOF
gh issue comment 42 --body-file "$BODY_FILE"
rm -f "$BODY_FILE"
Status icons:
| Status | Icon | Template |
|--------|------|----------|
| started | 🔄 | ## 🔄 Phase: <name> + **Status**: In Progress |
| complete | ✅ | ## ✅ Phase: <name> + **Status**: Complete + **Result**: <summary> |
| failed | ❌ | ## ❌ Phase: <name> + **Status**: Failed + **Error**: <what broke> |
Use gh issue close with the --comment flag to close and explain in a single command. Do not split this into a separate comment + close — the --comment flag exists for exactly this purpose.
# Close with resolution comment — single command
gh issue close 42 --comment "Resolved in PR #55"
# Close as not planned
gh issue close 42 --reason "not planned" --comment "Duplicate of #38"
When operating outside a cloned repo (CI scripts, cross-repo automation), use --repo to target explicitly:
gh issue create --repo "org/repo-name" --title "..." --body "..." --label "bug"
gh issue comment 42 --repo "org/repo-name" --body "Progress update"
gh issue close 42 --repo "org/repo-name" --comment "Done"
This is especially common in GHE environments where you may be managing multiple repos.
# List issues (filter by label, state)
gh issue list --label "bug" --state open
# View issue details
gh issue view 42
# Create a pull request
PR_BODY_FILE="$(mktemp)"
cat > "$PR_BODY_FILE" <<'EOF'
## Summary
- Adds VPC module with 3-AZ subnet layout
- Includes NAT gateway and route tables
## Test plan
- [ ] terraform plan shows expected resources
- [ ] terraform apply succeeds in sandbox
EOF
gh pr create --title "feat: add VPC module" --body-file "$PR_BODY_FILE"
rm -f "$PR_BODY_FILE"
# Check PR status
gh pr status
gh pr checks
| Variable | Required | Purpose |
|----------|----------|---------|
| GH_HOST | Yes for GHE | GitHub Enterprise hostname (e.g., github.ibm.com). Without this, gh defaults to github.com. |
| GITHUB_TOKEN | If no gh auth login | Auth token — gh picks this up automatically |
| GH_ENTERPRISE_TOKEN | GHE alternative | Enterprise-specific token |
gh — never curl or direct REST calls.git add <file1> <file2>, never git add . or git add -A.--body-file for multi-line bodies — write markdown to a temp file, then pass it to gh.gh auth status before any operation.--label when creating issues.--comment — use gh issue close N --comment "...", not separate comment + close.--body "$(cat <<EOF ...)" may trip shell-safety guards.development
AWS security assessment domains, risk rating framework, CIS/NIST reference baselines, and evidence-based finding format. Use when reviewing AWS security posture, assessing risk, or applying CIS/NIST baselines to Terraform configurations.
testing
--- name: "tf-runtask" description: "Retrieve and display Terraform Cloud/Enterprise run task results for a given run. Use this skill whenever the user asks about run task results, run task checks, task stage statuses, or wants to inspect what run tasks reported for a Terraform Cloud/Enterprise run. Triggers on phrases like "check the run tasks", "what did the run tasks say", "show run task results", "get task results for run-xxx", or any reference to run task outcomes on a specific run." source
devops
Research strategies for AWS documentation, provider docs, and public registry patterns. Use when researching AWS services, investigating provider resources, or studying public registry modules for design patterns.
development
Validation results summary template for Phase 4 output. Provides the format for reporting terraform test, validate, fmt, tflint, pre-commit, trivy, and security checklist results.