Claude Code, Skill
agentgrid
Spawn grids of coding agents (Claude, Codex, Gemini, Cursor) in one command.
Compatibility: Not stated.
Grade C
One Medium finding. Read the report before installing.
Not a guarantee. A hygiene check of the source at the commit shown, not a security audit.
INSTALL_LIFECYCLE_HOOK
Why this grade
- INSTALL_LIFECYCLE_HOOK Medium
A package install hook (preinstall, install, postinstall or prepare) runs a script.
QUICKSTART.md, line 14
curl -fsSL https://raw.githubusercontent.com/naman10parikh/agentgrid/main/install.sh | bash
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
app/scripts/copy-pty-prebuilds.cjs, line 43
fs.rmSync(RELEASE_DIR, { recursive: true });
app/src/main/tmux-helper.ts, line 84
fs.unlinkSync(metaPath(paneId));
eval/golden.sh, line 75
p = subprocess.run(["node", "dist/mcp-server.js"], input="\n".join(json.dumps(c) for c in calls) + "\n",
Show more
agentgrid, line 566
subprocess.run(["agentgrid", "grid", f"{rows}x{cols}"], check=False)
agentgrid, line 571
subprocess.run(["tmux", "set-option", "-p", "-t", f":.{idx}", "@pane_label", name], check=False)
agentgrid, line 574
subprocess.run(["tmux", "send-keys", "-t", f":.{idx}", agent, "Enter"], check=False)
agentgrid, line 626
result = subprocess.run(["tmux", "list-panes", "-F",
agentgrid, line 631
ps_tree = subprocess.run(["ps", "-eo", "ppid,pid"], capture_output=True, text=True)
agentgrid, line 652
r = subprocess.run(["ps", "-o", "args=", "-p", str(pid)],
agentgrid, line 790
buf = subprocess.run(["tmux", "capture-pane", "-p", "-t", f":.{idx}"],
Install and update
Concern
runs a script at install time. The docs document an installer that pipes a download into a shell. README documents an installer that pipes a download into a shell.
INSTALL_LIFECYCLE_HOOK INSTALL_DOCUMENTED_INSTALLER
QUICKSTART.md, line 14
curl -fsSL https://raw.githubusercontent.com/naman10parikh/agentgrid/main/install.sh | bash
README.md, line 138
curl -fsSL https://raw.githubusercontent.com/naman10parikh/agentgrid/main/install.sh | bash
install.sh, line 3
# curl -fsSL https://raw.githubusercontent.com/naman10parikh/agentgrid/main/install.sh | bash
Show more
app/content/launch-blog-post.md, line 51
curl -fsSL https://raw.githubusercontent.com/naman10parikh/agentgrid/main/install.sh | bash
app/src/shared/pricing.ts, line 30
cta: "curl -fsSL https://raw.githubusercontent.com/naman10parikh/agentgrid/main/install.sh | bash",
docs/CLI-REFERENCE.md, line 7
curl -fsSL https://raw.githubusercontent.com/naman10parikh/agentgrid/main/install.sh | bash
docs/FAQ.md, line 29
curl -fsSL https://raw.githubusercontent.com/naman10parikh/agentgrid/main/install.sh | bash
docs/HN-POST.md, line 14
curl -fsSL https://raw.githubusercontent.com/naman10parikh/agentgrid/main/install.sh | bash
docs/README.md, line 150
curl -fsSL https://raw.githubusercontent.com/naman10parikh/agentgrid/main/install.sh | bash
package.json, line 14
prepare
claude-plugin.json, line 10
"command": "curl -fsSL https://raw.githubusercontent.com/naman10parikh/agentgrid/main/install.sh | bash"
Network
Concern
can reach raw.githubusercontent.com. The description does not name that host. can reach a host that is not written as a fixed address.
NETWORK_NO_FIXED_HOST NETWORK_UNNAMED_HOST
install.sh, line 84
curl -fsSL "https://raw.githubusercontent.com/naman10parikh/agentgrid/main/agentgrid" -o "${INSTALL_DIR}/agentgrid"
install.sh, line 85
curl -fsSL "https://raw.githubusercontent.com/naman10parikh/agentgrid/main/pane-status.sh" -o "${INSTALL_DIR}/agentgrid-pane-status"
install.sh, line 110
curl -fsSL "https://raw.githubusercontent.com/naman10parikh/agentgrid/main/presets/${preset}.json" -o "${CONFIG_DIR}/presets/${preset}.json" 2>/dev/null || true
Show more
app/docs/test-report/trace/index.BDwrLSGN.js, line 92
const i = await fetch(`contexts?${s.toString()}`);
app/docs/test-report/trace/index.BDwrLSGN.js, line 115
(await fetch(n, { method: "HEAD", headers: { "x-pw-serviceworker": "skip" } }),
app/docs/test-report/trace/index.BDwrLSGN.js, line 299
const l = await (await fetch(`contexts?${c.toString()}`)).json();
app/docs/test-report/trace/index.BDwrLSGN.js, line 317
fetch("ping");
app/docs/test-report/trace/sw.bundle.js, line 3834
const i = await fetch(e, Object.assign({}, t, { method: s, headers: n }));
Secrets
Concern
reads a credential or environment file.
SECRETS_ENV_READ SECRETS_PATH_DOTENV
app/src/main/index.ts, line 1468
terminalManager.spawn(paneId, cwd, 80, 24, paneConfig?.env);
app/src/main/terminal-manager.ts, line 125
...env,
src/commands/sandbox.ts, line 42
const apiKey = process.env["E2B_API_KEY"];
Show more
src/commands/sandbox.ts, line 45
"E2B_API_KEY is required for sandbox-run. Add it to your .env (see .env.example).",
.claude/commands/dx-gha.md, line 30
- If env var → check GitHub secrets vs `.env.example`
.claude/commands/security-scan.md, line 4
2. **Secrets in code**: Scan for API keys, tokens, passwords in source files (not .env)
.claude/commands/security-scan.md, line 7
5. **Environment variables**: Verify .env files are gitignored, no secrets in committed code
.claude/commands/security-scan.md, line 11
- `password`, `secret`, `api_key`, `token` in source files (not .env)
.claude/commands/start.md, line 71
1. Run `scripts/verify.sh` - check Node, pnpm, .env, TypeScript, build, git status
Agent instructions
Pass
No instruction to ignore earlier instructions or to hide a step.
Obfuscation
Concern
contains an encoded blob in a file that should be readable.
OBFUSCATION_ENCODED_BLOB
app/pnpm-lock.yaml, line 1
lockfileVersion: "9.0"
app/docs/test-report/index.html, line 1
<!doctype html>
app/docs/test-report/trace/assets/codeMirrorModule-a5XoALAZ.js, line 1
import { v as Ju } from "./defaultSettingsView-CJSZINFr.js";
Show more
app/docs/test-report/trace/assets/defaultSettingsView-CJSZINFr.js, line 1
const __vite__mapDeps = (
app/docs/test-report/index.html, line 16851
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAYgAAADqCAYAAAC4CNLDAAAMa2lDQ1BJQ0MgUHJvZmlsZQAASImVVwdYU8kWnluSkJDQAqFICb0J0quUEFoEAamCjZAEEkqMCUHFhqio4NpFFCu6KqLoWgBZVMReFsXeFwsqK
app/docs/test-report/index.html, line 21806
data:application/zip;base64,UEsDBBQAAAgIABaXeFxvF2ysHwsAAK0nAAAZAAAAMTkzZjQwMjdhODE0ZDgwNzg1Y2QuanNvbs1ae2/bRhL/KguiQKREpLh8i0V6l4fbpGgbo3Zb3MW5dEWtLMYUyZKr2DpHQP+6D3DoJ+wnuZldPmUp
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 0bb9d9bc9b8f. can delete files. runs a script at install time. The docs document an installer that pipes a download into a shell. README documents an installer that pipes a download into a shell. can reach raw.githubusercontent.com. The description does not name that host. can reach a host that is not written as a fixed address. reads a credential or environment file. contains an encoded blob in a file that should be readable.
Date and source
Date checked:
github.com
Commit graded: 0bb9d9bc9b8f03f1bf9c6ec1b7108e346a56df5e
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.