depcurfew v1.6.0
On this page

Changes in depcurfew 1.6.0

apply

  • The new warning exclude-ignored-by-exec: npx, npm exec and npm x pick the version of a package they download with the release-age delay alone and do not read min-release-age-exclude (npm 11.21.1, 11.21.2 and 12.2.2), so the packages of cooldown.exclude still wait when they run through them. The fix says to install such a package with npm install, which reads the exceptions, and run it from node_modules/.bin, where npx finds it without downloading it.

Local OSV.dev data

  • The warning osv-cache-shared also covers the data files themselves: a data file that other users can write, or that belongs to another user, gets the same warning as such a directory. A data file is read in one step, without following a symbolic link in its place, so it cannot be swapped for a link or a FIFO between a check and the read; a link there makes the data of that ecosystem unreadable, with a note.

Library

  • defaultPopularNames() returns the popular npm packages and PyPI projects that check, the hook and depcurfew mcp compare look-alike names with, as the options popular and popularPython of checkSpecs. A program that calls checkSpecs without the network, such as agentcurfew for the packages of MCP servers, reports names that imitate a popular package with it.
  • defaultOsvData() returns the LocalOsvData of the data depcurfew osv update downloaded to depcurfew's user cache directory, the one the commands read, or undefined when nothing was downloaded.

Documentation

  • The page "Alongside other supply-chain tools" names agentcurfew, depcurfew's sibling for the files that steer AI coding agents, and how the two work together.
  • The README, and so the package page on npm, starts with the logo, one row of badges (CI, npm, Node.js, license, documentation) and a one-sentence summary, and names agentcurfew. The npm keywords include supply-chain-security, dependency-security and malicious-packages.

Fixes

  • Requirements files that include each other (-r, -c) no longer make doctor, apply, explain and the GitHub Action run for ever (also in 1.5.2). A file is known by its real path, so two symbolic links back to its directory (d -> ., e -> .) no longer name it in millions of ways, and the reading of --only-binary works out what each file does once, so a file that includes the next one twice, twenty levels deep, takes a fraction of a second. depcurfew follows at most 1,000 files from one requirements file. Past that, or when files that include a file above them make it read the same ones too many times over, apply warns (requirements-include-unread) and doctor reports it (unreadable-config) instead of passing.
  • The lines that config-drift and doctor --user quote show secrets as <redacted>, as the diffs of apply do (also in 1.5.2). Before, the text, JSON and SARIF of doctor, the log and job summary of the GitHub Action and doctor --user showed a token when its line differed from what apply writes: npmAuthToken in a .yarnrc.yml in flow style, a token in a .npmrc line that a lone carriage return joins to a managed setting, or a token in a minified composer.json.
  • Diffs of apply and the lines doctor quotes also hide Composer's credentials, which Composer keys by host ("github-oauth": {"github.com": "…"}, bearer, http-basic, gitlab-token and the other authentication methods, and the HTTP headers of a repository), by their place in the JSON document, and a token under a quoted key such as "//registry.npmjs.org/:_authToken" in pnpm-workspace.yaml.
  • Hiding secrets in key = value lines takes linear time (also in 1.5.2). A long run of blanks with no = after it, such as a line of 80,000 tabs in .npmrc, took seconds in apply --dry-run, and with the change above it would have in doctor too.
  • The Claude Code hook reads pn, the program that the package pnpm installs next to pnpm since 11.0.0-beta.3, as pnpm (also in 1.5.2). Before, pn add, pn dlx, pn create and pn install --config.minimumReleaseAge=0 went through unchecked; now they are checked as with pnpm, also as pn.cmd and pn.ps1 in PowerShell.
  • apply and init read pnpm's minimumReleaseAgeExclude from the file that include in pnpm-workspace.yaml gives it to (pnpm 12.15 and later), the file apply writes it to (also in 1.5.2). Before, apply commented the exceptions there out without the warning exclusion-dropped, and init did not carry them into cooldown.exclude.
  • apply keeps an entry of uv's exclude-newer-package with a date or a duration that holds its package back longer than cooldown.minimum (certifi = "2026-10-01T00:00:00Z", setuptools = "30 days"), in the managed block, since uv takes the value of a package over exclude-newer (also in 1.5.2). Before, it commented every such entry out, so the package waited only cooldown.minimum. An entry that holds its package back less is commented out with exclusion-dropped, which says so.
  • apply --user and init --user run as root in the home directory of another user (sudo with HOME kept) write nothing through a symbolic link in the home directory that leads out of it (also in 1.5.2). Before, the owner of the home directory could point ~/.config/pip or ~/.config/depcurfew at a directory of root and have root write pip.conf or depcurfew.json there. The error names the link and where it leads; files under an absolute XDG_CONFIG_HOME or %APPDATA% elsewhere are written as before.

Tests

  • The time limits of the tests that guard against slow input measure the CPU time of the test process, so a busy CI machine no longer fails them; the limits are unchanged.