Agent Skills: TypeScript Config (TS 7.0)

Use when creating or migrating a tsconfig.json, choosing module/moduleResolution, or fixing TS 6.0 deprecations that are hard errors in TS 7.0. Not for language syntax (ts-language-patterns).

UncategorizedID: fusengine/agents/ts-config

Install this agent skill to your local

pnpm dlx add-skill https://github.com/Fusengine/claude-plugins/tree/HEAD/plugins/typescript-expert/skills/ts-config

Skill Files

Browse the full folder contents for ts-config.

Download Skill

Loading file tree…

plugins/typescript-expert/skills/ts-config/SKILL.md

Skill Metadata

Name
ts-config
Description
"Use when creating or migrating a tsconfig.json, choosing module/moduleResolution, or fixing TS 6.0 deprecations that are hard errors in TS 7.0. Not for language syntax (ts-language-patterns)."
<objective> This skill covers the two supported TypeScript 7.0 config tracks for 2026 — bundler (Bun, Vite, esbuild, webpack: module Preserve + moduleResolution bundler) and Node (pure Node.js native type stripping: module nodenext + moduleResolution nodenext) — and how to pick between them by runtime.

It also covers the TS 6.0 deprecation cleanup that TS 7.0 (native Go compiler) enforces as hard errors: dropping moduleResolution node/node10, setting verbatimModuleSyntax, strict + noUncheckedIndexedAccess, explicit types, and explicit rootDir now that it is no longer inferred.

Out of scope: TypeScript language syntax and idioms belong to ts-language-patterns; framework configs that ship their own tsconfig base (Next.js/Astro/Vite plugin skills) and non-TS build tooling are not covered. </objective>

TypeScript Config (TS 7.0)

Agent Workflow (MANDATORY)

Before writing any tsconfig, spawn 3 agents in parallel, one Agent call each with a name:

  1. fuse-ai-pilot:explore-codebase - Detect runtime (Bun/Node/bundler), existing tsconfig, package.json type
  2. fuse-ai-pilot:research-expert - Confirm current flags on typescriptlang.org release notes + runtime docs
  3. mcp__context7__query-docs - /microsoft/typescript for any flag whose behavior is unclear

After writing, run fuse-ai-pilot:sniper for validation.


Overview

There are exactly two supported config trajectories in 2026. Pick by runtime, never mix.

| Track | Runtime | module | moduleResolution | |-------|---------|----------|--------------------| | Bundler | Bun, Vite, esbuild, webpack | Preserve | bundler | | Node | Pure Node.js (native type stripping) | nodenext | nodenext |


Critical Rules

  1. Never moduleResolution: node / node10 - deprecated in 6.0, hard error in 7.0. Use bundler or nodenext.
  2. Always verbatimModuleSyntax: true - both tracks. Forces explicit import type, matches Node's type stripping.
  3. strict + noUncheckedIndexedAccess - strict is the default since 6.0 (kept in 7.0); add noUncheckedIndexedAccess explicitly.
  4. Set types explicitly - since 6.0 (kept in 7.0) types defaults to []. Add ["node"], ["bun"], etc. or you lose globals.
  5. Set rootDir when sources are nested - since 6.0 (kept in 7.0) rootDir defaults to the tsconfig dir, no longer inferred.

Decision: which track?

Runs on Bun, or bundled by Vite/esbuild/webpack/Parcel?
  → Bundler track  → references/bundler-track.md

Runs directly on `node file.ts` (type stripping), or emits .js for Node?
  → Node track     → references/node-track.md

Migrating an existing 5.x config / seeing deprecation errors?
  → references/deprecations-6.md  (do this first, then pick a track)

Reference Guide

Concepts

| Topic | Reference | When to Consult | |-------|-----------|-----------------| | Bundler track | bundler-track.md | Load when configuring a Bun or bundler (Vite/esbuild/webpack) project | | Node track | node-track.md | Load when configuring a pure Node.js project with native type stripping | | 6.0 deprecations / 7.0 errors | deprecations-6.md | Load when migrating from TS 5.x/6.0, fixing deprecation errors, or adopting the TS 7.0 tsc |

Templates

| Template | When to Use | |----------|-------------| | tsconfig.bundler.md | Complete Bun/bundler tsconfig | | tsconfig.node.md | Complete pure-Node tsconfig |


Quick Reference

Bundler / Bun

{
  "compilerOptions": {
    "module": "Preserve",
    "moduleResolution": "bundler",
    "verbatimModuleSyntax": true,
    "allowImportingTsExtensions": true,
    "noEmit": true,
    "strict": true,
    "noUncheckedIndexedAccess": true
  }
}

Pure Node.js (native type stripping)

{
  "compilerOptions": {
    "module": "nodenext",
    "rewriteRelativeImportExtensions": true,
    "erasableSyntaxOnly": true,
    "verbatimModuleSyntax": true,
    "noEmit": true, // only if you never emit .js
    "strict": true
  }
}

Best Practices

DO

  • Add "ignoreDeprecations": "6.0" temporarily on TS 6.0 while migrating, then remove it — TS 7.0 does not honour it (deprecated options are hard errors)
  • Keep tools that need the compiler API (e.g. typescript-eslint) on TS 6 via the @typescript/typescript6 alias while tsc runs TS 7.0 — see deprecations-6.md
  • Use subpath imports "#/*": "./src/*" in package.json imports (supported under nodenext and bundler)
  • Fold any baseUrl prefix into each paths entry (baseUrl is deprecated)

DON'T

  • Mix module: Preserve with moduleResolution: nodenext (or vice-versa)
  • Set esModuleInterop, allowSyntheticDefaultImports, or alwaysStrict to false (no longer allowed)
  • Use enum, namespace with runtime code, or parameter properties in files run by Node's type stripping