Claude Code, Plugin
SkillArtisan
A plugin for Claude Code that builds, validates, secures, and maintains Claude Skills — superseding Anthropic's shipped skill-creator with a spec-compliant, cross-vendor, security-hardened successor.
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.
SECRETS_PATH_CREDENTIAL
Why this grade
- SECRETS_PATH_CREDENTIAL Medium
Mentions a credential store path (~/.ssh, id_rsa, .npmrc, .aws/credentials, credentials.json, .netrc).
skill-artisan/scripts/pr_execute.py, line 437
`--pr-body-file ~/.ssh/id_rsa` or `--pr-body-file /etc/passwd` reads an
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
skill-artisan/benchmark/skill-creator-comparison-repro.sh, line 157
shutil.rmtree(torn_down, ignore_errors=True)
skill-artisan/benchmark/skill-creator-comparison-repro.sh, line 208
shutil.rmtree(root, ignore_errors=True)
skill-artisan/eval-viewer/generate_review.py, line 349
result = subprocess.run(["lsof", "-ti", f":{port}"], capture_output=True, text=True, timeout=5)
Show more
skill-artisan/scripts/description_optimizer.py, line 179
shutil.rmtree(root, ignore_errors=True)
skill-artisan/scripts/description_optimizer.py, line 196
shutil.rmtree(root, ignore_errors=True)
skill-artisan/scripts/description_optimizer.py, line 328
def _stop(process: subprocess.Popen) -> None:
skill-artisan/scripts/description_optimizer.py, line 373
process = subprocess.Popen(
skill-artisan/scripts/description_optimizer.py, line 562
result = subprocess.run(
skill-artisan/scripts/pr_execute.py, line 104
return subprocess.run(["git", "-C", str(repo_path), *args], capture_output=True, text=True, timeout=30)
skill-artisan/scripts/pr_execute.py, line 108
return subprocess.run(["gh", *args], capture_output=True, text=True, timeout=timeout)
skill-artisan/scripts/security_scan.py, line 93
# the os.system( check contains the text "os.system("). When this file
skill-artisan/scripts/security_scan.py, line 115
# subprocess.run(
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.
NETWORK_NO_FIXED_HOST
skill-artisan/scripts/anthropic_client.py, line 51
with urllib.request.urlopen(request, timeout=timeout) as response:
skill-artisan/CHANGELOG.md, line 364
- **`skill-artisan/tests/test_anthropic_client.py`, `test_gha_audit.py`, `test_pr_execute.py`** (39 new tests): full coverage of the new Action machinery with zero network calls -
skill-artisan/eval-viewer/viewer.html, line 666
const resp = await fetch("/api/feedback");
Show more
skill-artisan/eval-viewer/viewer.html, line 1012
fetch("/api/feedback", {
skill-artisan/eval-viewer/viewer.html, line 1044
fetch("/api/feedback", {
Secrets
Concern
reads a credential or environment file.
SECRETS_ENV_READ SECRETS_PATH_CREDENTIAL SECRETS_PATH_DOTENV
skill-artisan/scripts/gha_audit.py, line 199
parser.add_argument("--anthropic-api-key", default=os.environ.get("ANTHROPIC_API_KEY", ""))
skill-artisan/scripts/pr_execute.py, line 301
nothing about untracked files, so a stray `.env`, a credentials file, or
skill-artisan/scripts/pr_execute.py, line 437
`--pr-body-file ~/.ssh/id_rsa` or `--pr-body-file /etc/passwd` reads an
Show more
skill-artisan/scripts/security_scan.py, line 72
# on. `Path(".env").suffix` is "" - the leading dot is the stem, not a
skill-artisan/scripts/security_scan.py, line 74
# likely to hold a credential. `.env.local`, `.env.production` and friends
skill-artisan/scripts/security_scan.py, line 77
".env", ".npmrc", ".netrc", ".pypirc", ".dockercfg", ".gitconfig", ".credentials",
skill-artisan/scripts/security_scan.py, line 86
return name in PATTERN_SCAN_FILENAMES or name.startswith(".env.")
skill-artisan/scripts/security_scan.py, line 204
that cannot see `.env`, `.npmrc`, `.claude/settings.json` or
skill-artisan/scripts/security_scan.py, line 278
a `.env`, a `.npmrc`, or a workflow under `.github/` would leave the
Agent instructions
Pass
No instruction to ignore earlier instructions or to hide a step.
Obfuscation
Note
a file was over the read cap and was not fully read. the file cap was reached before every file was read.
OBFUSCATION_FILE_OVER_READ_CAP OBFUSCATION_FILE_CAP_REACHED
skill-artisan/benchmark/audit-pilot/RESULTS.md, line 1
# Audit-mode real-world pilot - results
skill-artisan/benchmark/audit-pilot/reports-alirezarezvani/aggregate.json, line 1
{
skill-artisan/benchmark/audit-pilot/reports-daymade/aggregate.json, line 1
{
Show more
skill-artisan/benchmark/audit-pilot/reports-glebis/aggregate.json, line 1
{
skill-artisan/benchmark/audit-pilot/reports-mukul975/aggregate.json, line 1
{
skill-artisan/tests/test_description_optimizer_containment.py, line 1
#!/usr/bin/env python3
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 58feff99f8cc. can delete files. can reach a host that is not written as a fixed address. reads a credential or environment file. a file was over the read cap and was not fully read. the file cap was reached before every file was read.
Date and source
Date checked:
github.com
Commit graded: 58feff99f8cc39b2846188136939c18f429310c4
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.