[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CCCKCNF7EPH4D3YCHVK5XG":3,"skill-same:01M6CCCKCNF7EPH4D3YCHVK5XG":64},{"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":18,"publishedAt":33,"linkOnly":34,"markdownContent":35,"markdownBody":36,"frontMatter":37,"refName":43,"commitSha":44,"skillDirectory":45,"forksCount":14,"repositoryHtmlUrl":46,"repositoryHomepageUrl":47,"ownerHtmlUrl":48,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":49,"install":50,"resources":63},"01M6CCCKCNF7EPH4D3YCHVK5XG","convex-best-practices",null,"Guidelines for building production-ready Convex apps covering function organization, query patterns, validation, TypeScript usage, error handling, and the Zen of Convex design philosophy","baisharg\u002FASTN","baisharg","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F204916775?v=4","01M6CC8XHZYVK2DR22FZ1BESCG","BAISH","01M6CC8XP400QZ9DXAWTC8EG3X",2,"AGPL-3.0","https:\u002F\u002Fgithub.com\u002Fbaisharg\u002FASTN\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fconvex-best-practices\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32],"convex","best practices","convex best practices","design","convex design","typescript","design philosophy","guidelines","error handling","validation","Production","ready","best-practices","error-handling","2026-11-10 10:12:30",false,"---\nname: convex-best-practices\ndisplayName: Convex Best Practices\ndescription: Guidelines for building production-ready Convex apps covering function organization, query patterns, validation, TypeScript usage, error handling, and the Zen of Convex design philosophy\nversion: 1.0.0\nauthor: Convex\ntags: [convex, best-practices, typescript, production, error-handling]\n---\n\n# Convex Best Practices\n\nBuild production-ready Convex applications by following established patterns for function organization, query optimization, validation, TypeScript usage, and error handling.\n\n## Documentation Sources\n\nBefore implementing, do not assume; fetch the latest documentation:\n\n- Primary: https:\u002F\u002Fdocs.convex.dev\u002Funderstanding\u002Fbest-practices\u002F\n- Error Handling: https:\u002F\u002Fdocs.convex.dev\u002Ffunctions\u002Ferror-handling\n- Write Conflicts: https:\u002F\u002Fdocs.convex.dev\u002Ferror#1\n- For broader context: https:\u002F\u002Fdocs.convex.dev\u002Fllms.txt\n\n## Instructions\n\n### The Zen of Convex\n\n1. **Convex manages the hard parts** - Let Convex handle caching, real-time sync, and consistency\n2. **Functions are the API** - Design your functions as your application's interface\n3. **Schema is truth** - Define your data model explicitly in schema.ts\n4. **TypeScript everywhere** - Leverage end-to-end type safety\n5. **Queries are reactive** - Think in terms of subscriptions, not requests\n\n### Function Organization\n\nOrganize your Convex functions by domain:\n\n```typescript\n\u002F\u002F convex\u002Fusers.ts - User-related functions\nimport { query, mutation } from '.\u002F_generated\u002Fserver'\nimport { v } from 'convex\u002Fvalues'\n\nexport const get = query({\n  args: { userId: v.id('users') },\n  returns: v.union(\n    v.object({\n      _id: v.id('users'),\n      _creationTime: v.number(),\n      name: v.string(),\n      email: v.string(),\n    }),\n    v.null(),\n  ),\n  handler: async (ctx, args) => {\n    return await ctx.db.get(args.userId)\n  },\n})\n```\n\n### Argument and Return Validation\n\nAlways define validators for arguments AND return types:\n\n```typescript\nexport const createTask = mutation({\n  args: {\n    title: v.string(),\n    description: v.optional(v.string()),\n    priority: v.union(v.literal('low'), v.literal('medium'), v.literal('high')),\n  },\n  returns: v.id('tasks'),\n  handler: async (ctx, args) => {\n    return await ctx.db.insert('tasks', {\n      title: args.title,\n      description: args.description,\n      priority: args.priority,\n      completed: false,\n      createdAt: Date.now(),\n    })\n  },\n})\n```\n\n### Query Patterns\n\nUse indexes instead of filters for efficient queries:\n\n```typescript\n\u002F\u002F Schema with index\nexport default defineSchema({\n  tasks: defineTable({\n    userId: v.id('users'),\n    status: v.string(),\n    createdAt: v.number(),\n  })\n    .index('by_user', ['userId'])\n    .index('by_user_and_status', ['userId', 'status']),\n})\n\n\u002F\u002F Query using index\nexport const getTasksByUser = query({\n  args: { userId: v.id('users') },\n  returns: v.array(\n    v.object({\n      _id: v.id('tasks'),\n      _creationTime: v.number(),\n      userId: v.id('users'),\n      status: v.string(),\n      createdAt: v.number(),\n    }),\n  ),\n  handler: async (ctx, args) => {\n    return await ctx.db\n      .query('tasks')\n      .withIndex('by_user', (q) => q.eq('userId', args.userId))\n      .order('desc')\n      .collect()\n  },\n})\n```\n\n### Error Handling\n\nUse ConvexError for user-facing errors:\n\n```typescript\nimport { ConvexError } from 'convex\u002Fvalues'\n\nexport const updateTask = mutation({\n  args: {\n    taskId: v.id('tasks'),\n    title: v.string(),\n  },\n  returns: v.null(),\n  handler: async (ctx, args) => {\n    const task = await ctx.db.get(args.taskId)\n\n    if (!task) {\n      throw new ConvexError({\n        code: 'NOT_FOUND',\n        message: 'Task not found',\n      })\n    }\n\n    await ctx.db.patch(args.taskId, { title: args.title })\n    return null\n  },\n})\n```\n\n### Avoiding Write Conflicts (Optimistic Concurrency Control)\n\nConvex uses OCC. Follow these patterns to minimize conflicts:\n\n```typescript\n\u002F\u002F GOOD: Make mutations idempotent\nexport const completeTask = mutation({\n  args: { taskId: v.id('tasks') },\n  returns: v.null(),\n  handler: async (ctx, args) => {\n    const task = await ctx.db.get(args.taskId)\n\n    \u002F\u002F Early return if already complete (idempotent)\n    if (!task || task.status === 'completed') {\n      return null\n    }\n\n    await ctx.db.patch(args.taskId, {\n      status: 'completed',\n      completedAt: Date.now(),\n    })\n    return null\n  },\n})\n\n\u002F\u002F GOOD: Patch directly without reading first when possible\nexport const updateNote = mutation({\n  args: { id: v.id('notes'), content: v.string() },\n  returns: v.null(),\n  handler: async (ctx, args) => {\n    \u002F\u002F Patch directly - ctx.db.patch throws if document doesn't exist\n    await ctx.db.patch(args.id, { content: args.content })\n    return null\n  },\n})\n\n\u002F\u002F GOOD: Use Promise.all for parallel independent updates\nexport const reorderItems = mutation({\n  args: { itemIds: v.array(v.id('items')) },\n  returns: v.null(),\n  handler: async (ctx, args) => {\n    const updates = args.itemIds.map((id, index) =>\n      ctx.db.patch(id, { order: index }),\n    )\n    await Promise.all(updates)\n    return null\n  },\n})\n```\n\n### TypeScript Best Practices\n\n```typescript\nimport { Id, Doc } from '.\u002F_generated\u002FdataModel'\n\n\u002F\u002F Use Id type for document references\ntype UserId = Id\u003C'users'>\n\n\u002F\u002F Use Doc type for full documents\ntype User = Doc\u003C'users'>\n\n\u002F\u002F Define Record types properly\nconst userScores: Record\u003CId\u003C'users'>, number> = {}\n```\n\n### Internal vs Public Functions\n\n```typescript\n\u002F\u002F Public function - exposed to clients\nexport const getUser = query({\n  args: { userId: v.id('users') },\n  returns: v.union(\n    v.null(),\n    v.object({\n      \u002F* ... *\u002F\n    }),\n  ),\n  handler: async (ctx, args) => {\n    \u002F\u002F ...\n  },\n})\n\n\u002F\u002F Internal function - only callable from other Convex functions\nexport const _updateUserStats = internalMutation({\n  args: { userId: v.id('users') },\n  returns: v.null(),\n  handler: async (ctx, args) => {\n    \u002F\u002F ...\n  },\n})\n```\n\n## Examples\n\n### Complete CRUD Pattern\n\n```typescript\n\u002F\u002F convex\u002Ftasks.ts\nimport { query, mutation } from '.\u002F_generated\u002Fserver'\nimport { v } from 'convex\u002Fvalues'\nimport { ConvexError } from 'convex\u002Fvalues'\n\nconst taskValidator = v.object({\n  _id: v.id('tasks'),\n  _creationTime: v.number(),\n  title: v.string(),\n  completed: v.boolean(),\n  userId: v.id('users'),\n})\n\nexport const list = query({\n  args: { userId: v.id('users') },\n  returns: v.array(taskValidator),\n  handler: async (ctx, args) => {\n    return await ctx.db\n      .query('tasks')\n      .withIndex('by_user', (q) => q.eq('userId', args.userId))\n      .collect()\n  },\n})\n\nexport const create = mutation({\n  args: {\n    title: v.string(),\n    userId: v.id('users'),\n  },\n  returns: v.id('tasks'),\n  handler: async (ctx, args) => {\n    return await ctx.db.insert('tasks', {\n      title: args.title,\n      completed: false,\n      userId: args.userId,\n    })\n  },\n})\n\nexport const update = mutation({\n  args: {\n    taskId: v.id('tasks'),\n    title: v.optional(v.string()),\n    completed: v.optional(v.boolean()),\n  },\n  returns: v.null(),\n  handler: async (ctx, args) => {\n    const { taskId, ...updates } = args\n\n    \u002F\u002F Remove undefined values\n    const cleanUpdates = Object.fromEntries(\n      Object.entries(updates).filter(([_, v]) => v !== undefined),\n    )\n\n    if (Object.keys(cleanUpdates).length > 0) {\n      await ctx.db.patch(taskId, cleanUpdates)\n    }\n    return null\n  },\n})\n\nexport const remove = mutation({\n  args: { taskId: v.id('tasks') },\n  returns: v.null(),\n  handler: async (ctx, args) => {\n    await ctx.db.delete(args.taskId)\n    return null\n  },\n})\n```\n\n## Best Practices\n\n- Never run `npx convex deploy` unless explicitly instructed\n- Never run any git commands unless explicitly instructed\n- Always define return validators for functions\n- Use indexes for all queries that filter data\n- Make mutations idempotent to handle retries gracefully\n- Use ConvexError for user-facing error messages\n- Organize functions by domain (users.ts, tasks.ts, etc.)\n- Use internal functions for sensitive operations\n- Leverage TypeScript's Id and Doc types\n\n## Common Pitfalls\n\n1. **Using filter instead of withIndex** - Always define indexes and use withIndex\n2. **Missing return validators** - Always specify the returns field\n3. **Non-idempotent mutations** - Check current state before updating\n4. **Reading before patching unnecessarily** - Patch directly when possible\n5. **Not handling null returns** - Document IDs might not exist\n\n## References\n\n- Convex Documentation: https:\u002F\u002Fdocs.convex.dev\u002F\n- Convex LLMs.txt: https:\u002F\u002Fdocs.convex.dev\u002Fllms.txt\n- Best Practices: https:\u002F\u002Fdocs.convex.dev\u002Funderstanding\u002Fbest-practices\u002F\n- Error Handling: https:\u002F\u002Fdocs.convex.dev\u002Ffunctions\u002Ferror-handling\n- Write Conflicts: https:\u002F\u002Fdocs.convex.dev\u002Ferror#1\n","# Convex Best Practices\n\nBuild production-ready Convex applications by following established patterns for function organization, query optimization, validation, TypeScript usage, and error handling.\n\n## Documentation Sources\n\nBefore implementing, do not assume; fetch the latest documentation:\n\n- Primary: https:\u002F\u002Fdocs.convex.dev\u002Funderstanding\u002Fbest-practices\u002F\n- Error Handling: https:\u002F\u002Fdocs.convex.dev\u002Ffunctions\u002Ferror-handling\n- Write Conflicts: https:\u002F\u002Fdocs.convex.dev\u002Ferror#1\n- For broader context: https:\u002F\u002Fdocs.convex.dev\u002Fllms.txt\n\n## Instructions\n\n### The Zen of Convex\n\n1. **Convex manages the hard parts** - Let Convex handle caching, real-time sync, and consistency\n2. **Functions are the API** - Design your functions as your application's interface\n3. **Schema is truth** - Define your data model explicitly in schema.ts\n4. **TypeScript everywhere** - Leverage end-to-end type safety\n5. **Queries are reactive** - Think in terms of subscriptions, not requests\n\n### Function Organization\n\nOrganize your Convex functions by domain:\n\n```typescript\n\u002F\u002F convex\u002Fusers.ts - User-related functions\nimport { query, mutation } from '.\u002F_generated\u002Fserver'\nimport { v } from 'convex\u002Fvalues'\n\nexport const get = query({\n  args: { userId: v.id('users') },\n  returns: v.union(\n    v.object({\n      _id: v.id('users'),\n      _creationTime: v.number(),\n      name: v.string(),\n      email: v.string(),\n    }),\n    v.null(),\n  ),\n  handler: async (ctx, args) => {\n    return await ctx.db.get(args.userId)\n  },\n})\n```\n\n### Argument and Return Validation\n\nAlways define validators for arguments AND return types:\n\n```typescript\nexport const createTask = mutation({\n  args: {\n    title: v.string(),\n    description: v.optional(v.string()),\n    priority: v.union(v.literal('low'), v.literal('medium'), v.literal('high')),\n  },\n  returns: v.id('tasks'),\n  handler: async (ctx, args) => {\n    return await ctx.db.insert('tasks', {\n      title: args.title,\n      description: args.description,\n      priority: args.priority,\n      completed: false,\n      createdAt: Date.now(),\n    })\n  },\n})\n```\n\n### Query Patterns\n\nUse indexes instead of filters for efficient queries:\n\n```typescript\n\u002F\u002F Schema with index\nexport default defineSchema({\n  tasks: defineTable({\n    userId: v.id('users'),\n    status: v.string(),\n    createdAt: v.number(),\n  })\n    .index('by_user', ['userId'])\n    .index('by_user_and_status', ['userId', 'status']),\n})\n\n\u002F\u002F Query using index\nexport const getTasksByUser = query({\n  args: { userId: v.id('users') },\n  returns: v.array(\n    v.object({\n      _id: v.id('tasks'),\n      _creationTime: v.number(),\n      userId: v.id('users'),\n      status: v.string(),\n      createdAt: v.number(),\n    }),\n  ),\n  handler: async (ctx, args) => {\n    return await ctx.db\n      .query('tasks')\n      .withIndex('by_user', (q) => q.eq('userId', args.userId))\n      .order('desc')\n      .collect()\n  },\n})\n```\n\n### Error Handling\n\nUse ConvexError for user-facing errors:\n\n```typescript\nimport { ConvexError } from 'convex\u002Fvalues'\n\nexport const updateTask = mutation({\n  args: {\n    taskId: v.id('tasks'),\n    title: v.string(),\n  },\n  returns: v.null(),\n  handler: async (ctx, args) => {\n    const task = await ctx.db.get(args.taskId)\n\n    if (!task) {\n      throw new ConvexError({\n        code: 'NOT_FOUND',\n        message: 'Task not found',\n      })\n    }\n\n    await ctx.db.patch(args.taskId, { title: args.title })\n    return null\n  },\n})\n```\n\n### Avoiding Write Conflicts (Optimistic Concurrency Control)\n\nConvex uses OCC. Follow these patterns to minimize conflicts:\n\n```typescript\n\u002F\u002F GOOD: Make mutations idempotent\nexport const completeTask = mutation({\n  args: { taskId: v.id('tasks') },\n  returns: v.null(),\n  handler: async (ctx, args) => {\n    const task = await ctx.db.get(args.taskId)\n\n    \u002F\u002F Early return if already complete (idempotent)\n    if (!task || task.status === 'completed') {\n      return null\n    }\n\n    await ctx.db.patch(args.taskId, {\n      status: 'completed',\n      completedAt: Date.now(),\n    })\n    return null\n  },\n})\n\n\u002F\u002F GOOD: Patch directly without reading first when possible\nexport const updateNote = mutation({\n  args: { id: v.id('notes'), content: v.string() },\n  returns: v.null(),\n  handler: async (ctx, args) => {\n    \u002F\u002F Patch directly - ctx.db.patch throws if document doesn't exist\n    await ctx.db.patch(args.id, { content: args.content })\n    return null\n  },\n})\n\n\u002F\u002F GOOD: Use Promise.all for parallel independent updates\nexport const reorderItems = mutation({\n  args: { itemIds: v.array(v.id('items')) },\n  returns: v.null(),\n  handler: async (ctx, args) => {\n    const updates = args.itemIds.map((id, index) =>\n      ctx.db.patch(id, { order: index }),\n    )\n    await Promise.all(updates)\n    return null\n  },\n})\n```\n\n### TypeScript Best Practices\n\n```typescript\nimport { Id, Doc } from '.\u002F_generated\u002FdataModel'\n\n\u002F\u002F Use Id type for document references\ntype UserId = Id\u003C'users'>\n\n\u002F\u002F Use Doc type for full documents\ntype User = Doc\u003C'users'>\n\n\u002F\u002F Define Record types properly\nconst userScores: Record\u003CId\u003C'users'>, number> = {}\n```\n\n### Internal vs Public Functions\n\n```typescript\n\u002F\u002F Public function - exposed to clients\nexport const getUser = query({\n  args: { userId: v.id('users') },\n  returns: v.union(\n    v.null(),\n    v.object({\n      \u002F* ... *\u002F\n    }),\n  ),\n  handler: async (ctx, args) => {\n    \u002F\u002F ...\n  },\n})\n\n\u002F\u002F Internal function - only callable from other Convex functions\nexport const _updateUserStats = internalMutation({\n  args: { userId: v.id('users') },\n  returns: v.null(),\n  handler: async (ctx, args) => {\n    \u002F\u002F ...\n  },\n})\n```\n\n## Examples\n\n### Complete CRUD Pattern\n\n```typescript\n\u002F\u002F convex\u002Ftasks.ts\nimport { query, mutation } from '.\u002F_generated\u002Fserver'\nimport { v } from 'convex\u002Fvalues'\nimport { ConvexError } from 'convex\u002Fvalues'\n\nconst taskValidator = v.object({\n  _id: v.id('tasks'),\n  _creationTime: v.number(),\n  title: v.string(),\n  completed: v.boolean(),\n  userId: v.id('users'),\n})\n\nexport const list = query({\n  args: { userId: v.id('users') },\n  returns: v.array(taskValidator),\n  handler: async (ctx, args) => {\n    return await ctx.db\n      .query('tasks')\n      .withIndex('by_user', (q) => q.eq('userId', args.userId))\n      .collect()\n  },\n})\n\nexport const create = mutation({\n  args: {\n    title: v.string(),\n    userId: v.id('users'),\n  },\n  returns: v.id('tasks'),\n  handler: async (ctx, args) => {\n    return await ctx.db.insert('tasks', {\n      title: args.title,\n      completed: false,\n      userId: args.userId,\n    })\n  },\n})\n\nexport const update = mutation({\n  args: {\n    taskId: v.id('tasks'),\n    title: v.optional(v.string()),\n    completed: v.optional(v.boolean()),\n  },\n  returns: v.null(),\n  handler: async (ctx, args) => {\n    const { taskId, ...updates } = args\n\n    \u002F\u002F Remove undefined values\n    const cleanUpdates = Object.fromEntries(\n      Object.entries(updates).filter(([_, v]) => v !== undefined),\n    )\n\n    if (Object.keys(cleanUpdates).length > 0) {\n      await ctx.db.patch(taskId, cleanUpdates)\n    }\n    return null\n  },\n})\n\nexport const remove = mutation({\n  args: { taskId: v.id('tasks') },\n  returns: v.null(),\n  handler: async (ctx, args) => {\n    await ctx.db.delete(args.taskId)\n    return null\n  },\n})\n```\n\n## Best Practices\n\n- Never run `npx convex deploy` unless explicitly instructed\n- Never run any git commands unless explicitly instructed\n- Always define return validators for functions\n- Use indexes for all queries that filter data\n- Make mutations idempotent to handle retries gracefully\n- Use ConvexError for user-facing error messages\n- Organize functions by domain (users.ts, tasks.ts, etc.)\n- Use internal functions for sensitive operations\n- Leverage TypeScript's Id and Doc types\n\n## Common Pitfalls\n\n1. **Using filter instead of withIndex** - Always define indexes and use withIndex\n2. **Missing return validators** - Always specify the returns field\n3. **Non-idempotent mutations** - Check current state before updating\n4. **Reading before patching unnecessarily** - Patch directly when possible\n5. **Not handling null returns** - Document IDs might not exist\n\n## References\n\n- Convex Documentation: https:\u002F\u002Fdocs.convex.dev\u002F\n- Convex LLMs.txt: https:\u002F\u002Fdocs.convex.dev\u002Fllms.txt\n- Best Practices: https:\u002F\u002Fdocs.convex.dev\u002Funderstanding\u002Fbest-practices\u002F\n- Error Handling: https:\u002F\u002Fdocs.convex.dev\u002Ffunctions\u002Ferror-handling\n- Write Conflicts: https:\u002F\u002Fdocs.convex.dev\u002Ferror#1\n",{"name":5,"tags":38,"author":40,"version":41,"description":7,"displayName":42},[19,31,24,39,32],"production","Convex","1.0.0","Convex Best Practices","main","83212e6d909b6a0fe9e93fd5a3ff1723300f5b5b",".claude\u002Fskills\u002Fconvex-best-practices","https:\u002F\u002Fgithub.com\u002Fbaisharg\u002FASTN","https:\u002F\u002Fsafetytalent.org","https:\u002F\u002Fgithub.com\u002Fbaisharg","2026-11-13 23:47:58",{"source":8,"skillName":5,"commands":51,"prompt":61,"zipAvailable":62},[52,55,58],{"tool":53,"command":54},"npx","npx skills add baisharg\u002FASTN --skill convex-best-practices",{"tool":56,"command":57},"bunx","bunx skills add baisharg\u002FASTN --skill convex-best-practices",{"tool":59,"command":60},"pnpm","pnpm dlx skills add baisharg\u002FASTN --skill convex-best-practices","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fbaisharg\u002FASTN\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fconvex-best-practices\u002FSKILL.md",true,[],[65,85,99,113,127,144],{"skillNo":66,"name":67,"nameZh":6,"description":68,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":69,"categories":70,"keywords":76,"publishedAt":33},"01M6CCE5DVER8DQWJDY51HAJF7","schema-builder","Design and generate Convex database schemas with proper validation, indexes, and relationships. Use when creating schema.ts or modifying table definitions.","https:\u002F\u002Fgithub.com\u002Fbaisharg\u002FASTN\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fschema-builder\u002FSKILL.md",[71],{"categoryNo":72,"categoryName":73,"taxonomyType":74,"taxonomyTypeDesc":75},"01JBSEEDCAT000000000000015","视觉设计","SCENARIO","使用场景",[77,78,79,80,28,81,82,83,22,19,84],"schema builder","schema","builder","indexes","use","table","database","generate",{"skillNo":86,"name":87,"nameZh":6,"description":88,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":91,"publishedAt":33},"01M6CCE36AA57CG36R4VHKFRXV","integration-tanstack-start","PostHog integration for TanStack Start full-stack applications","https:\u002F\u002Fgithub.com\u002Fbaisharg\u002FASTN\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fposthog-integration-tanstack-start\u002FSKILL.md",[],[92,93,94,95,96,97,98],"integration","start","tanstack","integration tanstack start","posthog","applications","stack",{"skillNo":100,"name":101,"nameZh":6,"description":102,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":103,"categories":104,"keywords":105,"publishedAt":33},"01M6CCE0FK6N8XAB093X7TTQ4F","migration-helper","Plan and execute Convex schema migrations safely, including adding fields, creating tables, and data transformations. Use when schema changes affect existing data.","https:\u002F\u002Fgithub.com\u002Fbaisharg\u002FASTN\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fmigration-helper\u002FSKILL.md",[],[106,107,108,109,110,111,81,78,112,19],"migration","migration helper","schema migrations safely","data","plan","execute","migrations",{"skillNo":114,"name":115,"nameZh":6,"description":116,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":117,"categories":118,"keywords":119,"publishedAt":33},"01M6CCDY3644G8WXXP0BDNMZPR","gsd:sprint","Autonomous phase execution with Codex validation. Runs plan\u002Fexecute\u002Fverify cycles in a bash loop until done or halted.","https:\u002F\u002Fgithub.com\u002Fbaisharg\u002FASTN\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fgsd-sprint\u002FSKILL.md",[],[115,120,121,28,93,122,123,124,125,110,126,111],"resume","codex","execution","verify","Bash","loop","autonomous",{"skillNo":128,"name":129,"nameZh":6,"description":130,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":131,"categories":132,"keywords":133,"publishedAt":33},"01M6CCDVTZRTFWWGREMV6FF956","gsd:second-opinion","Get a second opinion from OpenAI Codex (GPT-5.2-codex) on code, architecture, or implementation decisions. Use when you want independent verification or an alternative perspective.","https:\u002F\u002Fgithub.com\u002Fbaisharg\u002FASTN\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fgsd-second-opinion\u002FSKILL.md",[],[134,135,136,121,137,138,139,140,141,142,81,143],"gsd:second opinion","second opinion","question","architecture","code","verification","openai","gpt","decisions","implementation",{"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":150,"publishedAt":33},"01M6CCDSDPYYNEDERHP01N30PT","gsd:milestone-sprint","Run entire milestone autonomously with Codex validation. Auto-detects current milestone, executes all phases, and runs audit.","https:\u002F\u002Fgithub.com\u002Fbaisharg\u002FASTN\u002Fblob\u002Fmain\u002F.claude\u002Fskills\u002Fgsd-milestone-sprint\u002FSKILL.md",[],[151,152,28,153,154,155,120,121],"gsd:milestone sprint","run","audit","interactive","auto"]