seoagent@1.140.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-12 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: Hidden zero-width characters detected; 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 · 0 s · 1 scenarios · 0 deviationsStatic findings
…",".js",".mjs"]);function Kb(e,t){let n=Zu(e).toLowerCase();if(od.has(n)){if(!/^ ?---\r?\n/.test(t))return!1;try{return rd(oe(t.replace(/^ /,"")).data)}catch{ret…Fix: Keep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.…ed spec won't auto-upgrade."),d.message(`Run the latest now by pinning the tag: npx -y ${nt}@latest <cmd>`),d.message(`Still on ${t} after that? Clear the npx cache: …Fix: Pin versions and sources; vendor anything fetched at install time.… → 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.…"path";var Ji=`command -v seoagent >/dev/null 2>&1 && seoagent sync --silent || npx -y ${Ur} sync --silent`,dc=60;function pc(e){let t=Tt(e,_);zi(t,{recursive:!0});le…Fix: Pin versions and sources; vendor anything fetched at install time.…r as lv,isCancel as Ht,cancel as Wt,confirm as Yp}from"@clack/prompts";var zt=[".env.local",".env.production",".env"],Rl=["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.… 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.…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.…","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"],sy=["studio","sanity"],ay=[{cms:"strapi",deps:[…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…ccept:"application/json"},signal:AbortSignal.timeout(1e4)}),o=null;try{o=await r.json()}catch{}return Uu(r.status,o)}catch(n){return{status:"error",terminal:!1,message:n.message||"network error"}}}function Ku(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.…i,"").toLowerCase()==="seoagent"}function w(e,t=Ii()){return t?`seoagent ${e}`:`npx -y ${Ur} ${e}`}import{randomUUID as cm}from"crypto";import{existsSync as Bl,mkdirS…Fix: Pin versions and sources; vendor anything fetched at install time.…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.…aml \u2014 using this directory for project signals"});let r=null;t?.("Scanning .env files for public / site URLs\u2026");let o=by(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.…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.…ation/json"},signal:AbortSignal.timeout(T$)});if(!e.ok)return null;let t=await e.json();return typeof t.version=="string"?t.version:null}catch{return null}}async function Cp(e){try{return await O$({current:e,now:new Date,fetchLatest:D$,rea…Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.…d.error(`Update failed. Try manually: npm install -g ${nt}@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.…of v=="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.…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.…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.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.140.1 as of 2d 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.
- Hidden zero-width characters detected≈ +4 on the totalKeep SKILL.md to visible, descriptive text. Remove comments and encoded text that address the agent.
- 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.