openpitstop 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/PRIVACY.md +5 -3
- package/README.md +27 -9
- package/dist/analyzers/securityStatic.js +194 -3
- package/dist/analyzers/securityStatic.js.map +1 -1
- package/dist/analyzers/util.d.ts +1 -1
- package/dist/analyzers/util.js +2 -1
- package/dist/analyzers/util.js.map +1 -1
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/test.d.ts +41 -0
- package/dist/commands/test.js +297 -0
- package/dist/commands/test.js.map +1 -0
- package/package.json +1 -1
- package/templates/pitstop.prompt.md +1 -0
package/PRIVACY.md
CHANGED
|
@@ -15,11 +15,13 @@ explicit cases listed below.
|
|
|
15
15
|
- **No SaaS, no accounts, no cloud.** There is no OpenPitStop server, no
|
|
16
16
|
dashboard, no login. Nothing to sign up for.
|
|
17
17
|
- **No code uploads.** `scan`, `try`, `verify`, `gate`, `integrity`, `pen`,
|
|
18
|
-
`ledger`, `watch`, `trends`, `digest`, `share`, `honesty` — every
|
|
19
|
-
these analyzes your files locally. Your source never leaves your
|
|
18
|
+
`ledger`, `watch`, `trends`, `digest`, `share`, `honesty`, `test` — every
|
|
19
|
+
one of these analyzes your files locally. Your source never leaves your
|
|
20
|
+
machine.
|
|
20
21
|
- **No third-party processes** are ever spawned that you didn't initiate
|
|
21
22
|
(`scan` runs the scanners you have installed, e.g. `gitleaks`, `semgrep`,
|
|
22
|
-
`osv-scanner`, `pip-audit`
|
|
23
|
+
`osv-scanner`, `pip-audit`; `test` runs your own test scripts — or honestly
|
|
24
|
+
reports them as `skipped`).
|
|
23
25
|
- **The static security pass is fully offline.** It reads files and matches
|
|
24
26
|
patterns on your machine; it never sends code anywhere. The only network
|
|
25
27
|
calls in the entire security pipeline are the dependency audits listed
|
package/README.md
CHANGED
|
@@ -44,7 +44,7 @@ your agent.
|
|
|
44
44
|
| [See it in 90 seconds](#see-it-in-90-seconds) | [What OpenPitStop actually does](#what-openpitstop-actually-does) · [Every command](#every-command) |
|
|
45
45
|
| [Architecture](#architecture) | [Known limitations](#known-limitations) · [Contributing](#contributing) · [License](#license) |
|
|
46
46
|
|
|
47
|
-
**Straight to one feature:** [The scan](#the-scan) · [Verify](#verify) · [Trends](#trends) · [Inspect](#inspect) · [Repro](#repro) · [The pen test](#the-pen-test) · [Report](#report) · [Share](#share) · [Honesty](#honesty) · [Try it on your repo](#try-it-on-your-repo) · [The live shield](#the-live-shield) · [The GitHub Action](#the-github-action) · [The pre-commit hook](#the-pre-commit-hook)
|
|
47
|
+
**Straight to one feature:** [The scan](#the-scan) · [The test pyramid](#the-test-pyramid) · [Verify](#verify) · [Trends](#trends) · [Inspect](#inspect) · [Repro](#repro) · [The pen test](#the-pen-test) · [Report](#report) · [Share](#share) · [Honesty](#honesty) · [Try it on your repo](#try-it-on-your-repo) · [The live shield](#the-live-shield) · [The GitHub Action](#the-github-action) · [The pre-commit hook](#the-pre-commit-hook)
|
|
48
48
|
|
|
49
49
|
**Receipts:** [Caught in the wild](docs/caught-in-the-wild.md) — real gate output, screenshot-ready.
|
|
50
50
|
|
|
@@ -353,15 +353,21 @@ Security is two layers:
|
|
|
353
353
|
other stacks, and `gitleaks`/`semgrep` when installed. A failed audit is reported as
|
|
354
354
|
`skipped` with a repair hint — deps that were never scanned are never reported as clean.
|
|
355
355
|
2. **The static vulnerability pass** (fully offline, every language, no tooling needed) —
|
|
356
|
-
the
|
|
356
|
+
the classic classes plus the full posture: **SQL injection** (concatenated/
|
|
357
357
|
interpolated queries, ORM raw builders, `$where`, Python f-strings), **authentication**
|
|
358
358
|
(cleartext password compares, missing hashing, `Math.random` tokens, inline JWT
|
|
359
|
-
secrets
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
359
|
+
secrets), **authorization** (unprotected data routes, admin routes without role
|
|
360
|
+
checks), **input validation** (unrestricted uploads, unvalidated money fields,
|
|
361
|
+
`eval`, XSS sinks), **secret management** (known credential formats, inline secret
|
|
362
|
+
literals, committed `.env` files) — plus command injection, path traversal, SSRF,
|
|
363
|
+
**rate limiting** (missing limiters on state-changing routes, limits set so high they
|
|
364
|
+
are decorations), **database lockdown** (privileged accounts in committed connection
|
|
365
|
+
strings, `GRANT ALL`/`SUPERUSER`, TLS-free connections, missing row-level security),
|
|
366
|
+
**data exposure** (credentials/PII in API responses, full DB rows shipped to the
|
|
367
|
+
client, PII in logs), **hidden vulnerabilities** (disabled TLS verification, `alg:
|
|
368
|
+
none` JWTs, security TODOs, lint/type bypasses, tokens in `localStorage`, committed
|
|
369
|
+
minified bundles, backup files), CORS+credentials, missing security headers, CSRF
|
|
370
|
+
exposure, stack leaks and sensitive logging.
|
|
365
371
|
|
|
366
372
|
Every static finding is labeled `[indicated]` and ships with its exact **fix**; `scan`
|
|
367
373
|
and `try` print the complete identify-and-solve list under the score box, so the report
|
|
@@ -378,9 +384,20 @@ Scans are fast by design: the checks run **in parallel**, flaky detection runs t
|
|
|
378
384
|
(plus `osv-scanner`) results are cached for 24 hours (keyed on the lockfile hash) so
|
|
379
385
|
repeated scans inside one fix loop never hit the registry again.
|
|
380
386
|
|
|
387
|
+
### The test pyramid
|
|
388
|
+
|
|
389
|
+
`pitstop test [path] [--unit] [--integration] [--e2e]` runs your **unit, integration and
|
|
390
|
+
e2e** layers the way a senior dev would — it discovers each layer (`test`/`test:unit`,
|
|
391
|
+
`test:integration`/`test:it`, `test:e2e`/`e2e` npm scripts first, then vitest/jest/
|
|
392
|
+
pytest/playwright/cypress by config), executes them, and reports per-layer pass/fail
|
|
393
|
+
counts with the **names of the failing tests**, so the fix list is actionable. Layers it
|
|
394
|
+
cannot find are reported as `skipped — no suite discovered`, never invented; the command
|
|
395
|
+
exits 1 the moment any layer fails, so CI can trust it. (Add `"test:e2e": "playwright
|
|
396
|
+
test"` to a repo and it is picked up automatically on the next run.)
|
|
397
|
+
|
|
381
398
|
## Every command
|
|
382
399
|
|
|
383
|
-
All
|
|
400
|
+
All 24 commands, grouped by job. Run them from inside a repo as `pitstop …` (CLI) or
|
|
384
401
|
`npx openpitstop …` (one-off); `/pitstop` in a tool drives the loop, the rest are
|
|
385
402
|
one-shot.
|
|
386
403
|
|
|
@@ -395,6 +412,7 @@ one-shot.
|
|
|
395
412
|
| `pitstop watch [path] [--interval ms]` | The live shield. Sits in a terminal and re-checks the moment you save a file, printing how the score moved. |
|
|
396
413
|
| `pitstop trends` | Turns your saved scan history into per-category sparklines and a score trend — watch a repo actually improve. |
|
|
397
414
|
| `pitstop budget [path]` | The token bill: how many scans/verifies/pens/repros you've run and the compute-seconds, plus advice on what to reuse in a fix loop. |
|
|
415
|
+
| `pitstop test [path] [--unit] [--integration] [--e2e]` | The test pyramid: discovers and runs the **unit, integration and e2e** layers, reports per-layer pass/fail with the failing test names. Any failing layer → exit 1. See [The test pyramid](#the-test-pyramid). |
|
|
398
416
|
|
|
399
417
|
**The fix loop — what the agent is told to do**
|
|
400
418
|
|
|
@@ -21,6 +21,17 @@ import { lineOf } from "./util.js";
|
|
|
21
21
|
* without role checks
|
|
22
22
|
* - Input validation: file uploads without limits, unvalidated money
|
|
23
23
|
* fields, eval/Function sinks, prototype pollution
|
|
24
|
+
* - Rate limiting: missing limiters on state-changing endpoints, limits
|
|
25
|
+
* set so high they are decorations, disabled limiters
|
|
26
|
+
* - Database lockdown: privileged accounts in committed connection
|
|
27
|
+
* strings, GRANT ALL/SUPERUSER, TLS-free connections, hardcoded DB
|
|
28
|
+
* passwords, missing row-level security
|
|
29
|
+
* - Data exposure: credentials/PII in API responses, full DB rows sent
|
|
30
|
+
* to the client, PII in logs, SELECT *
|
|
31
|
+
* - Hidden vulnerabilities: disabled TLS verification, alg:none JWTs,
|
|
32
|
+
* eval-atob deobfuscation, security TODOs, lint/type bypasses on
|
|
33
|
+
* sensitive code, tokens in localStorage, committed minified bundles,
|
|
34
|
+
* backup/editor files and .htpasswd in the tree
|
|
24
35
|
* - Config & transport: CORS+credentials, missing security headers,
|
|
25
36
|
* cleartext HTTP, insecure cookies, CSRF exposure, stack leaks,
|
|
26
37
|
* sensitive logging, weak hashing
|
|
@@ -63,6 +74,7 @@ const CODE_EXTS = new Set([
|
|
|
63
74
|
".html",
|
|
64
75
|
".vue",
|
|
65
76
|
".svelte",
|
|
77
|
+
".sql",
|
|
66
78
|
]);
|
|
67
79
|
/** Paths that a sane app treats as needing protection. */
|
|
68
80
|
const PROTECTED_PATH = "(?:admin|account|profile|settings|dashboard|orders?|checkout|payment|charge|billing|subscription|private|internal|api(?:/|)|users?|sessions?|transactions?|transfer|refund)";
|
|
@@ -156,6 +168,12 @@ export const STATIC_SECURITY_RULES = [
|
|
|
156
168
|
re: /\b(?:fetch|axios\.(?:get|post|put|patch|request)|got|request|superagent|http\.(?:get|post)|https\.(?:get|post))\s*\(\s*[`"']?[\s\S]{0,140}?(?:req\.(?:query|params|body|headers)|userInput|targetUrl|webhookUrl|callbackUrl|redirectUrl|userUrl|target)[\s\S]{0,40}?\)/g,
|
|
157
169
|
describe: () => "user-supplied URL reaches an HTTP client — SSRF lets attackers hit internal services (169.254.169.254)",
|
|
158
170
|
fix: "allowlist destinations: only https + your domain, or an explicit allowlist; never fetch a user-supplied URL",
|
|
171
|
+
accept: (_m, content) => {
|
|
172
|
+
// A loopback/localhost guard immediately before the call is a real
|
|
173
|
+
// (partial) mitigation for internal-probe scenarios — skip it.
|
|
174
|
+
const before = content.slice(Math.max(0, _m.index - 200), _m.index);
|
|
175
|
+
return !/\b(?:isLoopback|isLocalhost|isPrivate)\s*\(/.test(before);
|
|
176
|
+
},
|
|
159
177
|
},
|
|
160
178
|
/* --------------------------- XSS ----------------------------- */
|
|
161
179
|
{
|
|
@@ -351,6 +369,133 @@ export const STATIC_SECURITY_RULES = [
|
|
|
351
369
|
describe: () => "error.stack is shipped to the client — file paths, library versions and internals leak to attackers",
|
|
352
370
|
fix: 'log the stack server-side; respond with { error: "internal", id } and keep a correlation id',
|
|
353
371
|
},
|
|
372
|
+
/* ---------------------- Rate limiting ----------------------- */
|
|
373
|
+
{
|
|
374
|
+
category: "rate-limiting",
|
|
375
|
+
severity: "medium",
|
|
376
|
+
re: /\b(?:rateLimit|rate-limit|limiter)\w*\s*\(\s*\{[^}]{0,300}?\bmax\s*:\s*(\d{3,})\b/g,
|
|
377
|
+
describe: (m) => `rate limiter allows ${m[1]} requests per window — that's a decoration, not a defense: brute-force and abuse still fit through`,
|
|
378
|
+
fix: "tighten to 5–10 per window per IP+account on auth and state-changing routes (express-rate-limit: windowMs: 60_000, max: 5)",
|
|
379
|
+
},
|
|
380
|
+
{
|
|
381
|
+
category: "rate-limiting",
|
|
382
|
+
severity: "low",
|
|
383
|
+
re: /\bwindowMs\s*:\s*0\b|\bmax\s*:\s*0\b/g,
|
|
384
|
+
describe: () => "rate limiter configured with a zero window or zero max — effectively disabled middleware",
|
|
385
|
+
fix: "give the limiter a real window and max (5–10 per minute), or delete it until you can",
|
|
386
|
+
},
|
|
387
|
+
/* --------------------- Database lockdown -------------------- */
|
|
388
|
+
{
|
|
389
|
+
category: "database",
|
|
390
|
+
severity: "high",
|
|
391
|
+
re: /\b(?:DATABASE_URL|DB_URL|CONNECTION_STRING|connectionString|connection_?string|dsn|db_?uri|mongo(?:db)?_?uri|jdbc_?url|MYSQL_URL|PG_URL)\s*[:=]\s*["'][a-z0-9+]+:\/\/\s*(postgres|root|sa|admin|superuser):([^@\s/]{0,40})@/gi,
|
|
392
|
+
describe: (m) => `connection string uses the privileged account ${m[1]} with a committed password — every database in the fleet shares one superuser credential`,
|
|
393
|
+
fix: 'create a scoped role with only the privileges the app needs (SELECT/INSERT/UPDATE/DELETE, no DDL), a strong generated password in .env, and connect as it: postgres://app_user:${process.env.DB_PASSWORD}@db.internal:5432/app',
|
|
394
|
+
accept: (m) => Boolean(m[2]),
|
|
395
|
+
},
|
|
396
|
+
{
|
|
397
|
+
category: "database",
|
|
398
|
+
severity: "high",
|
|
399
|
+
re: /\bGRANT\s+ALL\s+PRIVILEGES\b|(?:ALTER|CREATE)\s+(?:USER|ROLE)\b[^;\n]{0,80}\b(?:SUPERUSER|SYSADMIN|DBA)\b/gi,
|
|
400
|
+
describe: () => "database grants hand out ALL PRIVILEGES / SUPERUSER — any compromise of this app is now a compromise of every database",
|
|
401
|
+
fix: "grant only what the app needs: GRANT SELECT, INSERT, UPDATE, DELETE ON <tables> TO app_user; run migrations with a separate CI-only credential",
|
|
402
|
+
},
|
|
403
|
+
{
|
|
404
|
+
category: "database",
|
|
405
|
+
severity: "medium",
|
|
406
|
+
re: /\bsslmode\s*[:=]\s*["']?(?:disable|allow)["']?|\bssl\s*:\s*false\b|\buseSSL\s*:\s*false\b|\bencrypt\s*:\s*false\b|\btls\s*:\s*false\b/gi,
|
|
407
|
+
describe: () => "database connection without enforced TLS — queries, rows and credentials travel cleartext",
|
|
408
|
+
fix: 'require TLS on every connection: sslmode=require (or ssl: { rejectUnauthorized: true }); disable only for a localhost dev sandbox',
|
|
409
|
+
accept: (_m, content) => {
|
|
410
|
+
const before = content.slice(Math.max(0, _m.index - 300), _m.index);
|
|
411
|
+
return !/(?:localhost|127\.0\.0\.1|192\.168\.)/.test(before);
|
|
412
|
+
},
|
|
413
|
+
},
|
|
414
|
+
{
|
|
415
|
+
category: "database",
|
|
416
|
+
severity: "high",
|
|
417
|
+
re: /\b(?:db[_-]?password|database[_-]?password|pg[_-]?password|mysql[_-]?password|mongo(?:db)?[_-]?password|redis[_-]?password|jdbc[^;"]{0,30}password)\s*[:=]\s*["']([^"']{3,})["']/gi,
|
|
418
|
+
describe: (m) => `database password hardcoded in config (${m[1].length} chars) — every clone of the repo holds the key to the database`,
|
|
419
|
+
fix: "rotate it now, then read from the environment: password: process.env.DB_PASSWORD with DB_PASSWORD in .env (gitignored) and the CI secret store",
|
|
420
|
+
},
|
|
421
|
+
/* ---------------------- Data exposure ----------------------- */
|
|
422
|
+
{
|
|
423
|
+
category: "data-exposure",
|
|
424
|
+
severity: "high",
|
|
425
|
+
re: /\b(?:res|response)\.(?:json|send)\s*\(\s*\{[^{}]{0,200}\b(?:password|passwd|hash|apiKey|api_key|client_secret|secret|cardNumber|card_number|ssn|cvv|iban)\b[^{}]{0,40}\}/g,
|
|
426
|
+
describe: () => "credentials or PII in the API response body — the client never needed them, and now every log, XSS and third-party script can read them",
|
|
427
|
+
fix: 'return only what the UI needs: res.json({ id: user.id, name: user.name }) — never password/hash/apiKey; or a toJSON() that strips secrets',
|
|
428
|
+
},
|
|
429
|
+
{
|
|
430
|
+
category: "data-exposure",
|
|
431
|
+
severity: "medium",
|
|
432
|
+
re: /\b(?:res|response)\.(?:json|send)\s*\(\s*(user|users|account|accounts|profile|customer|order|orders)\b[\s\S]{0,120}/g,
|
|
433
|
+
describe: (m) => `full ${m[1]} object(s) returned to the client — if that's a DB row, password/hash/internal fields ride along`,
|
|
434
|
+
fix: "strip before sending: const { password, hash, ...safe } = user; res.json(safe) — or map explicit fields",
|
|
435
|
+
accept: (m) => !/\b(?:toJSON|pick|omit|select|strip|safeUser|sanitize)\b/.test(m[0]),
|
|
436
|
+
},
|
|
437
|
+
{
|
|
438
|
+
category: "data-exposure",
|
|
439
|
+
severity: "medium",
|
|
440
|
+
re: /\bconsole\.(?:log|info|debug|warn)\s*\([\s\S]{0,120}?(?:cardNumber|card_number|ssn|nationalId|bankAccount|iban|cvv|creditCard|passportNumber|dateOfBirth)\b[\s\S]{0,40}?\)/g,
|
|
441
|
+
describe: () => "PII (card/SSN/IBAN…) reaches the log pipeline — a data breach becomes searchable in log storage",
|
|
442
|
+
fix: "log a masked token, never the value: console.log({ cardLast4: card.slice(-4) })",
|
|
443
|
+
accept: (m) => !/\b(?:last4|last_?4|mask|redact|slice\(\s*-4\s*\)|\*{3})/i.test(m[0]),
|
|
444
|
+
},
|
|
445
|
+
{
|
|
446
|
+
category: "data-exposure",
|
|
447
|
+
severity: "medium",
|
|
448
|
+
re: /\bSELECT\s+\*\s+FROM\b/gi,
|
|
449
|
+
describe: () => "SELECT * — every column (password, hash, internal flags) ships to every caller; one careless response leaks the whole row",
|
|
450
|
+
fix: "name the columns you need: SELECT id, email, name FROM users — narrower columns, narrower blast radius",
|
|
451
|
+
},
|
|
452
|
+
/* ------------------ Hidden vulnerabilities ------------------ */
|
|
453
|
+
{
|
|
454
|
+
category: "hidden-vulnerabilities",
|
|
455
|
+
severity: "high",
|
|
456
|
+
re: /\brejectUnauthorized\s*:\s*false\b|\bNODE_TLS_REJECT_UNAUTHORIZED\s*[:=]\s*["']?0["']?\b|\bcurl\s+[^;\n]{0,60}-[kK]\b|\bwget\s+[^;\n]{0,60}--no-check-certificate\b/g,
|
|
457
|
+
describe: () => "TLS verification silently disabled — every 'secure' connection is MITM-able and nothing will ever complain",
|
|
458
|
+
fix: "remove the override: rejectUnauthorized: true (default), drop NODE_TLS_REJECT_UNAUTHORIZED, never curl -k in scripts — pin the CA if it's a private cert",
|
|
459
|
+
accept: (_m, content) => {
|
|
460
|
+
const before = content.slice(Math.max(0, _m.index - 300), _m.index);
|
|
461
|
+
return !/(?:localhost|127\.0\.0\.1|192\.168\.)/.test(before);
|
|
462
|
+
},
|
|
463
|
+
},
|
|
464
|
+
{
|
|
465
|
+
category: "hidden-vulnerabilities",
|
|
466
|
+
severity: "high",
|
|
467
|
+
re: /\b(?:algorithms?|alg)\s*[:=]\s*\[?\s*["']none["']\s*\]?/gi,
|
|
468
|
+
describe: () => "JWT accepts alg:none — a forged unsigned token validates as a real session",
|
|
469
|
+
fix: "verify with an explicit allowlist: jwt.verify(token, secret, { algorithms: ['HS256'] }) — 'none' is never an option",
|
|
470
|
+
},
|
|
471
|
+
{
|
|
472
|
+
category: "hidden-vulnerabilities",
|
|
473
|
+
severity: "medium",
|
|
474
|
+
re: /\beval\s*\(\s*(?:atob|Buffer\.from|btoa|decodeURIComponent|unescape)/g,
|
|
475
|
+
describe: () => "encoded payload decoded straight into eval — obfuscation exists to hide the logic from review",
|
|
476
|
+
fix: "delete the decoder-eval chain and replace the payload with the actual logic, plainly; if it's an external artifact, pin and hash it",
|
|
477
|
+
},
|
|
478
|
+
{
|
|
479
|
+
category: "hidden-vulnerabilities",
|
|
480
|
+
severity: "medium",
|
|
481
|
+
re: /\/\/\s*(?:TODO|FIXME|HACK|XXX|BUG)\b[^\n]{0,120}?(?:secur|auth|password|token|bypass|insecure|vuln|backdoor|ssl|encrypt|key|secret|csrf)/gi,
|
|
482
|
+
describe: () => "a comment acknowledges an unfinished security gap (TODO/FIXME/HACK) — 'we'll fix it later' is how breaches ship",
|
|
483
|
+
fix: "resolve it now or track it as a blocking ticket with an owner; security TODOs never make a release",
|
|
484
|
+
},
|
|
485
|
+
{
|
|
486
|
+
category: "hidden-vulnerabilities",
|
|
487
|
+
severity: "medium",
|
|
488
|
+
re: /\b(?:eslint-disable(?:-next-line|-line)?|@ts-ignore|@ts-nocheck|@ts-expect-error)\b[^\n]{0,80}?(?:password|token|secret|auth|sql|eval|innerHTML|key|cookie)\b/gi,
|
|
489
|
+
describe: () => "lint/type checks bypassed on security-sensitive code — the guardrail was switched off right where it mattered",
|
|
490
|
+
fix: "fix the underlying issue instead of suppressing it; a suppression comment hides the danger, it doesn't remove it",
|
|
491
|
+
},
|
|
492
|
+
{
|
|
493
|
+
category: "hidden-vulnerabilities",
|
|
494
|
+
severity: "medium",
|
|
495
|
+
re: /\blocalStorage\.(?:setItem|getItem)\s*\(\s*["'][^"']{0,40}(?:token|jwt|auth|session|refresh|access)[^"']{0,20}["']/gi,
|
|
496
|
+
describe: () => "session/access token kept in localStorage — readable by any XSS, exfiltrated by the next compromised script tag",
|
|
497
|
+
fix: "httpOnly + secure + SameSite cookie for the session; never localStorage for credentials",
|
|
498
|
+
},
|
|
354
499
|
];
|
|
355
500
|
/**
|
|
356
501
|
* Repo-level findings that only make sense over the whole tree (e.g. "no
|
|
@@ -410,6 +555,28 @@ export function analyzeSecurityRepoLevel(repo) {
|
|
|
410
555
|
fix: "app.use(helmet()) — one line for CSP, HSTS, X-Frame-Options, X-Content-Type-Options and more",
|
|
411
556
|
});
|
|
412
557
|
}
|
|
558
|
+
if (hasStateChanging && !/\b(?:rateLimit|rate-limit|express-rate-limit|limiter|throttle)\b/i.test(all)) {
|
|
559
|
+
issues.push({
|
|
560
|
+
type: "code",
|
|
561
|
+
category: "rate-limiting",
|
|
562
|
+
severity: "medium",
|
|
563
|
+
description: "[indicated] state-changing endpoints exist but no rate limiter appears anywhere — scripted abuse, brute-force and spam are wide open",
|
|
564
|
+
fix: "express-rate-limit on auth and every state-changing route: 5–10 req/min per IP+account; tune the window for legit bursts",
|
|
565
|
+
});
|
|
566
|
+
}
|
|
567
|
+
const hasSqlLayer = /\b(?:CREATE\s+TABLE|ALTER\s+TABLE|SELECT\s+\w+\s+FROM|INSERT\s+INTO|UPDATE\s+\w+\s+SET|\.findMany\s*\(|\.findAll\s*\(|queryRaw|\.query\s*\()/i.test(all);
|
|
568
|
+
const hasRoutes = /\b(?:app|router)\.(?:get|post|put|delete|patch)\s*\(/g.test(all);
|
|
569
|
+
if (hasSqlLayer &&
|
|
570
|
+
hasRoutes &&
|
|
571
|
+
!/\b(?:ROW\s+LEVEL\s+SECURITY|ENABLE\s+ROW|CREATE\s+POLICY|FORCE\s+ROW\s+LEVEL|security_invoker)\b/i.test(all)) {
|
|
572
|
+
issues.push({
|
|
573
|
+
type: "code",
|
|
574
|
+
category: "database",
|
|
575
|
+
severity: "medium",
|
|
576
|
+
description: "[indicated] backend with direct DB access but no row-level security — tenant isolation is one missing WHERE clause away from leaking everyone's data",
|
|
577
|
+
fix: 'enable RLS on every table and add policies: ALTER TABLE orders ENABLE ROW LEVEL SECURITY; CREATE POLICY tenant_isolation ON orders USING (tenant_id = current_setting("app.tenant_id")); set app.tenant_id once per request',
|
|
578
|
+
});
|
|
579
|
+
}
|
|
413
580
|
return issues;
|
|
414
581
|
}
|
|
415
582
|
function walkTextFiles(root) {
|
|
@@ -432,7 +599,10 @@ function walkTextFiles(root) {
|
|
|
432
599
|
stack.push(p);
|
|
433
600
|
}
|
|
434
601
|
else if (e.isFile()) {
|
|
435
|
-
if (e.name === ".gitignore" ||
|
|
602
|
+
if (e.name === ".gitignore" ||
|
|
603
|
+
e.name.startsWith(".env") ||
|
|
604
|
+
CODE_EXTS.has(path.extname(e.name)) ||
|
|
605
|
+
/(?:\.(?:bak|old|orig|swp)$|~$|^\.htpasswd$)/.test(e.name))
|
|
436
606
|
out.push(p);
|
|
437
607
|
}
|
|
438
608
|
}
|
|
@@ -496,7 +666,10 @@ export function analyzeSecurityStatic(repo) {
|
|
|
496
666
|
const lineStart = content.lastIndexOf("\n", m.index) + 1;
|
|
497
667
|
const lineEnd = content.indexOf("\n", m.index);
|
|
498
668
|
const lineText = content.slice(lineStart, lineEnd === -1 ? undefined : lineEnd).trim();
|
|
499
|
-
|
|
669
|
+
// Comment lines are skipped EXCEPT for the hidden-vulnerabilities rules —
|
|
670
|
+
// a "TODO: fix insecure auth" comment IS the finding there.
|
|
671
|
+
if (/^(?:\/\/|\/\*|\*|#|<!--|"""|''')/.test(lineText) &&
|
|
672
|
+
rule.category !== "hidden-vulnerabilities")
|
|
500
673
|
return;
|
|
501
674
|
if (/\b(?:fix:|describe:|title:|re:)/.test(lineText) || /\(\?:/.test(lineText))
|
|
502
675
|
return;
|
|
@@ -504,7 +677,7 @@ export function analyzeSecurityStatic(repo) {
|
|
|
504
677
|
// ("describe: () =>" then the quoted text on the next line).
|
|
505
678
|
const prevStart = content.lastIndexOf("\n", lineStart - 2) + 1;
|
|
506
679
|
const prevLine = content.slice(prevStart, lineStart - 1).trim();
|
|
507
|
-
if (/\b(?:describe|fix)\s
|
|
680
|
+
if (/\b(?:describe|fix|title|re)\s*:/.test(prevLine))
|
|
508
681
|
return;
|
|
509
682
|
// Same-line adjacency false positive: `something.exec(fn) + \`…${…}\`` —
|
|
510
683
|
// a closing paren BEFORE the interpolated/concatenated part means the
|
|
@@ -527,6 +700,14 @@ export function analyzeSecurityStatic(repo) {
|
|
|
527
700
|
fix: rule.fix,
|
|
528
701
|
});
|
|
529
702
|
};
|
|
703
|
+
const pushNamed = (file, category, severity, description, fix) => {
|
|
704
|
+
const rel = path.relative(repo, file);
|
|
705
|
+
const key = `${category}|${rel}|1`;
|
|
706
|
+
if (seen.has(key))
|
|
707
|
+
return;
|
|
708
|
+
seen.add(key);
|
|
709
|
+
issues.push({ type: "code", category, severity, file: rel, line: 1, description, fix });
|
|
710
|
+
};
|
|
530
711
|
for (const file of walkTextFiles(repo)) {
|
|
531
712
|
const content = readText(file);
|
|
532
713
|
if (!content)
|
|
@@ -536,6 +717,16 @@ export function analyzeSecurityStatic(repo) {
|
|
|
536
717
|
// hardcoded-secret patterns.
|
|
537
718
|
if (path.basename(file).startsWith(".env"))
|
|
538
719
|
continue;
|
|
720
|
+
const name = path.basename(file);
|
|
721
|
+
if (/\.min\.js$/.test(name)) {
|
|
722
|
+
pushNamed(file, "hidden-vulnerabilities", "low", "[indicated] minified bundle committed — logic hidden from review; it can silently carry secrets or backdoor payloads", "commit the source and build the bundle at release time; if a bundle must ship, keep its sourcemap and sign it");
|
|
723
|
+
}
|
|
724
|
+
if (/(?:\.(?:bak|old|orig|swp)$|~$)/.test(name)) {
|
|
725
|
+
pushNamed(file, "hidden-vulnerabilities", "medium", "[indicated] backup/editor file committed — old snapshots commonly contain earlier (secret-bearing) versions of the code", "delete it and add *.bak, *.old, *.orig, *.swp, *~ to .gitignore");
|
|
726
|
+
}
|
|
727
|
+
if (name === ".htpasswd") {
|
|
728
|
+
pushNamed(file, "hidden-vulnerabilities", "medium", "[indicated] .htpasswd credential file committed — a password store living in the repository", "rotate the passwords, move auth to the app layer or a secret manager, and delete the file");
|
|
729
|
+
}
|
|
539
730
|
for (const rule of STATIC_SECURITY_RULES) {
|
|
540
731
|
rule.re.lastIndex = 0;
|
|
541
732
|
let m;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"securityStatic.js","sourceRoot":"","sources":["../../src/analyzers/securityStatic.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"securityStatic.js","sourceRoot":"","sources":["../../src/analyzers/securityStatic.ts"],"names":[],"mappings":"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"}
|
package/dist/analyzers/util.d.ts
CHANGED
|
@@ -15,7 +15,7 @@ export declare function safeExec(file: string, args: string[], cwd: string, time
|
|
|
15
15
|
* Async twin of safeExec for analyzers that should run in parallel (security,
|
|
16
16
|
* tests, reliability, perf all spend their time waiting on subprocesses).
|
|
17
17
|
*/
|
|
18
|
-
export declare function safeExecAsync(file: string, args: string[], cwd: string, timeoutMs?: number): Promise<{
|
|
18
|
+
export declare function safeExecAsync(file: string, args: string[], cwd: string, timeoutMs?: number, env?: Record<string, string | undefined>): Promise<{
|
|
19
19
|
code: number;
|
|
20
20
|
stdout: string;
|
|
21
21
|
stderr: string;
|
package/dist/analyzers/util.js
CHANGED
|
@@ -46,7 +46,7 @@ export function safeExec(file, args, cwd, timeoutMs = 120000) {
|
|
|
46
46
|
* Async twin of safeExec for analyzers that should run in parallel (security,
|
|
47
47
|
* tests, reliability, perf all spend their time waiting on subprocesses).
|
|
48
48
|
*/
|
|
49
|
-
export async function safeExecAsync(file, args, cwd, timeoutMs = 120000) {
|
|
49
|
+
export async function safeExecAsync(file, args, cwd, timeoutMs = 120000, env) {
|
|
50
50
|
const asStr = (v) => (typeof v === "string" ? v : v instanceof Buffer ? v.toString() : "");
|
|
51
51
|
try {
|
|
52
52
|
const res = await execa(file, args, {
|
|
@@ -57,6 +57,7 @@ export async function safeExecAsync(file, args, cwd, timeoutMs = 120000) {
|
|
|
57
57
|
windowsHide: true,
|
|
58
58
|
maxBuffer: 50 * 1024 * 1024,
|
|
59
59
|
reject: false,
|
|
60
|
+
...(env ? { env } : {}),
|
|
60
61
|
});
|
|
61
62
|
return {
|
|
62
63
|
code: typeof res.exitCode === "number" ? res.exitCode : res.failed ? 1 : -1,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/analyzers/util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAmB,MAAM,OAAO,CAAC;AAC1D,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAY7B;;;;;GAKG;AAEH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IAAI,CAAC;QACH,SAAS,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,EAAE;YACjE,KAAK,EAAE,QAAQ;YACf,WAAW,EAAE,IAAI;SAClB,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED,MAAM,UAAU,QAAQ,CACtB,IAAY,EACZ,IAAc,EACd,GAAW,EACX,SAAS,GAAG,MAAM;IAElB,MAAM,KAAK,GAAG,CAAC,CAAU,EAAU,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC5G,IAAI,GAAe,CAAC;IACpB,IAAI,CAAC;QACH,GAAG,GAAG,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE;YAC1B,GAAG;YACH,QAAQ,EAAE,MAAM;YAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,OAAO,EAAE,SAAS;YAClB,WAAW,EAAE,IAAI;YACjB,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;YAC3B,MAAM,EAAE,KAAK;SACd,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;IACvE,CAAC;IACD,OAAO;QACL,IAAI,EAAE,OAAO,GAAG,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;QACzB,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC;KAC1B,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,IAAY,EACZ,IAAc,EACd,GAAW,EACX,SAAS,GAAG,MAAM;
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../../src/analyzers/util.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -25,6 +25,7 @@ import { readyCheckCmd } from "./commands/readyCheck.js";
|
|
|
25
25
|
import { budgetCmd } from "./commands/budget.js";
|
|
26
26
|
import { watch } from "./commands/watch.js";
|
|
27
27
|
import { drive } from "./commands/drive.js";
|
|
28
|
+
import { testCmd } from "./commands/test.js";
|
|
28
29
|
import { guidedFirstRun } from "./firstRun.js";
|
|
29
30
|
/**
|
|
30
31
|
* Last line of defense: a crash is a bug report, not a stack dump on someone's
|
|
@@ -92,5 +93,6 @@ program.addCommand(readyCheckCmd);
|
|
|
92
93
|
program.addCommand(budgetCmd);
|
|
93
94
|
program.addCommand(watch);
|
|
94
95
|
program.addCommand(drive);
|
|
96
|
+
program.addCommand(testCmd);
|
|
95
97
|
program.parseAsync(process.argv);
|
|
96
98
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Command } from "commander";
|
|
2
|
+
export interface TestLayerSpec {
|
|
3
|
+
layer: "unit" | "integration" | "e2e";
|
|
4
|
+
runner: string;
|
|
5
|
+
script?: string;
|
|
6
|
+
cmd?: string;
|
|
7
|
+
args?: string[];
|
|
8
|
+
}
|
|
9
|
+
export interface LayerRun {
|
|
10
|
+
layer: string;
|
|
11
|
+
runner: string;
|
|
12
|
+
status: "ok" | "failed" | "skipped" | "error";
|
|
13
|
+
total: number;
|
|
14
|
+
passed: number;
|
|
15
|
+
failed: number;
|
|
16
|
+
durationMs: number;
|
|
17
|
+
note?: string;
|
|
18
|
+
failing: string[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Discover the three layers of the test pyramid, the way a senior dev would:
|
|
22
|
+
* npm scripts first (least surprising), then well-known runners and configs.
|
|
23
|
+
* Every layer reports why it was discovered (or not) — nothing is assumed.
|
|
24
|
+
*/
|
|
25
|
+
export declare function discoverTestLayers(repo: string): TestLayerSpec[];
|
|
26
|
+
/**
|
|
27
|
+
* Parse test counts out of any runner's text output. Prefers the summary
|
|
28
|
+
* lines node:test/jest/vitest/pytest/mocha/cypress/playwright all print in
|
|
29
|
+
* some form; returns zeros when nothing parses so the caller stays honest
|
|
30
|
+
* ("runner exited 0, counts unparsed") instead of inventing numbers.
|
|
31
|
+
*/
|
|
32
|
+
export declare function parseTestCounts(out: string): {
|
|
33
|
+
passed: number;
|
|
34
|
+
failed: number;
|
|
35
|
+
total: number;
|
|
36
|
+
};
|
|
37
|
+
/** Pull the names of failing tests out of runner output (first ~10). */
|
|
38
|
+
export declare function failingTestNames(out: string, limit?: number): string[];
|
|
39
|
+
export declare function runTestLayer(repo: string, spec: TestLayerSpec, timeoutMs?: number): Promise<LayerRun>;
|
|
40
|
+
export declare function renderTestPyramid(runs: LayerRun[], repo: string): string;
|
|
41
|
+
export declare const testCmd: Command;
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import chalk from "chalk";
|
|
4
|
+
import boxen from "boxen";
|
|
5
|
+
import { Command } from "commander";
|
|
6
|
+
import { safeExecAsync, commandExists, detectLanguage } from "../analyzers/util.js";
|
|
7
|
+
const LAYER_ORDER = { unit: 0, integration: 1, e2e: 2 };
|
|
8
|
+
/**
|
|
9
|
+
* Discover the three layers of the test pyramid, the way a senior dev would:
|
|
10
|
+
* npm scripts first (least surprising), then well-known runners and configs.
|
|
11
|
+
* Every layer reports why it was discovered (or not) — nothing is assumed.
|
|
12
|
+
*/
|
|
13
|
+
export function discoverTestLayers(repo) {
|
|
14
|
+
const layers = [];
|
|
15
|
+
let pkg = {};
|
|
16
|
+
const pkgPath = path.join(repo, "package.json");
|
|
17
|
+
if (fs.existsSync(pkgPath)) {
|
|
18
|
+
try {
|
|
19
|
+
pkg = JSON.parse(fs.readFileSync(pkgPath, "utf8"));
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
pkg = {};
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
const scripts = (pkg.scripts ?? {});
|
|
26
|
+
const deps = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };
|
|
27
|
+
const binExists = (n) => commandExists(n) || fs.existsSync(path.join(repo, "node_modules", ".bin", n));
|
|
28
|
+
const has = (...parts) => fs.existsSync(path.join(repo, ...parts));
|
|
29
|
+
const firstScript = (names) => names.find((n) => typeof scripts[n] === "string");
|
|
30
|
+
const unitScript = firstScript(["test", "test:unit", "unit"]);
|
|
31
|
+
if (unitScript) {
|
|
32
|
+
layers.push({ layer: "unit", script: unitScript, runner: `npm script (${unitScript})` });
|
|
33
|
+
}
|
|
34
|
+
else if (deps.vitest && binExists("vitest")) {
|
|
35
|
+
layers.push({ layer: "unit", runner: "vitest", cmd: "vitest", args: ["run"] });
|
|
36
|
+
}
|
|
37
|
+
else if (deps.jest && binExists("jest")) {
|
|
38
|
+
layers.push({ layer: "unit", runner: "jest", cmd: "jest", args: ["--ci"] });
|
|
39
|
+
}
|
|
40
|
+
else if (deps.mocha && binExists("mocha")) {
|
|
41
|
+
layers.push({ layer: "unit", runner: "mocha", cmd: "mocha", args: [] });
|
|
42
|
+
}
|
|
43
|
+
const itScript = firstScript(["test:integration", "test:it", "integration"]);
|
|
44
|
+
if (itScript) {
|
|
45
|
+
layers.push({ layer: "integration", script: itScript, runner: `npm script (${itScript})` });
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
const itDir = has("tests", "integration")
|
|
49
|
+
? "tests/integration"
|
|
50
|
+
: has("test", "integration")
|
|
51
|
+
? "test/integration"
|
|
52
|
+
: has("__tests__", "integration")
|
|
53
|
+
? "__tests__/integration"
|
|
54
|
+
: null;
|
|
55
|
+
if (itDir && deps.vitest && binExists("vitest")) {
|
|
56
|
+
layers.push({ layer: "integration", runner: `vitest (${itDir})`, cmd: "vitest", args: ["run", itDir] });
|
|
57
|
+
}
|
|
58
|
+
else if (itDir && deps.jest && binExists("jest")) {
|
|
59
|
+
layers.push({ layer: "integration", runner: `jest (${itDir})`, cmd: "jest", args: [itDir, "--ci"] });
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
const e2eScript = firstScript(["test:e2e", "test:e2e:ci", "e2e", "test:playwright", "test:cypress"]);
|
|
63
|
+
if (e2eScript) {
|
|
64
|
+
layers.push({ layer: "e2e", script: e2eScript, runner: `npm script (${e2eScript})` });
|
|
65
|
+
}
|
|
66
|
+
else if (deps.playwright ||
|
|
67
|
+
has("playwright.config.ts") ||
|
|
68
|
+
has("playwright.config.js") ||
|
|
69
|
+
has("playwright.config.mjs")) {
|
|
70
|
+
layers.push({ layer: "e2e", runner: "playwright", cmd: "npx", args: ["playwright", "test"] });
|
|
71
|
+
}
|
|
72
|
+
else if (deps.cypress ||
|
|
73
|
+
has("cypress.config.ts") ||
|
|
74
|
+
has("cypress.config.js") ||
|
|
75
|
+
has("cypress.config.mjs")) {
|
|
76
|
+
layers.push({ layer: "e2e", runner: "cypress", cmd: "npx", args: ["cypress", "run"] });
|
|
77
|
+
}
|
|
78
|
+
const lang = detectLanguage(repo);
|
|
79
|
+
if (lang === "python" && commandExists("pytest")) {
|
|
80
|
+
if (!layers.some((l) => l.layer === "unit")) {
|
|
81
|
+
layers.push({ layer: "unit", runner: "pytest", cmd: "pytest", args: ["-q"] });
|
|
82
|
+
}
|
|
83
|
+
const pyIt = has("tests", "integration") ? "tests/integration" : has("test", "integration") ? "test/integration" : null;
|
|
84
|
+
if (pyIt && !layers.some((l) => l.layer === "integration")) {
|
|
85
|
+
layers.push({ layer: "integration", runner: `pytest (${pyIt})`, cmd: "pytest", args: [pyIt, "-q"] });
|
|
86
|
+
}
|
|
87
|
+
const pyE2e = has("tests", "e2e") ? "tests/e2e" : has("e2e") ? "e2e" : null;
|
|
88
|
+
if (pyE2e && !layers.some((l) => l.layer === "e2e")) {
|
|
89
|
+
layers.push({ layer: "e2e", runner: `pytest (${pyE2e})`, cmd: "pytest", args: [pyE2e, "-q"] });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
return layers.sort((a, b) => LAYER_ORDER[a.layer] - LAYER_ORDER[b.layer]);
|
|
93
|
+
}
|
|
94
|
+
function lastCount(out, re) {
|
|
95
|
+
const all = [...out.matchAll(re)];
|
|
96
|
+
return all.length ? Number(all[all.length - 1][1]) : null;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Parse test counts out of any runner's text output. Prefers the summary
|
|
100
|
+
* lines node:test/jest/vitest/pytest/mocha/cypress/playwright all print in
|
|
101
|
+
* some form; returns zeros when nothing parses so the caller stays honest
|
|
102
|
+
* ("runner exited 0, counts unparsed") instead of inventing numbers.
|
|
103
|
+
*/
|
|
104
|
+
export function parseTestCounts(out) {
|
|
105
|
+
const passHash = lastCount(out, /^\s*#\s*pass\s+(\d+)\s*$/gm);
|
|
106
|
+
const failHash = lastCount(out, /^\s*#\s*fail\s+(\d+)\s*$/gm);
|
|
107
|
+
const passed = passHash ??
|
|
108
|
+
lastCount(out, /(\d+)\s+passed/g) ??
|
|
109
|
+
lastCount(out, /(\d+)\s+passing/g) ??
|
|
110
|
+
0;
|
|
111
|
+
const failed = failHash ??
|
|
112
|
+
lastCount(out, /(\d+)\s+failed/g) ??
|
|
113
|
+
lastCount(out, /(\d+)\s+failing/g) ??
|
|
114
|
+
0;
|
|
115
|
+
return { passed, failed, total: passed + failed };
|
|
116
|
+
}
|
|
117
|
+
/** Pull the names of failing tests out of runner output (first ~10). */
|
|
118
|
+
export function failingTestNames(out, limit = 10) {
|
|
119
|
+
const names = [];
|
|
120
|
+
for (const raw of out.split("\n")) {
|
|
121
|
+
const t = raw.trim();
|
|
122
|
+
if (!t)
|
|
123
|
+
continue;
|
|
124
|
+
const isFailureLine = /^[✕×✗✘✖]/.test(t) ||
|
|
125
|
+
/^(?:FAIL|✖)\b/.test(t) ||
|
|
126
|
+
/^not\s+ok\b/.test(t) ||
|
|
127
|
+
/^\d+\)\s+[A-Za-z]/.test(t) ||
|
|
128
|
+
/\b(?:failed|failing)\s*[:\-]/.test(t);
|
|
129
|
+
if (!isFailureLine)
|
|
130
|
+
continue;
|
|
131
|
+
const clean = t
|
|
132
|
+
.replace(/^not\s+ok\s+\d+\s*-\s*/, "")
|
|
133
|
+
.replace(/^\d+\)\s*/, "")
|
|
134
|
+
.slice(0, 140);
|
|
135
|
+
if (clean.length > 3 && !names.includes(clean))
|
|
136
|
+
names.push(clean);
|
|
137
|
+
if (names.length >= limit)
|
|
138
|
+
break;
|
|
139
|
+
}
|
|
140
|
+
return names;
|
|
141
|
+
}
|
|
142
|
+
export async function runTestLayer(repo, spec, timeoutMs = 300000) {
|
|
143
|
+
const start = performance.now();
|
|
144
|
+
let code = -1;
|
|
145
|
+
let out = "";
|
|
146
|
+
// Node's test runner refuses to run when NODE_TEST_CONTEXT is set to
|
|
147
|
+
// ANYTHING (even "") — it checks !== undefined. Remove it so a `pitstop test`
|
|
148
|
+
// invoked from inside another test run still executes real suites.
|
|
149
|
+
const childEnv = {
|
|
150
|
+
...process.env,
|
|
151
|
+
NODE_TEST_CONTEXT: undefined,
|
|
152
|
+
};
|
|
153
|
+
try {
|
|
154
|
+
const r = spec.cmd
|
|
155
|
+
? await safeExecAsync(spec.cmd, spec.args ?? [], repo, timeoutMs, childEnv)
|
|
156
|
+
: await safeExecAsync("npm", ["run", spec.script ?? "", "--silent"], repo, timeoutMs, childEnv);
|
|
157
|
+
code = r.code;
|
|
158
|
+
out = `${r.stdout}\n${r.stderr}`;
|
|
159
|
+
}
|
|
160
|
+
catch (err) {
|
|
161
|
+
return {
|
|
162
|
+
layer: spec.layer,
|
|
163
|
+
runner: spec.runner,
|
|
164
|
+
status: "error",
|
|
165
|
+
total: 0,
|
|
166
|
+
passed: 0,
|
|
167
|
+
failed: 0,
|
|
168
|
+
durationMs: Math.round(performance.now() - start),
|
|
169
|
+
note: `runner failed to start: ${err?.message ?? String(err)}`,
|
|
170
|
+
failing: [],
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
const durationMs = Math.round(performance.now() - start);
|
|
174
|
+
const counts = parseTestCounts(out);
|
|
175
|
+
const failing = failingTestNames(out);
|
|
176
|
+
const status = code === 0 ? "ok" : "failed";
|
|
177
|
+
if (counts.total === 0) {
|
|
178
|
+
return {
|
|
179
|
+
layer: spec.layer,
|
|
180
|
+
runner: spec.runner,
|
|
181
|
+
status,
|
|
182
|
+
total: 0,
|
|
183
|
+
passed: 0,
|
|
184
|
+
failed: 0,
|
|
185
|
+
durationMs,
|
|
186
|
+
note: code === 0
|
|
187
|
+
? "runner exited 0 — test counts unparsed"
|
|
188
|
+
: `runner exited ${code} — test counts unparsed`,
|
|
189
|
+
failing,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
return {
|
|
193
|
+
layer: spec.layer,
|
|
194
|
+
runner: spec.runner,
|
|
195
|
+
status,
|
|
196
|
+
total: counts.total,
|
|
197
|
+
passed: counts.passed,
|
|
198
|
+
failed: counts.failed,
|
|
199
|
+
durationMs,
|
|
200
|
+
failing,
|
|
201
|
+
};
|
|
202
|
+
}
|
|
203
|
+
function label(text) {
|
|
204
|
+
return chalk.bold(chalk.cyan(text.padEnd(14)));
|
|
205
|
+
}
|
|
206
|
+
export function renderTestPyramid(runs, repo) {
|
|
207
|
+
const lines = [];
|
|
208
|
+
for (const r of runs) {
|
|
209
|
+
const duration = r.durationMs >= 1000 ? `${(r.durationMs / 1000).toFixed(1)}s` : `${r.durationMs}ms`;
|
|
210
|
+
if (r.status === "ok") {
|
|
211
|
+
lines.push(`${label(r.layer)}: ${chalk.green(`${r.passed} pass`)} · ${chalk.dim(`${r.failed} fail`)} · ${chalk.dim(duration)} (${r.runner})`);
|
|
212
|
+
}
|
|
213
|
+
else if (r.status === "failed") {
|
|
214
|
+
lines.push(`${label(r.layer)}: ${chalk.red(`${r.failed} fail`)} · ${chalk.dim(`${r.passed} pass · ${duration}`)} (${r.runner})`);
|
|
215
|
+
}
|
|
216
|
+
else if (r.status === "error") {
|
|
217
|
+
lines.push(`${label(r.layer)}: ${chalk.yellow("error")} — ${chalk.dim(r.note ?? "runner failed")}`);
|
|
218
|
+
}
|
|
219
|
+
else {
|
|
220
|
+
lines.push(`${label(r.layer)}: ${chalk.yellow(`skipped — ${r.note ?? "no suite discovered"}`)}`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
const seenNames = new Set();
|
|
224
|
+
const failing = [];
|
|
225
|
+
for (const r of runs) {
|
|
226
|
+
for (const f of r.failing) {
|
|
227
|
+
if (seenNames.has(f))
|
|
228
|
+
continue;
|
|
229
|
+
seenNames.add(f);
|
|
230
|
+
failing.push(` ${chalk.red("✕")} ${f}`);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
if (failing.length) {
|
|
234
|
+
lines.push("", chalk.bold("Failing tests — fix these, then re-run:"));
|
|
235
|
+
lines.push(...failing);
|
|
236
|
+
}
|
|
237
|
+
const failedLayers = runs.filter((r) => r.status === "failed" || r.status === "error");
|
|
238
|
+
if (failedLayers.length) {
|
|
239
|
+
lines.push("", chalk.yellow(`${failedLayers.length} layer(s) failing — OpenPitStop Test Pyramid verdict: ${chalk.bold("DO NOT SHIP")}`));
|
|
240
|
+
}
|
|
241
|
+
else if (runs.some((r) => r.status === "ok")) {
|
|
242
|
+
lines.push("", chalk.green("All discovered layers green — this is a shippable test pyramid."));
|
|
243
|
+
}
|
|
244
|
+
return boxen(lines.join("\n"), {
|
|
245
|
+
title: " PITSTOP — Test Pyramid ",
|
|
246
|
+
titleAlignment: "center",
|
|
247
|
+
borderStyle: "double",
|
|
248
|
+
padding: 1,
|
|
249
|
+
borderColor: "cyan",
|
|
250
|
+
});
|
|
251
|
+
}
|
|
252
|
+
export const testCmd = new Command("test")
|
|
253
|
+
.description("Run the test pyramid — unit, integration and e2e layers — with honest per-layer results and " +
|
|
254
|
+
"failing-test names. Like scan, it reports exactly what it found: no suite, no score, no lies.")
|
|
255
|
+
.argument("[repo]", "path to the repo to test (default: current dir)", ".")
|
|
256
|
+
.option("--unit", "only run the unit layer")
|
|
257
|
+
.option("--integration", "only run the integration layer")
|
|
258
|
+
.option("--e2e", "only run the e2e layer")
|
|
259
|
+
.option("--timeout <ms>", "per-layer timeout in ms (default: 300000)", "300000")
|
|
260
|
+
.option("--json", "print machine-readable layer results as JSON")
|
|
261
|
+
.action(async (repoArg, options) => {
|
|
262
|
+
const repo = path.resolve(repoArg);
|
|
263
|
+
if (!options.json) {
|
|
264
|
+
console.log(chalk.cyan(`\nTesting ${repo} ...\n`));
|
|
265
|
+
}
|
|
266
|
+
const discovered = discoverTestLayers(repo);
|
|
267
|
+
const wanted = ["unit", "integration", "e2e"].filter((l) => options[l]);
|
|
268
|
+
const specs = discovered.filter((s) => wanted.length === 0 || wanted.includes(s.layer));
|
|
269
|
+
const runs = [];
|
|
270
|
+
for (const spec of specs) {
|
|
271
|
+
if (!options.json) {
|
|
272
|
+
console.log(chalk.dim(` running ${spec.layer} (${spec.runner}) …`));
|
|
273
|
+
}
|
|
274
|
+
runs.push(await runTestLayer(repo, spec, Number(options.timeout) || 300000));
|
|
275
|
+
}
|
|
276
|
+
if (wanted.length === 0) {
|
|
277
|
+
for (const l of ["unit", "integration", "e2e"]) {
|
|
278
|
+
if (!runs.some((r) => r.layer === l)) {
|
|
279
|
+
runs.push({ layer: l, runner: "—", status: "skipped", total: 0, passed: 0, failed: 0, durationMs: 0, note: "no suite discovered", failing: [] });
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
runs.sort((a, b) => LAYER_ORDER[a.layer] - LAYER_ORDER[b.layer]);
|
|
284
|
+
if (options.json) {
|
|
285
|
+
console.log(JSON.stringify({ repo, layers: runs }, null, 2));
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
console.log(`\n${renderTestPyramid(runs, repo)}\n`);
|
|
289
|
+
const skipped = runs.filter((r) => r.status === "skipped");
|
|
290
|
+
if (skipped.length && wanted.length === 0) {
|
|
291
|
+
console.log(chalk.dim(`No ${skipped.map((s) => s.layer).join(", ")} layer discovered — add e.g. "test:e2e": "playwright test" to package.json and it will be picked up automatically.`));
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
const failedAny = runs.some((r) => r.status === "failed" || r.status === "error");
|
|
295
|
+
process.exitCode = failedAny ? 1 : 0;
|
|
296
|
+
});
|
|
297
|
+
//# sourceMappingURL=test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/commands/test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "openpitstop",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "Deterministic scans + your coding agent's own reasoning, in one autonomous quality loop. Adds a /pitstop slash-command to any AI coding tool.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Krish-1507",
|
|
@@ -139,6 +139,7 @@ the closest match. Never run the full scan just to decide:
|
|
|
139
139
|
|---|---|---|
|
|
140
140
|
| app security / vulnerabilities / "is my app hackable" / "check the security" | `!npx openpitstop pen` (add `--fix` only if they asked you to fix) | report proven/indicated/unproven verdicts honestly |
|
|
141
141
|
| tests, flakiness, coverage, a failing suite | `!npx openpitstop scan` | read the Tests + Reliability lines; no fixes unless asked |
|
|
142
|
+
| "run my tests" / unit tests / integration tests / e2e / the test pyramid / "are my tests passing?" | `!npx openpitstop test` (add `--unit`/`--integration`/`--e2e` if they named one layer) | print the boxed pyramid verbatim; if a layer failed, list the failing tests and offer to fix them (confirmation pause first) |
|
|
142
143
|
| the last commit / whether an agent cheated / "verify my agent's work" | `!npx openpitstop integrity` | print the boxed verdict verbatim and stop |
|
|
143
144
|
| one finding id | `!npx openpitstop inspect <id>` (or `repro <id>` if they want a regression test) | only that finding |
|
|
144
145
|
| one file or route | a scoped `!npx openpitstop scan` / `inspect` on the relevant finding | only that area |
|