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.
.claude/skills/kunanonj-github-actions-creator/SKILL.md| 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.
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 11,941 | 9,973 | -16% | 1 | 1 | 0% | 2,388 | 4,924 | +106% | 0 | 0 | — |
case-02 | fail→pass | 11,628 | 11,475 | -1% | 1 | 1 | 0% | 2,400 | 5,140 | +114% | 0 | 0 | — |
case-03 | fail→pass | 16,656 | 14,142 | -15% | 1 | 1 | 0% | 3,449 | 5,535 | +60% | 0 | 0 | — |
case-04 | pass→pass | 7,818 | 9,116 | +17% | 1 | 1 | 0% | 1,517 | 4,601 | +203% | 0 | 0 | — |
case-05 | pass→pass | 5,413 | 6,014 | +11% | 1 | 1 | 0% | 1,125 | 3,905 | +247% | 0 | 0 | — |
case-06 | fail→pass | 10,494 | 7,224 | -31% | 1 | 1 | 0% | 2,098 | 4,168 | +99% | 0 | 0 | — |
case-07 | pass→pass | 10,126 | 10,767 | +6% | 1 | 1 | 0% | 2,007 | 4,857 | +142% | 0 | 0 | — |
case-08 | pass→pass | 9,981 | 9,940 | -0% | 1 | 1 | 0% | 2,062 | 4,784 | +132% | 0 | 0 | — |
case-09 | pass→pass | 8,031 | 7,301 | -9% | 1 | 1 | 0% | 1,590 | 3,975 | +150% | 0 | 0 | — |
case-10 | pass→pass | 5,482 | 6,633 | +21% | 1 | 1 | 0% | 1,125 | 3,944 | +251% | 0 | 0 | — |
case-11 | pass→pass | 12,463 | 11,114 | -11% | 1 | 1 | 0% | 2,516 | 4,872 | +94% | 0 | 0 | — |
case-12 | pass→pass | 13,797 | 9,871 | -28% | 1 | 1 | 0% | 2,480 | 4,635 | +87% | 0 | 0 | — |
case-13 | pass→pass | 5,499 | 7,168 | +30% | 1 | 1 | 0% | 1,123 | 4,103 | +265% | 0 | 0 | — |
case-14 | fail→fail | 10,595 | 10,531 | -1% | 1 | 1 | 0% | 2,204 | 4,937 | +124% | 0 | 0 | — |
case-15 | pass→pass | 7,212 | 5,979 | -17% | 1 | 1 | 0% | 1,354 | 3,775 | +179% | 0 | 0 | — |
case-16 | fail→pass | 8,939 | 8,874 | -1% | 1 | 1 | 0% | 1,737 | 4,288 | +147% | 0 | 0 | — |
case-17 | pass→pass | 12,258 | 12,805 | +4% | 1 | 1 | 0% | 2,647 | 5,357 | +102% | 0 | 0 | — |
case-18 | pass→pass | 9,905 | 9,242 | -7% | 1 | 1 | 0% | 1,931 | 4,296 | +122% | 0 | 0 | — |
case-19 | pass→pass | 10,310 | 11,922 | +16% | 1 | 1 | 0% | 1,999 | 4,905 | +145% | 0 | 0 | — |
case-20 | pass→pass | 11,199 | 13,121 | +17% | 1 | 1 | 0% | 2,302 | 5,542 | +141% | 0 | 0 | — |
case-21 | pass→pass | 9,730 | 11,266 | +16% | 1 | 1 | 0% | 1,981 | 4,985 | +152% | 0 | 0 | — |
case-22 | pass→fail | 9,274 | 11,646 | +26% | 1 | 1 | 0% | 1,819 | 4,874 | +168% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +18 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.