[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EKXCTR3VC93KRKM5V8P80Y":3,"skill-same:01M6EKXCTR3VC93KRKM5V8P80Y":83},{"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":54,"commitSha":55,"skillDirectory":56,"forksCount":57,"repositoryHtmlUrl":58,"repositoryHomepageUrl":59,"ownerHtmlUrl":60,"ownerBlogUrl":6,"ownerDescription":61,"updatedAt":62,"install":63,"resources":76},"01M6EKXCTR3VC93KRKM5V8P80Y","type-safety-validation",null,"Achieve end-to-end type safety with Zod runtime validation, tRPC type-safe APIs, Prisma ORM, and TypeScript 5.7+ features. Build fully type-safe applications from database to UI for 2025+ development.","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fariegoldkin\u002Ftype-safety-validation\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"type safety validation","validation","Type Safety","Safety","type","hub","2025","type-safety","trpc","end","runtime","prisma","build","ai agent","orm","zod","applications","database","development","runtime validation","2026-11-10 10:12:30",false,"---\nname: type-safety-validation\ndescription: Achieve end-to-end type safety with Zod runtime validation, tRPC type-safe APIs, Prisma ORM, and TypeScript 5.7+ features. Build fully type-safe applications from database to UI for 2025+ development.\nversion: 1.0.0\nauthor: AI Agent Hub\ntags: [typescript, zod, trpc, prisma, type-safety, validation, 2025]\n---\n\n# Type Safety & Validation\n\n## Overview\n\nEnd-to-end type safety ensures bugs are caught at compile time, not runtime. This skill covers Zod for runtime validation, tRPC for type-safe APIs, Prisma for type-safe database access, and modern TypeScript features.\n\n**When to use this skill:**\n- Building type-safe APIs (REST, RPC, GraphQL)\n- Validating user input and external data\n- Ensuring database queries are type-safe\n- Creating end-to-end typed full-stack applications\n- Migrating from JavaScript to TypeScript\n- Implementing strict validation rules\n\n## Core Stack\n\n### 1. Zod - Runtime Validation\n\n```typescript\nimport { z } from 'zod'\n\n\u002F\u002F Define schema\nconst UserSchema = z.object({\n  id: z.string().uuid(),\n  email: z.string().email(),\n  age: z.number().int().positive().max(120),\n  role: z.enum(['admin', 'user', 'guest']),\n  metadata: z.record(z.string()).optional(),\n  createdAt: z.date().default(() => new Date())\n})\n\n\u002F\u002F Infer TypeScript type from schema\ntype User = z.infer\u003Ctypeof UserSchema>\n\n\u002F\u002F Validate data\nconst result = UserSchema.safeParse(data)\nif (result.success) {\n  const user: User = result.data\n} else {\n  console.error(result.error.issues)\n}\n\n\u002F\u002F Transform data\nconst EmailSchema = z.string().email().transform(email => email.toLowerCase())\n```\n\n**Advanced Patterns**:\n```typescript\n\u002F\u002F Refinements\nconst PasswordSchema = z.string()\n  .min(8)\n  .refine((pass) => \u002F[A-Z]\u002F.test(pass), 'Must contain uppercase')\n  .refine((pass) => \u002F[0-9]\u002F.test(pass), 'Must contain number')\n\n\u002F\u002F Discriminated Unions\nconst EventSchema = z.discriminatedUnion('type', [\n  z.object({ type: z.literal('click'), x: z.number(), y: z.number() }),\n  z.object({ type: z.literal('scroll'), offset: z.number() })\n])\n\n\u002F\u002F Recursive Types\nconst CategorySchema: z.ZodType\u003CCategory> = z.lazy(() =>\n  z.object({\n    name: z.string(),\n    children: z.array(CategorySchema).optional()\n  })\n)\n```\n\n### 2. tRPC - Type-Safe APIs\n\n```typescript\n\u002F\u002F Server: Define procedures\nimport { initTRPC } from '@trpc\u002Fserver'\nimport { z } from 'zod'\n\nconst t = initTRPC.create()\n\nexport const appRouter = t.router({\n  getUser: t.procedure\n    .input(z.object({ id: z.string() }))\n    .query(async ({ input }) => {\n      return await db.user.findUnique({ where: { id: input.id } })\n    }),\n\n  createUser: t.procedure\n    .input(z.object({\n      email: z.string().email(),\n      name: z.string()\n    }))\n    .mutation(async ({ input }) => {\n      return await db.user.create({ data: input })\n    })\n})\n\nexport type AppRouter = typeof appRouter\n\n\u002F\u002F Client: Fully typed!\nimport { createTRPCProxyClient, httpBatchLink } from '@trpc\u002Fclient'\nimport type { AppRouter } from '.\u002Fserver'\n\nconst client = createTRPCProxyClient\u003CAppRouter>({\n  links: [httpBatchLink({ url: 'http:\u002F\u002Flocalhost:3000\u002Fapi\u002Ftrpc' })]\n})\n\n\u002F\u002F TypeScript knows the exact shape!\nconst user = await client.getUser.query({ id: '123' })\n\u002F\u002F    ^? User | null\n```\n\n### 3. Prisma - Type-Safe ORM\n\n```prisma\n\u002F\u002F schema.prisma\nmodel User {\n  id        String   @id @default(cuid())\n  email     String   @unique\n  posts     Post[]\n  profile   Profile?\n  createdAt DateTime @default(now())\n}\n\nmodel Post {\n  id        String   @id @default(cuid())\n  title     String\n  content   String?\n  published Boolean  @default(false)\n  author    User     @relation(fields: [authorId], references: [id])\n  authorId  String\n}\n```\n\n```typescript\nimport { PrismaClient } from '@prisma\u002Fclient'\n\nconst prisma = new PrismaClient()\n\n\u002F\u002F Fully typed queries\nconst user = await prisma.user.findUnique({\n  where: { id: '123' },\n  include: {\n    posts: {\n      where: { published: true },\n      orderBy: { createdAt: 'desc' }\n    }\n  }\n})\n\u002F\u002F user is typed as: User & { posts: Post[] }\n\n\u002F\u002F Type-safe creates\nconst newUser = await prisma.user.create({\n  data: {\n    email: 'user@example.com',\n    posts: {\n      create: [\n        { title: 'First Post', content: 'Hello world' }\n      ]\n    }\n  }\n})\n```\n\n### 4. TypeScript 5.7+ Features\n\n```typescript\n\u002F\u002F Const type parameters (TS 5.0+)\nfunction firstElement\u003CT extends readonly any[]>(arr: T) {\n  return arr[0]\n}\n\nconst result = firstElement(['a', 'b'] as const)\n\u002F\u002F result is typed as 'a'\n\n\u002F\u002F Satisfies operator (TS 4.9+)\nconst config = {\n  url: 'https:\u002F\u002Fapi.example.com',\n  timeout: 5000\n} satisfies Config  \u002F\u002F Ensures config matches Config, but keeps literal types\n\n\u002F\u002F Decorators (TS 5.0+)\nfunction logged(target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n  const original = descriptor.value\n  descriptor.value = function (...args: any[]) {\n    console.log(`Calling ${propertyKey}`)\n    return original.apply(this, args)\n  }\n}\n\nclass API {\n  @logged\n  async fetchData() {}\n}\n```\n\n## Full-Stack Example\n\n```typescript\n\u002F\u002F ===== BACKEND (Next.js API) =====\n\u002F\u002F app\u002Fapi\u002Ftrpc\u002F[trpc]\u002Froute.ts\nimport { fetchRequestHandler } from '@trpc\u002Fserver\u002Fadapters\u002Ffetch'\nimport { appRouter } from '@\u002Fserver\u002Frouters\u002F_app'\n\nexport async function GET(req: Request) {\n  return fetchRequestHandler({\n    endpoint: '\u002Fapi\u002Ftrpc',\n    req,\n    router: appRouter,\n    createContext: () => ({})\n  })\n}\n\nexport const POST = GET\n\n\u002F\u002F server\u002Frouters\u002F_app.ts\nimport { z } from 'zod'\nimport { prisma } from '@\u002Flib\u002Fprisma'\nimport { publicProcedure, router } from '..\u002Ftrpc'\n\nexport const appRouter = router({\n  posts: {\n    list: publicProcedure\n      .input(z.object({\n        limit: z.number().min(1).max(100).default(10),\n        cursor: z.string().optional()\n      }))\n      .query(async ({ input }) => {\n        const posts = await prisma.post.findMany({\n          take: input.limit + 1,\n          cursor: input.cursor ? { id: input.cursor } : undefined,\n          orderBy: { createdAt: 'desc' },\n          include: { author: true }\n        })\n\n        return {\n          items: posts.slice(0, input.limit),\n          nextCursor: posts[input.limit]?.id\n        }\n      }),\n\n    create: publicProcedure\n      .input(z.object({\n        title: z.string().min(1).max(200),\n        content: z.string().optional()\n      }))\n      .mutation(async ({ input }) => {\n        return await prisma.post.create({\n          data: input\n        })\n      })\n  }\n})\n\n\u002F\u002F ===== FRONTEND (React) =====\n\u002F\u002F lib\u002Ftrpc.ts\nimport { createTRPCReact } from '@trpc\u002Freact-query'\nimport type { AppRouter } from '@\u002Fserver\u002Frouters\u002F_app'\n\nexport const trpc = createTRPCReact\u003CAppRouter>()\n\n\u002F\u002F components\u002FPostList.tsx\n'use client'\n\nimport { trpc } from '@\u002Flib\u002Ftrpc'\n\nexport function PostList() {\n  const { data, isLoading } = trpc.posts.list.useQuery({ limit: 10 })\n  const createPost = trpc.posts.create.useMutation()\n\n  if (isLoading) return \u003Cdiv>Loading...\u003C\u002Fdiv>\n\n  return (\n    \u003Cdiv>\n      {data?.items.map(post => (\n        \u003Cdiv key={post.id}>\n          \u003Ch2>{post.title}\u003C\u002Fh2>\n          \u003Cp>{post.content}\u003C\u002Fp>\n          \u003Cspan>By {post.author.name}\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      ))}\n\n      \u003Cbutton onClick={() => createPost.mutate({ title: 'New Post' })}>\n        Create Post\n      \u003C\u002Fbutton>\n    \u003C\u002Fdiv>\n  )\n}\n```\n\n## Best Practices\n\n### Validation\n- ✅ Validate at boundaries (API inputs, form submissions, external data)\n- ✅ Use `.safeParse()` to handle errors gracefully\n- ✅ Provide clear error messages for users\n- ✅ Validate environment variables at startup\n- ✅ Use branded types for IDs (`z.string().brand\u003C'UserId'>()`)\n\n### Type Safety\n- ✅ Enable `strict: true` in `tsconfig.json`\n- ✅ Use `noUncheckedIndexedAccess` for safer array access\n- ✅ Prefer `unknown` over `any`\n- ✅ Use type guards for narrowing\n- ✅ Leverage inference with `typeof` and `ReturnType`\n\n### Performance\n- ✅ Reuse schemas (don't create inline)\n- ✅ Use `.parse()` for known-good data (faster than `.safeParse()`)\n- ✅ Enable Prisma query optimization\n- ✅ Use tRPC batching for multiple queries\n- ✅ Cache validation results when appropriate\n\n## Resources\n\n- [Zod Documentation](https:\u002F\u002Fzod.dev)\n- [tRPC Documentation](https:\u002F\u002Ftrpc.io)\n- [Prisma Documentation](https:\u002F\u002Fwww.prisma.io\u002Fdocs)\n- [TypeScript Handbook](https:\u002F\u002Fwww.typescriptlang.org\u002Fdocs\u002Fhandbook\u002Fintro.html)\n","# Type Safety & Validation\n\n## Overview\n\nEnd-to-end type safety ensures bugs are caught at compile time, not runtime. This skill covers Zod for runtime validation, tRPC for type-safe APIs, Prisma for type-safe database access, and modern TypeScript features.\n\n**When to use this skill:**\n- Building type-safe APIs (REST, RPC, GraphQL)\n- Validating user input and external data\n- Ensuring database queries are type-safe\n- Creating end-to-end typed full-stack applications\n- Migrating from JavaScript to TypeScript\n- Implementing strict validation rules\n\n## Core Stack\n\n### 1. Zod - Runtime Validation\n\n```typescript\nimport { z } from 'zod'\n\n\u002F\u002F Define schema\nconst UserSchema = z.object({\n  id: z.string().uuid(),\n  email: z.string().email(),\n  age: z.number().int().positive().max(120),\n  role: z.enum(['admin', 'user', 'guest']),\n  metadata: z.record(z.string()).optional(),\n  createdAt: z.date().default(() => new Date())\n})\n\n\u002F\u002F Infer TypeScript type from schema\ntype User = z.infer\u003Ctypeof UserSchema>\n\n\u002F\u002F Validate data\nconst result = UserSchema.safeParse(data)\nif (result.success) {\n  const user: User = result.data\n} else {\n  console.error(result.error.issues)\n}\n\n\u002F\u002F Transform data\nconst EmailSchema = z.string().email().transform(email => email.toLowerCase())\n```\n\n**Advanced Patterns**:\n```typescript\n\u002F\u002F Refinements\nconst PasswordSchema = z.string()\n  .min(8)\n  .refine((pass) => \u002F[A-Z]\u002F.test(pass), 'Must contain uppercase')\n  .refine((pass) => \u002F[0-9]\u002F.test(pass), 'Must contain number')\n\n\u002F\u002F Discriminated Unions\nconst EventSchema = z.discriminatedUnion('type', [\n  z.object({ type: z.literal('click'), x: z.number(), y: z.number() }),\n  z.object({ type: z.literal('scroll'), offset: z.number() })\n])\n\n\u002F\u002F Recursive Types\nconst CategorySchema: z.ZodType\u003CCategory> = z.lazy(() =>\n  z.object({\n    name: z.string(),\n    children: z.array(CategorySchema).optional()\n  })\n)\n```\n\n### 2. tRPC - Type-Safe APIs\n\n```typescript\n\u002F\u002F Server: Define procedures\nimport { initTRPC } from '@trpc\u002Fserver'\nimport { z } from 'zod'\n\nconst t = initTRPC.create()\n\nexport const appRouter = t.router({\n  getUser: t.procedure\n    .input(z.object({ id: z.string() }))\n    .query(async ({ input }) => {\n      return await db.user.findUnique({ where: { id: input.id } })\n    }),\n\n  createUser: t.procedure\n    .input(z.object({\n      email: z.string().email(),\n      name: z.string()\n    }))\n    .mutation(async ({ input }) => {\n      return await db.user.create({ data: input })\n    })\n})\n\nexport type AppRouter = typeof appRouter\n\n\u002F\u002F Client: Fully typed!\nimport { createTRPCProxyClient, httpBatchLink } from '@trpc\u002Fclient'\nimport type { AppRouter } from '.\u002Fserver'\n\nconst client = createTRPCProxyClient\u003CAppRouter>({\n  links: [httpBatchLink({ url: 'http:\u002F\u002Flocalhost:3000\u002Fapi\u002Ftrpc' })]\n})\n\n\u002F\u002F TypeScript knows the exact shape!\nconst user = await client.getUser.query({ id: '123' })\n\u002F\u002F    ^? User | null\n```\n\n### 3. Prisma - Type-Safe ORM\n\n```prisma\n\u002F\u002F schema.prisma\nmodel User {\n  id        String   @id @default(cuid())\n  email     String   @unique\n  posts     Post[]\n  profile   Profile?\n  createdAt DateTime @default(now())\n}\n\nmodel Post {\n  id        String   @id @default(cuid())\n  title     String\n  content   String?\n  published Boolean  @default(false)\n  author    User     @relation(fields: [authorId], references: [id])\n  authorId  String\n}\n```\n\n```typescript\nimport { PrismaClient } from '@prisma\u002Fclient'\n\nconst prisma = new PrismaClient()\n\n\u002F\u002F Fully typed queries\nconst user = await prisma.user.findUnique({\n  where: { id: '123' },\n  include: {\n    posts: {\n      where: { published: true },\n      orderBy: { createdAt: 'desc' }\n    }\n  }\n})\n\u002F\u002F user is typed as: User & { posts: Post[] }\n\n\u002F\u002F Type-safe creates\nconst newUser = await prisma.user.create({\n  data: {\n    email: 'user@example.com',\n    posts: {\n      create: [\n        { title: 'First Post', content: 'Hello world' }\n      ]\n    }\n  }\n})\n```\n\n### 4. TypeScript 5.7+ Features\n\n```typescript\n\u002F\u002F Const type parameters (TS 5.0+)\nfunction firstElement\u003CT extends readonly any[]>(arr: T) {\n  return arr[0]\n}\n\nconst result = firstElement(['a', 'b'] as const)\n\u002F\u002F result is typed as 'a'\n\n\u002F\u002F Satisfies operator (TS 4.9+)\nconst config = {\n  url: 'https:\u002F\u002Fapi.example.com',\n  timeout: 5000\n} satisfies Config  \u002F\u002F Ensures config matches Config, but keeps literal types\n\n\u002F\u002F Decorators (TS 5.0+)\nfunction logged(target: any, propertyKey: string, descriptor: PropertyDescriptor) {\n  const original = descriptor.value\n  descriptor.value = function (...args: any[]) {\n    console.log(`Calling ${propertyKey}`)\n    return original.apply(this, args)\n  }\n}\n\nclass API {\n  @logged\n  async fetchData() {}\n}\n```\n\n## Full-Stack Example\n\n```typescript\n\u002F\u002F ===== BACKEND (Next.js API) =====\n\u002F\u002F app\u002Fapi\u002Ftrpc\u002F[trpc]\u002Froute.ts\nimport { fetchRequestHandler } from '@trpc\u002Fserver\u002Fadapters\u002Ffetch'\nimport { appRouter } from '@\u002Fserver\u002Frouters\u002F_app'\n\nexport async function GET(req: Request) {\n  return fetchRequestHandler({\n    endpoint: '\u002Fapi\u002Ftrpc',\n    req,\n    router: appRouter,\n    createContext: () => ({})\n  })\n}\n\nexport const POST = GET\n\n\u002F\u002F server\u002Frouters\u002F_app.ts\nimport { z } from 'zod'\nimport { prisma } from '@\u002Flib\u002Fprisma'\nimport { publicProcedure, router } from '..\u002Ftrpc'\n\nexport const appRouter = router({\n  posts: {\n    list: publicProcedure\n      .input(z.object({\n        limit: z.number().min(1).max(100).default(10),\n        cursor: z.string().optional()\n      }))\n      .query(async ({ input }) => {\n        const posts = await prisma.post.findMany({\n          take: input.limit + 1,\n          cursor: input.cursor ? { id: input.cursor } : undefined,\n          orderBy: { createdAt: 'desc' },\n          include: { author: true }\n        })\n\n        return {\n          items: posts.slice(0, input.limit),\n          nextCursor: posts[input.limit]?.id\n        }\n      }),\n\n    create: publicProcedure\n      .input(z.object({\n        title: z.string().min(1).max(200),\n        content: z.string().optional()\n      }))\n      .mutation(async ({ input }) => {\n        return await prisma.post.create({\n          data: input\n        })\n      })\n  }\n})\n\n\u002F\u002F ===== FRONTEND (React) =====\n\u002F\u002F lib\u002Ftrpc.ts\nimport { createTRPCReact } from '@trpc\u002Freact-query'\nimport type { AppRouter } from '@\u002Fserver\u002Frouters\u002F_app'\n\nexport const trpc = createTRPCReact\u003CAppRouter>()\n\n\u002F\u002F components\u002FPostList.tsx\n'use client'\n\nimport { trpc } from '@\u002Flib\u002Ftrpc'\n\nexport function PostList() {\n  const { data, isLoading } = trpc.posts.list.useQuery({ limit: 10 })\n  const createPost = trpc.posts.create.useMutation()\n\n  if (isLoading) return \u003Cdiv>Loading...\u003C\u002Fdiv>\n\n  return (\n    \u003Cdiv>\n      {data?.items.map(post => (\n        \u003Cdiv key={post.id}>\n          \u003Ch2>{post.title}\u003C\u002Fh2>\n          \u003Cp>{post.content}\u003C\u002Fp>\n          \u003Cspan>By {post.author.name}\u003C\u002Fspan>\n        \u003C\u002Fdiv>\n      ))}\n\n      \u003Cbutton onClick={() => createPost.mutate({ title: 'New Post' })}>\n        Create Post\n      \u003C\u002Fbutton>\n    \u003C\u002Fdiv>\n  )\n}\n```\n\n## Best Practices\n\n### Validation\n- ✅ Validate at boundaries (API inputs, form submissions, external data)\n- ✅ Use `.safeParse()` to handle errors gracefully\n- ✅ Provide clear error messages for users\n- ✅ Validate environment variables at startup\n- ✅ Use branded types for IDs (`z.string().brand\u003C'UserId'>()`)\n\n### Type Safety\n- ✅ Enable `strict: true` in `tsconfig.json`\n- ✅ Use `noUncheckedIndexedAccess` for safer array access\n- ✅ Prefer `unknown` over `any`\n- ✅ Use type guards for narrowing\n- ✅ Leverage inference with `typeof` and `ReturnType`\n\n### Performance\n- ✅ Reuse schemas (don't create inline)\n- ✅ Use `.parse()` for known-good data (faster than `.safeParse()`)\n- ✅ Enable Prisma query optimization\n- ✅ Use tRPC batching for multiple queries\n- ✅ Cache validation results when appropriate\n\n## Resources\n\n- [Zod Documentation](https:\u002F\u002Fzod.dev)\n- [tRPC Documentation](https:\u002F\u002Ftrpc.io)\n- [Prisma Documentation](https:\u002F\u002Fwww.prisma.io\u002Fdocs)\n- [TypeScript Handbook](https:\u002F\u002Fwww.typescriptlang.org\u002Fdocs\u002Fhandbook\u002Fintro.html)\n",{"name":5,"tags":49,"author":52,"version":53,"description":7},[50,39,32,35,31,25,51],"typescript",2025,"AI Agent Hub","1.0.0","main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Faiskillstore\u002Fmarketplace\u002Fariegoldkin\u002Ftype-safety-validation",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":64,"prompt":74,"zipAvailable":75},[65,68,71],{"tool":66,"command":67},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill type-safety-validation",{"tool":69,"command":70},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill type-safety-validation",{"tool":72,"command":73},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill type-safety-validation","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fariegoldkin\u002Ftype-safety-validation\u002FSKILL.md",true,[77],{"path":78,"resourceType":79,"resourceTypeDesc":80,"sizeBytes":81,"sourceHtmlUrl":82},"skill-report.json","REFERENCE","参考文档",9512,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fariegoldkin\u002Ftype-safety-validation\u002Fskill-report.json",[84,94,104,113,119,126],{"skillNo":85,"name":86,"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":87,"categories":88,"keywords":90,"publishedAt":44},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[89],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[91,92,93],"model","model hierarchy","model hierarchy skill",{"skillNo":95,"name":96,"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":97,"categories":98,"keywords":100,"publishedAt":44},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[99],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[101,102,103],"MCP","zoom","zoom mcp",{"skillNo":105,"name":106,"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":107,"categories":108,"keywords":109,"publishedAt":44},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[110,111,112,102],"sdk","zoom apps sdk","apps",{"skillNo":114,"name":115,"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":116,"categories":117,"keywords":118,"publishedAt":44},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[115],{"skillNo":120,"name":121,"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":122,"categories":123,"keywords":125,"publishedAt":44},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[124],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[121],{"skillNo":127,"name":128,"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":129,"categories":130,"keywords":131,"publishedAt":44},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[128]]