[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M718XT6P96FVR69X0EEKK2N6":3,"skill-same:01M718XT6P96FVR69X0EEKK2N6":71},{"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":44,"linkOnly":45,"markdownContent":46,"markdownBody":47,"frontMatter":48,"refName":51,"commitSha":52,"skillDirectory":53,"forksCount":54,"repositoryHtmlUrl":55,"repositoryHomepageUrl":6,"ownerHtmlUrl":56,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":57,"install":58,"resources":70},"01M718XT6P96FVR69X0EEKK2N6","test-xcode",null,"Build and test iOS apps on simulator using XcodeBuildMCP. Use after making iOS code changes, before creating a PR, or when verifying app behavior and checking for crashes on simulator.","wangrenzhu-ola\u002FGaleHarnessCodingCLI","wangrenzhu-ola","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F113888128?v=4","01M718T5C0YYVP4Z7F4SH1MCHM","王韧竹(Bamboo Wang\u002F雪落)","01M718T5CN5T80VWXEWPK25PDQ",2,"MIT","https:\u002F\u002Fgithub.com\u002Fwangrenzhu-ola\u002FGaleHarnessCodingCLI\u002Fblob\u002Fmain\u002Fplugins\u002Fgaleharness-cli\u002Fskills\u002Ftest-xcode\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,36,37,38,39,40,41,42,43],"test","test xcode","xcode","scheme","behavior","name","ios","build","changes","code","when","apps","use","xcodebuildmcp","true","default","for","pr","build and test","app","2026-11-10 10:12:30",false,"---\nname: test-xcode\ndescription: \"Build and test iOS apps on simulator using XcodeBuildMCP. Use after making iOS code changes, before creating a PR, or when verifying app behavior and checking for crashes on simulator.\"\nargument-hint: \"[scheme name or 'current' to use default]\"\ndisable-model-invocation: true\n---\n\n# Xcode Test Skill\n\nBuild, install, and test iOS apps on the simulator using XcodeBuildMCP. Captures screenshots, logs, and verifies app behavior.\n\n## Prerequisites\n\n- Xcode installed with command-line tools\n- XcodeBuildMCP MCP server connected\n- Valid Xcode project or workspace\n- At least one iOS Simulator available\n\n## Workflow\n\n### 0. Verify XcodeBuildMCP is Available\n\nCheck that the XcodeBuildMCP MCP server is connected by calling its `list_simulators` tool.\n\nMCP tool names vary by platform:\n- Claude Code: `mcp__xcodebuildmcp__list_simulators`\n- Other platforms: use the equivalent MCP tool call for the `XcodeBuildMCP` server's `list_simulators` method\n\nIf the tool is not found or errors, inform the user they need to add the XcodeBuildMCP MCP server:\n\n```\nXcodeBuildMCP not installed\n\nInstall via Homebrew:\n  brew tap getsentry\u002Fxcodebuildmcp && brew install xcodebuildmcp\n\nOr via npx (no global install needed):\n  npx -y xcodebuildmcp@latest mcp\n\nThen add \"XcodeBuildMCP\" as an MCP server in your agent configuration\nand restart your agent.\n```\n\nDo NOT proceed until XcodeBuildMCP is confirmed working.\n\n### 1. Discover Project and Scheme\n\nCall XcodeBuildMCP's `discover_projs` tool to find available projects, then `list_schemes` with the project path to get available schemes.\n\nIf an argument was provided, use that scheme name. If \"current\", use the default\u002Flast-used scheme.\n\n### 2. Boot Simulator\n\nCall `list_simulators` to find available simulators. Boot the preferred simulator (iPhone 15 Pro recommended) using `boot_simulator` with the simulator's UUID.\n\nWait for the simulator to be ready before proceeding.\n\n### 3. Build the App\n\nCall `build_ios_sim_app` with the project path and scheme name.\n\n**On failure:**\n- Capture build errors\n- Report to user with specific error details\n\n**On success:**\n- Note the built app path for installation\n- Proceed to step 4\n\n### 4. Install and Launch\n\n1. Call `install_app_on_simulator` with the built app path and simulator UUID\n2. Call `launch_app_on_simulator` with the bundle ID and simulator UUID\n3. Call `capture_sim_logs` with the simulator UUID and bundle ID to start log capture\n\n### 5. Test Key Screens\n\nFor each key screen in the app:\n\n**Take screenshot:**\nCall `take_screenshot` with the simulator UUID and a descriptive filename (e.g., `screen-home.png`).\n\n**Review screenshot for:**\n- UI elements rendered correctly\n- No error messages visible\n- Expected content displayed\n- Layout looks correct\n\n**Check logs for errors:**\nCall `get_sim_logs` with the simulator UUID. Look for:\n- Crashes\n- Exceptions\n- Error-level log messages\n- Failed network requests\n\n**Known automation limitation — SwiftUI Text links:**\nSimulated taps (via XcodeBuildMCP or any simulator automation tool) do not trigger gesture recognizers on SwiftUI `Text` views with inline `AttributedString` links. Taps report success but have no effect. This is a platform limitation — inline links are not exposed as separate elements in the accessibility tree. When a tap on a Text link has no visible effect, prompt the user to tap manually in the simulator. If the target URL is known, `xcrun simctl openurl \u003Cdevice> \u003CURL>` can open it directly as a fallback.\n\n### 6. Human Verification (When Required)\n\nPause for human input when testing touches flows that require device interaction.\n\n| Flow Type | What to Ask |\n|-----------|-------------|\n| Sign in with Apple | \"Please complete Sign in with Apple on the simulator\" |\n| Push notifications | \"Send a test push and confirm it appears\" |\n| In-app purchases | \"Complete a sandbox purchase\" |\n| Camera\u002FPhotos | \"Grant permissions and verify camera works\" |\n| Location | \"Allow location access and verify map updates\" |\n| SwiftUI Text links | \"Please tap on [element description] manually — automated taps cannot trigger inline text links\" |\n\nAsk the user (using the platform's question tool — e.g., `AskUserQuestion` in Claude Code, `request_user_input` in Codex, `ask_user` in Gemini, `ask_user` in Pi (requires the `pi-ask-user` extension) — or present numbered options and wait):\n\n```\nHuman Verification Needed\n\nThis test requires [flow type]. Please:\n1. [Action to take on simulator]\n2. [What to verify]\n\nDid it work correctly?\n1. Yes - continue testing\n2. No - describe the issue\n```\n\n### 7. Handle Failures\n\nWhen a test fails:\n\n1. **Document the failure:**\n   - Take screenshot of error state\n   - Capture console logs\n   - Note reproduction steps\n\n2. **Ask the user how to proceed:**\n\n   ```\n   Test Failed: [screen\u002Ffeature]\n\n   Issue: [description]\n   Logs: [relevant error messages]\n\n   How to proceed?\n   1. Fix now - debug, propose a fix, rebuild and retest\n   2. Skip - continue testing other screens\n   ```\n\n3. **If \"Fix now\":** investigate, propose a fix, rebuild and retest\n4. **If \"Skip\":** log as skipped, continue\n\n### 8. Test Summary\n\nAfter all tests complete, present a summary:\n\n```markdown\n## Xcode Test Results\n\n**Project:** [project name]\n**Scheme:** [scheme name]\n**Simulator:** [simulator name]\n\n### Build: Success \u002F Failed\n\n### Screens Tested: [count]\n\n| Screen | Status | Notes |\n|--------|--------|-------|\n| Launch | Pass | |\n| Home | Pass | |\n| Settings | Fail | Crash on tap |\n| Profile | Skip | Requires login |\n\n### Console Errors: [count]\n- [List any errors found]\n\n### Human Verifications: [count]\n- Sign in with Apple: Confirmed\n- Push notifications: Confirmed\n\n### Failures: [count]\n- Settings screen - crash on navigation\n\n### Result: [PASS \u002F FAIL \u002F PARTIAL]\n```\n\n### 9. Cleanup\n\nAfter testing:\n\n1. Call `stop_log_capture` with the simulator UUID\n2. Optionally call `shutdown_simulator` with the simulator UUID\n\n## Quick Usage Examples\n\n```bash\n# Test with default scheme\n\u002Ftest-xcode\n\n# Test specific scheme\n\u002Ftest-xcode MyApp-Debug\n\n# Test after making changes\n\u002Ftest-xcode current\n```\n\n## Integration with gh:review\n\nWhen reviewing PRs that touch iOS code, the `gh:review` workflow can spawn an agent to run this skill, build on the simulator, test key screens, and check for crashes.\n","# Xcode Test Skill\n\nBuild, install, and test iOS apps on the simulator using XcodeBuildMCP. Captures screenshots, logs, and verifies app behavior.\n\n## Prerequisites\n\n- Xcode installed with command-line tools\n- XcodeBuildMCP MCP server connected\n- Valid Xcode project or workspace\n- At least one iOS Simulator available\n\n## Workflow\n\n### 0. Verify XcodeBuildMCP is Available\n\nCheck that the XcodeBuildMCP MCP server is connected by calling its `list_simulators` tool.\n\nMCP tool names vary by platform:\n- Claude Code: `mcp__xcodebuildmcp__list_simulators`\n- Other platforms: use the equivalent MCP tool call for the `XcodeBuildMCP` server's `list_simulators` method\n\nIf the tool is not found or errors, inform the user they need to add the XcodeBuildMCP MCP server:\n\n```\nXcodeBuildMCP not installed\n\nInstall via Homebrew:\n  brew tap getsentry\u002Fxcodebuildmcp && brew install xcodebuildmcp\n\nOr via npx (no global install needed):\n  npx -y xcodebuildmcp@latest mcp\n\nThen add \"XcodeBuildMCP\" as an MCP server in your agent configuration\nand restart your agent.\n```\n\nDo NOT proceed until XcodeBuildMCP is confirmed working.\n\n### 1. Discover Project and Scheme\n\nCall XcodeBuildMCP's `discover_projs` tool to find available projects, then `list_schemes` with the project path to get available schemes.\n\nIf an argument was provided, use that scheme name. If \"current\", use the default\u002Flast-used scheme.\n\n### 2. Boot Simulator\n\nCall `list_simulators` to find available simulators. Boot the preferred simulator (iPhone 15 Pro recommended) using `boot_simulator` with the simulator's UUID.\n\nWait for the simulator to be ready before proceeding.\n\n### 3. Build the App\n\nCall `build_ios_sim_app` with the project path and scheme name.\n\n**On failure:**\n- Capture build errors\n- Report to user with specific error details\n\n**On success:**\n- Note the built app path for installation\n- Proceed to step 4\n\n### 4. Install and Launch\n\n1. Call `install_app_on_simulator` with the built app path and simulator UUID\n2. Call `launch_app_on_simulator` with the bundle ID and simulator UUID\n3. Call `capture_sim_logs` with the simulator UUID and bundle ID to start log capture\n\n### 5. Test Key Screens\n\nFor each key screen in the app:\n\n**Take screenshot:**\nCall `take_screenshot` with the simulator UUID and a descriptive filename (e.g., `screen-home.png`).\n\n**Review screenshot for:**\n- UI elements rendered correctly\n- No error messages visible\n- Expected content displayed\n- Layout looks correct\n\n**Check logs for errors:**\nCall `get_sim_logs` with the simulator UUID. Look for:\n- Crashes\n- Exceptions\n- Error-level log messages\n- Failed network requests\n\n**Known automation limitation — SwiftUI Text links:**\nSimulated taps (via XcodeBuildMCP or any simulator automation tool) do not trigger gesture recognizers on SwiftUI `Text` views with inline `AttributedString` links. Taps report success but have no effect. This is a platform limitation — inline links are not exposed as separate elements in the accessibility tree. When a tap on a Text link has no visible effect, prompt the user to tap manually in the simulator. If the target URL is known, `xcrun simctl openurl \u003Cdevice> \u003CURL>` can open it directly as a fallback.\n\n### 6. Human Verification (When Required)\n\nPause for human input when testing touches flows that require device interaction.\n\n| Flow Type | What to Ask |\n|-----------|-------------|\n| Sign in with Apple | \"Please complete Sign in with Apple on the simulator\" |\n| Push notifications | \"Send a test push and confirm it appears\" |\n| In-app purchases | \"Complete a sandbox purchase\" |\n| Camera\u002FPhotos | \"Grant permissions and verify camera works\" |\n| Location | \"Allow location access and verify map updates\" |\n| SwiftUI Text links | \"Please tap on [element description] manually — automated taps cannot trigger inline text links\" |\n\nAsk the user (using the platform's question tool — e.g., `AskUserQuestion` in Claude Code, `request_user_input` in Codex, `ask_user` in Gemini, `ask_user` in Pi (requires the `pi-ask-user` extension) — or present numbered options and wait):\n\n```\nHuman Verification Needed\n\nThis test requires [flow type]. Please:\n1. [Action to take on simulator]\n2. [What to verify]\n\nDid it work correctly?\n1. Yes - continue testing\n2. No - describe the issue\n```\n\n### 7. Handle Failures\n\nWhen a test fails:\n\n1. **Document the failure:**\n   - Take screenshot of error state\n   - Capture console logs\n   - Note reproduction steps\n\n2. **Ask the user how to proceed:**\n\n   ```\n   Test Failed: [screen\u002Ffeature]\n\n   Issue: [description]\n   Logs: [relevant error messages]\n\n   How to proceed?\n   1. Fix now - debug, propose a fix, rebuild and retest\n   2. Skip - continue testing other screens\n   ```\n\n3. **If \"Fix now\":** investigate, propose a fix, rebuild and retest\n4. **If \"Skip\":** log as skipped, continue\n\n### 8. Test Summary\n\nAfter all tests complete, present a summary:\n\n```markdown\n## Xcode Test Results\n\n**Project:** [project name]\n**Scheme:** [scheme name]\n**Simulator:** [simulator name]\n\n### Build: Success \u002F Failed\n\n### Screens Tested: [count]\n\n| Screen | Status | Notes |\n|--------|--------|-------|\n| Launch | Pass | |\n| Home | Pass | |\n| Settings | Fail | Crash on tap |\n| Profile | Skip | Requires login |\n\n### Console Errors: [count]\n- [List any errors found]\n\n### Human Verifications: [count]\n- Sign in with Apple: Confirmed\n- Push notifications: Confirmed\n\n### Failures: [count]\n- Settings screen - crash on navigation\n\n### Result: [PASS \u002F FAIL \u002F PARTIAL]\n```\n\n### 9. Cleanup\n\nAfter testing:\n\n1. Call `stop_log_capture` with the simulator UUID\n2. Optionally call `shutdown_simulator` with the simulator UUID\n\n## Quick Usage Examples\n\n```bash\n# Test with default scheme\n\u002Ftest-xcode\n\n# Test specific scheme\n\u002Ftest-xcode MyApp-Debug\n\n# Test after making changes\n\u002Ftest-xcode current\n```\n\n## Integration with gh:review\n\nWhen reviewing PRs that touch iOS code, the `gh:review` workflow can spawn an agent to run this skill, build on the simulator, test key screens, and check for crashes.\n",{"name":5,"description":7,"argument-hint":49,"disable-model-invocation":50},"[scheme name or 'current' to use default]",true,"main","adde77e5116dc3a65ca3385f7d19d086cd10a74c","plugins\u002Fgaleharness-cli\u002Fskills\u002Ftest-xcode",1,"https:\u002F\u002Fgithub.com\u002Fwangrenzhu-ola\u002FGaleHarnessCodingCLI","https:\u002F\u002Fgithub.com\u002Fwangrenzhu-ola","2026-06-13 09:21:37",{"source":8,"skillName":5,"commands":59,"prompt":69,"zipAvailable":50},[60,63,66],{"tool":61,"command":62},"npx","npx skills add wangrenzhu-ola\u002FGaleHarnessCodingCLI --skill test-xcode",{"tool":64,"command":65},"bunx","bunx skills add wangrenzhu-ola\u002FGaleHarnessCodingCLI --skill test-xcode",{"tool":67,"command":68},"pnpm","pnpm dlx skills add wangrenzhu-ola\u002FGaleHarnessCodingCLI --skill test-xcode","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fwangrenzhu-ola\u002FGaleHarnessCodingCLI\u002Fblob\u002Fmain\u002Fplugins\u002Fgaleharness-cli\u002Fskills\u002Ftest-xcode\u002FSKILL.md",[],[72,85,97,108,115,123],{"skillNo":73,"name":74,"nameZh":6,"description":75,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":81,"publishedAt":44},"01M718XZ8QAQPM8BS5K9M2YQTJ","skill-one","Sample skill","https:\u002F\u002Fgithub.com\u002Fwangrenzhu-ola\u002FGaleHarnessCodingCLI\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fsample-plugin\u002Fskills\u002Fskill-one\u002FSKILL.md",[78],{"categoryNo":79,"categoryName":80,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[82,83,84],"skill one","sample","sample skill",{"skillNo":86,"name":87,"nameZh":6,"description":88,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":89,"categories":90,"keywords":92,"publishedAt":44},"01M718XYEEENP5G592XVQ6MGVR","disabled-skill","A skill with model invocation disabled","https:\u002F\u002Fgithub.com\u002Fwangrenzhu-ola\u002FGaleHarnessCodingCLI\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fsample-plugin\u002Fskills\u002Fdisabled-skill\u002FSKILL.md",[91],{"categoryNo":79,"categoryName":80,"taxonomyType":21,"taxonomyTypeDesc":22},[93,94,38,95,96],"disabled skill","model","with model","with",{"skillNo":98,"name":99,"nameZh":6,"description":100,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":101,"categories":102,"keywords":104,"publishedAt":44},"01M718XXNH8T61H0EJE0BHE593","claude-only-skill","A skill restricted to Claude Code only","https:\u002F\u002Fgithub.com\u002Fwangrenzhu-ola\u002FGaleHarnessCodingCLI\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fsample-plugin\u002Fskills\u002Fclaude-only-skill\u002FSKILL.md",[103],{"categoryNo":79,"categoryName":80,"taxonomyType":21,"taxonomyTypeDesc":22},[105,106,107,33],"claude only","claude only skill","only",{"skillNo":109,"name":110,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":111,"categories":112,"keywords":113,"publishedAt":44},"01M718XWMPEPBWHC05JNGKSEF0","default-skill","https:\u002F\u002Fgithub.com\u002Fwangrenzhu-ola\u002FGaleHarnessCodingCLI\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fcustom-paths\u002Fskills\u002Fdefault-skill\u002FSKILL.md",[],[39,114],"default skill",{"skillNo":116,"name":117,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":118,"categories":119,"keywords":120,"publishedAt":44},"01M718XVZXW8CXYBNQZPJPNB6B","custom-skill","https:\u002F\u002Fgithub.com\u002Fwangrenzhu-ola\u002FGaleHarnessCodingCLI\u002Fblob\u002Fmain\u002Ftests\u002Ffixtures\u002Fcustom-paths\u002Fcustom-skills\u002Fcustom-skill\u002FSKILL.md",[],[121,122],"custom skill","custom",{"skillNo":124,"name":125,"nameZh":6,"description":126,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":131,"publishedAt":44},"01M718XRKB18J7FWKX0J3V0N6K","test-browser","Run browser tests on pages affected by current PR or branch","https:\u002F\u002Fgithub.com\u002Fwangrenzhu-ola\u002FGaleHarnessCodingCLI\u002Fblob\u002Fmain\u002Fplugins\u002Fgaleharness-cli\u002Fskills\u002Ftest-browser\u002FSKILL.md",[129,130],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":79,"categoryName":80,"taxonomyType":21,"taxonomyTypeDesc":22},[24,132,133,134,135,41,136,137,138,139,140,29],"browser","test browser","run","branch","pages","tests","number","port","affected"]