Agent Skills by ALSEL
Anthropic ClaudeLLM・AI開発⭐ リポ 0品質スコア 50/100

zod-validation-utilities

Zod v4 を使った再利用可能なスキーマの作成、APIペイロード・フォーム・設定入力のバリデーション、安全なデータ変換・型強制、TypeScriptアプリケーション向けの強力な型推論を伴うバリデーションエラー処理を行います。バリデーション層の設計、`z.string()`・`z.object()`・`z.email()` などのスキーマ定義、実行時の型安全なデータバリデーションの実装時に活用してください。

description の原文を見る

Creates reusable Zod v4 schemas, validates API payloads, forms, and configuration input, transforms and coerces data safely, and handles validation errors with strong type inference for TypeScript applications. Use when designing validation layers, parsing `z.string()`, `z.object()`, or `z.email()` schemas, or implementing runtime type-safe data validation.

SKILL.md 本文

Zod Validation Utilities

概要

本番環境対応の Zod v4 パターンで、最小限のボイラープレートで再利用可能で型安全な検証を実現します。最新の API、予測可能なエラーハンドリング、フォーム統合に焦点を当てています。

使用する場合

  • TypeScript サービスでリクエスト/レスポンス検証スキーマを定義する場合
  • API、フォーム、環境変数、外部システムからの信頼できない入力をパースする場合
  • 型強制、変換、クロスフィールド検証を標準化する場合
  • チーム全体で再利用可能なスキーマユーティリティを構築する場合
  • React Hook Form を Zod と統合する場合(zodResolver を使用)

手順

  1. 厳密なオブジェクトスキーマから始め、明示的なフィールド制約を指定する
  2. 最新の Zod v4 API とエラーメッセージ用の error オプションを優先する
  3. 入力型が不確実な場合、境界で型強制を使用する(z.coerce.*
  4. ビジネスルール検証を refine/superRefine でスキーマ定義の近くに保つ
  5. スキーマと推論型の両方をエクスポートする(z.input/z.output)一貫性のため
  6. ユーティリティスキーマ(メール、ID、日付、ページネーション)を再利用して重複を削減する

検証ワークフロー

検証を API ハンドラーまたはサービスに統合する場合:

  1. 定義 スキーマを境界で定義する(ハンドラー、キュー、設定ローダー)
  2. パース safeParse でエラーを適切に処理する
  3. 確認 result.success で失敗/成功を分岐する
  4. 使用 成功パスで result.data を完全な型推論で使用する
  5. 返却 フォーマットされたエラーを返すか、検証済みデータで進める

完全なパターンについてはサンプル 7 (safeParse ワークフロー)を参照してください。

サンプル

1) 最新の Zod v4 プリミティブとオブジェクトエラー

import { z } from "zod";

export const UserIdSchema = z.uuid({ error: "Invalid user id" });
export const EmailSchema = z.email({ error: "Invalid email" });
export const WebsiteSchema = z.url({ error: "Invalid URL" });

export const UserProfileSchema = z.object(
  {
    id: UserIdSchema,
    email: EmailSchema,
    website: WebsiteSchema.optional(),
  },
  { error: "Invalid user profile payload" }
);

2) 型強制、前処理、変換

import { z } from "zod";

export const PaginationQuerySchema = z.object({
  page: z.coerce.number().int().min(1).default(1),
  pageSize: z.coerce.number().int().min(1).max(100).default(20),
  includeArchived: z.coerce.boolean().default(false),
});

export const DateFromUnknownSchema = z.preprocess(
  (value) => (typeof value === "string" || value instanceof Date ? value : undefined),
  z.coerce.date({ error: "Invalid date" })
);

export const NormalizedEmailSchema = z
  .string()
  .trim()
  .toLowerCase()
  .email({ error: "Invalid email" })
  .transform((value) => value as Lowercase<string>);

3) 複雑なスキーマ構造

import { z } from "zod";

const TagSchema = z.string().trim().min(1).max(40);

export const ProductSchema = z.object({
  sku: z.string().min(3).max(24),
  tags: z.array(TagSchema).max(15),
  attributes: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])),
  dimensions: z.tuple([z.number().positive(), z.number().positive(), z.number().positive()]),
});

export const PaymentMethodSchema = z.discriminatedUnion("type", [
  z.object({ type: z.literal("card"), last4: z.string().regex(/^\d{4}$/) }),
  z.object({ type: z.literal("paypal"), email: z.email() }),
  z.object({ type: z.literal("wire"), iban: z.string().min(10) }),
]);

4) refinesuperRefine

import { z } from "zod";

export const PasswordSchema = z
  .string()
  .min(12)
  .refine((v) => /[A-Z]/.test(v), { error: "Must include an uppercase letter" })
  .refine((v) => /\d/.test(v), { error: "Must include a number" });

export const RegisterSchema = z
  .object({
    email: z.email(),
    password: PasswordSchema,
    confirmPassword: z.string(),
  })
  .superRefine((data, ctx) => {
    if (data.password !== data.confirmPassword) {
      ctx.addIssue({
        code: "custom",
        path: ["confirmPassword"],
        message: "Passwords do not match",
      });
    }
  });

5) オプション、nullable、nullish、デフォルト値

import { z } from "zod";

export const UserPreferencesSchema = z.object({
  nickname: z.string().min(2).optional(),      // undefined を許可
  bio: z.string().max(280).nullable(),         // null を許可
  avatarUrl: z.url().nullish(),                // null または undefined を許可
  locale: z.string().default("en"),           // 不在時のフォールバック
});

6) React Hook Form 統合(zodResolver

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

const ProfileFormSchema = z.object({
  name: z.string().min(2, { error: "Name too short" }),
  email: z.email({ error: "Invalid email" }),
  age: z.coerce.number().int().min(18),
});

type ProfileFormInput = z.input<typeof ProfileFormSchema>;
type ProfileFormOutput = z.output<typeof ProfileFormSchema>;

const form = useForm<ProfileFormInput, unknown, ProfileFormOutput>({
  resolver: zodResolver(ProfileFormSchema),
  criteriaMode: "all",
});

7) safeParse を用いたエラーハンドリングワークフロー

import { z } from "zod";
import type { ZodError } from "zod";

const ResultSchema = z.object({ id: z.string(), name: z.string() });

function parseAndHandle(input: unknown) {
  const result = ResultSchema.safeParse(input);

  if (!result.success) {
    const error = result.error as ZodError;
    console.error("Validation failed:", error.errors);
    return { success: false as const, error: error.format() };
  }

  return { success: true as const, data: result.data };
}

ヒント: 高度な discriminated union パターンと複雑な React Hook Form ワークフローについては、references/advanced-patterns.md を参照してください。

ベストプラクティス

  • スキーマを境界の近くに保つ(HTTP ハンドラー、キュー、設定ローダー)
  • 回復可能なフローには safeParse を、fail-fast 実行には parse を優先する
  • 小さなスキーマユーティリティ(ID、メール、スラッグ)を共有して一貫性を強制する
  • 変換/型強制が実行時の形状を変更する場合、z.inputz.output を使用する
  • preprocess の過度な使用を避け、可能な限り明示的な z.coerce.* を優先する
  • 外部ペイロードを信頼されていないものとして扱い、使用前に必ず検証する

制約と警告

  • サンプルがインストール済みの zod メジャーバージョン(v4 API を表示)と一致することを確認する
  • error は Zod v4 パターンではカスタムエラー用の推奨オプション
  • Discriminated union には、バリアント全体で安定した discriminator キーが必要
  • 型強制は悪い上流データを隠す可能性があるため、防御的に境界値と refinement を追加する

ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ

詳細情報

作者
giuseppe-trisciuoglio
リポジトリ
giuseppe-trisciuoglio/developer-kit
ライセンス
MIT
最終更新
不明

Source: https://github.com/giuseppe-trisciuoglio/developer-kit / ライセンス: MIT

関連スキル

OpenAILLM・AI開発⭐ リポ 6,054

agent-browser

AI エージェント向けのブラウザ自動化 CLI です。ウェブサイトとの対話が必要な場合に使用します。ページ遷移、フォーム入力、ボタンクリック、スクリーンショット取得、データ抽出、ウェブアプリのテスト、ブラウザ操作の自動化など、あらゆるブラウザタスクに対応できます。「ウェブサイトを開く」「フォームに記入する」「ボタンをクリックする」「スクリーンショットを取得する」「ページからデータを抽出する」「このウェブアプリをテストする」「サイトにログインする」「ブラウザ操作を自動化する」といった要求や、プログラマティックなウェブ操作が必要なタスクで起動します。

by JimmyLv
汎用LLM・AI開発⭐ リポ 1,982

anyskill

AnySkill — あなたのプライベート・スキルクラウド。GitHubを基盤としたリポジトリからエージェントスキルを管理、同期、動的にロードできます。自然言語でクラウドスキルを検索し、オンデマンドでプロンプトを自動ロード、カスタムスキルのアップロードと共有、スキルバンドルの一括インストールが可能です。OpenClaw、Antigravity、Claude Code、Cursorに対応しています。

by LeoYeAI
汎用LLM・AI開発⭐ リポ 1,982

engram

AIエージェント向けの永続的なメモリシステムです。バグ修正、意思決定、発見、設定変更の後はmem_saveを使用してください。ユーザーが「覚えている」「記憶している」と言及した場合、または以前のセッションと重複する作業を開始する際はmem_searchを使用します。セッション終了前にmem_session_summaryを使用して、コンテキストを保持してください。

by LeoYeAI
汎用LLM・AI開発⭐ リポ 21,584

skyvern

AI駆動のブラウザ自動化により、任意のウェブサイトを自動化できます。フォーム入力、データ抽出、ファイルダウンロード、ログイン、複数ステップのワークフロー実行など、ユーザーがウェブサイトと連携する必要があるときに使用します。Skyvernは、LLMとコンピュータビジョンを活用して、未知のサイトも自動操作可能です。Python SDK、TypeScript SDK、REST API、MCPサーバー、またはCLIを通じて統合できます。

by Skyvern-AI
汎用LLM・AI開発⭐ リポ 1,149

pinchbench

PinchBenchベンチマークを実行して、OpenClawエージェントの実世界タスクにおけるパフォーマンスを評価できます。モデルの機能テスト、モデル間の比較、ベンチマーク結果のリーダーボード提出、またはOpenClawのセットアップがカレンダー、メール、リサーチ、コーディング、複数ステップのワークフローにどの程度対応しているかを確認する際に使用します。

by pinchbench
汎用LLM・AI開発⭐ リポ 4,693

openui

OpenUIとOpenUI Langを使用してジェネレーティブUIアプリを構築できます。これらはLLM生成インターフェースのためのトークン効率的なオープン標準です。OpenUI、@openuidev、ジェネレーティブUI、LLMからのストリーミングUI、AI向けコンポーネントライブラリ、またはjson-render/A2UIの置き換えについて述べる際に使用します。スキャフォルディング、defineComponent、システムプロンプト、Renderer、およびOpenUI Lang出力のデバッグに対応しています。

by thesysdev
本サイトは GitHub 上で公開されているオープンソースの SKILL.md ファイルをクロール・インデックス化したものです。 各スキルの著作権は原作者に帰属します。掲載に問題がある場合は info@alsel.co.jp または /takedown フォームよりご連絡ください。
原作者: giuseppe-trisciuoglio · giuseppe-trisciuoglio/developer-kit · ライセンス: MIT