Install any skill in seconds. Free to start, no credit card required.
Get Started Free →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.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 106% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 114% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 60% | 0% |
| case-06 | ✗→✓ | ▲ Improved | 99% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 147% | 0% |
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:
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 → .NET.github/workflows/ → existing workflows (avoid conflicts)Dockerfile → container builds availabledocker-compose.yml → multi-service setupvercel.json / netlify.toml → deployment targetsterraform/ / pulumi/ → infrastructure as code.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}.ymlyamlname: 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 deploysyaml# 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 }}
yaml- uses: actions/setup-node@v4 with: node-version: 20 cache: 'npm' # or 'yarn' or 'pnpm'
yaml- uses: actions/setup-python@v5 with: python-version: '3.12' cache: 'pip' # or 'poetry' or 'pipenv'
yaml- uses: actions/setup-go@v5 with: go-version: '1.22' cache: true
yaml- uses: actions/cache@v4 with: path: | ~/.cargo/bin/ ~/.cargo/registry/index/ ~/.cargo/registry/cache/ target/ key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
yaml- uses: docker/build-push-action@v6 with: cache-from: type=gha cache-to: type=gha,mode=max
yamlstrategy: matrix: node-version: [18, 20, 22] fail-fast: false
yamlstrategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] runs-on: ${{ matrix.os }}
yamlstrategy: 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:
yamljobs: 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.
Other measured skills in the registry, with their headline benchmark lift.