[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F9FRH8YVVZJQ35Y31BTYKT":3,"skill-same:01M6F9FRH8YVVZJQ35Y31BTYKT":73},{"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":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":51,"commitSha":52,"skillDirectory":53,"forksCount":54,"repositoryHtmlUrl":55,"repositoryHomepageUrl":56,"ownerHtmlUrl":57,"ownerBlogUrl":6,"ownerDescription":58,"updatedAt":59,"install":60,"resources":72},"01M6F9FRH8YVVZJQ35Y31BTYKT","customerio-upgrade-migration",null,"Plan and execute Customer.io SDK upgrades and migrations.\nUse when upgrading customerio-node versions, migrating from\nlegacy APIs, or updating to new SDK patterns.\nTrigger: \"upgrade customer.io\", \"customer.io migration\",\n\"update customer.io sdk\", \"customer.io breaking changes\".","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\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fcustomerio-upgrade-migration\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"customerio upgrade migration","upgrade","migration","upgrades","customer-io","trigger","io","patterns","npx","use","openclaw","edit","write","read","node","plan","Bash","code","update","customer","2026-11-10 10:12:30",false,"---\nname: customerio-upgrade-migration\ndescription: |\n  Plan and execute Customer.io SDK upgrades and migrations.\n  Use when upgrading customerio-node versions, migrating from\n  legacy APIs, or updating to new SDK patterns.\n  Trigger: \"upgrade customer.io\", \"customer.io migration\",\n  \"update customer.io sdk\", \"customer.io breaking changes\".\nallowed-tools: Read, Write, Edit, Bash(npm:*), Bash(npx:*), Glob, Grep\nversion: 1.0.0\nlicense: MIT\nauthor: Jeremy Longshore \u003Cjeremy@intentsolutions.io>\ncompatible-with: claude-code, codex, openclaw\ntags: [saas, customer-io, migration, upgrade]\n\n---\n# Customer.io Upgrade & Migration\n\n## Current State\n!`npm list customerio-node 2>\u002Fdev\u002Fnull | grep customerio || echo 'customerio-node: not installed'`\n!`npm view customerio-node version 2>\u002Fdev\u002Fnull || echo 'Cannot check latest version'`\n\n## Overview\n\nPlan and execute `customerio-node` SDK upgrades safely: assess current version, review breaking changes, apply code migrations, and validate with staged rollout.\n\n## Prerequisites\n\n- Current SDK version identified (`npm list customerio-node`)\n- Test environment available\n- Version control for rollback\n\n## Major Version Migration Reference\n\n### Legacy `CustomerIO` to Modern `TrackClient` + `APIClient`\n\nOlder versions of `customerio-node` used a single `CustomerIO` class. Modern versions split into `TrackClient` (tracking) and `APIClient` (transactional\u002Fbroadcasts).\n\n```typescript\n\u002F\u002F BEFORE — Legacy pattern (customerio-node \u003C 2.x)\nconst CustomerIO = require(\"customerio-node\");\nconst cio = new CustomerIO(siteId, apiKey);\ncio.identify(\"user-1\", { email: \"user@example.com\" });\ncio.track(\"user-1\", { name: \"event_name\" });\n\n\u002F\u002F AFTER — Modern pattern (customerio-node >= 2.x)\nimport { TrackClient, APIClient, RegionUS } from \"customerio-node\";\n\nconst cio = new TrackClient(siteId, apiKey, { region: RegionUS });\nawait cio.identify(\"user-1\", { email: \"user@example.com\" });\nawait cio.track(\"user-1\", { name: \"event_name\", data: {} });\n\nconst api = new APIClient(appApiKey, { region: RegionUS });\nawait api.sendEmail(request);\n```\n\n**Key changes:**\n- `TrackClient` replaces `CustomerIO` for identify\u002Ftrack\n- `APIClient` is new — handles transactional + broadcasts\n- Region is now explicit (`RegionUS` or `RegionEU`)\n- Methods return Promises (must `await`)\n- Event tracking uses `{ name, data }` object instead of positional args\n\n## Instructions\n\n### Step 1: Assess Current Version\n\n```typescript\n\u002F\u002F scripts\u002Fcio-version-check.ts\nimport { readFileSync, existsSync } from \"fs\";\n\nfunction assessVersion() {\n  \u002F\u002F Check installed version\n  const lockPath = \"package-lock.json\";\n  if (existsSync(lockPath)) {\n    const lock = JSON.parse(readFileSync(lockPath, \"utf-8\"));\n    const installed =\n      lock.packages?.[\"node_modules\u002Fcustomerio-node\"]?.version ??\n      lock.dependencies?.[\"customerio-node\"]?.version ??\n      \"not found in lockfile\";\n    console.log(`Installed: customerio-node@${installed}`);\n  }\n\n  \u002F\u002F Check package.json declared version\n  const pkg = JSON.parse(readFileSync(\"package.json\", \"utf-8\"));\n  const declared = pkg.dependencies?.[\"customerio-node\"] ?? \"not declared\";\n  console.log(`Declared: ${declared}`);\n\n  \u002F\u002F Search for usage patterns\n  console.log(\"\\nUsage pattern check:\");\n  console.log(\"- Look for 'new CustomerIO(' → legacy pattern, needs migration\");\n  console.log(\"- Look for 'new TrackClient(' → modern pattern\");\n  console.log(\"- Look for 'RegionUS\u002FRegionEU' → region-aware (good)\");\n}\n\nassessVersion();\n```\n\n### Step 2: Review Breaking Changes\n\n```typescript\n\u002F\u002F Common breaking changes between major versions:\n\n\u002F\u002F v1.x → v2.x:\n\u002F\u002F - CustomerIO class → TrackClient + APIClient\n\u002F\u002F - Callbacks → Promises (async\u002Fawait)\n\u002F\u002F - Region parameter added (defaults to US)\n\u002F\u002F - SendEmailRequest constructor changed\n\n\u002F\u002F v2.x → v3.x:\n\u002F\u002F - Import path may change\n\u002F\u002F - TypeScript types improved\n\u002F\u002F - Error object structure may change\n\n\u002F\u002F Always check the official changelog:\n\u002F\u002F https:\u002F\u002Fgithub.com\u002Fcustomerio\u002Fcustomerio-node\u002Fblob\u002Fmain\u002FCHANGELOG.md\n```\n\n### Step 3: Create Migration Wrapper\n\n```typescript\n\u002F\u002F lib\u002Fcustomerio-migration.ts\n\u002F\u002F Adapter that supports both old and new patterns during migration\n\nimport { TrackClient, APIClient, RegionUS } from \"customerio-node\";\n\nexport class CioMigrationClient {\n  private trackClient: TrackClient;\n  private apiClient: APIClient | null;\n\n  constructor(config: {\n    siteId: string;\n    trackApiKey: string;\n    appApiKey?: string;\n    region?: \"us\" | \"eu\";\n  }) {\n    const region = config.region === \"eu\"\n      ? (await import(\"customerio-node\")).RegionEU\n      : RegionUS;\n\n    this.trackClient = new TrackClient(config.siteId, config.trackApiKey, {\n      region,\n    });\n\n    this.apiClient = config.appApiKey\n      ? new APIClient(config.appApiKey, { region })\n      : null;\n  }\n\n  \u002F\u002F Legacy-compatible identify (accepts both old and new signatures)\n  async identify(userId: string, attrs: Record\u003Cstring, any>): Promise\u003Cvoid> {\n    \u002F\u002F Ensure timestamps are in seconds, not milliseconds\n    if (attrs.created_at && attrs.created_at > 1e12) {\n      attrs.created_at = Math.floor(attrs.created_at \u002F 1000);\n    }\n    await this.trackClient.identify(userId, attrs);\n  }\n\n  \u002F\u002F Legacy-compatible track (normalizes data format)\n  async track(\n    userId: string,\n    eventOrOpts: string | { name: string; data?: Record\u003Cstring, any> },\n    data?: Record\u003Cstring, any>\n  ): Promise\u003Cvoid> {\n    if (typeof eventOrOpts === \"string\") {\n      \u002F\u002F Legacy: track(\"user\", \"event_name\", { key: \"value\" })\n      await this.trackClient.track(userId, {\n        name: eventOrOpts,\n        data: data ?? {},\n      });\n    } else {\n      \u002F\u002F Modern: track(\"user\", { name: \"event_name\", data: {} })\n      await this.trackClient.track(userId, eventOrOpts);\n    }\n  }\n\n  get app(): APIClient {\n    if (!this.apiClient) {\n      throw new Error(\"App API key not configured\");\n    }\n    return this.apiClient;\n  }\n}\n```\n\n### Step 4: Update and Test\n\n```bash\n# Update to latest version\nnpm install customerio-node@latest\n\n# Run your test suite\nnpm test\n\n# Run integration tests against dev workspace\nnpx dotenv -e .env.development -- npx vitest run tests\u002Fcustomerio\n```\n\n### Step 5: Migration Test Suite\n\n```typescript\n\u002F\u002F tests\u002Fcio-migration.test.ts\nimport { describe, it, expect } from \"vitest\";\nimport { TrackClient, APIClient, RegionUS } from \"customerio-node\";\n\nconst cio = new TrackClient(\n  process.env.CUSTOMERIO_SITE_ID!,\n  process.env.CUSTOMERIO_TRACK_API_KEY!,\n  { region: RegionUS }\n);\n\ndescribe(\"Post-migration validation\", () => {\n  const testId = `migration-test-${Date.now()}`;\n\n  it(\"identify works with new client\", async () => {\n    await expect(\n      cio.identify(testId, {\n        email: `${testId}@test.example.com`,\n        created_at: Math.floor(Date.now() \u002F 1000),\n      })\n    ).resolves.not.toThrow();\n  });\n\n  it(\"track works with object format\", async () => {\n    await expect(\n      cio.track(testId, { name: \"migration_test\", data: { version: \"new\" } })\n    ).resolves.not.toThrow();\n  });\n\n  it(\"suppress and destroy work\", async () => {\n    await cio.suppress(testId);\n    await expect(cio.destroy(testId)).resolves.not.toThrow();\n  });\n});\n```\n\n### Step 6: Staged Rollout with Feature Flag\n\n```typescript\n\u002F\u002F Use feature flag to gradually migrate traffic\nimport { createHash } from \"crypto\";\n\nfunction useNewSdk(userId: string, rolloutPercent: number): boolean {\n  const hash = createHash(\"md5\").update(`cio-migration-${userId}`).digest(\"hex\");\n  return parseInt(hash.substring(0, 8), 16) % 100 \u003C rolloutPercent;\n}\n\n\u002F\u002F In your application code:\nif (useNewSdk(userId, 10)) {\n  \u002F\u002F New SDK path\n  await newClient.identify(userId, attrs);\n} else {\n  \u002F\u002F Legacy SDK path (until migration complete)\n  await legacyClient.identify(userId, attrs);\n}\n```\n\n## Migration Checklist\n\n- [ ] Current version documented\n- [ ] Target version identified\n- [ ] Breaking changes reviewed (CHANGELOG.md)\n- [ ] Code changes implemented (TrackClient, region, async\u002Fawait)\n- [ ] Unit tests passing\n- [ ] Integration tests passing against dev workspace\n- [ ] Staging deployment successful\n- [ ] Feature flag for staged rollout ready\n- [ ] Rollback plan documented (pin old version in package.json)\n- [ ] Team notified of migration timeline\n\n## Error Handling\n\n| Issue | Solution |\n|-------|----------|\n| `TrackClient is not a constructor` | Old import style — use `import { TrackClient } from \"customerio-node\"` |\n| `region is not defined` | Import `RegionUS` or `RegionEU` from `customerio-node` |\n| Methods not returning Promises | Upgrade to latest — old versions used callbacks |\n| `TypeError: cio.track is not a function` | Using `APIClient` instead of `TrackClient` for tracking |\n\n## Resources\n\n- [customerio-node CHANGELOG](https:\u002F\u002Fgithub.com\u002Fcustomerio\u002Fcustomerio-node\u002Fblob\u002Fmain\u002FCHANGELOG.md)\n- [customerio-node Releases](https:\u002F\u002Fgithub.com\u002Fcustomerio\u002Fcustomerio-node\u002Freleases)\n- [npm customerio-node](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fcustomerio-node)\n\n## Next Steps\n\nAfter successful migration, proceed to `customerio-ci-integration` for CI\u002FCD setup.\n\n","# Customer.io Upgrade & Migration\n\n## Current State\n!`npm list customerio-node 2>\u002Fdev\u002Fnull | grep customerio || echo 'customerio-node: not installed'`\n!`npm view customerio-node version 2>\u002Fdev\u002Fnull || echo 'Cannot check latest version'`\n\n## Overview\n\nPlan and execute `customerio-node` SDK upgrades safely: assess current version, review breaking changes, apply code migrations, and validate with staged rollout.\n\n## Prerequisites\n\n- Current SDK version identified (`npm list customerio-node`)\n- Test environment available\n- Version control for rollback\n\n## Major Version Migration Reference\n\n### Legacy `CustomerIO` to Modern `TrackClient` + `APIClient`\n\nOlder versions of `customerio-node` used a single `CustomerIO` class. Modern versions split into `TrackClient` (tracking) and `APIClient` (transactional\u002Fbroadcasts).\n\n```typescript\n\u002F\u002F BEFORE — Legacy pattern (customerio-node \u003C 2.x)\nconst CustomerIO = require(\"customerio-node\");\nconst cio = new CustomerIO(siteId, apiKey);\ncio.identify(\"user-1\", { email: \"user@example.com\" });\ncio.track(\"user-1\", { name: \"event_name\" });\n\n\u002F\u002F AFTER — Modern pattern (customerio-node >= 2.x)\nimport { TrackClient, APIClient, RegionUS } from \"customerio-node\";\n\nconst cio = new TrackClient(siteId, apiKey, { region: RegionUS });\nawait cio.identify(\"user-1\", { email: \"user@example.com\" });\nawait cio.track(\"user-1\", { name: \"event_name\", data: {} });\n\nconst api = new APIClient(appApiKey, { region: RegionUS });\nawait api.sendEmail(request);\n```\n\n**Key changes:**\n- `TrackClient` replaces `CustomerIO` for identify\u002Ftrack\n- `APIClient` is new — handles transactional + broadcasts\n- Region is now explicit (`RegionUS` or `RegionEU`)\n- Methods return Promises (must `await`)\n- Event tracking uses `{ name, data }` object instead of positional args\n\n## Instructions\n\n### Step 1: Assess Current Version\n\n```typescript\n\u002F\u002F scripts\u002Fcio-version-check.ts\nimport { readFileSync, existsSync } from \"fs\";\n\nfunction assessVersion() {\n  \u002F\u002F Check installed version\n  const lockPath = \"package-lock.json\";\n  if (existsSync(lockPath)) {\n    const lock = JSON.parse(readFileSync(lockPath, \"utf-8\"));\n    const installed =\n      lock.packages?.[\"node_modules\u002Fcustomerio-node\"]?.version ??\n      lock.dependencies?.[\"customerio-node\"]?.version ??\n      \"not found in lockfile\";\n    console.log(`Installed: customerio-node@${installed}`);\n  }\n\n  \u002F\u002F Check package.json declared version\n  const pkg = JSON.parse(readFileSync(\"package.json\", \"utf-8\"));\n  const declared = pkg.dependencies?.[\"customerio-node\"] ?? \"not declared\";\n  console.log(`Declared: ${declared}`);\n\n  \u002F\u002F Search for usage patterns\n  console.log(\"\\nUsage pattern check:\");\n  console.log(\"- Look for 'new CustomerIO(' → legacy pattern, needs migration\");\n  console.log(\"- Look for 'new TrackClient(' → modern pattern\");\n  console.log(\"- Look for 'RegionUS\u002FRegionEU' → region-aware (good)\");\n}\n\nassessVersion();\n```\n\n### Step 2: Review Breaking Changes\n\n```typescript\n\u002F\u002F Common breaking changes between major versions:\n\n\u002F\u002F v1.x → v2.x:\n\u002F\u002F - CustomerIO class → TrackClient + APIClient\n\u002F\u002F - Callbacks → Promises (async\u002Fawait)\n\u002F\u002F - Region parameter added (defaults to US)\n\u002F\u002F - SendEmailRequest constructor changed\n\n\u002F\u002F v2.x → v3.x:\n\u002F\u002F - Import path may change\n\u002F\u002F - TypeScript types improved\n\u002F\u002F - Error object structure may change\n\n\u002F\u002F Always check the official changelog:\n\u002F\u002F https:\u002F\u002Fgithub.com\u002Fcustomerio\u002Fcustomerio-node\u002Fblob\u002Fmain\u002FCHANGELOG.md\n```\n\n### Step 3: Create Migration Wrapper\n\n```typescript\n\u002F\u002F lib\u002Fcustomerio-migration.ts\n\u002F\u002F Adapter that supports both old and new patterns during migration\n\nimport { TrackClient, APIClient, RegionUS } from \"customerio-node\";\n\nexport class CioMigrationClient {\n  private trackClient: TrackClient;\n  private apiClient: APIClient | null;\n\n  constructor(config: {\n    siteId: string;\n    trackApiKey: string;\n    appApiKey?: string;\n    region?: \"us\" | \"eu\";\n  }) {\n    const region = config.region === \"eu\"\n      ? (await import(\"customerio-node\")).RegionEU\n      : RegionUS;\n\n    this.trackClient = new TrackClient(config.siteId, config.trackApiKey, {\n      region,\n    });\n\n    this.apiClient = config.appApiKey\n      ? new APIClient(config.appApiKey, { region })\n      : null;\n  }\n\n  \u002F\u002F Legacy-compatible identify (accepts both old and new signatures)\n  async identify(userId: string, attrs: Record\u003Cstring, any>): Promise\u003Cvoid> {\n    \u002F\u002F Ensure timestamps are in seconds, not milliseconds\n    if (attrs.created_at && attrs.created_at > 1e12) {\n      attrs.created_at = Math.floor(attrs.created_at \u002F 1000);\n    }\n    await this.trackClient.identify(userId, attrs);\n  }\n\n  \u002F\u002F Legacy-compatible track (normalizes data format)\n  async track(\n    userId: string,\n    eventOrOpts: string | { name: string; data?: Record\u003Cstring, any> },\n    data?: Record\u003Cstring, any>\n  ): Promise\u003Cvoid> {\n    if (typeof eventOrOpts === \"string\") {\n      \u002F\u002F Legacy: track(\"user\", \"event_name\", { key: \"value\" })\n      await this.trackClient.track(userId, {\n        name: eventOrOpts,\n        data: data ?? {},\n      });\n    } else {\n      \u002F\u002F Modern: track(\"user\", { name: \"event_name\", data: {} })\n      await this.trackClient.track(userId, eventOrOpts);\n    }\n  }\n\n  get app(): APIClient {\n    if (!this.apiClient) {\n      throw new Error(\"App API key not configured\");\n    }\n    return this.apiClient;\n  }\n}\n```\n\n### Step 4: Update and Test\n\n```bash\n# Update to latest version\nnpm install customerio-node@latest\n\n# Run your test suite\nnpm test\n\n# Run integration tests against dev workspace\nnpx dotenv -e .env.development -- npx vitest run tests\u002Fcustomerio\n```\n\n### Step 5: Migration Test Suite\n\n```typescript\n\u002F\u002F tests\u002Fcio-migration.test.ts\nimport { describe, it, expect } from \"vitest\";\nimport { TrackClient, APIClient, RegionUS } from \"customerio-node\";\n\nconst cio = new TrackClient(\n  process.env.CUSTOMERIO_SITE_ID!,\n  process.env.CUSTOMERIO_TRACK_API_KEY!,\n  { region: RegionUS }\n);\n\ndescribe(\"Post-migration validation\", () => {\n  const testId = `migration-test-${Date.now()}`;\n\n  it(\"identify works with new client\", async () => {\n    await expect(\n      cio.identify(testId, {\n        email: `${testId}@test.example.com`,\n        created_at: Math.floor(Date.now() \u002F 1000),\n      })\n    ).resolves.not.toThrow();\n  });\n\n  it(\"track works with object format\", async () => {\n    await expect(\n      cio.track(testId, { name: \"migration_test\", data: { version: \"new\" } })\n    ).resolves.not.toThrow();\n  });\n\n  it(\"suppress and destroy work\", async () => {\n    await cio.suppress(testId);\n    await expect(cio.destroy(testId)).resolves.not.toThrow();\n  });\n});\n```\n\n### Step 6: Staged Rollout with Feature Flag\n\n```typescript\n\u002F\u002F Use feature flag to gradually migrate traffic\nimport { createHash } from \"crypto\";\n\nfunction useNewSdk(userId: string, rolloutPercent: number): boolean {\n  const hash = createHash(\"md5\").update(`cio-migration-${userId}`).digest(\"hex\");\n  return parseInt(hash.substring(0, 8), 16) % 100 \u003C rolloutPercent;\n}\n\n\u002F\u002F In your application code:\nif (useNewSdk(userId, 10)) {\n  \u002F\u002F New SDK path\n  await newClient.identify(userId, attrs);\n} else {\n  \u002F\u002F Legacy SDK path (until migration complete)\n  await legacyClient.identify(userId, attrs);\n}\n```\n\n## Migration Checklist\n\n- [ ] Current version documented\n- [ ] Target version identified\n- [ ] Breaking changes reviewed (CHANGELOG.md)\n- [ ] Code changes implemented (TrackClient, region, async\u002Fawait)\n- [ ] Unit tests passing\n- [ ] Integration tests passing against dev workspace\n- [ ] Staging deployment successful\n- [ ] Feature flag for staged rollout ready\n- [ ] Rollback plan documented (pin old version in package.json)\n- [ ] Team notified of migration timeline\n\n## Error Handling\n\n| Issue | Solution |\n|-------|----------|\n| `TrackClient is not a constructor` | Old import style — use `import { TrackClient } from \"customerio-node\"` |\n| `region is not defined` | Import `RegionUS` or `RegionEU` from `customerio-node` |\n| Methods not returning Promises | Upgrade to latest — old versions used callbacks |\n| `TypeError: cio.track is not a function` | Using `APIClient` instead of `TrackClient` for tracking |\n\n## Resources\n\n- [customerio-node CHANGELOG](https:\u002F\u002Fgithub.com\u002Fcustomerio\u002Fcustomerio-node\u002Fblob\u002Fmain\u002FCHANGELOG.md)\n- [customerio-node Releases](https:\u002F\u002Fgithub.com\u002Fcustomerio\u002Fcustomerio-node\u002Freleases)\n- [npm customerio-node](https:\u002F\u002Fwww.npmjs.com\u002Fpackage\u002Fcustomerio-node)\n\n## Next Steps\n\nAfter successful migration, proceed to `customerio-ci-integration` for CI\u002FCD setup.\n\n",{"name":5,"tags":44,"author":46,"license":15,"version":47,"description":48,"allowed-tools":49,"compatible-with":50},[45,23,21,20],"saas","Jeremy Longshore \u003Cjeremy@intentsolutions.io>","1.0.0","Plan and execute Customer.io SDK upgrades and migrations.\nUse when upgrading customerio-node versions, migrating from\nlegacy APIs, or updating to new SDK patterns.\nTrigger: \"upgrade customer.io\", \"customer.io migration\",\n\"update customer.io sdk\", \"customer.io breaking changes\".\n","Read, Write, Edit, Bash(npm:*), Bash(npx:*), Glob, Grep","claude-code, codex, openclaw","main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fcustomerio-upgrade-migration",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":61,"prompt":70,"zipAvailable":71},[62,64,67],{"tool":27,"command":63},"npx skills add ComeOnOliver\u002Fskillshub --skill customerio-upgrade-migration",{"tool":65,"command":66},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill customerio-upgrade-migration",{"tool":68,"command":69},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill customerio-upgrade-migration","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fcustomerio-upgrade-migration\u002FSKILL.md",true,[],[74,88,98,107,113,120],{"skillNo":75,"name":76,"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":77,"categories":78,"keywords":84,"publishedAt":39},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[79],{"categoryNo":80,"categoryName":81,"taxonomyType":82,"taxonomyTypeDesc":83},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[85,86,87],"model","model hierarchy","model hierarchy skill",{"skillNo":89,"name":90,"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":91,"categories":92,"keywords":94,"publishedAt":39},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[93],{"categoryNo":80,"categoryName":81,"taxonomyType":82,"taxonomyTypeDesc":83},[95,96,97],"MCP","zoom","zoom mcp",{"skillNo":99,"name":100,"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":101,"categories":102,"keywords":103,"publishedAt":39},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[104,105,106,96],"sdk","zoom apps sdk","apps",{"skillNo":108,"name":109,"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":110,"categories":111,"keywords":112,"publishedAt":39},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[109],{"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":119,"publishedAt":39},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[118],{"categoryNo":80,"categoryName":81,"taxonomyType":82,"taxonomyTypeDesc":83},[115],{"skillNo":121,"name":122,"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":123,"categories":124,"keywords":125,"publishedAt":39},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[122]]