v0.2.1
This release makes nub install resilient on resource-constrained CI and containers, and shaves repeated work off the install and warm-cache paths.
Important
Installs no longer abort under thread/PID or CPU-quota pressure. On constrained CI runners (e.g. Vercel) nub ci could exit 101 at the install tail when an OS thread spawn failed with EAGAIN — with panic = "abort", that crashed the whole install instead of degrading. Spawns are now guarded and the install's CPU-bound pools size to the cgroup CPU quota rather than the host core count. If you saw intermittent exit-101 installs in a container, this release fixes them.
Install resilience & performance
| Area | What changed | Commit |
|---|---|---|
nub ci / install |
Guard every thread::spawn against EAGAIN and add a cgroup-aware concurrency cap, so install degrades gracefully instead of aborting under thread/PID exhaustion |
#136 (1889904f) |
| Pool sizing | Size the CPU-bound install pools (tokio, rayon, the linker pool) to the box's cgroup CFS CPU quota instead of the over-reported host core count, avoiding over-subscription and the CFS-throttle latency cliff | #140 (8098ce11) |
| File descriptors | Raise the soft RLIMIT_NOFILE on PM-engine startup, fixing intermittent Too many open files (os error 24) on large dependency trees (e.g. @aws-sdk/* + aws-cdk-lib) on macOS |
#143 (336408a9) |
| Config reads | Read and parse each config file (package.json, .npmrc, .yarnrc.yml, …) once per command via an mtime-validated cache, dropping repeated reads from 3x to 1x with byte-identical output |
#137 (2fe966bb) |
| Transpile cache | Collapse warm transpile-cache hits from three body copies to one, reusing the read buffer in place | #139 (9368ec2a) |
The NUB_CPU_BUDGET override introduced alongside the pool-sizing work was removed before release — CPU-quota auto-detection stays wired in, with no public CPU knob in any namespace. (#150, 146cadca)
nub run
nub run <script> <args> already forwarded args to the underlying command, but the echoed $ <cmd> preamble showed only the script body. It now includes the forwarded args, shell-quoted exactly as they run, so the displayed command matches what executes. (#147, f9785bcd)
Documentation
- Correct the pnpm
overridesand npmresolutionssupport-table rows to match the surrounding prose (2a6faad1).
CI & tooling
- Share the rust-cache across CI jobs, saving only on
mainso PRs restore read-only and stop churning the cache budget (#133,1d4c39e4). - Drop the unused pnpm cache from the daily-driver smoke workflow, fixing its post-cleanup cache-save failure (#138,
9d2aead1). - Default new worktrees to
~/.cache/nub/worktreesinstead of/tmp(d609654b). - Add the
implementation-threadandvisual-reviewskills; add decisions-pending statusline tooling and a comment-guard nudge (b5c6dbd7,2ebae8a9,cd185f40,b4f55577).
Site & README
README badge-link cleanup and an animated star-count SVG endpoint at /stars.svg. (783e0c21, 6cb68613, 60568ed6)
Commits in this release
- Remove badge links from README (
783e0c21) - site: add animated star-count SVG endpoint at /stars.svg (
6cb68613) - site: restyle /stars.svg as GitHub's Star button (dark) (
f9634e91) - ci: share rust-cache across jobs, save only on main (#133,
1d4c39e4) - site: fix /stars.svg count-up — nested-svg+SMIL clip, 6.5s ease-in-out odometer (
60568ed6) - hooks(gh-comment-guard): nudge toward minimal comments, not trim-to-limit (
b4f55577) - fix(ci): guard thread::spawn against EAGAIN + cgroup-aware concurrency cap so install degrades instead of aborting (panic=abort) (#136,
1889904f) - fix(ci): drop pnpm cache from daily-driver setup-node (#138,
9d2aead1) - feat(install): size CPU-bound pools to the cgroup CPU quota, not host cores (#140,
8098ce11) - run: include forwarded args in the echoed command (#147,
f9785bcd) - chore(worktree): default worktrees to ~/.cache/nub/worktrees (off /tmp) (
d609654b) - perf(pm): read each config file once per command via an mtime-validated cache (#137,
2fe966bb) - perf(cache): collapse warm-hit body copies from 3 to 1 (#139,
9368ec2a) - fix(install): raise RLIMIT_NOFILE on the PM engine startup (#143,
336408a9) - docs(install): correct pnpm overrides + npm resolutions support-table rows to match prose (
2a6faad1) - skills: add implementation-thread + visual-review (codify the workup + browser-computed UI verification) (
b5c6dbd7) - Remove the NUB_CPU_BUDGET public override (brand boundary) (#150,
146cadca) - tooling: decisions-pending statusline (live 'N decisions awaiting maintainer' from .fray/decisions.md) (
2ebae8a9) - tooling: multi-line decisions statusline (list each pending decision) (
cd185f40)
Full Changelog: v0.2.0...v0.2.1