get-tbd 0.1.27 → 0.1.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,7 +5,7 @@ author: Joshua Levy (github.com/jlevy) with LLM assistance
5
5
  ---
6
6
  # pnpm Monorepo Patterns
7
7
 
8
- **Last Updated**: 2026-02-18
8
+ **Last Updated**: 2026-05-21
9
9
 
10
10
  **Related**:
11
11
 
@@ -14,6 +14,7 @@ author: Joshua Levy (github.com/jlevy) with LLM assistance
14
14
  - [tsdown Documentation](https://tsdown.dev/)
15
15
  - [publint Documentation](https://publint.dev/docs/)
16
16
  - [Companion: Bun Monorepo Patterns](./bun-monorepo-patterns.md)
17
+ - [Supply-Chain Mitigation](#supply-chain-mitigation) (in this document)
17
18
 
18
19
  * * *
19
20
 
@@ -23,24 +24,31 @@ author: Joshua Levy (github.com/jlevy) with LLM assistance
23
24
 
24
25
  | Tool / Package | Version | Check For Updates |
25
26
  | --- | --- | --- |
26
- | **Node.js** | 24 (LTS “Krypton”) | [nodejs.org/releases](https://nodejs.org/en/about/previous-releases) — Active LTS until Oct 2026 |
27
- | **pnpm** | 10.28.2 | [github.com/pnpm/pnpm/releases](https://github.com/pnpm/pnpm/releases) — V8 binary storage for faster cache reads |
28
- | **TypeScript** | ^5.9.3 | [github.com/microsoft/TypeScript/releases](https://github.com/microsoft/TypeScript/releases) — 5.9.3 stable. TS 6.0 is “bridge” release; TS 7.0 (Go rewrite) in VS 2026 Insiders preview. |
29
- | **tsdown** | ^0.20.0 | [github.com/rolldown/tsdown/releases](https://github.com/rolldown/tsdown/releases) — 0.20.0-beta.3 latest. Requires Node.js 20.19+. |
30
- | **publint** | ^0.3.0 | [npmjs.com/package/publint](https://www.npmjs.com/package/publint) |
31
- | **@changesets/cli** | ^2.29.0 | [github.com/changesets/changesets/releases](https://github.com/changesets/changesets/releases) |
32
- | **@types/node** | ^24.0.0 | Should match Node.js major version (^25.0.0 also available) |
33
- | **actions/checkout** | v6 | [github.com/actions/checkout/releases](https://github.com/actions/checkout/releases) — Latest (v6.0.2), requires Runner v2.329.0+ |
34
- | **actions/setup-node** | v6 | [github.com/actions/setup-node/releases](https://github.com/actions/setup-node/releases) |
35
- | **pnpm/action-setup** | v4 | [github.com/pnpm/action-setup/releases](https://github.com/pnpm/action-setup/releases) |
36
- | **changesets/action** | v1 | [github.com/changesets/action](https://github.com/changesets/action) |
37
- | **lefthook** | ^2.0.15 | [github.com/evilmartians/lefthook/releases](https://github.com/evilmartians/lefthook/releases) — 2.1.1 latest. v2 dropped regexp `exclude`, `skip_output`. |
38
- | **npm-check-updates** | ^19.0.0 | [npmjs.com/package/npm-check-updates](https://www.npmjs.com/package/npm-check-updates) |
39
- | **tsx** | ^4.21.0 | [github.com/privatenumber/tsx/releases](https://github.com/privatenumber/tsx/releases) |
40
- | **prettier** | ^3.0.0 | [github.com/prettier/prettier/releases](https://github.com/prettier/prettier/releases) |
27
+ | **Node.js** | 24 (LTS “Krypton”) | [nodejs.org/releases](https://nodejs.org/en/about/previous-releases) — Node 24 Active LTS until Oct 2026. **Node 26 Current** shipped 2026-05-05 (Temporal API enabled by default, V8 14.6, Undici 8.0). **Node 20 went EOL 2026-03-24.** Node 26 is the last release on the old two-major-per-year cadence; starting v27, all majors become LTS (one per year). |
28
+ | **pnpm** | ^11.0.0 (11.2.x too recent) | [github.com/pnpm/pnpm/releases](https://github.com/pnpm/pnpm/releases) — **Pinned to 11.0.0 (2026-04-28) per the 14-day rule**; 11.2.0/11.2.2 shipped 2026-05-20/21 (1–2 days old today). Breaking changes: pure ESM (requires **Node 22+**); SQLite-based store (`$STORE/index.db`); **`minimumReleaseAge` defaults to 1440 minutes (1 day)** for supply-chain hygiene; **`blockExoticSubdeps` defaults to `true`**; `onlyBuiltDependencies`/`neverBuiltDependencies` removed and replaced by **`allowBuilds`**; `patchedDependencies` format simplified; experimental Rust-based `@pnpm/pacquet` engine arrives in 11.2+. v11.1 added `pnpm audit signatures`, `pnpm bugs`, `pnpm owner`. |
29
+ | **TypeScript** | ^6.0.3 | [github.com/microsoft/TypeScript/releases](https://github.com/microsoft/TypeScript/releases) — **6.0.3 stable** (shipped 2026-03-23). 6.0 is the last JavaScript-based release; `strict: true` is now the default, ESM is the default module system, ~9 compiler settings flipped defaults. **TS 7.0 Beta** (Project Corsa, Go rewrite) shipped 2026-04-21 as `@typescript/native-preview` (binary: `tsgo`); claims ~10× type-check speed and ~3× less memory. Stable expected mid-to-late 2026. Do not adopt `tsgo` for production builds yet. |
30
+ | **tsdown** | ^0.22.0 | [github.com/rolldown/tsdown/releases](https://github.com/rolldown/tsdown/releases) — 0.22.0 (2026-05-07). Has not reached 1.0; incremental 0.20→0.22 releases since Feb 2026; no deprecations. Requires Node.js 20.19+. |
31
+ | **publint** | ^0.3.20 (0.3.21 too recent) | [npmjs.com/package/publint](https://www.npmjs.com/package/publint) — **Pinned to 0.3.20 (2026-05-08) per the 14-day rule**; 0.3.21 (2026-05-13) is 9 days old today. Re-enabled TS/TSX file existence checks; `exports["default"]` support; bug fixes. |
32
+ | **@changesets/cli** | ^2.31.0 | [github.com/changesets/changesets/releases](https://github.com/changesets/changesets/releases) — 2.31.0 latest. No native Bun support added. |
33
+ | **@types/node** | ^24.0.0 | [@types/node npm](https://www.npmjs.com/package/@types/node) — Track Node.js major version. @types/node@25.x available; @types/node@26.x will follow Node 26. |
34
+ | **actions/checkout** | v6 | [github.com/actions/checkout/releases](https://github.com/actions/checkout/releases) — v6.0.2 (2026-01-09). Credentials now stored in `$RUNNER_TEMP` rather than `.git/config`; Node 24 runtime; requires runner ≥ 2.327.1. |
35
+ | **actions/setup-node** | v6 | [github.com/actions/setup-node/releases](https://github.com/actions/setup-node/releases) — Supports Node 24 by default. **Note GitHub’s 2026-06-02 deadline forcing Node.js 20 actions to Node.js 24.** |
36
+ | **pnpm/action-setup** | v6 | [github.com/pnpm/action-setup/releases](https://github.com/pnpm/action-setup/releases) — **v6 required for pnpm 11+ support.** v4 (previously documented) does not handle pnpm 11’s ESM-only distribution correctly. |
37
+ | **changesets/action** | v1 | [github.com/changesets/action](https://github.com/changesets/action) — Still v1. No v2. |
38
+ | **lefthook** | ^2.1.5 (2.1.7/2.1.8 too recent) | [github.com/evilmartians/lefthook/releases](https://github.com/evilmartians/lefthook/releases) — **Pinned to 2.1.5 (2026-04-06) per the 14-day rule**; 2.1.7/2.1.8 both shipped 2026-05-19. Patch-level since 2.1.1. v2 still excludes regexp `exclude` and `skip_output` from v1. |
39
+ | **npm-check-updates** | ^22.0.0 (22.2.0 too recent) | [npmjs.com/package/npm-check-updates](https://www.npmjs.com/package/npm-check-updates) — **Major version jump from 19 to 22.** **Pinned to 22.0.0 (2026-04-25) per the 14-day rule**; 22.2.0 (2026-05-12) is 10 days old today. Now pure ESM; named imports only (`import { run } from 'npm-check-updates'`); `.ncurc.js` with `module.exports` no longer works in `"type": "module"` projects (use `.ncurc.cjs`). **Ships `--cooldown <days>` to refuse versions younger than the specified age** — primary enforcement for the 14-day package-age rule. See [Supply-Chain Mitigation](#supply-chain-mitigation). |
40
+ | **tsx** | ^4.21.0 (4.22.x too recent) | [github.com/privatenumber/tsx/releases](https://github.com/privatenumber/tsx/releases) — **Pinned to 4.21.0 (2025-11-30) per the 14-day rule**; 4.22.0 shipped 2026-05-14 (8 days old) and 4.22.3 shipped 2026-05-19 (3 days old). Bump on next refresh once 4.22.x has aged. |
41
+ | **prettier** | ^3.8.3 | [github.com/prettier/prettier/releases](https://github.com/prettier/prettier/releases) — 3.8.3 stable. Prettier 4.0 is in alpha (4.0.0-alpha.13, CLI performance rewrite) — **not stable yet**; do not adopt. |
41
42
  | **eslint-config-prettier** | ^10.0.0 | [github.com/prettier/eslint-config-prettier/releases](https://github.com/prettier/eslint-config-prettier/releases) |
42
- | **ESLint** | ^9.39.0 | [github.com/eslint/eslint/releases](https://github.com/eslint/eslint/releases) — 9.39.2 stable. v10.0.0 in RC phase (Jan 2026). |
43
- | **Vitest** | ^4.0.0 | [github.com/vitest-dev/vitest/releases](https://github.com/vitest-dev/vitest/releases) — 4.0.18 latest. Browser Mode stable, visual regression testing added. `coverage.all` removed in v4. |
43
+ | **ESLint** | ^10.0.0 | [github.com/eslint/eslint/releases](https://github.com/eslint/eslint/releases) — **ESLint 10.0.0 shipped 2026-02-06.** **Breaking**: `.eslintrc.*` configuration is completely removed — flat config (`eslint.config.js`) is the only supported format. Download size reduced (11 MB → 9.4 MB). Improved JSX reference tracking. **Minimum Node.js v20.19.0.** ESLint 9.x EOL is 2026-08-06. |
44
+ | **Vitest** | ^4.1.5 (4.1.6/4.1.7 too recent) | [github.com/vitest-dev/vitest/releases](https://github.com/vitest-dev/vitest/releases) — **Pinned to 4.1.5 (2026-04-21) per the 14-day rule**; 4.1.7 (2026-05-20) is 2 days old today. v4.1 (Mar 2026) added Vite 8 support, test tags, extended chai-style assertions for mocking. Vitest now reuses installed Vite instead of bundling. Browser Mode stable, visual regression added. `coverage.all` was removed in v4. Vitest 5.0.0-beta.3 in pre-release (requires Node 22+, Vite 6.4+) — **do not adopt yet**. |
45
+ | **Zod** | ^4.4.3 | [github.com/colinhacks/zod/releases](https://github.com/colinhacks/zod/releases) — **Zod 4 fully stable.** 14× faster string parsing, 7× faster array parsing, 6.5× faster object parsing vs Zod 3; core bundle 2.3× smaller. New `@zod/mini` package (~1.9 KB gzipped) for tree-shakable frontend validation. Migration from Zod 3 required — see [zod.dev/v4/changelog](https://zod.dev/v4/changelog). |
46
+ | **commander** | ^15.0.0 | [github.com/tj/commander.js/releases](https://github.com/tj/commander.js/releases) — Commander 15 shipping May 2026, **ESM-only, requires Node v22.12.0+**. Commander 14 moves to maintenance (security only) until May 2027. |
47
+ | **picocolors** | ^1.1.1 | [npmjs.com/package/picocolors](https://www.npmjs.com/package/picocolors) — Last release October 2024. Stable; no changes expected. |
48
+ | **dotenv** | ^17.4.2 | [npmjs.com/package/dotenv](https://www.npmjs.com/package/dotenv) — Stable. **Prefer Node.js native `--env-file` for Node ≥20.6** (production-ready since Node 24 LTS); use dotenv only when you need variable expansion, multiline values, or custom precedence logic. |
49
+ | **atomically** | ^2.1.1 | [npmjs.com/package/atomically](https://www.npmjs.com/package/atomically) — 2.1.1 (2026-02-08). Still maintained. |
50
+ | **yaml** | ^2.8.4 | [npmjs.com/package/yaml](https://www.npmjs.com/package/yaml) — 2.8.4 (2026-05-02). v3.0.0-1 is tagged “next” (pre-release) — do not adopt yet. |
51
+ | **@vitest/coverage-v8** | ^4.1.7 | [npmjs.com/package/@vitest/coverage-v8](https://www.npmjs.com/package/@vitest/coverage-v8) — Track Vitest version. |
44
52
 
45
53
  ### Reminders When Updating
46
54
 
@@ -67,6 +75,11 @@ author: Joshua Levy (github.com/jlevy) with LLM assistance
67
75
 
68
76
  6. **Review “Open Research Questions”** section for any resolved items
69
77
 
78
+ 7. **Honor the 14-day package-age rule** when bumping versions in code examples.
79
+ See [Supply-Chain Mitigation](#supply-chain-mitigation) — versions cited here should
80
+ be ≥14 days old at the time the table is updated, except where a clearly-noted
81
+ security exception applies.
82
+
70
83
  * * *
71
84
 
72
85
  ## Executive Summary
@@ -141,8 +154,20 @@ recommendations from the TypeScript and JavaScript ecosystem maintainers.
141
154
 
142
155
  - `pnpm deploy` command enables isolated production deployments for Docker
143
156
 
144
- **Assessment**: pnpm is the consensus choice for TypeScript monorepos in 2025, offering
145
- superior disk efficiency and stricter dependency management than npm or yarn.
157
+ - **pnpm 11 (shipped 2026-04-28)** adds significant supply-chain hardening defaults:
158
+ `minimumReleaseAge: 1440` (1 day) and `blockExoticSubdeps: true`. We recommend
159
+ overriding `minimumReleaseAge` to 14 days — see
160
+ [Supply-Chain Mitigation](#supply-chain-mitigation).
161
+
162
+ - **pnpm 11 is pure ESM and requires Node.js 22+.** Lifecycle script gating has moved
163
+ from `onlyBuiltDependencies`/`neverBuiltDependencies` to **`allowBuilds`** (an
164
+ explicit allowlist).
165
+
166
+ - The store is now a single SQLite database (`$STORE/index.db`) for faster cache reads;
167
+ this is invisible to users but matters for CI cache configs.
168
+
169
+ **Assessment**: pnpm remains the consensus choice for TypeScript monorepos, with pnpm 11
170
+ adding meaningful supply-chain defaults and faster store I/O.
146
171
 
147
172
  **Key Configuration** (`pnpm-workspace.yaml`):
148
173
 
@@ -150,6 +175,13 @@ superior disk efficiency and stricter dependency management than npm or yarn.
150
175
  packages:
151
176
  - 'packages/*'
152
177
  - 'apps/*'
178
+
179
+ # Supply-chain hardening (see Supply-Chain Mitigation section)
180
+ minimumReleaseAge: 20160 # 14 days in minutes
181
+ blockExoticSubdeps: true # Default in pnpm 11; explicit is good
182
+ allowBuilds: # Replaces onlyBuiltDependencies in pnpm 11
183
+ - esbuild
184
+ - sharp
153
185
  ```
154
186
 
155
187
  **Root `.npmrc`**:
@@ -157,6 +189,8 @@ packages:
157
189
  ```ini
158
190
  save-workspace-protocol=true
159
191
  prefer-workspace-packages=true
192
+ # Belt-and-suspenders with pnpm-workspace.yaml above:
193
+ minimum-release-age=20160
160
194
  ```
161
195
 
162
196
  **References**:
@@ -614,7 +648,7 @@ It checks:
614
648
  "prepack": "pnpm build"
615
649
  },
616
650
  "devDependencies": {
617
- "publint": "^0.3.0"
651
+ "publint": "^0.3.21"
618
652
  }
619
653
  }
620
654
  ```
@@ -755,7 +789,7 @@ jobs:
755
789
  with:
756
790
  fetch-depth: 0
757
791
 
758
- - uses: pnpm/action-setup@v4
792
+ - uses: pnpm/action-setup@v6
759
793
 
760
794
  - uses: actions/setup-node@v6
761
795
  with:
@@ -1084,6 +1118,16 @@ Vite’s transformation pipeline.
1084
1118
 
1085
1119
  - Visual regression testing (added in Vitest 4.0)
1086
1120
 
1121
+ - **Vitest 4.1 (Mar 2026)** added Vite 8 support, test tags for organizing tests, and
1122
+ extended chai-style assertions for mocking.
1123
+ Vitest now reuses the installed Vite instead of bundling a separate dependency.
1124
+
1125
+ - **`coverage.all` was removed in v4** — use `coverage.include` and `coverage.exclude`
1126
+ to control which files are reported.
1127
+
1128
+ - **Vitest 5.0.0-beta** is in pre-release (requires Node 22+ and Vite 6.4+). Stay on
1129
+ 4.1.x for production until stable.
1130
+
1087
1131
  **Installation**:
1088
1132
 
1089
1133
  ```bash
@@ -1185,7 +1229,7 @@ jobs:
1185
1229
  steps:
1186
1230
  - uses: actions/checkout@v6
1187
1231
 
1188
- - uses: pnpm/action-setup@v4
1232
+ - uses: pnpm/action-setup@v6
1189
1233
 
1190
1234
  - uses: actions/setup-node@v6
1191
1235
  with:
@@ -1213,7 +1257,7 @@ jobs:
1213
1257
  os: [ubuntu-latest, macos-latest, windows-latest]
1214
1258
  steps:
1215
1259
  - uses: actions/checkout@v6
1216
- - uses: pnpm/action-setup@v4
1260
+ - uses: pnpm/action-setup@v6
1217
1261
  - uses: actions/setup-node@v6
1218
1262
  with:
1219
1263
  node-version: 24
@@ -1227,7 +1271,7 @@ jobs:
1227
1271
  runs-on: ubuntu-latest
1228
1272
  steps:
1229
1273
  - uses: actions/checkout@v6
1230
- - uses: pnpm/action-setup@v4
1274
+ - uses: pnpm/action-setup@v6
1231
1275
  - uses: actions/setup-node@v6
1232
1276
  with:
1233
1277
  node-version: 24
@@ -1248,7 +1292,7 @@ jobs:
1248
1292
  - `actions/checkout@v6` requires Actions Runner v2.329.0+ (stores credentials under
1249
1293
  $RUNNER_TEMP)
1250
1294
 
1251
- - `pnpm/action-setup@v4` includes built-in caching (no `version:` needed if
1295
+ - `pnpm/action-setup@v6` includes built-in caching (no `version:` needed if
1252
1296
  `packageManager` is set in `package.json`)
1253
1297
 
1254
1298
  - `actions/setup-node@v6` with `cache: pnpm` provides additional caching
@@ -1294,7 +1338,7 @@ jobs:
1294
1338
  with:
1295
1339
  fetch-depth: 0
1296
1340
 
1297
- - uses: pnpm/action-setup@v4
1341
+ - uses: pnpm/action-setup@v6
1298
1342
  with:
1299
1343
  version: 10
1300
1344
 
@@ -1752,12 +1796,22 @@ pnpm add -Dw npm-check-updates
1752
1796
 
1753
1797
  | Flag | Description |
1754
1798
  | --- | --- |
1799
+ | `--cooldown <days>` | **Refuse versions younger than N days. Use `--cooldown 14` for the 14-day package-age rule (see [Supply-Chain Mitigation](#supply-chain-mitigation)).** |
1755
1800
  | `--target minor` | Only upgrade to latest minor/patch (safe) |
1756
1801
  | `--target patch` | Only upgrade to latest patch (safest) |
1757
1802
  | `--target latest` | Upgrade to latest version (includes major) |
1758
1803
  | `--format group` | Group output by update type (major/minor/patch) |
1759
1804
  | `--interactive` | Select which packages to upgrade |
1760
1805
  | `-u` | Update package.json (otherwise just reports) |
1806
+ | `--errorLevel 2` | Exit non-zero when upgrades are available (useful in CI gates) |
1807
+
1808
+ **v22 breaking changes** (versus the v19 previously documented):
1809
+
1810
+ - Pure ESM. Named imports only: `import { run } from 'npm-check-updates'`. Default
1811
+ exports no longer work.
1812
+ - Config files: `.ncurc.js` with `module.exports` no longer works in `"type": "module"`
1813
+ projects. Use `.ncurc.cjs`.
1814
+ - Node.js requirement: `^20.19.0 || ^22.12.0 || >=24.0.0`.
1761
1815
 
1762
1816
  **Upgrade Targets Explained**:
1763
1817
 
@@ -1791,15 +1845,15 @@ potentially breaking changes (major), enabling a safer, more frequent upgrade ca
1791
1845
  Add structured upgrade scripts to your root `package.json` that encode your upgrade
1792
1846
  workflow. This makes upgrades consistent and discoverable.
1793
1847
 
1794
- **Root `package.json` scripts**:
1848
+ **Root `package.json` scripts** (with `--cooldown 14` baked in per the 14-day rule):
1795
1849
 
1796
1850
  ```json
1797
1851
  {
1798
1852
  "scripts": {
1799
- "upgrade:check": "ncu --format group",
1800
- "upgrade": "ncu --target minor -u && pnpm install && pnpm test",
1801
- "upgrade:patch": "ncu --target patch -u && pnpm install && pnpm test",
1802
- "upgrade:major": "ncu --target latest --interactive --format group"
1853
+ "upgrade:check": "ncu --cooldown 14 --format group",
1854
+ "upgrade": "ncu --cooldown 14 --target minor -u && pnpm install && pnpm test",
1855
+ "upgrade:patch": "ncu --cooldown 14 --target patch -u && pnpm install && pnpm test",
1856
+ "upgrade:major": "ncu --cooldown 14 --target latest --interactive --format group"
1803
1857
  }
1804
1858
  }
1805
1859
  ```
@@ -1959,7 +2013,7 @@ For running TypeScript CLI commands directly, **tsx** is the recommended choice:
1959
2013
  "markform:bin": "node packages/markform/dist/bin.mjs"
1960
2014
  },
1961
2015
  "devDependencies": {
1962
- "tsx": "^4.21.0"
2016
+ "tsx": "^4.22.3"
1963
2017
  }
1964
2018
  }
1965
2019
  ```
@@ -2480,6 +2534,24 @@ than discovering them when users try to use the library in browser/edge contexts
2480
2534
 
2481
2535
  * * *
2482
2536
 
2537
+ ## Supply-Chain Mitigation
2538
+
2539
+ Supply-chain hardening applies to **every repo, not just new monorepos**, so the full
2540
+ policy and hands-on enforcement now live in a standalone guideline:
2541
+ **`tbd guidelines supply-chain-hardening`**. It covers the cross-ecosystem 14-day
2542
+ cool-off plus the Node/pnpm/Bun specifics — lifecycle-script allowlists, lockfile
2543
+ discipline, `npm-check-updates --cooldown 14`, the CI audit gate, and the
2544
+ `check-package-age` pre-push guard.
2545
+ Deeper background and the named-incident watch list:
2546
+ <https://github.com/jlevy/supply-chain-hardening>.
2547
+
2548
+ **pnpm specifics**: set `minimumReleaseAge: 20160` (14 days) in `pnpm-workspace.yaml`
2549
+ (pnpm 11 defaults to 1 day), declare lifecycle-eligible packages via `allowBuilds`, keep
2550
+ `blockExoticSubdeps` on, and run `pnpm audit` + `pnpm audit signatures` in CI with
2551
+ `pnpm install --frozen-lockfile`.
2552
+
2553
+ * * *
2554
+
2483
2555
  ## Comparative Analysis
2484
2556
 
2485
2557
  ### Build Tools Comparison
@@ -2514,81 +2586,88 @@ than discovering them when users try to use the library in browser/edge contexts
2514
2586
 
2515
2587
  ## Best Practices
2516
2588
 
2517
- 1. **Scope your package names**: Use `@org/package-name` format for easier GitHub
2589
+ 1. **Follow the 14-day package-age rule** for every dependency install and upgrade.
2590
+ See [Supply-Chain Mitigation](#supply-chain-mitigation).
2591
+ Set `minimumReleaseAge: 20160` (14 days in minutes) in pnpm config; use
2592
+ `ncu --cooldown 14`; declare lifecycle-script-eligible packages via `allowBuilds`;
2593
+ run `pnpm audit` and `pnpm audit signatures` in CI; commit `pnpm-lock.yaml` and use
2594
+ `pnpm install --frozen-lockfile` in CI.
2595
+
2596
+ 2. **Scope your package names**: Use `@org/package-name` format for easier GitHub
2518
2597
  Packages integration and namespace clarity.
2519
2598
 
2520
- 2. **Structure for splitting**: Organize internal code (`core/`, `cli/`, `adapters/`) to
2599
+ 3. **Structure for splitting**: Organize internal code (`core/`, `cli/`, `adapters/`) to
2521
2600
  make future package splits painless.
2522
2601
 
2523
- 3. **Use subpath exports from day one**: Define `./cli`, `./adapter` exports even in
2602
+ 4. **Use subpath exports from day one**: Define `./cli`, `./adapter` exports even in
2524
2603
  v0.1 to stabilize the API surface.
2525
2604
 
2526
- 4. **Types first in exports**: Always put `"types"` condition before `"default"` in
2605
+ 5. **Types first in exports**: Always put `"types"` condition before `"default"` in
2527
2606
  export conditions.
2528
2607
 
2529
- 5. **Optional peer deps for integrations**: Don’t force SDK dependencies on users who
2608
+ 6. **Optional peer deps for integrations**: Don’t force SDK dependencies on users who
2530
2609
  don’t need them.
2531
2610
 
2532
- 6. **Validate before publish**: Run publint in CI and before every release.
2611
+ 7. **Validate before publish**: Run publint in CI and before every release.
2533
2612
 
2534
- 7. **Changeset per PR**: Require changesets for user-facing changes to maintain accurate
2613
+ 8. **Changeset per PR**: Require changesets for user-facing changes to maintain accurate
2535
2614
  changelogs.
2536
2615
 
2537
- 8. **Lock your tooling versions**: Pin exact versions in `packageManager` field and CI
2616
+ 9. **Lock your tooling versions**: Pin exact versions in `packageManager` field and CI
2538
2617
  configurations.
2539
2618
 
2540
- 9. **Test both ESM and CJS**: Ensure both module formats work correctly, especially for
2541
- CLI tools.
2619
+ 10. **Test both ESM and CJS**: Ensure both module formats work correctly, especially for
2620
+ CLI tools.
2542
2621
 
2543
- 10. **Keep the monorepo root private**: The root `package.json` should have
2622
+ 11. **Keep the monorepo root private**: The root `package.json` should have
2544
2623
  `"private": true` and only contain workspace tooling.
2545
2624
 
2546
- 11. **Use type-aware ESLint**: Configure `recommendedTypeChecked` for comprehensive bug
2625
+ 12. **Use type-aware ESLint**: Configure `recommendedTypeChecked` for comprehensive bug
2547
2626
  detection, especially promise safety rules.
2548
2627
  See Appendix C for detailed configuration.
2549
2628
 
2550
- 12. **Enforce code style consistency**: Use `curly: 'all'` and `brace-style: '1tbs'` to
2629
+ 13. **Enforce code style consistency**: Use `curly: 'all'` and `brace-style: '1tbs'` to
2551
2630
  prevent subtle bugs and improve readability.
2552
2631
 
2553
- 13. **Use fast pre-commit hooks**: Run formatting and linting with auto-fix on staged
2632
+ 14. **Use fast pre-commit hooks**: Run formatting and linting with auto-fix on staged
2554
2633
  files only. Target 2-5 seconds total.
2555
2634
  Use lefthook for better monorepo support.
2556
2635
 
2557
- 14. **Cache test results by commit hash**: In pre-push hooks, skip test runs if the
2636
+ 15. **Cache test results by commit hash**: In pre-push hooks, skip test runs if the
2558
2637
  current commit has already passed tests.
2559
2638
  This makes repeated pushes instant.
2560
2639
 
2561
- 15. **Use structured upgrade scripts**: Add `upgrade:check`, `upgrade`, and
2640
+ 16. **Use structured upgrade scripts**: Add `upgrade:check`, `upgrade`, and
2562
2641
  `upgrade:major` scripts to make dependency updates consistent and safe.
2563
2642
  Separate minor/patch from major upgrades.
2564
2643
 
2565
- 16. **Separate format and lint script variants**: Provide `format`/`format:check` and
2644
+ 17. **Separate format and lint script variants**: Provide `format`/`format:check` and
2566
2645
  `lint`/`lint:check` scripts.
2567
2646
  Use `--fix` variants for local development and `--check`/zero-warnings variants for
2568
2647
  CI.
2569
2648
 
2570
- 17. **Run format before lint in builds**: The `build` script should run `format` then
2649
+ 18. **Run format before lint in builds**: The `build` script should run `format` then
2571
2650
  `lint:check` to ensure formatting is applied before linting.
2572
2651
 
2573
- 18. **Use dynamic git-based versioning**: Inject version at build time using
2652
+ 19. **Use dynamic git-based versioning**: Inject version at build time using
2574
2653
  `X.Y.Z-dev.N.hash` format.
2575
2654
  This provides traceability during development without manual version bumps.
2576
2655
  See “Dynamic Git-Based Versioning” section for implementation.
2577
2656
 
2578
- 19. **Run CLI from source during development**: Use the dual-script pattern with tsx to
2657
+ 20. **Run CLI from source during development**: Use the dual-script pattern with tsx to
2579
2658
  run CLI commands directly from TypeScript source.
2580
2659
  Provide a separate `:bin` script for verifying the built output.
2581
2660
  This eliminates “did I forget to build?”
2582
2661
  confusion.
2583
2662
 
2584
- 20. **Use CJS bootstrap for CLI startup**: Enable Node.js compile cache via a CJS
2663
+ 21. **Use CJS bootstrap for CLI startup**: Enable Node.js compile cache via a CJS
2585
2664
  bootstrap file that runs before ESM module loading.
2586
2665
  This significantly improves repeated CLI invocation times on Node.js 22.8+.
2587
2666
 
2588
- 21. **Bundle CLI dependencies**: Use tsdown’s `noExternal` to bundle runtime deps into
2667
+ 22. **Bundle CLI dependencies**: Use tsdown’s `noExternal` to bundle runtime deps into
2589
2668
  the CLI binary for faster startup (no `node_modules` resolution at runtime).
2590
2669
 
2591
- 22. **Add guard tests for node-free core**: If your library entry point should be
2670
+ 23. **Add guard tests for node-free core**: If your library entry point should be
2592
2671
  node-free, add automated tests that verify no `node:` imports leak into the public
2593
2672
  API surface.
2594
2673
 
@@ -2600,21 +2679,53 @@ than discovering them when users try to use the library in browser/edge contexts
2600
2679
  Rolldown Vite’s Library Mode.
2601
2680
  Monitor for announcements that may affect best practices.
2602
2681
 
2603
- 2. **TypeScript 6.0/7.0 Transition**: TypeScript 7.0 (Go rewrite) is now available in
2604
- Visual Studio 2026 Insiders preview with ~8x faster project load times.
2605
- Install via `npm install -D @typescript/native-preview`. TypeScript 6.0 will serve as
2606
- a “bridge” release deprecating features for 7.0 alignment.
2607
- Monitor for migration guidance as 7.0 approaches stable.
2608
-
2609
- 3. **Native TypeScript Execution**: TypeScript 5.8+ supports `--erasableSyntaxOnly`
2610
- flag, enabling direct execution in Node.js 23.6+ without transpilation.
2611
- This may reduce the need for tsx in some workflows.
2612
- Monitor for broader adoption and tooling support.
2613
-
2614
- 4. **ESLint v10 multi-config**: ESLint v10.0.0 is in RC phase (Jan 2026) with improved
2615
- multi-config support, Node.js ^20.19.0 || ^22.13.0 || >=24 required, and complete
2616
- removal of eslintrc config system.
2617
- Monitor for final release.
2682
+ 2. ~~**TypeScript 6.0**~~: **SHIPPED** 2026-03-23 (currently 6.0.3). The last
2683
+ JavaScript-based release.
2684
+ `strict: true` is now the default, ESM is the default module system, and ~9 compiler
2685
+ settings flipped defaults.
2686
+ Adopt for the codebase; review `tsconfig.base.json` for now-redundant flag
2687
+ declarations.
2688
+
2689
+ 3. **TypeScript 7.0 (Project Corsa, Go rewrite)**: Beta shipped 2026-04-21 as
2690
+ `@typescript/native-preview` (binary `tsgo`). Claims ~10× type-check speed and ~3×
2691
+ less memory; passes 95%+ of the test suite.
2692
+ Available in Visual Studio 2026 18.6 Insiders by default.
2693
+ **Do not adopt for production builds yet** wait for stable (expected mid-to-late
2694
+ 2026). Monitor for tsdown/Vitest compatibility announcements.
2695
+
2696
+ 4. **Native TypeScript Execution**: TypeScript 5.8+ supports `--erasableSyntaxOnly`,
2697
+ enabling direct execution in Node.js 23.6+ without transpilation.
2698
+ With TypeScript 6.0 stable and Node 24 LTS, this is increasingly viable for scripts.
2699
+ Monitor for broader tooling adoption (linters, coverage tools).
2700
+
2701
+ 5. ~~**ESLint v10**~~: **SHIPPED** 2026-02-06. `.eslintrc.*` configuration is completely
2702
+ removed — flat config (`eslint.config.js`) is the only supported format.
2703
+ Download size reduced 11 MB → 9.4 MB. Minimum Node.js v20.19.0. ESLint 9.x EOL is
2704
+ 2026-08-06 — migrate now.
2705
+
2706
+ 6. ~~**pnpm 11**~~: **SHIPPED** 2026-04-28 (currently 11.2.2). Breaking changes: pure
2707
+ ESM (requires Node 22+), SQLite-based store, `minimumReleaseAge` default (1 day),
2708
+ `blockExoticSubdeps` default `true`, `allowBuilds` replacing `onlyBuiltDependencies`.
2709
+ Experimental Rust-based `@pnpm/pacquet` engine in 11.2+. Migrate via the pnpm 11
2710
+ migration guide; bump `pnpm/action-setup` to v6 in CI.
2711
+
2712
+ 7. ~~**Zod 4**~~: **SHIPPED** (currently 4.4.3). 14× faster string parsing, 7× faster
2713
+ array parsing, 6.5× faster object parsing vs Zod 3; core bundle 2.3× smaller; new
2714
+ `@zod/mini` (~1.9 KB gzipped) for tree-shakable frontend validation.
2715
+ Migration from Zod 3 required — see
2716
+ [zod.dev/v4/changelog](https://zod.dev/v4/changelog).
2717
+
2718
+ 8. **Commander 15 (ESM-only)**: Commander 15 ships May 2026, requires Node v22.12.0+,
2719
+ drops CJS. Commander 14 moves to maintenance (security only) until May 2027. Upgrade
2720
+ path for CLI tools using Commander.
2721
+
2722
+ 9. **`dotenv` vs Node `--env-file`**: Node 20.6+ has built-in `--env-file` support, and
2723
+ with Node 24 LTS it is production-ready.
2724
+ Most new projects should default to `--env-file` and reserve `dotenv` for advanced
2725
+ needs (variable expansion, multiline values, custom precedence logic).
2726
+
2727
+ 10. **Vitest 5**: 5.0.0-beta.3 in pre-release; requires Node 22+ and Vite 6.4+. Stable
2728
+ not yet shipped. Stay on 4.1.x for now.
2618
2729
 
2619
2730
  * * *
2620
2731
 
@@ -2791,9 +2902,9 @@ ready for public release.
2791
2902
  },
2792
2903
  "devDependencies": {
2793
2904
  "@types/node": "^24.0.0",
2794
- "publint": "^0.3.0",
2795
- "tsdown": "^0.18.0",
2796
- "typescript": "^5.9.0"
2905
+ "publint": "^0.3.20",
2906
+ "tsdown": "^0.22.0",
2907
+ "typescript": "^6.0.3"
2797
2908
  }
2798
2909
  }
2799
2910
  ```
@@ -2804,9 +2915,9 @@ ready for public release.
2804
2915
  {
2805
2916
  "name": "project-workspace",
2806
2917
  "private": true,
2807
- "packageManager": "pnpm@10.28.2",
2918
+ "packageManager": "pnpm@11.0.0",
2808
2919
  "engines": {
2809
- "node": ">=24"
2920
+ "node": ">=22"
2810
2921
  },
2811
2922
  "scripts": {
2812
2923
  "build": "pnpm -r build",
@@ -2821,25 +2932,32 @@ ready for public release.
2821
2932
  "changeset": "changeset",
2822
2933
  "version-packages": "changeset version",
2823
2934
  "release": "pnpm build && pnpm publint && changeset publish",
2824
- "upgrade:check": "ncu --format group",
2825
- "upgrade": "ncu --target minor -u && pnpm install && pnpm test",
2826
- "upgrade:major": "ncu --target latest --interactive --format group"
2935
+ "upgrade:check": "ncu --cooldown 14 --format group",
2936
+ "upgrade": "ncu --cooldown 14 --target minor -u && pnpm install && pnpm test",
2937
+ "upgrade:major": "ncu --cooldown 14 --target latest --interactive --format group",
2938
+ "audit": "pnpm audit --audit-level=moderate && pnpm audit signatures"
2827
2939
  },
2828
2940
  "devDependencies": {
2829
- "@changesets/cli": "^2.29.0",
2941
+ "@changesets/cli": "^2.31.0",
2830
2942
  "@changesets/changelog-github": "^0.5.0",
2831
- "@eslint/js": "^9.0.0",
2832
- "eslint": "^9.0.0",
2943
+ "@eslint/js": "^10.0.0",
2944
+ "eslint": "^10.0.0",
2833
2945
  "eslint-config-prettier": "^10.0.0",
2834
- "lefthook": "^2.0.15",
2835
- "npm-check-updates": "^19.0.0",
2836
- "prettier": "^3.0.0",
2837
- "typescript": "^5.9.0",
2946
+ "lefthook": "^2.1.5",
2947
+ "npm-check-updates": "^22.0.0",
2948
+ "prettier": "^3.8.3",
2949
+ "typescript": "^6.0.3",
2838
2950
  "typescript-eslint": "^8.0.0"
2839
2951
  }
2840
2952
  }
2841
2953
  ```
2842
2954
 
2955
+ All pinned versions above are ≥14 days old as of 2026-05-21 per the
2956
+ [Supply-Chain Mitigation](#supply-chain-mitigation) policy.
2957
+ Newer releases exist (`pnpm` 11.2.2, `lefthook` 2.1.8, `npm-check-updates` 22.2.0,
2958
+ `publint` 0.3.21, `vitest` 4.1.7) but were too fresh at this document update.
2959
+ Bump on the next refresh once the 14-day window has elapsed.
2960
+
2843
2961
  ### Appendix C: ESLint Flat Config Example
2844
2962
 
2845
2963
  #### Minimal Configuration