Skip to content

chore(deps): update dependency npm:secretlint to v14 - #115

Open
renovate[bot] wants to merge 1 commit into
mainfrom
renovate/major-secretlint-monorepo
Open

renovate[bot] wants to merge 1 commit into
mainfrom
renovate/major-secretlint-monorepo

Conversation

@renovate

@renovate renovate Bot commented Nov 15, 2026

Copy link
Copy Markdown
Contributor

This PR contains the following updates:

Package Change Age Confidence
npm:secretlint (source) 13.1.0 → 14.0.0 age confidence

Release Notes

secretlint/secretlint (npm:secretlint)

v14.0.0

Compare Source

Highlights

Secretlint v14 is faster, has fewer dependencies, and works without any setup.

  • Faster: a full scan of a large repository is 7x to 24x faster than v13.1.0, and a pre-commit run on one file is faster too.
  • Built-in rules: the official rules are part of secretlint. npm install secretlint is all you need.
  • Zero config: without a configuration file, Secretlint runs the recommended rules.

Upgrading from v13? Read the migration guide.

Performance
image
secretlint "**/*" files v13.1.0 v14
one file (like a pre-commit hook) 1 246 ms 153 ms 1.6x faster
react 7,275 2.82 s 405 ms 7.0x faster
vscode 21,442 13.9 s 758 ms 18.3x faster
linux 97,265 56.5 s 2.31 s 24.5x faster

Recommended preset, median wall time, Node.js 24.22, 4 vCPU Linux. Both versions report the same 37 messages on vscode.

Secretlint is still JavaScript. It was not rewritten in Rust or another language, and it uses no native module or WebAssembly. So @secretlint/core and the recommended rules still run in browsers as they are, and a new browser test (Playwright + Chromium) checks this on every change (#​1803, #​1804). The worker threads below are used only by the Node.js CLI and @secretlint/node.

In short: the single thread was made fast first. Then worker threads were added only to read files and look for keywords, and the rules run on the main thread for the few files that have a keyword. For the details, read "Looking for keywords on several threads" in the design document.

What made it faster:

  • The rules declare the keywords of their secrets, and Secretlint looks for all keywords in one pass over the bytes of each file. A file without a keyword is never decoded and no rule runs for it (#​1794, #​1826, #​1827).
  • Worker threads read and scan files when there are many of them. The rules still run on the main thread, so the results are the same (#​1824).
  • The file search matches ignore rules like Git with its own matcher, and looks up the rules by the name of each entry (#​1818, #​1822).
  • The ID scan patterns of the aws rule no longer run when enableIDScanRule is off (#​1819).
  • Startup is shorter: fewer dependencies and a lazily created emoji pattern (#​1813, #​1814, #​1816).

You can see where the time goes with secretlint --profile "**/*". It now prints a summary by phase, rule, pattern, and file (#​1820).

The official rules are built in

The official rules and presets moved into @secretlint/core (#​1798, #​1832).

# v13
npm install secretlint @secretlint/secretlint-rule-preset-recommend --save-dev

# v14
npm install secretlint --save-dev

Why: each official rule was its own npm package. Publishing a new package needs manual setup on npm (trusted publishing for each package), and every release published more than 30 rule packages. This made a release error-prone and made adding a new rule expensive. Now a new rule is a file in @secretlint/core, and the rules always have the same version as Secretlint.

  • Rule ids do not change. .secretlintrc.json files keep working.
  • An official rule id is always resolved from @secretlint/core. An old rule package that is still installed is not loaded, and you can remove it from package.json.
  • The rule packages and presets are no longer published. Their documentation moved to docs/rules.
  • @secretlint/secretlint-rule-no-dotenv, -no-homedir, -no-k8s-kind-secret, and -secp256k1-privatekey are still separate packages.

Third-party runtime dependencies of secretlint went from 69 packages (v13.1.0 with the recommend preset) to 16 (#​1809, #​1810, #​1813, #​1814).

Zero config

When no configuration file is found, Secretlint runs the recommended rules instead of failing (#​1835). The recommended rules are designed to report very few false positives, so running them by default is safe. secretlint --init always writes the recommended preset (#​1833).

npx secretlint "**/*"

@secretlint/quick-start is no longer needed: use npx secretlint "**/*" instead.

Declarative rules

A rule can be data: patterns with keywords, instead of a create() function (#​1794). The core runs the patterns only on the files that contain a keyword. @secretlint/secretlint-rule-pattern reads its user patterns the same way, so a config with your own patterns is fast too (#​1826). See Creating a rule.

Breaking Changes

Most users can upgrade without changing anything. Update secretlint to v14, and your .secretlintrc keeps working with the same rule ids. Removing the rule packages that are no longer used is recommended, but not required.

See the migration guide for details and examples.

Recommended: remove the rule packages

The packages are gone, but their rule ids stay. Keep using the same ids in .secretlintrc.json. This configuration works in v14 without installing any rule package:

{
  "rules": [
    { "id": "@secretlint/secretlint-rule-preset-recommend" }
  ]
}

The official rules and presets are bundled in secretlint, so the rule packages that you installed are no longer used. Remove them to avoid installing packages that are not used:

npm uninstall @secretlint/secretlint-rule-preset-recommend

If you installed other official rule packages, this command removes all of them (a package that is not installed is skipped):

npm uninstall @secretlint/secretlint-rule-1password @secretlint/secretlint-rule-anthropic @secretlint/secretlint-rule-aws @secretlint/secretlint-rule-azure @secretlint/secretlint-rule-basicauth @secretlint/secretlint-rule-cloudflare @secretlint/secretlint-rule-database-connection-string @secretlint/secretlint-rule-databricks @secretlint/secretlint-rule-docker @secretlint/secretlint-rule-figma @secretlint/secretlint-rule-filter-comments @secretlint/secretlint-rule-gcp @secretlint/secretlint-rule-github @secretlint/secretlint-rule-gitlab @secretlint/secretlint-rule-grafana @secretlint/secretlint-rule-groq @secretlint/secretlint-rule-hashicorp-vault @secretlint/secretlint-rule-huggingface @secretlint/secretlint-rule-linear @secretlint/secretlint-rule-notion @secretlint/secretlint-rule-npm @secretlint/secretlint-rule-openai @secretlint/secretlint-rule-pattern @secretlint/secretlint-rule-preset-canary @secretlint/secretlint-rule-preset-recommend @secretlint/secretlint-rule-privatekey @secretlint/secretlint-rule-sendgrid @secretlint/secretlint-rule-shopify @secretlint/secretlint-rule-slack @secretlint/secretlint-rule-stripe @secretlint/secretlint-rule-tailscale @secretlint/secretlint-rule-vercel

pnpm (pnpm remove) and Yarn stop with an error when a package is not installed, so pass only the packages that are in your package.json.

The official rule packages and presets are not published from v14. A rule package that is still installed is not loaded: the rule id always uses the rule bundled in secretlint.

For users of the command line
  • No configuration file: Secretlint runs the recommended rules instead of exiting with status 2.
  • --secretlintrc <path> names exactly one file from the current directory. It no longer searches the parent directories or adds an extension.
  • --secretlintignore <path> is a path from the current directory, and it is read in addition to .secretlintignore.
  • Ignore rules: the built-in rules, .gitignore, .secretlintignore, and --secretlintignore are combined. A file is ignored if any of them ignores it, and a ! rule only re-includes within the same kind of file. Ignore rules are matched like Git. To lint the files that .gitignore ignores, use --no-gitignore.
  • aws rule: enableIDScanRule must be a boolean (true, not "true").
  • --profile prints a summary instead of the lint results.
For developers (API, formatters, and rules)
  • Results and --format json no longer contain sourceContent. Formatters get getSource(filePath).
  • configFilePath of loadConfig() / loadConfigDescriptor() is string | undefined.
  • Files are linted in any order, so a rule must not keep state between files.
  • "all" is removed from SecretLintRuleContentType, and create is optional in SecretLintRuleCreator.
  • Code that imported a rule from @secretlint/secretlint-rule-* imports it from @secretlint/core/builtin/rules/<name>.

What's Changed

Breaking Changes
  • feat!: remove sourceContent from the result, and add getSource to formatters by @​azu in #​1797
  • feat(core)!: pass the bytes of the source to rules, and check .p12 files without node:fs by @​azu in #​1804
  • feat(profiler): print a summary by phase, rule, pattern, and file with --profile by @​azu in #​1820
  • feat!: move the documentation of the built-in rules to docs/rules, remove their packages, and check links by @​azu in #​1832
  • feat!: run the recommend preset when no configuration is found by @​azu in #​1835
  • fix(secretlint)!: read --secretlintignore as a path from cwd, and combine the sources of ignore rules by @​azu in #​1834
Features
  • feat: declarative rule patterns, and a single-thread scan pipeline that works on bytes by @​azu in #​1794
  • feat: build the official rules into @​secretlint/core and resolve them by rule id by @​azu in #​1798
  • feat(core): read the patterns of rule-pattern as declarative patterns with keywords by @​azu in #​1826
  • feat(core): add a guard to a keyword of a pattern by @​azu in #​1827
  • feat(config-creator): --init always writes the recommended preset by @​azu in #​1833
Bug Fixes
  • fix(profiler): disable the profiler by default and add profile option to createEngine by @​azu in #​1784
  • fix(aws,npm): report the range of the secret, not the start of the match by @​azu in #​1796
  • fix(core): do not run a rule that is disabled in the rules of a preset by @​azu in #​1801
Performance
  • perf: speed up linting many files by @​azu in #​1783
  • perf(formatter): create the emoji pattern of string-width lazily by @​azu in #​1816
  • perf(walker): find the ignore rules by the name of the entry by @​azu in #​1818
  • perf(core): add when to a pattern, and do not run the ID scan patterns of the aws rule by default by @​azu in #​1819
  • perf(walker): match ignore rules like Git without node-ignore by @​azu in #​1822
  • perf(node): read and scan files on worker threads by @​azu in #​1824
Documentation
Refactoring
Testing
Maintenance
CI
  • Update github/codeql-action action to v3.39.1 by @​renovate[bot] in #​1769
  • Update github/codeql-action action to v3.39.2 by @​renovate[bot] in #​1795
  • Update github/codeql-action action to v3.39.3 by @​renovate[bot] in #​1800
  • ci(binary): update Bun to 1.4.4, and show where the binary test hangs by @​azu in #​1829
  • feat(benchmark): profile and benchmark the base and the head of a change, and update AGENTS.md by @​azu in #​1828
  • ci: update GitHub Actions to the latest major versions by @​azu in #​1830
Dependency Updates
Other Changes

New Contributors

Full Changelog: secretlint/secretlint@v13.1.0...v14.0.0


Generated by Claude Code


Configuration

📅 Schedule: (UTC)

  • Branch creation
    • At any time (no schedule defined)
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Disabled by config. Please merge this manually once you are satisfied.

♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 Ignore: Close this PR and you won't be reminded about this update again.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@github-actions

Copy link
Copy Markdown

✅MegaLinter analysis: Success

Descriptor Linter Files Fixed Errors Max errors Warnings Elapsed time
✅ COPYPASTE jscpd yes no no 0.38s
✅ REPOSITORY git_diff yes no no 0.27s

See detailed reports in MegaLinter artifacts
Set VALIDATE_ALL_CODEBASE: true in mega-linter.yml to validate all sources, not only the diff

MegaLinter is provided by OX Security
Show us your support by starring ⭐ the repository

@github-actions

Copy link
Copy Markdown

✅MegaLinter analysis: Success

Descriptor Linter Files Fixed Errors Max errors Warnings Elapsed time
✅ REPOSITORY betterleaks yes no no 1.14s
✅ REPOSITORY checkov yes no no 14.07s
✅ REPOSITORY devskim yes no no 1.67s
✅ REPOSITORY dustilock yes no no 0.01s
✅ REPOSITORY grype yes no no 69.95s
✅ REPOSITORY kingfisher yes no no 9.97s
✅ REPOSITORY osv-scanner yes no no 0.12s
✅ REPOSITORY secretlint yes no no 0.96s
✅ REPOSITORY syft yes no no 2.35s
✅ REPOSITORY trivy yes no no 10.2s
✅ REPOSITORY trivy-sbom yes no no 0.15s
✅ REPOSITORY trufflehog yes no no 2.66s

See detailed reports in MegaLinter artifacts
Set VALIDATE_ALL_CODEBASE: true in mega-linter.yml to validate all sources, not only the diff

MegaLinter is provided by OX Security
Show us your support by starring ⭐ the repository

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants