[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6DBYEXRATDFH1W6G1FVMGFC":3,"skill-same:01M6DBYEXRATDFH1W6G1FVMGFC":93},{"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":23,"publishedAt":36,"linkOnly":37,"markdownContent":38,"markdownBody":39,"frontMatter":40,"refName":41,"commitSha":42,"skillDirectory":43,"forksCount":14,"repositoryHtmlUrl":44,"repositoryHomepageUrl":6,"ownerHtmlUrl":45,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":46,"install":47,"resources":60},"01M6DBYEXRATDFH1W6G1FVMGFC","source-command-e2e",null,"Generate and run end-to-end tests with Playwright. Creates test journeys, runs tests, captures screenshots\u002Fvideos\u002Ftraces, and uploads artifacts.","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\u002Fsource-command-e2e\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35],"e2e","command","source command e2e","screenshots","playwright","test","generate","run","artifacts","uploads","tests","end","2026-11-10 10:12:30",false,"---\nname: \"source-command-e2e\"\ndescription: \"Generate and run end-to-end tests with Playwright. Creates test journeys, runs tests, captures screenshots\u002Fvideos\u002Ftraces, and uploads artifacts.\"\n---\n\n# source-command-e2e\n\nUse this skill when the user asks to run the migrated source command `e2e`.\n\n## Command Template\n\n# E2E Command\n\nThis command invokes the **e2e-runner** agent to generate, maintain, and execute end-to-end tests using Playwright.\n\n## What This Command Does\n\n1. **Generate Test Journeys** - Create Playwright tests for user flows\n2. **Run E2E Tests** - Execute tests across browsers\n3. **Capture Artifacts** - Screenshots, videos, traces on failures\n4. **Upload Results** - HTML reports and JUnit XML\n5. **Identify Flaky Tests** - Quarantine unstable tests\n\n## When to Use\n\nUse `\u002Fe2e` when:\n- Testing critical user journeys (login, trading, payments)\n- Verifying multi-step flows work end-to-end\n- Testing UI interactions and navigation\n- Validating integration between frontend and backend\n- Preparing for production deployment\n\n## How It Works\n\nThe e2e-runner agent will:\n\n1. **Analyze user flow** and identify test scenarios\n2. **Generate Playwright test** using Page Object Model pattern\n3. **Run tests** across multiple browsers (Chrome, Firefox, Safari)\n4. **Capture failures** with screenshots, videos, and traces\n5. **Generate report** with results and artifacts\n6. **Identify flaky tests** and recommend fixes\n\n## Example Usage\n\n```\nUser: \u002Fe2e Test the market search and view flow\n\nAgent (e2e-runner):\n# E2E Test Generation: Market Search and View Flow\n\n## Test Scenario Identified\n\n**User Journey:** Market Search → View Results → Click Market → View Details\n\n**Test Coverage:**\n1. Navigate to markets page\n2. Perform semantic search\n3. Verify search results\n4. Click on first result\n5. Verify market details page loads\n6. Verify chart renders\n\n## Generated Test Code\n\n```typescript\n\u002F\u002F tests\u002Fe2e\u002Fmarkets\u002Fsearch-and-view.spec.ts\nimport { test, expect } from '@playwright\u002Ftest'\nimport { MarketsPage } from '..\u002F..\u002Fpages\u002FMarketsPage'\nimport { MarketDetailsPage } from '..\u002F..\u002Fpages\u002FMarketDetailsPage'\n\ntest.describe('Market Search and View Flow', () => {\n  test('user can search markets and view details', async ({ page }) => {\n    \u002F\u002F 1. Navigate to markets page\n    const marketsPage = new MarketsPage(page)\n    await marketsPage.goto()\n\n    \u002F\u002F Verify page loaded\n    await expect(page).toHaveTitle(\u002FMarkets\u002F)\n    await expect(page.locator('h1')).toContainText('Markets')\n\n    \u002F\u002F 2. Perform semantic search\n    await marketsPage.searchMarkets('election')\n\n    \u002F\u002F Wait for API response\n    await page.waitForResponse(resp =>\n      resp.url().includes('\u002Fapi\u002Fmarkets\u002Fsearch') && resp.status() === 200\n    )\n\n    \u002F\u002F 3. Verify search results\n    const marketCards = marketsPage.marketCards\n    await expect(marketCards.first()).toBeVisible()\n    const resultCount = await marketCards.count()\n    expect(resultCount).toBeGreaterThan(0)\n\n    \u002F\u002F Take screenshot of search results\n    await page.screenshot({ path: 'artifacts\u002Fsearch-results.png' })\n\n    \u002F\u002F 4. Click on first result\n    const firstMarketTitle = await marketCards.first().textContent()\n    await marketCards.first().click()\n\n    \u002F\u002F 5. Verify market details page loads\n    await expect(page).toHaveURL(\u002F\\\u002Fmarkets\\\u002F[a-z0-9-]+\u002F)\n\n    const detailsPage = new MarketDetailsPage(page)\n    await expect(detailsPage.marketName).toBeVisible()\n    await expect(detailsPage.marketDescription).toBeVisible()\n\n    \u002F\u002F 6. Verify chart renders\n    await expect(detailsPage.priceChart).toBeVisible()\n\n    \u002F\u002F Verify market name matches\n    const detailsTitle = await detailsPage.marketName.textContent()\n    expect(detailsTitle?.toLowerCase()).toContain(\n      firstMarketTitle?.toLowerCase().substring(0, 20) || ''\n    )\n\n    \u002F\u002F Take screenshot of market details\n    await page.screenshot({ path: 'artifacts\u002Fmarket-details.png' })\n  })\n\n  test('search with no results shows empty state', async ({ page }) => {\n    const marketsPage = new MarketsPage(page)\n    await marketsPage.goto()\n\n    \u002F\u002F Search for non-existent market\n    await marketsPage.searchMarkets('xyznonexistentmarket123456')\n\n    \u002F\u002F Verify empty state\n    await expect(page.locator('[data-testid=\"no-results\"]')).toBeVisible()\n    await expect(page.locator('[data-testid=\"no-results\"]')).toContainText(\n      \u002Fno.*results|no.*markets\u002Fi\n    )\n\n    const marketCount = await marketsPage.marketCards.count()\n    expect(marketCount).toBe(0)\n  })\n\n  test('can clear search and see all markets again', async ({ page }) => {\n    const marketsPage = new MarketsPage(page)\n    await marketsPage.goto()\n\n    \u002F\u002F Initial market count\n    const initialCount = await marketsPage.marketCards.count()\n\n    \u002F\u002F Perform search\n    await marketsPage.searchMarkets('trump')\n    await page.waitForLoadState('networkidle')\n\n    \u002F\u002F Verify filtered results\n    const filteredCount = await marketsPage.marketCards.count()\n    expect(filteredCount).toBeLessThan(initialCount)\n\n    \u002F\u002F Clear search\n    await marketsPage.searchInput.clear()\n    await page.waitForLoadState('networkidle')\n\n    \u002F\u002F Verify all markets shown again\n    const finalCount = await marketsPage.marketCards.count()\n    expect(finalCount).toBe(initialCount)\n  })\n})\n```\n\n## Running Tests\n\n```bash\n# Run the generated test\nnpx playwright test tests\u002Fe2e\u002Fmarkets\u002Fsearch-and-view.spec.ts\n\nRunning 3 tests using 3 workers\n\n  ✓  [chromium] › search-and-view.spec.ts:5:3 › user can search markets and view details (4.2s)\n  ✓  [chromium] › search-and-view.spec.ts:52:3 › search with no results shows empty state (1.8s)\n  ✓  [chromium] › search-and-view.spec.ts:67:3 › can clear search and see all markets again (2.9s)\n\n  3 passed (9.1s)\n\nArtifacts generated:\n- artifacts\u002Fsearch-results.png\n- artifacts\u002Fmarket-details.png\n- playwright-report\u002Findex.html\n```\n\n## Test Report\n\n```\n╔══════════════════════════════════════════════════════════════╗\n║                    E2E Test Results                          ║\n╠══════════════════════════════════════════════════════════════╣\n║ Status:     ✅ ALL TESTS PASSED                              ║\n║ Total:      3 tests                                          ║\n║ Passed:     3 (100%)                                         ║\n║ Failed:     0                                                ║\n║ Flaky:      0                                                ║\n║ Duration:   9.1s                                             ║\n╚══════════════════════════════════════════════════════════════╝\n\nArtifacts:\n? Screenshots: 2 files\n? Videos: 0 files (only on failure)\n? Traces: 0 files (only on failure)\n? HTML Report: playwright-report\u002Findex.html\n\nView report: npx playwright show-report\n```\n\n✅ E2E test suite ready for CI\u002FCD integration!\n```\n\n## Test Artifacts\n\nWhen tests run, the following artifacts are captured:\n\n**On All Tests:**\n- HTML Report with timeline and results\n- JUnit XML for CI integration\n\n**On Failure Only:**\n- Screenshot of the failing state\n- Video recording of the test\n- Trace file for debugging (step-by-step replay)\n- Network logs\n- Console logs\n\n## Viewing Artifacts\n\n```bash\n# View HTML report in browser\nnpx playwright show-report\n\n# View specific trace file\nnpx playwright show-trace artifacts\u002Ftrace-abc123.zip\n\n# Screenshots are saved in artifacts\u002F directory\nopen artifacts\u002Fsearch-results.png\n```\n\n## Flaky Test Detection\n\nIf a test fails intermittently:\n\n```\n⚠️  FLAKY TEST DETECTED: tests\u002Fe2e\u002Fmarkets\u002Ftrade.spec.ts\n\nTest passed 7\u002F10 runs (70% pass rate)\n\nCommon failure:\n\"Timeout waiting for element '[data-testid=\"confirm-btn\"]'\"\n\nRecommended fixes:\n1. Add explicit wait: await page.waitForSelector('[data-testid=\"confirm-btn\"]')\n2. Increase timeout: { timeout: 10000 }\n3. Check for race conditions in component\n4. Verify element is not hidden by animation\n\nQuarantine recommendation: Mark as test.fixme() until fixed\n```\n\n## Browser Configuration\n\nTests run on multiple browsers by default:\n- ✅ Chromium (Desktop Chrome)\n- ✅ Firefox (Desktop)\n- ✅ WebKit (Desktop Safari)\n- ✅ Mobile Chrome (optional)\n\nConfigure in `playwright.config.ts` to adjust browsers.\n\n## CI\u002FCD Integration\n\nAdd to your CI pipeline:\n\n```yaml\n# .github\u002Fworkflows\u002Fe2e.yml\n- name: Install Playwright\n  run: npx playwright install --with-deps\n\n- name: Run E2E tests\n  run: npx playwright test\n\n- name: Upload artifacts\n  if: always()\n  uses: actions\u002Fupload-artifact@v3\n  with:\n    name: playwright-report\n    path: playwright-report\u002F\n```\n\n## PMX-Specific Critical Flows\n\nFor PMX, prioritize these E2E tests:\n\n**? CRITICAL (Must Always Pass):**\n1. User can connect wallet\n2. User can browse markets\n3. User can search markets (semantic search)\n4. User can view market details\n5. User can place trade (with test funds)\n6. Market resolves correctly\n7. User can withdraw funds\n\n**? IMPORTANT:**\n1. Market creation flow\n2. User profile updates\n3. Real-time price updates\n4. Chart rendering\n5. Filter and sort markets\n6. Mobile responsive layout\n\n## Best Practices\n\n**DO:**\n- ✅ Use Page Object Model for maintainability\n- ✅ Use data-testid attributes for selectors\n- ✅ Wait for API responses, not arbitrary timeouts\n- ✅ Test critical user journeys end-to-end\n- ✅ Run tests before merging to main\n- ✅ Review artifacts when tests fail\n\n**DON'T:**\n- ❌ Use brittle selectors (CSS classes can change)\n- ❌ Test implementation details\n- ❌ Run tests against production\n- ❌ Ignore flaky tests\n- ❌ Skip artifact review on failures\n- ❌ Test every edge case with E2E (use unit tests)\n\n## Important Notes\n\n**CRITICAL for PMX:**\n- E2E tests involving real money MUST run on testnet\u002Fstaging only\n- Never run trading tests against production\n- Set `test.skip(process.env.NODE_ENV === 'production')` for financial tests\n- Use test wallets with small test funds only\n\n## Integration with Other Commands\n\n- Use `\u002Fplan` to identify critical journeys to test\n- Use `\u002Ftdd` for unit tests (faster, more granular)\n- Use `\u002Fe2e` for integration and user journey tests\n- Use `\u002Fcode-review` to verify test quality\n\n## Related Agents\n\nThis command invokes the `e2e-runner` agent provided by ECC.\n\nFor manual installs, the source file lives at:\n`agents\u002Fe2e-runner.md`\n\n## Quick Commands\n\n```bash\n# Run all E2E tests\nnpx playwright test\n\n# Run specific test file\nnpx playwright test tests\u002Fe2e\u002Fmarkets\u002Fsearch.spec.ts\n\n# Run in headed mode (see browser)\nnpx playwright test --headed\n\n# Debug test\nnpx playwright test --debug\n\n# Generate test code\nnpx playwright codegen http:\u002F\u002Flocalhost:3000\n\n# View report\nnpx playwright show-report\n```\n","# source-command-e2e\n\nUse this skill when the user asks to run the migrated source command `e2e`.\n\n## Command Template\n\n# E2E Command\n\nThis command invokes the **e2e-runner** agent to generate, maintain, and execute end-to-end tests using Playwright.\n\n## What This Command Does\n\n1. **Generate Test Journeys** - Create Playwright tests for user flows\n2. **Run E2E Tests** - Execute tests across browsers\n3. **Capture Artifacts** - Screenshots, videos, traces on failures\n4. **Upload Results** - HTML reports and JUnit XML\n5. **Identify Flaky Tests** - Quarantine unstable tests\n\n## When to Use\n\nUse `\u002Fe2e` when:\n- Testing critical user journeys (login, trading, payments)\n- Verifying multi-step flows work end-to-end\n- Testing UI interactions and navigation\n- Validating integration between frontend and backend\n- Preparing for production deployment\n\n## How It Works\n\nThe e2e-runner agent will:\n\n1. **Analyze user flow** and identify test scenarios\n2. **Generate Playwright test** using Page Object Model pattern\n3. **Run tests** across multiple browsers (Chrome, Firefox, Safari)\n4. **Capture failures** with screenshots, videos, and traces\n5. **Generate report** with results and artifacts\n6. **Identify flaky tests** and recommend fixes\n\n## Example Usage\n\n```\nUser: \u002Fe2e Test the market search and view flow\n\nAgent (e2e-runner):\n# E2E Test Generation: Market Search and View Flow\n\n## Test Scenario Identified\n\n**User Journey:** Market Search → View Results → Click Market → View Details\n\n**Test Coverage:**\n1. Navigate to markets page\n2. Perform semantic search\n3. Verify search results\n4. Click on first result\n5. Verify market details page loads\n6. Verify chart renders\n\n## Generated Test Code\n\n```typescript\n\u002F\u002F tests\u002Fe2e\u002Fmarkets\u002Fsearch-and-view.spec.ts\nimport { test, expect } from '@playwright\u002Ftest'\nimport { MarketsPage } from '..\u002F..\u002Fpages\u002FMarketsPage'\nimport { MarketDetailsPage } from '..\u002F..\u002Fpages\u002FMarketDetailsPage'\n\ntest.describe('Market Search and View Flow', () => {\n  test('user can search markets and view details', async ({ page }) => {\n    \u002F\u002F 1. Navigate to markets page\n    const marketsPage = new MarketsPage(page)\n    await marketsPage.goto()\n\n    \u002F\u002F Verify page loaded\n    await expect(page).toHaveTitle(\u002FMarkets\u002F)\n    await expect(page.locator('h1')).toContainText('Markets')\n\n    \u002F\u002F 2. Perform semantic search\n    await marketsPage.searchMarkets('election')\n\n    \u002F\u002F Wait for API response\n    await page.waitForResponse(resp =>\n      resp.url().includes('\u002Fapi\u002Fmarkets\u002Fsearch') && resp.status() === 200\n    )\n\n    \u002F\u002F 3. Verify search results\n    const marketCards = marketsPage.marketCards\n    await expect(marketCards.first()).toBeVisible()\n    const resultCount = await marketCards.count()\n    expect(resultCount).toBeGreaterThan(0)\n\n    \u002F\u002F Take screenshot of search results\n    await page.screenshot({ path: 'artifacts\u002Fsearch-results.png' })\n\n    \u002F\u002F 4. Click on first result\n    const firstMarketTitle = await marketCards.first().textContent()\n    await marketCards.first().click()\n\n    \u002F\u002F 5. Verify market details page loads\n    await expect(page).toHaveURL(\u002F\\\u002Fmarkets\\\u002F[a-z0-9-]+\u002F)\n\n    const detailsPage = new MarketDetailsPage(page)\n    await expect(detailsPage.marketName).toBeVisible()\n    await expect(detailsPage.marketDescription).toBeVisible()\n\n    \u002F\u002F 6. Verify chart renders\n    await expect(detailsPage.priceChart).toBeVisible()\n\n    \u002F\u002F Verify market name matches\n    const detailsTitle = await detailsPage.marketName.textContent()\n    expect(detailsTitle?.toLowerCase()).toContain(\n      firstMarketTitle?.toLowerCase().substring(0, 20) || ''\n    )\n\n    \u002F\u002F Take screenshot of market details\n    await page.screenshot({ path: 'artifacts\u002Fmarket-details.png' })\n  })\n\n  test('search with no results shows empty state', async ({ page }) => {\n    const marketsPage = new MarketsPage(page)\n    await marketsPage.goto()\n\n    \u002F\u002F Search for non-existent market\n    await marketsPage.searchMarkets('xyznonexistentmarket123456')\n\n    \u002F\u002F Verify empty state\n    await expect(page.locator('[data-testid=\"no-results\"]')).toBeVisible()\n    await expect(page.locator('[data-testid=\"no-results\"]')).toContainText(\n      \u002Fno.*results|no.*markets\u002Fi\n    )\n\n    const marketCount = await marketsPage.marketCards.count()\n    expect(marketCount).toBe(0)\n  })\n\n  test('can clear search and see all markets again', async ({ page }) => {\n    const marketsPage = new MarketsPage(page)\n    await marketsPage.goto()\n\n    \u002F\u002F Initial market count\n    const initialCount = await marketsPage.marketCards.count()\n\n    \u002F\u002F Perform search\n    await marketsPage.searchMarkets('trump')\n    await page.waitForLoadState('networkidle')\n\n    \u002F\u002F Verify filtered results\n    const filteredCount = await marketsPage.marketCards.count()\n    expect(filteredCount).toBeLessThan(initialCount)\n\n    \u002F\u002F Clear search\n    await marketsPage.searchInput.clear()\n    await page.waitForLoadState('networkidle')\n\n    \u002F\u002F Verify all markets shown again\n    const finalCount = await marketsPage.marketCards.count()\n    expect(finalCount).toBe(initialCount)\n  })\n})\n```\n\n## Running Tests\n\n```bash\n# Run the generated test\nnpx playwright test tests\u002Fe2e\u002Fmarkets\u002Fsearch-and-view.spec.ts\n\nRunning 3 tests using 3 workers\n\n  ✓  [chromium] › search-and-view.spec.ts:5:3 › user can search markets and view details (4.2s)\n  ✓  [chromium] › search-and-view.spec.ts:52:3 › search with no results shows empty state (1.8s)\n  ✓  [chromium] › search-and-view.spec.ts:67:3 › can clear search and see all markets again (2.9s)\n\n  3 passed (9.1s)\n\nArtifacts generated:\n- artifacts\u002Fsearch-results.png\n- artifacts\u002Fmarket-details.png\n- playwright-report\u002Findex.html\n```\n\n## Test Report\n\n```\n╔══════════════════════════════════════════════════════════════╗\n║                    E2E Test Results                          ║\n╠══════════════════════════════════════════════════════════════╣\n║ Status:     ✅ ALL TESTS PASSED                              ║\n║ Total:      3 tests                                          ║\n║ Passed:     3 (100%)                                         ║\n║ Failed:     0                                                ║\n║ Flaky:      0                                                ║\n║ Duration:   9.1s                                             ║\n╚══════════════════════════════════════════════════════════════╝\n\nArtifacts:\n? Screenshots: 2 files\n? Videos: 0 files (only on failure)\n? Traces: 0 files (only on failure)\n? HTML Report: playwright-report\u002Findex.html\n\nView report: npx playwright show-report\n```\n\n✅ E2E test suite ready for CI\u002FCD integration!\n```\n\n## Test Artifacts\n\nWhen tests run, the following artifacts are captured:\n\n**On All Tests:**\n- HTML Report with timeline and results\n- JUnit XML for CI integration\n\n**On Failure Only:**\n- Screenshot of the failing state\n- Video recording of the test\n- Trace file for debugging (step-by-step replay)\n- Network logs\n- Console logs\n\n## Viewing Artifacts\n\n```bash\n# View HTML report in browser\nnpx playwright show-report\n\n# View specific trace file\nnpx playwright show-trace artifacts\u002Ftrace-abc123.zip\n\n# Screenshots are saved in artifacts\u002F directory\nopen artifacts\u002Fsearch-results.png\n```\n\n## Flaky Test Detection\n\nIf a test fails intermittently:\n\n```\n⚠️  FLAKY TEST DETECTED: tests\u002Fe2e\u002Fmarkets\u002Ftrade.spec.ts\n\nTest passed 7\u002F10 runs (70% pass rate)\n\nCommon failure:\n\"Timeout waiting for element '[data-testid=\"confirm-btn\"]'\"\n\nRecommended fixes:\n1. Add explicit wait: await page.waitForSelector('[data-testid=\"confirm-btn\"]')\n2. Increase timeout: { timeout: 10000 }\n3. Check for race conditions in component\n4. Verify element is not hidden by animation\n\nQuarantine recommendation: Mark as test.fixme() until fixed\n```\n\n## Browser Configuration\n\nTests run on multiple browsers by default:\n- ✅ Chromium (Desktop Chrome)\n- ✅ Firefox (Desktop)\n- ✅ WebKit (Desktop Safari)\n- ✅ Mobile Chrome (optional)\n\nConfigure in `playwright.config.ts` to adjust browsers.\n\n## CI\u002FCD Integration\n\nAdd to your CI pipeline:\n\n```yaml\n# .github\u002Fworkflows\u002Fe2e.yml\n- name: Install Playwright\n  run: npx playwright install --with-deps\n\n- name: Run E2E tests\n  run: npx playwright test\n\n- name: Upload artifacts\n  if: always()\n  uses: actions\u002Fupload-artifact@v3\n  with:\n    name: playwright-report\n    path: playwright-report\u002F\n```\n\n## PMX-Specific Critical Flows\n\nFor PMX, prioritize these E2E tests:\n\n**? CRITICAL (Must Always Pass):**\n1. User can connect wallet\n2. User can browse markets\n3. User can search markets (semantic search)\n4. User can view market details\n5. User can place trade (with test funds)\n6. Market resolves correctly\n7. User can withdraw funds\n\n**? IMPORTANT:**\n1. Market creation flow\n2. User profile updates\n3. Real-time price updates\n4. Chart rendering\n5. Filter and sort markets\n6. Mobile responsive layout\n\n## Best Practices\n\n**DO:**\n- ✅ Use Page Object Model for maintainability\n- ✅ Use data-testid attributes for selectors\n- ✅ Wait for API responses, not arbitrary timeouts\n- ✅ Test critical user journeys end-to-end\n- ✅ Run tests before merging to main\n- ✅ Review artifacts when tests fail\n\n**DON'T:**\n- ❌ Use brittle selectors (CSS classes can change)\n- ❌ Test implementation details\n- ❌ Run tests against production\n- ❌ Ignore flaky tests\n- ❌ Skip artifact review on failures\n- ❌ Test every edge case with E2E (use unit tests)\n\n## Important Notes\n\n**CRITICAL for PMX:**\n- E2E tests involving real money MUST run on testnet\u002Fstaging only\n- Never run trading tests against production\n- Set `test.skip(process.env.NODE_ENV === 'production')` for financial tests\n- Use test wallets with small test funds only\n\n## Integration with Other Commands\n\n- Use `\u002Fplan` to identify critical journeys to test\n- Use `\u002Ftdd` for unit tests (faster, more granular)\n- Use `\u002Fe2e` for integration and user journey tests\n- Use `\u002Fcode-review` to verify test quality\n\n## Related Agents\n\nThis command invokes the `e2e-runner` agent provided by ECC.\n\nFor manual installs, the source file lives at:\n`agents\u002Fe2e-runner.md`\n\n## Quick Commands\n\n```bash\n# Run all E2E tests\nnpx playwright test\n\n# Run specific test file\nnpx playwright test tests\u002Fe2e\u002Fmarkets\u002Fsearch.spec.ts\n\n# Run in headed mode (see browser)\nnpx playwright test --headed\n\n# Debug test\nnpx playwright test --debug\n\n# Generate test code\nnpx playwright codegen http:\u002F\u002Flocalhost:3000\n\n# View report\nnpx playwright show-report\n```\n",{"name":5,"description":7},"main","a298c929b6cbd662e1fce54302ce520d5ceea1a5",".agents\u002Fskills\u002Fsource-command-e2e","https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain","https:\u002F\u002Fgithub.com\u002FPrekzursil","2026-11-02 14:30:57",{"source":8,"skillName":5,"commands":48,"prompt":58,"zipAvailable":59},[49,52,55],{"tool":50,"command":51},"npx","npx skills add Prekzursil\u002Fagent-skills-toolchain --skill source-command-e2e",{"tool":53,"command":54},"bunx","bunx skills add Prekzursil\u002Fagent-skills-toolchain --skill source-command-e2e",{"tool":56,"command":57},"pnpm","pnpm dlx skills add Prekzursil\u002Fagent-skills-toolchain --skill source-command-e2e","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FPrekzursil\u002Fagent-skills-toolchain\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fsource-command-e2e\u002FSKILL.md",true,[61,67,71,75,79,83,89],{"path":62,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":65,"sourceHtmlUrl":66},"scripts\u002Fframe-template.html","SCRIPT","脚本",7703,"https:\u002F\u002Fgithub.com\u002Feiei114\u002Fclaude-code-template\u002Fblob\u002Fmain\u002Fskills\u002Fbrainstorming\u002Fscripts\u002Fframe-template.html",{"path":68,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":69,"sourceHtmlUrl":70},"scripts\u002Fhelper.js",2707,"https:\u002F\u002Fgithub.com\u002Feiei114\u002Fclaude-code-template\u002Fblob\u002Fmain\u002Fskills\u002Fbrainstorming\u002Fscripts\u002Fhelper.js",{"path":72,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":73,"sourceHtmlUrl":74},"scripts\u002Fserver.cjs",11218,"https:\u002F\u002Fgithub.com\u002Feiei114\u002Fclaude-code-template\u002Fblob\u002Fmain\u002Fskills\u002Fbrainstorming\u002Fscripts\u002Fserver.cjs",{"path":76,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":77,"sourceHtmlUrl":78},"scripts\u002Fstart-server.sh",4606,"https:\u002F\u002Fgithub.com\u002Feiei114\u002Fclaude-code-template\u002Fblob\u002Fmain\u002Fskills\u002Fbrainstorming\u002Fscripts\u002Fstart-server.sh",{"path":80,"resourceType":63,"resourceTypeDesc":64,"sizeBytes":81,"sourceHtmlUrl":82},"scripts\u002Fstop-server.sh",1314,"https:\u002F\u002Fgithub.com\u002Feiei114\u002Fclaude-code-template\u002Fblob\u002Fmain\u002Fskills\u002Fbrainstorming\u002Fscripts\u002Fstop-server.sh",{"path":84,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":87,"sourceHtmlUrl":88},"spec-document-reviewer-prompt.md","REFERENCE","参考文档",1748,"https:\u002F\u002Fgithub.com\u002Feiei114\u002Fclaude-code-template\u002Fblob\u002Fmain\u002Fskills\u002Fbrainstorming\u002Fspec-document-reviewer-prompt.md",{"path":90,"resourceType":85,"resourceTypeDesc":86,"sizeBytes":91,"sourceHtmlUrl":92},"visual-companion.md",12047,"https:\u002F\u002Fgithub.com\u002Feiei114\u002Fclaude-code-template\u002Fblob\u002Fmain\u002Fskills\u002Fbrainstorming\u002Fvisual-companion.md",[94,116,145,168,182,198],{"skillNo":95,"name":96,"nameZh":6,"description":97,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":98,"categories":99,"keywords":100,"publishedAt":36},"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",[],[101,102,103,104,105,106,107,108,109,110,111,112,113,114,115],"clarify requirements","clarify","requirements","risk","options","task","prompts","goal","scanning","use","context","repo","injection","execution","file",{"skillNo":117,"name":118,"nameZh":6,"description":119,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":120,"categories":121,"keywords":125,"publishedAt":36},"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",[122],{"categoryNo":123,"categoryName":124,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[126,127,128,129,130,131,132,133,134,135,136,137,138,139,110,140,141,142,143,144],"openmm md","how","decision","pick","linux","analyze","tool","stack","open","NVIDIA","gpu","license","workflow","windows","free","molecular dynamics","local","do","MCP",{"skillNo":146,"name":147,"nameZh":6,"description":148,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":149,"categories":150,"keywords":155,"publishedAt":36},"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",[151,154],{"categoryNo":152,"categoryName":153,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},[156,157,158,159,160,161,162,163,164,165,127,166,167,28,27],"review","visual","visual review","pages","web","false","iteration","take","check","slides","ui","screenshot",{"skillNo":169,"name":170,"nameZh":6,"description":171,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":172,"categories":173,"keywords":174,"publishedAt":36},"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",[],[170,175,176,177,178,179,180,181],"setup","report","project","installation","project setup","issues","state",{"skillNo":183,"name":184,"nameZh":6,"description":185,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":186,"categories":187,"keywords":189,"publishedAt":36},"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",[188],{"categoryNo":123,"categoryName":124,"taxonomyType":21,"taxonomyTypeDesc":22},[184,190,106,191,192,193,110,194,195,196,197],"start issue","issue","ready","work on issue","user","work","work on","development",{"skillNo":199,"name":175,"nameZh":6,"description":200,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":201,"categories":202,"keywords":203,"publishedAt":36},"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",[],[175,177,142,204,179,205],"files","interactive"]