seoagent@1.139.1
CAUTION· install onlyPublisher claims: "The persistent AI SEO agent for Claude Code. Audits, keyword strategy, briefs, articles, real product screenshots from your repo, and the autopilot loop (cloud detects → CLI executes → ack closes) — other SEO tools write the prompt, SEOAgent runs it." Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Nothing executable in the bundle ran; the trace covers the install step only.- Tested
- every file read, file written and host contacted by what ran
- Not tested
- use of the skill by an agent
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (1 scenario; nothing executable in the bundle ran; the trace covers the install step only) on 2026-11-10 and scored it 73/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; Hidden zero-width characters detected. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 0 s · 1 scenarios · 0 deviationsStatic findings
…e to set up the ${t.label} connector:`,` ${t.enableHint}. Credentials go in .env in this folder, never`," in a tracked file. Posts are created as drafts unl…Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.…r as Xx,isCancel as Ht,cancel as Wt,confirm as Bp}from"@clack/prompts";var zt=[".env.local",".env.production",".env"],kl=["NEXT_PUBLIC_SITE_URL","SITE_URL","NEXT_PU…Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.…Agent installed (site URL not detected \u2014 please ask the user for it).","","\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2550\u2…Fix: Put hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.…",".js",".mjs"]);function Lb(e,t){let n=Vu(e).toLowerCase();if(Qu.has(n)){if(!/^ ?---\r?\n/.test(t))return!1;try{return Xu(oe(t.replace(/^ /,"")).data)}catch{ret…Fix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.…aml \u2014 using this directory for project signals"});let r=null;t?.("Scanning .env files for public / site URLs\u2026");let o=ly(e);if(o)r=o.value,n.push({field:"…Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.…i,"").toLowerCase()==="seoagent"}function m(e,t=Ci()){return t?`seoagent ${e}`:`npx -y ${Ur} ${e}`}import{randomUUID as Qh}from"crypto";import{existsSync as Nl,mkdirS…Fix: Pin versions and sources; vendor anything fetched at install time.…d.error(`Update failed. Try manually: npm install -g ${tt}@latest (you may need sudo on Linux/macOS).`),d.message('If npm said "notarget" or "No matching version fou…Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.…"path";var Vi=`command -v seoagent >/dev/null 2>&1 && seoagent sync --silent || npx -y ${Ur} sync --silent`,ic=60;function sc(e){let t=Tt(e,k);qi(t,{recursive:!0});le…Fix: Pin versions and sources; vendor anything fetched at install time.…on anything about SEO or search rankings — keywords, meta tags, sitemaps, robots.txt, schema/JSON-LD, internal linking, Google Search Console, or AI search (AEO/GEO/llms.txt). Use it silently when writing or editing a blog post, landing pa…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…xt:`ai-files: .seoagent/llms.md changed, but ${e.llmsRoute} already serves /llms.txt, so nothing was published \u2014 a file in your static dir would shadow that route. Compare the two, or set \`llms_owner: route\` in .seoagent/project.md …Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…of S=="string");a.length===0&&a.push("missing");let l=t.robots_txt_url??"/robots.txt",c=t.robots_txt??null,u=t.robots_txt_status??null,p=Array.isArray(t.robots_dead_lines)?t.robots_dead_lines:[],f=t.google??null,h=n??"/sitemap.xml",y=a.inc…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…ation/json"},signal:AbortSignal.timeout(bx)});if(!e.ok)return null;let t=await e.json();return typeof t.version=="string"?t.version:null}catch{return null}}async function xp(e){try{return await $x({current:e,now:new Date,fetchLatest:Sx,rea…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.… → use bare `seoagent <command>`; else offer `npm install -g`, or fall back to `npx -y @seoagent-official/seoagent <command>`. **The CLI is your router.** `seoagent …Fix: Pin versions and sources; vendor anything fetched at install time.…ccept:"application/json"},signal:AbortSignal.timeout(1e4)}),o=null;try{o=await r.json()}catch{}return Ou(r.status,o)}catch(n){return{status:"error",terminal:!1,message:n.message||"network error"}}}function Uu(e){return new Promise(t=>setTi…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…","sanity.config.js","sanity.config.mjs","sanity.cli.ts","sanity.cli.js","sanity.json","studio/sanity.config.ts","studio/sanity.config.js","sanity/sanity.config.ts","sanity/sanity.config.js"],zm=["studio","sanity"],Jm=[{cms:"strapi",deps:[…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…ed spec won't auto-upgrade."),d.message(`Run the latest now by pinning the tag: npx -y ${tt}@latest <cmd>`),d.message(`Still on ${t} after that? Clear the npx cache: …Fix: Pin versions and sources; vendor anything fetched at install time.…he owner already said yes in Slack or on the dashboard. Do not ask again, and **do not decline because other pages link to it: do the whole job in one change.** (1) Find ever…Fix: Remove the text that addresses the agent rather than the reader; describe behavior, do not instruct.… kr()},{command:"update-cli",label:"Update the CLI to the latest version",hint:"npm install -g @seoagent-official/seoagent@latest + refresh your projects",run:async()=>await _r({})},{command:"refresh",label:"R…Fix: Pin the exact version (`[email protected]`, `==1.2.3`) so every install gets the bytes that were reviewed.Cost to the agent
Tokens estimated at four characters each. Skills load their instruction text when triggered; the figure is what that costs.
Known vulnerabilities
No advisories in OSV for @seoagent-official/seoagent@1.139.1 as of 4d ago. This is the package itself, not its dependencies.
What would make this Verified
7 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Unclaimed publisher≈ +8 on the totalClaim seoagent-official: 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.
- Hidden zero-width characters detected≈ +4 on the totalKeep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.
- Privileged sudo command≈ +4 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.
- Unicode escape sequence detected≈ +2 on the totalPut hosts, commands and strings in plain source. Decoding at runtime looks identical to malware and costs points on its own.
- npx invocation of non-well-known package≈ +2 on the totalPin versions and sources; vendor anything fetched at install time.