[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F0XECE5VT1E1CXRJ5DZAPH":3,"skill-same:01M6F0XECE5VT1E1CXRJ5DZAPH":87},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":52,"commitSha":53,"skillDirectory":54,"forksCount":55,"repositoryHtmlUrl":56,"repositoryHomepageUrl":57,"ownerHtmlUrl":58,"ownerBlogUrl":6,"ownerDescription":59,"updatedAt":60,"install":61,"resources":74},"01M6F0XECE5VT1E1CXRJ5DZAPH","testing-strategies",null,"Design comprehensive testing strategies for software quality assurance. Use when planning test coverage, implementing test pyramids, or setting up testing infrastructure. Handles unit testing, integration testing, E2E testing, TDD, and testing best practices.","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fsupercent-io\u002Ftesting-strategies\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43],"testing strategies","strategies","testing","test coverage","integration-test","unit-test","unit","integration testing","software","unit testing","up","quality assurance","coverage","strategy","testing best practices","chatgpt","planning","infrastructure","gemini","design","2026-11-10 10:12:30",false,"---\nname: testing-strategies\ndescription: Design comprehensive testing strategies for software quality assurance. Use when planning test coverage, implementing test pyramids, or setting up testing infrastructure. Handles unit testing, integration testing, E2E testing, TDD, and testing best practices.\nmetadata:\n  tags: testing, test-strategy, TDD, unit-test, integration-test, E2E, test-pyramid\n  platforms: Claude, ChatGPT, Gemini\n---\n\n\n# Testing Strategies\n\n\n## When to use this skill\n\n- **New project**: define a testing strategy\n- **Quality issues**: bugs happen frequently\n- **Before refactoring**: build a safety net\n- **CI\u002FCD setup**: automated tests\n\n## Instructions\n\n### Step 1: Understand the Test Pyramid\n\n```\n       \u002F\\\n      \u002FE2E\\          ← few (slow, expensive)\n     \u002F______\\\n    \u002F        \\\n   \u002FIntegration\\    ← medium\n  \u002F____________\\\n \u002F              \\\n\u002F   Unit Tests   \\  ← many (fast, inexpensive)\n\u002F________________\\\n```\n\n**Ratio guide**:\n- Unit: 70%\n- Integration: 20%\n- E2E: 10%\n\n### Step 2: Unit testing strategy\n\n**Given-When-Then pattern**:\n```typescript\ndescribe('calculateDiscount', () => {\n  it('should apply 10% discount for orders over $100', () => {\n    \u002F\u002F Given: setup\n    const order = { total: 150, customerId: '123' };\n\n    \u002F\u002F When: perform action\n    const discount = calculateDiscount(order);\n\n    \u002F\u002F Then: verify result\n    expect(discount).toBe(15);\n  });\n\n  it('should not apply discount for orders under $100', () => {\n    const order = { total: 50, customerId: '123' };\n    const discount = calculateDiscount(order);\n    expect(discount).toBe(0);\n  });\n\n  it('should throw error for invalid order', () => {\n    const order = { total: -10, customerId: '123' };\n    expect(() => calculateDiscount(order)).toThrow('Invalid order');\n  });\n});\n```\n\n**Mocking strategy**:\n```typescript\n\u002F\u002F Mock external dependencies\njest.mock('..\u002Fservices\u002FemailService');\nimport { sendEmail } from '..\u002Fservices\u002FemailService';\n\ndescribe('UserService', () => {\n  it('should send welcome email on registration', async () => {\n    \u002F\u002F Arrange\n    const mockSendEmail = sendEmail as jest.MockedFunction\u003Ctypeof sendEmail>;\n    mockSendEmail.mockResolvedValueOnce(true);\n\n    \u002F\u002F Act\n    await userService.register({ email: 'test@example.com', password: 'pass' });\n\n    \u002F\u002F Assert\n    expect(mockSendEmail).toHaveBeenCalledWith({\n      to: 'test@example.com',\n      subject: 'Welcome!',\n      body: expect.any(String)\n    });\n  });\n});\n```\n\n### Step 3: Integration Testing\n\n**API endpoint tests**:\n```typescript\ndescribe('POST \u002Fapi\u002Fusers', () => {\n  beforeEach(async () => {\n    await db.user.deleteMany();  \u002F\u002F Clean DB\n  });\n\n  it('should create user with valid data', async () => {\n    const response = await request(app)\n      .post('\u002Fapi\u002Fusers')\n      .send({\n        email: 'test@example.com',\n        username: 'testuser',\n        password: 'Password123!'\n      });\n\n    expect(response.status).toBe(201);\n    expect(response.body.user).toMatchObject({\n      email: 'test@example.com',\n      username: 'testuser'\n    });\n\n    \u002F\u002F Verify it was actually saved to the DB\n    const user = await db.user.findUnique({ where: { email: 'test@example.com' } });\n    expect(user).toBeTruthy();\n  });\n\n  it('should reject duplicate email', async () => {\n    \u002F\u002F Create first user\n    await request(app)\n      .post('\u002Fapi\u002Fusers')\n      .send({ email: 'test@example.com', username: 'user1', password: 'Pass123!' });\n\n    \u002F\u002F Attempt duplicate\n    const response = await request(app)\n      .post('\u002Fapi\u002Fusers')\n      .send({ email: 'test@example.com', username: 'user2', password: 'Pass123!' });\n\n    expect(response.status).toBe(409);\n  });\n});\n```\n\n### Step 4: E2E Testing (Playwright)\n\n```typescript\nimport { test, expect } from '@playwright\u002Ftest';\n\ntest.describe('User Registration Flow', () => {\n  test('should complete full registration process', async ({ page }) => {\n    \u002F\u002F 1. Visit homepage\n    await page.goto('http:\u002F\u002Flocalhost:3000');\n\n    \u002F\u002F 2. Click Sign Up button\n    await page.click('text=Sign Up');\n\n    \u002F\u002F 3. Fill out form\n    await page.fill('input[name=\"email\"]', 'test@example.com');\n    await page.fill('input[name=\"username\"]', 'testuser');\n    await page.fill('input[name=\"password\"]', 'Password123!');\n\n    \u002F\u002F 4. Submit\n    await page.click('button[type=\"submit\"]');\n\n    \u002F\u002F 5. Confirm success message\n    await expect(page.locator('text=Welcome')).toBeVisible();\n\n    \u002F\u002F 6. Confirm redirect to dashboard\n    await expect(page).toHaveURL('http:\u002F\u002Flocalhost:3000\u002Fdashboard');\n\n    \u002F\u002F 7. Confirm user info is displayed\n    await expect(page.locator('text=testuser')).toBeVisible();\n  });\n\n  test('should show error for invalid email', async ({ page }) => {\n    await page.goto('http:\u002F\u002Flocalhost:3000\u002Fsignup');\n    await page.fill('input[name=\"email\"]', 'invalid-email');\n    await page.fill('input[name=\"password\"]', 'Password123!');\n    await page.click('button[type=\"submit\"]');\n\n    await expect(page.locator('text=Invalid email')).toBeVisible();\n  });\n});\n```\n\n### Step 5: TDD (Test-Driven Development)\n\n**Red-Green-Refactor Cycle**:\n\n```typescript\n\u002F\u002F 1. RED: write a failing test\ndescribe('isPalindrome', () => {\n  it('should return true for palindrome', () => {\n    expect(isPalindrome('racecar')).toBe(true);\n  });\n});\n\n\u002F\u002F 2. GREEN: minimal code to pass the test\nfunction isPalindrome(str: string): boolean {\n  return str === str.split('').reverse().join('');\n}\n\n\u002F\u002F 3. REFACTOR: improve the code\nfunction isPalindrome(str: string): boolean {\n  const cleaned = str.toLowerCase().replace(\u002F[^a-z0-9]\u002Fg, '');\n  return cleaned === cleaned.split('').reverse().join('');\n}\n\n\u002F\u002F 4. Additional test cases\nit('should ignore case and spaces', () => {\n  expect(isPalindrome('A man a plan a canal Panama')).toBe(true);\n});\n\nit('should return false for non-palindrome', () => {\n  expect(isPalindrome('hello')).toBe(false);\n});\n```\n\n## Output format\n\n### Testing strategy document\n\n```markdown\n## Testing Strategy\n\n### Coverage Goals\n- Unit Tests: 80%\n- Integration Tests: 60%\n- E2E Tests: Critical user flows\n\n### Test Execution\n- Unit: Every commit (local + CI)\n- Integration: Every PR\n- E2E: Before deployment\n\n### Tools\n- Unit: Jest\n- Integration: Supertest\n- E2E: Playwright\n- Coverage: Istanbul\u002Fnyc\n\n### CI\u002FCD Integration\n- GitHub Actions: Run all tests on PR\n- Fail build if coverage \u003C 80%\n- E2E tests on staging environment\n```\n\n## Constraints\n\n### Required rules (MUST)\n\n1. **Test isolation**: each test is independent\n2. **Fast feedback**: unit tests should be fast (\u003C1 min)\n3. **Deterministic**: same input → same result\n\n### Prohibited items (MUST NOT)\n\n1. **Test dependencies**: do not let test A depend on test B\n2. **Production DB**: do not use a real DB in tests\n3. **Sleep\u002FTimeout**: avoid time-based tests\n\n## Best practices\n\n1. **AAA pattern**: Arrange-Act-Assert\n2. **Test names**: \"should ... when ...\"\n3. **Edge Cases**: boundary values, null, empty values\n4. **Happy Path + Sad Path**: both success\u002Ffailure scenarios\n\n## References\n\n- [Test Pyramid](https:\u002F\u002Fmartinfowler.com\u002Farticles\u002Fpractical-test-pyramid.html)\n- [Jest](https:\u002F\u002Fjestjs.io\u002F)\n- [Playwright](https:\u002F\u002Fplaywright.dev\u002F)\n- [Testing Best Practices](https:\u002F\u002Fgithub.com\u002Fgoldbergyoni\u002Fjavascript-testing-best-practices)\n\n## Metadata\n\n### Version\n- **Current version**: 1.0.0\n- **Last updated**: 2025-01-01\n- **Compatible platforms**: Claude, ChatGPT, Gemini\n\n### Related skills\n- [backend-testing](..\u002Fbackend-testing\u002FSKILL.md)\n- [code-review](..\u002Fcode-review\u002FSKILL.md)\n\n### Tags\n`#testing` `#test-strategy` `#TDD` `#unit-test` `#integration-test` `#E2E` `#code-quality`\n\n## Examples\n\n### Example 1: Basic usage\n\u003C!-- Add example content here -->\n\n### Example 2: Advanced usage\n\u003C!-- Add advanced example content here -->\n","# Testing Strategies\n\n\n## When to use this skill\n\n- **New project**: define a testing strategy\n- **Quality issues**: bugs happen frequently\n- **Before refactoring**: build a safety net\n- **CI\u002FCD setup**: automated tests\n\n## Instructions\n\n### Step 1: Understand the Test Pyramid\n\n```\n       \u002F\\\n      \u002FE2E\\          ← few (slow, expensive)\n     \u002F______\\\n    \u002F        \\\n   \u002FIntegration\\    ← medium\n  \u002F____________\\\n \u002F              \\\n\u002F   Unit Tests   \\  ← many (fast, inexpensive)\n\u002F________________\\\n```\n\n**Ratio guide**:\n- Unit: 70%\n- Integration: 20%\n- E2E: 10%\n\n### Step 2: Unit testing strategy\n\n**Given-When-Then pattern**:\n```typescript\ndescribe('calculateDiscount', () => {\n  it('should apply 10% discount for orders over $100', () => {\n    \u002F\u002F Given: setup\n    const order = { total: 150, customerId: '123' };\n\n    \u002F\u002F When: perform action\n    const discount = calculateDiscount(order);\n\n    \u002F\u002F Then: verify result\n    expect(discount).toBe(15);\n  });\n\n  it('should not apply discount for orders under $100', () => {\n    const order = { total: 50, customerId: '123' };\n    const discount = calculateDiscount(order);\n    expect(discount).toBe(0);\n  });\n\n  it('should throw error for invalid order', () => {\n    const order = { total: -10, customerId: '123' };\n    expect(() => calculateDiscount(order)).toThrow('Invalid order');\n  });\n});\n```\n\n**Mocking strategy**:\n```typescript\n\u002F\u002F Mock external dependencies\njest.mock('..\u002Fservices\u002FemailService');\nimport { sendEmail } from '..\u002Fservices\u002FemailService';\n\ndescribe('UserService', () => {\n  it('should send welcome email on registration', async () => {\n    \u002F\u002F Arrange\n    const mockSendEmail = sendEmail as jest.MockedFunction\u003Ctypeof sendEmail>;\n    mockSendEmail.mockResolvedValueOnce(true);\n\n    \u002F\u002F Act\n    await userService.register({ email: 'test@example.com', password: 'pass' });\n\n    \u002F\u002F Assert\n    expect(mockSendEmail).toHaveBeenCalledWith({\n      to: 'test@example.com',\n      subject: 'Welcome!',\n      body: expect.any(String)\n    });\n  });\n});\n```\n\n### Step 3: Integration Testing\n\n**API endpoint tests**:\n```typescript\ndescribe('POST \u002Fapi\u002Fusers', () => {\n  beforeEach(async () => {\n    await db.user.deleteMany();  \u002F\u002F Clean DB\n  });\n\n  it('should create user with valid data', async () => {\n    const response = await request(app)\n      .post('\u002Fapi\u002Fusers')\n      .send({\n        email: 'test@example.com',\n        username: 'testuser',\n        password: 'Password123!'\n      });\n\n    expect(response.status).toBe(201);\n    expect(response.body.user).toMatchObject({\n      email: 'test@example.com',\n      username: 'testuser'\n    });\n\n    \u002F\u002F Verify it was actually saved to the DB\n    const user = await db.user.findUnique({ where: { email: 'test@example.com' } });\n    expect(user).toBeTruthy();\n  });\n\n  it('should reject duplicate email', async () => {\n    \u002F\u002F Create first user\n    await request(app)\n      .post('\u002Fapi\u002Fusers')\n      .send({ email: 'test@example.com', username: 'user1', password: 'Pass123!' });\n\n    \u002F\u002F Attempt duplicate\n    const response = await request(app)\n      .post('\u002Fapi\u002Fusers')\n      .send({ email: 'test@example.com', username: 'user2', password: 'Pass123!' });\n\n    expect(response.status).toBe(409);\n  });\n});\n```\n\n### Step 4: E2E Testing (Playwright)\n\n```typescript\nimport { test, expect } from '@playwright\u002Ftest';\n\ntest.describe('User Registration Flow', () => {\n  test('should complete full registration process', async ({ page }) => {\n    \u002F\u002F 1. Visit homepage\n    await page.goto('http:\u002F\u002Flocalhost:3000');\n\n    \u002F\u002F 2. Click Sign Up button\n    await page.click('text=Sign Up');\n\n    \u002F\u002F 3. Fill out form\n    await page.fill('input[name=\"email\"]', 'test@example.com');\n    await page.fill('input[name=\"username\"]', 'testuser');\n    await page.fill('input[name=\"password\"]', 'Password123!');\n\n    \u002F\u002F 4. Submit\n    await page.click('button[type=\"submit\"]');\n\n    \u002F\u002F 5. Confirm success message\n    await expect(page.locator('text=Welcome')).toBeVisible();\n\n    \u002F\u002F 6. Confirm redirect to dashboard\n    await expect(page).toHaveURL('http:\u002F\u002Flocalhost:3000\u002Fdashboard');\n\n    \u002F\u002F 7. Confirm user info is displayed\n    await expect(page.locator('text=testuser')).toBeVisible();\n  });\n\n  test('should show error for invalid email', async ({ page }) => {\n    await page.goto('http:\u002F\u002Flocalhost:3000\u002Fsignup');\n    await page.fill('input[name=\"email\"]', 'invalid-email');\n    await page.fill('input[name=\"password\"]', 'Password123!');\n    await page.click('button[type=\"submit\"]');\n\n    await expect(page.locator('text=Invalid email')).toBeVisible();\n  });\n});\n```\n\n### Step 5: TDD (Test-Driven Development)\n\n**Red-Green-Refactor Cycle**:\n\n```typescript\n\u002F\u002F 1. RED: write a failing test\ndescribe('isPalindrome', () => {\n  it('should return true for palindrome', () => {\n    expect(isPalindrome('racecar')).toBe(true);\n  });\n});\n\n\u002F\u002F 2. GREEN: minimal code to pass the test\nfunction isPalindrome(str: string): boolean {\n  return str === str.split('').reverse().join('');\n}\n\n\u002F\u002F 3. REFACTOR: improve the code\nfunction isPalindrome(str: string): boolean {\n  const cleaned = str.toLowerCase().replace(\u002F[^a-z0-9]\u002Fg, '');\n  return cleaned === cleaned.split('').reverse().join('');\n}\n\n\u002F\u002F 4. Additional test cases\nit('should ignore case and spaces', () => {\n  expect(isPalindrome('A man a plan a canal Panama')).toBe(true);\n});\n\nit('should return false for non-palindrome', () => {\n  expect(isPalindrome('hello')).toBe(false);\n});\n```\n\n## Output format\n\n### Testing strategy document\n\n```markdown\n## Testing Strategy\n\n### Coverage Goals\n- Unit Tests: 80%\n- Integration Tests: 60%\n- E2E Tests: Critical user flows\n\n### Test Execution\n- Unit: Every commit (local + CI)\n- Integration: Every PR\n- E2E: Before deployment\n\n### Tools\n- Unit: Jest\n- Integration: Supertest\n- E2E: Playwright\n- Coverage: Istanbul\u002Fnyc\n\n### CI\u002FCD Integration\n- GitHub Actions: Run all tests on PR\n- Fail build if coverage \u003C 80%\n- E2E tests on staging environment\n```\n\n## Constraints\n\n### Required rules (MUST)\n\n1. **Test isolation**: each test is independent\n2. **Fast feedback**: unit tests should be fast (\u003C1 min)\n3. **Deterministic**: same input → same result\n\n### Prohibited items (MUST NOT)\n\n1. **Test dependencies**: do not let test A depend on test B\n2. **Production DB**: do not use a real DB in tests\n3. **Sleep\u002FTimeout**: avoid time-based tests\n\n## Best practices\n\n1. **AAA pattern**: Arrange-Act-Assert\n2. **Test names**: \"should ... when ...\"\n3. **Edge Cases**: boundary values, null, empty values\n4. **Happy Path + Sad Path**: both success\u002Ffailure scenarios\n\n## References\n\n- [Test Pyramid](https:\u002F\u002Fmartinfowler.com\u002Farticles\u002Fpractical-test-pyramid.html)\n- [Jest](https:\u002F\u002Fjestjs.io\u002F)\n- [Playwright](https:\u002F\u002Fplaywright.dev\u002F)\n- [Testing Best Practices](https:\u002F\u002Fgithub.com\u002Fgoldbergyoni\u002Fjavascript-testing-best-practices)\n\n## Metadata\n\n### Version\n- **Current version**: 1.0.0\n- **Last updated**: 2025-01-01\n- **Compatible platforms**: Claude, ChatGPT, Gemini\n\n### Related skills\n- [backend-testing](..\u002Fbackend-testing\u002FSKILL.md)\n- [code-review](..\u002Fcode-review\u002FSKILL.md)\n\n### Tags\n`#testing` `#test-strategy` `#TDD` `#unit-test` `#integration-test` `#E2E` `#code-quality`\n\n## Examples\n\n### Example 1: Basic usage\n\u003C!-- Add example content here -->\n\n### Example 2: Advanced usage\n\u003C!-- Add advanced example content here -->\n",{"name":5,"metadata":49,"description":7},{"tags":50,"platforms":51},"testing, test-strategy, TDD, unit-test, integration-test, E2E, test-pyramid","Claude, ChatGPT, Gemini","main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Faiskillstore\u002Fmarketplace\u002Fsupercent-io\u002Ftesting-strategies",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":62,"prompt":72,"zipAvailable":73},[63,66,69],{"tool":64,"command":65},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill testing-strategies",{"tool":67,"command":68},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill testing-strategies",{"tool":70,"command":71},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill testing-strategies","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fsupercent-io\u002Ftesting-strategies\u002FSKILL.md",true,[75,81],{"path":76,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":79,"sourceHtmlUrl":80},"skill-report.json","REFERENCE","参考文档",8466,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fsupercent-io\u002Ftesting-strategies\u002Fskill-report.json",{"path":82,"resourceType":83,"resourceTypeDesc":84,"sizeBytes":85,"sourceHtmlUrl":86},"SKILL.toon","OTHER","其他",549,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fsupercent-io\u002Ftesting-strategies\u002FSKILL.toon",[88,100,110,119,125,132],{"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":96,"publishedAt":44},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[93],{"categoryNo":94,"categoryName":95,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[97,98,99],"model","model hierarchy","model hierarchy skill",{"skillNo":101,"name":102,"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":103,"categories":104,"keywords":106,"publishedAt":44},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[105],{"categoryNo":94,"categoryName":95,"taxonomyType":21,"taxonomyTypeDesc":22},[107,108,109],"MCP","zoom","zoom mcp",{"skillNo":111,"name":112,"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":113,"categories":114,"keywords":115,"publishedAt":44},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[116,117,118,108],"sdk","zoom apps sdk","apps",{"skillNo":120,"name":121,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":122,"categories":123,"keywords":124,"publishedAt":44},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[121],{"skillNo":126,"name":127,"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":128,"categories":129,"keywords":131,"publishedAt":44},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[130],{"categoryNo":94,"categoryName":95,"taxonomyType":21,"taxonomyTypeDesc":22},[127],{"skillNo":133,"name":134,"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":135,"categories":136,"keywords":137,"publishedAt":44},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[134]]