antfu — скилл для Claude Code: конвенции Anthony Fu для JS/TS
Задаёт агенту правила Anthony Fu для JavaScript и TypeScript: структура файлов, ESLint, Knip, публикация пакетов. Пригодится при старте проекта и настройке монорепозитория.
npx skills add antfu/skills --skill antfu -a claude-codeЧто делает antfu
Скилл описывает, как агент должен раскладывать код в JS/TS-проекте. Типы уезжают в types.ts, константы — в constants.ts, крупные файлы разбиваются по ответственности. Импорты только явные, автоподключения советует выключать, алиасы путей не заводить там, где их не было.
Инструменты тоже заданы: конфиг @antfu/eslint-config с включённым antislop: true (для него нужны eslint-plugin-slop и eslint-plugin-sonarjs в dev-зависимостях), Knip для поиска мёртвых файлов и экспортов, tsdown для сборки, Vitest для тестов, simple-git-hooks и nano-staged на пре-коммите. Версии пакетов скилл советует смотреть через fast-npm-meta, а не тянуть весь реестр. Каждый проект получает скрипт ci, который прогоняет линт, типы, Knip и тесты одной командой.
За основу берётся шаблон antfu/starter-ts: агент копирует оттуда package.json, eslint.config.js, knip.json и tsdown.config.ts, а не придумывает свою раскладку. Публикация — через npm Trusted Publishing по OIDC, без секрета NPM_TOKEN. Если в проекте уже настроены алиасы или автоимпорты, скилл их не трогает, но для нового кода не добавляет.
Какие задачи решает
- разложить типы и константы по отдельным файлам
- настроить ESLint с флагом antislop и без explicit any
- найти неиспользуемые файлы и зависимости через Knip
- собрать единый скрипт ci для линта, типов и тестов
- опубликовать пакет через OIDC без NPM_TOKEN
Примеры запросов агенту
- Настрой новый TypeScript-проект по шаблону antfu/starter-ts
- Разбей этот большой файл и вынеси типы в types.ts
- Добавь в package.json скрипт ci с линтом, typecheck, knip и тестами
Как установить antfu
1Через Skills CLI (Vercel)
npx skills add antfu/skills --skill antfu -a claude-code2Вручную: положить файлы
~/.claude/skills/antfu/SKILL.mdПапка скилла целиком; для одного проекта — .claude/skills/antfu/
1Через Skills CLI (Vercel)
npx skills add antfu/skills --skill antfu -a codex2Вручную: положить файлы
.agents/skills/antfu/SKILL.mdДля всех проектов — ~/.agents/skills/
1Через Skills CLI (Vercel)
npx skills add antfu/skills --skill antfu -a cursor2Вручную: положить файлы
.cursor/skills/antfu/SKILL.mdCursor читает и .agents/skills/, и .claude/skills/
1GitHub CLI
gh skill install antfu/skills antfu2Вручную: положить файлы
.github/skills/antfu/SKILL.md1Через Skills CLI (Vercel)
npx skills add antfu/skills --skill antfu -a gemini-cli2Командой платформы
gemini skills install https://github.com/antfu/skills --path skills/antfuВручную: положить файлы
.devin/skills/antfu/SKILL.mdСтарый путь .windsurf/skills/ тоже читается
Через Skills CLI (Vercel)
npx skills add antfu/skills --skill antfu -a opencodeClaude.ai
Упакуйте папку в zip и загрузите в Settings → Capabilities → Skills
По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов
Вопросы о antfu
Как установить antfu в Claude Code?
Выполните npx skills add antfu/skills --skill antfu -a claude-code. После этого файл скилла лежит в ~/.claude/skills/antfu/SKILL.md.
Что делает скилл antfu?
Он передаёт агенту конвенции Anthony Fu для JavaScript и TypeScript: как организовать файлы, какие инструменты использовать и как публиковать пакеты.
Какие зависимости нужны для antislop?
Флаг antislop: true в конфиге ESLint требует eslint-plugin-slop и eslint-plugin-sonarjs в dev-зависимостях.
Исходный текст
SKILL.md · MIT
---
name: antfu
description: Anthony Fu's opinionated tooling and conventions for JavaScript/TypeScript projects. Use when setting up new projects, configuring ESLint/Prettier alternatives, monorepos, library publishing, or when the user mentions Anthony Fu's preferences.
metadata:
author: Anthony Fu
version: "2026.09.30"
---
> Reference template: [antfu/starter-ts](https://github.com/antfu/starter-ts). When scaffolding a new TypeScript project, mirror its `package.json` scripts, `eslint.config.js`, `knip.json`, `tsdown.config.ts` and workflows rather than inventing a new layout.
## 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:
```ts
// @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](references/app-development.md)).
- **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.ts` → `foo.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
| Command | Description |
|---------|-------------|
| `ni` | Install dependencies |
| `ni <pkg>` / `ni -D <pkg>` | Add dependency / dev dependency |
| `nr <script>` | Run script |
| `nu` | Upgrade dependencies |
| `nun <pkg>` | Uninstall dependency |
| `nci` | Clean install (`pnpm i --frozen-lockfile`) |
| `nlx <pkg>` | Execute package (`npx`) |
### Checking npm Package Versions
Use [`fast-npm-meta`](https://github.com/antfu/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).
```bash
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
```json
{
"compilerOptions": {
"target": "ESNext",
"module": "ESNext",
"moduleResolution": "bundler",
"strict": true,
"esModuleInterop": true,
"skipLibCheck": true,
"resolveJsonModule": true,
"isolatedModules": true,
"noEmit": true
}
}
```
### ESLint Setup
```js
// eslint.config.js
import antfu from '@antfu/eslint-config'
export default antfu({
type: 'lib', // or 'app' (default)
pnpm: true, // enforce pnpm catalogs in package.json
antislop: true, // flag redundant/duplicated AI-style code, ban explicit `any`
})
```
Always enable `antislop: true`. It requires `eslint-plugin-slop` and `eslint-plugin-sonarjs` as dev dependencies.
For detailed configuration options: [antfu-eslint-config](references/antfu-eslint-config.md)
### Knip
Use [Knip](https://knip.dev) to catch unused files, exports and dependencies — the linter only sees one file at a time.
```json
// knip.json
{
"$schema": "https://unpkg.com/knip@6/schema.json",
"project": ["src/**/*.ts"],
"ignoreDependencies": []
}
```
Fix what Knip reports by deleting; only add to `ignoreDependencies` for tools invoked outside `package.json` scripts (e.g. `taze`).
### Scripts and the `ci` Gate
Every project exposes a `ci` script that runs all checks in one command:
```json
{
"scripts": {
"build": "tsdown",
"lint": "eslint --cache",
"typecheck": "tsc",
"knip": "knip",
"test": "pnpm run build && vitest",
"ci": "pnpm run lint && pnpm run typecheck && pnpm run knip && pnpm run test --run"
}
}
```
**Before every commit, run `nr lint --fix` to format, then `nr ci` and make sure it passes.** Do not commit with a failing `ci`; fix the root cause instead of silencing rules or adding ignores.
### Git Hooks
`simple-git-hooks` + `nano-staged`. The pre-commit hook runs the full `ci` gate; `prepare` also installs agent skills via `skills-npm`:
```json
{
"scripts": {
"prepare": "git config core.hooksPath .githooks && simple-git-hooks && skills-npm"
},
"simple-git-hooks": {
"pre-commit": "pnpm i --frozen-lockfile --ignore-scripts --offline && pnpm run ci && pnpx nano-staged"
},
"nano-staged": {
"*": "eslint --fix --no-warn-ignored"
}
}
```
Add `.githooks` to `.gitignore` and `simple-git-hooks: true` under `allowBuilds` in `pnpm-workspace.yaml`.
### skills-npm
[`skills-npm`](https://github.com/antfu/skills-npm) symlinks agent skills shipped inside installed npm packages (and fetches those declared in a `skills` field) into the agent's skills directory on every install. Install as a dev dependency and wire it into `prepare` as above; add `skills/npm-*` to `.gitignore`. Commit the generated `skills-npm-lock.json`.
### Publishing
Prefer npm Trusted Publishing (OIDC) over `NPM_TOKEN` secrets: releases run on CI from a `v*` tag via `release.yml` with `id-token: write`, and `nr release` (`bumpp`) only bumps, tags and pushes. Details: [setting-up](references/setting-up.md#publishing-with-npm-trusted-publishing-oidc).
### pnpm Catalogs
Use named catalogs in `pnpm-workspace.yaml` for version management:
| Catalog | Purpose |
|---------|---------|
| `prod` | Production dependencies |
| `inlined` | Bundler-inlined dependencies |
| `dev` | Dev tools (linter, bundler, testing) |
| `frontend` | Frontend libraries |
Avoid the default catalog. Catalog names can be adjusted per project needs.
---
## References
| Topic | Description | Reference |
|-------|-------------|-----------|
| ESLint Config | Framework support, antislop, formatters, rule overrides, VS Code settings | [antfu-eslint-config](references/antfu-eslint-config.md) |
| Project Setup | .gitignore, GitHub Actions, OIDC trusted publishing, VS Code extensions | [setting-up](references/setting-up.md) |
| App Development | Vue/Nuxt/UnoCSS conventions, auto-import control, Storybook component testing | [app-development](references/app-development.md) |
| Library Development | tsdown bundling, pure ESM publishing, publint, API snapshots | [library-development](references/library-development.md) |
| Monorepo | pnpm workspaces, centralized alias, Turborepo | [monorepo](references/monorepo.md) |
© Anthony Fu · MIT · antfu/skills