Claude Code, Skill
Claude Workflow V2
Universal Claude Code workflow plugin with agents, skills, hooks, and commands
Compatibility: Not stated.
Grade C
One Medium finding. Read the findings before installing.
Not a guarantee. A hygiene check of the source at the commit shown, not a security audit.
Rescanned at commit 3b5a89ec1c10, unchanged since the check below.
SECRETS_PATH_CREDENTIAL
Why this grade
- SECRETS_PATH_CREDENTIAL Medium
Mentions a credential store path (~/.ssh, id_rsa, .npmrc, .aws/credentials, credentials.json, .netrc).
commands/security-scan.md, line 24
find . \( -name "*.pem" -o -name "*.key" -o -name "id_rsa" \) -not -path "./node_modules/*" -not -path "./.git/*" 2>/dev/null
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/format-on-edit.py, line 75
subprocess.run(cmd, capture_output=True, timeout=10)
hooks/suggest-doc-updates.py, line 23
result = subprocess.run(
hooks/track-metrics.py, line 21
result = subprocess.run(
Show more
hooks/typescript-check.py, line 69
result = subprocess.run(
hooks/verify-on-complete.py, line 32
result = subprocess.run(
packages/add-skill/lib/installer.js, line 49
fs.rmSync(tempTarget, { recursive: true, force: true });
packages/add-skill/lib/installer.js, line 73
fs.rmSync(tempTarget, { recursive: true, force: true });
packages/add-skill/lib/installer.js, line 110
fs.rmSync(tempTarget, { recursive: true, force: true });
CLAUDE.md, line 53
- Use subprocess.run with timeout
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 api.example.com. The description does not name that host.
NETWORK_NO_FIXED_HOST NETWORK_UNNAMED_HOST
agents/security-auditor.md, line 256
fetch("/api/users", { method: "POST", body: JSON.stringify(data) });
commands/rapid.md, line 48
return fetch(`/api/data/${id}`).then(r => r.json());
skills/designing-tests/SKILL.md, line 218
http.get("/api/users", () => {
Show more
skills/error-handling/SKILL.md, line 348
const res = await fetch("https://api.example.com/data");
skills/vercel-react-best-practices/AGENTS.md, line 1003
fetch("/api/users")
Secrets
Concern
reads a credential or environment file.
SECRETS_ENV_READ SECRETS_PATH_CREDENTIAL SECRETS_PATH_DOTENV
agents/security-auditor.md, line 33
find . -name "*.env*" -o -name "*secret*" -o -name "*credential*" -o -name "*.pem" -o -name "*.key" 2>/dev/null
agents/security-auditor.md, line 232
- A05 Misconfiguration: DEBUG=true in production .env - HIGH
commands/security-scan.md, line 24
find . \( -name "*.pem" -o -name "*.key" -o -name "id_rsa" \) -not -path "./node_modules/*" -not -path "./.git/*" 2>/dev/null
Show more
commands/bootstrap-repo.md, line 107
- Environment configuration (.env.example, config files)
commands/bootstrap-repo.md, line 117
- Secret management approach (.env, vault, etc.)
commands/security-scan.md, line 17
# Secrets in .env files (templates excluded)
commands/security-scan.md, line 18
KEN|API_KEY)[A-Za-z0-9_]*=.+" --include=".env*" --exclude=".env.example" --exclude=".
hooks/protect-files.py, line 23
('.env', ".env files contain secrets - edit manually outside of Claude Code"),
hooks/security-check.py, line 13
(r'(?i)(api[_-]?key|apikey)\s*[:=]\s*["\']?[a-zA-Z0-9_-]{20,}', "API key", "Move to .env file and use environment variables (e.g., process.env.API_KEY)"),
hooks/security-check.py, line 15
(r"(?i)bearer\s+[a-zA-Z0-9_-]{20,}", "Bearer token", "Move to .env file and use environment variables (e.g., process.env.AUTH_TOKEN)"),
hooks/security-check.py, line 16
(r"ghp_[a-zA-Z0-9]{36}", "GitHub Personal Access Token", "Move to .env file and use environment variables (e.g., process.env.GITHUB_TOKEN)"),
hooks/security-check.py, line 17
(r"github_pat_[a-zA-Z0-9]{22}_[a-zA-Z0-9]{59}", "GitHub PAT (fine-grained)", "Move to .env file and use environment variables (e.g., process.env.GITHUB_TOKEN)"),
hooks/security-check.py, line 18
(r"sk-[a-zA-Z0-9]{48}", "OpenAI API Key", "Move to .env file and use environment variables (e.g., process.env.OPENAI_API_KEY)"),
hooks/security-check.py, line 19
(r"sk-(?:proj|svcacct|admin)-[a-zA-Z0-9_-]{40,}", "OpenAI API Key", "Move to .env file and use environment variables (e.g., process.env.OPENAI_API_KEY)"),
hooks/security-check.py, line 20
(r"sk-ant-[a-zA-Z0-9_-]{80,}", "Anthropic API Key", "Move to .env file and use environment variables (e.g., process.env.ANTHROPIC_API_KEY)"),
hooks/security-check.py, line 22
(r"(?i)aws[_-]?access[_-]?key[_-]?id\s*[:=]\s*[A-Z0-9]{20}", "AWS Access Key", "Move to .env file and use environment variables (e.g., process.env.AWS_ACCESS_KEY_ID)"),
Agent instructions
Pass
No instruction to ignore earlier instructions or to hide a step.
Obfuscation
Pass
No encoded or minified payload found.
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 3b5a89ec1c10. can delete files. can reach a host that is not written as a fixed address. can reach api.example.com. The description does not name that host. reads a credential or environment file.
Date and source
Date checked:
github.com
Commit graded: 3b5a89ec1c106dd387e372aec073f9401336382a
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.