[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6GDRCKQBAVTGHX5XBH26KPZ":3,"skill-same:01M6GDRCKQBAVTGHX5XBH26KPZ":72},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":50,"commitSha":51,"skillDirectory":52,"forksCount":53,"repositoryHtmlUrl":54,"repositoryHomepageUrl":54,"ownerHtmlUrl":55,"ownerBlogUrl":6,"ownerDescription":56,"updatedAt":57,"install":58,"resources":71},"01M6GDRCKQBAVTGHX5XBH26KPZ","zod-validation-expert",null,"Expert in Zod — TypeScript-first schema validation. Covers parsing, custom errors, refinements, type inference, and integration with React Hook Form, Next.js, and tRPC.","Sam-06060\u002Fjarvis-assistant","Sam-06060","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F208600848?v=4","01M6CRKT7C7FXD21V6HXF293S0","Samson Frank Ganta","01M6CRKTBEKYFD8YX5Z1GT99EE",6,"Apache-2.0","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzod-validation-expert\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"validation","zod validation expert","zod","expert","community","schema validation","react hook form","errors","hook","with","trpc","form","type","next","safe","schema","Next.js","parsing","react","typescript","2026-11-10 10:12:30",false,"---\nname: zod-validation-expert\ndescription: \"Expert in Zod — TypeScript-first schema validation. Covers parsing, custom errors, refinements, type inference, and integration with React Hook Form, Next.js, and tRPC.\"\nrisk: safe\nsource: community\ndate_added: \"2026-03-05\"\n---\n\n# Zod Validation Expert\n\nYou are a production-grade Zod expert. You help developers build type-safe schema definitions and validation logic. You master Zod fundamentals (primitives, objects, arrays, records), type inference (`z.infer`), complex validations (`.refine`, `.superRefine`), transformations (`.transform`), and integrations across the modern TypeScript ecosystem (React Hook Form, Next.js API Routes \u002F App Router Actions, tRPC, and environment variables).\n\n## When to Use This Skill\n\n- Use when defining TypeScript validation schemas for API inputs or forms\n- Use when setting up environment variable validation (`process.env`)\n- Use when integrating Zod with React Hook Form (`@hookform\u002Fresolvers\u002Fzod`)\n- Use when extracting or inferring TypeScript types from runtime validation schemas\n- Use when writing complex validation rules (e.g., cross-field validation, async validation)\n- Use when transforming input data (e.g., string to Date, string to number coercion)\n- Use when standardizing error message formatting\n\n## Core Concepts\n\n### Why Zod?\n\nZod eliminates the duplication of writing a TypeScript interface *and* a runtime validation schema. You define the schema once, and Zod infers the static TypeScript type. Note that Zod is for **parsing, not just validation**. `safeParse` and `parse` return clean, typed data, stripping out unknown keys by default.\n\n## Schema Definition & Inference\n\n### Primitives & Coercion\n\n```typescript\nimport { z } from \"zod\";\n\n\u002F\u002F Basic primitives\nconst stringSchema = z.string().min(3).max(255);\nconst numberSchema = z.number().int().positive();\nconst dateSchema = z.date();\n\n\u002F\u002F Coercion (automatically casting inputs before validation)\n\u002F\u002F Highly useful for FormData in Next.js Server Actions or URL queries\nconst ageSchema = z.coerce.number().min(18); \u002F\u002F \"18\" -> 18\nconst activeSchema = z.coerce.boolean(); \u002F\u002F \"true\" -> true\nconst dobSchema = z.coerce.date(); \u002F\u002F \"2020-01-01\" -> Date object\n```\n\n### Objects & Type Inference\n\n```typescript\nconst UserSchema = z.object({\n  id: z.string().uuid(),\n  username: z.string().min(3).max(20),\n  email: z.string().email(),\n  role: z.enum([\"ADMIN\", \"USER\", \"GUEST\"]).default(\"USER\"),\n  age: z.number().min(18).optional(), \u002F\u002F Can be omitted\n  website: z.string().url().nullable(), \u002F\u002F Can be null\n  tags: z.array(z.string()).min(1), \u002F\u002F Array with at least 1 item\n});\n\n\u002F\u002F Infer the TypeScript type directly from the schema\n\u002F\u002F No need to write a separate `interface User { ... }`\nexport type User = z.infer\u003Ctypeof UserSchema>;\n```\n\n### Advanced Types\n\n```typescript\n\u002F\u002F Records (Objects with dynamic keys but specific value types)\nconst envSchema = z.record(z.string(), z.string()); \u002F\u002F Record\u003Cstring, string>\n\n\u002F\u002F Unions (OR)\nconst idSchema = z.union([z.string(), z.number()]); \u002F\u002F string | number\n\u002F\u002F Or simpler:\nconst idSchema2 = z.string().or(z.number());\n\n\u002F\u002F Discriminated Unions (Type-safe switch cases)\nconst ActionSchema = z.discriminatedUnion(\"type\", [\n  z.object({ type: z.literal(\"create\"), id: z.string() }),\n  z.object({ type: z.literal(\"update\"), id: z.string(), data: z.any() }),\n  z.object({ type: z.literal(\"delete\"), id: z.string() }),\n]);\n```\n\n## Parsing & Validation\n\n### parse vs safeParse\n\n```typescript\nconst schema = z.string().email();\n\n\u002F\u002F ❌ parse: Throws a ZodError if validation fails\ntry {\n  const email = schema.parse(\"invalid-email\");\n} catch (err) {\n  if (err instanceof z.ZodError) {\n    console.error(err.issues);\n  }\n}\n\n\u002F\u002F ✅ safeParse: Returns a result object (No try\u002Fcatch needed)\nconst result = schema.safeParse(\"user@example.com\");\n\nif (!result.success) {\n  \u002F\u002F TypeScript narrows result to SafeParseError\n  console.log(result.error.format()); \n  \u002F\u002F Early return or throw domain error\n} else {\n  \u002F\u002F TypeScript narrows result to SafeParseSuccess\n  const validEmail = result.data; \u002F\u002F Type is `string`\n}\n```\n\n## Customizing Validation\n\n### Custom Error Messages\n\n```typescript\nconst passwordSchema = z.string()\n  .min(8, { message: \"Password must be at least 8 characters long\" })\n  .max(100, { message: \"Password is too long\" })\n  .regex(\u002F[A-Z]\u002F, { message: \"Password must contain at least one uppercase letter\" })\n  .regex(\u002F[0-9]\u002F, { message: \"Password must contain at least one number\" });\n\n\u002F\u002F Global custom error map (useful for i18n)\nz.setErrorMap((issue, ctx) => {\n  if (issue.code === z.ZodIssueCode.invalid_type) {\n    if (issue.expected === \"string\") return { message: \"This field must be text\" };\n  }\n  return { message: ctx.defaultError };\n});\n```\n\n### Refinements (Custom Logic)\n\n```typescript\n\u002F\u002F Basic refinement\nconst passwordCheck = z.string().refine((val) => val !== \"password123\", {\n  message: \"Password is too weak\",\n});\n\n\u002F\u002F Cross-field validation (e.g., password matching)\nconst formSchema = z.object({\n  password: z.string().min(8),\n  confirmPassword: z.string()\n}).refine((data) => data.password === data.confirmPassword, {\n  message: \"Passwords don't match\",\n  path: [\"confirmPassword\"], \u002F\u002F Sets the error on the specific field\n});\n```\n\n### Transformations\n\n```typescript\n\u002F\u002F Change data during parsing\nconst stringToNumber = z.string()\n  .transform((val) => parseInt(val, 10))\n  .refine((val) => !isNaN(val), { message: \"Not a valid integer\" });\n\n\u002F\u002F Now the inferred type is `number`, not `string`!\ntype TransformedResult = z.infer\u003Ctypeof stringToNumber>; \u002F\u002F number\n```\n\n## Integration Patterns\n\n### React Hook Form\n\n```typescript\nimport { useForm } from \"react-hook-form\";\nimport { zodResolver } from \"@hookform\u002Fresolvers\u002Fzod\";\nimport { z } from \"zod\";\n\nconst loginSchema = z.object({\n  email: z.string().email(\"Invalid email address\"),\n  password: z.string().min(6, \"Password must be 6+ characters\"),\n});\n\ntype LoginFormValues = z.infer\u003Ctypeof loginSchema>;\n\nexport function LoginForm() {\n  const { register, handleSubmit, formState: { errors } } = useForm\u003CLoginFormValues>({\n    resolver: zodResolver(loginSchema)\n  });\n\n  const onSubmit = (data: LoginFormValues) => {\n    \u002F\u002F data is fully typed and validated\n    console.log(data.email, data.password);\n  };\n\n  return (\n    \u003Cform onSubmit={handleSubmit(onSubmit)}>\n      \u003Cinput {...register(\"email\")} \u002F>\n      {errors.email && \u003Cspan>{errors.email.message}\u003C\u002Fspan>}\n      {\u002F* ... *\u002F}\n    \u003C\u002Fform>\n  );\n}\n```\n\n### Next.js Server Actions\n\n```typescript\n\"use server\";\nimport { z } from \"zod\";\n\n\u002F\u002F Coercion is critical here because FormData values are always strings\nconst createPostSchema = z.object({\n  title: z.string().min(3),\n  content: z.string().optional(),\n  published: z.coerce.boolean().default(false), \u002F\u002F checkbox -> \"on\" -> true\n});\n\nexport async function createPost(prevState: any, formData: FormData) {\n  \u002F\u002F Convert FormData to standard object using Object.fromEntries\n  const rawData = Object.fromEntries(formData.entries());\n  \n  const validatedFields = createPostSchema.safeParse(rawData);\n  \n  if (!validatedFields.success) {\n    return {\n      errors: validatedFields.error.flatten().fieldErrors,\n    };\n  }\n  \n  \u002F\u002F Proceed with validated database operation\n  const { title, content, published } = validatedFields.data;\n  \u002F\u002F ...\n  return { success: true };\n}\n```\n\n### Environment Variables\n\n```typescript\n\u002F\u002F Make environment variables strictly typed and fail-fast\nimport { z } from \"zod\";\n\nconst envSchema = z.object({\n  DATABASE_URL: z.string().url(),\n  NODE_ENV: z.enum([\"development\", \"test\", \"production\"]).default(\"development\"),\n  PORT: z.coerce.number().default(3000),\n  API_KEY: z.string().min(10),\n});\n\n\u002F\u002F Fails the build immediately if env vars are missing or invalid\nconst env = envSchema.parse(process.env);\n\nexport default env;\n```\n\n## Best Practices\n\n- ✅ **Do:** Co-locate schemas alongside the components or API routes that use them to maintain separation of concerns.\n- ✅ **Do:** Use `z.infer\u003Ctypeof Schema>` everywhere instead of maintaining duplicate TypeScript interfaces manually.\n- ✅ **Do:** Prefer `safeParse` over `parse` to avoid scattered `try\u002Fcatch` blocks and leverage TypeScript's control flow narrowing for robust error handling.\n- ✅ **Do:** Use `z.coerce` when accepting data from `URLSearchParams` or `FormData`, and be aware that `z.coerce.boolean()` converts standard `\"false\"`\u002F`\"off\"` strings unexpectedly without custom preprocessing.\n- ✅ **Do:** Use `.flatten()` or `.format()` on `ZodError` objects to easily extract serializable, human-readable errors for frontend consumption.\n- ❌ **Don't:** Rely exclusively on `.partial()` for update schemas if field types or constraints differ between creation and update operations; define distinct schemas instead.\n- ❌ **Don't:** Forget to pass the `path` option in `.refine()` or `.superRefine()` when performing object-level cross-field validations, otherwise the error won't attach to the correct input field.\n\n## Troubleshooting\n\n**Problem:** `Type instantiation is excessively deep and possibly infinite.`\n**Solution:** This occurs with extreme schema recursion (e.g. deeply nested self-referential schemas). Use `z.lazy(() => NodeSchema)` for recursive structures and define the base TypeScript type explicitly instead of solely inferring it.\n\n**Problem:** Empty strings pass validation when using `.optional()`.\n**Solution:** `.optional()` permits `undefined`, not empty strings. If an empty string means \"no value,\" use `.or(z.literal(\"\"))` or preprocess it: `z.string().transform(v => v === \"\" ? undefined : v).optional()`.\n","# Zod Validation Expert\n\nYou are a production-grade Zod expert. You help developers build type-safe schema definitions and validation logic. You master Zod fundamentals (primitives, objects, arrays, records), type inference (`z.infer`), complex validations (`.refine`, `.superRefine`), transformations (`.transform`), and integrations across the modern TypeScript ecosystem (React Hook Form, Next.js API Routes \u002F App Router Actions, tRPC, and environment variables).\n\n## When to Use This Skill\n\n- Use when defining TypeScript validation schemas for API inputs or forms\n- Use when setting up environment variable validation (`process.env`)\n- Use when integrating Zod with React Hook Form (`@hookform\u002Fresolvers\u002Fzod`)\n- Use when extracting or inferring TypeScript types from runtime validation schemas\n- Use when writing complex validation rules (e.g., cross-field validation, async validation)\n- Use when transforming input data (e.g., string to Date, string to number coercion)\n- Use when standardizing error message formatting\n\n## Core Concepts\n\n### Why Zod?\n\nZod eliminates the duplication of writing a TypeScript interface *and* a runtime validation schema. You define the schema once, and Zod infers the static TypeScript type. Note that Zod is for **parsing, not just validation**. `safeParse` and `parse` return clean, typed data, stripping out unknown keys by default.\n\n## Schema Definition & Inference\n\n### Primitives & Coercion\n\n```typescript\nimport { z } from \"zod\";\n\n\u002F\u002F Basic primitives\nconst stringSchema = z.string().min(3).max(255);\nconst numberSchema = z.number().int().positive();\nconst dateSchema = z.date();\n\n\u002F\u002F Coercion (automatically casting inputs before validation)\n\u002F\u002F Highly useful for FormData in Next.js Server Actions or URL queries\nconst ageSchema = z.coerce.number().min(18); \u002F\u002F \"18\" -> 18\nconst activeSchema = z.coerce.boolean(); \u002F\u002F \"true\" -> true\nconst dobSchema = z.coerce.date(); \u002F\u002F \"2020-01-01\" -> Date object\n```\n\n### Objects & Type Inference\n\n```typescript\nconst UserSchema = z.object({\n  id: z.string().uuid(),\n  username: z.string().min(3).max(20),\n  email: z.string().email(),\n  role: z.enum([\"ADMIN\", \"USER\", \"GUEST\"]).default(\"USER\"),\n  age: z.number().min(18).optional(), \u002F\u002F Can be omitted\n  website: z.string().url().nullable(), \u002F\u002F Can be null\n  tags: z.array(z.string()).min(1), \u002F\u002F Array with at least 1 item\n});\n\n\u002F\u002F Infer the TypeScript type directly from the schema\n\u002F\u002F No need to write a separate `interface User { ... }`\nexport type User = z.infer\u003Ctypeof UserSchema>;\n```\n\n### Advanced Types\n\n```typescript\n\u002F\u002F Records (Objects with dynamic keys but specific value types)\nconst envSchema = z.record(z.string(), z.string()); \u002F\u002F Record\u003Cstring, string>\n\n\u002F\u002F Unions (OR)\nconst idSchema = z.union([z.string(), z.number()]); \u002F\u002F string | number\n\u002F\u002F Or simpler:\nconst idSchema2 = z.string().or(z.number());\n\n\u002F\u002F Discriminated Unions (Type-safe switch cases)\nconst ActionSchema = z.discriminatedUnion(\"type\", [\n  z.object({ type: z.literal(\"create\"), id: z.string() }),\n  z.object({ type: z.literal(\"update\"), id: z.string(), data: z.any() }),\n  z.object({ type: z.literal(\"delete\"), id: z.string() }),\n]);\n```\n\n## Parsing & Validation\n\n### parse vs safeParse\n\n```typescript\nconst schema = z.string().email();\n\n\u002F\u002F ❌ parse: Throws a ZodError if validation fails\ntry {\n  const email = schema.parse(\"invalid-email\");\n} catch (err) {\n  if (err instanceof z.ZodError) {\n    console.error(err.issues);\n  }\n}\n\n\u002F\u002F ✅ safeParse: Returns a result object (No try\u002Fcatch needed)\nconst result = schema.safeParse(\"user@example.com\");\n\nif (!result.success) {\n  \u002F\u002F TypeScript narrows result to SafeParseError\n  console.log(result.error.format()); \n  \u002F\u002F Early return or throw domain error\n} else {\n  \u002F\u002F TypeScript narrows result to SafeParseSuccess\n  const validEmail = result.data; \u002F\u002F Type is `string`\n}\n```\n\n## Customizing Validation\n\n### Custom Error Messages\n\n```typescript\nconst passwordSchema = z.string()\n  .min(8, { message: \"Password must be at least 8 characters long\" })\n  .max(100, { message: \"Password is too long\" })\n  .regex(\u002F[A-Z]\u002F, { message: \"Password must contain at least one uppercase letter\" })\n  .regex(\u002F[0-9]\u002F, { message: \"Password must contain at least one number\" });\n\n\u002F\u002F Global custom error map (useful for i18n)\nz.setErrorMap((issue, ctx) => {\n  if (issue.code === z.ZodIssueCode.invalid_type) {\n    if (issue.expected === \"string\") return { message: \"This field must be text\" };\n  }\n  return { message: ctx.defaultError };\n});\n```\n\n### Refinements (Custom Logic)\n\n```typescript\n\u002F\u002F Basic refinement\nconst passwordCheck = z.string().refine((val) => val !== \"password123\", {\n  message: \"Password is too weak\",\n});\n\n\u002F\u002F Cross-field validation (e.g., password matching)\nconst formSchema = z.object({\n  password: z.string().min(8),\n  confirmPassword: z.string()\n}).refine((data) => data.password === data.confirmPassword, {\n  message: \"Passwords don't match\",\n  path: [\"confirmPassword\"], \u002F\u002F Sets the error on the specific field\n});\n```\n\n### Transformations\n\n```typescript\n\u002F\u002F Change data during parsing\nconst stringToNumber = z.string()\n  .transform((val) => parseInt(val, 10))\n  .refine((val) => !isNaN(val), { message: \"Not a valid integer\" });\n\n\u002F\u002F Now the inferred type is `number`, not `string`!\ntype TransformedResult = z.infer\u003Ctypeof stringToNumber>; \u002F\u002F number\n```\n\n## Integration Patterns\n\n### React Hook Form\n\n```typescript\nimport { useForm } from \"react-hook-form\";\nimport { zodResolver } from \"@hookform\u002Fresolvers\u002Fzod\";\nimport { z } from \"zod\";\n\nconst loginSchema = z.object({\n  email: z.string().email(\"Invalid email address\"),\n  password: z.string().min(6, \"Password must be 6+ characters\"),\n});\n\ntype LoginFormValues = z.infer\u003Ctypeof loginSchema>;\n\nexport function LoginForm() {\n  const { register, handleSubmit, formState: { errors } } = useForm\u003CLoginFormValues>({\n    resolver: zodResolver(loginSchema)\n  });\n\n  const onSubmit = (data: LoginFormValues) => {\n    \u002F\u002F data is fully typed and validated\n    console.log(data.email, data.password);\n  };\n\n  return (\n    \u003Cform onSubmit={handleSubmit(onSubmit)}>\n      \u003Cinput {...register(\"email\")} \u002F>\n      {errors.email && \u003Cspan>{errors.email.message}\u003C\u002Fspan>}\n      {\u002F* ... *\u002F}\n    \u003C\u002Fform>\n  );\n}\n```\n\n### Next.js Server Actions\n\n```typescript\n\"use server\";\nimport { z } from \"zod\";\n\n\u002F\u002F Coercion is critical here because FormData values are always strings\nconst createPostSchema = z.object({\n  title: z.string().min(3),\n  content: z.string().optional(),\n  published: z.coerce.boolean().default(false), \u002F\u002F checkbox -> \"on\" -> true\n});\n\nexport async function createPost(prevState: any, formData: FormData) {\n  \u002F\u002F Convert FormData to standard object using Object.fromEntries\n  const rawData = Object.fromEntries(formData.entries());\n  \n  const validatedFields = createPostSchema.safeParse(rawData);\n  \n  if (!validatedFields.success) {\n    return {\n      errors: validatedFields.error.flatten().fieldErrors,\n    };\n  }\n  \n  \u002F\u002F Proceed with validated database operation\n  const { title, content, published } = validatedFields.data;\n  \u002F\u002F ...\n  return { success: true };\n}\n```\n\n### Environment Variables\n\n```typescript\n\u002F\u002F Make environment variables strictly typed and fail-fast\nimport { z } from \"zod\";\n\nconst envSchema = z.object({\n  DATABASE_URL: z.string().url(),\n  NODE_ENV: z.enum([\"development\", \"test\", \"production\"]).default(\"development\"),\n  PORT: z.coerce.number().default(3000),\n  API_KEY: z.string().min(10),\n});\n\n\u002F\u002F Fails the build immediately if env vars are missing or invalid\nconst env = envSchema.parse(process.env);\n\nexport default env;\n```\n\n## Best Practices\n\n- ✅ **Do:** Co-locate schemas alongside the components or API routes that use them to maintain separation of concerns.\n- ✅ **Do:** Use `z.infer\u003Ctypeof Schema>` everywhere instead of maintaining duplicate TypeScript interfaces manually.\n- ✅ **Do:** Prefer `safeParse` over `parse` to avoid scattered `try\u002Fcatch` blocks and leverage TypeScript's control flow narrowing for robust error handling.\n- ✅ **Do:** Use `z.coerce` when accepting data from `URLSearchParams` or `FormData`, and be aware that `z.coerce.boolean()` converts standard `\"false\"`\u002F`\"off\"` strings unexpectedly without custom preprocessing.\n- ✅ **Do:** Use `.flatten()` or `.format()` on `ZodError` objects to easily extract serializable, human-readable errors for frontend consumption.\n- ❌ **Don't:** Rely exclusively on `.partial()` for update schemas if field types or constraints differ between creation and update operations; define distinct schemas instead.\n- ❌ **Don't:** Forget to pass the `path` option in `.refine()` or `.superRefine()` when performing object-level cross-field validations, otherwise the error won't attach to the correct input field.\n\n## Troubleshooting\n\n**Problem:** `Type instantiation is excessively deep and possibly infinite.`\n**Solution:** This occurs with extreme schema recursion (e.g. deeply nested self-referential schemas). Use `z.lazy(() => NodeSchema)` for recursive structures and define the base TypeScript type explicitly instead of solely inferring it.\n\n**Problem:** Empty strings pass validation when using `.optional()`.\n**Solution:** `.optional()` permits `undefined`, not empty strings. If an empty string means \"no value,\" use `.or(z.literal(\"\"))` or preprocess it: `z.string().transform(v => v === \"\" ? undefined : v).optional()`.\n",{"name":5,"risk":38,"source":28,"date_added":49,"description":7},"2026-03-05","main","a50a3aa6b39fb0e1b7db88bef1bfc9c93606e126","modules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzod-validation-expert",0,"https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant","https:\u002F\u002Fgithub.com\u002FSam-06060","Mobile Application Developer | Kotlin | Flutter, KMP, Swfit, Android,Swift UI | Building at Saar It Resources | Creator of Jarvis (AI Assistant)","2026-06-23 05:13:38",{"source":8,"skillName":5,"commands":59,"prompt":69,"zipAvailable":70},[60,63,66],{"tool":61,"command":62},"npx","npx skills add Sam-06060\u002Fjarvis-assistant --skill zod-validation-expert",{"tool":64,"command":65},"bunx","bunx skills add Sam-06060\u002Fjarvis-assistant --skill zod-validation-expert",{"tool":67,"command":68},"pnpm","pnpm dlx skills add Sam-06060\u002Fjarvis-assistant --skill zod-validation-expert","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzod-validation-expert\u002FSKILL.md",true,[],[73,84,98,125,144,170],{"skillNo":74,"name":75,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":81,"publishedAt":44},"01M6GDRVS6FXX3ESH0C9DW01C0","test_skill","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fscratch\u002Ftest_skill\u002FSKILL.md",[78],{"categoryNo":79,"categoryName":80,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",[82,83],"test","Test Skill",{"skillNo":85,"name":86,"nameZh":6,"description":87,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":90,"publishedAt":44},"01M6GDRQ40HX22MA6XWC31RHHK","zustand-store-ts","Create Zustand stores following established patterns with proper TypeScript types and middleware.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzustand-store-ts\u002FSKILL.md",[],[91,92,93,33,94,95,96,28,97,43],"zustand store ts","zustand","store","types","middleware","patterns","create",{"skillNo":99,"name":100,"nameZh":6,"description":101,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":102,"categories":103,"keywords":107,"publishedAt":44},"01M6GDRKEA0WE670SPFWX5GKCN","zoom-automation","Automate Zoom meeting creation, management, recordings, webinars, and participant tracking via Rube MCP (Composio). Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzoom-automation\u002FSKILL.md",[104],{"categoryNo":105,"categoryName":106,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[108,109,110,111,112,113,28,114,115,116,117,118,119,120,121,122,123,124],"automation","zoom automation","zoom","Tools","webinars","composio","recordings","management","tracking","automate","first","search","MCP","meeting","via","critical","creation",{"skillNo":126,"name":127,"nameZh":6,"description":128,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":129,"categories":130,"keywords":132,"publishedAt":44},"01M6GDRFS1452PC71JQ38S24HR","zoho-crm-automation","Automate Zoho CRM tasks via Rube MCP (Composio): create\u002Fupdate records, search contacts, manage leads, and convert leads. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzoho-crm-automation\u002FSKILL.md",[131],{"categoryNo":105,"categoryName":106,"taxonomyType":21,"taxonomyTypeDesc":22},[108,133,134,135,136,137,138,139,140,123,119,113,28,141,117,111,142,97,143,120],"zoho","crm","zoho crm","zoho crm automation","crm automation","leads","contacts","records","manage","update","tasks",{"skillNo":145,"name":146,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":148,"categories":149,"keywords":151,"publishedAt":44},"01M6GDR658B08K4MY0RWD4A6EH","zeroize-audit","Detects missing zeroization of sensitive data in source code and identifies zeroization removed by compiler optimizations, with assembly-level analysis, and control-flow verification. Use for auditing C\u002FC++\u002FRust code handling secrets, keys, passwords, or other sensitive data.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzeroize-audit\u002FSKILL.md",[150],{"categoryNo":105,"categoryName":106,"taxonomyType":21,"taxonomyTypeDesc":22},[152,153,154,155,156,157,28,158,159,160,161,162,163,164,165,166,167,168,120,169],"audit","zeroize audit","secrets","project","c++","activate","assembly","write","read","Bash","get","analysis","data","flow","verification","code","rust","passwords",{"skillNo":171,"name":172,"nameZh":6,"description":173,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":174,"categories":175,"keywords":177,"publishedAt":44},"01M6GDR26HCW3DWXEP61A8P4GR","zendesk-automation","Automate Zendesk tasks via Rube MCP (Composio): tickets, users, organizations, replies. Always search tools first for current schemas.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzendesk-automation\u002FSKILL.md",[176],{"categoryNo":105,"categoryName":106,"taxonomyType":21,"taxonomyTypeDesc":22},[108,178,179,28,113,111,120,143,119,118,117,180,123,122,181,182,183],"zendesk automation","zendesk","organizations","tickets","users","replies"]