[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F6NCS1BBA8TMZ1C4SN1PS6":3,"skill-same:01M6F6NCS1BBA8TMZ1C4SN1PS6":83},{"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":60,"commitSha":61,"skillDirectory":62,"forksCount":63,"repositoryHtmlUrl":64,"repositoryHomepageUrl":65,"ownerHtmlUrl":66,"ownerBlogUrl":6,"ownerDescription":67,"updatedAt":68,"install":69,"resources":82},"01M6F6NCS1BBA8TMZ1C4SN1PS6","algolia-ci-integration",null,"Configure Algolia CI\u002FCD: GitHub Actions for index validation, automated reindexing\non deploy, and integration testing against real Algolia indices.\nTrigger: \"algolia CI\", \"algolia GitHub Actions\", \"algolia automated tests\",\n\"CI algolia\", \"algolia deploy pipeline\".","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\u002Falgolia-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],"algolia ci integration","integration","ci","configure","CI\u002FCD","integration testing","trigger","io","tests","edit","write","read","testing","Bash","pipeline","github actions","actions","search","code","deploy pipeline","2026-11-10 10:12:30",false,"---\nname: algolia-ci-integration\ndescription: |\n  Configure Algolia CI\u002FCD: GitHub Actions for index validation, automated reindexing\n  on deploy, and integration testing against real Algolia indices.\n  Trigger: \"algolia CI\", \"algolia GitHub Actions\", \"algolia automated tests\",\n  \"CI algolia\", \"algolia deploy pipeline\".\nallowed-tools: Read, Write, Edit, Bash(gh:*), Bash(npm:*)\nversion: 1.0.0\nlicense: MIT\nauthor: Jeremy Longshore \u003Cjeremy@intentsolutions.io>\ntags: [saas, search, algolia]\ncompatible-with: claude-code\n---\n\n# Algolia CI Integration\n\n## Overview\n\nSet up CI\u002FCD pipelines for Algolia: run integration tests against a test index, validate index settings before deploy, and trigger reindexing on release.\n\n## Prerequisites\n\n- GitHub repository with Actions enabled\n- Algolia App ID and Admin key (stored as GitHub secrets)\n- npm\u002Fpnpm project with `algoliasearch` v5\n\n## Instructions\n\n### Step 1: Store Algolia Secrets\n\n```bash\ngh secret set ALGOLIA_APP_ID --body \"YourApplicationID\"\ngh secret set ALGOLIA_ADMIN_KEY --body \"your_admin_api_key\"\ngh secret set ALGOLIA_SEARCH_KEY --body \"your_search_only_key\"\n```\n\n### Step 2: GitHub Actions — Test & Validate\n\n```yaml\n# .github\u002Fworkflows\u002Falgolia-ci.yml\nname: Algolia CI\n\non:\n  push:\n    branches: [main]\n  pull_request:\n    branches: [main]\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n    env:\n      ALGOLIA_APP_ID: ${{ secrets.ALGOLIA_APP_ID }}\n      ALGOLIA_ADMIN_KEY: ${{ secrets.ALGOLIA_ADMIN_KEY }}\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: Unit tests (mocked Algolia)\n        run: npm test\n      - name: Integration tests (real Algolia)\n        if: env.ALGOLIA_APP_ID != ''\n        run: npm run test:integration\n        env:\n          # Use timestamped index to avoid cross-PR collision\n          ALGOLIA_TEST_INDEX: ci_test_${{ github.run_id }}_products\n\n  validate-settings:\n    runs-on: ubuntu-latest\n    if: github.event_name == 'pull_request'\n    env:\n      ALGOLIA_APP_ID: ${{ secrets.ALGOLIA_APP_ID }}\n      ALGOLIA_ADMIN_KEY: ${{ secrets.ALGOLIA_ADMIN_KEY }}\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      - uses: actions\u002Fsetup-node@v4\n        with: { node-version: '20', cache: 'npm' }\n      - run: npm ci\n      - name: Validate index settings match config\n        run: npx tsx scripts\u002Fvalidate-algolia-settings.ts\n```\n\n### Step 3: Index Settings Validation Script\n\n```typescript\n\u002F\u002F scripts\u002Fvalidate-algolia-settings.ts\nimport { algoliasearch } from 'algoliasearch';\nimport expectedSettings from '..\u002Fconfig\u002Falgolia-settings.json' assert { type: 'json' };\n\nconst client = algoliasearch(process.env.ALGOLIA_APP_ID!, process.env.ALGOLIA_ADMIN_KEY!);\n\nasync function validateSettings() {\n  const actual = await client.getSettings({ indexName: 'products' });\n  const errors: string[] = [];\n\n  \u002F\u002F Check critical settings match\n  const checks: [string, any, any][] = [\n    ['searchableAttributes', actual.searchableAttributes, expectedSettings.searchableAttributes],\n    ['attributesForFaceting', actual.attributesForFaceting, expectedSettings.attributesForFaceting],\n    ['customRanking', actual.customRanking, expectedSettings.customRanking],\n  ];\n\n  for (const [field, actual, expected] of checks) {\n    if (JSON.stringify(actual) !== JSON.stringify(expected)) {\n      errors.push(`${field}: expected ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`);\n    }\n  }\n\n  if (errors.length > 0) {\n    console.error('Settings drift detected:');\n    errors.forEach(e => console.error(`  - ${e}`));\n    process.exit(1);\n  }\n\n  console.log('All Algolia settings match expected configuration.');\n}\n\nvalidateSettings().catch(e => { console.error(e); process.exit(1); });\n```\n\n### Step 4: Integration Test Pattern\n\n```typescript\n\u002F\u002F tests\u002Fintegration\u002Falgolia.integration.test.ts\nimport { describe, it, expect, afterAll } from 'vitest';\nimport { algoliasearch } from 'algoliasearch';\n\nconst client = algoliasearch(process.env.ALGOLIA_APP_ID!, process.env.ALGOLIA_ADMIN_KEY!);\nconst testIndex = process.env.ALGOLIA_TEST_INDEX || `test_${Date.now()}`;\n\ndescribe.skipIf(!process.env.ALGOLIA_APP_ID)('Algolia Integration', () => {\n  afterAll(async () => {\n    \u002F\u002F Clean up test index\n    try { await client.deleteIndex({ indexName: testIndex }); } catch {}\n  });\n\n  it('indexes records and searches', async () => {\n    const { taskID } = await client.saveObjects({\n      indexName: testIndex,\n      objects: [\n        { objectID: '1', name: 'Test Widget', category: 'tools' },\n        { objectID: '2', name: 'Test Gadget', category: 'electronics' },\n      ],\n    });\n    await client.waitForTask({ indexName: testIndex, taskID });\n\n    const { hits, nbHits } = await client.searchSingleIndex({\n      indexName: testIndex,\n      searchParams: { query: 'widget' },\n    });\n\n    expect(nbHits).toBe(1);\n    expect(hits[0].name).toBe('Test Widget');\n  });\n\n  it('applies filters correctly', async () => {\n    await client.setSettings({\n      indexName: testIndex,\n      indexSettings: { attributesForFaceting: ['category'] },\n    });\n    \u002F\u002F Wait for settings propagation\n    await new Promise(r => setTimeout(r, 2000));\n\n    const { hits } = await client.searchSingleIndex({\n      indexName: testIndex,\n      searchParams: { query: '', filters: 'category:tools' },\n    });\n\n    expect(hits.every(h => h.category === 'tools')).toBe(true);\n  });\n});\n```\n\n### Step 5: Deploy-Triggered Reindex\n\n```yaml\n# .github\u002Fworkflows\u002Falgolia-deploy.yml\nname: Algolia Reindex on Deploy\n\non:\n  push:\n    tags: ['v*']\n\njobs:\n  reindex:\n    runs-on: ubuntu-latest\n    env:\n      ALGOLIA_APP_ID: ${{ secrets.ALGOLIA_APP_ID }}\n      ALGOLIA_ADMIN_KEY: ${{ secrets.ALGOLIA_ADMIN_KEY }}\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      - uses: actions\u002Fsetup-node@v4\n        with: { node-version: '20', cache: 'npm' }\n      - run: npm ci\n      - name: Full reindex from data source\n        run: npx tsx scripts\u002Ffull-reindex.ts\n      - name: Verify index health\n        run: npx tsx scripts\u002Fverify-index-health.ts\n```\n\n## Error Handling\n\n| Issue | Cause | Solution |\n|-------|-------|----------|\n| Secret not available | Secrets not set or wrong name | `gh secret list` to verify |\n| Test index collision | Parallel CI runs | Use `${{ github.run_id }}` in index name |\n| Integration test timeout | Network latency to Algolia | Increase vitest timeout: `{ test: { timeout: 30000 } }` |\n| Settings drift | Manual dashboard change | Run settings validation in CI |\n\n## Resources\n\n- [GitHub Actions Secrets](https:\u002F\u002Fdocs.github.com\u002Fen\u002Factions\u002Fsecurity-for-github-actions\u002Fsecurity-guides\u002Fusing-secrets-in-github-actions)\n- [Algolia API Key Security](https:\u002F\u002Fwww.algolia.com\u002Fdoc\u002Fguides\u002Fsecurity\u002Fapi-keys\u002F)\n- [Vitest Documentation](https:\u002F\u002Fvitest.dev\u002F)\n\n## Next Steps\n\nFor deployment patterns, see `algolia-deploy-integration`.\n\n","# Algolia CI Integration\n\n## Overview\n\nSet up CI\u002FCD pipelines for Algolia: run integration tests against a test index, validate index settings before deploy, and trigger reindexing on release.\n\n## Prerequisites\n\n- GitHub repository with Actions enabled\n- Algolia App ID and Admin key (stored as GitHub secrets)\n- npm\u002Fpnpm project with `algoliasearch` v5\n\n## Instructions\n\n### Step 1: Store Algolia Secrets\n\n```bash\ngh secret set ALGOLIA_APP_ID --body \"YourApplicationID\"\ngh secret set ALGOLIA_ADMIN_KEY --body \"your_admin_api_key\"\ngh secret set ALGOLIA_SEARCH_KEY --body \"your_search_only_key\"\n```\n\n### Step 2: GitHub Actions — Test & Validate\n\n```yaml\n# .github\u002Fworkflows\u002Falgolia-ci.yml\nname: Algolia CI\n\non:\n  push:\n    branches: [main]\n  pull_request:\n    branches: [main]\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n    env:\n      ALGOLIA_APP_ID: ${{ secrets.ALGOLIA_APP_ID }}\n      ALGOLIA_ADMIN_KEY: ${{ secrets.ALGOLIA_ADMIN_KEY }}\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: Unit tests (mocked Algolia)\n        run: npm test\n      - name: Integration tests (real Algolia)\n        if: env.ALGOLIA_APP_ID != ''\n        run: npm run test:integration\n        env:\n          # Use timestamped index to avoid cross-PR collision\n          ALGOLIA_TEST_INDEX: ci_test_${{ github.run_id }}_products\n\n  validate-settings:\n    runs-on: ubuntu-latest\n    if: github.event_name == 'pull_request'\n    env:\n      ALGOLIA_APP_ID: ${{ secrets.ALGOLIA_APP_ID }}\n      ALGOLIA_ADMIN_KEY: ${{ secrets.ALGOLIA_ADMIN_KEY }}\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      - uses: actions\u002Fsetup-node@v4\n        with: { node-version: '20', cache: 'npm' }\n      - run: npm ci\n      - name: Validate index settings match config\n        run: npx tsx scripts\u002Fvalidate-algolia-settings.ts\n```\n\n### Step 3: Index Settings Validation Script\n\n```typescript\n\u002F\u002F scripts\u002Fvalidate-algolia-settings.ts\nimport { algoliasearch } from 'algoliasearch';\nimport expectedSettings from '..\u002Fconfig\u002Falgolia-settings.json' assert { type: 'json' };\n\nconst client = algoliasearch(process.env.ALGOLIA_APP_ID!, process.env.ALGOLIA_ADMIN_KEY!);\n\nasync function validateSettings() {\n  const actual = await client.getSettings({ indexName: 'products' });\n  const errors: string[] = [];\n\n  \u002F\u002F Check critical settings match\n  const checks: [string, any, any][] = [\n    ['searchableAttributes', actual.searchableAttributes, expectedSettings.searchableAttributes],\n    ['attributesForFaceting', actual.attributesForFaceting, expectedSettings.attributesForFaceting],\n    ['customRanking', actual.customRanking, expectedSettings.customRanking],\n  ];\n\n  for (const [field, actual, expected] of checks) {\n    if (JSON.stringify(actual) !== JSON.stringify(expected)) {\n      errors.push(`${field}: expected ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`);\n    }\n  }\n\n  if (errors.length > 0) {\n    console.error('Settings drift detected:');\n    errors.forEach(e => console.error(`  - ${e}`));\n    process.exit(1);\n  }\n\n  console.log('All Algolia settings match expected configuration.');\n}\n\nvalidateSettings().catch(e => { console.error(e); process.exit(1); });\n```\n\n### Step 4: Integration Test Pattern\n\n```typescript\n\u002F\u002F tests\u002Fintegration\u002Falgolia.integration.test.ts\nimport { describe, it, expect, afterAll } from 'vitest';\nimport { algoliasearch } from 'algoliasearch';\n\nconst client = algoliasearch(process.env.ALGOLIA_APP_ID!, process.env.ALGOLIA_ADMIN_KEY!);\nconst testIndex = process.env.ALGOLIA_TEST_INDEX || `test_${Date.now()}`;\n\ndescribe.skipIf(!process.env.ALGOLIA_APP_ID)('Algolia Integration', () => {\n  afterAll(async () => {\n    \u002F\u002F Clean up test index\n    try { await client.deleteIndex({ indexName: testIndex }); } catch {}\n  });\n\n  it('indexes records and searches', async () => {\n    const { taskID } = await client.saveObjects({\n      indexName: testIndex,\n      objects: [\n        { objectID: '1', name: 'Test Widget', category: 'tools' },\n        { objectID: '2', name: 'Test Gadget', category: 'electronics' },\n      ],\n    });\n    await client.waitForTask({ indexName: testIndex, taskID });\n\n    const { hits, nbHits } = await client.searchSingleIndex({\n      indexName: testIndex,\n      searchParams: { query: 'widget' },\n    });\n\n    expect(nbHits).toBe(1);\n    expect(hits[0].name).toBe('Test Widget');\n  });\n\n  it('applies filters correctly', async () => {\n    await client.setSettings({\n      indexName: testIndex,\n      indexSettings: { attributesForFaceting: ['category'] },\n    });\n    \u002F\u002F Wait for settings propagation\n    await new Promise(r => setTimeout(r, 2000));\n\n    const { hits } = await client.searchSingleIndex({\n      indexName: testIndex,\n      searchParams: { query: '', filters: 'category:tools' },\n    });\n\n    expect(hits.every(h => h.category === 'tools')).toBe(true);\n  });\n});\n```\n\n### Step 5: Deploy-Triggered Reindex\n\n```yaml\n# .github\u002Fworkflows\u002Falgolia-deploy.yml\nname: Algolia Reindex on Deploy\n\non:\n  push:\n    tags: ['v*']\n\njobs:\n  reindex:\n    runs-on: ubuntu-latest\n    env:\n      ALGOLIA_APP_ID: ${{ secrets.ALGOLIA_APP_ID }}\n      ALGOLIA_ADMIN_KEY: ${{ secrets.ALGOLIA_ADMIN_KEY }}\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      - uses: actions\u002Fsetup-node@v4\n        with: { node-version: '20', cache: 'npm' }\n      - run: npm ci\n      - name: Full reindex from data source\n        run: npx tsx scripts\u002Ffull-reindex.ts\n      - name: Verify index health\n        run: npx tsx scripts\u002Fverify-index-health.ts\n```\n\n## Error Handling\n\n| Issue | Cause | Solution |\n|-------|-------|----------|\n| Secret not available | Secrets not set or wrong name | `gh secret list` to verify |\n| Test index collision | Parallel CI runs | Use `${{ github.run_id }}` in index name |\n| Integration test timeout | Network latency to Algolia | Increase vitest timeout: `{ test: { timeout: 30000 } }` |\n| Settings drift | Manual dashboard change | Run settings validation in CI |\n\n## Resources\n\n- [GitHub Actions Secrets](https:\u002F\u002Fdocs.github.com\u002Fen\u002Factions\u002Fsecurity-for-github-actions\u002Fsecurity-guides\u002Fusing-secrets-in-github-actions)\n- [Algolia API Key Security](https:\u002F\u002Fwww.algolia.com\u002Fdoc\u002Fguides\u002Fsecurity\u002Fapi-keys\u002F)\n- [Vitest Documentation](https:\u002F\u002Fvitest.dev\u002F)\n\n## Next Steps\n\nFor deployment patterns, see `algolia-deploy-integration`.\n\n",{"name":5,"tags":52,"author":55,"license":15,"version":56,"description":57,"allowed-tools":58,"compatible-with":59},[53,44,54],"saas","algolia","Jeremy Longshore \u003Cjeremy@intentsolutions.io>","1.0.0","Configure Algolia CI\u002FCD: GitHub Actions for index validation, automated reindexing\non deploy, and integration testing against real Algolia indices.\nTrigger: \"algolia CI\", \"algolia GitHub Actions\", \"algolia automated tests\",\n\"CI algolia\", \"algolia deploy pipeline\".\n","Read, Write, Edit, Bash(gh:*), Bash(npm:*)","claude-code","main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Falgolia-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":70,"prompt":80,"zipAvailable":81},[71,74,77],{"tool":72,"command":73},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill algolia-ci-integration",{"tool":75,"command":76},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill algolia-ci-integration",{"tool":78,"command":79},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill algolia-ci-integration","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Falgolia-ci-integration\u002FSKILL.md",true,[],[84,96,106,115,121,128],{"skillNo":85,"name":86,"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":87,"categories":88,"keywords":92,"publishedAt":47},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[89],{"categoryNo":90,"categoryName":91,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[93,94,95],"model","model hierarchy","model hierarchy skill",{"skillNo":97,"name":98,"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":99,"categories":100,"keywords":102,"publishedAt":47},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[101],{"categoryNo":90,"categoryName":91,"taxonomyType":21,"taxonomyTypeDesc":22},[103,104,105],"MCP","zoom","zoom mcp",{"skillNo":107,"name":108,"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":109,"categories":110,"keywords":111,"publishedAt":47},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[112,113,114,104],"sdk","zoom apps sdk","apps",{"skillNo":116,"name":117,"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":118,"categories":119,"keywords":120,"publishedAt":47},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[117],{"skillNo":122,"name":123,"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":124,"categories":125,"keywords":127,"publishedAt":47},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[126],{"categoryNo":90,"categoryName":91,"taxonomyType":21,"taxonomyTypeDesc":22},[123],{"skillNo":129,"name":130,"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":131,"categories":132,"keywords":133,"publishedAt":47},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[130]]