v0.1.8
Node augmentation batch: TUI hang fix, native addon ESM imports, wasm/shadow-realm unflag, and NODE_COMPAT tree-wide opt-out.
Runtime: terminal foreground handoff
Interactive full-screen TUIs (Nx, Turbo) hung unkillably under nub run — Ctrl-C was unreachable, requiring kill -9. Root cause: since v0.1.6 the child runs in its own process group (setpgid), but that group was never handed the terminal foreground (tcsetpgrp). Any raw-mode terminal read raises SIGTTIN and the process stops; Ctrl-C was delivered to nub, not the child. Non-TUI children don't read the terminal, so the issue was asymmetric.
Fix: on the interactive path (stdin is a TTY with inherited stdio), after spawn, tcsetpgrp(STDIN, child_pgid) hands the terminal foreground to the child's group. A RAII ForegroundGuard restores nub's foreground on child exit. While the child owns the terminal, the redundant SIGINT forward is suppressed (the kernel already delivers Ctrl-C to the foreground group directly); SIGTERM/SIGHUP/QUIT/USR1/USR2 still forward. The v0.1.6 single-SIGINT guarantee is preserved. (#32, fixes #27)
Runtime: expanded feature matrix
Three experimental Node features are now auto-injected on the Node versions that require the flag — consistent with the existing unflag-on-prior-versions posture (default-on in current Node ⇒ backfill it where it was flagged; --node opts out).
| Feature | Flag | Bands injected |
|---|---|---|
| Native addon ESM imports | --experimental-addon-modules |
[22.20, 23.0) ∪ [23.6, ∞) — never default-on; open-ended upper bound |
| WebAssembly modules | --experimental-wasm-modules |
[18.19, 22.19) ∪ [23.0, 24.5) — default-on at 22.19 / 24.5 |
| ShadowRealm | --experimental-shadow-realm |
[18.19, ∞) — TC39 Stage 3, never default-on |
Worker execArgv filtering also strips --harmony-* and --experimental-shadow-realm from child Worker threads to avoid bad-option startup aborts on Node versions where those flags are absent. (#31, #33, b28e40b, c87db12)
CLI: NODE_COMPAT env var
Setting NODE_COMPAT=1 (or true / yes, case-insensitive) forces zero-augmentation mode tree-wide — the persistent, inheritable form of --node. Because env vars propagate to descendants, one export in your shell, .envrc, or CI config covers the entire process tree. Version resolution and Node version provisioning remain active; only runtime augmentation is disabled.
Truthy values: 1, true, yes. Falsy/unset: anything else. Composes with --node (either one forces compat). (#34, f55fc83)
Testing & internals
- pnpm conformance harness: runs pnpm's own test suite against nub, with an allowlist grounded in a full baseline run (
461d613,e7d8f1d). - Fast
devCargo profile + CI compile deduplication (7c67c8d). - CI: cancel-in-progress on PR workflows to avoid redundant runs (#37).
Commits in this release
- fray: stop hook flags idle/frozen/unreaped dispatched sub-agents (
527cb6b) - fray+agents: codify always-steer/resume rule, pnpm-compat exceptions, core design positions; fix stale anti-steering hook text (
d5116c5) - fray: derive agent liveness from ground truth, not a hand-stored status (
fd78dc6) - build: add fast dev profile + cut redundant CI compiles (
7c67c8d) - docs: default to PR flow from a git worktree for nub-repo work (
0bf1056) - cli: add --node opt-out to the node PATH-shim hijack (
f35e566) - tests: add pnpm conformance harness (run pnpm's own suite against nub) (
461d613) - tests: ground pnpm-conformance allowlist in a full-suite run; fix set -u array expansion (
e7d8f1d) - fray(liveness): only flag UNRECONCILED on 'active' threads — parked phases (needs-decision/blocked/planned) with done agents are expected, not drift (
699ce18) - runtime: filter --harmony-* flags from worker execArgv (
b28e40b) - runtime: also strip --experimental-shadow-realm from worker execArgv (
c87db12) - fix(#27): hand terminal foreground to interactive child (tcsetpgrp) (#32,
fc5ffe6) - node: unflag addon-modules (ESM import of native .node addons on prior versions) (#33,
d7541fd) - ci: add concurrency cancel-in-progress to PR workflows (#37,
fcfb986) - feat(node): unflag shadow-realm + wasm-modules (#31,
54cb42e) - feat(cli): NODE_COMPAT env-var opt-out (nub --node persistent equivalent) (#34,
f55fc83) - v0.1.8 (
2f0f452)
Full Changelog: v0.1.7...v0.1.8