Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add commands/bvdr/claude-plugins/evaluategit clone --depth 1 https://github.com/bvdr/claude-pluginsWhat it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5 | $0.00037 | $0.01569 |
| Opus 5 | $0.00018 | $0.00785 |
| Sonnet 5 | $0.00007 | $0.00314 |
| Haiku 4.5 | $0.00004 | $0.00157 |
Grade A, and why
evaluate scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured yesterday.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 174 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Gemini Evaluate
Get an independent evaluation of Claude's last output from Google's Gemini.
Pre-flight
- Run
echo $GEMINI_API_KEYin Bash - If empty, tell the user:
Then stop.GEMINI_API_KEYis not set. Get one at https://aistudio.google.com/apikey and add to your shell config (~/.zshrc,~/.bashrc, etc.):export GEMINI_API_KEY="your-key-here" - Optionally check
echo $GEMINI_MODEL— defaults togemini-pro-latest(always points to the latest stable Gemini Pro). User can override with any model name (e.g.gemini-3.1-pro-preview,gemini-2.5-pro,gemini-flash-latest).
What to Evaluate
Determine the content to evaluate:
- If the user provided specific context (e.g.
/evaluate this planor/evaluate the migration approach) — use that specific content from the conversation - Otherwise — use YOUR (Claude's) last full assistant message before this skill was invoked
IMPORTANT: Always include BOTH the user's original request AND your response. Gemini cannot evaluate an answer without knowing the question. Format it as:
USER REQUEST:
<the user's message that prompted your response>
ASSISTANT RESPONSE:
<your response being evaluated>
Write the content to /tmp/gemini-eval-content.json as a JSON file using Node. This avoids all escaping issues:
node -e "
const fs = require('fs');
const content = fs.readFileSync('/dev/stdin', 'utf8');
fs.writeFileSync('/tmp/gemini-eval-content.json', JSON.stringify(content));
" << 'EVAL_INPUT_END'
<paste the user request + assistant response here>
EVAL_INPUT_END
If the content contains EVAL_INPUT_END, use Node to write it directly:
node -e "
const fs = require('fs');
fs.writeFileSync('/tmp/gemini-eval-content.json', JSON.stringify(\`<content here, backtick escaped>\`));
"
Call Gemini API
Run this Node script. It builds the prompt, calls the API, and writes the raw response to /tmp/gemini-eval-response.md:
node -e "
const https = require('https');
const fs = require('fs');
const apiKey = process.env.GEMINI_API_KEY || '';
const model = process.env.GEMINI_MODEL || 'gemini-pro-latest';
if (!apiKey) { console.error('Error: GEMINI_API_KEY not set'); process.exit(1); }
const content = JSON.parse(fs.readFileSync('/tmp/gemini-eval-content.json', 'utf8'));
const systemPrompt = \`You are an expert technical reviewer providing a second opinion on AI-generated output.
Evaluate the following content critically and constructively. Cover:
1. **Correctness** — Are there factual errors, wrong assumptions, or flawed logic?
2. **Completeness** — What's missing? Any blind spots or edge cases not addressed?
3. **Quality** — Is it well-structured, clear, and actionable?
4. **Risks** — Any potential issues, security concerns, or pitfalls?
5. **Suggestions** — Concrete improvements, alternatives, or things to reconsider.
Be direct. If it's good, say so briefly and focus on what could be better. If it's bad, explain why.
---
CONTENT TO EVALUATE:
\` + content;
const payload = JSON.stringify({
contents: [{ parts: [{ text: systemPrompt }] }],
generationConfig: { temperature: 0.7, maxOutputTokens: 32768 }
});
const url = new URL(\`https://generativelanguage.googleapis.com/v1beta/models/\${model}:generateContent?key=\${apiKey}\`);
const req = https.request({
hostname: url.hostname,
path: url.pathname + url.search,
method: 'POST',
headers: { 'Content-Type': 'application/json', 'Content-Length': Buffer.byteLength(payload) }
}, (res) => {
let body = '';
res.on('data', (chunk) => body += chunk);
res.on('end', () => {
try {
const result = JSON.parse(body);
if (result.error) {
console.error('Gemini API error: ' + result.error.message);
console.error('Tip: set GEMINI_MODEL to a current model like gemini-pro-latest or gemini-flash-latest.');
process.exit(1);
}
const candidate = result.candidates && result.candidates[0];
const text = candidate && candidate.content && candidate.content.parts && candidate.content.parts[0] && candidate.content.parts[0].text;
if (!text) {
const reason = candidate && candidate.finishReason;
if (reason === 'MAX_TOKENS') {
console.error('Gemini hit MAX_TOKENS before producing output (likely all tokens consumed by thinking). Increase maxOutputTokens or use a non-thinking model like gemini-flash-latest.');
} else {
console.error('Gemini returned no text. finishReason=' + reason + '. Raw: ' + body.slice(0, 500));
}
process.exit(1);
}
fs.writeFileSync('/tmp/gemini-eval-response.md', text);
console.log('Gemini response saved to /tmp/gemini-eval-response.md (model: ' + (result.modelVersion || model) + ')');
} catch (e) {
console.error('Failed to parse response: ' + body.slice(0, 500));
process.exit(1);
}
});
});
req.on('error', (e) => { console.error('Request failed: ' + e.message); process.exit(1); });
req.setTimeout(120000, () => { req.destroy(); console.error('Request timed out'); process.exit(1); });
req.write(payload);
req.end();
"
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- yesterday First seen · 174 lines · 37 tokens per session scan A a811befd506f
evaluate is a command published in the GitHub repository bvdr/claude-plugins (3 stars, last pushed 2mo ago), licensed MIT. It adds 37 tokens to every session and 1,569 once invoked, about $0.0002 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other commands, from other repositories
dead-code-scan
Scan for dead code, unused imports, duplicates, and zombie code across the project.
dead-code-clean
Actively find and remove dead code, unused imports, duplicates, and zombie code.
esp-teach
One-time project setup -- discover hardware, find datasheets, persist context to CLAUDE.md.
swift-critique
Critique SwiftUI code for patterns, design, clean code, accessibility, and performance.
dotnet-harden
Scan and harden .NET backend code against high-impact anti-patterns such as sync-over-async, lifetime bugs, fat endpoints, and fragile SignalR state.
dotnet-teach
One-time setup that scans a .NET backend project, learns its conventions and architecture, and writes them to CLAUDE.md for future sessions.