---
title: vite-plus
description: The developer experience toolchain - vp commands for linting, testing, typechecking, and formatting.
---

vite-plus (invoked as `vp`) is the repository's developer-experience toolchain. It wraps the Vite/Vitest ecosystem with sensible monorepo defaults, so quality gates work identically across apps and libraries with minimal per-package configuration.

### What vp owns

| Gate | Command | Notes |
| --- | --- | --- |
| Lint | `vp lint` | The per-package lint script. |
| Lint + fix | `vp lint:fix` | Auto-fix lint issues. |
| Test | `vp test run` | Run tests once (CI mode). |
| Test (watch) | `vp test` | Watch mode for development. |
| Typecheck | `tsc --noEmit` | Most packages typecheck with plain `tsc`. |
| Format | `vp fmt .` | Root-level formatting. |
| Format check | `vp fmt --check` | Verify without editing. |

### How packages wire it

Every app's `package.json` follows the same shape:

```json
{
  "scripts": {
    "lint": "vp lint",
    "test": "vp test run",
    "typecheck": "tsc --noEmit"
  },
  "devDependencies": {
    "vite": "catalog:",
    "vite-plus": "catalog:",
    "vitest": "catalog:"
  }
}
```

Because `vite`, `vitest`, and `vite-plus` come from the catalog, every package uses the same tool versions without repeating them.

### Tests with vite-plus

Tests run through Vitest, driven by `vp test`. Package-level config (where relevant) lives in `vitest.config.ts` at the package root, and setup files like `vitest.setup.ts` are referenced from there. Tests use `@effect/vitest`'s `expect`/`it` - never Vitest's own `expect` (see [Testing](/tooling/testing)).

### Formatting

Formatting is centralized at the root:

```bash
pnpm format          # vp fmt .
pnpm format:check    # verify only
```

Run `pnpm format` before committing to avoid formatting drift in CI.

### Conventions

- **Use `vp` for installs, builds, tests, lint, and typecheck** rather than calling underlying binaries directly (per the repo's AGENTS.md).
- **Never bypass the catalog.** Adding a different Vite/Vitest version locally breaks the shared toolchain.
- **Keep package config minimal.** vp's defaults should cover most needs; only add `vitest.config.ts` when a package genuinely needs it.