Skip to content

Skip secret-scanner findings inside installed plugins instead of blocking the import - #57

Merged
ilovecrayons merged 2 commits into
mainfrom
varram/sup-74-profile-import-plugin-fixtures-scanner
Sep 4, 2026
Merged

Skip secret-scanner findings inside installed plugins instead of blocking the import#57
ilovecrayons merged 2 commits into
mainfrom
varram/sup-74-profile-import-plugin-fixtures-scanner

Conversation

@not-varram

Copy link
Copy Markdown
Contributor

Summary

Closes SUP-74. A secret-shaped string inside an installed plugin's test fixture (for example plugins/cache/<marketplace>/<plugin>/<version>/tests/...) blocked the whole claude profile import, and the only override carried the plugin version, so it had to be redone on every plugin update.

The scanner is unchanged. A finding inside a harness's vendored roots (plugins/cache/ and plugins/marketplaces/ for claude) is now its own exclusion reason, vendored-secret: that file is dropped from the push, reported as third-party content with its rule and location, and the rest of the profile imports. A finding in a file the user wrote still refuses the push with the same --allow-secret advice, and --allow-secret still carries a vendored file when the user wants it. The CLI prints the exact override command under a vendored skip. Other harnesses have no vendored roots and keep blocking.

Checked against a real plugin cache (shapes only): versions are semver, unknown, or content hashes, several co-installed at once, and plugins/marketplaces/ is a larger clone of the marketplace repo with inline plugin sources; both trees are covered.

Validation

  • Tests along the real path: a fake profile home with fixtures at two co-installed versions and under marketplaces imports with both files skipped; a real secret outside those trees still refuses; --allow-secret still carries a vendored file; codex and opencode still block; the gateway end-to-end (profile.preview then profile.push) asserts the fixture's bytes are absent from the wire.
  • make fmt-check vet lint test test-scripts public-audit pass; cd web && bun run typecheck && bun run test (512 tests) pass.
  • Fresh-context adversarial review traced every path and found no way for flagged bytes to reach the server; its scope and accuracy findings (marketplaces tree, three stale doc sentences, capped count, copy wording, stale comments) were fixed before opening.

🤖 Generated with Claude Code

https://claude.ai/code/session_019irxg6aWWKmn2w3QsJR5CJ

A marketplace plugin ships its own test suite, and a secret-shaped
string in one of those fixtures refused the whole claude profile
import. The override the dashboard offered carried the plugin version
in its path, so it died on that plugin's next update.

A scanner finding under a harness's vendored roots - claude's
plugins/cache/ - now drops that one file and reports it as
vendored-secret, the way a symlink escape is already skipped rather
than made fatal. The flagged bytes still never leave the machine, a
finding anywhere the user writes still refuses the push, and
--allow-secret still carries a vendored file when the user wants it.
The rule matches the plugins/cache/ prefix alone, so a version bump,
a new plugin, or a new marketplace changes nothing.

The dashboard row names them as third-party plugin content and keeps
the harness importable.
The review found plugins/marketplaces/ left out: it is the same
third-party content as plugins/cache/, holds the plugin sources
inline, and is the larger of the two on a stock install, so a fixture
there still blocked the whole import. Both trees are vendored roots
now, and isVendored requires a segment after the root so a file named
plugins/cache is not swept in.

The rest is accuracy. A vendored detail carries its location beside
the rule instead of trailing after the sentence. aether profile push
prints the exact --allow-secret command next to each plugin skip, as
docs/harnesses.md promises. The dashboard row says "at least N" when
the gateway capped the exclusion list, and names the two directories
rather than claiming the user did not write what is in them. Three
stale comments and the quickstart and gateway docs no longer state the
old absolute refuse-the-push rule.

Tests: both trees end to end, the fixture's own bytes absent from the
wire, and codex and opencode still refusing the same path.
@ilovecrayons
ilovecrayons merged commit 7cd78dd into main Sep 4, 2026
6 checks passed
@not-varram
not-varram deleted the varram/sup-74-profile-import-plugin-fixtures-scanner branch September 4, 2026 04:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants