Vite+
noirium uses Vite+, a unified toolchain that wraps Vite, Rolldown, Vitest, tsdown, Oxlint, Oxfmt, and Vite Task in a single global CLI called vp. Vite+ also wraps runtime management and package management.
For first-run commands and workspace setup see Getting started. For the project-specific task graph (task:build:lib, task:test, task:css:check, task:pre-commit) see Getting started → Vite+ task runner.
The CLI
vp is a global binary that handles the full development lifecycle. Run vp help for the list and vp <command> --help for details. The command groups:
Start
create— create a new project from a templatemigrate— migrate an existing project to Vite+config— configure hooks and agent integrationstaged— run linters on staged filesinstall(i) — install dependenciesenv— manage Node.js versions
Develop
dev— run the development servercheck— run format, lint, and TypeScript type checkslint— lint codefmt— format codetest— run tests
Execute
run— run monorepo tasksexec— execute a command from localnode_modules/.bindlx— execute a package binary without installing it as a dependencycache— manage the task cache
Build
build— build for productionpack— build librariespreview— preview production build
Manage dependencies
Vite+ auto-detects the underlying package manager via the packageManager field or lockfile. In this repo, that is pnpm.
add— add packages to dependenciesremove(rm,un,uninstall) — remove packagesupdate(up) — update packagesdedupe— deduplicateoutdated— check for outdated packageslist(ls) — list installed packageswhy(explain) — show why a package is installedinfo(view,show) — view package info from the registrylink(ln) /unlink— manage local package linkspm— forward a command to the package manager
Maintain
upgrade— updatevpitself
Pitfalls
- Don't use the package manager directly. Vite+ wraps pnpm; prefer
vp add/vp remove/vp install. Directpnpmcalls work but are not the convention. Never usenpmoryarn. - Don't run
vp vitestorvp oxlint— they don't exist. Usevp testandvp lint. - Built-in commands take precedence over
package.jsonscripts. If a script shares a name with a built-in (e.g. a customdevthat runs multiple services), invoke it asvp run dev.vp devalways starts Vite's dev server. - Don't install
vitest,oxlint,oxfmt, ortsdowndirectly. Vite+ wraps them. Upgrade viavp upgrade. - Use
vp dlxinstead ofnpxfor one-off binaries. - Import test/build modules from
vite-plus. Use:tsDo not installimport { defineConfig } from 'vite-plus'; import { expect, test, vi } from 'vite-plus/test';vitestto import test utilities. - Type-aware linting works out of the box. Don't install
oxlint-tsgolint;vp lint --type-awareis enough.
Imports
// Build / dev config
import { defineConfig } from 'vite-plus';
// Test utilities
import { describe, it, expect, vi } from 'vite-plus/test';CI integration
For GitHub Actions, voidzero-dev/setup-vp replaces separate Node/pnpm setup steps. See CI.
- uses: voidzero-dev/setup-vp@v1
with:
cache: true
- run: vp check
- run: vp testReview checklist for agents
- Run
vp installafter pulling remote changes and before getting started. - Run
vp checkandvp test(orvp run task:pre-commit) to validate changes.
See also
- Getting started — commands and the project task graph
- Conventions — hard boundaries on tools and imports
- Testing —
vite-plus/testimport path