github-actions · tartinerlabs — Claude Code skill: CI workflows and audits
Writes and audits GitHub Actions workflows: pins actions to SHAs, tightens permissions, catches stale Node versions.
npx skills add tartinerlabs/skills --skill github-actions -a claude-codeWhat github-actions does
The skill runs in two modes. By default it reads every .yml and .yaml file under .github/workflows/ and reports findings as path:line, each with what is wrong and the fix, grouped by severity. Ask it to set up CI and it first works out the language from package.json, go.mod, pyproject.toml, Cargo.toml or Gemfile, then picks the package manager from the lockfile for JS/TS projects.
Every action gets resolved to a full commit SHA with gh api repos/{owner}/{repo}/commits/{ref} --jq '.sha' before it lands in a workflow, and the original ref stays behind as a comment. On pnpm projects the skill advises declaring the version in devEngines.packageManager and Node in devEngines.runtime, both pinned exactly rather than as a range. Keep one declaration, not both: version switchers reject a project whose fields disagree.
Nine rules in rules/ drive the checks — action pinning, permissions, migration drift, concurrency, Node version, caching, triggers, matrix strategy and parallel steps. You need gh on PATH; without it the SHA lookups fail. Fixes are applied only when you ask for them, never just because the workflows folder is missing.
What it helps with
- pin every action to a commit SHA instead of a floating tag
- get an audit report with file paths and line numbers
- generate a CI workflow for Go, Python, Rust or Ruby
- detect the package manager from the lockfile
- add a job that flags migration drift
Example prompts for the agent
- Audit every workflow in
.github/workflows/and list the problems - Set up CI for this project
- Fix action pinning and permissions in our workflows
How to install github-actions
1Skills CLI (Vercel)
npx skills add tartinerlabs/skills --skill github-actions -a claude-code2Manually: put the files in place
~/.claude/skills/github-actions/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/github-actions/
1Skills CLI (Vercel)
npx skills add tartinerlabs/skills --skill github-actions -a codex2Manually: put the files in place
.agents/skills/github-actions/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add tartinerlabs/skills --skill github-actions -a cursor2Manually: put the files in place
.cursor/skills/github-actions/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install tartinerlabs/skills github-actions2Manually: put the files in place
.github/skills/github-actions/SKILL.md1Skills CLI (Vercel)
npx skills add tartinerlabs/skills --skill github-actions -a gemini-cli2Platform CLI
gemini skills install https://github.com/tartinerlabs/skills --path plugins/workflow/skills/github-actionsManually: put the files in place
.devin/skills/github-actions/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add tartinerlabs/skills --skill github-actions -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about github-actions
How do I install github-actions in Claude Code?
Run npx skills add tartinerlabs/skills --skill github-actions -a claude-code. The skill lands at ~/.claude/skills/github-actions/SKILL.md.
What does github-actions do?
It generates a CI workflow for the detected language and audits existing ones against nine rules covering pinning, permissions, concurrency, Node version, caching, triggers, matrix, parallel steps and migration drift.
What does the skill need to run?
The gh CLI, used to look up commit SHAs when pinning. Language and package manager are detected from files already in the repo.
Source text
SKILL.md · MIT
---
name: github-actions
description: Use when adding CI/CD, creating workflows, auditing GitHub Actions, or fixing action pinning. Creates and audits workflows for SHA pinning and permissions.
license: MIT
allowed-tools: Read Glob Grep Edit Write Bash(gh:*)
model: sonnet
effort: high
context: fork
agent: general-purpose
compatibility: Targets GitHub Actions (GitHub-native); uses gh for SHA lookups; auto-detects project language (Node/JS-TS, Go, Python, Rust, Ruby)
metadata:
short-description: Create and audit CI workflows.
---
## Mode Detection
Audit and report by default. Generate workflows only when asked to create, add, or set up CI — and **never merely because `.github/workflows/` is absent**; report that none were found instead. Apply fixes only when asked to fix or pin. When the ask is unclear, report and offer to apply the fixes.
## Create Mode
### 1. Detect Project Type
Scan for project indicators:
- `package.json` → Node.js/JS/TS
- `go.mod` → Go
- `requirements.txt` / `pyproject.toml` / `setup.py` → Python
- `Cargo.toml` → Rust
- `Gemfile` → Ruby
### 2. Detect Package Manager (JS/TS projects)
Detect the package manager from the lockfile, in this order: `nub.lock`, `pnpm-lock.yaml`, `bun.lock`/`bun.lockb`, `yarn.lock`, `package-lock.json`. With no lockfile, ask.
A `devEngines.packageManager` or `packageManager` field in `package.json` outranks any lockfile. For pnpm, prefer `devEngines.packageManager` over `packageManager`: pnpm 11+ and the `pnpm/setup` action read it first, and pnpm records the resolved version in `pnpm-lock.yaml`. Pin an exact version rather than a range, so every machine and CI run uses the same pnpm — resolve the current latest at setup time (`pnpm view pnpm version`) and write it as `{ "name": "pnpm", "version": "<latest>", "onFail": "download" }`. The same goes for the runtime: declare Node in `devEngines.runtime` (pnpm 10.14+ downloads it and records its checksum in the lockfile) rather than `.nvmrc` or `engines.node`, pinned to the current LTS resolved at setup time — `pnpm runtime set node lts` (pnpm 11.4+) writes the field; confirm the saved `version` is exact, not a range. Write that field when declaring pnpm; migrating a legacy `"packageManager": "pnpm@…"` is worthwhile but optional. Keep one declaration, not both — version switchers refuse a project whose two fields disagree. Yarn still needs `packageManager`, the only field it reads. Nub runs in compat-mode over another manager's lockfile, so `nub.lock` alongside `pnpm-lock.yaml` means nub — check the field before concluding from lockfiles alone.
### 3. Generate Workflow
Read each rule file in `rules/` and apply all of them when generating workflows.
Pin every action per `rules/action-pinning.md` before writing the workflow, including GitHub-owned `actions/*`. Resolve the intended release or source ref to a full commit SHA with `gh api repos/{owner}/{repo}/commits/{ref} --jq '.sha'`, then retain the release or source ref in a comment.
When the project commits migrations from a migration tool, also add a separate `migration-drift` job per `rules/migration-drift.md`, and tell the user to make it a required status check.
### 4. Workflow Template
Route by the language detected in Step 1. The template below is the **JS/TS default**; for any other detected language, load `references/<lang>.md` and use its template instead:
| Language | Template |
|----------|----------|
| **JS/TS** (Node) | the template below |
| **Go** | `references/go.md` |
| **Python** | `references/python.md` |
| **Rust** | `references/rust.md` |
| **Ruby** | `references/ruby.md` |
Every template applies the same `rules/` (action pinning, `permissions`, concurrency). Adapt the JS/TS template to the detected package manager (replace `<pm>` with the detected package manager):
```yaml
name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
permissions:
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs:
ci:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@<full-SHA> # <latest release>
- uses: actions/setup-node@<full-SHA> # <latest release>
with:
node-version: 'lts/*'
cache: '<pm>'
- run: <pm> install --frozen-lockfile
- run: <pm> check
- run: <pm> test
- run: <pm> build
```
For pnpm, replace the `actions/setup-node` and install steps with a single `pnpm/setup` step on its default settings (`rules/node-version.md`): with no inputs it installs pnpm from `devEngines.packageManager` and Node from `devEngines.runtime`, then runs `pnpm install`.
## Audit Mode
### 1. Scan Workflows
Read all `.yml` and `.yaml` files in `.github/workflows/` and audit against every rule in the `rules/` directory.
### 2. Report Format
Report each finding as `path:line` — what is wrong → the fix, grouped by severity, and close with per-severity counts and the number of files scanned.
Report **all** rule violations found, not just pinning and permissions — migration drift, concurrency, node version, caching, triggers, matrix, and parallel steps too.
### 3. Auto-Fix
When fixing, look up commit SHAs for pinning using `gh api`.
## Rules
| Rule | Impact | File |
|------|--------|------|
| Action pinning | HIGH | `rules/action-pinning.md` |
| Permissions | HIGH | `rules/permissions.md` |
| Migration drift | HIGH | `rules/migration-drift.md` |
| Concurrency | MEDIUM | `rules/concurrency.md` |
| Node version | MEDIUM | `rules/node-version.md` |
| Caching | MEDIUM | `rules/caching.md` |
| Triggers | LOW | `rules/triggers.md` |
| Matrix strategy | LOW | `rules/matrix.md` |
| Parallel steps | LOW | `rules/parallel-steps.md` |
© tartinerlabs · MIT · tartinerlabs/skills
Similar skills
All skills for DevOps and infrastructure →github-actions by other authors comes first.