cli@0.3.73
CAUTION· not startedPublisher claims: "Knowledge layer for AI agents - CLI, MCP server, and data layer" Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Not started: dependency install failed; the server itself was not observed.- Tested
- the dependency install step · every file read, file written and host contacted by what ran
- Not tested
- server startup · the tool list · tool behavior
What this means for the label: Caution here covers what ran. The server's tools were not exercised with a real credential, so nothing about their behavior is asserted; the credential summary below says what to do with that.
Before you give it your token
- It will ask for
ANTHROPIC_API_KEYOPENAI_API_KEYPHREN_CONTEXT_TOKEN_BUDGETPHREN_MAX_INJECT_TOKENSConfiguration, not credentials: _PHREN_WALKTHROUGH_OLLAMA_SKIP, CLAUDE_CONFIG_DIR, CODEX_HOME, ComSpec, COPILOT_HOME, DEFAULT_PHREN_PATH, GIT_CONFIG_GLOBAL, PHREN_APNS_CONFIG, PHREN_CLANKER, PHREN_CONTEXT_SNIPPET_CHARS, PHREN_CONTEXT_SNIPPET_LINES, PHREN_DEBUG, PHREN_DISPATCH_ID, PHREN_EMBEDDING_API_URL, PHREN_FEATURE_PROGRESSIVE_DISCLOSURE, PHREN_GH_ISSUE_LIMIT, PHREN_GH_PR_LIMIT, PHREN_GH_RETRIES, PHREN_GH_RUN_LIMIT, PHREN_GH_TIMEOUT_MS, PHREN_HOOK_TIMEOUT_MS, PHREN_HOOK_TOOL, PHREN_LLM_ENDPOINT, PHREN_MCP_PROFILE, PHREN_MEMORY_AUTO_ACCEPT, PHREN_MEMORY_EXTRACT_WINDOW_DAYS, PHREN_MEMORY_TTL_DAYS, PHREN_MIN_QUERY_RELEVANCE, PHREN_PATH, PHREN_PROFILE, PHREN_PULL_INTERVAL_SECONDS, PHREN_SLOW_FS_WARN_MS, PHREN_SUDO_TEST_PARENT, REMOTE_PATH, SCOPE_KEY_COMMENT, WSL_DISTRO_NAME- Where it talks to
- no vendor host named in the codeAlso bunny.net, apple.com, ollama.com, jsdelivr.net — not the publisher's domain; check what for before connecting.
- What the honeypot saw
- no credential files read · no network
- What we could not test
- server startup · the tool list · tool behavior
Connect it with a scoped credential, under the guard, and read the third-party hosts first. The code names bunny.net, apple.com, ollama.com, jsdelivr.net as well as its own vendor. The guard injects ANTHROPIC_API_KEY, OPENAI_API_KEY, PHREN_CONTEXT_TOKEN_BUDGET, PHREN_MAX_INJECT_TOKENS only into requests to the host you bind (and its subdomains) and refuses the rest.
Never paste a credential into a chat, a ticket or a report, including ours. How the guard holds it.
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (2 scenarios; not started: dependency install failed; the server itself was not observed) on 2026-11-09 and scored it 75/100 (Caution). It is not known to be malicious, but it has behaviour or code a security policy should decide on before install. Notable findings: Access to sensitive file paths; Access to sensitive file paths; Access to sensitive file paths. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 2 s · 2 scenarios · 0 deviationsStatic findings
/** Hosts from ~/.ssh/config and the store's machines.yaml that answer over ssh,Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* an ephemeral npx copy and the wrapper already runs a lasting entry that exists. */Fix: Pin versions and sources; vendor anything fetched at install time.created.push(`.env:PHREN_FEATURE_AUTO_CAPTURE=${autoCaptureDefault}`);Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.ok: true, // always pass — wrapper is optional (global install or npx work too)Fix: Pin versions and sources; vendor anything fetched at install time.* self-healing fallback is fragile: npx prunes that cache and the `<hash>`Fix: Pin versions and sources; vendor anything fetched at install time.? "Hook entrypoint available via npx fallback"Fix: Pin versions and sources; vendor anything fetched at install time.// Persist the walkthrough choice so init writes an explicit .env default.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.alert: { title: `sudo on ${value.computer}`, body: command },Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.Projects: [`${k("↑↓")} ${d("move")}`, `${k("↵")} ${d("open")}`, `${k("e")} ${d("edit AGENTS.md")}`],Fix: Build commands from fixed arguments, never from interpolated strings; prefer an API client over shelling out.: `CLI wrapper not found (optional — use 'npx @phren/cli' instead)`,Fix: Pin versions and sources; vendor anything fetched at install time.const envPath = path.join(phrenPath, ".env");Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* commands that resolve here must fall back to `npx -y <spec>` (whichFix: Pin versions and sources; vendor anything fetched at install time.log(` Run \`phren init --apply-starter-update\` to refresh global/AGENTS.md and global skills.`);Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.const mergedEnv = { ...process.env, PHREN_PATH: phrenPath, PHREN_HOOK_EVENT: event, ...env };Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.* sudo with no terminal, answered from the phone.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.console.log(`\n ${BOLD}Health${RESET} ${DIM}(${health.computer.name})${RESET}`);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.* `sudo -A` runs `SUDO_ASKPASS` (`<bridge>/askpass`, a two-line script theFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.log(` Run \`phren init --apply-starter-update\` to refresh global/AGENTS.md and global skills.`);Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.* (`npx -y @phren/cli …`), which cannot go stale, and for commands with noFix: Pin versions and sources; vendor anything fetched at install time.log(` Would set PHREN_PATH in ${path.join(storageRepoRoot, ".env")}`);Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.fix: hookEntrypointOk ? undefined : "Rebuild phren: `npm run build` or reinstall the package, and ensure npm/npx is available for hook fallbacks",Fix: Pin versions and sources; vendor anything fetched at install time.const envPath = path.join(repoRoot, ".env");Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.sessionStart: `npx -y ${packageSpec} hook-session-start`,Fix: Pin versions and sources; vendor anything fetched at install time.console.log(`\n⚠ SSH isn't answering on this computer. ${sshHint()}\n Pairing can finish now; the phone connects once SSH is on.`);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.* skip wrappers (hooks fall back to node/npx invocation).Fix: Pin versions and sources; vendor anything fetched at install time.…oadProjects() {\n fetch(authUrl('/api/projects')).then(function(r) { return r.json(); }).then(function(data) {\n _projectData = data;\n renderProjectCards(data);\n if (_selectedProject) {\n var cards = document.querySelectorAll('.project-c…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…edKey(scope, text); const fingerprint = await hostFingerprint(); console.log(`Authorized ${SCOPE_KEY_COMMENT[scope]} for ${scope}: ${scope === "gitboy-write" ? "POST /v1/projects/<project>/findings and tasks/complete only" : "GET /v1/proje…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.* flags, its parent is the installed script, that script's parent is a sudoFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.console.log(" In the Phren app: Agents → Add computer → Scan pairing code\n");Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.* commands that resolve here must fall back to `npx -y <spec>` (whichFix: Pin versions and sources; vendor anything fetched at install time.* True if a path lives inside an ephemeral npx download cacheFix: Pin versions and sources; vendor anything fetched at install time.* agent.sock and holds the connection. The password must reach sudo and noFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.* self-healing fallback is fragile: npx prunes that cache and the `<hash>`Fix: Pin versions and sources; vendor anything fetched at install time./** A sudo request waiting for its password. The command is what the ownerFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.console.log("Tips: '--project <name>' for a project's merged config, '--diff' for only customised values, '--json' for machine-readable output.\n");Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.console.log(`${RED}phren not found${RESET}. Run ${CYAN}npx @phren/cli init${RESET} to set up.`);Fix: Pin versions and sources; vendor anything fetched at install time.// The address the Hook dials skips ~/.ssh/config, so resolve the alias the way ssh does.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.: "Start the SSH server, for example: sudo systemctl enable --now sshd";Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.: "Hook entrypoint missing and npx unavailable, hooks will fail";Fix: Pin versions and sources; vendor anything fetched at install time.* process's pid gets nothing. (sudo creates askpass's stdout pipe as root,Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.* True if a path lives inside an ephemeral npx download cacheFix: Pin versions and sources; vendor anything fetched at install time.Cost to the agent
Tokens estimated at four characters each. The tool list is re-read by the agent on every turn, so it is the number to compare between servers that do the same job: ranked across the index.
Known vulnerabilities
No advisories in OSV for @phren/cli@0.3.73 as of 5d ago. This is the package itself, not its dependencies.
What would make this Verified
5 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Unclaimed publisher≈ +8 on the totalClaim phren: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Access to sensitive file paths≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- Privileged sudo command≈ +4 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.
- npx invocation of non-well-known package≈ +2 on the totalPin versions and sources; vendor anything fetched at install time.
- File type combined with upload action≈ +2 on the totalRemove the call, or declare the host in frontmatter and explain in the README what is sent and why.