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 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.1 · find secrets your AI coding agent left
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.1 · scanned 2026-01-01 12:00`; `--json`
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.1
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.1
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.1",
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
- push(paint(c.dim, ` and ${elided} more; see --json for the full list`));
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>`));