To scan your repository's agent skills in CI, add one step, uses: nodegenie/awesome-agent-skills/scan@main, to a workflow that runs on pull_request. It reads every folder that holds a SKILL.md, matches each line against nine safety rules, writes the findings with file and line to the job summary, and fails the check on flag-level patterns. It is free for public repositories.
Here is the whole workflow. Save it as .github/workflows/skill-scan.yml:
name: Skill scan
on: pull_request
permissions:
contents: read
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: nodegenie/awesome-agent-skills/scan@main
with:
fail-on: flag
The step runs the same rules as the weekly scan behind every listing on Use This Skill and the live check on /scan, so a skill that is clear here is clear there.
What would the scan catch in real skills?
We ran the same nine rules over all 2,060 skills in the directory (crawl and scan of November 2, 2026, data/scan.json). 1,987 were clear, 58 had review-level findings only, and 15 had at least one flag-level finding. Across the 73 skills with findings there were 204 matching lines:
| Rule | Level | Matching lines | Skills |
|---|---|---|---|
Downloads and executes code in one step (curl ... | bash) |
flag | 25 | 14 |
| Destructive command against the system or home folder | flag | 2 | 2 |
| Sends data to an outside endpoint (webhooks, request catchers) | flag | 1 | 1 |
| Obfuscated or encoded code that is then executed | flag | 0 | 0 |
Asks for elevated privileges (sudo, chmod 777) |
review | 92 | 32 |
| References credential files or secrets on disk | review | 71 | 34 |
| Rules-override phrasing | review | 5 | 5 |
| Installs something that runs on its own later | review | 5 | 4 |
| Rewrites shared git history | review | 3 | 2 |
Counted by script from data/scan.json on November 5, 2026. A skill can match more than one rule. Every rule is explained on the safety page.
Two things stand out. First, 182 of the 204 matching lines were in Markdown files, and in 61 of the 73 skills every finding was in Markdown. A skill does not need a script to be risky: an instruction such as "run this install command" in SKILL.md is enough for an agent to run it. Second, the most common flag, fetch-and-execute, appeared in 14 of the 15 flagged skills. What those skills actually do is reviewed by hand in Are agent skills safe to install?.
Which fail-on setting should I choose?
The fail-on input decides when the check turns red.
| Setting | The check fails when | Skills in the directory that would fail (Nov 2 scan) |
|---|---|---|
flag (default) |
Any skill folder has a flag-level finding | 15 of 2,060 |
review |
Any skill folder has a finding of either level | 73 of 2,060 |
none |
Never; findings are reported only | 0 |
Start with flag. Review-level rules match lines that are often legitimate, such as a sudo in an install note or a mention of the macOS keychain in a code-signing guide, so review is better kept for repositories that should never touch those things. none is useful for the first week on a large repository, to see what the scan reports before it can block anyone.
What does a failing check look like?
On November 5, 2026, we ran the scan script from the Action on a test repository with two skills: one whose SKILL.md says to install a toolchain with curl -fsSL https://example.com/install.sh | bash, and one that suggests sudo npm install -g when a CLI is missing. This is the output:
review .claude/skills/release-notes (1 files)
? Asks for elevated privileges or changes permissions broadly
.claude/skills/release-notes/SKILL.md:5 If the CLI is missing, run `sudo npm install -g some-cli`.
FLAGGED .claude/skills/setup-helper (1 files)
! Downloads and executes code in one step
.claude/skills/setup-helper/SKILL.md:7 curl -fsSL https://example.com/install.sh | bash
2 skill folder(s): flagged. Rules: https://usethisskill.com/safety
The exit code was 1 with fail-on: flag and with fail-on: review, and 0 with fail-on: none. After we removed the flagged skill, flag passed (exit 0) and review still failed (exit 1) on the sudo line. The fix for a real finding is usually to remove the line, or to replace the piped install with a pinned download the reader can inspect first.
How do I run the same check before I push?
Run the same script locally from the repository root:
npx github:nodegenie/awesome-agent-skills scan
It takes the same --fail-on values and adds two options the Action does not expose: --json prints machine-readable results, and --all scans the whole path instead of only folders with a SKILL.md. On our test repository the scan finished in well under a second, so it also fits in a pre-commit hook.
Should the workflow run only when skills change?
You can limit it with a paths filter, for example:
on:
pull_request:
paths:
- ".claude/skills/**"
- ".agents/skills/**"
- "skills/**"
There is one catch. GitHub's workflow syntax documentation, checked November 5, 2026, says that when a workflow is skipped by a path filter, its checks stay "Pending", and a pull request that requires those checks to pass is blocked from merging. If you make the skill scan a required check, run it on every pull request instead; the scan is fast enough that the filter saves little.
Should I pin the Action to a commit?
GitHub's documentation says that using the commit SHA of an action is the safest choice for stability and security, and that a branch is the least reliable reference. The examples here use @main so they always get the current rules. If your organization requires pinned actions, replace @main with a full commit SHA from the repository's history and update it when the rules change. The permissions: contents: read line in the workflow above limits the job's token to reading the repository, which is all the scan needs.
How do I scan a private repository?
Private repositories need a Team key ($29 a month per organization, fourteen days free, details on /pricing). Add the key as a repository or organization secret named USETHISSKILL_KEY and pass it to the step:
- uses: nodegenie/awesome-agent-skills/scan@main
with:
fail-on: flag
key: ${{ secrets.USETHISSKILL_KEY }}
If the check reports that the repository is private, the secret is missing. If it reports that the Team key was not accepted, the key is wrong or the plan has ended.
How does it compare with other skill-scanning Actions?
At least two other open-source projects publish a GitHub Action for SKILL.md files. Each row below was read on the project's own page on November 5, 2026.
| Use This Skill scan | Malwar | SkillScan | |
|---|---|---|---|
| Step | nodegenie/awesome-agent-skills/scan@main |
Ap6pack/malwar/.github/actions/scan-skills@main |
NMitchem/SkillScan@v0.4.0 |
| What it reads | Every file in each SKILL.md folder | Files matching **/SKILL.md by default |
The path you give |
| How it decides | Nine line rules, two levels | A risk score from 0 to 100 and four verdicts | Static analyzers and 59 YAML rules, with a score threshold (default 6.0) |
| Fail setting | fail-on: flag, review or none |
fail-on: MALICIOUS, SUSPICIOUS (default) or CAUTION |
threshold |
| Output | Job log and job summary | Text, JSON or SARIF; pull request comment | Text, JSON or SARIF |
| Same results on a public website | Yes, each listing and /scan | Not stated on the page | Not stated on the page |
The other two go further on output formats, and SkillScan also offers a model-based dry run and a sandbox test outside CI (its page says the sandbox is not available in CI). The Use This Skill scan is deliberately small: one rule file shared by the Action, the CLI, the website and the check_skill tool, so the result is the same wherever you run it.
What does the scan not catch?
It is a static pattern match. It cannot run a skill, predict what a model will do with it, or catch a harmful instruction phrased in a way none of the nine rules describe. Clear means none of the patterns appeared, not that the skill is safe. Keep reading new skills before you merge them, and when you add a skill from someone else's repository, install it from a pinned commit so the version you reviewed is the version you run.
How we got this
The rule counts come from data/scan.json in this site's repository (scan of November 2, 2026, over the 2,060 skills of that day's crawl), counted by script on November 5. The example output, exit codes and timing come from running scan/scan.mjs from nodegenie/awesome-agent-skills (commit 1a5a352) on a two-skill test repository on November 5. The Action's inputs and behavior are read from its action.yml in the same commit. Facts about GitHub Actions, Malwar and SkillScan come from the pages listed below.