[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6CVKZ23ESXF4FQK88FSDCGV":3,"skill-same:01M6CVKZ23ESXF4FQK88FSDCGV":98},{"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":31,"publishedAt":51,"linkOnly":52,"markdownContent":53,"markdownBody":54,"frontMatter":55,"refName":58,"commitSha":59,"skillDirectory":60,"forksCount":61,"repositoryHtmlUrl":62,"repositoryHomepageUrl":62,"ownerHtmlUrl":63,"ownerBlogUrl":6,"ownerDescription":64,"updatedAt":65,"install":66,"resources":79},"01M6CVKZ23ESXF4FQK88FSDCGV","segment-cdp",null,"Expert patterns for Segment Customer Data Platform including Analytics.js, server-side tracking, tracking plans with Protocols, identity resolution, destinations configuration, and data governance best practices.","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\u002Fsegment-cdp\u002FSKILL.md",[18,23,26],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000010","后端与接口","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000013","分析与可视化",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000033","数据分析师","PROFESSION","适用职业",[32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50],"cdp","segment cdp","server","identity resolution","patterns","configuration","expert","tracking","js","data","safe","protocols","apache","data governance","best practices","governance","analytics","identity","customer","2026-11-10 10:12:30",false,"---\nname: segment-cdp\ndescription: Expert patterns for Segment Customer Data Platform including\n  Analytics.js, server-side tracking, tracking plans with Protocols, identity\n  resolution, destinations configuration, and data governance best practices.\nrisk: safe\nsource: vibeship-spawner-skills (Apache 2.0)\ndate_added: 2026-02-27\n---\n\n# Segment CDP\n\nExpert patterns for Segment Customer Data Platform including Analytics.js,\nserver-side tracking, tracking plans with Protocols, identity resolution,\ndestinations configuration, and data governance best practices.\n\n## Patterns\n\n### Analytics.js Browser Integration\n\nClient-side tracking with Analytics.js. Include track, identify, page,\nand group calls. Anonymous ID persists until identify merges with user.\n\n\u002F\u002F Next.js - Analytics provider component\n\u002F\u002F lib\u002Fsegment.ts\nimport { AnalyticsBrowser } from '@segment\u002Fanalytics-next';\n\nexport const analytics = AnalyticsBrowser.load({\n  writeKey: process.env.NEXT_PUBLIC_SEGMENT_WRITE_KEY!,\n});\n\n\u002F\u002F Typed event helpers\nexport interface UserTraits {\n  email?: string;\n  name?: string;\n  plan?: 'free' | 'pro' | 'enterprise';\n  createdAt?: string;\n  company?: {\n    id: string;\n    name: string;\n  };\n}\n\nexport function identify(userId: string, traits?: UserTraits) {\n  analytics.identify(userId, traits);\n}\n\nexport function track\u003CT extends Record\u003Cstring, any>>(\n  event: string,\n  properties?: T\n) {\n  analytics.track(event, properties);\n}\n\nexport function page(name?: string, properties?: Record\u003Cstring, any>) {\n  analytics.page(name, properties);\n}\n\nexport function group(groupId: string, traits?: Record\u003Cstring, any>) {\n  analytics.group(groupId, traits);\n}\n\n\u002F\u002F React hook for analytics\n\u002F\u002F hooks\u002FuseAnalytics.ts\nimport { useEffect } from 'react';\nimport { usePathname, useSearchParams } from 'next\u002Fnavigation';\nimport { analytics, page } from '@\u002Flib\u002Fsegment';\n\nexport function usePageTracking() {\n  const pathname = usePathname();\n  const searchParams = useSearchParams();\n\n  useEffect(() => {\n    \u002F\u002F Track page view on route change\n    page(pathname, {\n      path: pathname,\n      search: searchParams.toString(),\n      url: window.location.href,\n      title: document.title,\n    });\n  }, [pathname, searchParams]);\n}\n\n\u002F\u002F Usage in _app.tsx or layout.tsx\nfunction RootLayout({ children }) {\n  usePageTracking();\n\n  return \u003Chtml>{children}\u003C\u002Fhtml>;\n}\n\n\u002F\u002F Event tracking in components\nfunction PricingButton({ plan }: { plan: string }) {\n  const handleClick = () => {\n    track('Plan Selected', {\n      plan_name: plan,\n      page: 'pricing',\n      source: 'pricing_page',\n    });\n  };\n\n  return \u003Cbutton onClick={handleClick}>Select {plan}\u003C\u002Fbutton>;\n}\n\n\u002F\u002F Identify on auth\nfunction onUserLogin(user: User) {\n  identify(user.id, {\n    email: user.email,\n    name: user.name,\n    plan: user.plan,\n    createdAt: user.createdAt,\n  });\n\n  track('User Signed In', {\n    method: 'email',\n  });\n}\n\n### Context\n\n- browser tracking\n- website analytics\n- client-side events\n\n### Server-Side Tracking with Node.js\n\nHigh-performance server-side tracking using @segment\u002Fanalytics-node.\nNon-blocking with internal batching. Essential for backend events,\nwebhooks, and sensitive data.\n\n\u002F\u002F lib\u002Fsegment-server.ts\nimport { Analytics } from '@segment\u002Fanalytics-node';\n\n\u002F\u002F Initialize once\nconst analytics = new Analytics({\n  writeKey: process.env.SEGMENT_WRITE_KEY!,\n  flushAt: 20,      \u002F\u002F Batch size before flush\n  flushInterval: 10000,  \u002F\u002F Flush every 10 seconds\n});\n\n\u002F\u002F Typed server-side tracking\nexport interface ServerContext {\n  ip?: string;\n  userAgent?: string;\n  locale?: string;\n}\n\nexport function serverIdentify(\n  userId: string,\n  traits: Record\u003Cstring, any>,\n  context?: ServerContext\n) {\n  analytics.identify({\n    userId,\n    traits,\n    context: {\n      ip: context?.ip,\n      userAgent: context?.userAgent,\n      locale: context?.locale,\n    },\n  });\n}\n\nexport function serverTrack(\n  userId: string,\n  event: string,\n  properties?: Record\u003Cstring, any>,\n  context?: ServerContext\n) {\n  analytics.track({\n    userId,\n    event,\n    properties,\n    timestamp: new Date(),\n    context: {\n      ip: context?.ip,\n      userAgent: context?.userAgent,\n    },\n  });\n}\n\n\u002F\u002F Flush on shutdown\nexport async function closeAnalytics() {\n  await analytics.closeAndFlush();\n}\n\n\u002F\u002F Usage in API routes\n\u002F\u002F app\u002Fapi\u002Fwebhooks\u002Fstripe\u002Froute.ts\nexport async function POST(req: Request) {\n  const event = await req.json();\n\n  switch (event.type) {\n    case 'checkout.session.completed':\n      const session = event.data.object;\n\n      serverTrack(\n        session.client_reference_id,\n        'Order Completed',\n        {\n          order_id: session.id,\n          total: session.amount_total \u002F 100,\n          currency: session.currency,\n          payment_method: session.payment_method_types[0],\n        },\n        { ip: req.headers.get('x-forwarded-for') || undefined }\n      );\n\n      \u002F\u002F Also update user traits\n      serverIdentify(session.client_reference_id, {\n        total_spent: session.amount_total \u002F 100,\n        last_purchase_date: new Date().toISOString(),\n      });\n      break;\n\n    case 'customer.subscription.created':\n      serverTrack(\n        event.data.object.metadata.user_id,\n        'Subscription Started',\n        {\n          plan: event.data.object.items.data[0].price.nickname,\n          amount: event.data.object.items.data[0].price.unit_amount \u002F 100,\n          interval: event.data.object.items.data[0].price.recurring.interval,\n        }\n      );\n      break;\n  }\n\n  return new Response('ok');\n}\n\n\u002F\u002F Graceful shutdown\nprocess.on('SIGTERM', async () => {\n  await closeAnalytics();\n  process.exit(0);\n});\n\n### Context\n\n- server-side tracking\n- backend events\n- webhook processing\n\n### Tracking Plan Design\n\nDesign event schemas using Object + Action naming convention.\nDefine required properties, types, and validation rules.\nConnect to Protocols for enforcement.\n\n\u002F\u002F Tracking plan definition (conceptual YAML structure)\n\u002F\u002F This maps to Segment Protocols configuration\n\u002F*\ntracking_plan:\n  display_name: \"MyApp Tracking Plan\"\n  rules:\n    events:\n      - name: \"User Signed Up\"\n        description: \"User completed registration\"\n        rules:\n          required:\n            - signup_method\n          properties:\n            signup_method:\n              type: string\n              enum: [email, google, github]\n            referral_code:\n              type: string\n            utm_source:\n              type: string\n\n      - name: \"Product Viewed\"\n        description: \"User viewed a product page\"\n        rules:\n          required:\n            - product_id\n            - product_name\n          properties:\n            product_id:\n              type: string\n            product_name:\n              type: string\n            category:\n              type: string\n            price:\n              type: number\n            currency:\n              type: string\n              default: USD\n\n      - name: \"Order Completed\"\n        description: \"User completed a purchase\"\n        rules:\n          required:\n            - order_id\n            - total\n            - products\n          properties:\n            order_id:\n              type: string\n            total:\n              type: number\n            currency:\n              type: string\n            products:\n              type: array\n              items:\n                type: object\n                properties:\n                  product_id: { type: string }\n                  name: { type: string }\n                  price: { type: number }\n                  quantity: { type: integer }\n\n    identify:\n      traits:\n        - name: email\n          type: string\n          required: true\n        - name: name\n          type: string\n        - name: plan\n          type: string\n          enum: [free, pro, enterprise]\n        - name: company\n          type: object\n          properties:\n            id: { type: string }\n            name: { type: string }\n*\u002F\n\n\u002F\u002F TypeScript implementation with type safety\n\u002F\u002F types\u002Fsegment-events.ts\nexport interface TrackingEvents {\n  'User Signed Up': {\n    signup_method: 'email' | 'google' | 'github';\n    referral_code?: string;\n    utm_source?: string;\n  };\n\n  'Product Viewed': {\n    product_id: string;\n    product_name: string;\n    category?: string;\n    price?: number;\n    currency?: string;\n  };\n\n  'Order Completed': {\n    order_id: string;\n    total: number;\n    currency?: string;\n    products: Array\u003C{\n      product_id: string;\n      name: string;\n      price: number;\n      quantity: number;\n    }>;\n  };\n\n  'Feature Used': {\n    feature_name: string;\n    usage_count?: number;\n  };\n}\n\n\u002F\u002F Type-safe track function\nexport function trackEvent\u003CT extends keyof TrackingEvents>(\n  event: T,\n  properties: TrackingEvents[T]\n) {\n  analytics.track(event, properties);\n}\n\n\u002F\u002F Usage - compile-time type checking\ntrackEvent('Order Completed', {\n  order_id: 'ord_123',\n  total: 99.99,\n  products: [\n    { product_id: 'prod_1', name: 'Widget', price: 49.99, quantity: 2 },\n  ],\n});\n\n\u002F\u002F This would be a TypeScript error:\n\u002F\u002F trackEvent('Order Completed', { total: 99.99 });  \u002F\u002F Missing order_id\n\n### Context\n\n- tracking plan\n- data governance\n- event schema\n\n### Identity Resolution\n\nTrack anonymous users, then merge with identified users via identify().\nUse alias() for identity merging between systems. Group users into\ncompanies\u002Forganizations.\n\n\u002F\u002F Identity flow implementation\n\u002F\u002F lib\u002Fidentity.ts\n\n\u002F\u002F Anonymous user tracking\nexport function trackAnonymousAction(event: string, properties?: object) {\n  \u002F\u002F Analytics.js automatically generates anonymousId\n  analytics.track(event, properties);\n}\n\n\u002F\u002F When user signs up or logs in\nexport async function identifyUser(user: {\n  id: string;\n  email: string;\n  name?: string;\n  plan?: string;\n}) {\n  \u002F\u002F This merges anonymous history with user profile\n  await analytics.identify(user.id, {\n    email: user.email,\n    name: user.name,\n    plan: user.plan,\n    created_at: new Date().toISOString(),\n  });\n\n  \u002F\u002F Track the identification event\n  analytics.track('User Identified', {\n    method: 'signup',\n  });\n}\n\n\u002F\u002F B2B: Associate user with company\nexport function associateWithCompany(company: {\n  id: string;\n  name: string;\n  plan?: string;\n  employees?: number;\n  industry?: string;\n}) {\n  analytics.group(company.id, {\n    name: company.name,\n    plan: company.plan,\n    employees: company.employees,\n    industry: company.industry,\n  });\n}\n\n\u002F\u002F Alias: Link identities (e.g., pre-signup email to user ID)\nexport function linkIdentities(previousId: string, newUserId: string) {\n  \u002F\u002F Use when you identified someone with a temporary ID\n  \u002F\u002F and now have their permanent user ID\n  analytics.alias(newUserId, previousId);\n}\n\n\u002F\u002F Full signup flow\nexport async function handleSignup(\n  email: string,\n  password: string,\n  company?: { name: string; size: string }\n) {\n  \u002F\u002F 1. Create user in your system\n  const user = await createUser(email, password);\n\n  \u002F\u002F 2. Identify with Segment (merges anonymous history)\n  await identifyUser({\n    id: user.id,\n    email: user.email,\n    name: user.name,\n    plan: 'free',\n  });\n\n  \u002F\u002F 3. Track signup event\n  analytics.track('User Signed Up', {\n    signup_method: 'email',\n    plan: 'free',\n  });\n\n  \u002F\u002F 4. If B2B, associate with company\n  if (company) {\n    const companyRecord = await createCompany(company, user.id);\n\n    associateWithCompany({\n      id: companyRecord.id,\n      name: company.name,\n      employees: parseInt(company.size),\n    });\n  }\n}\n\n### Context\n\n- user identification\n- anonymous tracking\n- b2b tracking\n\n### Destinations Configuration\n\nRoute data to analytics tools, data warehouses, and marketing platforms.\nUse device-mode for client-side tools, cloud-mode for server processing.\n\n\u002F\u002F Segment destinations are configured in the Segment UI\n\u002F\u002F but here's how to optimize your implementation\n\n\u002F\u002F Conditional tracking based on destination needs\n\u002F\u002F lib\u002Fsegment-destinations.ts\n\ninterface DestinationConfig {\n  mixpanel: boolean;\n  amplitude: boolean;\n  googleAnalytics: boolean;\n  warehouse: boolean;\n  hubspot: boolean;\n}\n\n\u002F\u002F Only send events needed by specific destinations\nexport function trackWithDestinations(\n  event: string,\n  properties: Record\u003Cstring, any>,\n  options?: {\n    integrations?: Partial\u003CDestinationConfig>;\n  }\n) {\n  analytics.track(event, properties, {\n    integrations: {\n      \u002F\u002F Override specific destinations\n      All: true,  \u002F\u002F Send to all by default\n      ...options?.integrations,\n    },\n  });\n}\n\n\u002F\u002F Example: Track revenue event only to revenue-tracking destinations\nexport function trackRevenue(order: {\n  orderId: string;\n  total: number;\n  currency: string;\n}) {\n  analytics.track('Order Completed', {\n    order_id: order.orderId,\n    revenue: order.total,\n    currency: order.currency,\n  }, {\n    integrations: {\n      \u002F\u002F Explicitly enable revenue destinations\n      'Google Analytics 4': true,\n      'Mixpanel': true,\n      'Amplitude': true,\n      \u002F\u002F Disable non-revenue destinations\n      'Intercom': false,\n      'Zendesk': false,\n    },\n  });\n}\n\n\u002F\u002F Send PII only to secure destinations\nexport function identifyWithPII(userId: string, traits: {\n  email: string;\n  phone?: string;\n  address?: string;\n}) {\n  analytics.identify(userId, traits, {\n    integrations: {\n      'All': false,  \u002F\u002F Disable all by default\n      \u002F\u002F Only send PII to trusted destinations\n      'HubSpot': true,\n      'Salesforce': true,\n      'Warehouse': true,  \u002F\u002F Your data warehouse\n      \u002F\u002F Don't send PII to analytics tools\n      'Mixpanel': false,\n      'Amplitude': false,\n    },\n  });\n}\n\n\u002F\u002F Context enrichment for all events\nexport function enrichedTrack(\n  event: string,\n  properties: Record\u003Cstring, any>\n) {\n  analytics.track(event, {\n    ...properties,\n    \u002F\u002F Add common context\n    app_version: process.env.NEXT_PUBLIC_APP_VERSION,\n    environment: process.env.NODE_ENV,\n    timestamp: new Date().toISOString(),\n  }, {\n    context: {\n      app: {\n        name: 'MyApp',\n        version: process.env.NEXT_PUBLIC_APP_VERSION,\n      },\n    },\n  });\n}\n\n### Context\n\n- data routing\n- destination setup\n- tool integration\n\n### HTTP Tracking API\n\nDirect HTTP API for any environment. Useful for edge functions,\nworkers, and non-Node.js backends. Batch up to 500KB per request.\n\n\u002F\u002F Edge\u002FServerless tracking via HTTP API\n\u002F\u002F lib\u002Fsegment-http.ts\n\nconst SEGMENT_WRITE_KEY = process.env.SEGMENT_WRITE_KEY!;\nconst SEGMENT_API = 'https:\u002F\u002Fapi.segment.io\u002Fv1';\n\n\u002F\u002F Base64 encode write key for auth\nconst authHeader = `Basic ${btoa(SEGMENT_WRITE_KEY + ':')}`;\n\ninterface SegmentEvent {\n  userId?: string;\n  anonymousId?: string;\n  event?: string;\n  name?: string;  \u002F\u002F For page calls\n  properties?: Record\u003Cstring, any>;\n  traits?: Record\u003Cstring, any>;\n  context?: Record\u003Cstring, any>;\n  timestamp?: string;\n}\n\nasync function segmentRequest(\n  endpoint: string,\n  payload: SegmentEvent\n): Promise\u003Cvoid> {\n  const response = await fetch(`${SEGMENT_API}${endpoint}`, {\n    method: 'POST',\n    headers: {\n      'Authorization': authHeader,\n      'Content-Type': 'application\u002Fjson',\n    },\n    body: JSON.stringify({\n      ...payload,\n      timestamp: payload.timestamp || new Date().toISOString(),\n    }),\n  });\n\n  if (!response.ok) {\n    console.error('Segment API error:', await response.text());\n  }\n}\n\n\u002F\u002F HTTP API methods\nexport async function httpIdentify(\n  userId: string,\n  traits: Record\u003Cstring, any>,\n  context?: Record\u003Cstring, any>\n) {\n  await segmentRequest('\u002Fidentify', {\n    userId,\n    traits,\n    context,\n  });\n}\n\nexport async function httpTrack(\n  userId: string,\n  event: string,\n  properties?: Record\u003Cstring, any>,\n  context?: Record\u003Cstring, any>\n) {\n  await segmentRequest('\u002Ftrack', {\n    userId,\n    event,\n    properties,\n    context,\n  });\n}\n\nexport async function httpPage(\n  userId: string,\n  name: string,\n  properties?: Record\u003Cstring, any>\n) {\n  await segmentRequest('\u002Fpage', {\n    userId,\n    name,\n    properties,\n  });\n}\n\n\u002F\u002F Batch API for high volume\nexport async function httpBatch(\n  events: Array\u003C{\n    type: 'identify' | 'track' | 'page' | 'group';\n    userId?: string;\n    anonymousId?: string;\n    event?: string;\n    name?: string;\n    properties?: Record\u003Cstring, any>;\n    traits?: Record\u003Cstring, any>;\n  }>\n) {\n  \u002F\u002F Max 500KB per batch, 32KB per event\n  await segmentRequest('\u002Fbatch', {\n    batch: events.map(e => ({\n      ...e,\n      timestamp: new Date().toISOString(),\n    })),\n  } as any);\n}\n\n\u002F\u002F Cloudflare Worker example\nexport default {\n  async fetch(request: Request): Promise\u003CResponse> {\n    const { userId, action, data } = await request.json();\n\n    \u002F\u002F Track in edge function\n    await httpTrack(userId, action, data, {\n      ip: request.headers.get('cf-connecting-ip'),\n      userAgent: request.headers.get('user-agent'),\n    });\n\n    return new Response('ok');\n  },\n};\n\n### Context\n\n- edge functions\n- serverless\n- http tracking\n\n## Sharp Edges\n\n### Anonymous ID Persists Until Explicit Reset\n\nSeverity: MEDIUM\n\n### Device Mode Bypasses Protocols Blocking\n\nSeverity: HIGH\n\n### HTTP API Has Strict Size Limits\n\nSeverity: MEDIUM\n\n### Track Calls Without Identify Are Anonymous\n\nSeverity: HIGH\n\n### Write Key in Client is Visible (But Intentional)\n\nSeverity: LOW\n\n### Events May Be Lost on Page Navigation\n\nSeverity: MEDIUM\n\n### Timestamps Without Timezone Cause Analytics Issues\n\nSeverity: MEDIUM\n\n### Tracking Before Consent Violates GDPR\n\nSeverity: HIGH\n\n## Validation Checks\n\n### Dynamic Event Name\n\nSeverity: ERROR\n\nEvent names should be static, not include dynamic values\n\nMessage: Dynamic event name detected. Use static event names with dynamic properties.\n\n### Inconsistent Event Name Casing\n\nSeverity: WARNING\n\nEvent names should follow consistent casing convention\n\nMessage: Mixed casing in event name. Use consistent convention (e.g., Title Case).\n\n### Track Without Prior Identify\n\nSeverity: WARNING\n\nUsers should be identified before tracking critical events\n\nMessage: Revenue\u002Fconversion event without identify. Ensure user is identified.\n\n### Missing Analytics Reset on Logout\n\nSeverity: WARNING\n\nAnalytics should be reset when user logs out\n\nMessage: Logout without analytics.reset(). Anonymous ID will persist to next user.\n\n### Hardcoded Segment Write Key\n\nSeverity: ERROR\n\nWrite key should use environment variables\n\nMessage: Hardcoded Segment write key. Use environment variables.\n\n### PII Sent to All Destinations\n\nSeverity: WARNING\n\nPII should have destination controls\n\nMessage: PII in tracking without destination controls. Consider limiting destinations.\n\n### Event Without Proper Timestamp\n\nSeverity: INFO\n\nExplicit timestamps help with historical data\n\nMessage: Server track without explicit timestamp. Consider adding timestamp.\n\n### Potentially Large Property Values\n\nSeverity: WARNING\n\nProperties over 32KB will be rejected\n\nMessage: Potentially large property value. Segment has 32KB per event limit.\n\n### Tracking Before Consent Check\n\nSeverity: ERROR\n\nGDPR requires consent before tracking\n\nMessage: Tracking without consent check. Implement consent management for GDPR.\n\n## Collaboration\n\n### Delegation Triggers\n\n- user needs A\u002FB testing -> analytics-specialist (Segment + LaunchDarkly\u002FOptimizely integration)\n- user needs data warehouse -> data-engineer (Segment to BigQuery\u002FSnowflake\u002FRedshift)\n- user needs customer support integration -> zendesk-integration (Identify calls syncing to support tools)\n- user needs marketing automation -> hubspot-integration (Segment to HubSpot destination)\n- user needs consent management -> privacy-specialist (GDPR\u002FCCPA compliance with Segment)\n\n## When to Use\n\n- User mentions or implies: segment\n- User mentions or implies: analytics.js\n- User mentions or implies: customer data platform\n- User mentions or implies: cdp\n- User mentions or implies: tracking plan\n- User mentions or implies: event tracking\n- User mentions or implies: identify track page\n- User mentions or implies: data routing\n","# Segment CDP\n\nExpert patterns for Segment Customer Data Platform including Analytics.js,\nserver-side tracking, tracking plans with Protocols, identity resolution,\ndestinations configuration, and data governance best practices.\n\n## Patterns\n\n### Analytics.js Browser Integration\n\nClient-side tracking with Analytics.js. Include track, identify, page,\nand group calls. Anonymous ID persists until identify merges with user.\n\n\u002F\u002F Next.js - Analytics provider component\n\u002F\u002F lib\u002Fsegment.ts\nimport { AnalyticsBrowser } from '@segment\u002Fanalytics-next';\n\nexport const analytics = AnalyticsBrowser.load({\n  writeKey: process.env.NEXT_PUBLIC_SEGMENT_WRITE_KEY!,\n});\n\n\u002F\u002F Typed event helpers\nexport interface UserTraits {\n  email?: string;\n  name?: string;\n  plan?: 'free' | 'pro' | 'enterprise';\n  createdAt?: string;\n  company?: {\n    id: string;\n    name: string;\n  };\n}\n\nexport function identify(userId: string, traits?: UserTraits) {\n  analytics.identify(userId, traits);\n}\n\nexport function track\u003CT extends Record\u003Cstring, any>>(\n  event: string,\n  properties?: T\n) {\n  analytics.track(event, properties);\n}\n\nexport function page(name?: string, properties?: Record\u003Cstring, any>) {\n  analytics.page(name, properties);\n}\n\nexport function group(groupId: string, traits?: Record\u003Cstring, any>) {\n  analytics.group(groupId, traits);\n}\n\n\u002F\u002F React hook for analytics\n\u002F\u002F hooks\u002FuseAnalytics.ts\nimport { useEffect } from 'react';\nimport { usePathname, useSearchParams } from 'next\u002Fnavigation';\nimport { analytics, page } from '@\u002Flib\u002Fsegment';\n\nexport function usePageTracking() {\n  const pathname = usePathname();\n  const searchParams = useSearchParams();\n\n  useEffect(() => {\n    \u002F\u002F Track page view on route change\n    page(pathname, {\n      path: pathname,\n      search: searchParams.toString(),\n      url: window.location.href,\n      title: document.title,\n    });\n  }, [pathname, searchParams]);\n}\n\n\u002F\u002F Usage in _app.tsx or layout.tsx\nfunction RootLayout({ children }) {\n  usePageTracking();\n\n  return \u003Chtml>{children}\u003C\u002Fhtml>;\n}\n\n\u002F\u002F Event tracking in components\nfunction PricingButton({ plan }: { plan: string }) {\n  const handleClick = () => {\n    track('Plan Selected', {\n      plan_name: plan,\n      page: 'pricing',\n      source: 'pricing_page',\n    });\n  };\n\n  return \u003Cbutton onClick={handleClick}>Select {plan}\u003C\u002Fbutton>;\n}\n\n\u002F\u002F Identify on auth\nfunction onUserLogin(user: User) {\n  identify(user.id, {\n    email: user.email,\n    name: user.name,\n    plan: user.plan,\n    createdAt: user.createdAt,\n  });\n\n  track('User Signed In', {\n    method: 'email',\n  });\n}\n\n### Context\n\n- browser tracking\n- website analytics\n- client-side events\n\n### Server-Side Tracking with Node.js\n\nHigh-performance server-side tracking using @segment\u002Fanalytics-node.\nNon-blocking with internal batching. Essential for backend events,\nwebhooks, and sensitive data.\n\n\u002F\u002F lib\u002Fsegment-server.ts\nimport { Analytics } from '@segment\u002Fanalytics-node';\n\n\u002F\u002F Initialize once\nconst analytics = new Analytics({\n  writeKey: process.env.SEGMENT_WRITE_KEY!,\n  flushAt: 20,      \u002F\u002F Batch size before flush\n  flushInterval: 10000,  \u002F\u002F Flush every 10 seconds\n});\n\n\u002F\u002F Typed server-side tracking\nexport interface ServerContext {\n  ip?: string;\n  userAgent?: string;\n  locale?: string;\n}\n\nexport function serverIdentify(\n  userId: string,\n  traits: Record\u003Cstring, any>,\n  context?: ServerContext\n) {\n  analytics.identify({\n    userId,\n    traits,\n    context: {\n      ip: context?.ip,\n      userAgent: context?.userAgent,\n      locale: context?.locale,\n    },\n  });\n}\n\nexport function serverTrack(\n  userId: string,\n  event: string,\n  properties?: Record\u003Cstring, any>,\n  context?: ServerContext\n) {\n  analytics.track({\n    userId,\n    event,\n    properties,\n    timestamp: new Date(),\n    context: {\n      ip: context?.ip,\n      userAgent: context?.userAgent,\n    },\n  });\n}\n\n\u002F\u002F Flush on shutdown\nexport async function closeAnalytics() {\n  await analytics.closeAndFlush();\n}\n\n\u002F\u002F Usage in API routes\n\u002F\u002F app\u002Fapi\u002Fwebhooks\u002Fstripe\u002Froute.ts\nexport async function POST(req: Request) {\n  const event = await req.json();\n\n  switch (event.type) {\n    case 'checkout.session.completed':\n      const session = event.data.object;\n\n      serverTrack(\n        session.client_reference_id,\n        'Order Completed',\n        {\n          order_id: session.id,\n          total: session.amount_total \u002F 100,\n          currency: session.currency,\n          payment_method: session.payment_method_types[0],\n        },\n        { ip: req.headers.get('x-forwarded-for') || undefined }\n      );\n\n      \u002F\u002F Also update user traits\n      serverIdentify(session.client_reference_id, {\n        total_spent: session.amount_total \u002F 100,\n        last_purchase_date: new Date().toISOString(),\n      });\n      break;\n\n    case 'customer.subscription.created':\n      serverTrack(\n        event.data.object.metadata.user_id,\n        'Subscription Started',\n        {\n          plan: event.data.object.items.data[0].price.nickname,\n          amount: event.data.object.items.data[0].price.unit_amount \u002F 100,\n          interval: event.data.object.items.data[0].price.recurring.interval,\n        }\n      );\n      break;\n  }\n\n  return new Response('ok');\n}\n\n\u002F\u002F Graceful shutdown\nprocess.on('SIGTERM', async () => {\n  await closeAnalytics();\n  process.exit(0);\n});\n\n### Context\n\n- server-side tracking\n- backend events\n- webhook processing\n\n### Tracking Plan Design\n\nDesign event schemas using Object + Action naming convention.\nDefine required properties, types, and validation rules.\nConnect to Protocols for enforcement.\n\n\u002F\u002F Tracking plan definition (conceptual YAML structure)\n\u002F\u002F This maps to Segment Protocols configuration\n\u002F*\ntracking_plan:\n  display_name: \"MyApp Tracking Plan\"\n  rules:\n    events:\n      - name: \"User Signed Up\"\n        description: \"User completed registration\"\n        rules:\n          required:\n            - signup_method\n          properties:\n            signup_method:\n              type: string\n              enum: [email, google, github]\n            referral_code:\n              type: string\n            utm_source:\n              type: string\n\n      - name: \"Product Viewed\"\n        description: \"User viewed a product page\"\n        rules:\n          required:\n            - product_id\n            - product_name\n          properties:\n            product_id:\n              type: string\n            product_name:\n              type: string\n            category:\n              type: string\n            price:\n              type: number\n            currency:\n              type: string\n              default: USD\n\n      - name: \"Order Completed\"\n        description: \"User completed a purchase\"\n        rules:\n          required:\n            - order_id\n            - total\n            - products\n          properties:\n            order_id:\n              type: string\n            total:\n              type: number\n            currency:\n              type: string\n            products:\n              type: array\n              items:\n                type: object\n                properties:\n                  product_id: { type: string }\n                  name: { type: string }\n                  price: { type: number }\n                  quantity: { type: integer }\n\n    identify:\n      traits:\n        - name: email\n          type: string\n          required: true\n        - name: name\n          type: string\n        - name: plan\n          type: string\n          enum: [free, pro, enterprise]\n        - name: company\n          type: object\n          properties:\n            id: { type: string }\n            name: { type: string }\n*\u002F\n\n\u002F\u002F TypeScript implementation with type safety\n\u002F\u002F types\u002Fsegment-events.ts\nexport interface TrackingEvents {\n  'User Signed Up': {\n    signup_method: 'email' | 'google' | 'github';\n    referral_code?: string;\n    utm_source?: string;\n  };\n\n  'Product Viewed': {\n    product_id: string;\n    product_name: string;\n    category?: string;\n    price?: number;\n    currency?: string;\n  };\n\n  'Order Completed': {\n    order_id: string;\n    total: number;\n    currency?: string;\n    products: Array\u003C{\n      product_id: string;\n      name: string;\n      price: number;\n      quantity: number;\n    }>;\n  };\n\n  'Feature Used': {\n    feature_name: string;\n    usage_count?: number;\n  };\n}\n\n\u002F\u002F Type-safe track function\nexport function trackEvent\u003CT extends keyof TrackingEvents>(\n  event: T,\n  properties: TrackingEvents[T]\n) {\n  analytics.track(event, properties);\n}\n\n\u002F\u002F Usage - compile-time type checking\ntrackEvent('Order Completed', {\n  order_id: 'ord_123',\n  total: 99.99,\n  products: [\n    { product_id: 'prod_1', name: 'Widget', price: 49.99, quantity: 2 },\n  ],\n});\n\n\u002F\u002F This would be a TypeScript error:\n\u002F\u002F trackEvent('Order Completed', { total: 99.99 });  \u002F\u002F Missing order_id\n\n### Context\n\n- tracking plan\n- data governance\n- event schema\n\n### Identity Resolution\n\nTrack anonymous users, then merge with identified users via identify().\nUse alias() for identity merging between systems. Group users into\ncompanies\u002Forganizations.\n\n\u002F\u002F Identity flow implementation\n\u002F\u002F lib\u002Fidentity.ts\n\n\u002F\u002F Anonymous user tracking\nexport function trackAnonymousAction(event: string, properties?: object) {\n  \u002F\u002F Analytics.js automatically generates anonymousId\n  analytics.track(event, properties);\n}\n\n\u002F\u002F When user signs up or logs in\nexport async function identifyUser(user: {\n  id: string;\n  email: string;\n  name?: string;\n  plan?: string;\n}) {\n  \u002F\u002F This merges anonymous history with user profile\n  await analytics.identify(user.id, {\n    email: user.email,\n    name: user.name,\n    plan: user.plan,\n    created_at: new Date().toISOString(),\n  });\n\n  \u002F\u002F Track the identification event\n  analytics.track('User Identified', {\n    method: 'signup',\n  });\n}\n\n\u002F\u002F B2B: Associate user with company\nexport function associateWithCompany(company: {\n  id: string;\n  name: string;\n  plan?: string;\n  employees?: number;\n  industry?: string;\n}) {\n  analytics.group(company.id, {\n    name: company.name,\n    plan: company.plan,\n    employees: company.employees,\n    industry: company.industry,\n  });\n}\n\n\u002F\u002F Alias: Link identities (e.g., pre-signup email to user ID)\nexport function linkIdentities(previousId: string, newUserId: string) {\n  \u002F\u002F Use when you identified someone with a temporary ID\n  \u002F\u002F and now have their permanent user ID\n  analytics.alias(newUserId, previousId);\n}\n\n\u002F\u002F Full signup flow\nexport async function handleSignup(\n  email: string,\n  password: string,\n  company?: { name: string; size: string }\n) {\n  \u002F\u002F 1. Create user in your system\n  const user = await createUser(email, password);\n\n  \u002F\u002F 2. Identify with Segment (merges anonymous history)\n  await identifyUser({\n    id: user.id,\n    email: user.email,\n    name: user.name,\n    plan: 'free',\n  });\n\n  \u002F\u002F 3. Track signup event\n  analytics.track('User Signed Up', {\n    signup_method: 'email',\n    plan: 'free',\n  });\n\n  \u002F\u002F 4. If B2B, associate with company\n  if (company) {\n    const companyRecord = await createCompany(company, user.id);\n\n    associateWithCompany({\n      id: companyRecord.id,\n      name: company.name,\n      employees: parseInt(company.size),\n    });\n  }\n}\n\n### Context\n\n- user identification\n- anonymous tracking\n- b2b tracking\n\n### Destinations Configuration\n\nRoute data to analytics tools, data warehouses, and marketing platforms.\nUse device-mode for client-side tools, cloud-mode for server processing.\n\n\u002F\u002F Segment destinations are configured in the Segment UI\n\u002F\u002F but here's how to optimize your implementation\n\n\u002F\u002F Conditional tracking based on destination needs\n\u002F\u002F lib\u002Fsegment-destinations.ts\n\ninterface DestinationConfig {\n  mixpanel: boolean;\n  amplitude: boolean;\n  googleAnalytics: boolean;\n  warehouse: boolean;\n  hubspot: boolean;\n}\n\n\u002F\u002F Only send events needed by specific destinations\nexport function trackWithDestinations(\n  event: string,\n  properties: Record\u003Cstring, any>,\n  options?: {\n    integrations?: Partial\u003CDestinationConfig>;\n  }\n) {\n  analytics.track(event, properties, {\n    integrations: {\n      \u002F\u002F Override specific destinations\n      All: true,  \u002F\u002F Send to all by default\n      ...options?.integrations,\n    },\n  });\n}\n\n\u002F\u002F Example: Track revenue event only to revenue-tracking destinations\nexport function trackRevenue(order: {\n  orderId: string;\n  total: number;\n  currency: string;\n}) {\n  analytics.track('Order Completed', {\n    order_id: order.orderId,\n    revenue: order.total,\n    currency: order.currency,\n  }, {\n    integrations: {\n      \u002F\u002F Explicitly enable revenue destinations\n      'Google Analytics 4': true,\n      'Mixpanel': true,\n      'Amplitude': true,\n      \u002F\u002F Disable non-revenue destinations\n      'Intercom': false,\n      'Zendesk': false,\n    },\n  });\n}\n\n\u002F\u002F Send PII only to secure destinations\nexport function identifyWithPII(userId: string, traits: {\n  email: string;\n  phone?: string;\n  address?: string;\n}) {\n  analytics.identify(userId, traits, {\n    integrations: {\n      'All': false,  \u002F\u002F Disable all by default\n      \u002F\u002F Only send PII to trusted destinations\n      'HubSpot': true,\n      'Salesforce': true,\n      'Warehouse': true,  \u002F\u002F Your data warehouse\n      \u002F\u002F Don't send PII to analytics tools\n      'Mixpanel': false,\n      'Amplitude': false,\n    },\n  });\n}\n\n\u002F\u002F Context enrichment for all events\nexport function enrichedTrack(\n  event: string,\n  properties: Record\u003Cstring, any>\n) {\n  analytics.track(event, {\n    ...properties,\n    \u002F\u002F Add common context\n    app_version: process.env.NEXT_PUBLIC_APP_VERSION,\n    environment: process.env.NODE_ENV,\n    timestamp: new Date().toISOString(),\n  }, {\n    context: {\n      app: {\n        name: 'MyApp',\n        version: process.env.NEXT_PUBLIC_APP_VERSION,\n      },\n    },\n  });\n}\n\n### Context\n\n- data routing\n- destination setup\n- tool integration\n\n### HTTP Tracking API\n\nDirect HTTP API for any environment. Useful for edge functions,\nworkers, and non-Node.js backends. Batch up to 500KB per request.\n\n\u002F\u002F Edge\u002FServerless tracking via HTTP API\n\u002F\u002F lib\u002Fsegment-http.ts\n\nconst SEGMENT_WRITE_KEY = process.env.SEGMENT_WRITE_KEY!;\nconst SEGMENT_API = 'https:\u002F\u002Fapi.segment.io\u002Fv1';\n\n\u002F\u002F Base64 encode write key for auth\nconst authHeader = `Basic ${btoa(SEGMENT_WRITE_KEY + ':')}`;\n\ninterface SegmentEvent {\n  userId?: string;\n  anonymousId?: string;\n  event?: string;\n  name?: string;  \u002F\u002F For page calls\n  properties?: Record\u003Cstring, any>;\n  traits?: Record\u003Cstring, any>;\n  context?: Record\u003Cstring, any>;\n  timestamp?: string;\n}\n\nasync function segmentRequest(\n  endpoint: string,\n  payload: SegmentEvent\n): Promise\u003Cvoid> {\n  const response = await fetch(`${SEGMENT_API}${endpoint}`, {\n    method: 'POST',\n    headers: {\n      'Authorization': authHeader,\n      'Content-Type': 'application\u002Fjson',\n    },\n    body: JSON.stringify({\n      ...payload,\n      timestamp: payload.timestamp || new Date().toISOString(),\n    }),\n  });\n\n  if (!response.ok) {\n    console.error('Segment API error:', await response.text());\n  }\n}\n\n\u002F\u002F HTTP API methods\nexport async function httpIdentify(\n  userId: string,\n  traits: Record\u003Cstring, any>,\n  context?: Record\u003Cstring, any>\n) {\n  await segmentRequest('\u002Fidentify', {\n    userId,\n    traits,\n    context,\n  });\n}\n\nexport async function httpTrack(\n  userId: string,\n  event: string,\n  properties?: Record\u003Cstring, any>,\n  context?: Record\u003Cstring, any>\n) {\n  await segmentRequest('\u002Ftrack', {\n    userId,\n    event,\n    properties,\n    context,\n  });\n}\n\nexport async function httpPage(\n  userId: string,\n  name: string,\n  properties?: Record\u003Cstring, any>\n) {\n  await segmentRequest('\u002Fpage', {\n    userId,\n    name,\n    properties,\n  });\n}\n\n\u002F\u002F Batch API for high volume\nexport async function httpBatch(\n  events: Array\u003C{\n    type: 'identify' | 'track' | 'page' | 'group';\n    userId?: string;\n    anonymousId?: string;\n    event?: string;\n    name?: string;\n    properties?: Record\u003Cstring, any>;\n    traits?: Record\u003Cstring, any>;\n  }>\n) {\n  \u002F\u002F Max 500KB per batch, 32KB per event\n  await segmentRequest('\u002Fbatch', {\n    batch: events.map(e => ({\n      ...e,\n      timestamp: new Date().toISOString(),\n    })),\n  } as any);\n}\n\n\u002F\u002F Cloudflare Worker example\nexport default {\n  async fetch(request: Request): Promise\u003CResponse> {\n    const { userId, action, data } = await request.json();\n\n    \u002F\u002F Track in edge function\n    await httpTrack(userId, action, data, {\n      ip: request.headers.get('cf-connecting-ip'),\n      userAgent: request.headers.get('user-agent'),\n    });\n\n    return new Response('ok');\n  },\n};\n\n### Context\n\n- edge functions\n- serverless\n- http tracking\n\n## Sharp Edges\n\n### Anonymous ID Persists Until Explicit Reset\n\nSeverity: MEDIUM\n\n### Device Mode Bypasses Protocols Blocking\n\nSeverity: HIGH\n\n### HTTP API Has Strict Size Limits\n\nSeverity: MEDIUM\n\n### Track Calls Without Identify Are Anonymous\n\nSeverity: HIGH\n\n### Write Key in Client is Visible (But Intentional)\n\nSeverity: LOW\n\n### Events May Be Lost on Page Navigation\n\nSeverity: MEDIUM\n\n### Timestamps Without Timezone Cause Analytics Issues\n\nSeverity: MEDIUM\n\n### Tracking Before Consent Violates GDPR\n\nSeverity: HIGH\n\n## Validation Checks\n\n### Dynamic Event Name\n\nSeverity: ERROR\n\nEvent names should be static, not include dynamic values\n\nMessage: Dynamic event name detected. Use static event names with dynamic properties.\n\n### Inconsistent Event Name Casing\n\nSeverity: WARNING\n\nEvent names should follow consistent casing convention\n\nMessage: Mixed casing in event name. Use consistent convention (e.g., Title Case).\n\n### Track Without Prior Identify\n\nSeverity: WARNING\n\nUsers should be identified before tracking critical events\n\nMessage: Revenue\u002Fconversion event without identify. Ensure user is identified.\n\n### Missing Analytics Reset on Logout\n\nSeverity: WARNING\n\nAnalytics should be reset when user logs out\n\nMessage: Logout without analytics.reset(). Anonymous ID will persist to next user.\n\n### Hardcoded Segment Write Key\n\nSeverity: ERROR\n\nWrite key should use environment variables\n\nMessage: Hardcoded Segment write key. Use environment variables.\n\n### PII Sent to All Destinations\n\nSeverity: WARNING\n\nPII should have destination controls\n\nMessage: PII in tracking without destination controls. Consider limiting destinations.\n\n### Event Without Proper Timestamp\n\nSeverity: INFO\n\nExplicit timestamps help with historical data\n\nMessage: Server track without explicit timestamp. Consider adding timestamp.\n\n### Potentially Large Property Values\n\nSeverity: WARNING\n\nProperties over 32KB will be rejected\n\nMessage: Potentially large property value. Segment has 32KB per event limit.\n\n### Tracking Before Consent Check\n\nSeverity: ERROR\n\nGDPR requires consent before tracking\n\nMessage: Tracking without consent check. Implement consent management for GDPR.\n\n## Collaboration\n\n### Delegation Triggers\n\n- user needs A\u002FB testing -> analytics-specialist (Segment + LaunchDarkly\u002FOptimizely integration)\n- user needs data warehouse -> data-engineer (Segment to BigQuery\u002FSnowflake\u002FRedshift)\n- user needs customer support integration -> zendesk-integration (Identify calls syncing to support tools)\n- user needs marketing automation -> hubspot-integration (Segment to HubSpot destination)\n- user needs consent management -> privacy-specialist (GDPR\u002FCCPA compliance with Segment)\n\n## When to Use\n\n- User mentions or implies: segment\n- User mentions or implies: analytics.js\n- User mentions or implies: customer data platform\n- User mentions or implies: cdp\n- User mentions or implies: tracking plan\n- User mentions or implies: event tracking\n- User mentions or implies: identify track page\n- User mentions or implies: data routing\n",{"name":5,"risk":42,"source":56,"date_added":57,"description":7},"vibeship-spawner-skills (Apache 2.0)",1772150400000,"main","a50a3aa6b39fb0e1b7db88bef1bfc9c93606e126","modules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fsegment-cdp",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":67,"prompt":77,"zipAvailable":78},[68,71,74],{"tool":69,"command":70},"npx","npx skills add Sam-06060\u002Fjarvis-assistant --skill segment-cdp",{"tool":72,"command":73},"bunx","bunx skills add Sam-06060\u002Fjarvis-assistant --skill segment-cdp",{"tool":75,"command":76},"pnpm","pnpm dlx skills add Sam-06060\u002Fjarvis-assistant --skill segment-cdp","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fsegment-cdp\u002FSKILL.md",true,[80,86,90,94],{"path":81,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":84,"sourceHtmlUrl":85},"Integration.md","REFERENCE","参考文档",1211,"https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002FPersonal_AI_Infrastructure\u002FReleases\u002Fv4.0.1\u002F.claude\u002Fskills\u002FThinking\u002FRedTeam\u002FIntegration.md",{"path":87,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":88,"sourceHtmlUrl":89},"Philosophy.md",1195,"https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002FPersonal_AI_Infrastructure\u002FReleases\u002Fv4.0.1\u002F.claude\u002Fskills\u002FThinking\u002FRedTeam\u002FPhilosophy.md",{"path":91,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":92,"sourceHtmlUrl":93},"Workflows\u002FAdversarialValidation.md",7880,"https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002FPersonal_AI_Infrastructure\u002FReleases\u002Fv4.0.1\u002F.claude\u002Fskills\u002FThinking\u002FRedTeam\u002FWorkflows\u002FAdversarialValidation.md",{"path":95,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":96,"sourceHtmlUrl":97},"Workflows\u002FParallelAnalysis.md",19396,"https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002FPersonal_AI_Infrastructure\u002FReleases\u002Fv4.0.1\u002F.claude\u002Fskills\u002FThinking\u002FRedTeam\u002FWorkflows\u002FParallelAnalysis.md",[99,110,126,152,171,196],{"skillNo":100,"name":101,"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":102,"categories":103,"keywords":107,"publishedAt":51},"01M6GDRVS6FXX3ESH0C9DW01C0","test_skill","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fscratch\u002Ftest_skill\u002FSKILL.md",[104],{"categoryNo":105,"categoryName":106,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",[108,109],"Test Skill","test",{"skillNo":111,"name":112,"nameZh":6,"description":113,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":116,"publishedAt":51},"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",[],[117,118,119,120,121,122,36,123,124,125],"zustand store ts","zustand","store","with","types","middleware","community","create","typescript",{"skillNo":127,"name":128,"nameZh":6,"description":129,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":130,"categories":131,"keywords":135,"publishedAt":51},"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",[132],{"categoryNo":133,"categoryName":134,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[136,137,138,139,140,141,142,143,144,145,146,147,148,149,123,150,151,39],"automation","zoom automation","zoom","first","Tools","search","MCP","via","meeting","automate","critical","creation","webinars","composio","recordings","management",{"skillNo":153,"name":154,"nameZh":6,"description":155,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":156,"categories":157,"keywords":159,"publishedAt":51},"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",[158],{"categoryNo":133,"categoryName":134,"taxonomyType":21,"taxonomyTypeDesc":22},[160,136,161,162,163,164,165,123,141,166,149,167,146,145,140,168,124,169,142,170],"crm automation","zoho crm","crm","zoho crm automation","zoho","leads","contacts","records","update","tasks","manage",{"skillNo":172,"name":173,"nameZh":6,"description":174,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":175,"categories":176,"keywords":180,"publishedAt":51},"01M6GDRCKQBAVTGHX5XBH26KPZ","zod-validation-expert","Expert in Zod — TypeScript-first schema validation. Covers parsing, custom errors, refinements, type inference, and integration with React Hook Form, Next.js, and tRPC.","https:\u002F\u002Fgithub.com\u002FSam-06060\u002Fjarvis-assistant\u002Fblob\u002Fmain\u002Fmodules\u002Fagent_skills\u002Fawesome-skills\u002Fplaybooks\u002Fzod-validation-expert\u002FSKILL.md",[177],{"categoryNo":178,"categoryName":179,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",[38,181,182,183,184,125,42,185,186,187,188,189,120,190,191,192,193,123,194,195],"zod","zod validation expert","validation","react","parsing","errors","schema validation","react hook form","hook","trpc","form","type","next","schema","Next.js",{"skillNo":197,"name":198,"nameZh":6,"description":199,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":200,"categories":201,"keywords":203,"publishedAt":51},"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",[202],{"categoryNo":133,"categoryName":134,"taxonomyType":21,"taxonomyTypeDesc":22},[204,205,206,207,208,209,210,211,123,212,213,214,215,216,41,217,218,219,220,142],"zeroize audit","audit","write","passwords","get","project","c++","activate","assembly","read","Bash","secrets","analysis","flow","verification","code","rust"]