Audit installed tessl skills for security risks and generate a formatted security report with per-skill risk levels and an overall project risk score
94
Quality
94%
Does it follow best practices?
Impact
Pending
No eval scenarios have been run
Advisory
Suggest reviewing before use
You're running a security audit of the tessl skills installed in this project, using Snyk security scores from the Tessl Registry. Your job is to surface real, registry-verified security findings so the user can make an informed decision about each skill they have installed.
Every skill in the Tessl Registry carries a Snyk security score, powered by Snyk's scanning engine (built on research from Invariant Labs). The scanner is purpose-built for agent skills — it analyzes the behavioral intent behind skill instructions, not just code. This is important because skills are written in natural language, and malicious intent can be embedded in plain English instructions just as easily as in code.
Snyk's ToxicSkills research scanned nearly 4,000 public skills and found that 36% contained prompt injection techniques — instructions designed to hijack agent behavior. The range of risks is broad, from prompt injection to data exfiltration to social engineering.
The scan covers eight categories:
Read tessl.json from the project root. Parse the dependencies block to identify every package and the skills it includes. Note the version and source URL for each.
If tessl.json is missing or has no dependencies, tell the user there are no installed skills to audit and stop.
For each dependency in tessl.json, determine its source type, then construct the correct registry URL.
Check the source field in tessl.json for each dependency:
"source": "git" (with a GitHub URL) → GitHub-hosted"source": "registry" → Tessl-nativeYou can confirm by running tessl search {tile-name} via the CLI: GitHub-hosted skills appear as from github:{org}/{repo} in results; Tessl-native tiles do not have a github: prefix.
Tessl-native tiles use:
https://tessl.io/registry/{workspace}/{tile}/securityExample: tessl-labs/skills-security-audit →
https://tessl.io/registry/tessl-labs/skills-security-audit/securityGitHub-hosted skills use:
https://tessl.io/registry/skills/github/{org}/{repo}/{skill-name}/securityThe {skill-name} comes from the include.skills array in tessl.json, not the repo name. Example: anthropics/skills with skill skill-creator →
https://tessl.io/registry/skills/github/anthropics/skills/skill-creator/securityFetch each URL with WebFetch. Extract the Snyk score, verdict, and all finding details — category, description, and the specific reason it was flagged.
If you get a 404, the tile is either private or has been removed from the registry — flag it as ❓ Unavailable. Do not guess alternative URL patterns.
Gather data for all skills before writing the report.
Use this exact structure:
[N] skills · [date]
| Skill | Version | Verdict | Findings |
|---|---|---|---|
workspace/skill | v0.0.0 | 🚨 Critical | Brief finding summary |
workspace/skill | v0.0.0 | ⚠️ Advisory | Brief finding summary |
workspace/skill | v0.0.0 | ✅ Clean | — |
workspace/skill | v0.0.0 | ❓ Unavailable | — |
Order rows by concern level: 🚨 Critical first, then ⚠️ Advisory, then ✅ Clean, then ❓ Unavailable.
For any row with findings, add a single line below the table explaining what the skill actually does that triggered the finding in plain English.
Recommendation: One or two sentences maximum. Only include if there's something actionable — if everything is clean, say so in one sentence and stop.