Cursor, Plugin
ken
Thompson-mode systems discipline for AI agents.
Compatibility: Portable across standard formats.
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.
Rescanned at commit bee7f2cf3b48.
PERMISSION_DELETE_FILES NETWORK_NO_FIXED_HOST SECRETS_PATH_DOTENV SECRETS_ENV_READ
Why this grade
- PERMISSION_DELETE_FILES Low
Contains a call that can delete files.
benchmarks/agentic/run.py, line 150
return subprocess.run([shutil.which("git") or "git", *args], cwd=str(workdir), - NETWORK_NO_FIXED_HOST Low
Makes a network call whose host is not written as a fixed address.
benchmarks/agentic/judge.py, line 72
with urllib.request.urlopen(req, timeout=60) as r: - SECRETS_PATH_DOTENV Low
Mentions a .env file.
benchmarks/agentic/complete.py, line 20
Judge: claude-sonnet-4-6, key from ../../.env (shared with judge.py). ~$0.003/cell. - SECRETS_ENV_READ Note
Reads an environment variable whose name contains KEY, SECRET, TOKEN, PASSWORD or CREDENTIAL.
benchmarks/agentic/judge.py, line 48
return os.environ.get("ANTHROPIC_API_KEY")
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
benchmarks/agentic/run.py, line 150
return subprocess.run([shutil.which("git") or "git", *args], cwd=str(workdir),
benchmarks/agentic/run.py, line 228
subprocess.run(["taskkill", "/F", "/T", "/PID", str(proc.pid)],
benchmarks/agentic/run.py, line 236
p = subprocess.Popen([sys.executable, "-c", "import time; time.sleep(30)"],
Show more
benchmarks/agentic/run.py, line 321
# open forever, so subprocess.run(timeout=) never fires and the worker freezes. Writing to a file
benchmarks/agentic/run.py, line 326
proc = subprocess.Popen(cmd, cwd=str(workdir), stdout=so, stderr=se,
benchmarks/agentic/run.py, line 397
try: return subprocess.run([shutil.which("claude"), "--version"], capture_output=True, text=True).stdout.strip()
benchmarks/agentic/tasks.py, line 541
proc = subprocess.Popen([node, str(srv)], cwd=str(workdir), env=env,
benchmarks/maintenance/run.py, line 63
subprocess.run(["taskkill", "/F", "/T", "/PID", str(proc.pid)],
benchmarks/maintenance/run.py, line 174
shutil.rmtree(ws)
hooks/ken-runtime.js, line 38
try { fs.unlinkSync(statePath); } catch (e) {}
scripts/uninstall.js, line 16
fs.unlinkSync(filePath);
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
benchmarks/agentic/judge.py, line 72
with urllib.request.urlopen(req, timeout=60) as r:
benchmarks/agentic/tasks.py, line 538
with urllib.request.urlopen(r, timeout=4) as resp:
benchmarks/maintenance/tickets.py, line 363
assert json.load(urllib.request.urlopen(req)) == {"balance": 1050}
Show more
benchmarks/maintenance/tickets.py, line 381
last = json.load(urllib.request.urlopen(req))
docs/platform-native.md, line 172
| `requests` (simple GET) | `urllib.request.urlopen(url)`, `requests` for anything real |
Secrets
Concern
reads a credential or environment file.
SECRETS_ENV_READ SECRETS_PATH_DOTENV
benchmarks/agentic/judge.py, line 48
return os.environ.get("ANTHROPIC_API_KEY")
benchmarks/agentic/complete.py, line 20
Judge: claude-sonnet-4-6, key from ../../.env (shared with judge.py). ~$0.003/cell.
benchmarks/agentic/complete.py, line 146
if not key: sys.exit("no ANTHROPIC_API_KEY (.env or env)")
Show more
benchmarks/agentic/judge.py, line 13
Judge: claude-sonnet-4-6 via the Anthropic Messages API (key from ../../.env). Scores the SOURCE
benchmarks/agentic/judge.py, line 43
for line in (ROOT / ".env").read_text(encoding="utf-8").splitlines():
benchmarks/agentic/judge.py, line 177
if not key: sys.exit("no ANTHROPIC_API_KEY (.env or env)")
skills/ken-gain/SKILL.md, line 27
(see benchmarks/README.md; needs API keys in .env) to produce the first
.env.example, line 1
# Copy to .env (gitignored) and fill in. promptfoo reads this automatically.
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 bee7f2cf3b48. can delete files. can reach a host that is not written as a fixed address. reads a credential or environment file.
Date and source
Date checked:
github.com
Commit graded: bee7f2cf3b48d08d1f91e2ec2d25909d3073164c
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.