Codex, Plugin
Visual Stack
A visual interface for building software with Claude Code/Codex.
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.
Rescanned at commit 0f2e1a8c0f95, unchanged since the check below.
PERMISSION_DELETE_FILES NETWORK_NO_FIXED_HOST NETWORK_UNNAMED_HOST SECRETS_PATH_DOTENV OBFUSCATION_FILE_OVER_READ_CAP
Why this grade
- PERMISSION_DELETE_FILES Low
Contains a call that can delete files.
docs/demo/record-demo.mjs, line 419
fs.rmSync(WORK, { recursive: true, force: true }) - NETWORK_NO_FIXED_HOST Low
Makes a network call whose host is not written as a fixed address.
docs/demo/record-demo.mjs, line 84
await fetch(ORIGIN + '/api/project') - NETWORK_UNNAMED_HOST Low
Calls a fixed host that the description does not name.
docs/demo/record-demo.mjs, line 84
await fetch(ORIGIN + '/api/project') - SECRETS_PATH_DOTENV Low
Mentions a .env file.
docs/pipeline-wishlist.md, line 394
`deploy.yml`, `.env.example` *(7)*. - OBFUSCATION_FILE_OVER_READ_CAP Note
A file was over the read cap and was not fully read.
plugins/vstack/skills/review/assets/workspace.html, line 1
<!doctype html>
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
docs/demo/record-demo.mjs, line 419
fs.rmSync(WORK, { recursive: true, force: true })
e2e/steps/review.steps.mjs, line 240
fs.rmSync(path.join(this.store, 'watching'), { force: true })
e2e/support/world.mjs, line 212
fs.rmSync(this.temp, { recursive: true, force: true })
Show more
plugins/vstack/lib/json-bridge.mjs, line 193
fs.rmSync(APPROVED_FILE, { force: true })
plugins/vstack/lib/json-bridge.mjs, line 389
try { fs.rmSync(URL_FILE, { force: true }) } catch {}
plugins/vstack/lib/live-link.mjs, line 112
for (const file of getFiles()) fs.rmSync(file, { force: true })
plugins/vstack/skills/review/assets/review-server.mjs, line 257
fs.rmSync(file, { force: true })
plugins/vstack/skills/review/assets/review-server.mjs, line 270
try { fs.rmSync(heldLockFile, { force: true }) } catch {}
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.github.com. The description does not name that host.
NETWORK_NO_FIXED_HOST NETWORK_UNNAMED_HOST
docs/demo/record-demo.mjs, line 84
await fetch(ORIGIN + '/api/project')
docs/demo/record-demo.mjs, line 104
try { if ((await fetch(ORIGIN + '/api/project')).ok) break } catch {}
docs/demo/record-demo.mjs, line 329
comments: (await (await fetch(ORIGIN + '/api/project')).json()).comments.map(c => c.kind),
Show more
docs/demo/record-demo.mjs, line 342
marks = (await (await fetch(ORIGIN + '/api/project')).json()).comments
docs/demo/record-demo.mjs, line 354
const { comments } = await (await fetch(ORIGIN + '/api/project')).json()
e2e/steps/review.steps.mjs, line 267
const workspace = await (await fetch(this.origin + this.base + '/')).text()
e2e/steps/review.steps.mjs, line 273
const workspace = await (await fetch(this.origin + this.base + '/')).text()
e2e/steps/review.steps.mjs, line 282
const response = await fetch(this.appOrigin + '/')
plugins/vstack/lib/update-check.mjs, line 143
const res = await fetch(`https://github.com/${REPO}/commits/${BRANCH}.atom`,
Secrets
Concern
reads a credential or environment file.
SECRETS_PATH_DOTENV
.gitignore, line 18
.DS_Store
docs/pipeline-wishlist.md, line 394
`deploy.yml`, `.env.example` *(7)*.
plugins/vstack/experimental/start/SKILL.md, line 132
deleted per the pack's conflict register; a real `.env.example`; the remaining `ci.yml` gates the
Show more
plugins/vstack/experimental/start/SKILL.md, line 139
- **Copy runtime config** - `.env` and any secrets, which don't come from the template.
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
plugins/vstack/skills/review/assets/workspace.html, line 1
<!doctype html>
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 0f2e1a8c0f95. can delete files. can reach a host that is not written as a fixed address. can reach api.github.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: 0f2e1a8c0f95aa486aa88f0abae347ea16e4b809
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.