Semgrep
vigolium/piolium
Run Semgrep static analysis scan on a codebase using parallel subagents.
Analyze an OpenTaint scan's dropped external methods and decide which of them are propagators and optionally sinks.
$ npx skills add seqra/opentaint --skill analyze-external-methods -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install seqra/opentaint analyze-external-methods --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/seqra/opentaint.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/analyze-external-methods .claude/skills/analyze-external-methods && rm -rf skills-srcUse ~/.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/
Install the "analyze-external-methods" agent skill from https://github.com/seqra/opentaint/tree/main/skills/analyze-external-methods into .claude/skills/analyze-external-methods/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "analyze-external-methods", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/seqra/opentaint/tree/main/skills/analyze-external-methodsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add seqra/opentaint --skill analyze-external-methods -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install seqra/opentaint analyze-external-methods --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/seqra/opentaint.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/analyze-external-methods .agents/skills/analyze-external-methods && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "analyze-external-methods" agent skill from https://github.com/seqra/opentaint/tree/main/skills/analyze-external-methods into .agents/skills/analyze-external-methods/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "analyze-external-methods", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add seqra/opentaint --skill analyze-external-methods -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install seqra/opentaint analyze-external-methods --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/seqra/opentaint.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/analyze-external-methods .cursor/skills/analyze-external-methods && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "analyze-external-methods" agent skill from https://github.com/seqra/opentaint/tree/main/skills/analyze-external-methods into .cursor/skills/analyze-external-methods/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "analyze-external-methods", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/seqra/opentaint.git --path skills/analyze-external-methods--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add seqra/opentaint --skill analyze-external-methods -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install seqra/opentaint analyze-external-methods --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/seqra/opentaint.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/analyze-external-methods .gemini/skills/analyze-external-methods && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "analyze-external-methods" agent skill from https://github.com/seqra/opentaint/tree/main/skills/analyze-external-methods into .gemini/skills/analyze-external-methods/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "analyze-external-methods", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install seqra/opentaint analyze-external-methodsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add seqra/opentaint --skill analyze-external-methods -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/seqra/opentaint.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/analyze-external-methods .github/skills/analyze-external-methods && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "analyze-external-methods" agent skill from https://github.com/seqra/opentaint/tree/main/skills/analyze-external-methods into .github/skills/analyze-external-methods/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "analyze-external-methods", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add seqra/opentaint --skill analyze-external-methods -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install seqra/opentaint analyze-external-methods --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/seqra/opentaint.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/analyze-external-methods .opencode/skills/analyze-external-methods && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "analyze-external-methods" agent skill from https://github.com/seqra/opentaint/tree/main/skills/analyze-external-methods into .opencode/skills/analyze-external-methods/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "analyze-external-methods", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
analyze-external-methodsAnalyze an OpenTaint scan's dropped external methods and decide which of them are propagators and optionally sinks.
Analyze External Methods is an agent skill from seqra/opentaint. Analyze an OpenTaint scan's dropped external methods and decide which of them are propagators and optionally sinks. Use when a dropped-external-methods.yaml needs classification for dropped method type
Its SKILL.md is about 3.2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 4 other files, including scripts and reference files (for example `references/java.md` and `scripts/check-coverage.py`).
It sits in Security, covering Static analysis and SAST. The repository describes itself as: The open source taint analysis engine for the AI era. A formal dataflow analysis tool you can customize and self-host, built so AI agents drive your application security analysis… The licence is Apache-2.0.
4 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit f945f92. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Ships 1 file in scripts/ (Python), which the agent can run.
Shell commands in SKILL.md call:
uvFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use uv, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Analyze External Methods loads about 3.2k tokens when it runs, and up to ~3.8k if it reads all its reference files. Until then it costs about 57 tokens; SKILL.md has 1,779 words of instructions outside code blocks.
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.
The automated check found no risky patterns in SKILL.md.
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); the scripts in this folder are not scanned.
The full file from seqra/opentaint at commit f945f92, republished under its Apache-2.0 licence (© seqra). 1,779 words, ~3,196 tokens.
.claude/skills/analyze-external-methods/SKILL.md (or your agent's skills folder). This skill also uses 2 other files; get the full folder from GitHub.OpenTaint is a dataflow taint analyzer: it starts from the data a source introduces and follows it call by call until the flow stops. A flow stops for one of two reasons — the data reached a callable that retains none of it (call size() on a tainted collection and its whole contents collapse into one number, so the taint is gone), or it reached a callable whose body the analyzer can't see, typically in an external dependency. That opaque callable may itself be taint-killing, or it may in fact carry the data onward — and then it needs an approximation telling the engine exactly how the data moves through the call, or every trace through it is silently cut.
You are handed the list of those dropped methods. Decide which ones actually carry data and which don't, and for each carrier determine the kind of approximation it needs, so the build stage can restore the flow.
On a deep run these same methods carry a second, independent question — whether the call is itself a dangerous operation (a sink); that pass is step 2.
Provided by the caller, fall back to the default value when omitted. Ask back only when a required input is missing and has no sensible default
project-root (optional) — root of the target project. Opentaint keeps all analysis artifacts under the fixed <project-root>/.opentaint/ directory, so every .opentaint/... path below resolves there. Default: current directorylanguage (required) — target language for this project and language-specific instructionsplan (required) — path to this agent's batch plan .opentaint/tracking/approximations/plans/<batch>.yaml: the dropped methods to classifysinks (optional) — a flag whether to classify sinks per step 2 or notTake the members from the plan's scopes, judge each one, and write the verdict to the batch file .opentaint/tracking/approximations/<batch>.yaml — <batch> is your plan's filename stem, the batch id, reused for the coverage check below.
Always classify from the method's real code, never from its name. Start by reading the method's source — <skill-dir>/references/<language>.md describes how to get it. Then answer, for each method: where does its input data go? Data that arrives on the receiver or an argument — does it come back out, through the return value, an argument the method writes into, the receiver, or an object or field it stores the data in? That answer picks the bucket:
passthrough — the method carries the data by a plain copy from one place to another: a getter, a simple arg-to-result copy, a builder, a writer that stashes the argument into the receiver or another object, a collection put-then-get, and the likedataflow — the method carries the data through a function, lambda, or callback parameter, or an async chain. Choose it over passthrough when the tainted data actually travels through that functional argument. Prefer it too whenever the data does flow but not by a plain copy you can point at between positions — the propagation is opaque or too complex to name as a passThrough edge — since a dataflow model is real code and can reproduce any behaviourskipped — the method carries the data nowhere, give a short reason. This is exactly where a flow ends. A few examples: a predicate or inspector that only tests, compares, or measures its input (handing back a boolean or a number); a conversion that collapses the data into a scalar that no longer holds it (a size, a parse into a number, a one-way hash — the size() from the preamble); a side-effect that keeps none of the data. These are illustrations of the idea, not a closed list — many methods and cases fall outside it, so decide each on what its code doesThe common trap is skipping an implicit carrier — a method that moves its data somewhere other than the plain return value. A void method that writes its argument into the receiver or another object still carries the data: it lives on in that object and the flow continues. A sanitizer or encoder is a carrier too — it returns a transformed copy of its input, so the data flows through it; model it, never skip it (whether the transform actually neutralizes the taint is settled later by the rules, not here). When in doubt, model it: over-approximating an inert method is cheap, dropping a real carrier is a false negative the run can't recover.
An opaque external key-value store — a cache, a Redis/DB template, a session map, anything whose data lives outside the process — is a carrier too, not a dead end: a value written by a put/set survives the round trip, so a later get can hand attacker-controlled data back. Model both ends as passthrough. Only the key-only or boolean operations that move no value — delete, exists, hasKey, size — are skipped.
Every entry records the method's signature from the plan, so overloads stay distinct — a differently-propagating overload is its own entry. Placing each method in its bucket is all that's needed here; the build stage reads the method's own code to model exactly how the data moves.
A dropped method may be application-internal, not only library code — the analyzer drops it when its body is opaque to it (native, abstract, generated). Classify it the same way, by what its code does.
When the sinks input is set, make a second pass over the same members for a different property: is the method a sink? A sink is a security-sensitive operation that turns into a vulnerability once attacker-controlled data reaches it — the call executes or interprets its input, or acts on it against a sensitive resource, in a way that can be abused: running it as a query or OS command, using it as a file path or URL, deserializing it, rendering it into output, or resolving it through reflection or a naming/directory lookup, among many others.
Judge sink-ness from the method's own code and behaviour, independent of how the project uses it — don't trace whether taint can actually reach the call, that is the analyzer's job. And judge it apart from propagation: the propagation verdict never settles sink-ness, and finding a sink never changes it. Sinks might sit among the carriers you just modeled, and a skipped method can be a sink too — carrying nothing onward says nothing about whether the call itself is dangerous.
Record each sink in its owning package's sink unit .opentaint/tracking/rules/sinks/<package-kebab>.yaml (per Tracking), grouped under the vulnerability tag that describes what unsafe use it performs. Read .opentaint/tracking/rules/tags.yaml first and reuse an existing tag whenever its semantics fit. If none fits, choose one precise canonical kebab-case *-sink tag, add it to the registry first, then create that group. The tag names the reusable sink family, not an individual method.
tags.yaml is the only shared file in this fan-out. Edit it only for a genuinely new tag: re-read it immediately before the additive edit and preserve every tag another leaf may already have added. Ordinary classification that reuses a registered tag never writes the registry.
After classifying, run the bundled check from the project root over your plan:
uv run <skill-dir>/scripts/check-coverage.py --batch <batch>Pass your <batch>. It lists every batch method not yet in a classification bucket. Classify each one it prints and re-run until it reports 0 UNCOVERED. Don't return while anything is uncovered.
Before returning, review each method you skipped and confirm that it truly moves no data — the name is not good enough evidence. Get back to step 1 to reclassify any method that appeared to be carrier and remove it from skipped. Keep only methods proven non-carriers by their code
Short and concise report of what was done
.opentaint/tracking/approximations/<batch>.yaml — the batch classification (per Tracking).opentaint/tracking/rules/sinks/<package-kebab>.yaml — the per-package sink units, when sinks was set (per Tracking)sinks was setcheck-coverage.py --batch <batch> reports 0 UNCOVERED.opentaint/tracking/approximations/<batch>.yaml — one batch's callable classification, <batch> the plan's filename stem. Every callable sits in exactly one verdict bucket, keyed with the exact language-specific method and signature from the plan so distinct variants stay separate:
passthrough, dataflow — modeled carriers; each entry { method, signature }skipped — terminal non-carriers; each { method, signature, reason }engine_issues — a separate bucket for carriers the engine provably can't propagate (built but still dropped); each { method, signature, reason }. Terminal and treated just like skipped — the only difference is the reason. merge-skipped carries it into skipped.yaml as its own engine_issues group alongside the regular skipped methods.dependencies lists the dependency identifiers a dataflow test project needs. The build block tracks the build — test_project records each dataflow method's test-project status (done if a sample was written into the batch's test project, failed if none could be written so the method was excluded from it), and done holds the finished { method, signature }. Keep it clear from comments
passthrough:
- { method: "<qualified-member-a>", signature: "<language-signature-a>" }
dataflow:
- { method: "<qualified-member-b>", signature: "<language-signature-b>" }
skipped:
- { method: "<qualified-member-c>", signature: "<language-signature-c>", reason: "retains none of its input data" }
engine_issues: []
dependencies: []
build:
test_project:
- { method: "<qualified-member-b>", signature: "<language-signature-b>", status: done }
done: []This skill writes passthrough/dataflow/skipped and dependencies; leave the build block and engine_issues alone — they are filled later in the approximation stage.
sinks is set).opentaint/tracking/rules/sinks/<package-kebab>.yaml — one sink unit per package (a dependency can span several packages, each its own unit), the file named for that package with . → -. dependencies names the dependency the package comes from. groups partitions the package's dangerous operations by reusable sink tag; each group is { tag, sinks }, and each sink is { method, signature, note, rule_id }. The tag belongs to the group, never to an individual method: one rule may cover several methods and several rules may extend the same vulnerability family. method and signature use the exact language-specific identifiers from the plan. stages tracks the unit through rule authoring. Keep it clear from comments
dependencies:
- <dependency-id>
groups:
- tag: path-traversal-sink
sinks:
- { method: "<qualified-member>", signature: "<language-signature>", note: writes data to an untrusted path, rule_id: null }
stages:
test_project: pending
tests_passing: pendingThe partition keeps a whole package in one batch, so populate only the units your plan owns. Leave rule_id: null and the stages for rule authoring. If a package already has a unit from a prior round, merge new methods into the matching tag group rather than rewriting it.
OpenTaint is a whole-program, interprocedural, field-sensitive alias analysis engine. It already propagates through visible application code, calls, aliases, and individual fields; custom rules and approximations model only the assigned source, sink, or opaque-method boundary. Compile-time constants and literals carry no taint, so a source or carrier whose output is only a constant introduces nothing.
check-coverage.py --batch must report 0 UNCOVERED before you return© seqra, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 2 other files (scripts, references) in skills/analyze-external-methods of seqra/opentaint.
Open the folder on GitHubat commit f945f92
Analyze External Methods 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.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Analyze External Methods this skillseqra/opentaint | 162 | — | ~3.2k | Automated safety check: Pass | Apache-2.0 | |
| Semgrepvigolium/piolium | 140 | 1 repos | ~2.4k | Automated safety check: Notes | MIT | |
| C To AstNarwhal-Lab/MagicSkills | 316 | — | ~1.1k | Automated safety check: Pass | MIT | |
| Semgrep Security Scantrailofbits/skills | 7.4k | — | ~3.7k | Automated safety check: Notes | CC-BY-SA-4.0 | |
| LLM Sast ScannerSunWeb3Sec/llm-sast-scanner | 286 | — | ~6.2k | Automated safety check: Pass | None | |
| Sast SemgrepAgentSecOps/SecOpsAgentKit | 220 | 2 repos | ~2.4k | Automated safety check: Pass | Custom licence |
vigolium/piolium
Run Semgrep static analysis scan on a codebase using parallel subagents.
Narwhal-Lab/MagicSkills
Parse C source code into an Abstract Syntax Tree (AST). An agent skill from Narwhal-Lab/MagicSkills.
trailofbits/skills
Detects languages, proposes rulesets for approval, then runs the approved Semgrep scan across a codebase and merges the output into one SARIF file.
SunWeb3Sec/llm-sast-scanner
General-purpose Static Application Security Testing (SAST) skill for code vulnerability analysis.
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.
netdata/netdata
Inspect, review or triage GitHub Code Scanning alerts, including CodeQL findings; apply verified dismissals when authorized.
seqra/opentaint
Model a method's taint propagation as code-based dataflow approximation and refine it against a test project until the sample passes.
seqra/opentaint
Run one stage of the OpenTaint pipeline by coordinating leaf subagents and deterministic joins.
seqra/opentaint
Run an end-to-end OpenTaint application-security analysis while owning the long project build and scans and delegating each other pipeline stage.
seqra/opentaint
Build a target project into an opentaint project model. An agent skill from seqra/opentaint.
seqra/opentaint
Model a method's taint propagation as a passThrough approximation.
seqra/opentaint
Author and verify an OpenTaint rule. An agent skill from seqra/opentaint.
Categories
Analyze an OpenTaint scan's dropped external methods and decide which of them are propagators and optionally sinks. Analyze External Methods is an agent skill from seqra/opentaint. Analyze an OpenTaint scan's dropped external methods and decide which of them are propagators and optionally sinks.
Analyze External Methods fits situations like: A dropped-external-methods.yaml needs classification for dropped method type; tasks that involve Static analysis and SAST.
Run `npx skills add seqra/opentaint --skill analyze-external-methods -a claude-code`. Or copy the skill folder (skills/analyze-external-methods in seqra/opentaint) into .claude/skills/analyze-external-methods in your project. Claude Code loads it when a task matches its description.
Run `npx skills add seqra/opentaint --skill analyze-external-methods -a codex`. Or copy the skill folder (skills/analyze-external-methods in seqra/opentaint) into .agents/skills/analyze-external-methods in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add seqra/opentaint --skill analyze-external-methods -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/analyze-external-methods, .gemini/skills/analyze-external-methods, .github/skills/analyze-external-methods and .opencode/skills/analyze-external-methods in your project.
Going by SKILL.md and its folder, Analyze External Methods needs Python for the scripts in its folder and the command-line tools its instructions call (uv). Our summary lists: Python 3.
SKILL.md contains no URLs. Its commands use uv, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.
Analyze External Methods is published under the Apache-2.0 licence (declared in SKILL.md). It allows redistribution, so the full SKILL.md is shown on this page.
About 3.2k tokens (SKILL.md is roughly 13k 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 583 tokens, read only when the agent opens those files.
Skills that share tags, products or a category with Analyze External Methods: Semgrep (vigolium/piolium, 140 stars), C To Ast (Narwhal-Lab/MagicSkills, 316 stars), Semgrep Security Scan (trailofbits/skills, 7.4k stars) and LLM Sast Scanner (SunWeb3Sec/llm-sast-scanner, 286 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
seqra (a GitHub organization) maintains it in seqra/opentaint, which has 162 GitHub stars. The repository holds 16 skills in this directory. The repository was last updated on October 7, 2026.
Source: seqra/opentaint on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.