residoo 0.4.8 → 0.4.10

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 (3) hide show
  1. package/README.md +4 -4
  2. package/package.json +1 -1
  3. package/src/scan.js +19 -12
package/README.md CHANGED
@@ -195,10 +195,10 @@ won't be built into the tool that writes it.
195
195
  preview, never the real value, including in `--json` mode. A decoded or
196
196
  rejoined secret is redacted exactly like a plain one.
197
197
  - On an interactive terminal, prints who it is and where it lives before
198
- scanning starts (`residoo v0.4.8 · find secrets your AI coding agent left
198
+ scanning starts (`residoo v0.4.10 · find secrets your AI coding agent left
199
199
  on disk` plus the repo URL), then a live spinner naming the current file
200
200
  as it scans. Every report also opens with the exact version and timestamp
201
- it was run with (`residoo v0.4.8 · scanned 2026-01-01 12:00`; `--json`
201
+ it was run with (`residoo v0.4.10 · scanned 2026-01-01 12:00`; `--json`
202
202
  carries the same as `residooVersion`/`scannedAt`), so a report pasted or
203
203
  screenshotted later never leaves you guessing which build produced it.
204
204
  When there are findings, the report closes with a "Next steps" pointer to
@@ -429,7 +429,7 @@ As a GitHub Action (this repository doubles as a composite action):
429
429
  ```yaml
430
430
  steps:
431
431
  - uses: actions/checkout@v4
432
- - uses: dandovdub/residoo@v0.4.8
432
+ - uses: dandovdub/residoo@v0.4.10
433
433
  ```
434
434
 
435
435
  As a pre-commit hook:
@@ -437,7 +437,7 @@ As a pre-commit hook:
437
437
  ```yaml
438
438
  repos:
439
439
  - repo: https://github.com/dandovdub/residoo
440
- rev: v0.4.8
440
+ rev: v0.4.10
441
441
  hooks:
442
442
  - id: residoo
443
443
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "residoo",
3
- "version": "0.4.8",
3
+ "version": "0.4.10",
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)",
package/src/scan.js CHANGED
@@ -652,29 +652,36 @@ async function scan({ sources, includeNoisy = false, includeSuppressed = false,
652
652
  // needs saying once; per-vendor detail becomes a compact count table.
653
653
  // Deliberately not gated on isTTY like the scan spinner: a script
654
654
  // piping through a pager or into a log still needs this disclosure.
655
+ //
656
+ // Went through two earlier shapes, each missing what mattered: first a
657
+ // bare vendor+count ("AWS 2", which credential?), then vendor+endpoint
658
+ // +count ("AWS sts:get-caller-identity 2", still no way to tell WHICH
659
+ // two). What answers "which needs to be handled" is the same redacted
660
+ // preview (first/last 4 characters) already shown for that finding
661
+ // everywhere else in the report — reusing redact() on the same raw
662
+ // value record() was called with, not a second display convention.
663
+ // One line per vendor+endpoint header, one indented line per credential.
655
664
  const rows = [];
656
665
  if (pendingAwsVerifications.size > 0 && awsAvailable) {
657
- rows.push(["AWS", pendingAwsVerifications.size]);
666
+ rows.push(["AWS", "sts:get-caller-identity", [...pendingAwsVerifications.keys()].map(redact)]);
658
667
  }
659
668
  if (pendingPlanetScaleVerifications.size > 0) {
660
- rows.push(["PlanetScale", pendingPlanetScaleVerifications.size]);
669
+ rows.push(["PlanetScale", "organizations endpoint", [...pendingPlanetScaleVerifications.keys()].map(redact)]);
661
670
  }
662
671
  for (const [ruleId, byValue] of pendingSimpleVerifications) {
663
672
  if (byValue.size === 0) continue;
664
- // Vendor labels are consistently written "<Vendor>'s <endpoint
665
- // description>" (see SIMPLE_VERIFY_VENDOR_LABEL above); take the
666
- // part before "'s" rather than maintaining a second, parallel map
667
- // of the same names.
668
- const vendor = SIMPLE_VERIFY_VENDOR_LABEL[ruleId].split("'s ")[0];
669
- rows.push([vendor, byValue.size]);
673
+ const [vendor, endpoint] = SIMPLE_VERIFY_VENDOR_LABEL[ruleId].split("'s ");
674
+ rows.push([vendor, endpoint, [...byValue.keys()].map(redact)]);
670
675
  }
671
676
  if (rows.length > 0) {
672
- const width = Math.max(...rows.map(([label]) => label.length));
673
- const table = rows.map(([label, count]) => ` ${label.padEnd(width)} ${count}`).join("\n");
677
+ const table = rows
678
+ .map(([vendor, endpoint, previews]) =>
679
+ ` ${vendor} · ${endpoint}\n` + previews.map((p) => ` ${p}`).join("\n"))
680
+ .join("\n");
674
681
  process.stderr.write(
675
682
  "residoo --verify: checking whether these credentials are still active. Real network " +
676
- "calls, one per vendor's own API, using the exact value found in your transcript, one at " +
677
- "a time. Nothing is cached or sent anywhere but the vendor that issued it.\n\n" +
683
+ "calls, using the exact value found in your transcript, one at a time. Nothing is cached " +
684
+ "or sent anywhere but the endpoint listed below.\n\n" +
678
685
  table + "\n\n"
679
686
  );
680
687
  }