A fictional inventory webapp ("Acme") with deepsec wired up. This is the rich reference — a worked plugin + custom matchers + filled-in INFO.md showing what a scanning workspace looks like once it's been loved on for a while.
Files (read in this order):
package.json— declaresdeepsecas a dependency.deepsec.config.ts— loadsINFO.mdinline, registers two custom matchers via an in-line plugin.matchers/webapp-debug-flag.tsandmatchers/webapp-route-no-rate-limit.ts— example custom matchers tuned for this codebase's helpers.INFO.md— the AI prompt context: auth shape, threat model, false-positive sources.config.json— optional per-project config (priorityPaths,promptAppend,ignorePaths).
deepsec init produces a minimal scaffold inside .deepsec/ —
config + INFO.md + SETUP.md + env/gitignore. No custom matchers,
no plugin.
This sample is what .deepsec/ can grow into over time. Read it for
shape; don't copy it as your starting point. The intended flow:
# Start minimal: from your repo root.
npx deepsec init
cd .deepsec && pnpm install
# Let your agent fill INFO.md, then scan.
# Later, when a true-positive finding suggests a matcher worth keeping,
# look at this sample's matchers/*.ts for the shape, and read
# docs/writing-matchers.md for the workflow that grows it.From this directory (works because the monorepo symlinks deepsec in
for tests):
pnpm deepsec scan --project-id webapp --root ./your-app
pnpm deepsec process --project-id webappdeepsec walks up from cwd to find deepsec.config.ts, so any
subdirectory works too.