[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F7KSN8CVHZ49SF6DW2SSKX":3,"skill-same:01M6F7KSN8CVHZ49SF6DW2SSKX":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":31,"publishedAt":52,"linkOnly":53,"markdownContent":54,"markdownBody":55,"frontMatter":56,"refName":64,"commitSha":65,"skillDirectory":66,"forksCount":67,"repositoryHtmlUrl":68,"repositoryHomepageUrl":69,"ownerHtmlUrl":70,"ownerBlogUrl":6,"ownerDescription":71,"updatedAt":72,"install":73,"resources":86},"01M6F7KSN8CVHZ49SF6DW2SSKX","bamboohr-ci-integration",null,"Configure CI\u002FCD pipelines for BambooHR integrations with GitHub Actions,\nautomated testing, and secret management.\nUse when setting up automated testing, configuring CI pipelines,\nor integrating BambooHR API tests into your build process.\nTrigger with phrases like \"bamboohr CI\", \"bamboohr GitHub Actions\",\n\"bamboohr automated tests\", \"CI bamboohr\", \"bamboohr pipeline\".","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\u002Fbamboohr-ci-integration\u002FSKILL.md",[18,23,26],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51],"bamboohr ci integration","integration","ci","configure","bamboohr","CI\u002FCD","hr","io","up","edit","write","read","testing","Bash","api","ci-cd","pipeline","github actions","actions","code","2026-11-10 10:12:30",false,"---\nname: bamboohr-ci-integration\ndescription: |\n  Configure CI\u002FCD pipelines for BambooHR integrations with GitHub Actions,\n  automated testing, and secret management.\n  Use when setting up automated testing, configuring CI pipelines,\n  or integrating BambooHR API tests into your build process.\n  Trigger with phrases like \"bamboohr CI\", \"bamboohr GitHub Actions\",\n  \"bamboohr automated tests\", \"CI bamboohr\", \"bamboohr pipeline\".\nallowed-tools: Read, Write, Edit, Bash(gh:*)\nversion: 1.0.0\nlicense: MIT\nauthor: Jeremy Longshore \u003Cjeremy@intentsolutions.io>\ntags: [saas, hr, bamboohr, ci-cd]\ncompatible-with: claude-code\n---\n\n# BambooHR CI Integration\n\n## Overview\n\nSet up CI\u002FCD pipelines for BambooHR integrations with proper secret management, unit tests with mocked API, and optional integration tests against the real BambooHR API.\n\n## Prerequisites\n\n- GitHub repository with Actions enabled\n- BambooHR test API key (sandbox company or test account)\n- npm\u002Fpnpm project with test suite configured\n\n## Instructions\n\n### Step 1: Configure GitHub Secrets\n\n```bash\n# Required for integration tests\ngh secret set BAMBOOHR_API_KEY --body \"your-test-api-key\"\ngh secret set BAMBOOHR_COMPANY_DOMAIN --body \"your-test-company\"\n\n# Optional: webhook testing\ngh secret set BAMBOOHR_WEBHOOK_SECRET --body \"your-webhook-hmac-secret\"\n```\n\n### Step 2: GitHub Actions Workflow\n\n```yaml\n# .github\u002Fworkflows\u002Fbamboohr-integration.yml\nname: BambooHR Integration\n\non:\n  push:\n    branches: [main]\n  pull_request:\n    branches: [main]\n  schedule:\n    # Run daily to catch BambooHR API changes early\n    - cron: '0 6 * * 1-5'\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 run typecheck\n      - name: Unit tests (mocked BambooHR API)\n        run: npm test -- --coverage --reporter=verbose\n      - uses: actions\u002Fupload-artifact@v4\n        if: always()\n        with:\n          name: coverage\n          path: coverage\u002F\n\n  integration-tests:\n    runs-on: ubuntu-latest\n    # Only run on main branch and schedule (not PRs from forks)\n    if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository\n    needs: unit-tests\n    env:\n      BAMBOOHR_API_KEY: ${{ secrets.BAMBOOHR_API_KEY }}\n      BAMBOOHR_COMPANY_DOMAIN: ${{ secrets.BAMBOOHR_COMPANY_DOMAIN }}\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: Integration tests (real BambooHR API)\n        run: npm run test:integration\n        timeout-minutes: 5\n      - name: API health check\n        run: |\n          STATUS=$(curl -s -o \u002Fdev\u002Fnull -w \"%{http_code}\" \\\n            -u \"${BAMBOOHR_API_KEY}:x\" \\\n            -H \"Accept: application\u002Fjson\" \\\n            \"https:\u002F\u002Fapi.bamboohr.com\u002Fapi\u002Fgateway.php\u002F${BAMBOOHR_COMPANY_DOMAIN}\u002Fv1\u002Femployees\u002Fdirectory\")\n          echo \"BambooHR API status: $STATUS\"\n          [ \"$STATUS\" -eq 200 ] || exit 1\n```\n\n### Step 3: Test Structure\n\n```typescript\n\u002F\u002F tests\u002Funit\u002Fbamboohr-client.test.ts\nimport { describe, it, expect, beforeAll, afterAll, afterEach } from 'vitest';\nimport { setupServer } from 'msw\u002Fnode';\nimport { http, HttpResponse } from 'msw';\nimport { BambooHRClient } from '..\u002F..\u002Fsrc\u002Fbamboohr\u002Fclient';\n\nconst BASE = 'https:\u002F\u002Fapi.bamboohr.com\u002Fapi\u002Fgateway.php\u002Ftestco\u002Fv1';\n\nconst handlers = [\n  http.get(`${BASE}\u002Femployees\u002Fdirectory`, () =>\n    HttpResponse.json({\n      employees: [\n        { id: '1', displayName: 'Jane', jobTitle: 'Eng', department: 'Dev' },\n      ],\n    }),\n  ),\n  http.get(`${BASE}\u002Femployees\u002F:id\u002F`, () =>\n    HttpResponse.json({ id: '1', firstName: 'Jane', lastName: 'Smith' }),\n  ),\n  http.post(`${BASE}\u002Freports\u002Fcustom`, () =>\n    HttpResponse.json({ title: 'Report', employees: [] }),\n  ),\n  \u002F\u002F Simulate rate limit\n  http.get(`${BASE}\u002Femployees\u002Fratelimited`, () =>\n    new HttpResponse(null, { status: 503, headers: { 'Retry-After': '1' } }),\n  ),\n];\n\nconst server = setupServer(...handlers);\nbeforeAll(() => server.listen());\nafterEach(() => server.resetHandlers());\nafterAll(() => server.close());\n\ndescribe('BambooHRClient', () => {\n  const client = new BambooHRClient({ companyDomain: 'testco', apiKey: 'fake' });\n\n  it('fetches employee directory', async () => {\n    const dir = await client.getDirectory();\n    expect(dir.employees).toHaveLength(1);\n    expect(dir.employees[0].displayName).toBe('Jane');\n  });\n\n  it('fetches single employee with fields', async () => {\n    const emp = await client.getEmployee(1, ['firstName', 'lastName']);\n    expect(emp.firstName).toBe('Jane');\n  });\n\n  it('runs custom reports', async () => {\n    const report = await client.customReport(['firstName', 'department']);\n    expect(report.title).toBe('Report');\n  });\n\n  it('handles 503 rate limit with Retry-After', async () => {\n    await expect(\n      client.request('GET', '\u002Femployees\u002Fratelimited'),\n    ).rejects.toThrow(\u002F503\u002F);\n  });\n});\n```\n\n```typescript\n\u002F\u002F tests\u002Fintegration\u002Fbamboohr-live.test.ts\nimport { describe, it, expect } from 'vitest';\nimport { BambooHRClient } from '..\u002F..\u002Fsrc\u002Fbamboohr\u002Fclient';\n\nconst HAS_CREDS = !!process.env.BAMBOOHR_API_KEY && !!process.env.BAMBOOHR_COMPANY_DOMAIN;\n\ndescribe.skipIf(!HAS_CREDS)('BambooHR Live API', () => {\n  const client = new BambooHRClient({\n    companyDomain: process.env.BAMBOOHR_COMPANY_DOMAIN!,\n    apiKey: process.env.BAMBOOHR_API_KEY!,\n  });\n\n  it('should fetch employee directory', async () => {\n    const dir = await client.getDirectory();\n    expect(dir.employees.length).toBeGreaterThan(0);\n    expect(dir.employees[0]).toHaveProperty('displayName');\n    expect(dir.employees[0]).toHaveProperty('jobTitle');\n  }, 15_000);\n\n  it('should run a custom report', async () => {\n    const report = await client.customReport(['firstName', 'lastName', 'department']);\n    expect(report).toHaveProperty('employees');\n    expect(Array.isArray(report.employees)).toBe(true);\n  }, 15_000);\n\n  it('should fetch time off types', async () => {\n    const types = await client.request('GET', '\u002Fmeta\u002Ftime_off\u002Ftypes');\n    expect(types).toBeTruthy();\n  }, 15_000);\n});\n```\n\n### Step 4: PR Status Check\n\n```yaml\n# Branch protection — require these checks to pass\n# Settings > Branches > Branch protection rules\nrequired_status_checks:\n  - 'unit-tests'\n  # integration-tests is optional (may fail if API is down)\n```\n\n### Step 5: Scheduled API Health Monitoring\n\n```yaml\n# .github\u002Fworkflows\u002Fbamboohr-health.yml\nname: BambooHR API Health\n\non:\n  schedule:\n    - cron: '0 *\u002F4 * * *'  # Every 4 hours\n\njobs:\n  health-check:\n    runs-on: ubuntu-latest\n    env:\n      BAMBOOHR_API_KEY: ${{ secrets.BAMBOOHR_API_KEY }}\n      BAMBOOHR_COMPANY_DOMAIN: ${{ secrets.BAMBOOHR_COMPANY_DOMAIN }}\n    steps:\n      - name: Check BambooHR API\n        run: |\n          STATUS=$(curl -s -o \u002Ftmp\u002Fresponse.json -w \"%{http_code}\" \\\n            -u \"${BAMBOOHR_API_KEY}:x\" \\\n            -H \"Accept: application\u002Fjson\" \\\n            \"https:\u002F\u002Fapi.bamboohr.com\u002Fapi\u002Fgateway.php\u002F${BAMBOOHR_COMPANY_DOMAIN}\u002Fv1\u002Femployees\u002Fdirectory\")\n\n          if [ \"$STATUS\" -ne 200 ]; then\n            echo \"::error::BambooHR API returned $STATUS\"\n            exit 1\n          fi\n\n          COUNT=$(cat \u002Ftmp\u002Fresponse.json | jq '.employees | length')\n          echo \"BambooHR API healthy: $COUNT employees\"\n```\n\n## Output\n\n- Unit test pipeline with mocked BambooHR API\n- Integration test pipeline with real API (gated on secrets)\n- Scheduled health monitoring workflow\n- PR status checks configured\n- Coverage reports uploaded\n\n## Error Handling\n\n| Issue | Cause | Solution |\n|-------|-------|----------|\n| Secret not available in PR | Fork PR (no secrets access) | Use `if` guard on integration job |\n| Integration test timeout | BambooHR API slow | Set `timeout-minutes: 5` |\n| Flaky 503 in tests | Rate limiting in CI | Add retry logic to test helpers |\n| Health check false alarm | BambooHR maintenance | Check status page before alerting |\n\n## Resources\n\n- [GitHub Actions Documentation](https:\u002F\u002Fdocs.github.com\u002Fen\u002Factions)\n- [GitHub Encrypted Secrets](https:\u002F\u002Fdocs.github.com\u002Fen\u002Factions\u002Fsecurity-guides\u002Fencrypted-secrets)\n- [MSW for Testing](https:\u002F\u002Fmswjs.io\u002F)\n\n## Next Steps\n\nFor deployment patterns, see `bamboohr-deploy-integration`.\n\n","# BambooHR CI Integration\n\n## Overview\n\nSet up CI\u002FCD pipelines for BambooHR integrations with proper secret management, unit tests with mocked API, and optional integration tests against the real BambooHR API.\n\n## Prerequisites\n\n- GitHub repository with Actions enabled\n- BambooHR test API key (sandbox company or test account)\n- npm\u002Fpnpm project with test suite configured\n\n## Instructions\n\n### Step 1: Configure GitHub Secrets\n\n```bash\n# Required for integration tests\ngh secret set BAMBOOHR_API_KEY --body \"your-test-api-key\"\ngh secret set BAMBOOHR_COMPANY_DOMAIN --body \"your-test-company\"\n\n# Optional: webhook testing\ngh secret set BAMBOOHR_WEBHOOK_SECRET --body \"your-webhook-hmac-secret\"\n```\n\n### Step 2: GitHub Actions Workflow\n\n```yaml\n# .github\u002Fworkflows\u002Fbamboohr-integration.yml\nname: BambooHR Integration\n\non:\n  push:\n    branches: [main]\n  pull_request:\n    branches: [main]\n  schedule:\n    # Run daily to catch BambooHR API changes early\n    - cron: '0 6 * * 1-5'\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 run typecheck\n      - name: Unit tests (mocked BambooHR API)\n        run: npm test -- --coverage --reporter=verbose\n      - uses: actions\u002Fupload-artifact@v4\n        if: always()\n        with:\n          name: coverage\n          path: coverage\u002F\n\n  integration-tests:\n    runs-on: ubuntu-latest\n    # Only run on main branch and schedule (not PRs from forks)\n    if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository\n    needs: unit-tests\n    env:\n      BAMBOOHR_API_KEY: ${{ secrets.BAMBOOHR_API_KEY }}\n      BAMBOOHR_COMPANY_DOMAIN: ${{ secrets.BAMBOOHR_COMPANY_DOMAIN }}\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: Integration tests (real BambooHR API)\n        run: npm run test:integration\n        timeout-minutes: 5\n      - name: API health check\n        run: |\n          STATUS=$(curl -s -o \u002Fdev\u002Fnull -w \"%{http_code}\" \\\n            -u \"${BAMBOOHR_API_KEY}:x\" \\\n            -H \"Accept: application\u002Fjson\" \\\n            \"https:\u002F\u002Fapi.bamboohr.com\u002Fapi\u002Fgateway.php\u002F${BAMBOOHR_COMPANY_DOMAIN}\u002Fv1\u002Femployees\u002Fdirectory\")\n          echo \"BambooHR API status: $STATUS\"\n          [ \"$STATUS\" -eq 200 ] || exit 1\n```\n\n### Step 3: Test Structure\n\n```typescript\n\u002F\u002F tests\u002Funit\u002Fbamboohr-client.test.ts\nimport { describe, it, expect, beforeAll, afterAll, afterEach } from 'vitest';\nimport { setupServer } from 'msw\u002Fnode';\nimport { http, HttpResponse } from 'msw';\nimport { BambooHRClient } from '..\u002F..\u002Fsrc\u002Fbamboohr\u002Fclient';\n\nconst BASE = 'https:\u002F\u002Fapi.bamboohr.com\u002Fapi\u002Fgateway.php\u002Ftestco\u002Fv1';\n\nconst handlers = [\n  http.get(`${BASE}\u002Femployees\u002Fdirectory`, () =>\n    HttpResponse.json({\n      employees: [\n        { id: '1', displayName: 'Jane', jobTitle: 'Eng', department: 'Dev' },\n      ],\n    }),\n  ),\n  http.get(`${BASE}\u002Femployees\u002F:id\u002F`, () =>\n    HttpResponse.json({ id: '1', firstName: 'Jane', lastName: 'Smith' }),\n  ),\n  http.post(`${BASE}\u002Freports\u002Fcustom`, () =>\n    HttpResponse.json({ title: 'Report', employees: [] }),\n  ),\n  \u002F\u002F Simulate rate limit\n  http.get(`${BASE}\u002Femployees\u002Fratelimited`, () =>\n    new HttpResponse(null, { status: 503, headers: { 'Retry-After': '1' } }),\n  ),\n];\n\nconst server = setupServer(...handlers);\nbeforeAll(() => server.listen());\nafterEach(() => server.resetHandlers());\nafterAll(() => server.close());\n\ndescribe('BambooHRClient', () => {\n  const client = new BambooHRClient({ companyDomain: 'testco', apiKey: 'fake' });\n\n  it('fetches employee directory', async () => {\n    const dir = await client.getDirectory();\n    expect(dir.employees).toHaveLength(1);\n    expect(dir.employees[0].displayName).toBe('Jane');\n  });\n\n  it('fetches single employee with fields', async () => {\n    const emp = await client.getEmployee(1, ['firstName', 'lastName']);\n    expect(emp.firstName).toBe('Jane');\n  });\n\n  it('runs custom reports', async () => {\n    const report = await client.customReport(['firstName', 'department']);\n    expect(report.title).toBe('Report');\n  });\n\n  it('handles 503 rate limit with Retry-After', async () => {\n    await expect(\n      client.request('GET', '\u002Femployees\u002Fratelimited'),\n    ).rejects.toThrow(\u002F503\u002F);\n  });\n});\n```\n\n```typescript\n\u002F\u002F tests\u002Fintegration\u002Fbamboohr-live.test.ts\nimport { describe, it, expect } from 'vitest';\nimport { BambooHRClient } from '..\u002F..\u002Fsrc\u002Fbamboohr\u002Fclient';\n\nconst HAS_CREDS = !!process.env.BAMBOOHR_API_KEY && !!process.env.BAMBOOHR_COMPANY_DOMAIN;\n\ndescribe.skipIf(!HAS_CREDS)('BambooHR Live API', () => {\n  const client = new BambooHRClient({\n    companyDomain: process.env.BAMBOOHR_COMPANY_DOMAIN!,\n    apiKey: process.env.BAMBOOHR_API_KEY!,\n  });\n\n  it('should fetch employee directory', async () => {\n    const dir = await client.getDirectory();\n    expect(dir.employees.length).toBeGreaterThan(0);\n    expect(dir.employees[0]).toHaveProperty('displayName');\n    expect(dir.employees[0]).toHaveProperty('jobTitle');\n  }, 15_000);\n\n  it('should run a custom report', async () => {\n    const report = await client.customReport(['firstName', 'lastName', 'department']);\n    expect(report).toHaveProperty('employees');\n    expect(Array.isArray(report.employees)).toBe(true);\n  }, 15_000);\n\n  it('should fetch time off types', async () => {\n    const types = await client.request('GET', '\u002Fmeta\u002Ftime_off\u002Ftypes');\n    expect(types).toBeTruthy();\n  }, 15_000);\n});\n```\n\n### Step 4: PR Status Check\n\n```yaml\n# Branch protection — require these checks to pass\n# Settings > Branches > Branch protection rules\nrequired_status_checks:\n  - 'unit-tests'\n  # integration-tests is optional (may fail if API is down)\n```\n\n### Step 5: Scheduled API Health Monitoring\n\n```yaml\n# .github\u002Fworkflows\u002Fbamboohr-health.yml\nname: BambooHR API Health\n\non:\n  schedule:\n    - cron: '0 *\u002F4 * * *'  # Every 4 hours\n\njobs:\n  health-check:\n    runs-on: ubuntu-latest\n    env:\n      BAMBOOHR_API_KEY: ${{ secrets.BAMBOOHR_API_KEY }}\n      BAMBOOHR_COMPANY_DOMAIN: ${{ secrets.BAMBOOHR_COMPANY_DOMAIN }}\n    steps:\n      - name: Check BambooHR API\n        run: |\n          STATUS=$(curl -s -o \u002Ftmp\u002Fresponse.json -w \"%{http_code}\" \\\n            -u \"${BAMBOOHR_API_KEY}:x\" \\\n            -H \"Accept: application\u002Fjson\" \\\n            \"https:\u002F\u002Fapi.bamboohr.com\u002Fapi\u002Fgateway.php\u002F${BAMBOOHR_COMPANY_DOMAIN}\u002Fv1\u002Femployees\u002Fdirectory\")\n\n          if [ \"$STATUS\" -ne 200 ]; then\n            echo \"::error::BambooHR API returned $STATUS\"\n            exit 1\n          fi\n\n          COUNT=$(cat \u002Ftmp\u002Fresponse.json | jq '.employees | length')\n          echo \"BambooHR API healthy: $COUNT employees\"\n```\n\n## Output\n\n- Unit test pipeline with mocked BambooHR API\n- Integration test pipeline with real API (gated on secrets)\n- Scheduled health monitoring workflow\n- PR status checks configured\n- Coverage reports uploaded\n\n## Error Handling\n\n| Issue | Cause | Solution |\n|-------|-------|----------|\n| Secret not available in PR | Fork PR (no secrets access) | Use `if` guard on integration job |\n| Integration test timeout | BambooHR API slow | Set `timeout-minutes: 5` |\n| Flaky 503 in tests | Rate limiting in CI | Add retry logic to test helpers |\n| Health check false alarm | BambooHR maintenance | Check status page before alerting |\n\n## Resources\n\n- [GitHub Actions Documentation](https:\u002F\u002Fdocs.github.com\u002Fen\u002Factions)\n- [GitHub Encrypted Secrets](https:\u002F\u002Fdocs.github.com\u002Fen\u002Factions\u002Fsecurity-guides\u002Fencrypted-secrets)\n- [MSW for Testing](https:\u002F\u002Fmswjs.io\u002F)\n\n## Next Steps\n\nFor deployment patterns, see `bamboohr-deploy-integration`.\n\n",{"name":5,"tags":57,"author":59,"license":15,"version":60,"description":61,"allowed-tools":62,"compatible-with":63},[58,38,36,47],"saas","Jeremy Longshore \u003Cjeremy@intentsolutions.io>","1.0.0","Configure CI\u002FCD pipelines for BambooHR integrations with GitHub Actions,\nautomated testing, and secret management.\nUse when setting up automated testing, configuring CI pipelines,\nor integrating BambooHR API tests into your build process.\nTrigger with phrases like \"bamboohr CI\", \"bamboohr GitHub Actions\",\n\"bamboohr automated tests\", \"CI bamboohr\", \"bamboohr pipeline\".\n","Read, Write, Edit, Bash(gh:*)","claude-code","main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fbamboohr-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":74,"prompt":84,"zipAvailable":85},[75,78,81],{"tool":76,"command":77},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill bamboohr-ci-integration",{"tool":79,"command":80},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill bamboohr-ci-integration",{"tool":82,"command":83},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill bamboohr-ci-integration","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fjeremylongshore\u002Fclaude-code-plugins-plus-skills\u002Fbamboohr-ci-integration\u002FSKILL.md",true,[],[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":52},"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":52},"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":52},"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":52},"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":52},"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":52},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[134]]