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.
- package/README.md +4 -4
- package/package.json +1 -1
- 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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
665
|
-
|
|
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
|
|
673
|
-
|
|
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,
|
|
677
|
-
"
|
|
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
|
}
|