residoo 0.8.1 → 0.8.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.
package/README.md CHANGED
@@ -65,17 +65,35 @@ covered in [docs/features.md](docs/features.md).
65
65
 
66
66
  Scored #1 of 8 real competing tools on a reproducible, synthetic-but-
67
67
  pattern-true corpus, with live egress monitoring so "no network calls" is
68
- observed, not just documented:
69
-
70
- | | residoo | best of the rest |
71
- |---|---|---|
72
- | Distinct credentials found (all claimed classes) | **45/45 (100%)** | agentsweep 33/42 (79%) |
73
- | Precision (false positives) | **100%** (0 of 55 flags wrong) | gitleaks, whatileaked, trufflehog also 100% |
74
- | Network egress during the scan | **none-observed** | 3 of 8 tools attempt real outbound calls in their *default* mode |
75
-
76
- Published while losing rows, then fixed in public against the classes it
77
- was losing full methodology, every dated rerun, and how to reproduce it
78
- yourself: [docs/benchmark.md](docs/benchmark.md).
68
+ observed, not just documented. All 8, not just the closest one:
69
+
70
+ | tool | distinct credentials found | precision | egress during the scan |
71
+ |---|---|---|---|
72
+ | **residoo** | **45/45 (100%)** | **100%** | **none-observed** |
73
+ | agentsweep | 33/42 (79%) | 100% | none-observed |
74
+ | gitleaks | 32/45 (71%) | 100% | none-observed |
75
+ | betterleaks | 32/45 (71%) | 100% | none-observed |
76
+ | whatileaked | 28/42 (67%) | 100% | none-observed |
77
+ | kingfisher | 29/45 (64%) | 100% | attempts calls in default mode |
78
+ | trufflehog | 29/45 (64%) | 97% | attempts calls in default mode |
79
+ | detect-secrets | 25/45 (56%) | 2% | attempts calls in default mode |
80
+
81
+ "none-observed" is a measured result, not a default assumption: every run
82
+ sits under a live proxy trap and process-tree polling, and a deliberate
83
+ canary connection is fired and confirmed caught *before* each real
84
+ benchmark run, specifically so a clean result is falsifiable evidence, not
85
+ silence. The 3 rows with real outbound calls prove the monitor was
86
+ watching them too — kingfisher, trufflehog, and detect-secrets each ship
87
+ an *optional* live-verification feature (checking a found secret against
88
+ the vendor's own API), scored here in their documented offline mode for a
89
+ fair recall comparison, with their default mode's real connection
90
+ attempts reported factually rather than hidden.
91
+
92
+ GitGuardian's `ggshield` is documented, not scored: it refuses to run
93
+ without a server account, so there's no local result to measure. Published
94
+ while losing rows, then fixed in public against the classes it was losing
95
+ — full methodology, every dated rerun, and how to reproduce it yourself:
96
+ [docs/benchmark.md](docs/benchmark.md).
79
97
 
80
98
  ## What it does
81
99
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "residoo",
3
- "version": "0.8.1",
3
+ "version": "0.8.2",
4
4
  "description": "Find secrets leaking through your AI coding agent's session history. Zero network calls in the scan path, zero dependencies.",
5
5
  "license": "MIT",
6
6
  "author": "CloudRoam (https://cloudroam.io)",
@@ -20,7 +20,8 @@
20
20
  "node": ">=18"
21
21
  },
22
22
  "scripts": {
23
- "test": "node tests/smoke.js"
23
+ "test": "node tests/smoke.js",
24
+ "fuzz": "node tests/fuzz.js"
24
25
  },
25
26
  "files": [
26
27
  "bin",
@@ -41,5 +42,8 @@
41
42
  "privacy",
42
43
  "cli",
43
44
  "encryption"
44
- ]
45
+ ],
46
+ "devDependencies": {
47
+ "fast-check": "4.9.0"
48
+ }
45
49
  }
package/src/patterns.js CHANGED
@@ -145,11 +145,16 @@ const PATTERNS = [
145
145
  // Confirmed via airtable.com/developers/web/api: pat + 14 alnum + "." + 64 hex.
146
146
  { id: "airtable_token", label: "Airtable personal access token", confidence: "high",
147
147
  re: /\bpat[A-Za-z0-9]{14}\.[a-f0-9]{64}\b/g },
148
- // Current Cloudflare API Token format only (cfat_/cfut_, confirmed via
149
- // developers.cloudflare.com). The legacy format is a bare 40-char string
150
- // with no prefix, left out for the same reason as CircleCI's legacy form.
148
+ // Current Cloudflare credential formats only (cfat_/cfut_/cfk_, all three
149
+ // confirmed via developers.cloudflare.com/fundamentals/api/get-started/token-formats,
150
+ // which describes all three with the identical "<prefix>_[40 characters]
151
+ // [checksum]" shape). cfk_ (Global API Key, full account access) found
152
+ // missing by cross-checking agentsweep's own open issue tracker -- it had
153
+ // cfat_/cfut_ before this project did, cfk_ after. The legacy formats are
154
+ // bare unprefixed strings, left out for the same reason as CircleCI's
155
+ // legacy form.
151
156
  { id: "cloudflare_api_token", label: "Cloudflare API token", confidence: "high",
152
- re: /\bcf[au]t_[a-zA-Z0-9]{40}[a-f0-9]{8}\b/g },
157
+ re: /\bcf(?:[au]t|k)_[a-zA-Z0-9]{40}[a-f0-9]{8}\b/g },
153
158
  // Current Heroku API key format only (HRKU-AA + 58 chars, confirmed via
154
159
  // Heroku's own help docs). The legacy format is a bare UUID, left out:
155
160
  // "any UUID-shaped string" is exactly the noisy, unspecific shape this