К основному содержанию
скилл CX Codex

typescript · alinaqi — скилл для Claude Code: строгий режим, eslint и jest

Задаёт агенту правила работы с TypeScript: строгий tsconfig, линт, тесты на Jest и структура проекта. Пригодится, когда в репозитории уже есть .ts и .tsx файлы.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add alinaqi/maggy --skill typescript -a claude-code
Открыть на GitHub

Что делает typescript

Скилл включается сам, когда агент открывает файлы по маскам **/*.ts, **/*.tsx и tsconfig*.json. Внутри — готовый набор настроек: strict, noImplicitAny, strictNullChecks, noUnusedLocals, noUnusedParameters, noImplicitReturns и esModuleInterop в tsconfig.json. Плюс конфиг eslint.config.js на typescript-eslint со строгими правилами: запрет any, обязательный возвращаемый тип у функций, лимит в 20 строк на функцию, глубина вложенности 2 и не больше 3 параметров.

Отдельно описана структура каталогов: src/core для чистой логики, src/infra для побочных эффектов, tests/unit и tests/integration. Для тестов приведён пример на Jest с разбивкой Arrange/Act/Assert. Есть шаблон GitHub Actions с шагами lint, typecheck и test:coverage, где порог покрытия выставлен на 80% по ветвям, функциям, строкам и операторам. Для коммитов — Husky и lint-staged: ESLint с --fix, Prettier, затем tsc --noEmit и тесты только по изменённым файлам.

Скилл жёсткий: any, приведение через as, оператор !, @ts-ignore без пояснения и enum объявлены анти-паттернами. Если в вашем проекте enum используются намеренно или any встречается в легаси, агент начнёт спорить с существующим кодом — это повод проверить, стоит ли ставить скилл целиком или только его часть.

Какие задачи решает

  • включить строгий режим TypeScript в новом проекте
  • разложить код по слоям core, infra и utils
  • настроить ESLint с проверкой типов
  • добавить Jest-тесты с покрытием
  • повесить проверки на pre-commit через Husky

Примеры запросов агенту

  • Настрой tsconfig.json по правилам скилла typescript
  • Добавь Jest-тест на функцию calculateTotal в стиле Arrange/Act/Assert
  • Проверь этот файл на анти-паттерны TypeScript и предложи замену any

Как установить typescript

1Через Skills CLI (Vercel)

npx skills add alinaqi/maggy --skill typescript -a claude-code

2Вручную: положить файлы

~/.claude/skills/typescript/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/typescript/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Из того же набора32

codex-review Скилл запускает аудит кода через утилиту Codex CLI и модель GPT-5.2-Codex. Пригодится для поиска уязвимостей и багов перед коммитом или в CI/CD. CX Codex +1 328установок web-content Скилл помогает писать страницы, которые и в поиске ранжируются, и попадают в ответы ChatGPT, Perplexity, Claude и Gemini. CX Codex +1 326установок reddit-api Скилл для интеграции Reddit в приложение: посты, комментарии, сабреддиты и данные пользователей через PRAW или Snoowrap. CX Codex +1 316установок team-coordination Организует совместную работу нескольких сессий Claude Code в одном репозитории через синхронизацию задач и статусов в Markdown. Пригодится команде, чтобы избежать конфликтов при параллельной разработке. CX Codex +1 314установок cloudflare-d1 Помогает агенту писать код под Cloudflare D1: схема Drizzle, миграции через Wrangler и воркер на Hono. Пригодится, когда проект уже крутится на Workers. CX Codex +1 311установок ms-teams-apps Скилл помогает собирать ботов, вкладки и расширения сообщений для Microsoft Teams с подключением LLM. Пригодится, когда нужен агент внутри Teams. CX Codex +1 303установок database-schema Скилл заставляет агента прочитать схему базы и проверить колонки с типами до того, как он напишет запрос или миграцию. CX Codex +1 302установок session-management Скилл ведёт файлы состояния, решений и ориентиров в коде, чтобы работа продолжалась с того же места после перерыва или упора в лимит контекста. CX Codex +1 301установок

Другие версии typescript

Похожие

typescript-pro https://github.com/Jeffallan Настраивает строгую типизацию TypeScript, генерирует брендированные типы и связывает tRPC. Пригодится при проектировании надёжных API и сложных generic-структур. CX Codex +1 14 200установок typescript-discriminated-unions mkosir Скилл учит ИИ-агента применять дискриминированные объединения в TypeScript для взаимоисключающих состояний и проверять исчерпывающий switch через ESLint. CX Codex +1 3 800установок ui5-typescript-conversion cline Скилл ведёт проект SAPUI5 или OpenUI5 через перевод на TypeScript: настройка сборки, типы, сам код. Пригодится, когда JS-проект пора типизировать. CX Codex +1 910установок typescript-core bobmatnyc Скилл с современными паттернами TypeScript: строгий tsconfig, валидация данных во время выполнения, продвинутые типы. Пригодится, когда проект на TS растёт и типы перестают спасать. CX Codex +1 475установок fastify-typescript Mindrally Задаёт агенту соглашения по Fastify и TypeScript: схемы валидации, плагины, Prisma и тесты через Jest. Пригодится, когда пишете типизированный REST API. CX Codex +1 856установок

Рядом в теме «Языки программирования»

Все скиллы по теме «Языки программирования» →

Вопросы о typescript

Как установить скилл typescript в Claude?

Выполните npx skills add alinaqi/maggy --skill typescript -a claude-code. Файл скилла окажется в ~/.claude/skills/typescript/SKILL.md.

Что делает скилл typescript?

Он подсказывает агенту, как писать и проверять код на TypeScript: строгий tsconfig, конфиг ESLint, тесты на Jest, структура каталогов и pre-commit хуки.

Когда скилл срабатывает?

Он привязан к путям **/*.ts, **/*.tsx и tsconfig*.json и включается, когда агент работает с такими файлами. Вручную его не вызывают.

Исходный текст

SKILL.md · MIT
---
name: typescript
description: TypeScript strict mode with eslint and jest
when-to-use: When working on TypeScript files
user-invocable: false
paths: ["**/*.ts", "**/*.tsx", "tsconfig*.json"]
effort: medium
---

# TypeScript Skill


---

## Strict Mode (Non-Negotiable)

```json
// tsconfig.json
{
  "compilerOptions": {
    "strict": true,
    "noImplicitAny": true,
    "strictNullChecks": true,
    "noUnusedLocals": true,
    "noUnusedParameters": true,
    "noImplicitReturns": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true
  }
}
```

---

## Project Structure

```
project/
├── src/
│   ├── core/               # Pure business logic
│   │   ├── types.ts        # Domain types/interfaces
│   │   ├── services/       # Pure functions
│   │   └── index.ts        # Public API
│   ├── infra/              # Side effects
│   │   ├── api/            # HTTP handlers
│   │   ├── db/             # Database operations
│   │   └── external/       # Third-party integrations
│   └── utils/              # Shared utilities
├── tests/
│   ├── unit/
│   └── integration/
├── package.json
├── tsconfig.json
└── CLAUDE.md
```

---

## Tooling (Required)

```json
// package.json scripts
{
  "scripts": {
    "lint": "eslint src/ --ext .ts,.tsx",
    "typecheck": "tsc --noEmit",
    "test": "jest",
    "test:coverage": "jest --coverage",
    "format": "prettier --write 'src/**/*.ts'"
  }
}
```

```javascript
// eslint.config.js
import eslint from '@eslint/js';
import tseslint from 'typescript-eslint';

export default tseslint.config(
  eslint.configs.recommended,
  ...tseslint.configs.strictTypeChecked,
  {
    rules: {
      '@typescript-eslint/no-explicit-any': 'error',
      '@typescript-eslint/explicit-function-return-type': 'error',
      'max-lines-per-function': ['error', 20],
      'max-depth': ['error', 2],
      'max-params': ['error', 3],
    }
  }
);
```

---

## Testing with Jest

```typescript
// tests/unit/services/user.test.ts
import { calculateTotal } from '../../../src/core/services/pricing';

describe('calculateTotal', () => {
  it('returns sum of item prices', () => {
    // Arrange
    const items = [{ price: 10 }, { price: 20 }];

    // Act
    const result = calculateTotal(items);

    // Assert
    expect(result).toBe(30);
  });

  it('returns zero for empty array', () => {
    expect(calculateTotal([])).toBe(0);
  });

  it('throws on invalid item', () => {
    expect(() => calculateTotal([{ invalid: 'item' }])).toThrow();
  });
});
```

---

## GitHub Actions

```yaml
name: TypeScript Quality Gate

on: [push, pull_request]

jobs:
  quality:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          
      - name: Install dependencies
        run: npm ci
        
      - name: Lint
        run: npm run lint
        
      - name: Type Check
        run: npm run typecheck
        
      - name: Test with Coverage
        run: npm run test:coverage
        
      - name: Coverage Threshold (80%)
        run: npm run test:coverage -- --coverageThreshold='{"global":{"branches":80,"functions":80,"lines":80,"statements":80}}'
```

---

## Pre-Commit Hooks

Using Husky + lint-staged:

```bash
npm install -D husky lint-staged
npx husky init
```

```json
// package.json
{
  "lint-staged": {
    "*.{ts,tsx}": [
      "eslint --fix",
      "prettier --write"
    ]
  }
}
```

```bash
# .husky/pre-commit
npx lint-staged
npx tsc --noEmit
npm run test -- --onlyChanged --passWithNoTests
```

This runs on every commit:
1. ESLint + Prettier on staged files
2. Type check entire project
3. Tests for changed files only

---

## Type Patterns

### Discriminated Unions for Results
```typescript
type Result<T> =
  | { ok: true; value: T }
  | { ok: false; error: string };

function parseUser(data: unknown): Result<User> {
  // Type-safe error handling without exceptions
}
```

### Branded Types for IDs
```typescript
type UserId = string & { readonly brand: unique symbol };
type OrderId = string & { readonly brand: unique symbol };

// Can't accidentally pass UserId where OrderId expected
function getOrder(orderId: OrderId): Order { ... }
```

### Const Assertions for Literals
```typescript
const STATUSES = ['pending', 'active', 'closed'] as const;
type Status = typeof STATUSES[number]; // 'pending' | 'active' | 'closed'
```

### Zod for Runtime Validation
```typescript
import { z } from 'zod';

const UserSchema = z.object({
  email: z.string().email(),
  name: z.string().min(1).max(100),
});

type User = z.infer<typeof UserSchema>;
```

---

## TypeScript Anti-Patterns

- ❌ `any` type - use `unknown` and narrow
- ❌ Type assertions (`as`) - use type guards
- ❌ Non-null assertions (`!`) - handle null explicitly
- ❌ `@ts-ignore` without explanation
- ❌ Enums - use const objects or union types
- ❌ Classes for data - use interfaces/types
- ❌ Default exports - use named exports

© alinaqi · MIT · alinaqi/maggy

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой