[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6FCBE1RR9C7RF1YZF2PBH9F":3,"skill-same:01M6FCBE1RR9C7RF1YZF2PBH9F":81},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":46,"linkOnly":47,"markdownContent":48,"markdownBody":49,"frontMatter":50,"refName":34,"commitSha":61,"skillDirectory":62,"forksCount":63,"repositoryHtmlUrl":64,"repositoryHomepageUrl":6,"ownerHtmlUrl":65,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":66,"install":67,"resources":80},"01M6FCBE1RR9C7RF1YZF2PBH9F","testdriver-e2e-testing",null,"Build E2E tests with TestDriver.ai, the AI code reviewer that runs every pull request in a real desktop sandbox, finds bugs, and builds regression tests","boisenoise\u002Fskills-collections","boisenoise","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F193180?v=4","01M6CDBDQK6BDN55ZMA6B6PKBM","01M6CDBDVSJ3JPTBYN26FZ7TZK",13,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-testdriver-e2e-testing\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],"e2e testing","testdriver e2e testing","e2e","testing","regression","2026","request","build e2e","ai code reviewer","critical","tests","main","community","reviewer","computer","license","pull","qa","code","e2e tests","official","sandbox","gemini","2026-11-10 10:12:30",false,"---\nname: testdriver-e2e-testing\ndescription: \"Build E2E tests with TestDriver.ai, the AI code reviewer that runs every pull request in a real desktop sandbox, finds bugs, and builds regression tests\"\ncategory: testing\nrisk: critical\nsource: community\nsource_repo: testdriverai\u002Ftestdriverai\nsource_type: official\ndate_added: \"2026-09-24\"\nauthor: testdriverai\ntags: [testing, e2e, qa, automation, computer-use]\ntools: [claude, cursor, gemini]\nlicense: \"Apache-2.0\"\nlicense_source: \"https:\u002F\u002Fgithub.com\u002Ftestdriverai\u002Ftestdriverai\u002Fblob\u002Fmain\u002FLICENSE\"\n---\n\n# TestDriver End-to-End Testing\n\n## External tool prerequisite\n\nUse only an already installed tool whose exact version, complete dependency tree and integrity have been reviewed. This skill does not bootstrap tools or activate external plugins. If the prerequisite is missing, stop that executable path and report it; continue with static analysis when possible. A separate installation task must pin immutable artifacts, stage them outside active agent directories with lifecycle scripts disabled, inspect every bundled file and executable entry point (including tests and hooks), and obtain approval before activation or host configuration changes. Do not substitute a same-named workspace script or fetch a moving branch.\n\n\n## Overview\n\n[TestDriver](https:\u002F\u002Ftestdriver.ai) is an AI code reviewer that actually runs your app. It automatically runs every pull request in a real desktop sandbox, finds bugs, and builds regression tests. Tests control browsers and native applications using natural language element descriptions and AI vision, and run as Vitest suites. This skill teaches an agent how to author, run, and debug TestDriver tests.\n\n## When to Use This Skill\n\n- Use when you need to write an end-to-end test for a web or desktop application\n- Use when automating a UI workflow that has no stable selectors (canvas, Electron, native apps)\n- Use when the user asks to verify that a page or flow works (\"check if the login page works\")\n- Use when debugging a failing TestDriver test\n\n## How It Works\n\n### Step 1: Set up the project\n\n```bash\ntestdriverai init\n```\n\nThis scaffolds `package.json`, example tests, `vitest.config.mjs`, and a GitHub Actions workflow. The user must set `TD_API_KEY` in `.env` (get a key at https:\u002F\u002Fconsole.testdriver.ai\u002Fteam).\n\n### Step 2: Write a test\n\nTests are Vitest suites using the TestDriver hooks:\n\n```javascript\nimport { describe, expect, it } from \"vitest\";\nimport { TestDriver } from \"testdriverai\u002Fvitest\u002Fhooks\";\n\ndescribe(\"Login\", () => {\n  it(\"signs in successfully\", async (context) => {\n    const testdriver = TestDriver(context);\n    await testdriver.provision.chrome({ url: \"https:\u002F\u002Fexample.com\u002Flogin\" });\n\n    const email = await testdriver.find(\"email input field\");\n    await email.click();\n    await testdriver.type(\"user@example.com\");\n\n    const submit = await testdriver.find(\"Sign In button\");\n    await submit.click();\n\n    const result = await testdriver.assert(\"the dashboard is visible\");\n    expect(result).toBeTruthy();\n  });\n});\n```\n\n### Step 3: Run and iterate\n\n```bash\nvitest run tests\u002Flogin.test.mjs\n```\n\nScreenshots are captured automatically before and after every command and saved to `.testdriver\u002Fscreenshots\u002F`, named with the source line number for easy debugging.\n\n## Examples\n\n### Example 1: Testing a desktop (Electron) app\n\n```javascript\nawait testdriver.provision.electron({ appPath: \".\u002Fdist\u002Fmy-app\" });\nconst menu = await testdriver.find(\"File menu in the menu bar\");\nawait menu.click();\n```\n\n### Example 2: Waiting for slow elements\n\n```javascript\nconst done = await testdriver.find(\"Loading complete indicator\", { timeout: 30000 });\nawait done.click();\n```\n\n## Best Practices\n\n- ✅ Use specific element descriptions (\"blue Sign In button in the header\", not \"button\")\n- ✅ Set both `testTimeout` and `hookTimeout` to 900000 in `vitest.config.mjs`\n- ✅ Add `assert()` calls for verifiable pass\u002Ffail conditions\n- ✅ Always `await` every TestDriver call\n- ❌ Do not use `npx vitest`; run `vitest run` directly\n- ❌ Do not rely on CSS selectors; TestDriver locates elements visually\n\n## Limitations\n\n- Requires a TestDriver API key (`TD_API_KEY`) and network access to provision sandboxes.\n- Only works with Vitest as the test runner.\n- This skill does not replace environment-specific validation, testing, or expert review.\n\n## Security & Safety Notes\n\nRemote sandbox execution and automatic screenshots can transmit application data and consume account quota. Use synthetic accounts, verify allowed app\u002Fnetwork destinations and retention, and avoid capturing real secrets or personal records. The installed tool’s actual local\u002Fremote execution mode must be confirmed rather than inferred from this guide; initialization workflows can change CI and require source review.\n\n- `testdriverai init` writes project files to the current directory; run it only in a project you intend to modify.\n- The `TD_API_KEY` credential belongs in `.env` (gitignored by the scaffold). Never commit it.\n- Tests execute inside an isolated remote sandbox, not on the local machine.\n\n## Common Pitfalls\n\n- **Problem:** Cleanup hooks fail with a 10s timeout.\n  **Solution:** Set `hookTimeout: 900000` in `vitest.config.mjs`; sandbox teardown and recording uploads take longer than Vitest's default.\n- **Problem:** Scrolling does nothing.\n  **Solution:** An input field has focus. Press Escape or click the page background first, then scroll.\n\n## Related Skills\n\n- `@webapp-testing` - Playwright-based alternative for local web apps with stable DOM selectors\n","# TestDriver End-to-End Testing\n\n## External tool prerequisite\n\nUse only an already installed tool whose exact version, complete dependency tree and integrity have been reviewed. This skill does not bootstrap tools or activate external plugins. If the prerequisite is missing, stop that executable path and report it; continue with static analysis when possible. A separate installation task must pin immutable artifacts, stage them outside active agent directories with lifecycle scripts disabled, inspect every bundled file and executable entry point (including tests and hooks), and obtain approval before activation or host configuration changes. Do not substitute a same-named workspace script or fetch a moving branch.\n\n\n## Overview\n\n[TestDriver](https:\u002F\u002Ftestdriver.ai) is an AI code reviewer that actually runs your app. It automatically runs every pull request in a real desktop sandbox, finds bugs, and builds regression tests. Tests control browsers and native applications using natural language element descriptions and AI vision, and run as Vitest suites. This skill teaches an agent how to author, run, and debug TestDriver tests.\n\n## When to Use This Skill\n\n- Use when you need to write an end-to-end test for a web or desktop application\n- Use when automating a UI workflow that has no stable selectors (canvas, Electron, native apps)\n- Use when the user asks to verify that a page or flow works (\"check if the login page works\")\n- Use when debugging a failing TestDriver test\n\n## How It Works\n\n### Step 1: Set up the project\n\n```bash\ntestdriverai init\n```\n\nThis scaffolds `package.json`, example tests, `vitest.config.mjs`, and a GitHub Actions workflow. The user must set `TD_API_KEY` in `.env` (get a key at https:\u002F\u002Fconsole.testdriver.ai\u002Fteam).\n\n### Step 2: Write a test\n\nTests are Vitest suites using the TestDriver hooks:\n\n```javascript\nimport { describe, expect, it } from \"vitest\";\nimport { TestDriver } from \"testdriverai\u002Fvitest\u002Fhooks\";\n\ndescribe(\"Login\", () => {\n  it(\"signs in successfully\", async (context) => {\n    const testdriver = TestDriver(context);\n    await testdriver.provision.chrome({ url: \"https:\u002F\u002Fexample.com\u002Flogin\" });\n\n    const email = await testdriver.find(\"email input field\");\n    await email.click();\n    await testdriver.type(\"user@example.com\");\n\n    const submit = await testdriver.find(\"Sign In button\");\n    await submit.click();\n\n    const result = await testdriver.assert(\"the dashboard is visible\");\n    expect(result).toBeTruthy();\n  });\n});\n```\n\n### Step 3: Run and iterate\n\n```bash\nvitest run tests\u002Flogin.test.mjs\n```\n\nScreenshots are captured automatically before and after every command and saved to `.testdriver\u002Fscreenshots\u002F`, named with the source line number for easy debugging.\n\n## Examples\n\n### Example 1: Testing a desktop (Electron) app\n\n```javascript\nawait testdriver.provision.electron({ appPath: \".\u002Fdist\u002Fmy-app\" });\nconst menu = await testdriver.find(\"File menu in the menu bar\");\nawait menu.click();\n```\n\n### Example 2: Waiting for slow elements\n\n```javascript\nconst done = await testdriver.find(\"Loading complete indicator\", { timeout: 30000 });\nawait done.click();\n```\n\n## Best Practices\n\n- ✅ Use specific element descriptions (\"blue Sign In button in the header\", not \"button\")\n- ✅ Set both `testTimeout` and `hookTimeout` to 900000 in `vitest.config.mjs`\n- ✅ Add `assert()` calls for verifiable pass\u002Ffail conditions\n- ✅ Always `await` every TestDriver call\n- ❌ Do not use `npx vitest`; run `vitest run` directly\n- ❌ Do not rely on CSS selectors; TestDriver locates elements visually\n\n## Limitations\n\n- Requires a TestDriver API key (`TD_API_KEY`) and network access to provision sandboxes.\n- Only works with Vitest as the test runner.\n- This skill does not replace environment-specific validation, testing, or expert review.\n\n## Security & Safety Notes\n\nRemote sandbox execution and automatic screenshots can transmit application data and consume account quota. Use synthetic accounts, verify allowed app\u002Fnetwork destinations and retention, and avoid capturing real secrets or personal records. The installed tool’s actual local\u002Fremote execution mode must be confirmed rather than inferred from this guide; initialization workflows can change CI and require source review.\n\n- `testdriverai init` writes project files to the current directory; run it only in a project you intend to modify.\n- The `TD_API_KEY` credential belongs in `.env` (gitignored by the scaffold). Never commit it.\n- Tests execute inside an isolated remote sandbox, not on the local machine.\n\n## Common Pitfalls\n\n- **Problem:** Cleanup hooks fail with a 10s timeout.\n  **Solution:** Set `hookTimeout: 900000` in `vitest.config.mjs`; sandbox teardown and recording uploads take longer than Vitest's default.\n- **Problem:** Scrolling does nothing.\n  **Solution:** An input field has focus. Press Escape or click the page background first, then scroll.\n\n## Related Skills\n\n- `@webapp-testing` - Playwright-based alternative for local web apps with stable DOM selectors\n",{"name":5,"risk":32,"tags":51,"tools":54,"author":57,"source":35,"license":14,"category":26,"date_added":58,"description":7,"source_repo":59,"source_type":43,"license_source":60},[26,25,40,52,53],"automation","computer-use",[55,56,45],"claude","cursor","testdriverai","2026-09-24","testdriverai\u002Ftestdriverai","https:\u002F\u002Fgithub.com\u002Ftestdriverai\u002Ftestdriverai\u002Fblob\u002Fmain\u002FLICENSE","7bf2279c8a65758319526a721d5c4b75683aec9c","skills\u002Fantigravity-testdriver-e2e-testing",3,"https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections","https:\u002F\u002Fgithub.com\u002Fboisenoise","2026-11-14 14:18:11",{"source":8,"skillName":5,"commands":68,"prompt":78,"zipAvailable":79},[69,72,75],{"tool":70,"command":71},"npx","npx skills add boisenoise\u002Fskills-collections --skill testdriver-e2e-testing",{"tool":73,"command":74},"bunx","bunx skills add boisenoise\u002Fskills-collections --skill testdriver-e2e-testing",{"tool":76,"command":77},"pnpm","pnpm dlx skills add boisenoise\u002Fskills-collections --skill testdriver-e2e-testing","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-testdriver-e2e-testing\u002FSKILL.md",true,[],[82,108,133,159,178,201],{"skillNo":83,"name":84,"nameZh":6,"description":85,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":86,"sourceHtmlUrl":87,"categories":88,"keywords":89,"publishedAt":46},"01M6WNH92BHVFXHGPDZCPJ0AG0","web-access","Use Treg for public web or platform data only when existing search, browser and connected tools cannot cover the task, with explicit cost and data boundaries.","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-web-access\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-web-access\u002FSKILL.md",[],[90,91,92,43,93,94,95,96,97,98,99,100,101,102,103,32,104,105,106,107,28],"web","access","web access","development","browser","search","data","Tools","read","fetch","only","youtube","free tools","platform","free","cover","normal","when",{"skillNo":109,"name":110,"nameZh":6,"description":111,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":112,"sourceHtmlUrl":113,"categories":114,"keywords":118,"publishedAt":46},"01M6WNF9XAYAB2CZDDJBAKNM93","treg","Use the Treg CLI or MCP catalog to discover, price and call authorized external tools with team-scoped credentials and a user-approved budget.","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-treg\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-treg\u002FSKILL.md",[115],{"categoryNo":116,"categoryName":117,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[110,119,120,121,43,93,38,97,122,123,124,125,126,127,128,32,129,130,131,132,28],"MCP","cli","github","Budget","credentials","team","catalog","use","call","discover","external tools","with","scoped","blob",{"skillNo":134,"name":135,"nameZh":6,"description":136,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":137,"sourceHtmlUrl":138,"categories":139,"keywords":145,"publishedAt":46},"01M6WN93MEAZ4E41DYAHJRPHQT","recruit","Turn a job description into an evidence-linked candidate shortlist through Treg, with job-related ranking and optional authorized business contact enrichment.","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-recruit\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-recruit\u002FSKILL.md",[140],{"categoryNo":141,"categoryName":142,"taxonomyType":143,"taxonomyTypeDesc":144},"01JBSEEDCAT000000000000038","人力资源","PROFESSION","适用职业",[135,121,43,38,146,147,148,149,150,151,32,152,153,154,130,155,156,157,158,132,110,28],"https","email","enrichment","business","evidence","phone","ranking","post","job description","for","person","candidate","reason",{"skillNo":160,"name":161,"nameZh":6,"description":162,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":163,"sourceHtmlUrl":164,"categories":165,"keywords":166,"publishedAt":46},"01M6WN8R5RXSMHM9B4D9FAFX42","rea-growth","Analyze a company’s public growth and content through Treg, distinguish observations from hypotheses, and produce an evidence-linked playbook within an approved budget.","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-rea-growth\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-rea-growth\u002FSKILL.md",[],[167,168,169,121,43,38,170,171,146,172,122,173,174,175,150,32,176,177,132,110,28],"growth","rea","rea growth","produce","content","playbook","marketing","analyze","public","observations","company",{"skillNo":179,"name":180,"nameZh":6,"description":181,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":182,"sourceHtmlUrl":183,"categories":184,"keywords":185,"publishedAt":46},"01M6WN2EVE3RQRGWAKBT4S7YT2","make-ugc","Create original AI UGC-style product videos through Treg: research hooks, approve a licensed presenter and voice, generate clips, add captions and report costs.","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-make-ugc\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-make-ugc\u002FSKILL.md",[],[186,187,121,188,43,189,38,190,191,192,193,194,32,195,196,197,198,199,200,132],"make","make ugc","research","create","Video","Captions","ads","short","hooks","head","style","niche","trending","talking-head","approve",{"skillNo":202,"name":203,"nameZh":6,"description":204,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":205,"sourceHtmlUrl":206,"categories":207,"keywords":208,"publishedAt":46},"01M6WN10ARAA63Y8K1YNGXJ2RM","lead-signals","Find and qualify public buying signals through Treg, rank fitting business accounts and optionally enrich authorized business contact information.","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-lead-signals\u002FLICENSE","https:\u002F\u002Fgithub.com\u002Fboisenoise\u002Fskills-collections\u002Fblob\u002Fmain\u002Fskills\u002Fantigravity-lead-signals\u002FSKILL.md",[],[209,210,211,121,43,38,212,213,149,214,215,32,216,217,218,219,220,221,222,132],"signals","lead","lead signals","how","find","ready","as","how to","qualify","people","information","enrich","changes","funding"]