September 21, 2026

v0.5.0@sixthwall packages 0.5.0

Added

  • sixthwall deps: dependency vulnerability check. Reads your lockfile (pnpm, npm or yarn), asks the OSV database which installed versions have published advisories, and reports each as a normal finding with the fixed version, a one-line update command and a prompt for your AI tool. This is the only command that uses the network; it sends package names and versions to api.osv.dev and nothing else. --fail-on works the same as for scan.
  • Vulnerability wall on the site at /advisories: the latest reviewed npm advisories from the GitHub Advisory Database, refreshed hourly, each with affected versions, whether a fix exists, and a link to the SixthWall rule that catches the same class of mistake in your own code. RSS at /advisories/feed.xml.

Websitesixthwall.dev

Added

  • Vulnerability wall at /advisories with an RSS feed: the latest reviewed npm advisories, refreshed hourly, each linked to the SixthWall rule that catches the same mistake in your own code.
  • Changelog is now an index by day with one page per date.

Changed

  • Next.js updated from 16.1.6 to 16.3.5. Our own new sixthwall deps command found 30 advisories against the old version, two of them critical. The site now runs the patched release.
  • Rule pages cover all 33 rules, including the Supabase and Firebase folders.

v0.4.1@sixthwall packages 0.4.1

Fixed

  • The published rules package was missing the Supabase and Firebase folders. A clean npx @sixthwall/[email protected] reported 28 rules, not 33, and never scanned SQL migrations or Firebase rules files. The package manifest now includes every rule folder, and a test fails if a rule on disk would not be published.
  • Updated glob to the current major so installs no longer print a deprecation warning.

v0.4.0@sixthwall packages 0.4.0

Added

  • 18 new rules, 33 in total. The scanner now covers the mistakes that actually leak data in apps built with Lovable, Bolt, v0, Cursor and Claude Code:
    • Supabase: service_role key reachable from the browser (AI-SUPA-001), row-level security disabled or everything granted to anon (AI-SUPA-002), policies that use using (true) or give anon write access (AI-SUPA-003), tables created without RLS (AI-SUPA-004).
    • Firebase: Firestore, Realtime Database and Storage rules open to everyone (AI-FIRE-001) or to any signed-in user without an owner check (AI-FIRE-002).
    • Next.js route handlers that change data without checking who is asking (AI-NEXT-001).
    • Records looked up by id with no owner check in authenticated handlers (AI-IDOR-001).
    • Redirect targets taken from the request (AI-REDIR-001), server-side fetches of caller-supplied URLs (AI-SSRF-001), file paths built from the request (AI-PATH-001), shell commands built from variables (AI-CMD-001), HTML inserted without sanitising (AI-XSS-001).
    • Math.random for tokens, MD5/SHA-1 for passwords, short random tokens, jwt.decode used for auth, algorithm none (AI-CRYPTO-001); certificate checking switched off (AI-TLS-001); webhooks processed without signature verification (AI-WEBHOOK-001); request objects passed straight into MongoDB queries (AI-NOSQL-001); secrets written to logs (AI-LOG-001).
  • New file types. Supabase SQL migrations (.sql) and Firebase rules (firestore.rules, storage.rules, database.rules.json) are scanned as text, with -- and // comments ignored. No new native modules.
  • Rule guards: requires_present, and two new contexts, nextjs-route and webhook-route.
  • Safe and vulnerable fixtures for Supabase and Firebase, enforced by the precision suite.

Changed

  • AI-SECRET-002 no longer reports service-role keys; AI-SUPA-001 owns that case with a Supabase-specific fix.
  • The rules page on the site now lists every rule folder, and categories have plain-language names.

v0.3.0@sixthwall packages 0.3.0

Changed

  • Far fewer false alarms. Rules now match across lines, so code formatted by Prettier or an AI tool no longer trips the option-object checks (expiresIn, httpOnly, cookie flags on the next line). Matches inside comments are ignored. A rule can declare unless_present, requires_context and exclude_paths, and a pattern can restrict itself to client files.
  • Absence rules fire once per app, not once per route file. "Missing auth middleware", "missing rate limiting" and "missing security headers" only apply to the file that creates the app (express(), new Hono()), never to client components, and the .get('/…') heuristic that flagged axios.get is gone. Auth-route detection requires a server object such as app.post('/login').
  • Four noisy rules rewritten. AI-INJECT-001 is now "Request body saved straight to the database" (mass assignment) instead of firing on every req.body read. AI-SECRET-002 flags secrets under NEXT_PUBLIC_/VITE_/REACT_APP_ prefixes anywhere, and server secrets only inside client files; it no longer tells a server file its secret is "in the browser bundle". AI-SECRET-003 is a project-level check that really looks at .gitignore and the git index. AI-CONFIG-002 is low severity, server-only, and skips config and test files.
  • Password rule is precise. AI-AUTH-005 flags create({ password: req.body.password }), findFirst({ where: { password: … } }) and === comparisons, and skips any file that uses bcrypt, argon2, scrypt or an auth provider. Reading req.body.password to hash it is no longer a critical finding.
  • Client-side auth rule downgraded to medium and requires an access decision (redirect, render, admin flag), not merely reading a token to send as a header.
  • Score is explainable and less brutal. The first finding at a severity costs full weight; repeats cost 40%. Caps sum to 95 so a project is never shown 0/100. The hidden 1.2× multiplier is gone. Output now says how many points fixing the top severity recovers.
  • Grouped output. The first occurrence of each rule is shown in full; further occurrences are one-liners under "Same issues elsewhere".
  • Rule coverage extended: Prisma $queryRawUnsafe/$executeRawUnsafe, SQL built into a variable first, knex.raw/sequelize.query templates, NextResponse.json({ error: e.message }), catch (e) variants, cookies().set(…) without httpOnly, reflected CORS origins (origin: true, echoing the request origin), GitHub/Slack/Google/SendGrid/Stripe-webhook/Anthropic token shapes, JWT-shaped service keys, and Next.js const body = await req.json() written as data.
  • Fixtures: safe twins for Express, a React client component and a Next.js route handler must produce zero findings; the precision test enforces it in CI.
  • Dependencies: glob 11 (removes the deprecation warning on install).

v0.2.2@sixthwall packages 0.2.2

Fixed

  • TypeScript files were never scanned. Every rule is declared for JavaScript and the matcher required an exact language match, so .ts and .tsx files got zero rules. TypeScript now runs the JavaScript rule set.
  • Diff mode missed new files. sixthwall scan only looked at modified tracked files; untracked files, which is what AI tools create, were invisible and reported as clean. Untracked files are now included.
  • Diff mode from a subdirectory scanned nothing. Paths are now resolved against the repository root.
  • The CLI nagged itself to update. The version was hardcoded as 0.2.0 in eight places. It now comes from package.json at build time. The update notice goes to stderr and is skipped for --format json and sarif, so piped output is always valid.
  • Nothing ever blocked. Default block_on is now [critical]; the pre-commit hook and the generated GitHub Action rely on it. New --fail-on <severity|none> flag overrides it per run.
  • The generated GitHub Action never failed. A shell escaping bug is fixed; the workflow now uses --fail-on critical.
  • Watch mode never fired. chokidar 4 dropped glob support; the watcher now filters paths itself and queues changes instead of dropping them.
  • .sixthwall/ignore did nothing on Windows. Paths are normalised to forward slashes before matching.
  • Fix Pack prompts embedded absolute paths and were cut off. Prompts use repo-relative paths, are never truncated, and are no longer wrapped in box characters that ended up in the clipboard.
  • Evidence containing $&, $1 or $$ no longer corrupts the prompt template.
  • --severity and --format are validated; a typo is an error instead of a silent clean result.
  • Not-a-git-repo, no-changes and nothing-to-scan cases print a plain explanation instead of a stack trace or a false clean.
  • SARIF output: one rule entry per rule, ruleIndex, relative URIs with uriBaseId.
  • The first scan run by init respects the exclude list it just wrote.

Changed

  • Finding output rewritten: relative paths, calmer wording per severity, score label "AT RISK" instead of "CRITICAL", and a "Start here" next step after the summary.
  • MCP server: security_score runs a full scan (it ran a diff scan and returned 100/100 on unchanged projects); scan_code accepts paths and project_root, includes the minimal patch in results, caps output at 25 findings, and returns a proper error outside a git repo. New list_rules tool. Version reported from package.json.
  • rules update explains that npx already fetches the latest release.
  • Default excludes gained build, out, coverage, .venv, *.min.js and *.d.ts; bare names in exclude match that folder anywhere.