New to Claude Skills? Learn how to install them →

Aantfu on GitHub

Antfu Tooling

Free

Opinionated setup for JavaScript/TypeScript projects.

by antfu5.7k stars on antfu/skills
1 views
Updated Jun 23, 2026
Get this skill

Free · Opens the source repo

What Antfu Tooling does

Antfu Tooling provides a structured approach to organizing and managing JavaScript and TypeScript projects, emphasizing best practices and conventions. This skill is particularly useful for developers looking to establish a consistent codebase from the outset. It includes guidelines for code organization, TypeScript usage, and tooling choices, ensuring that projects are maintainable and scalable.

The skill promotes clear code organization by advocating for single responsibility principles and separating concerns into distinct files. It encourages developers to use explicit return types in TypeScript and to avoid complex inline types, making the code easier to read and understand. Additionally, it emphasizes the importance of writing isomorphic code that can run in various environments, which is crucial for modern web applications.

Antfu Tooling also includes specific commands and configurations for managing dependencies and linting code, streamlining the development process. By utilizing commands from the @antfu/ni package, developers can efficiently install, upgrade, or uninstall dependencies, while also ensuring code quality through preset ESLint configurations. The skill's focus on explicit imports and avoiding unnecessary comments fosters a culture of clarity and traceability in coding practices.

This skill is ideal for developers and teams who want to adopt a standardized approach to JavaScript and TypeScript development, particularly when starting new projects or transitioning existing ones to a more structured format. It is also beneficial for library and monorepo development, providing tailored guidance for these specific use cases.

When to use it

Use this skill when starting new projects or configuring existing ones to follow best practices in JavaScript and TypeScript development.

When not to use it

This skill may not be suitable for projects that require highly customized setups or those that do not align with the conventions outlined by Anthony Fu.

What you can build with it

Setting Up a New Project

When starting a new JavaScript or TypeScript project, use Antfu Tooling to establish a solid foundation with best practices from the beginning.

Configuring ESLint

Quickly set up ESLint with the recommended configurations to ensure code quality and consistency across your project.

Managing a Monorepo

Utilize Antfu Tooling's guidelines for organizing and managing dependencies in a monorepo setup, ensuring efficient development.

How to install Antfu Tooling

View source

1. Install with the skills CLI

npx skills add antfu/skills/antfu --agent claude-code

2. Or install it manually

Download the skill folder and drop it into ~/.claude/skills/ for all projects, or .claude/skills/ to scope it to one repo. Restart Claude Code so it picks up the new skill.

Anthropic's agentic coding CLI, and the reference implementation of Agent Skills. Drop a skill folder into ~/.claude/skills and Claude Code loads it automatically whenever a task matches the skill's description. Claude Code docs

Inside SKILL.md

Written by antfu

Coding Practices

Code Organization

  • Single responsibility: Each source file should have a clear, focused scope/purpose
  • Split large files: Break files when they become large or handle too many concerns
  • Type separation: Always separate types and interfaces into types.ts or types/*.ts
  • Constants extraction: Move constants to a dedicated constants.ts file

Runtime Environment

  • Prefer isomorphic code: Write runtime-agnostic code that works in Node, browser, and workers whenever possible
  • Clear runtime indicators: When code is environment-specific, add a comment at the top of the file:
// @env node
// @env browser

TypeScript

  • Explicit return types: Declare return types explicitly when possible
  • Avoid complex inline types: Extract complex types into dedicated type or interface declarations

Explicitness

Favor explicit, traceable code over implicit "magic". A reader (human or agent) should be able to follow where every name comes from without running tooling.

  • Explicit imports: Prefer explicit import statements. Avoid auto-imports — when a framework provides them (e.g. Nuxt/Nitro), turn them off for new projects (see app-development).
  • No path aliases by default: Use relative imports (./foo, ../bar). Only use path aliases (@/, ~/, #imports, etc.) when they are already configured in the project; don't introduce new ones for greenfield code.

Comments

  • Avoid unnecessary comments: Code should be self-explanatory
  • Explain "why" not "how": Comments should describe the reasoning or intent, not what the code does

Testing (Vitest)

  • Test files: foo.tsfoo.test.ts (same directory)
  • Use describe/it API (not test)
  • Use toMatchSnapshot for complex outputs
  • Use toMatchFileSnapshot with explicit path for language-specific snapshots

Tooling Choices

@antfu/ni Commands

CommandDescription
niInstall dependencies
ni <pkg> / ni -D <pkg>Add dependency / dev dependency
nr <script>Run script
nuUpgrade dependencies
nun <pkg>Uninstall dependency
nciClean install (pnpm i --frozen-lockfile)
nlx <pkg>Execute package (npx)

Checking npm Package Versions

Use fast-npm-meta to look up the latest version of a package — it queries a small metadata endpoint instead of downloading the full registry payload (which can be megabytes per package).

nlx fast-npm-meta version vite              # 7.3.1
nlx fast-npm-meta version "nuxt@^3.5"       # 3.5.22 — range-aware
nlx fast-npm-meta version vite nuxt vue     # multiple at once
nlx fast-npm-meta version vite --json       # JSON for scripting
nlx fast-npm-meta full vite                 # full version list + dist-tags

Prefer this over npm view <pkg> version when you only need the latest version, and over reading package.json from the registry directly.

TypeScript Config

{
  "compilerOptions": {
    "target": "ESNext",
    "module": "ESNext",
    "moduleResolution": "bundler",
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "resolveJsonModule": true,
    "isolatedModules": true,
    "noEmit": true
  }
}

ESLint Setup

// eslint.config.mjs
import antfu from '@antfu/eslint-config'

export default antfu()

When completing tasks, run pnpm run lint --fix to format the code and fix coding style.

For detailed configuration options: antfu-eslint-config

Git Hooks

{
  "simple-git-hooks": {
    "pre-commit": "pnpm i --frozen-lockfile --ignore-scripts --offline && npx lint-staged"
  },
  "lint-staged": { "*": "eslint --fix" },
  "scripts": {
    "prepare": "npx simple-git-hooks"
  }
}

pnpm Catalogs

Use named catalogs in pnpm-workspace.yaml for version management:

CatalogPurpose
prodProduction dependencies
inlinedBundler-inlined dependencies
devDev tools (linter, bundler, testing)
frontendFrontend libraries

Avoid the default catalog. Catalog names can be adjusted per project needs.


References

TopicDescriptionReference
ESLint ConfigFramework support, formatters, rule overrides, VS Code settingsantfu-eslint-config
Project Setup.gitignore, GitHub Actions, VS Code extensionssetting-up
App DevelopmentVue/Nuxt/UnoCSS conventions, auto-import control, Storybook component testingapp-development
Library Developmenttsdown bundling, pure ESM publishinglibrary-development
Monorepopnpm workspaces, centralized alias, Turborepomonorepo

Frequently asked questions about Antfu Tooling

Similar skills