[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DC8R7S3ZQN49HEHGTSG7C9":3,"skill-same:01M6DC8R7S3ZQN49HEHGTSG7C9":70},{"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":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":50,"commitSha":51,"skillDirectory":52,"forksCount":14,"repositoryHtmlUrl":53,"repositoryHomepageUrl":6,"ownerHtmlUrl":54,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":55,"install":56,"resources":69},"01M6DC8R7S3ZQN49HEHGTSG7C9","e2e-testing",null,"Playwright E2E testing patterns, Page Object Model, configuration, CI\u002FCD integration, artifact management, and flaky test strategies.","Prekzursil\u002Fagent-skills-toolchain","Prekzursil","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F54636077?v=4","01M6DACZ1PCQHD99SCR1YXG28B","Andrei Mihai Visalon","01M6DACZ670WZF535V3WYYSS4Z",0,"MIT","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Fci\u002Fskills-allowlist\u002Fe2e-testing\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],"e2e testing","e2e","testing","playwright","test","integration","ci","e2e testing patterns","testing patterns","model","page","management","configuration","patterns","artifact","strategies","cd","2026-11-10 10:12:30",false,"---\nname: e2e-testing\ndescription: Playwright E2E testing patterns, Page Object Model, configuration, CI\u002FCD integration, artifact management, and flaky test strategies.\norigin: 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,"origin":49,"description":7},"ECC","main","a298c929b6cbd662e1fce54302ce520d5ceea1a5","ci\u002Fskills-allowlist\u002Fe2e-testing","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain","https:\u002F\u002Fgithub.com\u002FPrekzursil","2026-11-02 14:30:57",{"source":8,"skillName":5,"commands":57,"prompt":67,"zipAvailable":68},[58,61,64],{"tool":59,"command":60},"npx","npx skills add Prekzursil\u002Fagent-skills-toolchain --skill e2e-testing",{"tool":62,"command":63},"bunx","bunx skills add Prekzursil\u002Fagent-skills-toolchain --skill e2e-testing",{"tool":65,"command":66},"pnpm","pnpm dlx skills add Prekzursil\u002Fagent-skills-toolchain --skill e2e-testing","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Fci\u002Fskills-allowlist\u002Fe2e-testing\u002FSKILL.md",true,[],[71,93,122,146,160,176],{"skillNo":72,"name":73,"nameZh":6,"description":74,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":75,"categories":76,"keywords":77,"publishedAt":44},"01M6DF7D7478R55P46REYH4QAC","clarify-requirements","Resolve genuine pre-execution ambiguity by scanning repo context, generating 1-6 grounded options, and asking 1-3 focused questions via AskUserQuestion. NOT for mid-task use (injection risk); NOT when the goal is already unambiguous; use to disambiguate vague prompts before any file edits.","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Fworkspace-hooks\u002Fskills\u002Fclarify-requirements\u002FSKILL.md",[],[78,79,80,81,82,83,84,85,86,87,88,89,90,91,92],"clarify requirements","clarify","requirements","risk","options","task","prompts","goal","scanning","use","context","repo","injection","execution","file",{"skillNo":94,"name":95,"nameZh":6,"description":96,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":102,"publishedAt":44},"01M6DF79CA4BHJS66J8EZDBPWJ","openmm-md","Run FREE, open-source, Windows-native GPU molecular dynamics via the openmm-md MCP (OpenMM + CUDA on the local NVIDIA GPU). Use for protein \u002F protein-ligand MD when you want a free stack or are on Windows without a Schrodinger license. Covers the full workflow (prepare, solvate, minimize, equilibrate, production, analyze, mmgbsa) AND an honest decision guide vs Schrodinger Desmond, including how to run Desmond legitimately on Linux or a cloud GPU with a real license. This is a deliberately LESSER free alternative and does NOT replace the schrodinger MCP tools. Do NOT use it to pick a free tool when a validated FEP+, WaterMap, IFD-MD, or Prime MM-GBSA result is actually required.","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Fmcp\u002Fopenmm-md-mcp\u002Fskill\u002Fopenmm-md\u002FSKILL.md",[99],{"categoryNo":100,"categoryName":101,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[103,104,105,106,107,108,109,110,111,112,113,114,115,116,87,117,118,119,120,121],"openmm md","how","decision","pick","linux","analyze","tool","stack","open","NVIDIA","gpu","license","workflow","windows","free","molecular dynamics","local","do","MCP",{"skillNo":123,"name":124,"nameZh":6,"description":125,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":126,"categories":127,"keywords":132,"publishedAt":44},"01M6DF76C1MG85VEWP8VZCBNMN","visual-review","Take screenshots of web pages and UI using Playwright for visual review and iteration","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fvisual-review\u002FSKILL.md",[128,131],{"categoryNo":129,"categoryName":130,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[133,134,135,136,137,138,139,140,141,142,104,143,144,30,145],"review","visual","visual review","pages","web","false","iteration","take","check","slides","ui","screenshot","screenshots",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":152,"publishedAt":44},"01M6DF73AQVCBZKEN0YXEX9FXP","status","Diagnostic status report — shows metaswarm installation state, project setup, and potential issues","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fstatus\u002FSKILL.md",[],[148,153,154,155,156,157,158,159],"setup","report","project","installation","project setup","issues","state",{"skillNo":161,"name":162,"nameZh":6,"description":163,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":164,"categories":165,"keywords":167,"publishedAt":44},"01M6DF6X6C2XB0P6GX76P7TTYV","start","Use when starting work on any task, when the user mentions metaswarm, or when the user wants to begin tracked development work","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fstart\u002FSKILL.md",[166],{"categoryNo":100,"categoryName":101,"taxonomyType":21,"taxonomyTypeDesc":22},[162,168,83,169,170,171,87,172,173,174,175],"start issue","issue","ready","work on issue","user","work","work on","development",{"skillNo":177,"name":153,"nameZh":6,"description":178,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":179,"categories":180,"keywords":181,"publishedAt":44},"01M6DF6QMJ9AJKFKHHKRT005PQ","Interactive project setup — detects your project, configures metaswarm, writes project-local files","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002Ftools\u002Feditor\u002Fmetaswarm\u002Fskills\u002Fsetup\u002FSKILL.md",[],[153,155,119,182,157,183],"files","interactive"]