agentscan

agentscan

Your agent config says the guard is on. The script is gone. Nothing told you.

Linters read the code your agent writes. This reads the agent itself — skills, hooks, MCP servers, lockfiles, policy files, and the Codex, Antigravity, Cursor, Gemini, Kiro, and Devin CLI contracts.

2.0.0 · 143 checks · offline on check

npx @chimix/agentscan check
agentscan check
$ agentscan check
 
ERROR rule:claude.hook.missing-script
PreToolUse hook points at a script that does not exist: .claude/hooks/guard-destructive-bash.js
PreToolUse @ .claude/settings.json · .claude/hooks/guard-destructive-bash.js
 
Summary: 1 error · score 90/100

How it works

No AI, no network on check. Read the config, read the disk, compare. Same tree in, same findings out, every time.

  • 143 checks, each labeled spec-required, vendor-recommendation, security, internal-consistency, or heuristic.
  • No network — check never opens a socket.
  • Writes nothing — the scanned tree is left untouched.
  • Spec-required checks cite a published line in docs/spec/. Heuristics stay at info and are labeled.

What 2.0.0 reads

  • Codex: .codex/hooks.json and [hooks] in config.toml, and the same files under --global.
  • Antigravity: rules, skills, and hooks. url is an alias of serverUrl.
  • Cursor: ~/.cursor/hooks.json and ~/.cursor/mcp.json under --global.
  • Gemini: hooks in .gemini/settings.json and in the user file under --global.
  • Kiro: hooks, skills, and agents. SessionEnd, PreCompact, and PostCompact are triggers.
  • Devin CLI: hooks, MCP, and skills, beside the Windsurf contract.
  • Copilot: user mcp-config.json under --global.
  • Cline, Roo, Kilo, and Junie skill directories.
  • VS Code: .github/agents/*.agent.md frontmatter hooks.
  • Claude: user hooks, MCP, and agents under --global. CLAUDE_CONFIG_DIR also moves ~/.claude.json.
  • Every finding carries provenance.

Still unread: Cline hooks and agents, ~/.cursor/skills/, OpenCode's global config, ~/.continue/config.yaml, Windsurf auto-generated memories, Copilot policy hooks, and plugin hooks.json. .claude/settings.json stays Claude. Antigravity httpUrl does not launch a server. Kiro agents are inventory only and add no rule id.

Why the tool looks like this

An earlier build reported 37 findings across 17 real projects of which 25 were false — two checks had been written from what real projects looked like instead of from the spec. Both were deleted. Spec-required checks cite a published line in docs/spec/. Heuristics stay at info and are labeled. 1.0.0 was the first stable release. 2.0.0 ships 143 checks, still offline on check. 2.0.0 accepts only printed rule ids in ignoreRules, ignoreFindings, and explain. thresholds.skillDescriptionBytes and thresholds.skills are rejected; the listing budget is thresholds.skillListingChars.

Run it in 30 seconds

Point it at a project with agent config. On Node 20.11+ or Bun — the published bin is a single bundled file.

npx @chimix/agentscan check

For agents

Agents forget the audit. The skill tells them to run it before they edit a hook or claim a guard is on.

skills/agentscan/SKILL.md
When hooks · skills · MCP · AGENTS.md · skills-lock.json
Do npx @chimix/agentscan@latest --output prompt
do not skip claude.hook.missing-script (error)
Don't write the tree · guess if a hook is valid