# TS Lint Format

> Use when choosing or configuring a TS linter/formatter — Biome 2.x vs ESLint 9 flat config + typescript-eslint typed linting. Not for type checking itself (ts-config).

- Skill: `fusengine/ts-lint-format` (Agent Skill, multi-file: 6 files)
- Install (CLI): `npx skillmds@latest add fusengine/ts-lint-format`
- Raw SKILL.md: https://api.skillmd.com/api/skills/fusengine/ts-lint-format/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: fusengine (https://skillmd.com/u/fusengine)
- Updated: 2026-09-10
- Page: https://skillmd.com/skills/fusengine/ts-lint-format

---


<objective>
This skill covers choosing and configuring a TypeScript linting/formatting stack: Biome 2.x
as a single binary that formats and lints (biome.json, domains, type-aware rules covering
~75% of typed-linting needs) versus ESLint 9 flat config (eslint.config.mjs) with
typescript-eslint for full typed linting including cross-file narrowing and no-unsafe-*
rules.

It covers the 2026 arbitrage between the two — new projects default to Biome for a fast
zero-config start, established/typed-heavy codebases lean ESLint + typescript-eslint — plus
a note on Oxlint as a challenger, and the rule to never run Biome and Prettier on the same
files.

Out of scope: type checking itself (tsc --noEmit, tsconfig flags) belongs to ts-config;
test-runner configuration belongs to ts-testing.
</objective>

# TypeScript Linting & Formatting

## Agent Workflow (MANDATORY)

Before ANY implementation, spawn 3 agents in parallel, one `Agent` call each with a `name`:

1. **fuse-ai-pilot:explore-codebase** - Detect existing lint/format config, project age, framework
2. **fuse-ai-pilot:research-expert** - Verify latest Biome 2.x + typescript-eslint via Context7/Exa
3. **mcp__context7__query-docs** - Check Biome and typescript-eslint docs

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

## Use when

- Choosing a linter/formatter stack for a TS project (new vs established codebase)
- Configuring **Biome 2.x** (`biome.json`, `biome check`, domains, type-aware rules)
- Configuring **ESLint 9 flat config** + **typescript-eslint** typed linting
- Migrating from ESLint+Prettier, or adding a CI lint gate

## Do NOT use for

- Runtime execution → use [ts-runtime-node](../ts-runtime-node/SKILL.md) / [ts-runtime-bun](../ts-runtime-bun/SKILL.md)
- Framework-specific style rules owned by that framework's own config
- Type checking itself — linters complement, never replace, `tsc --noEmit`

## Critical Rules

1. **Pick ONE formatter** - Biome formats AND lints in one binary; do not also run Prettier on the same files.
2. **Type-aware linting needs the type checker** - `typescript-eslint` typed rules and Biome's type-aware rules both cost a build pass; expect them to be slower than syntactic rules.
3. **Biome does NOT format-lint** - It never reports formatting via lint rules; the formatter owns all formatting decisions.
4. **ESLint 9 = flat config** - Use `eslint.config.mjs` with `typescript-eslint`'s `tseslint.configs.*`; legacy `.eslintrc` is deprecated.
5. **Coverage gap is real** - Biome's type-aware rules cover ~75% of typed-linting needs; full cross-file narrowing and `no-unsafe-*` still require typescript-eslint.

## Architecture

```
project/
├── biome.json            # Biome path: one binary, format + lint
│   OR
├── eslint.config.mjs     # ESLint path: flat config + typescript-eslint
├── .prettierrc           #   (only on ESLint path; Biome replaces Prettier)
└── tsconfig.json         # required for typed linting (both tools)
```

→ See [config-examples.md](references/templates/config-examples.md) for both stacks

## Reference Guide

### Concepts

| Topic | Reference | When to Consult |
|-------|-----------|-----------------|
| **Tool choice (2026)** | [tool-choice.md](references/tool-choice.md) | Deciding Biome vs ESLint; Oxlint challenger |
| **Biome setup** | [biome-setup.md](references/biome-setup.md) | Configuring `biome.json`, rules, domains, CI |
| **ESLint typed** | [eslint-typed.md](references/eslint-typed.md) | Flat config + typescript-eslint typed linting |

### Templates

| Template | When to Use |
|----------|-------------|
| [config-examples.md](references/templates/config-examples.md) | Copy a Biome or ESLint config into a project |

## Best Practices

### DO
- New project → default to **Biome 2.x** (one binary, fast, zero-config start)
- Established/typed-heavy codebase → **ESLint 9 + typescript-eslint** typed linting
- Run the linter in CI with `error` severity to gate merges

### DON'T
- Run Biome and Prettier on the same files (conflicting formatting)
- Enable typed linting and then complain about speed — it's the type checker cost
- Assume Biome covers every typescript-eslint rule — check the gaps first

