This page documents depcurfew 1.6.0, an earlier version. The current version is 1.6.1: its documentation · all versions
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.