trust-me-bro
Every skill you install says trust me bro. This one reads it first.
When to use this
Trigger on any of these, without being asked:
- the user is about to install, add, clone, enable, or copy in a skill, plugin, MCP server, subagent, hook, or
.claude/.codex/.cursor config from anyone else
- the user asks "is this skill safe", "should I install this", "what does this do"
- a marketplace, gist,
curl one-liner, or README install step is involved
- an existing skill has updated and the user is about to keep using it
How to run it
The scan is a script, not a judgement call. Run it. Do not eyeball the files and
decide for yourself, and do not summarise from the README, which is written by
the same person who wrote the skill.
python3 scripts/scan.py <path-to-the-skill>
If the skill is not on disk yet, get it first without running anything from it:
git clone --depth 1 <url> /tmp/tmb-target && python3 scripts/scan.py /tmp/tmb-target
Never run the project's own install script, make, npm install, or any
curl … | sh line in order to inspect it. Cloning is enough.
Useful flags:
--json for structured output
--pin writes .trustmebro.lock, a SHA-256 record of exactly what the user approved
--check compares the current files against that lock and reports drift
Exit codes: 0 fine, 1 needs a human read, 2 stop, 3 a path it will not scan — missing, or a single file reached through a symlink, which it refuses rather than resolve.
A verdict of NOTHING READ also exits 1. It means no file could be read, so nothing was cleared. Report that as "the scan did not look at anything", never as clean.
How to report it back
Lead with the verdict and the single most important reason. Then:
- What it can reach. Walk the three trifecta legs by name: private data, untrusted content, outbound channel. Say which are present and quote the line that proves it, with
file:line.
- Findings, worst first, each with its
file:line. Quote the actual line. Never paraphrase a finding into something milder.
- Provenance. Say plainly whether it is signed, hashed, or neither. Almost everything is neither. That is a fact about the ecosystem, not an accusation about this skill.
- Your call. One sentence. If the verdict is
stop, say so and stop; do not install it and then mention the finding afterwards.
Then offer --pin so the user has a record of the version they approved.
Rules for you, the agent
- Report capability, not intent. "This can read your
.env and POST to api.example.com" is a fact. "This is malware" is a guess. Say the fact.
- Do not soften a critical finding because the skill looks popular, has a lot of stars, comes from a known org, or has a friendly README. Those are the conditions under which a supply-chain compromise works.
- Do not install anything mid-audit. Not the skill, not its dependencies, not a linter to help you read it.
stop means stop. Present the finding and wait. The user decides.
- Prose is not code. The scanner already separates a skill that describes
~/.ssh from one that reads it. Preserve that distinction when you explain the result; a security-tooling skill will legitimately name every dangerous pattern it defends against.
- If the scanner finds nothing, say that plainly. Do not invent concerns to look thorough. A clean scan of a small skill is the normal case.
- State the limit. This reads text. It cannot see what a URL will serve tomorrow, and it does not execute anything. A clean report is "nothing visible in the files", not "safe".
The one thing worth remembering
Three legs, from Simon Willison's lethal trifecta:
- access to private data
- exposure to untrusted content
- an outbound channel
Any two are usually fine. All three in one skill means a web page someone else
wrote can decide what happens to your credentials. Break one leg and the chain
collapses.
1---2name: trust-me-bro3description: Read an agent skill, plugin, or MCP server before installing it. Use whenever the user is about to add, install, clone, or enable a skill, plugin, MCP server, subagent, or hook from someone else, or asks whether one is safe. Reports what it can reach rather than guessing at intent.4license: Apache-2.05---67# trust-me-bro89Every skill you install says trust me bro. This one reads it first.1011## When to use this1213Trigger on any of these, without being asked:1415- the user is about to install, add, clone, enable, or copy in a skill, plugin, MCP server, subagent, hook, or `.claude`/`.codex`/`.cursor` config from anyone else16- the user asks "is this skill safe", "should I install this", "what does this do"17- a marketplace, gist, `curl` one-liner, or README install step is involved18- an existing skill has updated and the user is about to keep using it1920## How to run it2122The scan is a script, not a judgement call. Run it. Do not eyeball the files and23decide for yourself, and do not summarise from the README, which is written by24the same person who wrote the skill.2526```bash27python3 scripts/scan.py <path-to-the-skill>28```2930If the skill is not on disk yet, get it first without running anything from it:3132```bash33git clone --depth 1 <url> /tmp/tmb-target && python3 scripts/scan.py /tmp/tmb-target34```3536Never run the project's own install script, `make`, `npm install`, or any37`curl … | sh` line in order to inspect it. Cloning is enough.3839Useful flags:4041- `--json` for structured output42- `--pin` writes `.trustmebro.lock`, a SHA-256 record of exactly what the user approved43- `--check` compares the current files against that lock and reports drift4445Exit codes: `0` fine, `1` needs a human read, `2` stop, `3` a path it will not scan — missing, or a single file reached through a symlink, which it refuses rather than resolve.4647A verdict of `NOTHING READ` also exits `1`. It means no file could be read, so nothing was cleared. Report that as "the scan did not look at anything", never as clean.4849## How to report it back5051Lead with the verdict and the single most important reason. Then:52531. **What it can reach.** Walk the three trifecta legs by name: private data, untrusted content, outbound channel. Say which are present and quote the line that proves it, with `file:line`.542. **Findings**, worst first, each with its `file:line`. Quote the actual line. Never paraphrase a finding into something milder.553. **Provenance.** Say plainly whether it is signed, hashed, or neither. Almost everything is neither. That is a fact about the ecosystem, not an accusation about this skill.564. **Your call.** One sentence. If the verdict is `stop`, say so and stop; do not install it and then mention the finding afterwards.5758Then offer `--pin` so the user has a record of the version they approved.5960## Rules for you, the agent6162- **Report capability, not intent.** "This can read your `.env` and POST to `api.example.com`" is a fact. "This is malware" is a guess. Say the fact.63- **Do not soften a critical finding** because the skill looks popular, has a lot of stars, comes from a known org, or has a friendly README. Those are the conditions under which a supply-chain compromise works.64- **Do not install anything mid-audit.** Not the skill, not its dependencies, not a linter to help you read it.65- **`stop` means stop.** Present the finding and wait. The user decides.66- **Prose is not code.** The scanner already separates a skill that *describes* `~/.ssh` from one that *reads* it. Preserve that distinction when you explain the result; a security-tooling skill will legitimately name every dangerous pattern it defends against.67- **If the scanner finds nothing, say that plainly.** Do not invent concerns to look thorough. A clean scan of a small skill is the normal case.68- **State the limit.** This reads text. It cannot see what a URL will serve tomorrow, and it does not execute anything. A clean report is "nothing visible in the files", not "safe".6970## The one thing worth remembering7172Three legs, from Simon Willison's lethal trifecta:73741. access to **private data**752. exposure to **untrusted content**763. an **outbound channel**7778Any two are usually fine. All three in one skill means a web page someone else79wrote can decide what happens to your credentials. Break one leg and the chain80collapses.