[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DBBMDM271G5NJMNHJCJM4E":3,"skill-same:01M6DBBMDM271G5NJMNHJCJM4E":69},{"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":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":49,"commitSha":50,"skillDirectory":51,"forksCount":14,"repositoryHtmlUrl":52,"repositoryHomepageUrl":6,"ownerHtmlUrl":53,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":54,"install":55,"resources":68},"01M6DBBMDM271G5NJMNHJCJM4E","e2e-testing",null,"Playwright E2E patterns -- Page Object Model, config, CI\u002FCD, artifacts, flaky tests. NOT for driving a live app (use webapp-testing).","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\u002F.agents\u002Fskills\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],"testing","e2e testing","e2e","playwright","config","artifacts","ci","model","page","use","webapp","patterns","cd","live","tests","app","2026-11-10 10:12:30",false,"---\nname: e2e-testing\ndescription: Playwright E2E patterns -- Page Object Model, config, CI\u002FCD, artifacts, flaky tests. NOT for driving a live app (use webapp-testing).\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":48,"description":7},"ECC","main","a298c929b6cbd662e1fce54302ce520d5ceea1a5",".agents\u002Fskills\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":56,"prompt":66,"zipAvailable":67},[57,60,63],{"tool":58,"command":59},"npx","npx skills add Prekzursil\u002Fagent-skills-toolchain --skill e2e-testing",{"tool":61,"command":62},"bunx","bunx skills add Prekzursil\u002Fagent-skills-toolchain --skill e2e-testing",{"tool":64,"command":65},"pnpm","pnpm dlx skills add Prekzursil\u002Fagent-skills-toolchain --skill e2e-testing","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fe2e-testing\u002FSKILL.md",true,[],[70,91,120,144,158,174],{"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":43},"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",[],[77,78,79,80,81,82,83,84,85,36,86,87,88,89,90],"clarify requirements","clarify","requirements","risk","options","task","prompts","goal","scanning","context","repo","injection","execution","file",{"skillNo":92,"name":93,"nameZh":6,"description":94,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":95,"categories":96,"keywords":100,"publishedAt":43},"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",[97],{"categoryNo":98,"categoryName":99,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[101,102,103,104,105,106,107,108,109,110,111,112,113,114,36,115,116,117,118,119],"openmm md","how","decision","pick","linux","analyze","tool","stack","open","NVIDIA","gpu","license","workflow","windows","free","molecular dynamics","local","do","MCP",{"skillNo":121,"name":122,"nameZh":6,"description":123,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":124,"categories":125,"keywords":130,"publishedAt":43},"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",[126,129],{"categoryNo":127,"categoryName":128,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[131,132,133,134,135,136,137,138,139,140,102,141,142,30,143],"review","visual","visual review","pages","web","false","iteration","take","check","slides","ui","screenshot","screenshots",{"skillNo":145,"name":146,"nameZh":6,"description":147,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":148,"categories":149,"keywords":150,"publishedAt":43},"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",[],[146,151,152,153,154,155,156,157],"setup","report","project","installation","project setup","issues","state",{"skillNo":159,"name":160,"nameZh":6,"description":161,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":162,"categories":163,"keywords":165,"publishedAt":43},"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",[164],{"categoryNo":98,"categoryName":99,"taxonomyType":21,"taxonomyTypeDesc":22},[160,166,82,167,168,169,36,170,171,172,173],"start issue","issue","ready","work on issue","user","work","work on","development",{"skillNo":175,"name":151,"nameZh":6,"description":176,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":177,"categories":178,"keywords":179,"publishedAt":43},"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",[],[151,153,117,180,155,181],"files","interactive"]