К основному содержанию
скилл Claude Code CX Codex Cursor GitHub Copilot

zod-4 — скилл для Claude Code: что делает и как установить

Скилл обучает ассистента правилам валидации Zod 4 и миграции со старых версий. Он нужен при создании схем для форм, парсинга запросов и адаптеров.

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

Что делает zod-4

Скилл содержит паттерны валидации для Zod 4 и правила перехода с Zod 3. Главное изменение касается вызова базовых валидаторов: функции z.email(), z.uuid() и z.url() стали верхнеуровневыми методами, а не цепочками от z.string(). Если скопировать старый синтаксис вроде z.string().email(), валидация упадёт с ошибкой.

Внутри собраны примеры для примитивов, записей z.record() и дискриминированных объединений. В Zod 4 изменился синтаксис ошибок. Вместо параметра message используется error, принимающий строку или функцию вида (issue) => .... Скилл также описывает приведение типов через z.coerce и валидацию через superRefine.

Инструкции включают интеграцию с react-hook-form через @hookform/resolvers/zod. Ассистент применяет эти паттерны при генерации типов через z.infer, разборе полезной нагрузки API и валидации полей формы.

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

  • Переписать схемы Zod 3 под синтаксис Zod 4
  • Настроить валидацию формы в React с помощью @hookform/resolvers/zod
  • Создать схему с приведением типов через z.coerce
  • Добавить составную проверку полей через superRefine

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

  • Обнови схему пользователя с Zod 3 на Zod 4, замени z.string().email() на новый синтаксис
  • Напиши схему для формы с валидацией пароля через superRefine и свяжи с react-hook-form
  • Создай дискриминированное объединение для ответа API со статусами success и error

Как установить zod-4

1Через Skills CLI (Vercel)

npx skills add prowler-cloud/prowler --skill zod-4 -a claude-code

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

~/.claude/skills/zod-4/SKILL.md

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

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

Весь набор →

Похожие

vue-expert https://github.com/Jeffallan Помогает писать Vue 3 код на Composition API, настраивать Nuxt 3, Pinia и Vite. Пригодится для компонентов, PWA и гибридных приложений. Claude Code CX Codex Cursor +1 4 500установок telegram-mini-app sickn33 Скилл для разработки Telegram Mini Apps — веб-приложений, которые работают внутри Telegram с опытом, близким к нативным. Охватывает TON, Telegram Web App API, аутентификацию и монетизацию через Stars. Claude Code CX Codex Cursor +1 1 700установок sprites-and-images phaserjs Помогает создавать и настраивать объекты Sprite и Image в Phaser 4. Подсказывает правильные методы миксинов для позиционирования, масштабирования, кадров и обрезки текстур. Claude Code CX Codex Cursor +1 1 100установок html-diagram plannotator Генерирует автономные интерактивные HTML-диаграммы без сторонних сервисов и сборки. Пригодится, когда нужно визуализировать топологию, состояния, таймлайн или архитектуру проекта. Claude Code CX Codex Cursor +1 4 100установок zustand vercel-labs Скилл интегрирует Zustand в json-render для синхронизации состояния приложения. Пригодится, если в проекте уже используется Zustand и нужно связать его с компонентами, которые рендерит json-render. Claude Code CX Codex Cursor +1 1 900установок tailwind-design-system sickn33 Скилл задаёт агенту рамки работы с Tailwind: токены, варианты компонентов, адаптивные паттерны и доступность. Пригодится, когда UI в проекте разъезжается. Claude Code CX Codex Cursor +1 1 600установок frontend-design официальный anthropics Скилл задаёт осмысленное визуальное направление для новых интерфейсов и редизайна. Подойдёт, когда стандартный шаблонный UI не устраивает. Claude Code Claude.ai 1 025 790установок design-taste-frontend Leonxlnx Скилл задаёт арт-дирекцию для публичных страниц и рабочих экранов, а затем проверяет результат в браузере по скриншотам. Нужен, когда интерфейс выглядит шаблонным или недоработанным. Claude Code CX Codex Cursor +1 673 100установок

Вопросы о zod-4

Как установить zod-4 в Claude Code?

Выполните команду npx skills add prowler-cloud/prowler --skill zod-4 -a claude-code.

Что делает скилл zod-4?

Он передаёт ИИ-ассистенту правила синтаксиса Zod 4, включая новые верхнеуровневые валидаторы, работу с safeParse и связку с react-hook-form.

Чем валидация строк в Zod 4 отличается от Zod 3?

Методы email(), uuid() и url() больше не вызываются через цепочку от z.string(), а стали отдельными функциями вроде z.email(). Для проверки непустой строки вместо .nonempty() теперь используется .min(1).

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

SKILL.md · Apache-2.0
---
name: zod-4
description: >
  Zod 4 schema validation patterns.
  Trigger: When creating or updating Zod v4 schemas for validation/parsing (forms, request payloads, adapters), including v3 -> v4 migration patterns.
license: Apache-2.0
metadata:
  author: prowler-cloud
  version: "1.0"
  scope: [root, ui]
  auto_invoke: "Creating Zod schemas"
allowed-tools: Read, Edit, Write, Glob, Grep, Bash, WebFetch, WebSearch, Task
---

## Breaking Changes from Zod 3

```typescript
// ❌ Zod 3 (OLD)
z.string().email()
z.string().uuid()
z.string().url()
z.string().nonempty()
z.object({ name: z.string() }).required_error("Required")

// ✅ Zod 4 (NEW)
z.email()
z.uuid()
z.url()
z.string().min(1)
z.object({ name: z.string() }, { error: "Required" })
```

## Basic Schemas

```typescript
import { z } from "zod";

// Primitives
const stringSchema = z.string();
const numberSchema = z.number();
const booleanSchema = z.boolean();
const dateSchema = z.date();

// Top-level validators (Zod 4)
const emailSchema = z.email();
const uuidSchema = z.uuid();
const urlSchema = z.url();

// With constraints
const nameSchema = z.string().min(1).max(100);
const ageSchema = z.number().int().positive().max(150);
const priceSchema = z.number().min(0).multipleOf(0.01);
```

## Object Schemas

```typescript
const userSchema = z.object({
  id: z.uuid(),
  email: z.email({ error: "Invalid email address" }),
  name: z.string().min(1, { error: "Name is required" }),
  age: z.number().int().positive().optional(),
  role: z.enum(["admin", "user", "guest"]),
  metadata: z.record(z.string(), z.unknown()).optional(),
});

type User = z.infer<typeof userSchema>;

// Parsing
const user = userSchema.parse(data);  // Throws on error
const result = userSchema.safeParse(data);  // Returns { success, data/error }

if (result.success) {
  console.log(result.data);
} else {
  console.log(result.error.issues);
}
```

## Arrays and Records

```typescript
// Arrays
const tagsSchema = z.array(z.string()).min(1).max(10);
const numbersSchema = z.array(z.number()).nonempty();

// Records (objects with dynamic keys)
const scoresSchema = z.record(z.string(), z.number());
// { [key: string]: number }

// Tuples
const coordinatesSchema = z.tuple([z.number(), z.number()]);
// [number, number]
```

## Unions and Discriminated Unions

```typescript
// Simple union
const stringOrNumber = z.union([z.string(), z.number()]);

// Discriminated union (more efficient)
const resultSchema = z.discriminatedUnion("status", [
  z.object({ status: z.literal("success"), data: z.unknown() }),
  z.object({ status: z.literal("error"), error: z.string() }),
]);
```

## Transformations

```typescript
// Transform during parsing
const lowercaseEmail = z.email().transform(email => email.toLowerCase());

// Coercion (convert types)
const numberFromString = z.coerce.number();  // "42" → 42
const dateFromString = z.coerce.date();      // "2024-01-01" → Date

// Preprocessing
const trimmedString = z.preprocess(
  val => typeof val === "string" ? val.trim() : val,
  z.string()
);
```

## Refinements

```typescript
const passwordSchema = z.string()
  .min(8)
  .refine(val => /[A-Z]/.test(val), {
    message: "Must contain uppercase letter",
  })
  .refine(val => /[0-9]/.test(val), {
    message: "Must contain number",
  });

// With superRefine for multiple errors
const formSchema = z.object({
  password: z.string(),
  confirmPassword: z.string(),
}).superRefine((data, ctx) => {
  if (data.password !== data.confirmPassword) {
    ctx.addIssue({
      code: z.ZodIssueCode.custom,
      message: "Passwords don't match",
      path: ["confirmPassword"],
    });
  }
});
```

## Optional and Nullable

```typescript
// Optional (T | undefined)
z.string().optional()

// Nullable (T | null)
z.string().nullable()

// Both (T | null | undefined)
z.string().nullish()

// Default values
z.string().default("unknown")
z.number().default(() => Math.random())
```

## Error Handling

```typescript
// Zod 4: Use 'error' param instead of 'message'
const schema = z.object({
  name: z.string({ error: "Name must be a string" }),
  email: z.email({ error: "Invalid email format" }),
  age: z.number().min(18, { error: "Must be 18 or older" }),
});

// Custom error map
const customSchema = z.string({
  error: (issue) => {
    if (issue.code === "too_small") {
      return "String is too short";
    }
    return "Invalid string";
  },
});
```

## React Hook Form Integration

```typescript
import { useForm } from "react-hook-form";
import { zodResolver } from "@hookform/resolvers/zod";

const schema = z.object({
  email: z.email(),
  password: z.string().min(8),
});

type FormData = z.infer<typeof schema>;

function Form() {
  const { register, handleSubmit, formState: { errors } } = useForm<FormData>({
    resolver: zodResolver(schema),
  });

  return (
    <form onSubmit={handleSubmit(onSubmit)}>
      <input {...register("email")} />
      {errors.email && <span>{errors.email.message}</span>}
    </form>
  );
}
```

© prowler-cloud · Apache-2.0 · prowler-cloud/prowler

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

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

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