Skills/npm/trail-code

trail-code@0.29.0

CAUTION· startup only

Publisher claims: "Your team's shared memory for coding agents: a code map on your machine, and the learnings, decisions and skills your whole team shares. Formerly graft." Observed in sandbox: no network, touches nothing outside the project, writes no memory.

Registry npm (MCP server)Publisher trailhq · publishing for 31 daysInstalls 28,661Last detonated 24 h ago

Coverage

Startup only; authenticated tool behavior not tested.
Tested
install scripts, with decoy credentials in place · second launch with the clock 45 days ahead · server startup over stdio (initialize sent) · every file read, file written and host contacted by what ran
Not tested
the tool list (the server exited before answering) · what the tools do when called with real credentials

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
no credential variables read in the code
Where it talks to
trailhq.com (its own)Also acme.internal — 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
the tool list (the server exited before answering) · what the tools do when called with real credentials

Connect it under the guard. Startup only; authenticated tool behavior not tested. The code names no credential variable and talks to trailhq.com, its own; the guard pins the network to what the honeypot saw and logs every call.

$vet-skills run --net declared -- npx -y @trailhq/trail-code

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 (3 scenarios; startup only; authenticated tool behavior not tested) on 2026-11-13 and scored it 62/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: Privileged sudo command; Collapsed <details> block carrying instructions; URL with embedded credentials. Summary: no network, touches nothing outside the project, writes no memory.

Behavior trace

Honeypot run · 33 s · 3 scenarios · 0 deviations
t+CategoryObserved action
0.0sprocessinstall script run in the sandbox
0.1sprocessexited 1: Node.js v22.23.5
13sprocessdependency install exit 0
33sclaimedstartup only: exited (0) before answering · code: 'ERR_MODULE_NOT_FOUND', url: 'file:///tmp/ks-detonate-Z17xP8/task/home/work/acme-api/.claude/skills/trail-code/dist/node-version.js' } Node.js v22.23.5
33sprocessscript backend runs setup only
33sprocesssecond launch, clock +45 days, CI unset
33sprocessexited 1: Node.js v22.23.5

Static findings

MEDIUM
File type combined with upload actiondist/cli.js:2259 · File type combined with upload action — agent may exfiltrate local data filesconsole.log(`· send one: ${cmd("graft share-session")} <number>`);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.
AST07
HIGH
Privileged sudo commanddist/cli-meta.js:180 · Privileged sudo command — agent may execute with elevated privileges* system package): an npm prefix in the home folder, set once. Not sudo: a sudoFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.
AST05
HIGH
Collapsed <details> block carrying instructionsREADME.md:410 · Collapsed <details> block carrying instructions<summary><b>Method</b></summary> Two clones of PocketBase at the same commit: one wired with `graft init`, one untouched and verified to have no graft map in itFix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.
AST01
MEDIUM
Process kill commanddist/graph/seed.js:46 · Process kill command — agent can terminate processes/** Env kill switch, mirroring `GRAFT_NO_REFRESH` in ./refresh.ts. */Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.
AST05
MEDIUM
npx invocation of non-well-known packagedist/trace/jobs.js:3 · npx invocation of non-well-known package — may execute untrusted code…:-]+ ){0,3}?`; const RUNNER = String.raw `(?:npm|pnpm|yarn|bun)(?: run)? test\b|npx (?:vitest|jest|playwright test)\b|go test\b|cargo test\b|make test\w*|python3? -m pytest\b|pytest\b|bats\…Fix: Pin versions and sources; vendor anything fetched at install time.
AST06
HIGH
URL with embedded credentialsdist/notes/home.js:146 · URL with embedded credentials — may be phishing or credential leaking* `[email protected]:NanoNets/Graft.git`, `https://user:[email protected]/NanoNets/Graft`Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
AST07
MEDIUM
npx invocation of non-well-known packagedist/cli-meta.d.ts:35 · npx invocation of non-well-known package — may execute untrusted code/** True when `npm install -g` actually ran (false for the npx no-op path). */Fix: Pin versions and sources; vendor anything fetched at install time.
AST06
MEDIUM
File type combined with upload actiondist/cli.js:2342 · File type combined with upload action — agent may exfiltrate local data filesconsole.log(`An earlier send stopped with ${left} of ${earlier.manifest.items.length} items left (${homePath(earlier.dir)}).`);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.
AST07
HIGH
Privileged sudo commanddist/cli-meta.d.ts:78 · Privileged sudo command — agent may execute with elevated privileges* block it (`clearNpmLeftover`) and turning EACCES into the no-sudo fix, thenFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.
AST05
HIGH
Access to sensitive file pathsdist/cloud/nudge.js:168 · Access to sensitive file paths — SSH keys, AWS credentials, env files, or system filesenv: opts.session ? { ...env, CLAUDE_CODE_SESSION_ID: opts.session } : env,Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
AST05
MEDIUM
npx invocation of non-well-known packagedist/cli-meta.js:46 · npx invocation of non-well-known package — may execute untrusted code/** True when the running module lives under an npx cache dir (e.g.Fix: Pin versions and sources; vendor anything fetched at install time.
AST06
MEDIUM
npx invocation of non-well-known packagedist/cli-meta.js:125 · npx invocation of non-well-known package — may execute untrusted codereturn (`running via npx: npx already fetches the latest ${brand()} on every run.\n` +Fix: Pin versions and sources; vendor anything fetched at install time.
AST06
HIGH
Privileged sudo commanddist/cli-meta.js:204 · Privileged sudo command — agent may execute with elevated privileges* block it (`clearNpmLeftover`) and turning EACCES into the no-sudo fix, thenFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.
AST05
HIGH
Privileged sudo commanddist/cli-meta.js:188 · Privileged sudo command — agent may execute with elevated privileges`npm needs sudo to write to ${path}.`,Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.
AST05
MEDIUM
File type combined with upload actiondist/cli.js:617 · File type combined with upload action — agent may exfiltrate local data filesconsole.log(` meaning: ${m.computed} computed, ${m.cached} cached, ${m.stale} stale, ${m.pending} pending`);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.
AST07
LOW
Instructs the agent to modify its persistent memory or instruction filesdist/cli-picker.js:458 · Instructs the agent to modify its persistent memory or instruction files · informational: not an instruction file// Codex, Hermes and Antigravity all write AGENTS.md: list each write once.Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.
AST01
LOW
Instructs the agent to modify its persistent memory or instruction filesREADME.md:69 · Instructs the agent to modify its persistent memory or instruction files · informational: not an instruction file| You write and update CLAUDE.md by hand | Learnings are saved from your conversations, in files you can read |Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.
AST01
MEDIUM
File type combined with upload actiondist/viewer/app.js:2 · File type combined with upload action — agent may exfiltrate local data files…aph yet \u2014 run <code>graft graph</code> to generate <span class="mono">graph.json</span>.'));else{let i=J();!i||i.nodes.length===0?lt(i?.meta.emptyNote?Ht(i.meta.emptyNote):e==="code"?'No code graph yet \u2014 run <code>graft graph</co…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.
AST07
LOW
Unpinned dependencydist/cli-meta.d.ts:77 · Unpinned dependency/** Runs `npm install -g @nanonets/graft@latest`, clearing npm leftovers thatFix: Pin the exact version (`[email protected]`, `==1.2.3`) so every install gets the bytes that were reviewed.
AST06
HIGH
Privileged sudo commanddist/cli-meta.d.ts:73 · Privileged sudo command — agent may execute with elevated privileges* system package): an npm prefix in the home folder, set once. Not sudo: a sudoFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.
AST05
MEDIUM
npx invocation of non-well-known packagedist/cli-meta.d.ts:13 · npx invocation of non-well-known package — may execute untrusted code/** True when the running module lives under an npx cache dir (e.g.Fix: Pin versions and sources; vendor anything fetched at install time.
AST06
MEDIUM
npx invocation of non-well-known packagedist/cli-meta.d.ts:18 · npx invocation of non-well-known package — may execute untrusted code* false — `graft upgrade` would then run `npm install -g` on top of an npx run.Fix: Pin versions and sources; vendor anything fetched at install time.
AST06
MEDIUM
npx invocation of non-well-known packagedist/cli-meta.js:51 · npx invocation of non-well-known package — may execute untrusted code* false — `graft upgrade` would then run `npm install -g` on top of an npx run.Fix: Pin versions and sources; vendor anything fetched at install time.
AST06
LOW
Unpinned dependencydist/cli-meta.js:203 · Unpinned dependency/** Runs `npm install -g @nanonets/graft@latest`, clearing npm leftovers thatFix: Pin the exact version (`[email protected]`, `==1.2.3`) so every install gets the bytes that were reviewed.
AST06

Cost to the agent

Instructions loaded
≈76 tok
1 file · 81 in bundle
Tool list per prompt
≈0 tok
0 tools · 0 per tool
Handshake
no reply
launch to tools/list, stdio
Undocumented tools
0
description under 20 chars · avg 0

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 @trailhq/trail-code@0.29.0 as of 6 h ago. This is the package itself, not its dependencies.

What would make this Verified

18 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%
  1. Unclaimed publisher≈ +8 on the totalClaim trailhq: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
  2. Hidden instructions≈ +6 on the totalRemove HTML comments, zero-width characters and white-on-white text that carry instructions. Everything the agent is meant to read should be visible to the person reading the file.
  3. Privileged sudo command≈ +4 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.
  4. URL with embedded credentials≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
  5. 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.
  6. Unpinned dependencies≈ +3 on the totalPin exact versions (and ideally hashes) in package.json, requirements or the install script so the bundle cannot change under you.
Publish a new version to npm, then queue it here. Not your skill? Claim the handle to get verdict changes by email.Claim trailhqPropose a patch to the maintainer