--- name: hairy description: Hairy's {Opinionated} preferences and best practices for web development metadata: author: Hairyf version: "2026.1.28" --- # Hairyf's Preferences This skill covers Hairyf's preferred tooling, configurations, and best practices for web development. This skill is opinionated. ## Quick Summary | Category | Preference | |----------|------------| | Package Manager | pnpm | | Language | TypeScript (strict mode) | | Module System | ESM (`"type": "module"`) | | Linting & Formatting | @antfu/eslint-config (no Prettier) | | Testing | Vitest | | Git Hooks | simple-git-hooks + lint-staged | | Documentation | VitePress (in `docs/`) | --- ## Core Stack ### Package Manager (pnpm) Use pnpm as the package manager. For monorepo setups, use pnpm workspaces: ```yaml # pnpm-workspace.yaml packages: - 'packages/*' ``` Use pnpm named catalogs in `pnpm-workspace.yaml` to manage dependency versions: | Catalog | Purpose | |---------|---------| | `prod` | Production dependencies | | `inlined` | Dependencies inlined by bundler | | `dev` | Development tools (linter, bundler, testing, dev-server) | | `frontend` | Frontend libraries bundled into frontend | Catalog names are not limited to the above and can be adjusted based on needs. Avoid using default catalog. #### @antfu/ni Use `@antfu/ni` for unified package manager commands. It auto-detects the package manager (pnpm/npm/yarn/bun) based on lockfile. | Command | Description | |---------|-------------| | `ni` | Install dependencies | | `ni ` | Add dependency | | `ni -D ` | Add dev dependency | | `nr