[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EQ17YKZ9PKWCDMF2PMHPD7":3,"skill-same:01M6EQ17YKZ9PKWCDMF2PMHPD7":88},{"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":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":49,"commitSha":50,"skillDirectory":51,"forksCount":52,"repositoryHtmlUrl":53,"repositoryHomepageUrl":54,"ownerHtmlUrl":55,"ownerBlogUrl":6,"ownerDescription":56,"updatedAt":57,"install":58,"resources":71},"01M6EQ17YKZ9PKWCDMF2PMHPD7","testing",null,"Expert at Playwright E2E tests, Vitest unit tests, Storybook interaction tests. Use when writing tests, debugging test failures, or improving test coverage.","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\u002Fcrazyswami\u002Ftesting\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[5,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"vitest","unit","interaction","tests","expert","test coverage","use","coverage","write","read","Bash","e2e","writing tests","debugging","e2e tests","unit tests","test","playwright","writing","2026-11-10 10:12:30",false,"---\nname: testing\ndescription: Expert at Playwright E2E tests, Vitest unit tests, Storybook interaction tests. Use when writing tests, debugging test failures, or improving test coverage.\nallowed-tools: Read, Write, Edit, Bash, Grep, Glob\n---\n\n# Testing Specialist\n\nYou are an expert at testing TypeScript\u002FReact applications using Playwright, Vitest, and Storybook.\n\n## When To Use\n\nClaude should automatically use this skill when:\n- User asks to write tests or improve coverage\n- User mentions Playwright, Vitest, E2E, unit tests\n- Debugging test failures\n- Setting up test infrastructure\n\n## Testing Stack\n\n| Tool | Purpose | Location |\n|------|---------|----------|\n| Playwright | E2E browser tests | `e2e\u002F*.spec.ts` |\n| Vitest | Unit\u002Fintegration tests | `src\u002F**\u002F*.test.ts` |\n| Storybook | Component visual tests | `src\u002F**\u002F*.stories.tsx` |\n\n## CRITICAL: Read Before Write (Reconnaissance-Then-Action)\n\nBefore writing ANY E2E test, you MUST:\n\n1. **Read the component source file** (e.g., `Toolbar.tsx`, `Editor.tsx`)\n2. **Identify stable selectors** in this priority order:\n   - `data-testid` attributes (explicit testing contract)\n   - `title` attributes (accessibility, stable)\n   - `aria-label` attributes (accessibility)\n   - Text content (fragile, last resort)\n3. **Extract exact values** from the source - never guess or assume\n\n### Selector Priority (Playwright Official)\n\n| Priority | Method | Example | Stability |\n|----------|--------|---------|-----------|\n| 1 | data-testid | `page.getByTestId('save-btn')` | Most stable |\n| 2 | role + name | `page.getByRole('button', { name: 'Save' })` | Stable |\n| 3 | title | `page.locator('[title=\"Save\"]')` | Stable |\n| 4 | text | `page.getByText('Save')` | Fragile |\n\n**NEVER use:** CSS classes, XPath, or auto-generated IDs\n\n### Anti-Pattern: Speculative Selectors\n\n```typescript\n\u002F\u002F ❌ WRONG - Guessing without reading source\nawait editor.clickToolbarButton('B');  \u002F\u002F Assumes button text is \"B\"\n\n\u002F\u002F ✅ CORRECT - After reading Toolbar.tsx:54 shows title=\"Bold (Cmd+B)\"\nawait editor.clickToolbarButton('Bold (Cmd+B)');\n```\n\n### data-testid Convention\n\nWhen adding test IDs to components, use format: `{scope}-{element}-{type}`\n\n```tsx\ndata-testid=\"toolbar-bold-button\"\ndata-testid=\"editor-content-area\"\ndata-testid=\"sidebar-note-list\"\n```\n\n---\n\n## Playwright E2E Tests\n\n### File Structure\n```\ne2e\u002F\n├── fixtures\u002F\n│   └── editor-helpers.ts   # Shared test utilities\n├── editor.spec.ts          # Editor functionality\n├── formatting.spec.ts      # Text formatting\n├── headings.spec.ts        # Heading toggles\n├── lists.spec.ts           # List operations\n├── blocks.spec.ts          # Block elements\n├── keyboard-shortcuts.spec.ts\n├── toolbar.spec.ts\n└── history.spec.ts\n```\n\n### Test Pattern\n```typescript\nimport { test, expect } from '@playwright\u002Ftest';\nimport { EditorHelper } from '.\u002Ffixtures\u002Feditor-helpers';\n\ntest.describe('Feature Name', () => {\n  let editor: EditorHelper;\n\n  test.beforeEach(async ({ page }) => {\n    editor = new EditorHelper(page);\n    await editor.goto();\n  });\n\n  test('descriptive test name', async () => {\n    await editor.type('test content');\n    await editor.selectAll();\n    \u002F\u002F Use title from Toolbar.tsx - NOT guessed text\n    await editor.clickToolbarButton('Bold (Cmd+B)');\n    await editor.expectElement('strong');\n  });\n});\n```\n\n### EditorHelper Methods\n```typescript\neditor.goto()                      \u002F\u002F Navigate to app\neditor.clear()                     \u002F\u002F Clear editor content\neditor.type(text)                  \u002F\u002F Type text\neditor.selectAll()                 \u002F\u002F Select all (Cmd+A)\neditor.clickToolbarButton(title)   \u002F\u002F Click toolbar button by title attribute\neditor.isToolbarButtonActive(title) \u002F\u002F Check button state by title\neditor.expectText(text)            \u002F\u002F Assert text exists\neditor.expectElement(selector)     \u002F\u002F Assert element exists\neditor.pressShortcut(key)          \u002F\u002F Press keyboard shortcut\n```\n\n### Toolbar Button Titles (from Toolbar.tsx)\n\n| Button | Title Attribute |\n|--------|-----------------|\n| Bold | `Bold (Cmd+B)` |\n| Italic | `Italic (Cmd+I)` |\n| Underline | `Underline (Cmd+U)` |\n| Strike | `Strikethrough` |\n| H1 | `Heading 1` |\n| H2 | `Heading 2` |\n| H3 | `Heading 3` |\n| Bullet List | `Bullet List` |\n| Numbered List | `Numbered List` |\n| Task List | `Task List` |\n| Quote | `Quote` |\n| Code | `Code Block` |\n| Undo | `Undo (Cmd+Z)` |\n| Redo | `Redo (Cmd+Shift+Z)` |\n| New | `New Document` |\n| Open | `Open Document` |\n| Save | `Save Document` |\n\n### Commands\n```bash\npnpm test:e2e           # Run all E2E tests\npnpm test:e2e:ui        # Open Playwright UI\npnpm test:e2e:headed    # Run with browser visible\npnpm test:e2e:chromium  # Chrome only\npnpm test:e2e:webkit    # Safari only\n```\n\n## Vitest Unit Tests\n\n### File Naming\n- Component: `ComponentName.test.tsx`\n- Hook: `useHookName.test.ts`\n- Utility: `utilName.test.ts`\n\n### Test Pattern\n```typescript\nimport { describe, it, expect, vi } from 'vitest';\nimport { functionName } from '.\u002Fmodule';\n\ndescribe('functionName', () => {\n  it('should do something', () => {\n    const result = functionName(input);\n    expect(result).toBe(expected);\n  });\n\n  it('should handle edge case', () => {\n    expect(() => functionName(null)).toThrow();\n  });\n});\n```\n\n### Hook Testing\n```typescript\nimport { renderHook, act } from '@testing-library\u002Freact';\nimport { useHookName } from '.\u002FuseHookName';\n\ndescribe('useHookName', () => {\n  it('should return initial state', () => {\n    const { result } = renderHook(() => useHookName());\n    expect(result.current.value).toBe(initial);\n  });\n\n  it('should update on action', async () => {\n    const { result } = renderHook(() => useHookName());\n    await act(async () => {\n      await result.current.doAction();\n    });\n    expect(result.current.value).toBe(updated);\n  });\n});\n```\n\n## Storybook Interaction Tests\n\n```typescript\nimport { within, userEvent, expect } from '@storybook\u002Ftest';\n\nexport const WithInteraction: Story = {\n  play: async ({ canvasElement }) => {\n    const canvas = within(canvasElement);\n\n    \u002F\u002F Find and interact with elements\n    const button = canvas.getByRole('button', { name: 'Submit' });\n    await userEvent.click(button);\n\n    \u002F\u002F Assert results\n    await expect(canvas.getByText('Success')).toBeInTheDocument();\n  },\n};\n```\n\n## Test Checklist\n\nWhen writing tests:\n- [ ] Test happy path (expected behavior)\n- [ ] Test edge cases (empty, null, boundary values)\n- [ ] Test error handling\n- [ ] Test loading\u002Fasync states\n- [ ] Use descriptive test names\n- [ ] Keep tests focused and isolated\n- [ ] Mock external dependencies\n- [ ] Avoid testing implementation details\n\n## Coverage Goals\n\n| Type | Target |\n|------|--------|\n| E2E | Critical user flows |\n| Unit | Business logic, utilities |\n| Component | Visual states, interactions |\n","# Testing Specialist\n\nYou are an expert at testing TypeScript\u002FReact applications using Playwright, Vitest, and Storybook.\n\n## When To Use\n\nClaude should automatically use this skill when:\n- User asks to write tests or improve coverage\n- User mentions Playwright, Vitest, E2E, unit tests\n- Debugging test failures\n- Setting up test infrastructure\n\n## Testing Stack\n\n| Tool | Purpose | Location |\n|------|---------|----------|\n| Playwright | E2E browser tests | `e2e\u002F*.spec.ts` |\n| Vitest | Unit\u002Fintegration tests | `src\u002F**\u002F*.test.ts` |\n| Storybook | Component visual tests | `src\u002F**\u002F*.stories.tsx` |\n\n## CRITICAL: Read Before Write (Reconnaissance-Then-Action)\n\nBefore writing ANY E2E test, you MUST:\n\n1. **Read the component source file** (e.g., `Toolbar.tsx`, `Editor.tsx`)\n2. **Identify stable selectors** in this priority order:\n   - `data-testid` attributes (explicit testing contract)\n   - `title` attributes (accessibility, stable)\n   - `aria-label` attributes (accessibility)\n   - Text content (fragile, last resort)\n3. **Extract exact values** from the source - never guess or assume\n\n### Selector Priority (Playwright Official)\n\n| Priority | Method | Example | Stability |\n|----------|--------|---------|-----------|\n| 1 | data-testid | `page.getByTestId('save-btn')` | Most stable |\n| 2 | role + name | `page.getByRole('button', { name: 'Save' })` | Stable |\n| 3 | title | `page.locator('[title=\"Save\"]')` | Stable |\n| 4 | text | `page.getByText('Save')` | Fragile |\n\n**NEVER use:** CSS classes, XPath, or auto-generated IDs\n\n### Anti-Pattern: Speculative Selectors\n\n```typescript\n\u002F\u002F ❌ WRONG - Guessing without reading source\nawait editor.clickToolbarButton('B');  \u002F\u002F Assumes button text is \"B\"\n\n\u002F\u002F ✅ CORRECT - After reading Toolbar.tsx:54 shows title=\"Bold (Cmd+B)\"\nawait editor.clickToolbarButton('Bold (Cmd+B)');\n```\n\n### data-testid Convention\n\nWhen adding test IDs to components, use format: `{scope}-{element}-{type}`\n\n```tsx\ndata-testid=\"toolbar-bold-button\"\ndata-testid=\"editor-content-area\"\ndata-testid=\"sidebar-note-list\"\n```\n\n---\n\n## Playwright E2E Tests\n\n### File Structure\n```\ne2e\u002F\n├── fixtures\u002F\n│   └── editor-helpers.ts   # Shared test utilities\n├── editor.spec.ts          # Editor functionality\n├── formatting.spec.ts      # Text formatting\n├── headings.spec.ts        # Heading toggles\n├── lists.spec.ts           # List operations\n├── blocks.spec.ts          # Block elements\n├── keyboard-shortcuts.spec.ts\n├── toolbar.spec.ts\n└── history.spec.ts\n```\n\n### Test Pattern\n```typescript\nimport { test, expect } from '@playwright\u002Ftest';\nimport { EditorHelper } from '.\u002Ffixtures\u002Feditor-helpers';\n\ntest.describe('Feature Name', () => {\n  let editor: EditorHelper;\n\n  test.beforeEach(async ({ page }) => {\n    editor = new EditorHelper(page);\n    await editor.goto();\n  });\n\n  test('descriptive test name', async () => {\n    await editor.type('test content');\n    await editor.selectAll();\n    \u002F\u002F Use title from Toolbar.tsx - NOT guessed text\n    await editor.clickToolbarButton('Bold (Cmd+B)');\n    await editor.expectElement('strong');\n  });\n});\n```\n\n### EditorHelper Methods\n```typescript\neditor.goto()                      \u002F\u002F Navigate to app\neditor.clear()                     \u002F\u002F Clear editor content\neditor.type(text)                  \u002F\u002F Type text\neditor.selectAll()                 \u002F\u002F Select all (Cmd+A)\neditor.clickToolbarButton(title)   \u002F\u002F Click toolbar button by title attribute\neditor.isToolbarButtonActive(title) \u002F\u002F Check button state by title\neditor.expectText(text)            \u002F\u002F Assert text exists\neditor.expectElement(selector)     \u002F\u002F Assert element exists\neditor.pressShortcut(key)          \u002F\u002F Press keyboard shortcut\n```\n\n### Toolbar Button Titles (from Toolbar.tsx)\n\n| Button | Title Attribute |\n|--------|-----------------|\n| Bold | `Bold (Cmd+B)` |\n| Italic | `Italic (Cmd+I)` |\n| Underline | `Underline (Cmd+U)` |\n| Strike | `Strikethrough` |\n| H1 | `Heading 1` |\n| H2 | `Heading 2` |\n| H3 | `Heading 3` |\n| Bullet List | `Bullet List` |\n| Numbered List | `Numbered List` |\n| Task List | `Task List` |\n| Quote | `Quote` |\n| Code | `Code Block` |\n| Undo | `Undo (Cmd+Z)` |\n| Redo | `Redo (Cmd+Shift+Z)` |\n| New | `New Document` |\n| Open | `Open Document` |\n| Save | `Save Document` |\n\n### Commands\n```bash\npnpm test:e2e           # Run all E2E tests\npnpm test:e2e:ui        # Open Playwright UI\npnpm test:e2e:headed    # Run with browser visible\npnpm test:e2e:chromium  # Chrome only\npnpm test:e2e:webkit    # Safari only\n```\n\n## Vitest Unit Tests\n\n### File Naming\n- Component: `ComponentName.test.tsx`\n- Hook: `useHookName.test.ts`\n- Utility: `utilName.test.ts`\n\n### Test Pattern\n```typescript\nimport { describe, it, expect, vi } from 'vitest';\nimport { functionName } from '.\u002Fmodule';\n\ndescribe('functionName', () => {\n  it('should do something', () => {\n    const result = functionName(input);\n    expect(result).toBe(expected);\n  });\n\n  it('should handle edge case', () => {\n    expect(() => functionName(null)).toThrow();\n  });\n});\n```\n\n### Hook Testing\n```typescript\nimport { renderHook, act } from '@testing-library\u002Freact';\nimport { useHookName } from '.\u002FuseHookName';\n\ndescribe('useHookName', () => {\n  it('should return initial state', () => {\n    const { result } = renderHook(() => useHookName());\n    expect(result.current.value).toBe(initial);\n  });\n\n  it('should update on action', async () => {\n    const { result } = renderHook(() => useHookName());\n    await act(async () => {\n      await result.current.doAction();\n    });\n    expect(result.current.value).toBe(updated);\n  });\n});\n```\n\n## Storybook Interaction Tests\n\n```typescript\nimport { within, userEvent, expect } from '@storybook\u002Ftest';\n\nexport const WithInteraction: Story = {\n  play: async ({ canvasElement }) => {\n    const canvas = within(canvasElement);\n\n    \u002F\u002F Find and interact with elements\n    const button = canvas.getByRole('button', { name: 'Submit' });\n    await userEvent.click(button);\n\n    \u002F\u002F Assert results\n    await expect(canvas.getByText('Success')).toBeInTheDocument();\n  },\n};\n```\n\n## Test Checklist\n\nWhen writing tests:\n- [ ] Test happy path (expected behavior)\n- [ ] Test edge cases (empty, null, boundary values)\n- [ ] Test error handling\n- [ ] Test loading\u002Fasync states\n- [ ] Use descriptive test names\n- [ ] Keep tests focused and isolated\n- [ ] Mock external dependencies\n- [ ] Avoid testing implementation details\n\n## Coverage Goals\n\n| Type | Target |\n|------|--------|\n| E2E | Critical user flows |\n| Unit | Business logic, utilities |\n| Component | Visual states, interactions |\n",{"name":5,"description":7,"allowed-tools":48},"Read, Write, Edit, Bash, Grep, Glob","main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Faiskillstore\u002Fmarketplace\u002Fcrazyswami\u002Ftesting",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":59,"prompt":69,"zipAvailable":70},[60,63,66],{"tool":61,"command":62},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill testing",{"tool":64,"command":65},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill testing",{"tool":67,"command":68},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill testing","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fcrazyswami\u002Ftesting\u002FSKILL.md",true,[72,78,84],{"path":73,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":76,"sourceHtmlUrl":77},"manifest.json","REFERENCE","参考文档",1246,"https:\u002F\u002Fgithub.com\u002Flucastigrereal-dev\u002Fomnis-control\u002Fblob\u002Fmaster\u002Fskills\u002Fjarvis-guardrails\u002Fmanifest.json",{"path":79,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":82,"sourceHtmlUrl":83},"run.py","SCRIPT","脚本",4036,"https:\u002F\u002Fgithub.com\u002Flucastigrereal-dev\u002Fomnis-control\u002Fblob\u002Fmaster\u002Fskills\u002Fjarvis-guardrails\u002Frun.py",{"path":85,"resourceType":74,"resourceTypeDesc":75,"sizeBytes":86,"sourceHtmlUrl":87},"skill-report.json",15012,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fcrazyswami\u002Ftesting\u002Fskill-report.json",[89,101,111,120,126,133],{"skillNo":90,"name":91,"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":92,"categories":93,"keywords":97,"publishedAt":43},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[94],{"categoryNo":95,"categoryName":96,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[98,99,100],"model","model hierarchy","model hierarchy skill",{"skillNo":102,"name":103,"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":104,"categories":105,"keywords":107,"publishedAt":43},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[106],{"categoryNo":95,"categoryName":96,"taxonomyType":21,"taxonomyTypeDesc":22},[108,109,110],"MCP","zoom","zoom mcp",{"skillNo":112,"name":113,"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":114,"categories":115,"keywords":116,"publishedAt":43},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[117,118,119,109],"sdk","zoom apps sdk","apps",{"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":43},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[122],{"skillNo":127,"name":128,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":129,"categories":130,"keywords":132,"publishedAt":43},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[131],{"categoryNo":95,"categoryName":96,"taxonomyType":21,"taxonomyTypeDesc":22},[128],{"skillNo":134,"name":135,"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":136,"categories":137,"keywords":138,"publishedAt":43},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[135]]