[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F8B9EAMPPZP95517PNXHHD":3,"skill-same:01M6F8B9EAMPPZP95517PNXHHD":82},{"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":26,"publishedAt":47,"linkOnly":48,"markdownContent":49,"markdownBody":50,"frontMatter":51,"refName":59,"commitSha":60,"skillDirectory":61,"forksCount":62,"repositoryHtmlUrl":63,"repositoryHomepageUrl":64,"ownerHtmlUrl":65,"ownerBlogUrl":6,"ownerDescription":66,"updatedAt":67,"install":68,"resources":81},"01M6F8B9EAMPPZP95517PNXHHD","clay-ci-integration",null,"Configure CI\u002FCD pipelines for Clay integrations with automated testing and validation.\nUse when setting up automated tests for Clay webhook handlers, validating\nenrichment data quality in CI, or integrating Clay checks into your build process.\nTrigger with phrases like \"clay CI\", \"clay GitHub Actions\",\n\"clay automated tests\", \"CI clay\", \"test clay integration\".","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",66,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fclay-ci-integration\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署",[27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],"integration","ci","clay","clay ci integration","configure","CI\u002FCD","io","webhook","up","edit","write","read","testing","Bash","ci-cd","data","github actions","actions","code","openclaw","2026-11-10 10:12:30",false,"---\nname: clay-ci-integration\ndescription: |\n  Configure CI\u002FCD pipelines for Clay integrations with automated testing and validation.\n  Use when setting up automated tests for Clay webhook handlers, validating\n  enrichment data quality in CI, or integrating Clay checks into your build process.\n  Trigger with phrases like \"clay CI\", \"clay GitHub Actions\",\n  \"clay automated tests\", \"CI clay\", \"test clay integration\".\nallowed-tools: Read, Write, Edit, Bash(gh:*), Bash(npm:*)\nversion: 1.0.0\nlicense: MIT\nauthor: Jeremy Longshore \u003Cjeremy@intentsolutions.io>\ncompatible-with: claude-code, codex, openclaw\ntags: [saas, clay, testing, ci-cd]\n\n---\n# Clay CI Integration\n\n## Overview\n\nSet up CI\u002FCD pipelines for Clay-powered applications. Since Clay is a web platform (not a local service), CI focuses on: (1) testing webhook handler code, (2) validating data transformation logic, (3) checking enrichment data schema compliance, and (4) optional live integration tests against Clay's API.\n\n## Prerequisites\n\n- GitHub repository with Actions enabled\n- Clay webhook URL stored as GitHub secret\n- Node.js\u002FPython project with test framework\n\n## Instructions\n\n### Step 1: Create GitHub Actions Workflow\n\n```yaml\n# .github\u002Fworkflows\u002Fclay-integration.yml\nname: Clay Integration Tests\n\non:\n  push:\n    branches: [main]\n  pull_request:\n    branches: [main]\n\nenv:\n  CLAY_WEBHOOK_URL: ${{ secrets.CLAY_WEBHOOK_URL }}\n  CLAY_API_KEY: ${{ secrets.CLAY_API_KEY }}\n\njobs:\n  unit-tests:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      - uses: actions\u002Fsetup-node@v4\n        with:\n          node-version: '20'\n          cache: 'npm'\n      - run: npm ci\n      - run: npm test -- --coverage\n        env:\n          # No Clay credentials needed for unit tests (use mocks)\n          CLAY_WEBHOOK_URL: \"https:\u002F\u002Fmock.webhook.test\"\n\n  data-validation:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      - uses: actions\u002Fsetup-node@v4\n        with:\n          node-version: '20'\n          cache: 'npm'\n      - run: npm ci\n      - name: Validate input data schemas\n        run: npx tsx scripts\u002Fvalidate-clay-schemas.ts\n      - name: Check for PII in test fixtures\n        run: |\n          if grep -rn '@gmail.com\\|@yahoo.com\\|@hotmail.com' test\u002Ffixtures\u002F; then\n            echo \"ERROR: Real email addresses found in test fixtures\"\n            exit 1\n          fi\n\n  integration-tests:\n    runs-on: ubuntu-latest\n    if: github.event_name == 'push' && github.ref == 'refs\u002Fheads\u002Fmain'\n    needs: [unit-tests]\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      - uses: actions\u002Fsetup-node@v4\n        with:\n          node-version: '20'\n          cache: 'npm'\n      - run: npm ci\n      - name: Test webhook connectivity\n        run: |\n          HTTP_CODE=$(curl -s -o \u002Fdev\u002Fnull -w \"%{http_code}\" \\\n            -X POST \"$CLAY_WEBHOOK_URL\" \\\n            -H \"Content-Type: application\u002Fjson\" \\\n            -d '{\"_ci_test\": true, \"_run_id\": \"${{ github.run_id }}\"}')\n          if [ \"$HTTP_CODE\" != \"200\" ]; then\n            echo \"Webhook connectivity check failed: HTTP $HTTP_CODE\"\n            exit 1\n          fi\n```\n\n### Step 2: Configure Secrets\n\n```bash\n# Store Clay credentials as GitHub secrets\ngh secret set CLAY_WEBHOOK_URL --body \"https:\u002F\u002Fapp.clay.com\u002Fapi\u002Fv1\u002Fwebhooks\u002Fyour-id\"\ngh secret set CLAY_API_KEY --body \"clay_ent_your_key\"  # Enterprise only\n```\n\n### Step 3: Write Unit Tests for Clay Handlers\n\n```typescript\n\u002F\u002F tests\u002Fclay-handler.test.ts\nimport { describe, it, expect, vi } from 'vitest';\nimport { processEnrichedData, validateWebhookPayload } from '..\u002Fsrc\u002Fclay\u002Fhandler';\n\ndescribe('Clay Webhook Handler', () => {\n  it('should process enriched data correctly', () => {\n    const payload = {\n      email: 'jane@stripe.com',\n      company_name: 'Stripe',\n      job_title: 'VP Engineering',\n      employee_count: 8000,\n      industry: 'Financial Technology',\n    };\n\n    const result = processEnrichedData(payload);\n    expect(result.icp_score).toBeGreaterThan(0);\n    expect(result.company_name).toBe('Stripe');\n  });\n\n  it('should reject payloads missing required fields', () => {\n    const invalid = { company_name: 'Test Corp' }; \u002F\u002F Missing email\n    expect(() => validateWebhookPayload(invalid)).toThrow('Missing required field: email');\n  });\n\n  it('should handle empty enrichment gracefully', () => {\n    const partial = {\n      email: 'test@unknown.com',\n      company_name: null,\n      job_title: null,\n      employee_count: null,\n    };\n\n    const result = processEnrichedData(partial);\n    expect(result.icp_score).toBe(0);\n    expect(result.enrichment_complete).toBe(false);\n  });\n});\n\ndescribe('Input Validation', () => {\n  it('should filter personal email domains', () => {\n    const rows = [\n      { domain: 'stripe.com', email: 'ceo@stripe.com' },\n      { domain: 'gmail.com', email: 'user@gmail.com' },\n    ];\n\n    const valid = rows.filter(r => !['gmail.com', 'yahoo.com'].includes(r.domain));\n    expect(valid).toHaveLength(1);\n    expect(valid[0].domain).toBe('stripe.com');\n  });\n});\n```\n\n### Step 4: Add Data Schema Validation\n\n```typescript\n\u002F\u002F scripts\u002Fvalidate-clay-schemas.ts\nimport { z } from 'zod';\n\nconst ClayEnrichedRowSchema = z.object({\n  email: z.string().email(),\n  domain: z.string().min(3),\n  company_name: z.string().nullable(),\n  job_title: z.string().nullable(),\n  employee_count: z.number().nullable(),\n  industry: z.string().nullable(),\n  linkedin_url: z.string().url().nullable(),\n});\n\nconst ClayWebhookInputSchema = z.object({\n  domain: z.string().min(3).refine(d => d.includes('.'), 'Must contain a dot'),\n  first_name: z.string().min(1),\n  last_name: z.string().min(1),\n  email: z.string().email().optional(),\n  source: z.string().optional(),\n});\n\n\u002F\u002F Validate test fixtures match expected schemas\nconsole.log('Validating Clay schemas...');\n\u002F\u002F Run against test fixtures, mock data, etc.\nconsole.log('All schemas valid.');\n```\n\n### Step 5: Credit Budget Guard in CI\n\n```yaml\n# Add to workflow to prevent accidental high-volume runs\n- name: Check credit budget\n  run: |\n    MAX_ROWS=10  # CI should never enrich more than 10 test rows\n    ROWS_TO_SEND=$(wc -l \u003C test\u002Ffixtures\u002Ftest-leads.csv)\n    if [ \"$ROWS_TO_SEND\" -gt \"$MAX_ROWS\" ]; then\n      echo \"ERROR: Test fixture has $ROWS_TO_SEND rows (max: $MAX_ROWS)\"\n      echo \"Integration tests should use minimal data to avoid credit waste\"\n      exit 1\n    fi\n```\n\n## Error Handling\n\n| Issue | Cause | Solution |\n|-------|-------|----------|\n| Webhook test fails in CI | Secret not configured | Add `CLAY_WEBHOOK_URL` via `gh secret set` |\n| Tests pass locally, fail in CI | Missing mock for Clay calls | Use vitest mocks for unit tests |\n| Integration test flaky | Clay API latency varies | Add retry logic, increase timeout |\n| Credit waste in CI | Test sends too many rows | Add MAX_ROWS guard, use minimal fixtures |\n\n## Resources\n\n- [GitHub Actions Documentation](https:\u002F\u002Fdocs.github.com\u002Fen\u002Factions)\n- [Vitest Documentation](https:\u002F\u002Fvitest.dev\u002F)\n\n## Next Steps\n\nFor deployment patterns, see `clay-deploy-integration`.\n\n","# Clay CI Integration\n\n## Overview\n\nSet up CI\u002FCD pipelines for Clay-powered applications. Since Clay is a web platform (not a local service), CI focuses on: (1) testing webhook handler code, (2) validating data transformation logic, (3) checking enrichment data schema compliance, and (4) optional live integration tests against Clay's API.\n\n## Prerequisites\n\n- GitHub repository with Actions enabled\n- Clay webhook URL stored as GitHub secret\n- Node.js\u002FPython project with test framework\n\n## Instructions\n\n### Step 1: Create GitHub Actions Workflow\n\n```yaml\n# .github\u002Fworkflows\u002Fclay-integration.yml\nname: Clay Integration Tests\n\non:\n  push:\n    branches: [main]\n  pull_request:\n    branches: [main]\n\nenv:\n  CLAY_WEBHOOK_URL: ${{ secrets.CLAY_WEBHOOK_URL }}\n  CLAY_API_KEY: ${{ secrets.CLAY_API_KEY }}\n\njobs:\n  unit-tests:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      - uses: actions\u002Fsetup-node@v4\n        with:\n          node-version: '20'\n          cache: 'npm'\n      - run: npm ci\n      - run: npm test -- --coverage\n        env:\n          # No Clay credentials needed for unit tests (use mocks)\n          CLAY_WEBHOOK_URL: \"https:\u002F\u002Fmock.webhook.test\"\n\n  data-validation:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      - uses: actions\u002Fsetup-node@v4\n        with:\n          node-version: '20'\n          cache: 'npm'\n      - run: npm ci\n      - name: Validate input data schemas\n        run: npx tsx scripts\u002Fvalidate-clay-schemas.ts\n      - name: Check for PII in test fixtures\n        run: |\n          if grep -rn '@gmail.com\\|@yahoo.com\\|@hotmail.com' test\u002Ffixtures\u002F; then\n            echo \"ERROR: Real email addresses found in test fixtures\"\n            exit 1\n          fi\n\n  integration-tests:\n    runs-on: ubuntu-latest\n    if: github.event_name == 'push' && github.ref == 'refs\u002Fheads\u002Fmain'\n    needs: [unit-tests]\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      - uses: actions\u002Fsetup-node@v4\n        with:\n          node-version: '20'\n          cache: 'npm'\n      - run: npm ci\n      - name: Test webhook connectivity\n        run: |\n          HTTP_CODE=$(curl -s -o \u002Fdev\u002Fnull -w \"%{http_code}\" \\\n            -X POST \"$CLAY_WEBHOOK_URL\" \\\n            -H \"Content-Type: application\u002Fjson\" \\\n            -d '{\"_ci_test\": true, \"_run_id\": \"${{ github.run_id }}\"}')\n          if [ \"$HTTP_CODE\" != \"200\" ]; then\n            echo \"Webhook connectivity check failed: HTTP $HTTP_CODE\"\n            exit 1\n          fi\n```\n\n### Step 2: Configure Secrets\n\n```bash\n# Store Clay credentials as GitHub secrets\ngh secret set CLAY_WEBHOOK_URL --body \"https:\u002F\u002Fapp.clay.com\u002Fapi\u002Fv1\u002Fwebhooks\u002Fyour-id\"\ngh secret set CLAY_API_KEY --body \"clay_ent_your_key\"  # Enterprise only\n```\n\n### Step 3: Write Unit Tests for Clay Handlers\n\n```typescript\n\u002F\u002F tests\u002Fclay-handler.test.ts\nimport { describe, it, expect, vi } from 'vitest';\nimport { processEnrichedData, validateWebhookPayload } from '..\u002Fsrc\u002Fclay\u002Fhandler';\n\ndescribe('Clay Webhook Handler', () => {\n  it('should process enriched data correctly', () => {\n    const payload = {\n      email: 'jane@stripe.com',\n      company_name: 'Stripe',\n      job_title: 'VP Engineering',\n      employee_count: 8000,\n      industry: 'Financial Technology',\n    };\n\n    const result = processEnrichedData(payload);\n    expect(result.icp_score).toBeGreaterThan(0);\n    expect(result.company_name).toBe('Stripe');\n  });\n\n  it('should reject payloads missing required fields', () => {\n    const invalid = { company_name: 'Test Corp' }; \u002F\u002F Missing email\n    expect(() => validateWebhookPayload(invalid)).toThrow('Missing required field: email');\n  });\n\n  it('should handle empty enrichment gracefully', () => {\n    const partial = {\n      email: 'test@unknown.com',\n      company_name: null,\n      job_title: null,\n      employee_count: null,\n    };\n\n    const result = processEnrichedData(partial);\n    expect(result.icp_score).toBe(0);\n    expect(result.enrichment_complete).toBe(false);\n  });\n});\n\ndescribe('Input Validation', () => {\n  it('should filter personal email domains', () => {\n    const rows = [\n      { domain: 'stripe.com', email: 'ceo@stripe.com' },\n      { domain: 'gmail.com', email: 'user@gmail.com' },\n    ];\n\n    const valid = rows.filter(r => !['gmail.com', 'yahoo.com'].includes(r.domain));\n    expect(valid).toHaveLength(1);\n    expect(valid[0].domain).toBe('stripe.com');\n  });\n});\n```\n\n### Step 4: Add Data Schema Validation\n\n```typescript\n\u002F\u002F scripts\u002Fvalidate-clay-schemas.ts\nimport { z } from 'zod';\n\nconst ClayEnrichedRowSchema = z.object({\n  email: z.string().email(),\n  domain: z.string().min(3),\n  company_name: z.string().nullable(),\n  job_title: z.string().nullable(),\n  employee_count: z.number().nullable(),\n  industry: z.string().nullable(),\n  linkedin_url: z.string().url().nullable(),\n});\n\nconst ClayWebhookInputSchema = z.object({\n  domain: z.string().min(3).refine(d => d.includes('.'), 'Must contain a dot'),\n  first_name: z.string().min(1),\n  last_name: z.string().min(1),\n  email: z.string().email().optional(),\n  source: z.string().optional(),\n});\n\n\u002F\u002F Validate test fixtures match expected schemas\nconsole.log('Validating Clay schemas...');\n\u002F\u002F Run against test fixtures, mock data, etc.\nconsole.log('All schemas valid.');\n```\n\n### Step 5: Credit Budget Guard in CI\n\n```yaml\n# Add to workflow to prevent accidental high-volume runs\n- name: Check credit budget\n  run: |\n    MAX_ROWS=10  # CI should never enrich more than 10 test rows\n    ROWS_TO_SEND=$(wc -l \u003C test\u002Ffixtures\u002Ftest-leads.csv)\n    if [ \"$ROWS_TO_SEND\" -gt \"$MAX_ROWS\" ]; then\n      echo \"ERROR: Test fixture has $ROWS_TO_SEND rows (max: $MAX_ROWS)\"\n      echo \"Integration tests should use minimal data to avoid credit waste\"\n      exit 1\n    fi\n```\n\n## Error Handling\n\n| Issue | Cause | Solution |\n|-------|-------|----------|\n| Webhook test fails in CI | Secret not configured | Add `CLAY_WEBHOOK_URL` via `gh secret set` |\n| Tests pass locally, fail in CI | Missing mock for Clay calls | Use vitest mocks for unit tests |\n| Integration test flaky | Clay API latency varies | Add retry logic, increase timeout |\n| Credit waste in CI | Test sends too many rows | Add MAX_ROWS guard, use minimal fixtures |\n\n## Resources\n\n- [GitHub Actions Documentation](https:\u002F\u002Fdocs.github.com\u002Fen\u002Factions)\n- [Vitest Documentation](https:\u002F\u002Fvitest.dev\u002F)\n\n## Next Steps\n\nFor deployment patterns, see `clay-deploy-integration`.\n\n",{"name":5,"tags":52,"author":54,"license":15,"version":55,"description":56,"allowed-tools":57,"compatible-with":58},[53,29,39,41],"saas","Jeremy Longshore \u003Cjeremy@intentsolutions.io>","1.0.0","Configure CI\u002FCD pipelines for Clay integrations with automated testing and validation.\nUse when setting up automated tests for Clay webhook handlers, validating\nenrichment data quality in CI, or integrating Clay checks into your build process.\nTrigger with phrases like \"clay CI\", \"clay GitHub Actions\",\n\"clay automated tests\", \"CI clay\", \"test clay integration\".\n","Read, Write, Edit, Bash(gh:*), Bash(npm:*)","claude-code, codex, openclaw","main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fclay-ci-integration",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":69,"prompt":79,"zipAvailable":80},[70,73,76],{"tool":71,"command":72},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill clay-ci-integration",{"tool":74,"command":75},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill clay-ci-integration",{"tool":77,"command":78},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill clay-ci-integration","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fclay-ci-integration\u002FSKILL.md",true,[],[83,95,105,114,120,127],{"skillNo":84,"name":85,"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":86,"categories":87,"keywords":91,"publishedAt":47},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[88],{"categoryNo":89,"categoryName":90,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[92,93,94],"model","model hierarchy","model hierarchy skill",{"skillNo":96,"name":97,"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":98,"categories":99,"keywords":101,"publishedAt":47},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[100],{"categoryNo":89,"categoryName":90,"taxonomyType":21,"taxonomyTypeDesc":22},[102,103,104],"MCP","zoom","zoom mcp",{"skillNo":106,"name":107,"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":108,"categories":109,"keywords":110,"publishedAt":47},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[111,112,113,103],"sdk","zoom apps sdk","apps",{"skillNo":115,"name":116,"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":117,"categories":118,"keywords":119,"publishedAt":47},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[116],{"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":126,"publishedAt":47},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[125],{"categoryNo":89,"categoryName":90,"taxonomyType":21,"taxonomyTypeDesc":22},[122],{"skillNo":128,"name":129,"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":130,"categories":131,"keywords":132,"publishedAt":47},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[129]]