Repository navigation
Release v0.3.0 (part 1): tinyglobby (#56), empty path: entries (#55), dependency advisories - #57
Merged
Merged
Conversation
An unset variable in a `path:` entry expanded to '' and then resolved from the test file's directory, so a bare `$TOOL_DIR` silently put the test directory on PATH. Drop such entries instead. Also stop appending an empty element when no PATH is inherited, since POSIX reads an empty element as the working directory. Closes #55 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W5x8Ticwm5ZY4j2DLhCbXD
fast-glob reaches braces through micromatch, and braces <=3.0.3 has an unpatched high-severity advisory (GHSA-vfj7-8cjw-p6xm / CVE-2026-93687) that fails `npm audit` in every project depending on tryscript. tinyglobby matches through picomatch, which has no braces dependency. Discovery moves to src/lib/discovery.ts. tinyglobby 0.2.17 matches candidate paths relative to its cwd, so a pattern rooted above cwd (`../**/x`, or an absolute pattern run from a subdirectory) silently drops every file inside cwd. findTestFiles therefore globs from the deepest directory containing cwd and every pattern's static base, with patterns rewritten relative to it. expandDirectories is off to keep fast-glob's directory semantics. Patterns under cwd select the same files as fast-glob 3.3.3 (checked on this repository and on a fixture tree). Deliberate edge-case changes: `../` patterns now skip node_modules/dist and honor negations, and an absolute pattern no longer matches nothing when a directory above cwd is named dist or node_modules. The micromatch>picomatch override is removed; micromatch has left the tree. tinyglobby 0.2.17 was published 2026-05-30 via trusted publishing with provenance and has no lifecycle scripts. Closes #56 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W5x8Ticwm5ZY4j2DLhCbXD
Advisories (dev-only; none reaches the published package): - vitest, @vitest/coverage-v8 4.1.10 -> 4.1.11 (GHSA-82fw-gwwq-j7x9) - brace-expansion -> 5.0.12 via one range override, replacing the two version-keyed minimatch edges (GHSA-qhr7-859c-m2p7, GHSA-6j4f-fj2g-mc7p, GHSA-q2hr-2g5m-vwhr) - @humanfs/node -> 0.16.8 via a floor override (GHSA-p498-v437-472g). `pnpm update --depth Infinity` also pulled rollup 4.63.4 and postcss, so an override keeps the lockfile delta to the advisory. Tooling, same publishers, no new dependencies: typescript-eslint 8.70.0, prettier 3.9.8, publint 0.3.24, lefthook 2.1.14. The picomatch 4 override becomes a floor (<4.0.5) instead of pinning every 4.x, so re-resolution can reach the 4.0.7 consumers already get. The minimumReleaseAgeExclude entries for brace-expansion@5.0.9 and nanoid@3.3.18 are removed; both are past the cool-off. Every version is older than the 14-day cool-off (cutoff 2026-09-20T21:55Z), so no exception is taken. Held back: eslint >=10.10 (adds file-entry-cache 11 -> flat-cache -> cacheable -> keyv) and tsx 4.23.15 (repackaged dist, no advisory against 4.23.1). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W5x8Ticwm5ZY4j2DLhCbXD
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W5x8Ticwm5ZY4j2DLhCbXD
|
|
Overall Grade |
Security Reliability Complexity Hygiene |
Code Review Summary
| Analyzer | Status | Updated (UTC) | Details |
|---|---|---|---|
| Secrets | Oct 4, 2026 11:17p.m. | Review ↗ |
Important
AI Review is run only on demand for your team. We're only showing results of static analysis review right now. To trigger AI Review, comment @deepsourcebot review on this thread.
Coverage Report
File CoverageNo changed files found. |
4 of 6 tasks
fdir, which tinyglobby crawls with, suppresses readdir errors, so a directory the user cannot read silently dropped its tests and the run could exit 0. fast-glob 3.3.3 threw EACCES there. Record readdir errors through tinyglobby's fs adapter and fail with the directory and code, ignoring only ENOENT (removed mid-crawl), as fast-glob did. Verified as an unprivileged user against the packed tarball: a `**` pattern over an EACCES directory exits 2 naming it; a pattern that does not traverse it still runs. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W5x8Ticwm5ZY4j2DLhCbXD
jlevy
added this pull request to stack #59
October 4, 2026 22:47
jlevy
marked this pull request as ready for review
October 4, 2026 22:48
Review follow-up. Globbing every pattern from one common ancestor had two side effects: the node_modules/dist ignores applied relative to that ancestor, so a cwd inside dist lost its own matches as soon as another pattern climbed above it (silently); and tinyglobby listed directories between the patterns' bases, which fast-glob never read, so an unlistable parent (mode 0711) newly failed the run. Each positive pattern is now globbed separately from the deepest directory containing cwd and its own base; negations remove the files they match as patterns of their own. Bases are joined below the root without posix.join, which collapsed UNC roots (//server/share). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W5x8Ticwm5ZY4j2DLhCbXD
The release bundles a runtime dependency swap and broad dependency upgrades, and the stacked requires: feature, so it is a minor release. v0.2.2 was never tagged or published. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W5x8Ticwm5ZY4j2DLhCbXD
Second review follow-up. Subtracting every negation's matches after the fact (032d590) stopped `!dir/**` from pruning the crawl, so an excluded tree was walked twice and an unreadable path inside it failed the run, and `!dir` no longer excluded the directory. Negations whose last segment is `**` or a literal name now go to tinyglobby's ignore list for each pattern whose frame contains them, so excluded directories are never read, matching fast-glob's isAffectDepthOfReadingPattern rule. Other negations (`!dir/*`, or one rooted above a pattern's frame) still subtract the files they match, and their read errors are ignored since they can only remove matches. Against fast-glob 3.3.3, every negation case under cwd now matches except exclusions into dot directories, which follow the same dot rule as inclusions and are documented. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01W5x8Ticwm5ZY4j2DLhCbXD
Third review follow-up. fast-glob expanded braces before deciding
which negations prune, so `!{fixtures,tmp}` excluded both directories;
here the brace segment counted as dynamic and only subtracted files.
A negation whose last segment is a brace list of literal names is now
split into one negation per name before classification.
A negation whose base neither contains nor sits inside any positive
pattern's base cannot remove anything, so it is no longer crawled
(`!../vendor/**` read the whole tree for nothing).
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01W5x8Ticwm5ZY4j2DLhCbXD
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
This is the first half of the v0.3.0 release. The second half, #58, adds
requires:. The release was renumbered from v0.2.2 to v0.3.0 at the maintainer's request, since it bundles a runtime dependency swap, broad dependency upgrades, and a new feature. v0.2.2 was never tagged.This PR clears every open audit finding (one runtime, six dev-only), fixes #55, and applies the dependency bumps that are past the cool-off. No cool-off exception is taken: every resolved version predates the 14-day cutoff (2026-09-20T21:55Z).
$VARinpath:went throughresolve(testDir, ''), which put the test file's directory on PATH. Such entries are now dropped. A run with no inherited PATH no longer gets an empty element.fast-glob → micromatch → braces(GHSA-vfj7-8cjw-p6xm, unpatched) is replaced with tinyglobby, insrc/lib/discovery.ts.tinyglobby needed a discovery layer to keep fast-glob semantics
Using tinyglobby 0.2.17 directly, as #56 proposes, silently drops tests in several ways.
findTestFileshandles each one:../../**/*.tryscript.mdfrompackages/tryscriptreturned 1 file instead of 33. tinyglobby matches candidates relative to its own cwd. Fix: each positive pattern is globbed separately, from the deepest directory containing cwd and that pattern's static base.readdirerrors; fast-glob threwEACCES. Fix: errors are recorded through tinyglobby'sfsadapter, and discovery fails naming the directory (exit 2). OnlyENOENTis ignored.isAffectDepthOfReadingPatternrule:**, a literal name, or a brace list of literal names goes into tinyglobby's ignore list, so the excluded directory is never read.!dir/*, or one rooted above a pattern's frame) subtract the files they match.posix.joincollapsed//server/share).Parity: against fast-glob 3.3.3, every pattern and negation case under cwd matches. That covers this repo's trees plus the reviewer's adversarial sets: negparity, negadv2, negprune, intermediate, symlinks,
./,a/../b, and a cwd insidedist. Intended differences, all documented in the CHANGELOG and reference:../**) now apply thenode_modules/distignores and negations, which fast-glob skipped for them.distdirectory now finds its files; fast-glob found nothing.Senior review
A delegated senior-engineer review ran three rounds over this PR and #58.
!dir, brace-list negations, and crawls of non-overlapping negations.requiresvalidation.Supply-chain review
file-entry-cache11 →flat-cache→cacheable→keyv(the keyv worm family).pnpm update --depth Infinitywould also have dragged in rollup 4.63.4 and postcss.Validation plan
pnpm verifyon the head: 281 unit tests, v0.1.7 compatibility replay,pnpm auditclean.test:coverage: 127 golden blocks.npm auditreports 0 vulnerabilities, and fast-glob, micromatch and braces are gone.EACCESverified as an unprivileged user.v0.3.0onmainand verify npm and the GitHub release.Closes #55
Closes #56
🤖 Generated with Claude Code
https://claude.ai/code/session_01W5x8Ticwm5ZY4j2DLhCbXD