[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M72XQWV8STYYQYEDNET5DSA7":3,"skill-same:01M72XQWV8STYYQYEDNET5DSA7":50},{"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":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":27,"commitSha":28,"skillDirectory":29,"forksCount":30,"repositoryHtmlUrl":31,"repositoryHomepageUrl":6,"ownerHtmlUrl":32,"ownerBlogUrl":33,"ownerDescription":34,"updatedAt":35,"install":36,"resources":49},"01M72XQWV8STYYQYEDNET5DSA7","e2e-testing",null,"Playwright E2E testing patterns, Page Object Model, configuration, CI\u002FCD integration, artifact management, and flaky test strategies.","SriramGandhiS\u002FSkills","SriramGandhiS","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F211849986?v=4","01M72WQCW12BYX71C6WN584TTA","Sriram S","01M72WQCWTJ2RD0ET1X31AF1RC",1,"MIT","https:\u002F\u002Fgithub.com\u002FSriramGandhiS\u002FSkills\u002Fblob\u002Fmaster\u002Feverything-claude-code\u002F.kiro\u002Fskills\u002Fe2e-testing\u002FSKILL.md",[],[],"2026-11-10 22:39:42",false,"---\nname: e2e-testing\ndescription: >\n  Playwright E2E testing patterns, Page Object Model, configuration, CI\u002FCD integration, artifact management, and flaky test strategies.\nmetadata:\n  origin: ECC\n---\n\n# E2E Testing Patterns\n\nComprehensive Playwright patterns for building stable, fast, and maintainable E2E test suites.\n\n## Test File Organization\n\n```\ntests\u002F\n├── e2e\u002F\n│   ├── auth\u002F\n│   │   ├── login.spec.ts\n│   │   ├── logout.spec.ts\n│   │   └── register.spec.ts\n│   ├── features\u002F\n│   │   ├── browse.spec.ts\n│   │   ├── search.spec.ts\n│   │   └── create.spec.ts\n│   └── api\u002F\n│       └── endpoints.spec.ts\n├── fixtures\u002F\n│   ├── auth.ts\n│   └── data.ts\n└── playwright.config.ts\n```\n\n## Page Object Model (POM)\n\n```typescript\nimport { Page, Locator } from '@playwright\u002Ftest'\n\nexport class ItemsPage {\n  readonly page: Page\n  readonly searchInput: Locator\n  readonly itemCards: Locator\n  readonly createButton: Locator\n\n  constructor(page: Page) {\n    this.page = page\n    this.searchInput = page.locator('[data-testid=\"search-input\"]')\n    this.itemCards = page.locator('[data-testid=\"item-card\"]')\n    this.createButton = page.locator('[data-testid=\"create-btn\"]')\n  }\n\n  async goto() {\n    await this.page.goto('\u002Fitems')\n    await this.page.waitForLoadState('networkidle')\n  }\n\n  async search(query: string) {\n    await this.searchInput.fill(query)\n    await this.page.waitForResponse(resp => resp.url().includes('\u002Fapi\u002Fsearch'))\n    await this.page.waitForLoadState('networkidle')\n  }\n\n  async getItemCount() {\n    return await this.itemCards.count()\n  }\n}\n```\n\n## Test Structure\n\n```typescript\nimport { test, expect } from '@playwright\u002Ftest'\nimport { ItemsPage } from '..\u002F..\u002Fpages\u002FItemsPage'\n\ntest.describe('Item Search', () => {\n  let itemsPage: ItemsPage\n\n  test.beforeEach(async ({ page }) => {\n    itemsPage = new ItemsPage(page)\n    await itemsPage.goto()\n  })\n\n  test('should search by keyword', async ({ page }) => {\n    await itemsPage.search('test')\n\n    const count = await itemsPage.getItemCount()\n    expect(count).toBeGreaterThan(0)\n\n    await expect(itemsPage.itemCards.first()).toContainText(\u002Ftest\u002Fi)\n    await page.screenshot({ path: 'artifacts\u002Fsearch-results.png' })\n  })\n\n  test('should handle no results', async ({ page }) => {\n    await itemsPage.search('xyznonexistent123')\n\n    await expect(page.locator('[data-testid=\"no-results\"]')).toBeVisible()\n    expect(await itemsPage.getItemCount()).toBe(0)\n  })\n})\n```\n\n## Playwright Configuration\n\n```typescript\nimport { defineConfig, devices } from '@playwright\u002Ftest'\n\nexport default defineConfig({\n  testDir: '.\u002Ftests\u002Fe2e',\n  fullyParallel: true,\n  forbidOnly: !!process.env.CI,\n  retries: process.env.CI ? 2 : 0,\n  workers: process.env.CI ? 1 : undefined,\n  reporter: [\n    ['html', { outputFolder: 'playwright-report' }],\n    ['junit', { outputFile: 'playwright-results.xml' }],\n    ['json', { outputFile: 'playwright-results.json' }]\n  ],\n  use: {\n    baseURL: process.env.BASE_URL || 'http:\u002F\u002Flocalhost:3000',\n    trace: 'on-first-retry',\n    screenshot: 'only-on-failure',\n    video: 'retain-on-failure',\n    actionTimeout: 10000,\n    navigationTimeout: 30000,\n  },\n  projects: [\n    { name: 'chromium', use: { ...devices['Desktop Chrome'] } },\n    { name: 'firefox', use: { ...devices['Desktop Firefox'] } },\n    { name: 'webkit', use: { ...devices['Desktop Safari'] } },\n    { name: 'mobile-chrome', use: { ...devices['Pixel 5'] } },\n  ],\n  webServer: {\n    command: 'npm run dev',\n    url: 'http:\u002F\u002Flocalhost:3000',\n    reuseExistingServer: !process.env.CI,\n    timeout: 120000,\n  },\n})\n```\n\n## Flaky Test Patterns\n\n### Quarantine\n\n```typescript\ntest('flaky: complex search', async ({ page }) => {\n  test.fixme(true, 'Flaky - Issue #123')\n  \u002F\u002F test code...\n})\n\ntest('conditional skip', async ({ page }) => {\n  test.skip(process.env.CI, 'Flaky in CI - Issue #123')\n  \u002F\u002F test code...\n})\n```\n\n### Identify Flakiness\n\n```bash\nnpx playwright test tests\u002Fsearch.spec.ts --repeat-each=10\nnpx playwright test tests\u002Fsearch.spec.ts --retries=3\n```\n\n### Common Causes & Fixes\n\n**Race conditions:**\n```typescript\n\u002F\u002F Bad: assumes element is ready\nawait page.click('[data-testid=\"button\"]')\n\n\u002F\u002F Good: auto-wait locator\nawait page.locator('[data-testid=\"button\"]').click()\n```\n\n**Network timing:**\n```typescript\n\u002F\u002F Bad: arbitrary timeout\nawait page.waitForTimeout(5000)\n\n\u002F\u002F Good: wait for specific condition\nawait page.waitForResponse(resp => resp.url().includes('\u002Fapi\u002Fdata'))\n```\n\n**Animation timing:**\n```typescript\n\u002F\u002F Bad: click during animation\nawait page.click('[data-testid=\"menu-item\"]')\n\n\u002F\u002F Good: wait for stability\nawait page.locator('[data-testid=\"menu-item\"]').waitFor({ state: 'visible' })\nawait page.waitForLoadState('networkidle')\nawait page.locator('[data-testid=\"menu-item\"]').click()\n```\n\n## Artifact Management\n\n### Screenshots\n\n```typescript\nawait page.screenshot({ path: 'artifacts\u002Fafter-login.png' })\nawait page.screenshot({ path: 'artifacts\u002Ffull-page.png', fullPage: true })\nawait page.locator('[data-testid=\"chart\"]').screenshot({ path: 'artifacts\u002Fchart.png' })\n```\n\n### Traces\n\n```typescript\nawait browser.startTracing(page, {\n  path: 'artifacts\u002Ftrace.json',\n  screenshots: true,\n  snapshots: true,\n})\n\u002F\u002F ... test actions ...\nawait browser.stopTracing()\n```\n\n### Video\n\n```typescript\n\u002F\u002F In playwright.config.ts\nuse: {\n  video: 'retain-on-failure',\n  videosPath: 'artifacts\u002Fvideos\u002F'\n}\n```\n\n## CI\u002FCD Integration\n\n```yaml\n# .github\u002Fworkflows\u002Fe2e.yml\nname: E2E Tests\non: [push, pull_request]\n\njobs:\n  test:\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      - run: npm ci\n      - run: npx playwright install --with-deps\n      - run: npx playwright test\n        env:\n          BASE_URL: ${{ vars.STAGING_URL }}\n      - uses: actions\u002Fupload-artifact@v4\n        if: always()\n        with:\n          name: playwright-report\n          path: playwright-report\u002F\n          retention-days: 30\n```\n\n## Test Report Template\n\n```markdown\n# E2E Test Report\n\n**Date:** YYYY-MM-DD HH:MM\n**Duration:** Xm Ys\n**Status:** PASSING \u002F FAILING\n\n## Summary\n- Total: X | Passed: Y (Z%) | Failed: A | Flaky: B | Skipped: C\n\n## Failed Tests\n\n### test-name\n**File:** `tests\u002Fe2e\u002Ffeature.spec.ts:45`\n**Error:** Expected element to be visible\n**Screenshot:** artifacts\u002Ffailed.png\n**Recommended Fix:** [description]\n\n## Artifacts\n- HTML Report: playwright-report\u002Findex.html\n- Screenshots: artifacts\u002F*.png\n- Videos: artifacts\u002Fvideos\u002F*.webm\n- Traces: artifacts\u002F*.zip\n```\n\n## Wallet \u002F Web3 Testing\n\n```typescript\ntest('wallet connection', async ({ page, context }) => {\n  \u002F\u002F Mock wallet provider\n  await context.addInitScript(() => {\n    window.ethereum = {\n      isMetaMask: true,\n      request: async ({ method }) => {\n        if (method === 'eth_requestAccounts')\n          return ['0x1234567890123456789012345678901234567890']\n        if (method === 'eth_chainId') return '0x1'\n      }\n    }\n  })\n\n  await page.goto('\u002F')\n  await page.locator('[data-testid=\"connect-wallet\"]').click()\n  await expect(page.locator('[data-testid=\"wallet-address\"]')).toContainText('0x1234')\n})\n```\n\n## Financial \u002F Critical Flow Testing\n\n```typescript\ntest('trade execution', async ({ page }) => {\n  \u002F\u002F Skip on production — real money\n  test.skip(process.env.NODE_ENV === 'production', 'Skip on production')\n\n  await page.goto('\u002Fmarkets\u002Ftest-market')\n  await page.locator('[data-testid=\"position-yes\"]').click()\n  await page.locator('[data-testid=\"trade-amount\"]').fill('1.0')\n\n  \u002F\u002F Verify preview\n  const preview = page.locator('[data-testid=\"trade-preview\"]')\n  await expect(preview).toContainText('1.0')\n\n  \u002F\u002F Confirm and wait for blockchain\n  await page.locator('[data-testid=\"confirm-trade\"]').click()\n  await page.waitForResponse(\n    resp => resp.url().includes('\u002Fapi\u002Ftrade') && resp.status() === 200,\n    { timeout: 30000 }\n  )\n\n  await expect(page.locator('[data-testid=\"trade-success\"]')).toBeVisible()\n})\n```\n","# E2E Testing Patterns\n\nComprehensive Playwright patterns for building stable, fast, and maintainable E2E test suites.\n\n## Test File Organization\n\n```\ntests\u002F\n├── e2e\u002F\n│   ├── auth\u002F\n│   │   ├── login.spec.ts\n│   │   ├── logout.spec.ts\n│   │   └── register.spec.ts\n│   ├── features\u002F\n│   │   ├── browse.spec.ts\n│   │   ├── search.spec.ts\n│   │   └── create.spec.ts\n│   └── api\u002F\n│       └── endpoints.spec.ts\n├── fixtures\u002F\n│   ├── auth.ts\n│   └── data.ts\n└── playwright.config.ts\n```\n\n## Page Object Model (POM)\n\n```typescript\nimport { Page, Locator } from '@playwright\u002Ftest'\n\nexport class ItemsPage {\n  readonly page: Page\n  readonly searchInput: Locator\n  readonly itemCards: Locator\n  readonly createButton: Locator\n\n  constructor(page: Page) {\n    this.page = page\n    this.searchInput = page.locator('[data-testid=\"search-input\"]')\n    this.itemCards = page.locator('[data-testid=\"item-card\"]')\n    this.createButton = page.locator('[data-testid=\"create-btn\"]')\n  }\n\n  async goto() {\n    await this.page.goto('\u002Fitems')\n    await this.page.waitForLoadState('networkidle')\n  }\n\n  async search(query: string) {\n    await this.searchInput.fill(query)\n    await this.page.waitForResponse(resp => resp.url().includes('\u002Fapi\u002Fsearch'))\n    await this.page.waitForLoadState('networkidle')\n  }\n\n  async getItemCount() {\n    return await this.itemCards.count()\n  }\n}\n```\n\n## Test Structure\n\n```typescript\nimport { test, expect } from '@playwright\u002Ftest'\nimport { ItemsPage } from '..\u002F..\u002Fpages\u002FItemsPage'\n\ntest.describe('Item Search', () => {\n  let itemsPage: ItemsPage\n\n  test.beforeEach(async ({ page }) => {\n    itemsPage = new ItemsPage(page)\n    await itemsPage.goto()\n  })\n\n  test('should search by keyword', async ({ page }) => {\n    await itemsPage.search('test')\n\n    const count = await itemsPage.getItemCount()\n    expect(count).toBeGreaterThan(0)\n\n    await expect(itemsPage.itemCards.first()).toContainText(\u002Ftest\u002Fi)\n    await page.screenshot({ path: 'artifacts\u002Fsearch-results.png' })\n  })\n\n  test('should handle no results', async ({ page }) => {\n    await itemsPage.search('xyznonexistent123')\n\n    await expect(page.locator('[data-testid=\"no-results\"]')).toBeVisible()\n    expect(await itemsPage.getItemCount()).toBe(0)\n  })\n})\n```\n\n## Playwright Configuration\n\n```typescript\nimport { defineConfig, devices } from '@playwright\u002Ftest'\n\nexport default defineConfig({\n  testDir: '.\u002Ftests\u002Fe2e',\n  fullyParallel: true,\n  forbidOnly: !!process.env.CI,\n  retries: process.env.CI ? 2 : 0,\n  workers: process.env.CI ? 1 : undefined,\n  reporter: [\n    ['html', { outputFolder: 'playwright-report' }],\n    ['junit', { outputFile: 'playwright-results.xml' }],\n    ['json', { outputFile: 'playwright-results.json' }]\n  ],\n  use: {\n    baseURL: process.env.BASE_URL || 'http:\u002F\u002Flocalhost:3000',\n    trace: 'on-first-retry',\n    screenshot: 'only-on-failure',\n    video: 'retain-on-failure',\n    actionTimeout: 10000,\n    navigationTimeout: 30000,\n  },\n  projects: [\n    { name: 'chromium', use: { ...devices['Desktop Chrome'] } },\n    { name: 'firefox', use: { ...devices['Desktop Firefox'] } },\n    { name: 'webkit', use: { ...devices['Desktop Safari'] } },\n    { name: 'mobile-chrome', use: { ...devices['Pixel 5'] } },\n  ],\n  webServer: {\n    command: 'npm run dev',\n    url: 'http:\u002F\u002Flocalhost:3000',\n    reuseExistingServer: !process.env.CI,\n    timeout: 120000,\n  },\n})\n```\n\n## Flaky Test Patterns\n\n### Quarantine\n\n```typescript\ntest('flaky: complex search', async ({ page }) => {\n  test.fixme(true, 'Flaky - Issue #123')\n  \u002F\u002F test code...\n})\n\ntest('conditional skip', async ({ page }) => {\n  test.skip(process.env.CI, 'Flaky in CI - Issue #123')\n  \u002F\u002F test code...\n})\n```\n\n### Identify Flakiness\n\n```bash\nnpx playwright test tests\u002Fsearch.spec.ts --repeat-each=10\nnpx playwright test tests\u002Fsearch.spec.ts --retries=3\n```\n\n### Common Causes & Fixes\n\n**Race conditions:**\n```typescript\n\u002F\u002F Bad: assumes element is ready\nawait page.click('[data-testid=\"button\"]')\n\n\u002F\u002F Good: auto-wait locator\nawait page.locator('[data-testid=\"button\"]').click()\n```\n\n**Network timing:**\n```typescript\n\u002F\u002F Bad: arbitrary timeout\nawait page.waitForTimeout(5000)\n\n\u002F\u002F Good: wait for specific condition\nawait page.waitForResponse(resp => resp.url().includes('\u002Fapi\u002Fdata'))\n```\n\n**Animation timing:**\n```typescript\n\u002F\u002F Bad: click during animation\nawait page.click('[data-testid=\"menu-item\"]')\n\n\u002F\u002F Good: wait for stability\nawait page.locator('[data-testid=\"menu-item\"]').waitFor({ state: 'visible' })\nawait page.waitForLoadState('networkidle')\nawait page.locator('[data-testid=\"menu-item\"]').click()\n```\n\n## Artifact Management\n\n### Screenshots\n\n```typescript\nawait page.screenshot({ path: 'artifacts\u002Fafter-login.png' })\nawait page.screenshot({ path: 'artifacts\u002Ffull-page.png', fullPage: true })\nawait page.locator('[data-testid=\"chart\"]').screenshot({ path: 'artifacts\u002Fchart.png' })\n```\n\n### Traces\n\n```typescript\nawait browser.startTracing(page, {\n  path: 'artifacts\u002Ftrace.json',\n  screenshots: true,\n  snapshots: true,\n})\n\u002F\u002F ... test actions ...\nawait browser.stopTracing()\n```\n\n### Video\n\n```typescript\n\u002F\u002F In playwright.config.ts\nuse: {\n  video: 'retain-on-failure',\n  videosPath: 'artifacts\u002Fvideos\u002F'\n}\n```\n\n## CI\u002FCD Integration\n\n```yaml\n# .github\u002Fworkflows\u002Fe2e.yml\nname: E2E Tests\non: [push, pull_request]\n\njobs:\n  test:\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      - run: npm ci\n      - run: npx playwright install --with-deps\n      - run: npx playwright test\n        env:\n          BASE_URL: ${{ vars.STAGING_URL }}\n      - uses: actions\u002Fupload-artifact@v4\n        if: always()\n        with:\n          name: playwright-report\n          path: playwright-report\u002F\n          retention-days: 30\n```\n\n## Test Report Template\n\n```markdown\n# E2E Test Report\n\n**Date:** YYYY-MM-DD HH:MM\n**Duration:** Xm Ys\n**Status:** PASSING \u002F FAILING\n\n## Summary\n- Total: X | Passed: Y (Z%) | Failed: A | Flaky: B | Skipped: C\n\n## Failed Tests\n\n### test-name\n**File:** `tests\u002Fe2e\u002Ffeature.spec.ts:45`\n**Error:** Expected element to be visible\n**Screenshot:** artifacts\u002Ffailed.png\n**Recommended Fix:** [description]\n\n## Artifacts\n- HTML Report: playwright-report\u002Findex.html\n- Screenshots: artifacts\u002F*.png\n- Videos: artifacts\u002Fvideos\u002F*.webm\n- Traces: artifacts\u002F*.zip\n```\n\n## Wallet \u002F Web3 Testing\n\n```typescript\ntest('wallet connection', async ({ page, context }) => {\n  \u002F\u002F Mock wallet provider\n  await context.addInitScript(() => {\n    window.ethereum = {\n      isMetaMask: true,\n      request: async ({ method }) => {\n        if (method === 'eth_requestAccounts')\n          return ['0x1234567890123456789012345678901234567890']\n        if (method === 'eth_chainId') return '0x1'\n      }\n    }\n  })\n\n  await page.goto('\u002F')\n  await page.locator('[data-testid=\"connect-wallet\"]').click()\n  await expect(page.locator('[data-testid=\"wallet-address\"]')).toContainText('0x1234')\n})\n```\n\n## Financial \u002F Critical Flow Testing\n\n```typescript\ntest('trade execution', async ({ page }) => {\n  \u002F\u002F Skip on production — real money\n  test.skip(process.env.NODE_ENV === 'production', 'Skip on production')\n\n  await page.goto('\u002Fmarkets\u002Ftest-market')\n  await page.locator('[data-testid=\"position-yes\"]').click()\n  await page.locator('[data-testid=\"trade-amount\"]').fill('1.0')\n\n  \u002F\u002F Verify preview\n  const preview = page.locator('[data-testid=\"trade-preview\"]')\n  await expect(preview).toContainText('1.0')\n\n  \u002F\u002F Confirm and wait for blockchain\n  await page.locator('[data-testid=\"confirm-trade\"]').click()\n  await page.waitForResponse(\n    resp => resp.url().includes('\u002Fapi\u002Ftrade') && resp.status() === 200,\n    { timeout: 30000 }\n  )\n\n  await expect(page.locator('[data-testid=\"trade-success\"]')).toBeVisible()\n})\n```\n",{"name":5,"metadata":24,"description":26},{"origin":25},"ECC","Playwright E2E testing patterns, Page Object Model, configuration, CI\u002FCD integration, artifact management, and flaky test strategies.\n","master","d6ca01da0f24a3b0e26e4a8b7b66cbd25d429f5d","everything-claude-code\u002F.kiro\u002Fskills\u002Fe2e-testing",0,"https:\u002F\u002Fgithub.com\u002FSriramGandhiS\u002FSkills","https:\u002F\u002Fgithub.com\u002FSriramGandhiS","https:\u002F\u002Fsriram.website\u002F","Curious guy who keeps tinkering until something works","2026-05-20 16:21:34",{"source":8,"skillName":5,"commands":37,"prompt":47,"zipAvailable":48},[38,41,44],{"tool":39,"command":40},"npx","npx skills add SriramGandhiS\u002FSkills --skill e2e-testing",{"tool":42,"command":43},"bunx","bunx skills add SriramGandhiS\u002FSkills --skill e2e-testing",{"tool":45,"command":46},"pnpm","pnpm dlx skills add SriramGandhiS\u002FSkills --skill e2e-testing","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FSriramGandhiS\u002FSkills\u002Fblob\u002Fmaster\u002Feverything-claude-code\u002F.kiro\u002Fskills\u002Fe2e-testing\u002FSKILL.md",true,[],[51,59,64,70,77,84],{"skillNo":52,"name":53,"nameZh":6,"description":54,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":55,"categories":56,"keywords":57,"publishedAt":58},"01M732609EPJWV13PVTX3GT4TM","webgpu-threejs-tsl","Comprehensive guide for developing WebGPU-enabled Three.js applications using TSL (Three.js Shading Language). Covers WebGPU renderer setup, TSL syntax and node materials, compute shaders, post-processing effects, and WGSL integration. Use this skill when working with Three.js WebGPU, TSL shaders, node materials, or GPU compute in Three.js.","https:\u002F\u002Fgithub.com\u002FSriramGandhiS\u002FSkills\u002Fblob\u002Fmaster\u002Fwebgpu-threejs-tsl\u002Fskills\u002Fwebgpu-threejs-tsl\u002FSKILL.md",[],[],"2026-11-11 15:11:14",{"skillNo":60,"name":53,"nameZh":6,"description":54,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":61,"categories":62,"keywords":63,"publishedAt":58},"01M7325XM47AGWB6K6C4VXKE6B","https:\u002F\u002Fgithub.com\u002FSriramGandhiS\u002FSkills\u002Fblob\u002Fmaster\u002Fwebgpu-threejs-tsl\u002FSKILL.md",[],[],{"skillNo":65,"name":66,"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":67,"categories":68,"keywords":69,"publishedAt":58},"01M7325WP6DES69JKC840VMFEP","verification-loop","https:\u002F\u002Fgithub.com\u002FSriramGandhiS\u002FSkills\u002Fblob\u002Fmaster\u002Fweb-assets\u002Fdocs\u002Fzh-TW\u002Fskills\u002Fverification-loop\u002FSKILL.md",[],[],{"skillNo":71,"name":72,"nameZh":6,"description":73,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":74,"categories":75,"keywords":76,"publishedAt":58},"01M7325TFQF1DZTQ6J3WGQQ1VR","tdd-workflow","Use this skill when writing new features, fixing bugs, or refactoring code. Enforces test-driven development with 80%+ coverage including unit, integration, and E2E tests.","https:\u002F\u002Fgithub.com\u002FSriramGandhiS\u002FSkills\u002Fblob\u002Fmaster\u002Fweb-assets\u002Fdocs\u002Fzh-TW\u002Fskills\u002Ftdd-workflow\u002FSKILL.md",[],[],{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":83,"publishedAt":58},"01M7325RGV9AY9PK92D2V8KKPW","strategic-compact","Suggests manual context compaction at logical intervals to preserve context through task phases rather than arbitrary auto-compaction.","https:\u002F\u002Fgithub.com\u002FSriramGandhiS\u002FSkills\u002Fblob\u002Fmaster\u002Fweb-assets\u002Fdocs\u002Fzh-TW\u002Fskills\u002Fstrategic-compact\u002FSKILL.md",[],[],{"skillNo":85,"name":86,"nameZh":6,"description":87,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":90,"publishedAt":58},"01M7325MZC28SE86E7NMCNEFS4","security-review","Use this skill when adding authentication, handling user input, working with secrets, creating API endpoints, or implementing payment\u002Fsensitive features. Provides comprehensive security checklist and patterns.","https:\u002F\u002Fgithub.com\u002FSriramGandhiS\u002FSkills\u002Fblob\u002Fmaster\u002Fweb-assets\u002Fdocs\u002Fzh-TW\u002Fskills\u002Fsecurity-review\u002FSKILL.md",[],[]]