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.
- package/dist/bin.mjs +142 -106
- package/dist/bin.mjs.map +1 -1
- package/dist/cli.mjs +43 -17
- package/dist/cli.mjs.map +1 -1
- package/dist/docs/SKILL.md +0 -4
- package/dist/docs/guidelines/bun-monorepo-patterns.md +148 -75
- package/dist/docs/guidelines/cli-agent-skill-patterns.md +706 -1240
- package/dist/docs/guidelines/pnpm-monorepo-patterns.md +204 -86
- package/dist/docs/guidelines/supply-chain-hardening.md +237 -0
- package/dist/docs/guidelines/typescript-cli-tool-rules.md +39 -8
- package/dist/docs/guidelines/typescript-code-coverage.md +27 -3
- package/dist/docs/guidelines/typescript-rules.md +18 -0
- package/dist/docs/guidelines/typescript-yaml-handling-rules.md +12 -0
- package/dist/docs/shortcuts/standard/new-validation-plan.md +1 -1
- package/dist/docs/tbd-design.md +16 -1
- package/dist/docs/tbd-docs.md +11 -2
- package/dist/index.mjs +1 -1
- package/dist/{src-BIE27KDA.mjs → src-CJyVkC3V.mjs} +2 -2
- package/dist/{src-BIE27KDA.mjs.map → src-CJyVkC3V.mjs.map} +1 -1
- package/dist/tbd +142 -106
- package/package.json +2 -2
|
@@ -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-
|
|
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** |
|
|
28
|
-
| **TypeScript** | ^
|
|
29
|
-
| **tsdown** | ^0.
|
|
30
|
-
| **publint** | ^0.3.0 | [npmjs.com/package/publint](https://www.npmjs.com/package/publint) |
|
|
31
|
-
| **@changesets/cli** | ^2.
|
|
32
|
-
| **@types/node** | ^24.0.0 |
|
|
33
|
-
| **actions/checkout** | v6 | [github.com/actions/checkout/releases](https://github.com/actions/checkout/releases) —
|
|
34
|
-
| **actions/setup-node** | v6 | [github.com/actions/setup-node/releases](https://github.com/actions/setup-node/releases) |
|
|
35
|
-
| **pnpm/action-setup** |
|
|
36
|
-
| **changesets/action** | v1 | [github.com/changesets/action](https://github.com/changesets/action) |
|
|
37
|
-
| **lefthook** | ^2.
|
|
38
|
-
| **npm-check-updates** | ^
|
|
39
|
-
| **tsx** | ^4.21.0 | [github.com/privatenumber/tsx/releases](https://github.com/privatenumber/tsx/releases) |
|
|
40
|
-
| **prettier** | ^3.
|
|
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** | ^
|
|
43
|
-
| **Vitest** | ^4.
|
|
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
|
-
**
|
|
145
|
-
|
|
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.
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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@
|
|
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.
|
|
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. **
|
|
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
|
-
|
|
2599
|
+
3. **Structure for splitting**: Organize internal code (`core/`, `cli/`, `adapters/`) to
|
|
2521
2600
|
make future package splits painless.
|
|
2522
2601
|
|
|
2523
|
-
|
|
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
|
-
|
|
2605
|
+
5. **Types first in exports**: Always put `"types"` condition before `"default"` in
|
|
2527
2606
|
export conditions.
|
|
2528
2607
|
|
|
2529
|
-
|
|
2608
|
+
6. **Optional peer deps for integrations**: Don’t force SDK dependencies on users who
|
|
2530
2609
|
don’t need them.
|
|
2531
2610
|
|
|
2532
|
-
|
|
2611
|
+
7. **Validate before publish**: Run publint in CI and before every release.
|
|
2533
2612
|
|
|
2534
|
-
|
|
2613
|
+
8. **Changeset per PR**: Require changesets for user-facing changes to maintain accurate
|
|
2535
2614
|
changelogs.
|
|
2536
2615
|
|
|
2537
|
-
|
|
2616
|
+
9. **Lock your tooling versions**: Pin exact versions in `packageManager` field and CI
|
|
2538
2617
|
configurations.
|
|
2539
2618
|
|
|
2540
|
-
|
|
2541
|
-
|
|
2619
|
+
10. **Test both ESM and CJS**: Ensure both module formats work correctly, especially for
|
|
2620
|
+
CLI tools.
|
|
2542
2621
|
|
|
2543
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
2604
|
-
|
|
2605
|
-
|
|
2606
|
-
|
|
2607
|
-
|
|
2608
|
-
|
|
2609
|
-
|
|
2610
|
-
|
|
2611
|
-
|
|
2612
|
-
|
|
2613
|
-
|
|
2614
|
-
|
|
2615
|
-
|
|
2616
|
-
|
|
2617
|
-
|
|
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.
|
|
2795
|
-
"tsdown": "^0.
|
|
2796
|
-
"typescript": "^
|
|
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@
|
|
2918
|
+
"packageManager": "pnpm@11.0.0",
|
|
2808
2919
|
"engines": {
|
|
2809
|
-
"node": ">=
|
|
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.
|
|
2941
|
+
"@changesets/cli": "^2.31.0",
|
|
2830
2942
|
"@changesets/changelog-github": "^0.5.0",
|
|
2831
|
-
"@eslint/js": "^
|
|
2832
|
-
"eslint": "^
|
|
2943
|
+
"@eslint/js": "^10.0.0",
|
|
2944
|
+
"eslint": "^10.0.0",
|
|
2833
2945
|
"eslint-config-prettier": "^10.0.0",
|
|
2834
|
-
"lefthook": "^2.
|
|
2835
|
-
"npm-check-updates": "^
|
|
2836
|
-
"prettier": "^3.
|
|
2837
|
-
"typescript": "^
|
|
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
|