Use when the user wants to create, generate, or set up a GitHub Actions workflow. Handles CI/CD pipelines, testing, deployment, linting, security scanning, release automation, Docker builds, scheduled tasks, and any custom workflow for any language or framework.
You are an expert at creating GitHub Actions workflows. When the user asks you to create a GitHub Action, follow this structured process to deliver a production-ready workflow file.
Before writing any YAML, scan the project to understand the stack:
Check for language/framework indicators:
package.json → Node.js (check for React, Next.js, Vue, Angular, Svelte, etc.)requirements.txt / pyproject.toml / setup.py → Pythongo.mod → GoCargo.toml → Rustpom.xml / build.gradle → Java/KotlinGemfile → Rubycomposer.json → PHPpubspec.yaml → Dart/FlutterPackage.swift → Swift*.csproj / *.sln → .NETCheck for existing CI/CD:
.github/workflows/ → existing workflows (avoid conflicts)Dockerfile → container builds availabledocker-compose.yml → multi-service setupvercel.json / netlify.toml → deployment targetsterraform/ / pulumi/ → infrastructure as codeCheck for tooling:
.eslintrc* / eslint.config.* → ESLint configuredprettier* → Prettier configuredjest.config* / vitest.config* / pytest.ini → test framework.env.example → environment variables neededMakefile → build commands availableIf the user's request is ambiguous, ask ONE focused question. Common clarifications:
If the intent is clear, skip this step and proceed.
Create the .github/workflows/{name}.yml file following these rules:
ci.yml, deploy-production.yml, release.ymlci.ymldeploy.yml or deploy-{target}.ymlscheduled-{task}.ymlname: Human-readable name # Always include
on: # Use the most specific triggers
push:
branches: [main] # Specify branches explicitly
paths-ignore: # Skip docs-only changes when appropriate
- '**.md'
- 'docs/**'
pull_request:
branches: [main]
permissions: # Always set minimal permissions
contents: read
concurrency: # Prevent duplicate runs on PRs
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
job-name:
runs-on: ubuntu-latest # Default to ubuntu-latest
timeout-minutes: 15 # Always set a timeout
steps:
- uses: actions/checkout@v4 # Always pin to major version
Trigger: pull_request + push to main
Jobs: lint, test (parallel when possible)
Key features: dependency caching, matrix testing for multiple versions
Trigger: push to main (or release tags)
Jobs: test → build → deploy (sequential with needs)
Key features: environment protection, secrets for credentials, status checks
Trigger: push tags matching v* or workflow_dispatch
Jobs: test → build → publish → create GitHub Release
Key features: changelog generation, artifact upload, npm/PyPI/Docker publish
Trigger: schedule with cron expression
Jobs: single job with the task
Key features: workflow_dispatch for manual trigger too, failure notifications
Trigger: pull_request + schedule (weekly)
Jobs: dependency audit, SAST, secret scanning
Key features: SARIF upload to GitHub Security tab, fail on critical
Trigger: push to main + tags
Jobs: build → push to registry
Key features: multi-platform builds, layer caching, image tagging strategy
| Action | Purpose |
|--------|---------|
| actions/checkout@v4 | Clone repository |
| actions/setup-node@v4 | Node.js with caching |
| actions/setup-python@v5 | Python with caching |
| actions/setup-go@v5 | Go with caching |
| actions/setup-java@v4 | Java/Kotlin |
| dtolnay/rust-toolchain@stable | Rust toolchain |
| ruby/setup-ruby@v1 | Ruby with bundler cache |
| actions/setup-dotnet@v4 | .NET SDK |
| Action | Purpose |
|--------|---------|
| docker/build-push-action@v6 | Docker multi-platform builds |
| docker/login-action@v3 | Docker registry authentication |
| aws-actions/configure-aws-credentials@v4 | AWS authentication |
| google-github-actions/auth@v2 | GCP authentication |
| azure/login@v2 | Azure authentication |
| cloudflare/wrangler-action@v3 | Cloudflare Workers deploy |
| amondnet/vercel-action@v25 | Vercel deployment |
| Action | Purpose |
|--------|---------|
| github/codeql-action/analyze@v3 | CodeQL SAST scanning |
| aquasecurity/trivy-action@master | Container vulnerability scan |
| codecov/codecov-action@v4 | Coverage upload |
| actions/dependency-review-action@v4 | Dependency audit on PRs |
| Action | Purpose |
|--------|---------|
| actions/cache@v4 | Generic caching |
| actions/upload-artifact@v4 | Store build artifacts |
| actions/download-artifact@v4 | Retrieve artifacts between jobs |
| softprops/action-gh-release@v2 | Create GitHub Releases |
| slackapi/slack-github-action@v2 | Slack notifications |
| peter-evans/create-pull-request@v7 | Automated PR creation |
permissions at workflow or job level@v4 not @main or full SHA for readabilityecho ${{ secrets.X }}workflow_dispatch, validate input values${{ github.event.*.body }} directly in run: — pass via environment variables${{ secrets.GITHUB_TOKEN }} over PATs when possibleconcurrency to prevent parallel deploys# WRONG - script injection vulnerability
- run: echo "${{ github.event.issue.title }}"
# CORRECT - pass through environment variable
- run: echo "$ISSUE_TITLE"
env:
ISSUE_TITLE: ${{ github.event.issue.title }}
- uses: actions/setup-node@v4
with:
node-version: 20
cache: 'npm' # or 'yarn' or 'pnpm'
- uses: actions/setup-python@v5
with:
python-version: '3.12'
cache: 'pip' # or 'poetry' or 'pipenv'
- uses: actions/setup-go@v5
with:
go-version: '1.22'
cache: true
- uses: actions/cache@v4
with:
path: |
~/.cargo/bin/
~/.cargo/registry/index/
~/.cargo/registry/cache/
target/
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- uses: docker/build-push-action@v6
with:
cache-from: type=gha
cache-to: type=gha,mode=max
strategy:
matrix:
node-version: [18, 20, 22]
fail-fast: false
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest]
node-version: [18, 20]
exclude:
- os: windows-latest
node-version: 18
| Schedule | Cron |
|----------|------|
| Every hour | 0 * * * * |
| Daily at midnight UTC | 0 0 * * * |
| Weekdays at 9am UTC | 0 9 * * 1-5 |
| Weekly on Sunday | 0 0 * * 0 |
| Monthly 1st | 0 0 1 * * |
After creating the workflow file, provide:
When the user asks for something generic like "set up CI/CD", create a single workflow with multiple jobs:
jobs:
lint: # Fast feedback
test: # Core validation
build: # Ensure it compiles/bundles
needs: [lint, test]
deploy: # Only after everything passes
needs: build
if: github.ref == 'refs/heads/main'
Keep workflows focused. Prefer one workflow per concern over one massive workflow, unless the jobs are tightly coupled.
Copy a source-pinned command for your client. You run it yourself.
Destination: .claude/skills/github-actions-creator · pinned to the source commit
# Run from your project root
git clone https://github.com/davila7/claude-code-templates.git .skillboard-tmp
git -C .skillboard-tmp checkout 5cc17cf267132cc690dee82239b80a99ec82e4f8
mkdir -p ".claude/skills"
cp -r ".skillboard-tmp/cli-tool/components/skills/development/github-actions-creator" ".claude/skills/"
rm -rf .skillboard-tmpReview the source before running. This copies files into your project; it is not a one-click install and does not verify runtime safety.
sudo apt update && sudo apt install -y gitnpm install -g @anthropic-ai/claude-code# Run from your project root
git clone https://github.com/davila7/claude-code-templates.git .skillboard-tmp
git -C .skillboard-tmp checkout 5cc17cf267132cc690dee82239b80a99ec82e4f8
mkdir -p ".claude/skills"
cp -r ".skillboard-tmp/cli-tool/components/skills/development/github-actions-creator" ".claude/skills/"
rm -rf .skillboard-tmpDestination: .claude/skills/github-actions-creator
Scanner static-checks@0.1.0 · commit 5cc17cf26713. Static checks cannot prove runtime safety – review the source and the exact diff before installing. How checks work.
References credentials, tokens or secret files that a skill should not need.
Evidence: [redacted]· fingerprint e9cbb0224c4a3d23