{"id":"b9eac5f4-dfb1-4367-8045-a6e3e1c57bc5","shortId":"qm42rr","kind":"skill","title":"smoke-test","tagline":"Launch the app and hands-on verify that it works by interacting with it. Use when the user asks to \"smoke test\", \"test it manually\", \"verify it works\", \"try it out\", \"run a smoke test\", \"check it in the browser\", or \"does it actually work\". Not for unit/integration tests.","description":"# Smoke Test\n\nLaunch the app and hands-on verify that it works. Not unit/integration tests.\n\n## Step 1: Determine Scope\n\nResolve scope using the first match:\n\n1. **User-specified** — the user says what to test. Use that.\n2. **PR** — a PR URL or number is provided. Fetch the PR details (title, description, changed files, comments) and read the changed code.\n3. **Conversation context** — prior conversation contains recent work (a feature, fix, or refactor). Extract what changed, where it lives, and expected behavior.\n4. **App-level discovery** — fresh context with no prior work. Examine the project (entry points, routes, commands, README) to identify the app's core user-facing flows. Design tests that verify the app launches and its primary functionality works end-to-end.\n\n## Step 2: Determine Testing Approach\n\nAlways check for project-specific testing skills or MCP tools first. Use the fallbacks below when nothing project-specific is available:\n\n- **Web app** → `/agent-browser` skill if available, otherwise `claude-in-chrome` MCP\n- **UI/native app** → `computer-use` MCP\n- **CLI tool** → direct terminal execution\n- **Library with no entry point** → report that smoke testing is not applicable and stop\n\n## Step 3: Plan Smoke Tests\n\nDesign targeted smoke tests based on the scope. Each test should:\n\n1. Exercise a specific flow from the determined scope\n2. Verify the happy path works end-to-end\n3. Check one obvious edge case if applicable\n\nOutput the plan as text:\n\n```\nSmoke Test Plan:\n1. [Test description] — verifies [what]\n2. [Test description] — verifies [what]\n3. [Test description] — verifies [what]\n\nApproach: [agent-browser / claude-in-chrome / computer-use / terminal]\nDev server command: [command]\n```\n\n## Step 4: Execute\n\nIf a project-specific testing skill or MCP tool was identified in Step 2, use that. The paths below are fallbacks.\n\n### Web App Path\n\nStart the dev server if not already running. Wait for it to be ready. If `/agent-browser` is available, run the `/agent-browser` skill. Otherwise, use `claude-in-chrome` MCP to interact with the app.\n\nCore verification loop per test:\n\n1. Navigate to the relevant page/route\n2. Snapshot and verify expected UI elements exist\n3. Interact (fill forms, click buttons, navigate)\n4. Re-snapshot and verify the expected outcome\n5. Record pass/fail\n\nClose the browser session and stop the dev server when done.\n\n### UI/Native App Path\n\nLaunch the app. Use `computer-use` MCP to interact with the UI.\n\nCore verification loop per test:\n\n1. Capture the UI state\n2. Interact with the relevant controls\n3. Re-capture and verify the expected outcome\n4. Record pass/fail\n\n### CLI Path\n\nRun commands directly.\n\nCore verification loop per test:\n\n1. Run the command with expected inputs\n2. Check stdout/stderr for expected output\n3. Verify side effects (files created, data changed)\n4. Record pass/fail\n\n## Step 5: Report\n\nPresent a summary:\n\n```\nSmoke Test Results:\n- [PASS] Test 1: description\n- [FAIL] Test 2: description — [what went wrong]\n- [PASS] Test 3: description\n\nOverall: X/Y passed\n```\n\nIf any test failed, include the relevant snapshot, screenshot, or output showing the failure.\n\nThen use the TaskList tool and proceed to any remaining task.\n\n## Rules\n\n- Always clean up: close browser sessions, stop dev servers started by this skill.\n- Never modify code. This skill is read-only verification. If a test fails, report the failure — do not attempt to fix it.\n- If the dev server fails to start, report the error and stop.\n- Keep tests focused on the determined scope.\n- Use the Monitor tool to tail app logs for errors or warnings while verifying, so backend failures surface alongside UI checks.\n- After the last UI interaction, perform one additional log read or status check before reporting. Pending `Monitor` events that arrive after the agent emits final text are dropped, so the extra action gives them time to land. Matters most when this skill runs inside a subagent (e.g., from `/polish-code`).\n- To diagnose failures, run the `/investigate` skill on the smoke test report.","tags":["smoke","test","turbo","tobihagemann","agent-skills","claude-code","claude-skills","developer-tools","skills"],"capabilities":["skill","source-tobihagemann","skill-smoke-test","topic-agent-skills","topic-claude-code","topic-claude-skills","topic-developer-tools","topic-skills"],"categories":["turbo"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/tobihagemann/turbo/smoke-test","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add tobihagemann/turbo","source_repo":"https://github.com/tobihagemann/turbo","install_from":"skills.sh"}},"qualityScore":"0.590","qualityRationale":"deterministic score 0.59 from registry signals: · indexed on github topic:agent-skills · 280 github stars · SKILL.md body (4,065 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-04-22T00:54:12.357Z","embedding":null,"createdAt":"2026-04-18T22:04:08.268Z","updatedAt":"2026-04-22T00:54:12.357Z","lastSeenAt":"2026-04-22T00:54:12.357Z","tsv":"'/agent-browser':212,372,377 '/investigate':701 '/polish-code':695 '1':71,80,263,298,396,461,494,529 '2':92,183,272,303,346,402,466,501,533 '3':115,248,282,308,410,472,507,540 '4':137,330,417,481,515 '5':426,519 'action':678 'actual':48 'addit':654 'agent':315,669 'agent-brows':314 'alongsid':644 'alreadi':363 'alway':187,571 'app':6,58,139,159,171,211,223,355,390,441,445,632 'app-level':138 'applic':244,289 'approach':186,313 'arriv':666 'ask':23 'attempt':603 'avail':209,215,374 'backend':641 'base':256 'behavior':136 'browser':44,316,431,575 'button':415 'captur':462,475 'case':287 'chang':107,113,130,514 'check':40,188,283,502,646,659 'chrome':220,320,384 'claud':218,318,382 'claude-in-chrom':217,317,381 'clean':572 'cli':228,484 'click':414 'close':429,574 'code':114,586 'command':154,327,328,487,497 'comment':109 'comput':225,322,448 'computer-us':224,321,447 'contain':120 'context':117,143 'control':471 'convers':116,119 'core':161,391,456,489 'creat':512 'data':513 'descript':106,300,305,310,530,534,541 'design':166,252 'detail':104 'determin':72,184,270,624 'dev':325,359,436,578,609 'diagnos':697 'direct':230,488 'discoveri':141 'done':439 'drop':674 'e.g':693 'edg':286 'effect':510 'element':408 'emit':670 'end':179,181,279,281 'end-to-end':178,278 'entri':151,236 'error':616,635 'event':664 'examin':148 'execut':232,331 'exercis':264 'exist':409 'expect':135,406,424,479,499,505 'extra':677 'extract':128 'face':164 'fail':531,548,597,611 'failur':558,600,642,698 'fallback':201,353 'featur':124 'fetch':101 'file':108,511 'fill':412 'final':671 'first':78,198 'fix':125,605 'flow':165,267 'focus':621 'form':413 'fresh':142 'function':176 'give':679 'hand':9,61 'hands-on':8,60 'happi':275 'identifi':157,343 'includ':549 'input':500 'insid':690 'interact':16,387,411,452,467,651 'keep':619 'land':683 'last':649 'launch':4,56,172,443 'level':140 'librari':233 'live':133 'log':633,655 'loop':393,458,491 'manual':29 'match':79 'matter':684 'mcp':196,221,227,340,385,450 'modifi':585 'monitor':628,663 'navig':397,416 'never':584 'noth':204 'number':98 'obvious':285 'one':284,653 'otherwis':216,379 'outcom':425,480 'output':290,506,555 'overal':542 'page/route':401 'pass':527,538,544 'pass/fail':428,483,517 'path':276,350,356,442,485 'pend':662 'per':394,459,492 'perform':652 'plan':249,292,297 'point':152,237 'pr':93,95,103 'present':521 'primari':175 'prior':118,146 'proceed':565 'project':150,191,206,335 'project-specif':190,205,334 'provid':100 're':419,474 're-captur':473 're-snapshot':418 'read':111,591,656 'read-on':590 'readi':370 'readm':155 'recent':121 'record':427,482,516 'refactor':127 'relev':400,470,551 'remain':568 'report':238,520,598,614,661,707 'resolv':74 'result':526 'rout':153 'rule':570 'run':36,364,375,486,495,689,699 'say':86 'scope':73,75,259,271,625 'screenshot':553 'server':326,360,437,579,610 'session':432,576 'show':556 'side':509 'skill':194,213,338,378,583,588,688,702 'skill-smoke-test' 'smoke':2,25,38,54,240,250,254,295,524,705 'smoke-test':1 'snapshot':403,420,552 'source-tobihagemann' 'specif':192,207,266,336 'specifi':83 'start':357,580,613 'state':465 'status':658 'stdout/stderr':503 'step':70,182,247,329,345,518 'stop':246,434,577,618 'subag':692 'summari':523 'surfac':643 'tail':631 'target':253 'task':569 'tasklist':562 'termin':231,324 'test':3,26,27,39,53,55,69,89,167,185,193,241,251,255,261,296,299,304,309,337,395,460,493,525,528,532,539,547,596,620,706 'text':294,672 'time':681 'titl':105 'tool':197,229,341,563,629 'topic-agent-skills' 'topic-claude-code' 'topic-claude-skills' 'topic-developer-tools' 'topic-skills' 'tri':33 'ui':407,455,464,645,650 'ui/native':222,440 'unit/integration':52,68 'url':96 'use':19,76,90,199,226,323,347,380,446,449,560,626 'user':22,82,85,163 'user-fac':162 'user-specifi':81 'verif':392,457,490,593 'verifi':11,30,63,169,273,301,306,311,405,422,477,508,639 'wait':365 'warn':637 'web':210,354 'went':536 'work':14,32,49,66,122,147,177,277 'wrong':537 'x/y':543","prices":[{"id":"1823d8f6-b02d-4fa5-af44-6466bb18d1d8","listingId":"b9eac5f4-dfb1-4367-8045-a6e3e1c57bc5","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"tobihagemann","category":"turbo","install_from":"skills.sh"},"createdAt":"2026-04-18T22:04:08.268Z"}],"sources":[{"listingId":"b9eac5f4-dfb1-4367-8045-a6e3e1c57bc5","source":"github","sourceId":"tobihagemann/turbo/smoke-test","sourceUrl":"https://github.com/tobihagemann/turbo/tree/main/skills/smoke-test","isPrimary":false,"firstSeenAt":"2026-04-18T22:04:08.268Z","lastSeenAt":"2026-04-22T00:54:12.357Z"}],"details":{"listingId":"b9eac5f4-dfb1-4367-8045-a6e3e1c57bc5","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"tobihagemann","slug":"smoke-test","github":{"repo":"tobihagemann/turbo","stars":280,"topics":["agent-skills","claude-code","claude-skills","developer-tools","skills"],"license":"mit","html_url":"https://github.com/tobihagemann/turbo","pushed_at":"2026-04-21T12:22:12Z","description":"A composable dev process for Claude Code, packaged as modular skills.","skill_md_sha":"cc43f8d86c5d897f2c27d85af2f37505f834b9e2","skill_md_path":"skills/smoke-test/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/tobihagemann/turbo/tree/main/skills/smoke-test"},"layout":"multi","source":"github","category":"turbo","frontmatter":{"name":"smoke-test","description":"Launch the app and hands-on verify that it works by interacting with it. Use when the user asks to \"smoke test\", \"test it manually\", \"verify it works\", \"try it out\", \"run a smoke test\", \"check it in the browser\", or \"does it actually work\". Not for unit/integration tests."},"skills_sh_url":"https://skills.sh/tobihagemann/turbo/smoke-test"},"updatedAt":"2026-04-22T00:54:12.357Z"}}