Cursor, Plugin
speclock
Action guardrails for AI coding agents — native Claude Code enforcement, MCP integrations, and Git/CI checks.
Compatibility: Portable across standard formats.
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 f0f0b2c6805b, 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).
src/templates/rule-packs/fastapi.md, line 21
- NEVER commit `.env`, `credentials.json`, or private keys to version control - add them to `.gitignore`.
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
demo-v5.mjs, line 18
fs.rmSync(root + "/.speclock", { recursive: true, force: true });
src/core/hooks.js, line 95
fs.unlinkSync(hookPath);
src/core/telemetry.js, line 461
if (fs.existsSync(p)) fs.unlinkSync(p);
Show more
src/templates/rule-packs/python.md, line 10
- ALWAYS use `subprocess.run` with a list of arguments and `shell=False` - never `shell=True` on user input.
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.openai.com. The description does not name that host. can reach api.anthropic.com. The description does not name that host.
NETWORK_NO_FIXED_HOST NETWORK_UNNAMED_HOST
CLAUDE.md, line 42
curl -s https://speclock-mcp-production.up.railway.app/health
scripts/analytics.js, line 8
const res = await fetch(url, {
scripts/tracker.js, line 14
const res = await fetch(url, { headers: { 'User-Agent': 'speclock-tracker' } });
Show more
speclock-py/speclock/client.py, line 31
resp = requests.get(f"{self.base_url}/health", timeout=TIMEOUT)
speclock-py/speclock/client.py, line 45
resp = requests.post(
src/cli/index.js, line 785
const resp = await fetch(`${base}/api/saves`, {
src/cli/index.js, line 2761
const health = execSync(`curl -s https://speclock-mcp-production.up.railway.app/health`, { timeout: 15000 }).toString();
src/core/conflict.js, line 234
const resp = await fetch(proxyUrl, {
src/core/llm-checker.js, line 4
// Zero mandatory dependencies - uses built-in fetch().
src/core/llm-provider.js, line 4
// Zero mandatory dependencies - uses built-in fetch().
Secrets
Concern
reads a credential or environment file.
SECRETS_ENV_READ SECRETS_PATH_CREDENTIAL SECRETS_PATH_DOTENV
src/core/audit.js, line 33
if (process.env.SPECLOCK_AUDIT_SECRET) {
src/core/audit.js, line 34
return process.env.SPECLOCK_AUDIT_SECRET;
src/templates/rule-packs/fastapi.md, line 21
- NEVER commit `.env`, `credentials.json`, or private keys to version control - add them to `.gitignore`.
Show more
src/core/audit.js, line 56
if (process.env.SPECLOCK_AUDIT_SECRET) return true;
src/core/audit.js, line 212
const fromEnv = !!process.env.SPECLOCK_AUDIT_SECRET;
src/core/code-graph.js, line 25
"venv", ".venv", "env", ".env",
src/core/compliance.js, line 171
const encryptionEnabled = !!process.env.SPECLOCK_ENCRYPTION_KEY;
src/core/compliance.js, line 174
const hasAuth = !!process.env.SPECLOCK_API_KEY;
src/core/coverage.js, line 43
filePatterns: [".env", "config/secret", "credentials"],
src/core/crypto.js, line 30
return !!process.env.SPECLOCK_ENCRYPTION_KEY;
src/core/crypto.js, line 48
const masterKey = process.env.SPECLOCK_ENCRYPTION_KEY;
src/core/semantics.js, line 1071
preprocessed = preprocessed.replace(/process\.env\./gi, "env ");
design-partners.md, line 23
| 9 | [@vacavaca](https://github.com/vacavaca) | Reply on [issue #26286](https://github.com/anthropics/claude-code/issues/26286) · MSB Technology, Belgrade | Filed [claude-code#262
src/templates/rule-packs/python.md, line 17
- NEVER commit virtual environments, `.env` files, or credentials to version control.
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.
OBFUSCATION_FILE_OVER_READ_CAP
package-lock.json, line 1
{
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 f0f0b2c6805b. can delete files. can reach a host that is not written as a fixed address. can reach api.openai.com. The description does not name that host. can reach api.anthropic.com. The description does not name that host. reads a credential or environment file. a file was over the read cap and was not fully read.
Date and source
Date checked:
github.com
Commit graded: f0f0b2c6805b75f3d600903c23ac694bdd7d7a79
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.