Official agent skill

Semgrep Rule Variant Creator

by trailofbits in trailofbits/skills

Creates language variants of existing Semgrep rules. An agent skill from trailofbits/skills.

OfficialCC-BY-SA-4.0Auto-check: notesSecurity

Install Semgrep Rule Variant Creator

skills CLI
$ npx skills add trailofbits/skills --skill semgrep-rule-variant-creator -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install trailofbits/skills semgrep-rule-variant-creator --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/trailofbits/skills.git skills-src && mkdir -p .claude/skills && cp -r skills-src/plugins/semgrep-rule-variant-creator/skills/semgrep-rule-variant-creator .claude/skills/semgrep-rule-variant-creator && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
semgrep-rule-variant-creator
GitHub stars
7.4k
Used in
5 other repos
Token cost
~3.4k tokens
SKILL.md length
1,983 words
Files
6 (incl. references, assets)
Skills in repo
79
Repo updated
First seen
Licence
CC-BY-SA-4.0

At a glance

Creates language variants of existing Semgrep rules. An agent skill from trailofbits/skills.

  • Works in 3 steps: Claude Code — ls -d --… → Codex — the same command with… → Neither set — find ~/.claude ~/.codex .…
  • Porting a Semgrep rule to specified target languages
  • SKILL.md covers Run it as a workflow, The four phases, Output and Scope and reporting, plus 3 more sections
  • Calls semgrep

What it does

Semgrep Rule Variant Creator is an agent skill from trailofbits/skills, published by the product's own GitHub organization. Creates language variants of existing Semgrep rules. Use when porting a Semgrep rule to specified target languages. Takes an existing rule and target languages as input, produces independent rule+test directories for each language.

Its SKILL.md is about 3.4k tokens, which your agent loads only when the skill is triggered. The skill folder holds 8 other files, including reference files and assets (for example `agents/openai.yaml`, `references/applicability-analysis.md` and `references/language-syntax-guide.md`).

It sits in Security, covering Static analysis and SAST. It works with Semgrep. The repository describes itself as: Trail of Bits Claude Code skills for security research, vulnerability detection, and audit workflows. The licence is CC-BY-SA-4.0.

When your agent uses it

  • Porting a Semgrep rule to specified target languages
  • Tasks that involve Static analysis and SAST

Example prompts

  • “Use the semgrep-rule-variant-creator skill to create language variants of existing Semgrep rules. An agent skill from trailofbits/skills”
  • “/semgrep-rule-variant-creator”

Requirements

  • Pre-approved tools (allowed-tools): Bash, Read, Write, Edit, Glob, Grep, WebFetch, Workflow

Workflow steps

3 steps, taken from the first numbered list in SKILL.md.

  1. Claude Code — ls -d -- "${CLAUDE_PLUGIN_ROOT}/skills/semgrep-rule-variant-creator/references"
  2. Codex — the same command with ${CODEX_PLUGIN_ROOT}, if that variable is set instead
  3. Neither set — find ~/.claude ~/.codex . -type d -path '*/semgrep-rule-variant-creator/skills/*/references' -print -quit 2>/dev/null

What it can do on your machine

Read from SKILL.md and the folder at commit 82fe822. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves these tools, so the agent can use them without asking each time:

    • Bash
    • Read
    • Write
    • Edit
    • Glob
    • Grep
    • WebFetch
    • Workflow

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • semgrep

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    Links to these hosts (documentation or services it may open):

    • semgrep.dev
    • appsec.guide

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Semgrep Rule Variant Creator loads about 3.4k tokens when it runs, and up to ~8.9k if it reads all its reference files. Until then it costs about 65 tokens; SKILL.md has 1,983 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~65
When it runs · the whole SKILL.md, loaded when a task matches
~3.4k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~8.9k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NotePre-approves every shell command (allowed-tools: Bash)SKILL.md
    allowed-tools: Bash, Read, Write, Edit, Glob, Grep, WebFetch, Workflow

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from trailofbits/skills at commit 82fe822, republished under its CC-BY-SA-4.0 licence (© trailofbits). 1,983 words, ~3,420 tokens.

Download SKILL.mdSave it as .claude/skills/semgrep-rule-variant-creator/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.
name
semgrep-rule-variant-creator
description
Creates language variants of existing Semgrep rules. Use when porting a Semgrep rule to specified target languages. Takes an existing rule and target languages as input, produces independent rule+test directories for each language.
allowed-tools
Bash, Read, Write, Edit, Glob, Grep, WebFetch, Workflow

Semgrep Rule Variant Creator

Port an existing Semgrep rule to other languages, one independent test-driven cycle per language.

For a new rule rather than a port, use semgrep-rule-creator — it takes a bug pattern description where this skill takes a finished rule. That skill is also the reference for rule-writing fundamentals: taint mode versus pattern matching, why tests come first, and how to narrow a rule once it passes. Porting applies those same judgments in a new language, so start there when the rule structure itself is the open question.

Run it as a workflow

Porting is the same four phases repeated per language, so the orchestration ships as a dynamic workflow rather than as instructions to re-follow each run:

/semgrep-rule-variant-creator:port-rule-to-languages

Pass the three required arguments, and outputDir unless the working directory is where you want the variants. One language per entry: "Go and Java" ports a single language named after the phrase, and the script rejects it.

referencesDir has to be a resolved absolute path. Resolve it here, because no workflow script can expand a variable. Try in order, first hit wins — the -d is the point, since a bare ls prints the names of the files inside the directory rather than the directory itself and leaves nothing to copy:

  1. Claude Code — ls -d -- "${CLAUDE_PLUGIN_ROOT}/skills/semgrep-rule-variant-creator/references"
  2. Codex — the same command with ${CODEX_PLUGIN_ROOT}, if that variable is set instead
  3. Neither set — find ~/.claude ~/.codex . -type d -path '*/semgrep-rule-variant-creator/skills/*/references' -print -quit 2>/dev/null

Then confirm the directory that printed holds both reference files, with ls -1 -- "<that path>".

Pass the path exactly as printed. If all three come back empty, stop and say so rather than assembling a path by hand: the script rejects a relative path and an unexpanded token, but a hand-built absolute path that happens not to exist clears every guard it has, and the run then reports every language as passed having read no guidance at all.

json
{
  "rulePath": "<path to the rule being ported>",
  "languages": ["Go", "Java"],
  "referencesDir": "<the absolute path the ls above printed>",
  "outputDir": "<where the variant directories should land>"
}

A workflow script cannot expand {baseDir} or ${CLAUDE_PLUGIN_ROOT}, and has no filesystem access to notice that it did not; an installed plugin does not sit in the user's project either, so referencesDir is the only route by which the references below reach the phase agents. The script rejects a run that omits it and one that passes a token instead of a path, rather than porting without them, since a port made without this guidance still reports every language as passed. outputDir is the one optional argument, defaulting to the working directory, which is rarely what you want inside a repository.

It reads the rule once, then runs each language through the full cycle independently, and reports which languages passed, which failed validation, which it judged not applicable, which Semgrep cannot analyze at all, and which it stopped on — a language key it does not recognize, two entries resolving to one directory, or a refuter that never reported back. A stop names what to change and will happen again on a re-run, which is what separates it from an agent that died. The rule travels as a path, not as text: every phase reads the file, because an agent asked to repeat a rule back verbatim does not — one HTML-escaped < and > and broke the <... ...> operator for every phase downstream.

If a run is interrupted while the session is still alive — you stopped it, or an agent hit a terminal error — relaunch it with Workflow({scriptPath: "…", resumeFromRunId: "<runId>", args: {…}}), passing the same arguments again. Arguments are not saved with a run, so a resume that omits them fails the pre-flight check above before replaying anything; with them, languages that finished replay from cache and only the unfinished ones re-run.

Resume is same-session only, which rules it out for the interruption a long port is most likely to hit: a session limit ends the session, and runs are stored under that session's own directory, so the next session cannot reach them. A run id it cannot resolve is not an error either — the workflow starts from scratch under that id and re-runs every language at full cost, with nothing saying so. Check the id is still there before counting on a resume:

ls -d ~/.claude/projects/*/*/subagents/workflows/*/

That is where runs land today rather than a documented interface, so an empty result may mean the layout moved rather than that the run is gone. The safe reading is the same either way: if you cannot confirm the id, or the session ended, re-invoke with the same arguments and point outputDir somewhere fresh. The script never deletes a directory, so a language that flipped to NOT_APPLICABLE on the second run leaves the first run's variant behind.

The script is workflows/port-rule-to-languages.js at the plugin root. It pins a reasoning effort per phase — cheap to read the rule, highest for translation and for the fix-until-green loop — and encodes the phase order, so a rule cannot be written before the tests that specify it. It also keeps the two decisions that have no oracle out of any single agent's hands: a NOT_APPLICABLE verdict goes to an independent refuter before the language is dropped, and failed validation is retried up to three times rather than trusting one agent to iterate until green.

Run the phases by hand when you are porting to a single language and want to stay in the loop, or when a port is already half-finished and you only need one phase. The workflow is the only delegation a port needs: one agent to read the rule, and four per language when the port goes green first try — a refuted verdict adds one, and so does each validation retry. Nothing else here is large or independent enough to be worth its own agent, so running a phase by hand means doing it yourself rather than handing it to a subagent.

The four phases

Each language runs all four before its variant is finished. A language that fails validation is unfinished; a language judged not applicable produces no directory.

1. Applicability analysis — decide whether the pattern belongs in the target language at all: does the vulnerability class exist there, does an equivalent construct exist for each source, sink, and sanitizer, and would the ported rule detect real risk rather than a surface syntax match. Verdict is APPLICABLE, APPLICABLE_WITH_ADAPTATION, or NOT_APPLICABLE. NOT_APPLICABLE is the one verdict nothing downstream can contradict — it produces no tests, no rule, and no directory — so it earns a second opinion before you act on it. Answered separately, by running Semgrep: can Semgrep read this language at all? Perl has no frontend and Elixir's parser is Pro-only, and in both cases the bug class is present while the rule is ungradeable — a different finding from NOT_APPLICABLE, which claims the bug class is absent. See applicability-analysis.md for worked examples of each verdict.

2. Test creation — write the test file first, in idiomatic target-language code. At least two ruleid: cases and two ok: cases, each annotation on the line immediately above the code it grades. Include the safe form that is the language's own idiom for doing the thing correctly, since that is the false positive a port most often invents.

3. Rule translation — dump the AST for the target language and translate against what it shows, because pattern shape follows AST shape rather than source resemblance. Keep the original's detection intent and mode; change the id to <original-id>-<language>, the languages key, and add original-rule and ported-from metadata. See language-syntax-guide.md.

4. Validation — semgrep --test is the acceptance criterion, and it must report that all tests passed. Missed lines mean the pattern is narrower than the vulnerability; incorrect lines mean it is broader. The test file is the specification, so fix the rule to satisfy it. Stopping while tests still fail leaves the language unfinished, not done. See workflow.md for reading a test failure and for troubleshooting when a pattern will not match or taint will not propagate.

The acceptance criterion is one specific Semgrep: the version recorded when the rule was read. Switching binaries to get a green is the failure this guards against — an agent that could not pass its Elixir tests installed the last OSS build shipping the Elixir parser and reported its genuine "All tests passed" for a port that is red here. Two other greens mean nothing: a rule Semgrep skipped still ends its run in "All tests passed", and so does a test file whose extension Semgrep does not associate with the rule's language, since it graded zero tests either way.

Show full SKILL.md (578 more words)Show less

Output

One directory per applicable language, holding the ported rule and its test file:

python-command-injection-go/
├── python-command-injection-go.yaml
└── python-command-injection-go.go

All tests passed means the rule and its test file agree with each other; it is not evidence that the vulnerability class is exploitable in the target language, since the same cycle wrote both, so treat a finished variant as a candidate for review rather than a validated rule.

Scope and reporting

Port the rule you were handed to the languages you were asked for. Do not repair the original, widen it to catch a nearby bug class, or add a language nobody named; if the original looks wrong or an obvious target is missing, say so in one sentence and carry on with the port as asked. Every language you were given gets finished — a port is done when its tests pass, not when its files exist.

Keep prose short and spend it on the result. Before the first tool call, say in one sentence what you are about to do. While a port runs, speak up when a verdict changes, when the target needs a pattern shape the original does not have, or when the tests will not go green — not on every semgrep --test iteration. Then lead with the outcome: the first sentence says which languages passed, which failed validation, which were not applicable, and which Semgrep cannot analyze, with the detail after it. Correct an earlier statement when the error changes the rule, the verdict, or what to do next, then keep going; a slip that changes nothing needs no note.

Rule and test files are the size of the problem. A test file earns its length from distinct constructs and distinct safe forms rather than from restatements of the same case, and neither file needs comments repeating what the code already says.

Rationalizations to Reject

RationalizationWhy It FailsCorrect Approach
"Pattern structure is identical"Different ASTs across languagesAlways dump AST for target language
"Same vulnerability, same detection"Data flow differs between languagesAnalyze target language idioms
"Rule doesn't need tests since original worked"Language edge cases differWrite NEW test cases for target
"Skip applicability - it obviously applies"Some patterns are language-specificComplete applicability analysis first
"I'll create all variants then test"Errors compound, hard to debugFinish each language before the next
"Library equivalent is close enough"Surface similarity hides differencesVerify API semantics match
"Just translate the syntax 1:1"Languages have different idiomsResearch target language patterns
"Most tests pass"A partial rule reports partial truthAll tests passed, or the port is unfinished
"An older semgrep still parses this language"A green nobody can reproduce on the semgrep the rule must run underReport the failing output and say the parser is Pro-only
"The class exists there, so the rule ports"Semgrep has no Perl frontend and Elixir's is Pro-only; taint no-ops silentlyConfirm semgrep can read the language before porting
"Semgrep said all tests passed"It says that over zero graded tests, for a rule it skipped or a file it never matchedCheck the rule ran and the test file's extension matches

Quick Reference

TaskCommand
Run testssemgrep --test --config rule.yaml test-file
Validate YAMLsemgrep --validate --config rule.yaml
Dump ASTsemgrep --dump-ast -l <lang> <file>
Debug taint flowsemgrep --dataflow-traces -f rule.yaml file

Documentation

© trailofbits, CC-BY-SA-4.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 5 other files (references, assets) in plugins/semgrep-rule-variant-creator/skills/semgrep-rule-variant-creator of trailofbits/skills.

  • SKILL.md
  • agents/openai.yaml
  • assets/trail-of-bits-mark.svg
  • references/applicability-analysis.md
  • references/language-syntax-guide.md
  • references/workflow.md

Open the folder on GitHubat commit 82fe822

Used in 5 other repositories

We found 14 copies of this SKILL.md (exact, near-identical or edited) in other folders, from 5 other GitHub owners. This page covers the copy in trailofbits/skills, which our catalogue first saw on October 7, 2026.

Compare with similar skills

Semgrep Rule Variant Creator next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Semgrep Rule Variant Creator compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Semgrep Rule Variant Creator this skilltrailofbits/skills7.4k5 repos~3.4kAutomated safety check: NotesCC-BY-SA-4.0
Semgrepvigolium/piolium1401 repos~2.4kAutomated safety check: NotesMIT
Sast SemgrepAgentSecOps/SecOpsAgentKit2202 repos~2.4kAutomated safety check: PassCustom licence
Semgrepwaybarrios/opencode-power-pack533—~2.4kAutomated safety check: PassMIT
Semgrepsemgrep/skills322—~2.3kAutomated safety check: PassCustom licence
Code Auditzhaoxuya520/reverse-skill40k2 repos~374Automated safety check: WarnMIT

Similar skills

  • Semgrep

    vigolium/piolium

    Run Semgrep static analysis scan on a codebase using parallel subagents.

    140 GitHub starsUsed in 1 repo~2.4k tokens
    SecurityAuto-check: notes
  • Sast Semgrep

    AgentSecOps/SecOpsAgentKit

    Static application security testing (SAST) using Semgrep for vulnerability detection, security code review, and secure coding guidance with OWASP and CWE framework mapping.

    220 GitHub starsUsed in 2 repos~2.4k tokens
    SecurityAuto-check passed
  • Semgrep

    waybarrios/opencode-power-pack

    Run Semgrep static analysis across a codebase, optionally using Semgrep Pro for cross-file taint analysis.

    533 GitHub stars~2.4k tokensUpdated 3 days ago
    SecurityAuto-check passed
  • Semgrep

    semgrep/skills

    Official

    Run Semgrep static analysis scans and create custom detection rules.

    322 GitHub stars~2.3k tokensUpdated 2 mo ago
    SecurityAuto-check passed
  • Code Audit

    zhaoxuya520/reverse-skill

    A skill your agent uses for authorized source-code security review and SAST workflows including Semgrep, CodeQL patterns, dangerous API hunting, and fix verification.

    40k GitHub starsUsed in 2 repos~374 tokens
    SecurityAuto-check: warnings
  • Sast Configuration

    davila7/claude-code-templates

    Static Application Security Testing (SAST) tool setup, configuration, and custom rule creation for comprehensive security scanning across multiple programming languages.

    32k GitHub starsUsed in 11 repos~1.6k tokens
    SecurityAuto-check passed

More from trailofbits/skills

All 79 skills in this repo
  • CodeQL Security Scan

    trailofbits/skills

    Official

    Scans a codebase for vulnerabilities with CodeQL's data flow and taint tracking in run-all or important-only modes, including data extensions for project-specific sources and sinks.

    7.4k GitHub stars~4.6k tokensUpdated yesterday
    Auto-check: notes
  • Code Graph Mermaid Diagrams

    trailofbits/skills

    Official

    Generates Mermaid diagrams from Trailmark code graphs, including call graphs, class hierarchies, module dependency maps, complexity heatmaps and attack surface data flows.

    7.4k GitHub stars~1.7k tokensUpdated yesterday
    Auto-check passed
  • Trailmark Graph Evolution

    trailofbits/skills

    Official

    Compares Trailmark code graphs at two snapshots, such as commits, tags or directories, to surface attack paths, blast radius and taint changes that text diffs miss.

    7.4k GitHub stars~3.4k tokensUpdated yesterday
    Auto-check passed
  • Let Fate Decide

    trailofbits/skills

    Official

    Draws a 12 Houses tarot spread to break ties when a request is vague or casually delegated, then reads the cards to pick the next step.

    7.4k GitHub stars~2.5k tokensUpdated yesterday
    Auto-check: notes
  • Semgrep Security Scan

    trailofbits/skills

    Official

    Detects languages, proposes rulesets for approval, then runs the approved Semgrep scan across a codebase and merges the output into one SARIF file.

    7.4k GitHub stars~3.7k tokensUpdated yesterday
    Auto-check: notes
  • Burp Suite Project Parser

    trailofbits/skills

    Official

    Searches and extracts data from Burp Suite project files on the command line: regex searches over responses, audit findings, proxy history and site map data.

    7.4k GitHub starsUsed in 3 repos~4.2k tokens
    Auto-check: notes

Works with

Categories

Questions about Semgrep Rule Variant Creator

What does Semgrep Rule Variant Creator do?

Creates language variants of existing Semgrep rules. An agent skill from trailofbits/skills. Semgrep Rule Variant Creator is an agent skill from trailofbits/skills, published by the product's own GitHub organization. Creates language variants of existing Semgrep rules.

When should I use Semgrep Rule Variant Creator?

Semgrep Rule Variant Creator fits situations like: porting a Semgrep rule to specified target languages; tasks that involve Static analysis and SAST.

How do I install Semgrep Rule Variant Creator in Claude Code?

Run `npx skills add trailofbits/skills --skill semgrep-rule-variant-creator -a claude-code`. Or copy the skill folder (plugins/semgrep-rule-variant-creator/skills/semgrep-rule-variant-creator in trailofbits/skills) into .claude/skills/semgrep-rule-variant-creator in your project. Claude Code loads it when a task matches its description.

How do I install Semgrep Rule Variant Creator in Codex?

Run `npx skills add trailofbits/skills --skill semgrep-rule-variant-creator -a codex`. Or copy the skill folder (plugins/semgrep-rule-variant-creator/skills/semgrep-rule-variant-creator in trailofbits/skills) into .agents/skills/semgrep-rule-variant-creator in your project. Codex loads it when a task matches its description.

Can I use Semgrep Rule Variant Creator in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add trailofbits/skills --skill semgrep-rule-variant-creator -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/semgrep-rule-variant-creator, .gemini/skills/semgrep-rule-variant-creator, .github/skills/semgrep-rule-variant-creator and .opencode/skills/semgrep-rule-variant-creator in your project.

What does Semgrep Rule Variant Creator need to run?

Going by SKILL.md and its folder, Semgrep Rule Variant Creator needs the command-line tools its instructions call (semgrep). Its frontmatter pre-approves these tools: Bash, Read, Write, Edit, Glob, Grep, WebFetch, Workflow.

Does Semgrep Rule Variant Creator access the network?

SKILL.md names 2 domains. As links in the text: semgrep.dev and appsec.guide. This is read from the text; nothing was executed.

Is Semgrep Rule Variant Creator safe to install?

Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.

What licence does Semgrep Rule Variant Creator use?

Semgrep Rule Variant Creator is published under the CC-BY-SA-4.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Semgrep Rule Variant Creator use?

About 3.4k tokens (SKILL.md is roughly 14k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 5.4k tokens, read only when the agent opens those files.

What are the alternatives to Semgrep Rule Variant Creator?

Skills that share tags, products or a category with Semgrep Rule Variant Creator: Semgrep (vigolium/piolium, 140 stars), Sast Semgrep (AgentSecOps/SecOpsAgentKit, 220 stars), Semgrep (waybarrios/opencode-power-pack, 533 stars) and Semgrep (semgrep/skills, 322 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Semgrep Rule Variant Creator?

trailofbits (a GitHub organization, an official publisher) maintains it in trailofbits/skills, which has 7,440 GitHub stars. The repository holds 79 skills in this directory. The repository was last updated on October 7, 2026.

Source: trailofbits/skills on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.