pqcheck 0.16.19 → 0.16.20
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/README.md +1 -1
- package/bin/pqcheck.js +44 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
[](https://www.npmjs.com/package/pqcheck)
|
|
9
9
|
[](./LICENSE)
|
|
10
10
|
|
|
11
|
-
> **Latest: v0.16.
|
|
11
|
+
> **Latest: v0.16.20** — `pqcheck deploy-check --ai` now adds an absolute posture grade (A+ → F, strict SSL-Labs rubric over CSP / HSTS / X-Frame-Options / X-Content-Type-Options / Referrer-Policy / Permissions-Policy + `x-powered-by` leak) alongside the existing drift-only `ship_decision`. Grade D/F sets `posture_decision=block` so AI coders gate posture failures even on a clean drift. Adds `scope_note` (drift pass ≠ functional verification) and surfaces ready-to-paste fix snippets (Next.js / vercel.json / Express). Watched-domain monitoring also gains `posture_regression` + `cert_expiring` alerts. [Full changelog →](./CHANGELOG.md)
|
|
12
12
|
|
|
13
13
|
## Two ways to use it
|
|
14
14
|
|
package/bin/pqcheck.js
CHANGED
|
@@ -495,6 +495,22 @@ async function runOneScan({ domain, format, quiet, threshold, webhookUrl, multi,
|
|
|
495
495
|
}
|
|
496
496
|
}
|
|
497
497
|
|
|
498
|
+
// R86 — surface absolute posture grade + remediation alongside drift verdict.
|
|
499
|
+
// The grade= field carries DBR grade; posture_grade= is the new absolute
|
|
500
|
+
// posture (A+/A/B/C/D/F based on header presence/strength).
|
|
501
|
+
// posture_decision separates the absolute-state routing signal from the
|
|
502
|
+
// drift-based ship_decision so a weak-but-unchanged site gets a review
|
|
503
|
+
// nudge distinct from drift.
|
|
504
|
+
const posture = report.posture || null;
|
|
505
|
+
const postureFields = posture ? {
|
|
506
|
+
posture_grade: posture.grade,
|
|
507
|
+
posture_score: posture.score,
|
|
508
|
+
posture_decision: posture.decision,
|
|
509
|
+
posture_missing: (posture.missing || []).join(",") || "none",
|
|
510
|
+
posture_leaks: (posture.info_leaks || []).join("; ") || "none",
|
|
511
|
+
posture_findings_count: (posture.findings || []).length,
|
|
512
|
+
posture_fixes_count: (posture.fixes || []).length,
|
|
513
|
+
} : {};
|
|
498
514
|
console.log(formatAiFooterBlock({
|
|
499
515
|
status: shipDecision,
|
|
500
516
|
domain,
|
|
@@ -509,6 +525,13 @@ async function runOneScan({ domain, format, quiet, threshold, webhookUrl, multi,
|
|
|
509
525
|
findings_critical: findings.filter((f) => severityRank(f.severity) === 4).length,
|
|
510
526
|
scanned_at: new Date().toISOString(),
|
|
511
527
|
advisory_only: "true",
|
|
528
|
+
// R85 (2026-06-03) — scope honesty disclaimer. pass = trust surface
|
|
529
|
+
// stable, NOT app functionality. Agents that follow the protocol must
|
|
530
|
+
// see this so they don't announce a deploy whose signup is broken
|
|
531
|
+
// (the exact bug the user reported on socialideagen 2026-06-02).
|
|
532
|
+
scope: "trust_surface_drift",
|
|
533
|
+
scope_note: "ship_decision=pass means public trust surface stable. Does NOT verify app functionality. Pair with functional checks (e.g. Playwright e2e) for full deploy safety.",
|
|
534
|
+
...postureFields,
|
|
512
535
|
}));
|
|
513
536
|
console.log("");
|
|
514
537
|
|
|
@@ -3400,6 +3423,20 @@ async function runTrustDiffCommand(args) {
|
|
|
3400
3423
|
console.log(color("dim", " Run with --verbose to see all verified signals."));
|
|
3401
3424
|
}
|
|
3402
3425
|
|
|
3426
|
+
// R86 — posture grade + remediation alongside drift. trust-diff API returns
|
|
3427
|
+
// result.current_report which contains the full scan; if so, read posture
|
|
3428
|
+
// from it. Otherwise gracefully omit (older API responses without posture).
|
|
3429
|
+
const currentReport = result.current_report || result.report || null;
|
|
3430
|
+
const posture = currentReport?.posture || null;
|
|
3431
|
+
const postureFields = posture ? {
|
|
3432
|
+
posture_grade: posture.grade,
|
|
3433
|
+
posture_score: posture.score,
|
|
3434
|
+
posture_decision: posture.decision,
|
|
3435
|
+
posture_missing: (posture.missing || []).join(",") || "none",
|
|
3436
|
+
posture_leaks: (posture.info_leaks || []).join("; ") || "none",
|
|
3437
|
+
posture_findings_count: (posture.findings || []).length,
|
|
3438
|
+
posture_fixes_count: (posture.fixes || []).length,
|
|
3439
|
+
} : {};
|
|
3403
3440
|
console.log(formatAiFooterBlock({
|
|
3404
3441
|
status: shipDecision,
|
|
3405
3442
|
domain,
|
|
@@ -3417,6 +3454,13 @@ async function runTrustDiffCommand(args) {
|
|
|
3417
3454
|
quota_limit: result.quota?.monthly_limit ?? "",
|
|
3418
3455
|
scanned_at: new Date().toISOString(),
|
|
3419
3456
|
advisory_only: "true",
|
|
3457
|
+
// R85 — scope honesty disclaimer (per build brief 2026-06-03).
|
|
3458
|
+
// ship_decision=pass means trust surface stable, NOT app functions.
|
|
3459
|
+
// Agents must see this so they don't announce a deploy whose signup
|
|
3460
|
+
// is broken (the exact bug socialideagen had on 2026-06-02).
|
|
3461
|
+
scope: "trust_surface_drift",
|
|
3462
|
+
scope_note: "ship_decision=pass means public trust surface stable. Does NOT verify app functionality. Pair with functional checks for full deploy safety.",
|
|
3463
|
+
...postureFields,
|
|
3420
3464
|
}));
|
|
3421
3465
|
console.log("");
|
|
3422
3466
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pqcheck",
|
|
3
|
-
"version": "0.16.
|
|
3
|
+
"version": "0.16.20",
|
|
4
4
|
"description": "Deploy gate for AI-coded web apps. `pqcheck deploy-check --ai` returns ship_decision=pass|review|block for Claude Code / Cursor / Copilot / Aider to gate deploys before they ship. Anonymous, no signup, free for first use.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"ai-coder",
|