Claude Code, Skill
skills
aif dev-cycle skills (advise, brainstorm, research, plan, serve, debug, fix, test, code-review, git, ship, recon and more) with 14 aif agents, rules, guard hooks and the aif-install installer for Claude Code, Codex, OMP and Cursor.
Compatibility: Not stated.
Grade B
Minor issues only, no Medium or High. Worth a quick look at the findings below before installing.
Not a guarantee. A hygiene check of the source at the commit shown, not a security audit.
PERMISSION_DELETE_FILES NETWORK_NO_FIXED_HOST NETWORK_UNNAMED_HOST SECRETS_PATH_DOTENV OBFUSCATION_ENCODED_BLOB SECRETS_ENV_READ
Why this grade
- PERMISSION_DELETE_FILES Low
Contains a call that can delete files.
hooks/privacy-block.cjs, line 156
try { fs.unlinkSync(filePath); } catch { /* concurrent prune or consume */ } - NETWORK_NO_FIXED_HOST Low
Makes a network call whose host is not written as a fixed address.
skills/engineering/aif-chrome-profile/references/mcp-config-recipes.md, line 86
curl -s http://127.0.0.1:9222/json/version - NETWORK_UNNAMED_HOST Low
Calls a fixed host that the description does not name.
skills/engineering/aif-chrome-profile/references/mcp-config-recipes.md, line 86
curl -s http://127.0.0.1:9222/json/version - SECRETS_PATH_DOTENV Low
Mentions a .env file.
hooks/privacy-block.cjs, line 8
* 1. The model reads, writes, or edits ".env" -> DENIED (exit 2). The denial - OBFUSCATION_ENCODED_BLOB Low
Contains a long base64 shaped string in a file that should be readable.
docs/deck/index.html, line 1
<!doctype html> - SECRETS_ENV_READ Note
Reads an environment variable whose name contains KEY, SECRET, TOKEN, PASSWORD or CREDENTIAL.
hooks/lib/privacy-checker.cjs, line 560
// process.env.API_KEY inside a hunk cannot become a fabricated path. The
Any High, or two or more Medium findings, give D. One Medium gives C. Low findings or a security Note give B. Each code names a finding behind the letter.
Grades are a hygiene check of the source at the commit shown, on the date checked, not a security audit or a guarantee. The free directory grades are automated. Before release, a PlugVet engineer reviews every paid report and any grade we hold back, including all F grades, against the source code and the evidence we quote.
What was checked
Plain notes from the hygiene checks.
Permissions
Concern
can delete files.
PERMISSION_DELETE_FILES
hooks/privacy-block.cjs, line 156
try { fs.unlinkSync(filePath); } catch { /* concurrent prune or consume */ }
hooks/privacy-block.cjs, line 195
fs.unlinkSync(filePath);
hooks/lib/hook-logger.cjs, line 45
try { fs.unlinkSync(LOCKFILE_PATH); } catch (_) {}
Show more
hooks/lib/scout-checker.cjs, line 523
// usual startup switches) and `Invoke-Expression "..."` / `iex "..."`.
hooks/lib/scout-checker.cjs, line 526
/^(?:(?:pwsh|powershell)(?:\.exe)?(?:\s+-(?:NoProfile|NoLogo|NonInteractive|nop|nol|noni))*\s+-c(?:ommand)?|Invoke-Expression|iex)\s+(["'])(.+)\1\s*$/i;
hooks/lib/scout-checker.cjs, line 590
* pwsh -Command "...", pwsh -EncodedCommand ..., Invoke-Expression "...",
scripts/aif-install.cjs, line 177
fs.unlinkSync(entry.backup);
scripts/aif-install.cjs, line 179
fs.unlinkSync(file);
scripts/aif-install.cjs, line 293
if (fs.existsSync(ctx.manifestPath)) fs.unlinkSync(ctx.manifestPath);
skills/engineering/aif-chrome-profile/scripts/chrome_profile_cli.py, line 107
result = subprocess.run(
skills/engineering/aif-chrome-profile/scripts/chrome_profile_cli.py, line 130
subprocess.run(
skills/engineering/aif-chrome-profile/scripts/chrome_profile_cli.py, line 225
result = subprocess.run(
skills/engineering/aif-chrome-profile/scripts/chrome_profile_cli.py, line 681
subprocess.Popen(
Install and update
Pass
No install-time script found, and dependencies are pinned or absent.
Network
Concern
can reach a host that is not written as a fixed address. can reach staging.example.com. The description does not name that host. can reach example.com. The description does not name that host. can reach attacker.com. The description does not name that host.
NETWORK_NO_FIXED_HOST NETWORK_UNNAMED_HOST
skills/engineering/aif-chrome-profile/references/mcp-config-recipes.md, line 86
curl -s http://127.0.0.1:9222/json/version
skills/engineering/aif-chrome-profile/references/mcp-config-recipes.md, line 133
curl -sS -D - --max-time 3 http://127.0.0.1:9222/json/version
skills/engineering/aif-chrome-profile/scripts/chrome_profile_cli.py, line 209
with urllib.request.urlopen(url, timeout=2) as response:
Show more
skills/engineering/aif-web-testing/references/contract-testing.md, line 82
http.get('/api/users/:id', ({ params }) => {
skills/engineering/aif-web-testing/references/contract-testing.md, line 103
http.get('/api/users/:id', () => {
skills/engineering/aif-web-testing/references/contract-testing.md, line 116
const pactMswHandler = http.get('/api/users/:id', () => {
skills/engineering/aif-web-testing/references/load-testing-k6.md, line 23
const res = http.get('http://localhost:3000/api/users');
skills/engineering/aif-web-testing/references/load-testing-k6.md, line 61
http.get(`${BASE_URL}/api/protected`, params);
skills/engineering/aif-web-testing/references/pre-release-checklist.md, line 74
curl -I https://staging.example.com | grep -i security # Headers
skills/engineering/aif-web-testing/references/security-checklists.md, line 77
curl -I https://example.com
skills/engineering/aif-web-testing/references/security-testing-overview.md, line 57
curl -I https://example.com | grep -i "security\|content-security\|x-"
Secrets
Concern
reads a credential or environment file.
SECRETS_ENV_READ SECRETS_PATH_DOTENV
hooks/privacy-block.cjs, line 8
* 1. The model reads, writes, or edits ".env" -> DENIED (exit 2). The denial
hooks/privacy-block.cjs, line 13
* as "APPROVED:.env". The hook finds the matching grant, consumes it, and
hooks/lib/privacy-checker.cjs, line 560
// process.env.API_KEY inside a hunk cannot become a fabricated path. The
Show more
hooks/lib/aifignore.cjs, line 38
// collapses it as text, so `link/../.env` could name a file outside the project.
hooks/lib/aifignore.cjs, line 41
// (`FileSystem::../.env`), a drive-relative path or a stream, none of which
hooks/lib/privacy-checker.cjs, line 46
/\.example$/i, // .env.example, config.example
hooks/lib/privacy-checker.cjs, line 47
/\.sample$/i, // .env.sample
hooks/lib/privacy-checker.cjs, line 48
/\.template$/i, // .env.template
hooks/lib/privacy-checker.cjs, line 53
/^\.env$/, // .env
hooks/lib/privacy-checker.cjs, line 687
* expressions such as process.env.API_KEY from becoming fabricated ".env.*"
skills/engineering/aif-web-testing/scripts/init-playwright.js, line 67
password: process.env.TEST_USER_PASSWORD || 'password',
Agent instructions
Pass
No instruction to ignore earlier instructions or to hide a step.
Obfuscation
Concern
contains an encoded blob in a file that should be readable.
OBFUSCATION_ENCODED_BLOB
docs/deck/index.html, line 1
<!doctype html>
docs/deck/index.html, line 617
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAAKACAIAAABMkUL2AAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOydd3wcxfm439lbdUuyJBdZkgvG2Mi94ILBphiMARswCWAgoSSQ5BtKEnqCIY2SkAC/
Licence
Pass
A licence file is present (LICENSE).
Maintainer activity
Pass
The latest commit is within the last 365 days.
Note
Hygiene check of commit d32e68fa57ef. can delete files. can reach a host that is not written as a fixed address. can reach staging.example.com. The description does not name that host. can reach example.com. The description does not name that host. can reach attacker.com. The description does not name that host. reads a credential or environment file. contains an encoded blob in a file that should be readable.
Date and source
Date checked:
github.com
Commit graded: d32e68fa57efdb3be50310580554c8ef1fba5572
This link goes to the original host. PlugVet does not host or check what you download from there, and installing it is your own decision and risk.