Guides · Updated November 5, 2026

How to scan agent skills in CI with a GitHub Action

By Tineessa Nelson, Use This Skill

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.

Questions

Does the scan Action send my code anywhere?

No code leaves the runner. The scan is a Node script that reads the files in the checked-out repository and matches each line against nine rules. The only network call is for private repositories: the Action sends your Team key to usethisskill.com to confirm the plan is active, and nothing else.

Can I scan only one folder of my repository?

Yes. Set the path input, for example path: .claude/skills. The scan then looks for SKILL.md files under that folder only. If a repository lists the files it actually ships in scripts/public-files.txt or public-files.txt, the scan reads only those files and says so in the output.

What happens if my repository has no SKILL.md files?

The step passes. In a test run on November 5, 2026, a repository with no SKILL.md printed "No skill folders found" and "0 skill folder(s): clear" and exited with code 0, so check the job summary once after you add the workflow to confirm it found your skills.

Does the Action output SARIF or comment on the pull request?

Not today. It writes its findings to the job log and the job summary and sets the check to pass or fail. If you need SARIF for GitHub code scanning or a pull request comment, the Malwar and SkillScan Actions both document a SARIF format option.