proof-of-commitment 1.29.1 → 1.29.2

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.
Files changed (2) hide show
  1. package/index.js +31 -30
  2. package/package.json +1 -1
package/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
- * proof-of-commitment CLI v1.29.0
3
+ * proof-of-commitment CLI v1.29.2
4
4
  * Scores npm/PyPI/Cargo/Go packages on behavioral commitment signals.
5
5
  * Usage: npx proof-of-commitment [packages...] [options]
6
6
  */
@@ -710,40 +710,41 @@ async function inlineSignup(results, opts = {}) {
710
710
  const critPkgs = results.filter(r => hasCritical(r.riskFlags));
711
711
  const lowScorePkgs = results.filter(r => typeof r.score === 'number' && r.score < 60);
712
712
  const hasFindings = critPkgs.length >= 1 || lowScorePkgs.length >= 2;
713
- // engagementSignal: true when the backend returned an `_cta` field, which
714
- // means this IP has scored ≥ AUDIT_SOFT_CTA_AT (5) packages today.
715
- // That's a server-confirmed engagement signal independent of local result
716
- // shape — the user is approaching the daily wall (15) and will hit it
717
- // soon. Pre-this fix, single-package healthy scans at counts 5–14 saw
718
- // only a dim URL: the strongest in-terminal conversion moment dropped to
719
- // a copy-paste task. With engagementSignal=true we bypass the findings
720
- // gate so the inline email→key prompt fires at the moment of warmest
721
- // engagement. Closes the leak found 2026-06-10 dogfooding /api/keys/stats:
722
- // 4 IPs hit AUDIT_SOFT_CTA_AT in 7d, 0 organic signups.
713
+ // engagementSignal: server _cta this IP has scored AUDIT_SOFT_CTA_AT
714
+ // (5) packages today. Server-confirmed repeat-use signal independent of
715
+ // local result shape.
723
716
  const engagementSignal = !!opts.engagementSignal;
724
- // Gate: show prompt when there's something worth monitoring OR the user
725
- // has demonstrated repeat-use engagement today (server _cta signal).
726
- // Old gate (results.length < 3) blocked the most common entry point:
727
- // `npx proof-of-commitment axios` after reading about an attack.
728
- // A single CRITICAL result IS the high-intent moment don't skip it.
729
- // For healthy single-package checks with no findings AND no engagement
730
- // signal, still skip.
731
- if (results.length < 3 && !hasFindings && !engagementSignal) return;
732
-
733
- // Copy adapts to context. Findings degradation framing.
734
- // Healthy → baseline-lock framing (still real value: alert me if any score drops).
735
- // engagementSignal without findings soft-CTA wall-approach framing.
717
+ // 2026-06-11 v1.29.2 proposition shift: gate relaxed to results.length<1.
718
+ // Prior gates (`<3 && !hasFindings && !engagementSignal`) blocked the most
719
+ // common entry point `npx proof-of-commitment axios` after reading about
720
+ // an attack when the result was healthy. The watchlist auto-seed shipped
721
+ // earlier today (abe53f1) made single-package signups valuable: signup
722
+ // that package goes on watchlist + email if attacked. "Enter to skip"
723
+ // keeps opt-out one keystroke. Closes the proposition gap from 2026-06-10
724
+ // /api/keys/stats dogfood: 4 IPs hit soft-CTA in 7d, 0 organic signups —
725
+ // copy was quota-focused, not value-focused.
726
+ if (results.length < 1) return;
727
+
728
+ // Heading copy: lead with the proposition (auto-watch + alert on attack),
729
+ // not the friction (quota wall). Pre-v1.29.2 the engagementSignal heading
730
+ // was wall-approach quota framing (see git log for prior copy) — friction-
731
+ // removal for a user the system has already identified as security-engaged.
732
+ // New framing names what they actually get: watchlist seeded from this
733
+ // scan, email if anything tampers.
734
+ const count = results.length;
735
+ const pkgRef = count === 1 ? 'this' : `these ${count}`;
736
+ const subjRef = count === 1 ? 'it' : 'any';
737
+ const subjGets = count === 1 ? 'gets' : 'get';
738
+
736
739
  const heading = hasFindings
737
- ? (results.length === 1
738
- ? ' 🔔 Monitor this package. Get alerted if it gets worse.'
739
- : ' 🔔 Lock in this audit. Get alerted if these packages get worse.')
740
+ ? ` 🔔 Auto-watch ${pkgRef}. Email if ${subjRef} ${subjGets} attacked or score drops.`
740
741
  : engagementSignal
741
- ? ' 🔔 Past the free anonymous quota on this network lift it to 200/day.'
742
- : ' 🔔 Lock in this baseline. Get alerted if any of these packages degrade.';
742
+ ? ` 🔔 You're scanning a lot. Watch ${pkgRef} for the next attack? Free.`
743
+ : ` 🔔 Auto-watch ${pkgRef}. Free email alert if ${subjRef} ${subjGets} attacked.`;
743
744
 
744
745
  console.log(clr(c.dim, ' ─────────────────────────────────────────────'));
745
746
  console.log(clr(c.bold, heading));
746
- console.log(clr(c.dim, ' Free, no card, 10 seconds. Saves to ~/.commit/config.\n'));
747
+ console.log(clr(c.dim, ' Seeds your watchlist from this scan. 10s, no card.\n'));
747
748
 
748
749
  const { createInterface } = await import('readline');
749
750
  const rl = createInterface({ input: process.stdin, output: process.stdout });
@@ -845,7 +846,7 @@ async function inlineSignup(results, opts = {}) {
845
846
 
846
847
  function printHelp() {
847
848
  console.log(`
848
- ${clr(c.bold, 'proof-of-commitment')} v1.29.1 — supply chain risk scorer
849
+ ${clr(c.bold, 'proof-of-commitment')} v1.29.2 — supply chain risk scorer
849
850
 
850
851
  ${clr(c.bold, 'Usage:')}
851
852
  npx proof-of-commitment Auto-detect manifest in current dir
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "proof-of-commitment",
3
- "version": "1.29.1",
3
+ "version": "1.29.2",
4
4
  "mcpName": "io.github.piiiico/proof-of-commitment",
5
5
  "description": "Supply chain security risk scorer for npm, PyPI, Cargo, and Go packages — behavioral signals that can't be faked",
6
6
  "type": "module",