[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M72ZRPBZ8EAMXQV70VCFPRJD":3,"skill-same:01M72ZRPBZ8EAMXQV70VCFPRJD":48},{"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":25,"commitSha":26,"skillDirectory":27,"forksCount":28,"repositoryHtmlUrl":29,"repositoryHomepageUrl":6,"ownerHtmlUrl":30,"ownerBlogUrl":31,"ownerDescription":32,"updatedAt":33,"install":34,"resources":47},"01M72ZRPBZ8EAMXQV70VCFPRJD","e2e-testing",null,"Playwright E2E test kalıpları, Page Object Model, yapılandırma, CI\u002FCD entegrasyonu, artifact yönetimi ve kararsız test stratejileri.","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\u002Fskills\u002Feverything-claude-code\u002Fdocs\u002Ftr\u002Fskills\u002Fe2e-testing\u002FSKILL.md",[],[],"2026-11-11 15:11:14",false,"---\nname: e2e-testing\ndescription: Playwright E2E test kalıpları, Page Object Model, yapılandırma, CI\u002FCD entegrasyonu, artifact yönetimi ve kararsız test stratejileri.\norigin: ECC\n---\n\n# E2E Test Kalıpları\n\nKararlı, hızlı ve sürdürülebilir E2E test paketleri oluşturmak için kapsamlı Playwright kalıpları.\n\n## Test Dosyası Organizasyonu\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 Yapısı\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 Yapılandırması\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## Kararsız Test Kalıpları\n\n### Karantina\n\n```typescript\ntest('flaky: complex search', async ({ page }) => {\n  test.fixme(true, 'Flaky - Issue #123')\n  \u002F\u002F test kodu...\n})\n\ntest('conditional skip', async ({ page }) => {\n  test.skip(process.env.CI, 'Flaky in CI - Issue #123')\n  \u002F\u002F test kodu...\n})\n```\n\n### Kararsızlığı Belirleme\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### Yaygın Nedenler ve Çözümler\n\n**Yarış koşulları:**\n```typescript\n\u002F\u002F Kötü: element'in hazır olduğunu varsayar\nawait page.click('[data-testid=\"button\"]')\n\n\u002F\u002F İyi: otomatik bekleme locator\nawait page.locator('[data-testid=\"button\"]').click()\n```\n\n**Ağ zamanlaması:**\n```typescript\n\u002F\u002F Kötü: keyfi timeout\nawait page.waitForTimeout(5000)\n\n\u002F\u002F İyi: belirli koşulu bekle\nawait page.waitForResponse(resp => resp.url().includes('\u002Fapi\u002Fdata'))\n```\n\n**Animasyon zamanlaması:**\n```typescript\n\u002F\u002F Kötü: animasyon sırasında tıkla\nawait page.click('[data-testid=\"menu-item\"]')\n\n\u002F\u002F İyi: kararlılığı bekle\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 Yönetimi\n\n### Ekran Görüntüleri\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### Trace'ler\n\n```typescript\nawait browser.startTracing(page, {\n  path: 'artifacts\u002Ftrace.json',\n  screenshots: true,\n  snapshots: true,\n})\n\u002F\u002F ... test aksiyonları ...\nawait browser.stopTracing()\n```\n\n### Video\n\n```typescript\n\u002F\u002F playwright.config.ts'de\nuse: {\n  video: 'retain-on-failure',\n  videosPath: 'artifacts\u002Fvideos\u002F'\n}\n```\n\n## CI\u002FCD Entegrasyonu\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 Raporu Şablonu\n\n```markdown\n# E2E Test Raporu\n\n**Tarih:** YYYY-MM-DD HH:MM\n**Süre:** Xd Ys\n**Durum:** GEÇTİ \u002F BAŞARISIZ\n\n## Özet\n- Toplam: X | Geçti: Y (Z%) | Başarısız: A | Kararsız: B | Atlandı: C\n\n## Başarısız Testler\n\n### test-adı\n**Dosya:** `tests\u002Fe2e\u002Ffeature.spec.ts:45`\n**Hata:** Element'in görünür olması bekleniyordu\n**Ekran Görüntüsü:** artifacts\u002Ffailed.png\n**Önerilen Çözüm:** [açıklama]\n\n## Artifact'lar\n- HTML Raporu: playwright-report\u002Findex.html\n- Ekran Görüntüleri: artifacts\u002F*.png\n- Videolar: artifacts\u002Fvideos\u002F*.webm\n- Trace'ler: artifacts\u002F*.zip\n```\n\n## Wallet \u002F Web3 Testi\n\n```typescript\ntest('wallet connection', async ({ page, context }) => {\n  \u002F\u002F Wallet provider'ı mock'la\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## Finansal \u002F Kritik Akış Testi\n\n```typescript\ntest('trade execution', async ({ page }) => {\n  \u002F\u002F Üretimde atla — gerçek para\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 Önizlemeyi doğrula\n  const preview = page.locator('[data-testid=\"trade-preview\"]')\n  await expect(preview).toContainText('1.0')\n\n  \u002F\u002F Onayla ve blockchain'i bekle\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 Test Kalıpları\n\nKararlı, hızlı ve sürdürülebilir E2E test paketleri oluşturmak için kapsamlı Playwright kalıpları.\n\n## Test Dosyası Organizasyonu\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 Yapısı\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 Yapılandırması\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## Kararsız Test Kalıpları\n\n### Karantina\n\n```typescript\ntest('flaky: complex search', async ({ page }) => {\n  test.fixme(true, 'Flaky - Issue #123')\n  \u002F\u002F test kodu...\n})\n\ntest('conditional skip', async ({ page }) => {\n  test.skip(process.env.CI, 'Flaky in CI - Issue #123')\n  \u002F\u002F test kodu...\n})\n```\n\n### Kararsızlığı Belirleme\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### Yaygın Nedenler ve Çözümler\n\n**Yarış koşulları:**\n```typescript\n\u002F\u002F Kötü: element'in hazır olduğunu varsayar\nawait page.click('[data-testid=\"button\"]')\n\n\u002F\u002F İyi: otomatik bekleme locator\nawait page.locator('[data-testid=\"button\"]').click()\n```\n\n**Ağ zamanlaması:**\n```typescript\n\u002F\u002F Kötü: keyfi timeout\nawait page.waitForTimeout(5000)\n\n\u002F\u002F İyi: belirli koşulu bekle\nawait page.waitForResponse(resp => resp.url().includes('\u002Fapi\u002Fdata'))\n```\n\n**Animasyon zamanlaması:**\n```typescript\n\u002F\u002F Kötü: animasyon sırasında tıkla\nawait page.click('[data-testid=\"menu-item\"]')\n\n\u002F\u002F İyi: kararlılığı bekle\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 Yönetimi\n\n### Ekran Görüntüleri\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### Trace'ler\n\n```typescript\nawait browser.startTracing(page, {\n  path: 'artifacts\u002Ftrace.json',\n  screenshots: true,\n  snapshots: true,\n})\n\u002F\u002F ... test aksiyonları ...\nawait browser.stopTracing()\n```\n\n### Video\n\n```typescript\n\u002F\u002F playwright.config.ts'de\nuse: {\n  video: 'retain-on-failure',\n  videosPath: 'artifacts\u002Fvideos\u002F'\n}\n```\n\n## CI\u002FCD Entegrasyonu\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 Raporu Şablonu\n\n```markdown\n# E2E Test Raporu\n\n**Tarih:** YYYY-MM-DD HH:MM\n**Süre:** Xd Ys\n**Durum:** GEÇTİ \u002F BAŞARISIZ\n\n## Özet\n- Toplam: X | Geçti: Y (Z%) | Başarısız: A | Kararsız: B | Atlandı: C\n\n## Başarısız Testler\n\n### test-adı\n**Dosya:** `tests\u002Fe2e\u002Ffeature.spec.ts:45`\n**Hata:** Element'in görünür olması bekleniyordu\n**Ekran Görüntüsü:** artifacts\u002Ffailed.png\n**Önerilen Çözüm:** [açıklama]\n\n## Artifact'lar\n- HTML Raporu: playwright-report\u002Findex.html\n- Ekran Görüntüleri: artifacts\u002F*.png\n- Videolar: artifacts\u002Fvideos\u002F*.webm\n- Trace'ler: artifacts\u002F*.zip\n```\n\n## Wallet \u002F Web3 Testi\n\n```typescript\ntest('wallet connection', async ({ page, context }) => {\n  \u002F\u002F Wallet provider'ı mock'la\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## Finansal \u002F Kritik Akış Testi\n\n```typescript\ntest('trade execution', async ({ page }) => {\n  \u002F\u002F Üretimde atla — gerçek para\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 Önizlemeyi doğrula\n  const preview = page.locator('[data-testid=\"trade-preview\"]')\n  await expect(preview).toContainText('1.0')\n\n  \u002F\u002F Onayla ve blockchain'i bekle\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,"origin":24,"description":7},"ECC","master","d6ca01da0f24a3b0e26e4a8b7b66cbd25d429f5d","skills\u002Feverything-claude-code\u002Fdocs\u002Ftr\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":35,"prompt":45,"zipAvailable":46},[36,39,42],{"tool":37,"command":38},"npx","npx skills add SriramGandhiS\u002FSkills --skill e2e-testing",{"tool":40,"command":41},"bunx","bunx skills add SriramGandhiS\u002FSkills --skill e2e-testing",{"tool":43,"command":44},"pnpm","pnpm dlx skills add SriramGandhiS\u002FSkills --skill e2e-testing","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FSriramGandhiS\u002FSkills\u002Fblob\u002Fmaster\u002Fskills\u002Feverything-claude-code\u002Fdocs\u002Ftr\u002Fskills\u002Fe2e-testing\u002FSKILL.md",true,[],[49,56,61,67,74,81],{"skillNo":50,"name":51,"nameZh":6,"description":52,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":53,"categories":54,"keywords":55,"publishedAt":19},"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",[],[],{"skillNo":57,"name":51,"nameZh":6,"description":52,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":58,"categories":59,"keywords":60,"publishedAt":19},"01M7325XM47AGWB6K6C4VXKE6B","https:\u002F\u002Fgithub.com\u002FSriramGandhiS\u002FSkills\u002Fblob\u002Fmaster\u002Fwebgpu-threejs-tsl\u002FSKILL.md",[],[],{"skillNo":62,"name":63,"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":64,"categories":65,"keywords":66,"publishedAt":19},"01M7325WP6DES69JKC840VMFEP","verification-loop","https:\u002F\u002Fgithub.com\u002FSriramGandhiS\u002FSkills\u002Fblob\u002Fmaster\u002Fweb-assets\u002Fdocs\u002Fzh-TW\u002Fskills\u002Fverification-loop\u002FSKILL.md",[],[],{"skillNo":68,"name":69,"nameZh":6,"description":70,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":73,"publishedAt":19},"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":75,"name":76,"nameZh":6,"description":77,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":80,"publishedAt":19},"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":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":87,"publishedAt":19},"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",[],[]]