get-tbd 0.2.0 → 0.2.2
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 +551 -168
- package/dist/bin.mjs.map +1 -1
- package/dist/cli.mjs +492 -159
- package/dist/cli.mjs.map +1 -1
- package/dist/docs/SKILL.md +2 -2
- package/dist/docs/guidelines/bun-monorepo-patterns.md +65 -66
- package/dist/docs/guidelines/cli-agent-skill-patterns.md +396 -158
- package/dist/docs/guidelines/common-doc-guidelines.md +2 -2
- package/dist/docs/guidelines/convex-limits-best-practices.md +39 -39
- package/dist/docs/guidelines/convex-rules.md +13 -13
- package/dist/docs/guidelines/electron-app-development-patterns.md +18 -18
- package/dist/docs/guidelines/general-comment-rules.md +1 -1
- package/dist/docs/guidelines/general-tdd-guidelines.md +4 -4
- package/dist/docs/guidelines/golden-testing-guidelines.md +9 -9
- package/dist/docs/guidelines/pnpm-monorepo-patterns.md +49 -49
- package/dist/docs/guidelines/python-cli-patterns.md +1 -1
- package/dist/docs/guidelines/python-modern-guidelines.md +4 -4
- package/dist/docs/guidelines/release-notes-guidelines.md +18 -2
- package/dist/docs/guidelines/supply-chain-hardening.md +84 -29
- package/dist/docs/guidelines/tbd-sync-troubleshooting.md +3 -3
- package/dist/docs/guidelines/typescript-cli-tool-rules.md +17 -17
- package/dist/docs/guidelines/typescript-code-coverage.md +5 -5
- package/dist/docs/guidelines/typescript-rules.md +3 -3
- package/dist/docs/guidelines/typescript-yaml-handling-rules.md +3 -3
- package/dist/docs/shortcuts/system/skill-baseline.md +2 -2
- package/dist/docs/tbd-design.md +40 -40
- package/dist/docs/tbd-docs.md +1 -1
- package/dist/docs/tbd-prime.md +3 -3
- package/dist/{id-mapping-CtfTfGIh.mjs → id-mapping-687_UEsy.mjs} +66 -16
- package/dist/id-mapping-687_UEsy.mjs.map +1 -0
- package/dist/{id-mapping-CFoPVinz.mjs → id-mapping-mtoSP9Qt.mjs} +1 -1
- package/dist/index.mjs +1 -1
- package/dist/{src-rIE4xSVs.mjs → src-BpvcrLnq.mjs} +2 -2
- package/dist/{src-rIE4xSVs.mjs.map → src-BpvcrLnq.mjs.map} +1 -1
- package/dist/tbd +551 -168
- package/package.json +1 -1
- package/dist/id-mapping-CtfTfGIh.mjs.map +0 -1
|
@@ -24,31 +24,31 @@ author: Joshua Levy (github.com/jlevy) with LLM assistance
|
|
|
24
24
|
|
|
25
25
|
| Tool / Package | Version | Check For Updates |
|
|
26
26
|
| --- | --- | --- |
|
|
27
|
-
| **Node.js** | 24 (LTS “Krypton”) | [nodejs.org/releases](https://nodejs.org/en/about/previous-releases)
|
|
28
|
-
| **pnpm** | ^11.0.0 (11.2.x too recent) | [github.com/pnpm/pnpm/releases](https://github.com/pnpm/pnpm/releases)
|
|
29
|
-
| **TypeScript** | ^6.0.3 | [github.com/microsoft/TypeScript/releases](https://github.com/microsoft/TypeScript/releases)
|
|
30
|
-
| **tsdown** | ^0.22.0 | [github.com/rolldown/tsdown/releases](https://github.com/rolldown/tsdown/releases)
|
|
31
|
-
| **publint** | ^0.3.20 (0.3.21 too recent) | [npmjs.com/package/publint](https://www.npmjs.com/package/publint)
|
|
32
|
-
| **@changesets/cli** | ^2.31.0 | [github.com/changesets/changesets/releases](https://github.com/changesets/changesets/releases)
|
|
33
|
-
| **@types/node** | ^24.0.0 | [@types/node npm](https://www.npmjs.com/package/@types/node)
|
|
34
|
-
| **actions/checkout** | v6 | [github.com/actions/checkout/releases](https://github.com/actions/checkout/releases)
|
|
35
|
-
| **actions/setup-node** | v6 | [github.com/actions/setup-node/releases](https://github.com/actions/setup-node/releases)
|
|
36
|
-
| **pnpm/action-setup** | v6 | [github.com/pnpm/action-setup/releases](https://github.com/pnpm/action-setup/releases)
|
|
37
|
-
| **changesets/action** | v1 | [github.com/changesets/action](https://github.com/changesets/action)
|
|
38
|
-
| **lefthook** | ^2.1.5 (2.1.7/2.1.8 too recent) | [github.com/evilmartians/lefthook/releases](https://github.com/evilmartians/lefthook/releases)
|
|
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)
|
|
40
|
-
| **tsx** | ^4.21.0 (4.22.x too recent) | [github.com/privatenumber/tsx/releases](https://github.com/privatenumber/tsx/releases)
|
|
41
|
-
| **prettier** | ^3.8.3 | [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. |
|
|
42
42
|
| **eslint-config-prettier** | ^10.0.0 | [github.com/prettier/eslint-config-prettier/releases](https://github.com/prettier/eslint-config-prettier/releases) |
|
|
43
|
-
| **ESLint** | ^10.0.0 | [github.com/eslint/eslint/releases](https://github.com/eslint/eslint/releases)
|
|
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)
|
|
45
|
-
| **Zod** | ^4.4.3 | [github.com/colinhacks/zod/releases](https://github.com/colinhacks/zod/releases)
|
|
46
|
-
| **commander** | ^15.0.0 | [github.com/tj/commander.js/releases](https://github.com/tj/commander.js/releases)
|
|
47
|
-
| **picocolors** | ^1.1.1 | [npmjs.com/package/picocolors](https://www.npmjs.com/package/picocolors)
|
|
48
|
-
| **dotenv** | ^17.4.2 | [npmjs.com/package/dotenv](https://www.npmjs.com/package/dotenv)
|
|
49
|
-
| **atomically** | ^2.1.1 | [npmjs.com/package/atomically](https://www.npmjs.com/package/atomically)
|
|
50
|
-
| **yaml** | ^2.8.4 | [npmjs.com/package/yaml](https://www.npmjs.com/package/yaml)
|
|
51
|
-
| **@vitest/coverage-v8** | ^4.1.7 | [npmjs.com/package/@vitest/coverage-v8](https://www.npmjs.com/package/@vitest/coverage-v8)
|
|
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. |
|
|
52
52
|
|
|
53
53
|
### Reminders When Updating
|
|
54
54
|
|
|
@@ -56,7 +56,7 @@ author: Joshua Levy (github.com/jlevy) with LLM assistance
|
|
|
56
56
|
|
|
57
57
|
2. **Update the table** with new versions and any relevant notes
|
|
58
58
|
|
|
59
|
-
3. **Search and update code examples
|
|
59
|
+
3. **Search and update code examples**—version numbers appear in:
|
|
60
60
|
|
|
61
61
|
- GitHub Actions workflows (CI and Release sections)
|
|
62
62
|
|
|
@@ -68,7 +68,7 @@ author: Joshua Levy (github.com/jlevy) with LLM assistance
|
|
|
68
68
|
|
|
69
69
|
- Appendices A, B, and D (complete examples)
|
|
70
70
|
|
|
71
|
-
4. **Verify compatibility
|
|
71
|
+
4. **Verify compatibility**—check that tools still work together (e.g., new
|
|
72
72
|
pnpm/action-setup versions may change caching behavior)
|
|
73
73
|
|
|
74
74
|
5. **Update the “Last Updated” date** at the top of the document
|
|
@@ -76,9 +76,9 @@ author: Joshua Levy (github.com/jlevy) with LLM assistance
|
|
|
76
76
|
6. **Review “Open Research Questions”** section for any resolved items
|
|
77
77
|
|
|
78
78
|
7. **Honor the 14-day package-age rule** when bumping versions in code examples.
|
|
79
|
-
See [Supply-Chain Mitigation](#supply-chain-mitigation)
|
|
80
|
-
|
|
81
|
-
|
|
79
|
+
See [Supply-Chain Mitigation](#supply-chain-mitigation)—versions cited here should be
|
|
80
|
+
≥14 days old at the time the table is updated, except where a clearly-noted security
|
|
81
|
+
exception applies.
|
|
82
82
|
|
|
83
83
|
* * *
|
|
84
84
|
|
|
@@ -137,7 +137,7 @@ recommendations from the TypeScript and JavaScript ecosystem maintainers.
|
|
|
137
137
|
|
|
138
138
|
## Research Findings
|
|
139
139
|
|
|
140
|
-
### 1. Package Manager
|
|
140
|
+
### 1. Package Manager and Workspace Structure
|
|
141
141
|
|
|
142
142
|
#### pnpm Workspaces
|
|
143
143
|
|
|
@@ -157,7 +157,7 @@ recommendations from the TypeScript and JavaScript ecosystem maintainers.
|
|
|
157
157
|
|
|
158
158
|
- **pnpm 11 (shipped 2026-04-28)** adds significant supply-chain hardening defaults:
|
|
159
159
|
`minimumReleaseAge: 1440` (1 day) and `blockExoticSubdeps: true`. We recommend
|
|
160
|
-
overriding `minimumReleaseAge` to 14 days
|
|
160
|
+
overriding `minimumReleaseAge` to 14 days—see
|
|
161
161
|
[Supply-Chain Mitigation](#supply-chain-mitigation).
|
|
162
162
|
|
|
163
163
|
- **pnpm 11 is pure ESM and requires Node.js 22+.** Lifecycle script gating has moved
|
|
@@ -469,7 +469,7 @@ Only provide dual ESM/CJS if you have confirmed CJS consumer requirements.
|
|
|
469
469
|
|
|
470
470
|
* * *
|
|
471
471
|
|
|
472
|
-
### 4. Package Exports
|
|
472
|
+
### 4. Package Exports and Dual Module Support
|
|
473
473
|
|
|
474
474
|
#### Subpath Exports
|
|
475
475
|
|
|
@@ -668,7 +668,7 @@ package. Essential for any published package.
|
|
|
668
668
|
|
|
669
669
|
* * *
|
|
670
670
|
|
|
671
|
-
### 7. Versioning
|
|
671
|
+
### 7. Versioning and Release Automation
|
|
672
672
|
|
|
673
673
|
#### Changesets
|
|
674
674
|
|
|
@@ -733,7 +733,7 @@ Changesets provides:
|
|
|
733
733
|
|
|
734
734
|
**Assessment**: Changesets is the de facto standard for *multi-package* monorepo
|
|
735
735
|
versioning and integrates seamlessly with pnpm and GitHub Actions.
|
|
736
|
-
For a repo that publishes a single package, its per-PR ceremony rarely pays off
|
|
736
|
+
For a repo that publishes a single package, its per-PR ceremony rarely pays off—prefer
|
|
737
737
|
the tag-triggered approach below (see the LLM-era note).
|
|
738
738
|
|
|
739
739
|
**References**:
|
|
@@ -1139,8 +1139,8 @@ Vite’s transformation pipeline.
|
|
|
1139
1139
|
extended chai-style assertions for mocking.
|
|
1140
1140
|
Vitest now reuses the installed Vite instead of bundling a separate dependency.
|
|
1141
1141
|
|
|
1142
|
-
- **`coverage.all` was removed in v4
|
|
1143
|
-
|
|
1142
|
+
- **`coverage.all` was removed in v4**—use `coverage.include` and `coverage.exclude` to
|
|
1143
|
+
control which files are reported.
|
|
1144
1144
|
|
|
1145
1145
|
- **Vitest 5.0.0-beta** is in pre-release (requires Node 22+ and Vite 6.4+). Stay on
|
|
1146
1146
|
4.1.x for production until stable.
|
|
@@ -1572,7 +1572,7 @@ CI) provides the best developer experience while ensuring CI catches issues.
|
|
|
1572
1572
|
|
|
1573
1573
|
* * *
|
|
1574
1574
|
|
|
1575
|
-
### 11. Git Hooks
|
|
1575
|
+
### 11. Git Hooks and Local Validation
|
|
1576
1576
|
|
|
1577
1577
|
#### Lefthook
|
|
1578
1578
|
|
|
@@ -1886,13 +1886,13 @@ workflow. This makes upgrades consistent and discoverable.
|
|
|
1886
1886
|
|
|
1887
1887
|
**Workflow**:
|
|
1888
1888
|
|
|
1889
|
-
1. **Check for updates**: `pnpm upgrade:check
|
|
1889
|
+
1. **Check for updates**: `pnpm upgrade:check`—see what’s available without changing
|
|
1890
1890
|
anything
|
|
1891
1891
|
|
|
1892
|
-
2. **Safe upgrade**: `pnpm upgrade
|
|
1893
|
-
|
|
1892
|
+
2. **Safe upgrade**: `pnpm upgrade`—upgrade minor/patch versions and run tests to verify
|
|
1893
|
+
nothing breaks
|
|
1894
1894
|
|
|
1895
|
-
3. **Major upgrades**: `pnpm upgrade:major
|
|
1895
|
+
3. **Major upgrades**: `pnpm upgrade:major`—interactively review major version bumps,
|
|
1896
1896
|
select which to apply, then test and review changelogs
|
|
1897
1897
|
|
|
1898
1898
|
**Key insight**: Running tests after `upgrade` catches regressions immediately.
|
|
@@ -2546,8 +2546,8 @@ than discovering them when users try to use the library in browser/edge contexts
|
|
|
2546
2546
|
|
|
2547
2547
|
**References**:
|
|
2548
2548
|
|
|
2549
|
-
- [CLI Tool Development Rules](../../agent-rules/typescript-cli-tool-rules.md)
|
|
2550
|
-
|
|
2549
|
+
- [CLI Tool Development Rules](../../agent-rules/typescript-cli-tool-rules.md)—CLI-specific
|
|
2550
|
+
patterns using Commander.js, picocolors, and @clack/prompts
|
|
2551
2551
|
|
|
2552
2552
|
* * *
|
|
2553
2553
|
|
|
@@ -2556,7 +2556,7 @@ than discovering them when users try to use the library in browser/edge contexts
|
|
|
2556
2556
|
Supply-chain hardening applies to **every repo, not just new monorepos**, so the full
|
|
2557
2557
|
policy and hands-on enforcement now live in a standalone guideline:
|
|
2558
2558
|
**`tbd guidelines supply-chain-hardening`**. It covers the cross-ecosystem 14-day
|
|
2559
|
-
cool-off plus the Node/pnpm/Bun specifics
|
|
2559
|
+
cool-off plus the Node/pnpm/Bun specifics—lifecycle-script allowlists, lockfile
|
|
2560
2560
|
discipline, `npm-check-updates --cooldown 14`, the CI audit gate, and the
|
|
2561
2561
|
`check-package-age` pre-push guard.
|
|
2562
2562
|
Deeper background and the named-incident watch list:
|
|
@@ -2707,7 +2707,7 @@ Deeper background and the named-incident watch list:
|
|
|
2707
2707
|
`@typescript/native-preview` (binary `tsgo`). Claims ~10× type-check speed and ~3×
|
|
2708
2708
|
less memory; passes 95%+ of the test suite.
|
|
2709
2709
|
Available in Visual Studio 2026 18.6 Insiders by default.
|
|
2710
|
-
**Do not adopt for production builds yet
|
|
2710
|
+
**Do not adopt for production builds yet**—wait for stable (expected mid-to-late
|
|
2711
2711
|
2026). Monitor for tsdown/Vitest compatibility announcements.
|
|
2712
2712
|
|
|
2713
2713
|
4. **Native TypeScript Execution**: TypeScript 5.8+ supports `--erasableSyntaxOnly`,
|
|
@@ -2716,9 +2716,9 @@ Deeper background and the named-incident watch list:
|
|
|
2716
2716
|
Monitor for broader tooling adoption (linters, coverage tools).
|
|
2717
2717
|
|
|
2718
2718
|
5. ~~**ESLint v10**~~: **SHIPPED** 2026-02-06. `.eslintrc.*` configuration is completely
|
|
2719
|
-
removed
|
|
2719
|
+
removed—flat config (`eslint.config.js`) is the only supported format.
|
|
2720
2720
|
Download size reduced 11 MB → 9.4 MB. Minimum Node.js v20.19.0. ESLint 9.x EOL is
|
|
2721
|
-
2026-08-06
|
|
2721
|
+
2026-08-06—migrate now.
|
|
2722
2722
|
|
|
2723
2723
|
6. ~~**pnpm 11**~~: **SHIPPED** 2026-04-28 (currently 11.2.2). Breaking changes: pure
|
|
2724
2724
|
ESM (requires Node 22+), SQLite-based store, `minimumReleaseAge` default (1 day),
|
|
@@ -2729,7 +2729,7 @@ Deeper background and the named-incident watch list:
|
|
|
2729
2729
|
7. ~~**Zod 4**~~: **SHIPPED** (currently 4.4.3). 14× faster string parsing, 7× faster
|
|
2730
2730
|
array parsing, 6.5× faster object parsing vs Zod 3; core bundle 2.3× smaller; new
|
|
2731
2731
|
`@zod/mini` (~1.9 KB gzipped) for tree-shakable frontend validation.
|
|
2732
|
-
Migration from Zod 3 required
|
|
2732
|
+
Migration from Zod 3 required—see
|
|
2733
2733
|
[zod.dev/v4/changelog](https://zod.dev/v4/changelog).
|
|
2734
2734
|
|
|
2735
2735
|
8. **Commander 15 (ESM-only)**: Commander 15 ships May 2026, requires Node v22.12.0+,
|
|
@@ -2831,7 +2831,7 @@ ready for public release.
|
|
|
2831
2831
|
|
|
2832
2832
|
- [Node.js Releases](https://nodejs.org/en/about/previous-releases)
|
|
2833
2833
|
|
|
2834
|
-
### Guides
|
|
2834
|
+
### Guides and Articles
|
|
2835
2835
|
|
|
2836
2836
|
- [Complete Monorepo Guide 2025](https://jsdev.space/complete-monorepo-guide/)
|
|
2837
2837
|
|
|
@@ -186,22 +186,22 @@ str(MyThing(file_path="/tmp/file.txt", title="Something " + "blah " * 50, url="h
|
|
|
186
186
|
## Releasing (tag-triggered, no changesets)
|
|
187
187
|
|
|
188
188
|
For publishing Python packages to PyPI, follow the
|
|
189
|
-
[`simple-modern-uv`](https://github.com/jlevy/simple-modern-uv) template’s model
|
|
189
|
+
[`simple-modern-uv`](https://github.com/jlevy/simple-modern-uv) template’s model—it is
|
|
190
190
|
the standard for tbd’s Python projects.
|
|
191
191
|
The same clean principles as the TypeScript guidance apply: no changesets, releases cut
|
|
192
192
|
from clean conventional commits.
|
|
193
193
|
|
|
194
194
|
- **Dynamic versioning from the git tag** via
|
|
195
|
-
[`uv-dynamic-versioning`](https://github.com/ninoseki/uv-dynamic-versioning)
|
|
195
|
+
[`uv-dynamic-versioning`](https://github.com/ninoseki/uv-dynamic-versioning)—the tag
|
|
196
196
|
*is* the version (no manual `version =` bump in `pyproject.toml`, no version commit).
|
|
197
197
|
- **Release/tag-triggered publish**: a `publish.yml` workflow runs on
|
|
198
198
|
`on: release: types: [published]` (or a `v*` tag), builds with `uv build`, and
|
|
199
|
-
publishes with `uv publish --trusted-publishing always
|
|
199
|
+
publishes with `uv publish --trusted-publishing always`—**PyPI Trusted Publishing
|
|
200
200
|
(OIDC), no API token**.
|
|
201
201
|
- **Supply-chain cool-off in CI**: set `UV_EXCLUDE_NEWER` to a 14-days-ago cutoff so the
|
|
202
202
|
build never resolves a brand-new (potentially yanked/compromised) release.
|
|
203
203
|
- **Release notes** are written per `release-notes-guidelines` from the commits since
|
|
204
|
-
the last tag
|
|
204
|
+
the last tag—there is no per-PR changeset file.
|
|
205
205
|
- Expose the version at runtime with `importlib.metadata.version("<pkg>")`.
|
|
206
206
|
|
|
207
207
|
So a release is just: clean commits → create the GitHub release/tag `vX.Y.Z` → CI builds
|
|
@@ -20,6 +20,9 @@ Use these sections in order (omit empty sections):
|
|
|
20
20
|
### Fixes
|
|
21
21
|
- Bug fixes and corrections
|
|
22
22
|
|
|
23
|
+
### Guidelines and content
|
|
24
|
+
- Changes to shipped guidelines, skills, shortcuts, or templates that users invoke
|
|
25
|
+
|
|
23
26
|
### Refactoring
|
|
24
27
|
- Internal improvements (only if user-visible impact)
|
|
25
28
|
|
|
@@ -29,6 +32,13 @@ Use these sections in order (omit empty sections):
|
|
|
29
32
|
**Full commit history**: [link to compare]
|
|
30
33
|
```
|
|
31
34
|
|
|
35
|
+
**Releases are not code-only.** If the project ships content—bundled guidelines, skills,
|
|
36
|
+
shortcuts, prompts, or templates that users invoke—changes to that content are product
|
|
37
|
+
changes. Review those diffs (not just code commits) and give them their own
|
|
38
|
+
`### Guidelines and content` section.
|
|
39
|
+
Reserve `### Documentation` for docs *about* the project (README, dev/internal docs);
|
|
40
|
+
shipped content a user can invoke is never an “internal doc” to skip.
|
|
41
|
+
|
|
32
42
|
## Core Principle: Describe the Delta
|
|
33
43
|
|
|
34
44
|
**Think in terms of two points in time:**
|
|
@@ -105,17 +115,23 @@ Don’t include:
|
|
|
105
115
|
- Test-only changes (unless they fix flaky tests users noticed)
|
|
106
116
|
- Pure refactoring with no user impact
|
|
107
117
|
- CI/tooling changes
|
|
108
|
-
- Minor
|
|
118
|
+
- Minor typo fixes in docs *about* the project (README, dev/internal docs)
|
|
119
|
+
|
|
120
|
+
Do **not** treat shipped content as internal.
|
|
121
|
+
Changes to guidelines, skills, shortcuts, or templates that users invoke are product
|
|
122
|
+
changes—include them under `Guidelines and content` (see Structure).
|
|
109
123
|
|
|
110
124
|
## Review Checklist
|
|
111
125
|
|
|
112
126
|
Before finalizing release notes:
|
|
113
127
|
|
|
114
128
|
- [ ] Does each item describe the aggregate delta from the previous release?
|
|
115
|
-
- [ ] Are related changes (features
|
|
129
|
+
- [ ] Are related changes (features and their fixes) consolidated under one heading?
|
|
116
130
|
- [ ] Would a user understand what’s different after upgrading?
|
|
117
131
|
- [ ] Are feature names/commands in consistent format?
|
|
118
132
|
- [ ] Are internal-only changes excluded?
|
|
133
|
+
- [ ] Did you review shipped-content diffs (guidelines, skills, shortcuts, templates),
|
|
134
|
+
not just code commits, and give them a section?
|
|
119
135
|
|
|
120
136
|
## Example
|
|
121
137
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: Supply-Chain Hardening
|
|
3
|
-
description: Strongly recommended for EVERY repo
|
|
3
|
+
description: Strongly recommended for EVERY repo—apply it if a repo has not been hardened yet. Cross-ecosystem policy for installing dependencies safely (the 14-day cool-off, disabled install scripts, lockfile discipline, untrusted-repo handling). Use whenever a user mentions hardening, security, supply chain, or setting up a new repo; before adding/upgrading dependencies; when auditing for compromised packages; or when reviewing install/build/run commands across npm/pnpm, PyPI, Cargo, or Go.
|
|
4
4
|
author: Joshua Levy (github.com/jlevy) with LLM assistance
|
|
5
5
|
---
|
|
6
6
|
# Supply-Chain Hardening
|
|
@@ -12,8 +12,8 @@ malicious package versions are published, exfiltrate credentials or install pers
|
|
|
12
12
|
and are usually yanked within minutes to days.
|
|
13
13
|
|
|
14
14
|
**Strongly recommended for every repo.** If a project has not been hardened yet, apply
|
|
15
|
-
this policy (and the per-ecosystem playbooks it links) as part of setup
|
|
16
|
-
|
|
15
|
+
this policy (and the per-ecosystem playbooks it links) as part of setup—it is especially
|
|
16
|
+
worth doing when standing up a new repo or whenever security comes up.
|
|
17
17
|
|
|
18
18
|
**This is the concise policy.** For the full playbooks (per-ecosystem ten-minute setups,
|
|
19
19
|
a zero-dependency audit script, a curated watch list of named incidents, CI/publish-side
|
|
@@ -23,23 +23,22 @@ see `tbd guidelines bun-monorepo-patterns` or `tbd guidelines pnpm-monorepo-patt
|
|
|
23
23
|
|
|
24
24
|
**When to use this guideline**: before adding or upgrading any dependency; when
|
|
25
25
|
hardening a workstation, repo, or CI pipeline; when assessing whether an installed
|
|
26
|
-
package is compromised; or when reviewing any `install` / `build` / `run`
|
|
27
|
-
especially in a freshly cloned third-party repo.
|
|
26
|
+
package is compromised; or when reviewing any `install` / `build` / `run`
|
|
27
|
+
command—especially in a freshly cloned third-party repo.
|
|
28
28
|
|
|
29
29
|
## The Default: a 14-Day Cool-Off
|
|
30
30
|
|
|
31
31
|
**Never install or upgrade to a package version less than 14 days old, unless a
|
|
32
32
|
documented exception applies.** This is the single most effective default.
|
|
33
33
|
It works because registries and researchers detect and yank malicious versions while
|
|
34
|
-
legitimate versions keep accruing age
|
|
34
|
+
legitimate versions keep accruing age—so the only cost of waiting is slightly staler
|
|
35
35
|
dependencies.
|
|
36
36
|
|
|
37
37
|
**14 days is a floor, not a ceiling.** A 30/60/90-day window is strictly safer; machines
|
|
38
38
|
with publish tokens or production access should go higher.
|
|
39
|
-
Scope: applies to `dependencies`, `devDependencies` (historically *more* dangerous
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
Pins resolved before adopting the policy are grandfathered until their next
|
|
39
|
+
Scope: applies to `dependencies`, `devDependencies` (historically *more* dangerous—build
|
|
40
|
+
tooling runs with full privileges), `peer`/`optionalDependencies`, new installs, and
|
|
41
|
+
upgrades. Pins resolved before adopting the policy are grandfathered until their next
|
|
43
42
|
planned upgrade.
|
|
44
43
|
|
|
45
44
|
### Per-ecosystem control
|
|
@@ -64,23 +63,23 @@ To check one version’s age: `npm view <pkg> time.<ver>`.
|
|
|
64
63
|
`pip install` / `cargo install` / `go install`: confirm the package is needed, the
|
|
65
64
|
name is spelled correctly (typosquats are common), and the version clears the
|
|
66
65
|
cool-off (or is lockfile-pinned, or has a stated exception).
|
|
67
|
-
2. **Disable install/lifecycle scripts by default
|
|
66
|
+
2. **Disable install/lifecycle scripts by default**—the primary exfiltration vector in
|
|
68
67
|
worm-class attacks (`NPM_CONFIG_IGNORE_SCRIPTS=true`; pnpm `ignoreScripts: true` +
|
|
69
68
|
`allowBuilds` allowlist; refuse PyPI sdist builds with
|
|
70
69
|
`UV_NO_BUILD`/`PIP_ONLY_BINARY`).
|
|
71
70
|
3. **Commit lockfiles; install frozen.** `pnpm install --frozen-lockfile` / `npm ci` /
|
|
72
71
|
`--locked`. Never auto-update without review.
|
|
73
|
-
4. **Audit after every install
|
|
72
|
+
4. **Audit after every install**—`pnpm audit` / `npm audit` / `pip-audit` /
|
|
74
73
|
`cargo audit` / `govulncheck`; address findings before continuing.
|
|
75
|
-
5. **Don’t update for its own sake.** The safest update is the one you skip
|
|
76
|
-
|
|
74
|
+
5. **Don’t update for its own sake.** The safest update is the one you skip—each bump is
|
|
75
|
+
fresh attack surface.
|
|
77
76
|
Bump only for a concrete reason ("show me the commit we need"); prefer fewer,
|
|
78
77
|
vendored/pinned dependencies; let audits and CVE monitoring tell you when a real
|
|
79
78
|
update is warranted.
|
|
80
79
|
6. **No unpinned zero-install runners.** Avoid `npx` / `pnpm dlx` / `bunx` / `uvx` /
|
|
81
80
|
`go run <remote>` without an explicit `@version` pin and a review of the resolved
|
|
82
|
-
`package@version
|
|
83
|
-
(When a skill references a CLI via a runner, pin it
|
|
81
|
+
`package@version`—they fetch and execute the latest code, bypassing the cool-off.
|
|
82
|
+
(When a skill references a CLI via a runner, pin it—see
|
|
84
83
|
`tbd guidelines cli-agent-skill-patterns` §6.7.)
|
|
85
84
|
7. **No `curl | sh` from untrusted sources.** Verify the installer URL belongs to the
|
|
86
85
|
documented project; check signatures/checksums where available.
|
|
@@ -96,14 +95,70 @@ yesterday), take the exception **explicitly and on the record**:
|
|
|
96
95
|
sources (OSV, GHSA, maintainer postmortem).
|
|
97
96
|
- Log it, with a follow-up to confirm the version was not yanked afterward.
|
|
98
97
|
|
|
99
|
-
No exception is “trivial
|
|
98
|
+
No exception is “trivial”—the rule exists because we don’t trust ourselves to eyeball
|
|
100
99
|
which fresh versions are safe.
|
|
101
100
|
**Agents never self-approve an exception**: prepare the record and a human signs off.
|
|
102
101
|
|
|
102
|
+
### Safe-override patterns (verify, then install surgically)
|
|
103
|
+
|
|
104
|
+
A release-age gate applies at **version resolution**, so `pkg@latest` (or a bare range)
|
|
105
|
+
silently resolves to the newest version *outside* the window—which can mean you get a
|
|
106
|
+
**stale** version without noticing.
|
|
107
|
+
(This is the dogfood case: an `~/.npmrc` `minimum-release-age` resolved
|
|
108
|
+
`npm i -g get-tbd@latest` to an older release because the newer one was still inside the
|
|
109
|
+
window.) When you genuinely need the fresh version, do not weaken the global
|
|
110
|
+
policy—override **surgically** for the one install, and **verify first**. The pattern is
|
|
111
|
+
always *verify the publisher, timestamp, and integrity → install by an exact,
|
|
112
|
+
resolution-bypassing reference → confirm afterwards.*
|
|
113
|
+
|
|
114
|
+
**1. Verify before fetching** (publisher identity, publish time, integrity hash):
|
|
115
|
+
|
|
116
|
+
| Ecosystem | Verify command |
|
|
117
|
+
| --- | --- |
|
|
118
|
+
| npm | `npm view <pkg>@<ver> _npmUser maintainers time.<ver> dist.integrity dist.tarball` |
|
|
119
|
+
| PyPI | `uv pip index versions <pkg>` and inspect the file hashes on `https://pypi.org/project/<pkg>/<ver>/#files` (or `pip download --no-deps --no-binary :all:` then check the hash) |
|
|
120
|
+
| Cargo | `cargo info <pkg>@<ver>` (owners, published-at); crates.io is immutable + checksummed in `Cargo.lock` |
|
|
121
|
+
| Go | `go list -m -json <module>@<ver>` (the proxy returns the checksum DB entry) |
|
|
122
|
+
|
|
123
|
+
For a package **you maintain** (the dogfood case), the strongest check is that the
|
|
124
|
+
published artifact matches the git tag—confirm the commit/tag and, where the registry
|
|
125
|
+
supports provenance/attestations (npm `--provenance`), that it was built from that
|
|
126
|
+
source.
|
|
127
|
+
|
|
128
|
+
**2. Install by an exact reference that bypasses version resolution**, so the gate does
|
|
129
|
+
not silently re-resolve:
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
# npm — direct tarball URL (verified in step 1); skips before/min-release-age resolution
|
|
133
|
+
npm install -g https://registry.npmjs.org/<pkg>/-/<pkg>-X.Y.Z.tgz
|
|
134
|
+
|
|
135
|
+
# npm — git ref (strongest for packages you maintain: the source is auditable)
|
|
136
|
+
npm install -g git+https://github.com/<org>/<repo>#vX.Y.Z
|
|
137
|
+
|
|
138
|
+
# uv / pip — pin exact, with the hash recorded; --exclude-newer override is per-invocation
|
|
139
|
+
uv pip install "<pkg>==X.Y.Z" --exclude-newer "$(date -u +%Y-%m-%d)" # one-shot, not global
|
|
140
|
+
|
|
141
|
+
# cargo / go — pin exact in the manifest; the committed lockfile/sum carries the checksum
|
|
142
|
+
cargo add <pkg>@=X.Y.Z # then `cargo build --locked`
|
|
143
|
+
go get <module>@vX.Y.Z # then `go mod verify`
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
A tarball-URL or git-ref install is the cleanest npm override because it never consults
|
|
147
|
+
`before` / `minimum-release-age` at all (those apply only to range resolution), so you
|
|
148
|
+
do not touch global config or env.
|
|
149
|
+
The uv/cargo/go forms pin an exact version rather than bypassing a gate, since those
|
|
150
|
+
ecosystems gate at the lockfile rather than at resolution.
|
|
151
|
+
|
|
152
|
+
**3. Keep it surgical and on the record.** The override must affect **one install**, not
|
|
153
|
+
global `~/.npmrc` / env / CI config; carry the same commit/PR record as any exception
|
|
154
|
+
(reason, exact `pkg@version`, the verification output); and **confirm afterwards** that
|
|
155
|
+
the version was not subsequently yanked.
|
|
156
|
+
Never relax the global cool-off to get one fresh package—that re-exposes every install.
|
|
157
|
+
|
|
103
158
|
## Node / TypeScript Enforcement (npm, pnpm, Bun)
|
|
104
159
|
|
|
105
160
|
The hands-on controls for the rules above in the Node ecosystem.
|
|
106
|
-
Applies to **any** repo, not just new monorepos
|
|
161
|
+
Applies to **any** repo, not just new monorepos—drop these into an existing project.
|
|
107
162
|
|
|
108
163
|
**Lifecycle-script hygiene (the highest-value control).** Block install/build scripts by
|
|
109
164
|
default and allowlist only what you trust:
|
|
@@ -149,7 +204,7 @@ One root lockfile in a monorepo.
|
|
|
149
204
|
[npm provenance attestations](https://docs.npmjs.com/generating-provenance-statements)
|
|
150
205
|
(TypeScript, Vitest, Prettier, ESLint do).
|
|
151
206
|
Run `pnpm audit signatures` / `npm audit signatures` periodically.
|
|
152
|
-
A provenance badge is necessary, not sufficient
|
|
207
|
+
A provenance badge is necessary, not sufficient—the @antv worm forged one.
|
|
153
208
|
|
|
154
209
|
**CI audit gate** (alongside lint/test):
|
|
155
210
|
|
|
@@ -165,7 +220,7 @@ audit:
|
|
|
165
220
|
# errorLevel 0 logs but doesn't fail — flip to 2 once the backlog is cleared
|
|
166
221
|
```
|
|
167
222
|
|
|
168
|
-
**Pre-push age guard
|
|
223
|
+
**Pre-push age guard**—a zero-dependency Node script wired into lefthook/husky:
|
|
169
224
|
|
|
170
225
|
```ts
|
|
171
226
|
#!/usr/bin/env tsx
|
|
@@ -192,18 +247,18 @@ leave a marker next to the pin (JSONC comment in `package.json`, or a `CHANGELOG
|
|
|
192
247
|
note for strict JSON parsers): `// Exception: CVE-2026-XXXX patch within 14d window.
|
|
193
248
|
Reviewed <date>.`
|
|
194
249
|
|
|
195
|
-
## Untrusted Repos
|
|
250
|
+
## Untrusted Repos and Modes
|
|
196
251
|
|
|
197
252
|
- **Treat any freshly-cloned third-party repo as untrusted.** Do not run
|
|
198
253
|
`install`/`build`/`test`/`run`/`npx`/`uvx`/`cargo run`/`go run <remote>` against it on
|
|
199
|
-
a machine with ambient credentials until you’ve reviewed it
|
|
200
|
-
|
|
254
|
+
a machine with ambient credentials until you’ve reviewed it—ideally in a container or
|
|
255
|
+
namespace-isolated sandbox.
|
|
201
256
|
(`build.rs`, proc-macros, `require()`-time payloads, and test files all execute code.)
|
|
202
257
|
- **Modes**: default to **Balanced** (the policy above).
|
|
203
258
|
Enter **Strict** (no upgrade without reviewing the change set; build-script allowlist
|
|
204
259
|
required; mandatory sandbox; CI scanners checksum-verified) when the repo declares it,
|
|
205
260
|
when the repo is untrusted, or on a machine with publish tokens / production access.
|
|
206
|
-
**Emergency Exception** is a single logged per-command bypass
|
|
261
|
+
**Emergency Exception** is a single logged per-command bypass—never self-approved by
|
|
207
262
|
an agent.
|
|
208
263
|
|
|
209
264
|
## What This Does and Doesn’t Cover
|
|
@@ -212,11 +267,11 @@ A cool-off plus disabled scripts neutralizes the dominant **fast-yanked-incident
|
|
|
212
267
|
pattern. It does **not** stop: long-lived typosquats that survive past the window; a
|
|
213
268
|
lockfile that already captured a bad version; payloads that fire on import/build rather
|
|
214
269
|
than install; or **publish-pipeline compromises** (the May 2026 @antv worm shipped from
|
|
215
|
-
legitimate CI with a forged “verified” provenance badge
|
|
216
|
-
Those need lockfile review, typosquat checks, build-time controls, and
|
|
217
|
-
packages
|
|
218
|
-
|
|
219
|
-
|
|
270
|
+
legitimate CI with a forged “verified” provenance badge—a green badge is not proof).
|
|
271
|
+
Those need lockfile review, typosquat checks, build-time controls, and—if you publish
|
|
272
|
+
packages—the publish-side controls in the guidebook’s `hardening-ci-cd.md` (OIDC trusted
|
|
273
|
+
publishing, staged publishing, SHA-pinned actions, runner egress limits, provenance
|
|
274
|
+
monitoring).
|
|
220
275
|
|
|
221
276
|
## Apply It Here (tbd)
|
|
222
277
|
|
|
@@ -79,7 +79,7 @@ auto-saving, since the issue is likely temporary.
|
|
|
79
79
|
|
|
80
80
|
**What tbd now does:**
|
|
81
81
|
- `mergeIssues()` detects no-op merges and skips the version/timestamp bump
|
|
82
|
-
- `getUpdatedIssues()` ignores `version` and `updated_at` when filtering
|
|
82
|
+
- `getUpdatedIssues()` ignores `version` and `updated_at` when filtering—only issues
|
|
83
83
|
with actual content changes (title, status, labels, description, etc.)
|
|
84
84
|
are saved
|
|
85
85
|
- When fetch fails, the cached `origin/tbd-sync` ref is used for comparison instead of
|
|
@@ -87,7 +87,7 @@ auto-saving, since the issue is likely temporary.
|
|
|
87
87
|
|
|
88
88
|
**If you encounter this with an older version:**
|
|
89
89
|
1. Update tbd: `npm install -g get-tbd@latest`
|
|
90
|
-
2. If you already have a large outbox, you can safely import it
|
|
90
|
+
2. If you already have a large outbox, you can safely import it—the import will merge
|
|
91
91
|
using field-level LWW and the trivial changes will be harmless
|
|
92
92
|
3. Run `tbd sync` to clear the outbox
|
|
93
93
|
|
|
@@ -123,7 +123,7 @@ auto-saving, since the issue is likely temporary.
|
|
|
123
123
|
### Don’t gitignore .tbd/workspaces/
|
|
124
124
|
|
|
125
125
|
When `tbd sync` fails and auto-saves to `.tbd/workspaces/outbox/`, a new untracked
|
|
126
|
-
directory appears. Do not add it to `.gitignore
|
|
126
|
+
directory appears. Do not add it to `.gitignore`—the outbox must be committed to your
|
|
127
127
|
working branch so unsynced data survives across sessions.
|
|
128
128
|
|
|
129
129
|
**What to do instead:**
|