residoo 0.4.1 → 0.4.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 +4 -4
- package/package.json +1 -1
- package/src/report.js +12 -3
package/README.md
CHANGED
|
@@ -122,10 +122,10 @@ won't be built into the tool that writes it.
|
|
|
122
122
|
preview, never the real value, including in `--json` mode. A decoded or
|
|
123
123
|
rejoined secret is redacted exactly like a plain one.
|
|
124
124
|
- On an interactive terminal, prints who it is and where it lives before
|
|
125
|
-
scanning starts (`residoo v0.4.
|
|
125
|
+
scanning starts (`residoo v0.4.2 · find secrets your AI coding agent left
|
|
126
126
|
on disk` plus the repo URL), then a live spinner naming the current file
|
|
127
127
|
as it scans. Every report also opens with the exact version and timestamp
|
|
128
|
-
it was run with (`residoo v0.4.
|
|
128
|
+
it was run with (`residoo v0.4.2 · scanned 2026-01-01 12:00`; `--json`
|
|
129
129
|
carries the same as `residooVersion`/`scannedAt`), so a report pasted or
|
|
130
130
|
screenshotted later never leaves you guessing which build produced it.
|
|
131
131
|
When there are findings, the report closes with a "Next steps" pointer to
|
|
@@ -349,7 +349,7 @@ As a GitHub Action (this repository doubles as a composite action):
|
|
|
349
349
|
```yaml
|
|
350
350
|
steps:
|
|
351
351
|
- uses: actions/checkout@v4
|
|
352
|
-
- uses: dandovdub/residoo@v0.4.
|
|
352
|
+
- uses: dandovdub/residoo@v0.4.2
|
|
353
353
|
```
|
|
354
354
|
|
|
355
355
|
As a pre-commit hook:
|
|
@@ -357,7 +357,7 @@ As a pre-commit hook:
|
|
|
357
357
|
```yaml
|
|
358
358
|
repos:
|
|
359
359
|
- repo: https://github.com/dandovdub/residoo
|
|
360
|
-
rev: v0.4.
|
|
360
|
+
rev: v0.4.2
|
|
361
361
|
hooks:
|
|
362
362
|
- id: residoo
|
|
363
363
|
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "residoo",
|
|
3
|
-
"version": "0.4.
|
|
3
|
+
"version": "0.4.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)",
|
package/src/report.js
CHANGED
|
@@ -193,15 +193,23 @@ function renderRotationSection(rotation, { noColor = false, showAdvisory = false
|
|
|
193
193
|
const MAX_SHOWN = 12;
|
|
194
194
|
let shownCount = 0;
|
|
195
195
|
let elided = 0;
|
|
196
|
+
// Tracked separately from `elided` so the closing line can say WHICH rule
|
|
197
|
+
// types got cut, not just how many entries. The cap is global across all
|
|
198
|
+
// groups (a report is a summary), so on a rule-heavy scan the elided
|
|
199
|
+
// remainder almost always spans multiple types, not more of whichever
|
|
200
|
+
// group happened to print right above the "N more" line; without this a
|
|
201
|
+
// reader sees that line directly under (say) an Anthropic group and
|
|
202
|
+
// reasonably reads it as "N more Anthropic keys," which it usually is not.
|
|
203
|
+
const elidedRuleLabels = new Set();
|
|
196
204
|
for (const g of groupList) {
|
|
197
|
-
if (shownCount >= MAX_SHOWN) { elided += g.entries.length; continue; }
|
|
205
|
+
if (shownCount >= MAX_SHOWN) { elided += g.entries.length; elidedRuleLabels.add(g.label); continue; }
|
|
198
206
|
push();
|
|
199
207
|
const g0 = g.entries[0];
|
|
200
208
|
const where = g0.guidance.rotateUrl ? `rotate: ${g0.guidance.rotateUrl}` : `where: ${g0.guidance.consolePath}`;
|
|
201
209
|
push(` ${paint(c.bold, g.label)}`);
|
|
202
210
|
push(paint(c.dim, ` ${where}`));
|
|
203
211
|
for (const e of g.entries) {
|
|
204
|
-
if (shownCount >= MAX_SHOWN) { elided++; continue; }
|
|
212
|
+
if (shownCount >= MAX_SHOWN) { elided++; elidedRuleLabels.add(g.label); continue; }
|
|
205
213
|
shownCount++;
|
|
206
214
|
// e.files always has exactly one entry: the fingerprint is derived
|
|
207
215
|
// from this same basename (see fingerprintFinding in rotation.js), so
|
|
@@ -234,7 +242,8 @@ function renderRotationSection(rotation, { noColor = false, showAdvisory = false
|
|
|
234
242
|
}
|
|
235
243
|
if (elided > 0) {
|
|
236
244
|
push();
|
|
237
|
-
|
|
245
|
+
const typeNote = elidedRuleLabels.size > 1 ? ` across ${elidedRuleLabels.size} rule types` : "";
|
|
246
|
+
push(paint(c.dim, ` … and ${elided} more${typeNote}; see --json for the full list`));
|
|
238
247
|
}
|
|
239
248
|
push();
|
|
240
249
|
push(paint(c.dim, ` Full runbook: residoo explain <rule-id> · rotated: residoo ack <fp> · not a secret: residoo dismiss <fp>`));
|