vigolium-scanner skill with AI coding agents, Claude Code and OpenAI Codex, to operate the Vigolium CLI for web vulnerability scanning, security testing, and custom extension authoring.
Skill repository: github.com/vigolium/skills — or install the copy embedded in your vigolium binary, which always matches your installed version.
Quick Install
vigolium skills install (added in v0.2.1) writes the vigolium-scanner bundle straight from the binary, so it can never drift from the CLI you’re driving. Pick the agent with --agent claude|codex|agents and the location with --scope project (current folder) or --scope global (home dir). Run vigolium skills to list what’s bundled and vigolium skills get vigolium-scanner to print a bundle without installing it.
Prefer to pull the latest from the repo instead? Use the external skills installer:
<agent-name> with your agent (e.g., claude-code, codex).
The three machine contracts
Whether or not you install the skill, these are the interfaces a program drives Vigolium through. They are additive — default human output is unchanged.--events ndjson: watch a scan while it runs
Don’t poll the database and don’t invent a patience message — ask for the stream. One JSON object per line on stdout, flushed per event, while the human console stays on stderr:
scan, run, scan-url, scan-request. Types: scan.started, phase.started|progress|finished, waf.block, waf.pacing, finding.new, error, scan.finished.
The three you should actually branch on:
waf.block— the edge started filtering. Results for that host are incomplete; do not read a thin surface as a clean target.error— a phase failed and the scan carried on. Non-fatal by construction, so this is never a reason to abandon a run that is still producing findings. A failure that ends the run rides onscan.finished{status:"failed"}instead.scan.finished— always last, includingstatus:"interrupted"on SIGINT/SIGTERM. Its absence means the process was killed outright (SIGKILL can’t be caught), so treat a stream that stops without it as a hard kill, not a completed scan.
scan_uuid (a sweep is several invocations) and v, the event-schema version. This replaces scraping vigolium log for [waf-block-detected] markers. Full event table: CLI References.
-j: one envelope, every command
items — it is the row array, and since v0.4.6 the only one. The historical row keys (records, findings, scans, rows, stats) are gone from the default output: they shipped a second full copy of every row, which on a 20-record compact read was 19,983 bytes against 7,884 of actual rows. --json-legacy-keys (or VIGOLIUM_JSON_LEGACY_KEYS=1) restores the alias for a caller still migrating, at that cost.
Assert db_path: the database open order ends at one shared default file, so a fall-through silently mixes engagements. Run the query field rather than composing your own follow-up.
query is a ready-to-run follow-up pinned to the same store and scope, correctly shell-quoted:--db / --stateless / --project-uuid flags inside that string are load-bearing. Under --glob-db the field is absent, because the merged source is a temporary database that no argument list can reopen.vigolium version --json, which reports schema_version and db_schema_version.
Exit codes
0 success · 1 error · 2 usage error · 3 fuzz --fail-on-match · 4 --fail-on gate tripped.
3 and 4 are completed results, not failures: the output was written before the code was chosen. When it was not written, the run is 1 with error.code: "export_failed", and that outranks the gate.
3 and 4 are completed results, not failures. The output was written before the code was chosen. --soft-fail forces the process status to 0 for all of them while leaving the output intact — under --json the error object still reports the code that would have been used, plus "soft_fail": true. See the full table.
One document per invocation
Under--json you get exactly one document, whatever happens:
- Flag order does not matter.
traffic --bad --jsonandtraffic --json --badboth emit oneusage_errorobject. - A command that already wrote its result does not get an error object appended to it — the exit code carries the outcome.
- Nothing else is ever written to stdout. Banners, prompts, progress, and warnings all go to stderr.
usage_error, source_missing, source_unreadable, source_incompatible (a valid SQLite file that is not a Vigolium store — you are pointed at the wrong file), export_failed (the run finished but a requested artifact was not written — retry the export, not the scan), gate_tripped, failed. traffic body and traffic headers add four of their own: record_not_found, body_unavailable, body_decode_failed, body_incomplete.
Confirmation for a destructive command requires a terminal. Without one it refuses immediately with exit 2 rather than blocking or reading your data stream as the answer; pass --force to authorize it non-interactively. --json is not authorization. Reading stdin is bounded by --input-read-timeout (default 3m, 0 disables), so a producer that never closes its end will not hang the process.
Discovering the interface
Don’t parse help text. Every registry that validates a flag can print itself:strategy --json is generated from the same registries the flags are validated against, so phases[].canonical and phases[].aliases are exactly what --only, --skip, and run <phase> accept.
Credentials
auth list and config ls redact secrets by default — session tokens, auth headers, stored login requests, and login bodies. This applies under --json too, because --json output is the output most likely to end up in a transcript. --show-secrets reveals them and prints a warning to stderr.
Redacted rows keep has_session_token, header_names, and a session_token_fingerprint (a short stable digest), so you can still tell two sessions apart or confirm a rotation landed without ever reading the secret.
What the Skill Does
The skill teaches the AI agent how to:- Pick the right vigolium command for any security testing task
- Construct correct flag combinations with proper syntax
- Follow scanning workflows end-to-end (ingest -> scan -> triage -> export)
- Write custom JavaScript extensions using the
vigolium.*API - Operate AI agent modes (query, autopilot, swarm)
- Manage data: browse traffic, filter findings, export reports, clean databases
SKILL.md stays small, and detailed docs are loaded on demand when the agent needs deep flag information or extension authoring guidance.
Skill Structure
These filenames changed in v0.3.7–v0.3.9: the references were renamed to shorter stems,
flags-reference.md became the generated flags.generated.md, server-and-ingestion.md split into server.md + ingest.md, and fuzzing and the Burp bridge moved out of agent-loop.md into their own files. A separate agent-browser skill was dropped. Re-run vigolium skills install to pick up the current layout.Installation
Option A:vigolium skills install (recommended — embedded, version-matched)
vigolium binary, so vigolium skills install can never install a stale copy — it always matches the CLI version you’re driving. --agent accepts claude, codex, or agents (an agentskills.io-compatible layout); --scope is project (current folder) or global (home dir). Inspect what’s bundled first with vigolium skills (list) and vigolium skills get vigolium-scanner (print).
Option B: Install via npx / bunx (pulls the latest from the repo)
npx:
<agent-name> with your agent (e.g., claude-code, codex). This fetches the skill from the vigolium/skills repository and registers it automatically.
Option C: Clone and copy manually
scan, vigolium, agent autopilot, vulnerability scanner, openapi scan, etc. In Claude Code, you can also invoke it explicitly with /vigolium-scanner.
Usage Examples by Category
1. Scanning
Basic scan against a single target:Do not pre-prefix a hostname list. Since v0.4.8 a schemeless target —
example.com, example.com:8443, or a whole -T file of bare hostnames — is normalized to http:// at every entry point (CLI, REST API, agent swarm, scan-url), before the dedup, so example.com and http://example.com count as one target. Before v0.4.8 such lists scanned fine under probe, discovery and known-issue-scan but silently produced zero spidering records, and --only spidering --soft-fail still exited 0. See Schemeless targets.--format sqlite (aliases sqlite3, db) requires -S/--stateless + -o; reopen it with vigolium finding -S --db scan.sqlite.
Scan to a browsable filesystem tree (no DB needed):
--format fs writes two sibling dirs off the -o base — run-traffic/ and run-findings/ — so you can investigate with plain ls/grep/jq. Each <host>/<id>.req is the raw, replayable request (strip the leading @target line), <id>.resp.headers/<id>.resp.body hold the gzip-decoded response, and <id>.md under -findings/ is the finding cross-linked to its .req. Start from index.json in each dir — jq it to map every id to its url/status/severity. Works with or without -S; honors --omit-response. See Output and Reporting for the full layout.
Scan to SARIF (for GitHub code scanning / DefectDojo):
--format sarif writes a SARIF 2.1.0 log; it also works on vigolium export --format sarif and vigolium import --format sarif (the path for publishing an agentic source audit). Code findings anchor to file:line so a consumer can annotate a diff; HTTP findings anchor to their URL and carry the evidence exchange in webRequest/webResponse. See Output and Reporting.
Scan with custom scanning profile:
2. Input Formats
OpenAPI 3.x spec with explicit base URL:3. Phase Control
Run only discovery (content enumeration):4. Module Filtering
List all available scanner modules:5. Server & Ingestion
Start the API server (default port 9002):./mirror/traffic/<host>/… and ./mirror/findings/<host>/… as it lands in the DB — the same layout as --format fs, except the indexes are append-only index.jsonl (one object per line — tail/grep it live) and per-host ids resume across restarts. Point your agent at ./mirror to read ingested Burp/proxy traffic as files while it streams in.
High-concurrency server:
6. AI Agent Modes
Agent (Template-Based)
Security code review:security-code-review: Comprehensive security reviewinjection-sinks: Find injection sinksauth-bypass: Auth bypass vectorssecret-detection: Hardcoded secretsendpoint-discovery: API endpoints from sourceapi-input-gen: Generate test inputscurl-command-gen: Generate cURL commandsattack-surface-mapper: Map attack surfacenextjs-security-audit: Next.js security reviewreact-xss-audit: React XSS auditcors-csrf-review: CORS/CSRF config audit
Agent Query (Freeform Prompt)
Inline prompt:Agent Autopilot (Autonomous Scanning)
Basic autonomous scan:- Yolo-mode Bash — autopilot runs the model’s
bashcalls without an approval prompt. Common scanner, record, replay, finding, OAST, auth-session, and Burp operations are also first-class tools; the model can still shell out for uncovered CLI operations. - The engine only hard-rejects catastrophic patterns (
rm -rf /,ddto block devices, fork bombs,mkfsagainst real devices). There is novigolium-only command allowlist. - Per-tool timeout: 5 minutes (
ToolTimeout). - Intensity-driven defaults: quick=150 / balanced=500 / deep=1500 commands (
MaxCommands), browser enabled at every intensity. - In legacy/shadow mode,
report_findingsoft-warns at 50 findings and hard-caps at 200. In enforced mode,propose_candidateroutes claims through fresh-context verification before promotion. - Run autopilot in a disposable container or VM scoped to in-scope targets — see Security Warning.
Agent Swarm (AI-Guided Multi-Phase Scan)
Basic swarm scan with discovery (all phases):- native-normalize — parse
--input/stdin/record-uuid into HTTP records - auth (optional) — browser-driven login, writes auth headers/cookies
- source-analysis (if
--source) — 4-call wave that emits routes, session-config, and source extensions - code-audit (if
--code-audit) — code-level security audit, findings → DB - native-discover (if
--discover) — crawl/spider/JS-scan - plan — master agent picks modules and writes an extensions spec
- native-extension — compile/validate generated JS extensions (Sobek)
- native-scan —
runner.RunNativeScan()with the planned modules + extensions - triage (if
--triage) — AI verifies findings, may request targeted rescans - native-rescan — targeted rescan loop, bounded by
--max-iterations
7. Traffic & Results Browsing
Browse all stored HTTP traffic:Since v0.4.7,
--body searches only the body and --header only the header block; --search is the one that spans the whole exchange. Terms are matched literally, so % and _ are ordinary characters (--body 'api_key' no longer also matches api-key). --host/--path stay patterns, where * is the wildcard.--url is equality, repeatable and OR-ed, and applied before pagination — the positional term is a substring search, and --uuid is identity.
Extract one message without re-sending it:
decoder_capped: true body: pull it whole in one call rather than concluding a string is absent. Four failure states are distinguishable — record_not_found, body_unavailable (that side was never captured), body_decode_failed, body_incomplete (a prefix; --allow-incomplete writes it anyway) — and a captured, genuinely empty body succeeds with empty: true.
Keep a large result out of your context:
-o works on traffic, finding and db ls under -j. The file is byte-identical to what would have been printed; stdout gets {"artifact":"json_result","output":…,"bytes":…,"sha256":…,"complete":true}. complete: false means it holds one page.
Search in headers:
-S/--stateless + --db reads a --format jsonl export or a standalone .sqlite directly with project scoping off, writing nothing to your project DB.
Replay stored traffic (re-send requests):
8. Data Management
Database statistics:9. Export & Reports
Full JSONL export:10. Whitebox / Source-Aware Scanning
Source-aware scanning runs through the agent modes via the--source flag — the native vigolium scan does not take source code. Use agent swarm for an AI-driven source-aware DAST scan, or agent audit for a source-only (SAST) review.
Source-aware scan with local source code:
--target is required whenever --source is given. The source-analysis and code-audit phases run automatically when --source is present.
Scan with source cloned from Git:
11. JavaScript Extensions
Install preset examples:vigolium.agent.generatePayloads() and vigolium.agent.analyzeResponse().
YAML extension (simple pattern matching):
12. Configuration & Projects
View all configuration:Natural Language Examples
These are examples of natural language prompts you can give to Claude Code or Codex with the skill installed. The agent will translate them into the correct vigolium commands.Tips & Best Practices
- Start with
scan -t: It’s the most common command. Add flags incrementally. - Use strategies:
litefor quick checks,balancedfor most cases,deepfor full coverage,whiteboxwhen you have source code. - Phase isolation: Use
--onlyorvigolium run <phase>to iterate on a single phase without re-running the entire pipeline. - Module tags: Filter modules by technology (
spring,nodejs) or vulnerability class (xss,injection) to reduce noise. - Watch mode: Add
--watch 5stotraffic,finding, ordb statsfor real-time monitoring during long scans. Under--jsonit switches to NDJSON — one compact document per line, no clear-screen, no heading — and it is rejected on a command that writes. - Triage at scale first:
vigolium run probe -T hosts.txtsweeps thousands of hosts with one request each. Rank bysurface_score, then point a real scan at the top of that list — don’t send a full scan at a list you haven’t triaged. - Count, don’t dump:
vigolium traffic --group-by status_coderuns the same filters the listing would and returns buckets. Never pull rows into your context just to count them. - Route bulk output to disk:
-o findings.jsonon a-jread puts the document in a file and a receipt on stdout. For one message,traffic body/traffic headersbeat exporting a whole record tree. - Dry-run agents: Always
--dry-runfirst for agent commands to preview prompts before spending AI tokens. - Swarm over autopilot: Use
agent swarm --discoverfor structured scans (lower cost, reproducible). Useagent autopilotfor exploratory, creative scanning. - Extensions for custom logic: Write JS extensions instead of modifying core modules. They run alongside built-in modules with
--ext. - Projects for isolation: Use
vigolium project createto keep scan data separate across engagements. - Export early: Run
vigolium export --format html -o report.htmlto share results as interactive reports.
