[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6KCJ3AQQJWCCTC2JSEGEBR8":3,"skill-same:01M6KCJ3AQQJWCCTC2JSEGEBR8":85},{"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":28,"publishedAt":49,"linkOnly":50,"markdownContent":51,"markdownBody":52,"frontMatter":53,"refName":62,"commitSha":63,"skillDirectory":64,"forksCount":65,"repositoryHtmlUrl":66,"repositoryHomepageUrl":6,"ownerHtmlUrl":67,"ownerBlogUrl":68,"ownerDescription":69,"updatedAt":70,"install":71,"resources":84},"01M6KCJ3AQQJWCCTC2JSEGEBR8","mobiai-mobile-tdd",null,"You MUST use this before writing any implementation code for a mobile feature, bug fix, refactor, or behavior change. Tests come before implementation — no exceptions.","ArisGuimera\u002FMobiAI-Core","ArisGuimera","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F16361358?v=4","01M6KC5MVGRKDA14DWT98445V9","AristiDevs","01M6KC5MZKRFFHFFD340B21YN3",492,"MIT","https:\u002F\u002Fgithub.com\u002FArisGuimera\u002FMobiAI-Core\u002Fblob\u002Fmain\u002Fskills\u002Fcore\u002Fskills\u002Fmobiai-mobile-tdd\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000007","代码审查","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":26,"taxonomyTypeDesc":27},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48],"mobiai mobile tdd","tdd","mobile","use","for","you","native","feature","tests","react-native","bug","writing","fix","flutter","refactor","code","copilot","change","react","gemini","2026-11-10 10:12:30",false,"---\nname: mobiai-mobile-tdd\ndescription: \"You MUST use this before writing any implementation code for a mobile feature, bug fix, refactor, or behavior change. Tests come before implementation — no exceptions.\"\nlicense: MIT\ncompatibility: [claude-code, cursor, copilot, codex, gemini]\nplatforms: [android, ios, kmp, flutter, react-native]\n---\n\n# Mobile Test-Driven Development (TDD)\n\n\u003CHARD-GATE>\nDo NOT write any production code for a mobile feature, fix, refactor, or behavior change until a failing test exists and you have observed it fail. This applies regardless of perceived simplicity or urgency.\n\u003C\u002FHARD-GATE>\n\n## Overview\n\nWrite the test first. Watch it fail. Write minimal code to pass.\n\n**Core principle:** If you didn't watch the test fail, you don't know if it tests the right thing.\n\n**Violating the letter of the rules is violating the spirit of the rules.**\n\n## When to Use\n\n**Always:**\n- New features\n- Bug fixes\n- Refactoring\n- Behavior changes\n\nThinking \"skip TDD just this once\"? Stop. That's rationalization.\n\n## The Iron Law\n\n```\nNO PRODUCTION CODE WITHOUT A FAILING TEST FIRST\n```\n\nWrite code before the test? Delete it. Start over.\n\n**No exceptions:**\n- Don't keep it as \"reference\"\n- Don't \"adapt\" it while writing tests\n- Delete means delete\n\n## Red-Green-Refactor\n\n```dot\ndigraph tdd_cycle {\n    rankdir=LR;\n    red [label=\"RED\\nWrite failing test\", shape=box, style=filled, fillcolor=\"#ffcccc\"];\n    verify_red [label=\"Verify fails\\ncorrectly\", shape=diamond];\n    green [label=\"GREEN\\nMinimal code\", shape=box, style=filled, fillcolor=\"#ccffcc\"];\n    verify_green [label=\"Verify passes\\nAll green\", shape=diamond];\n    refactor [label=\"REFACTOR\\nClean up\", shape=box, style=filled, fillcolor=\"#ccccff\"];\n    next [label=\"Next\", shape=ellipse];\n\n    red -> verify_red;\n    verify_red -> green [label=\"yes\"];\n    verify_red -> red [label=\"wrong\\nfailure\"];\n    green -> verify_green;\n    verify_green -> refactor [label=\"yes\"];\n    verify_green -> green [label=\"no\"];\n    refactor -> verify_green [label=\"stay\\ngreen\"];\n    verify_green -> next;\n    next -> red;\n}\n```\n\n### RED - Write Failing Test\n\nWrite one minimal test showing what should happen.\n\n**Android (Kotlin):**\n```kotlin\n@Test\nfun `should emit error state when API returns failure`() {\n    coEvery { repository.fetchData() } returns Result.failure(IOException())\n    viewModel.loadData()\n    assertEquals(UiState.Error(\"Failed to load\"), viewModel.state.value)\n}\n```\nRun: `.\u002Fgradlew testDebugUnitTest --tests \"com.example.MyViewModelTest\"`\n\n**iOS (Swift):**\n```swift\nfunc testShouldEmitErrorStateWhenAPIFails() throws {\n    let mockService = MockAPIService()\n    mockService.shouldFail = true\n    let viewModel = MyViewModel(service: mockService)\n    viewModel.loadData()\n    XCTAssertEqual(viewModel.state, .error(\"Failed to load\"))\n}\n```\nRun: `xcodebuild test -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone 16' -only-testing:MyAppTests\u002FMyViewModelTests`\n\n**Flutter (Dart):**\n```dart\ntest('should emit error state when API returns failure', () {\n  final mockRepo = MockRepository();\n  when(mockRepo.fetchData()).thenThrow(Exception('Network error'));\n  final viewModel = MyViewModel(mockRepo);\n  viewModel.loadData();\n  expect(viewModel.state, equals(UiState.error('Failed to load')));\n});\n```\nRun: `flutter test test\u002Fmy_viewmodel_test.dart`\n\n**React Native (TypeScript):**\n```typescript\ntest('should emit error state when API returns failure', () => {\n  const mockFetch = jest.fn().mockRejectedValue(new Error('Network error'));\n  const viewModel = createViewModel({ fetchData: mockFetch });\n  viewModel.loadData();\n  expect(viewModel.state).toEqual({ type: 'error', message: 'Failed to load' });\n});\n```\nRun: `npx jest __tests__\u002FMyViewModel.test.ts`\n\n**Requirements:**\n- One behavior\n- Clear name\n- Real code (no mocks unless unavoidable)\n\n### Verify RED - Watch It Fail\n\n**MANDATORY. Never skip.**\n\nConfirm:\n- Test fails (not errors)\n- Failure message is expected\n- Fails because feature missing (not typos)\n\n**Test passes?** You're testing existing behavior. Fix test.\n\n### GREEN - Minimal Code\n\nWrite simplest code to pass the test. Don't add features, refactor other code, or \"improve\" beyond the test.\n\n### Verify GREEN - Watch It Pass\n\n**MANDATORY.**\n\nRun platform-specific test command:\n\n| Platform | Run all tests |\n|----------|--------------|\n| **Android** | `.\u002Fgradlew testDebugUnitTest` |\n| **iOS** | `xcodebuild test -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone 16'` |\n| **Flutter** | `flutter test` |\n| **React Native** | `npx jest` |\n| **KMP** | `.\u002Fgradlew allTests` |\n\nConfirm:\n- Test passes\n- Other tests still pass\n- Output pristine (no errors, warnings)\n\n### REFACTOR - Clean Up\n\nAfter green only:\n- Remove duplication\n- Improve names\n- Extract helpers\n\nKeep tests green. Don't add behavior.\n\n### Repeat\n\nNext failing test for next feature.\n\n## Why Order Matters\n\n**\"I'll write tests after to verify it works\"**\n\nTests written after code pass immediately. Passing immediately proves nothing. Test-first forces you to see the test fail, proving it actually tests something.\n\n**\"I already manually tested all the edge cases\"**\n\nManual testing is ad-hoc. No record of what you tested. Can't re-run when code changes. Automated tests are systematic.\n\n**\"Deleting X hours of work is wasteful\"**\n\nSunk cost fallacy. The time is already gone. Working code without real tests is technical debt.\n\n## Common Rationalizations\n\n| Excuse | Reality |\n|--------|---------|\n| \"Too simple to test\" | Simple code breaks. Test takes 30 seconds. |\n| \"I'll test after\" | Tests passing immediately prove nothing. |\n| \"The build takes too long for TDD\" | Run only the specific test, not the full build. All frameworks support single-test execution. |\n| \"I can't test this — it depends on the framework\" | Extract logic into testable units. ViewModel\u002FUseCase\u002FRepository shouldn't depend on the framework. |\n| \"Need to explore first\" | Fine. Throw away exploration, start with TDD. |\n| \"Test hard = design unclear\" | Listen to test. Hard to test = hard to use. |\n\n## Red Flags - STOP and Start Over\n\n- Code before test\n- Test after implementation\n- Test passes immediately\n- Can't explain why test failed\n- Rationalizing \"just this once\"\n- \"Keep as reference\" or \"adapt existing code\"\n\n**All of these mean: Delete code. Start over with TDD.**\n\n## Example: Bug Fix\n\n**Bug:** Empty email accepted\n\n**RED**\n```kotlin\n@Test\nfun `rejects empty email`() {\n    val result = viewModel.submitForm(email = \"\")\n    assertEquals(\"Email required\", result.error)\n}\n```\n\n**Verify RED:** FAIL with \"expected 'Email required', got null\"\n\n**GREEN**\n```kotlin\nfun submitForm(email: String): FormResult {\n    if (email.isBlank()) return FormResult(error = \"Email required\")\n    \u002F\u002F ...\n}\n```\n\n**Verify GREEN:** PASS\n\n## Verification Checklist\n\nBefore marking work complete:\n\n- [ ] Every new function\u002Fmethod has a test\n- [ ] Watched each test fail before implementing\n- [ ] Each test failed for expected reason\n- [ ] Wrote minimal code to pass each test\n- [ ] All tests pass\n- [ ] Tests use real code (mocks only if unavoidable)\n- [ ] Edge cases and errors covered\n\nCan't check all boxes? You skipped TDD. Start over.\n\n## Final Rule\n\n```\nProduction code → test exists and failed first\nOtherwise → not TDD\n```\n\nNo exceptions without your human partner's permission.\n","# Mobile Test-Driven Development (TDD)\n\n\u003CHARD-GATE>\nDo NOT write any production code for a mobile feature, fix, refactor, or behavior change until a failing test exists and you have observed it fail. This applies regardless of perceived simplicity or urgency.\n\u003C\u002FHARD-GATE>\n\n## Overview\n\nWrite the test first. Watch it fail. Write minimal code to pass.\n\n**Core principle:** If you didn't watch the test fail, you don't know if it tests the right thing.\n\n**Violating the letter of the rules is violating the spirit of the rules.**\n\n## When to Use\n\n**Always:**\n- New features\n- Bug fixes\n- Refactoring\n- Behavior changes\n\nThinking \"skip TDD just this once\"? Stop. That's rationalization.\n\n## The Iron Law\n\n```\nNO PRODUCTION CODE WITHOUT A FAILING TEST FIRST\n```\n\nWrite code before the test? Delete it. Start over.\n\n**No exceptions:**\n- Don't keep it as \"reference\"\n- Don't \"adapt\" it while writing tests\n- Delete means delete\n\n## Red-Green-Refactor\n\n```dot\ndigraph tdd_cycle {\n    rankdir=LR;\n    red [label=\"RED\\nWrite failing test\", shape=box, style=filled, fillcolor=\"#ffcccc\"];\n    verify_red [label=\"Verify fails\\ncorrectly\", shape=diamond];\n    green [label=\"GREEN\\nMinimal code\", shape=box, style=filled, fillcolor=\"#ccffcc\"];\n    verify_green [label=\"Verify passes\\nAll green\", shape=diamond];\n    refactor [label=\"REFACTOR\\nClean up\", shape=box, style=filled, fillcolor=\"#ccccff\"];\n    next [label=\"Next\", shape=ellipse];\n\n    red -> verify_red;\n    verify_red -> green [label=\"yes\"];\n    verify_red -> red [label=\"wrong\\nfailure\"];\n    green -> verify_green;\n    verify_green -> refactor [label=\"yes\"];\n    verify_green -> green [label=\"no\"];\n    refactor -> verify_green [label=\"stay\\ngreen\"];\n    verify_green -> next;\n    next -> red;\n}\n```\n\n### RED - Write Failing Test\n\nWrite one minimal test showing what should happen.\n\n**Android (Kotlin):**\n```kotlin\n@Test\nfun `should emit error state when API returns failure`() {\n    coEvery { repository.fetchData() } returns Result.failure(IOException())\n    viewModel.loadData()\n    assertEquals(UiState.Error(\"Failed to load\"), viewModel.state.value)\n}\n```\nRun: `.\u002Fgradlew testDebugUnitTest --tests \"com.example.MyViewModelTest\"`\n\n**iOS (Swift):**\n```swift\nfunc testShouldEmitErrorStateWhenAPIFails() throws {\n    let mockService = MockAPIService()\n    mockService.shouldFail = true\n    let viewModel = MyViewModel(service: mockService)\n    viewModel.loadData()\n    XCTAssertEqual(viewModel.state, .error(\"Failed to load\"))\n}\n```\nRun: `xcodebuild test -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone 16' -only-testing:MyAppTests\u002FMyViewModelTests`\n\n**Flutter (Dart):**\n```dart\ntest('should emit error state when API returns failure', () {\n  final mockRepo = MockRepository();\n  when(mockRepo.fetchData()).thenThrow(Exception('Network error'));\n  final viewModel = MyViewModel(mockRepo);\n  viewModel.loadData();\n  expect(viewModel.state, equals(UiState.error('Failed to load')));\n});\n```\nRun: `flutter test test\u002Fmy_viewmodel_test.dart`\n\n**React Native (TypeScript):**\n```typescript\ntest('should emit error state when API returns failure', () => {\n  const mockFetch = jest.fn().mockRejectedValue(new Error('Network error'));\n  const viewModel = createViewModel({ fetchData: mockFetch });\n  viewModel.loadData();\n  expect(viewModel.state).toEqual({ type: 'error', message: 'Failed to load' });\n});\n```\nRun: `npx jest __tests__\u002FMyViewModel.test.ts`\n\n**Requirements:**\n- One behavior\n- Clear name\n- Real code (no mocks unless unavoidable)\n\n### Verify RED - Watch It Fail\n\n**MANDATORY. Never skip.**\n\nConfirm:\n- Test fails (not errors)\n- Failure message is expected\n- Fails because feature missing (not typos)\n\n**Test passes?** You're testing existing behavior. Fix test.\n\n### GREEN - Minimal Code\n\nWrite simplest code to pass the test. Don't add features, refactor other code, or \"improve\" beyond the test.\n\n### Verify GREEN - Watch It Pass\n\n**MANDATORY.**\n\nRun platform-specific test command:\n\n| Platform | Run all tests |\n|----------|--------------|\n| **Android** | `.\u002Fgradlew testDebugUnitTest` |\n| **iOS** | `xcodebuild test -scheme MyApp -destination 'platform=iOS Simulator,name=iPhone 16'` |\n| **Flutter** | `flutter test` |\n| **React Native** | `npx jest` |\n| **KMP** | `.\u002Fgradlew allTests` |\n\nConfirm:\n- Test passes\n- Other tests still pass\n- Output pristine (no errors, warnings)\n\n### REFACTOR - Clean Up\n\nAfter green only:\n- Remove duplication\n- Improve names\n- Extract helpers\n\nKeep tests green. Don't add behavior.\n\n### Repeat\n\nNext failing test for next feature.\n\n## Why Order Matters\n\n**\"I'll write tests after to verify it works\"**\n\nTests written after code pass immediately. Passing immediately proves nothing. Test-first forces you to see the test fail, proving it actually tests something.\n\n**\"I already manually tested all the edge cases\"**\n\nManual testing is ad-hoc. No record of what you tested. Can't re-run when code changes. Automated tests are systematic.\n\n**\"Deleting X hours of work is wasteful\"**\n\nSunk cost fallacy. The time is already gone. Working code without real tests is technical debt.\n\n## Common Rationalizations\n\n| Excuse | Reality |\n|--------|---------|\n| \"Too simple to test\" | Simple code breaks. Test takes 30 seconds. |\n| \"I'll test after\" | Tests passing immediately prove nothing. |\n| \"The build takes too long for TDD\" | Run only the specific test, not the full build. All frameworks support single-test execution. |\n| \"I can't test this — it depends on the framework\" | Extract logic into testable units. ViewModel\u002FUseCase\u002FRepository shouldn't depend on the framework. |\n| \"Need to explore first\" | Fine. Throw away exploration, start with TDD. |\n| \"Test hard = design unclear\" | Listen to test. Hard to test = hard to use. |\n\n## Red Flags - STOP and Start Over\n\n- Code before test\n- Test after implementation\n- Test passes immediately\n- Can't explain why test failed\n- Rationalizing \"just this once\"\n- \"Keep as reference\" or \"adapt existing code\"\n\n**All of these mean: Delete code. Start over with TDD.**\n\n## Example: Bug Fix\n\n**Bug:** Empty email accepted\n\n**RED**\n```kotlin\n@Test\nfun `rejects empty email`() {\n    val result = viewModel.submitForm(email = \"\")\n    assertEquals(\"Email required\", result.error)\n}\n```\n\n**Verify RED:** FAIL with \"expected 'Email required', got null\"\n\n**GREEN**\n```kotlin\nfun submitForm(email: String): FormResult {\n    if (email.isBlank()) return FormResult(error = \"Email required\")\n    \u002F\u002F ...\n}\n```\n\n**Verify GREEN:** PASS\n\n## Verification Checklist\n\nBefore marking work complete:\n\n- [ ] Every new function\u002Fmethod has a test\n- [ ] Watched each test fail before implementing\n- [ ] Each test failed for expected reason\n- [ ] Wrote minimal code to pass each test\n- [ ] All tests pass\n- [ ] Tests use real code (mocks only if unavoidable)\n- [ ] Edge cases and errors covered\n\nCan't check all boxes? You skipped TDD. Start over.\n\n## Final Rule\n\n```\nProduction code → test exists and failed first\nOtherwise → not TDD\n```\n\nNo exceptions without your human partner's permission.\n",{"name":5,"license":15,"platforms":54,"description":7,"compatibility":58},[55,56,57,42,38],"android","ios","kmp",[59,60,45,61,48],"claude-code","cursor","codex","main","2edc6ac1cde2cc280ae0388aa8072902d2e230d5","skills\u002Fcore\u002Fskills\u002Fmobiai-mobile-tdd",14,"https:\u002F\u002Fgithub.com\u002FArisGuimera\u002FMobiAI-Core","https:\u002F\u002Fgithub.com\u002FArisGuimera","https:\u002F\u002Faristi.dev","⭐️ GitHub Star\r\n📲 Mobile developer\r\n🎥 Te enseño a programar apps en Youtube (AristiDevs)\r\n✍🏻 Y por escrito en CursoKotlin.com\r\n❤️ Kotlin Fanboy\r\n👇👇👇👇","2026-11-13 22:28:09",{"source":8,"skillName":5,"commands":72,"prompt":82,"zipAvailable":83},[73,76,79],{"tool":74,"command":75},"npx","npx skills add ArisGuimera\u002FMobiAI-Core --skill mobiai-mobile-tdd",{"tool":77,"command":78},"bunx","bunx skills add ArisGuimera\u002FMobiAI-Core --skill mobiai-mobile-tdd",{"tool":80,"command":81},"pnpm","pnpm dlx skills add ArisGuimera\u002FMobiAI-Core --skill mobiai-mobile-tdd","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FArisGuimera\u002FMobiAI-Core\u002Fblob\u002Fmain\u002Fskills\u002Fcore\u002Fskills\u002Fmobiai-mobile-tdd\u002FSKILL.md",true,[],[86,108,121,137,155,169],{"skillNo":87,"name":88,"nameZh":6,"description":89,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":90,"categories":91,"keywords":98,"publishedAt":49},"01M6KCMR2WVBEC7T0YY4J2SCAR","mobiai-react-native","Use when working on a React Native project — building, testing, debugging, understanding navigation and state management.","https:\u002F\u002Fgithub.com\u002FArisGuimera\u002FMobiAI-Core\u002Fblob\u002Fmain\u002Fskills\u002Freact-native\u002Fskills\u002Fmobiai-react-native\u002FSKILL.md",[92,95],{"categoryNo":93,"categoryName":94,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":96,"categoryName":97,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000009","前端开发",[47,99,35,100,101,61,45,102,103,44,104,105,60,32,106,38,59,107],"react native","mobiai react native","testing","debugging","state management","state","management","navigation","project",{"skillNo":109,"name":110,"nameZh":6,"description":111,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":112,"categories":113,"keywords":115,"publishedAt":49},"01M6KCMKFC3DKFW5B2208SM59W","mobiai-kmp","Use when working on a Kotlin Multiplatform project — shared code, expect\u002Factual declarations, platform-specific implementations, building and testing.","https:\u002F\u002Fgithub.com\u002FArisGuimera\u002FMobiAI-Core\u002Fblob\u002Fmain\u002Fskills\u002Fkmp\u002Fskills\u002Fmobiai-kmp\u002FSKILL.md",[114],{"categoryNo":93,"categoryName":94,"taxonomyType":21,"taxonomyTypeDesc":22},[116,101,61,45,44,117,118,60,32,59,119,107,120],"mobiai kmp","kotlin","kotlin multiplatform","shared","platform",{"skillNo":122,"name":123,"nameZh":6,"description":124,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":125,"categories":126,"keywords":128,"publishedAt":49},"01M6KCMEC4YP1FFAX4ZX80Q10R","mobiai-ios-testing","Use when writing or running tests in an iOS project — unit tests, UI tests, snapshot tests, choosing the right framework.","https:\u002F\u002Fgithub.com\u002FArisGuimera\u002FMobiAI-Core\u002Fblob\u002Fmain\u002Fskills\u002Fios\u002Fskills\u002Fmobiai-ios-testing\u002FSKILL.md",[127],{"categoryNo":93,"categoryName":94,"taxonomyType":21,"taxonomyTypeDesc":22},[101,56,129,130,40,61,131,45,44,132,133,134,60,135,32,59,107,37,136],"ios testing","mobiai ios testing","unit tests","framework","running tests","ui","snapshot","unit",{"skillNo":138,"name":139,"nameZh":6,"description":140,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":143,"publishedAt":49},"01M6KCM78C8P9R6X78EZCQ0YF9","mobiai-ios-device","Use when interacting with an iOS Simulator — run simctl commands, capture screenshots, read device logs, manage simulators.","https:\u002F\u002Fgithub.com\u002FArisGuimera\u002FMobiAI-Core\u002Fblob\u002Fmain\u002Fskills\u002Fios\u002Fskills\u002Fmobiai-ios-device\u002FSKILL.md",[],[56,144,145,146,61,45,147,44,148,149,150,60,32,151,152,59,153,154],"device","mobiai ios device","screenshots","run","logs","capture","read","manage","ios simulator","commands","with",{"skillNo":156,"name":157,"nameZh":6,"description":158,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":159,"categories":160,"keywords":161,"publishedAt":49},"01M6KCM2HE6Z1B7WREJ9DTKKWA","mobiai-ios-build","Use when building an iOS project, configuring schemes, troubleshooting build failures, or managing dependencies with CocoaPods or SPM.","https:\u002F\u002Fgithub.com\u002FArisGuimera\u002FMobiAI-Core\u002Fblob\u002Fmain\u002Fskills\u002Fios\u002Fskills\u002Fmobiai-ios-build\u002FSKILL.md",[],[56,162,163,164,61,45,44,165,60,32,166,59,107,154,167,168],"build","ios build","mobiai ios build","troubleshooting","dependencies","spm","cocoapods",{"skillNo":170,"name":171,"nameZh":6,"description":172,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":173,"categories":174,"keywords":175,"publishedAt":49},"01M6KCKWZNT8P6K5SYXE1YAT9E","mobiai-ios-architecture","Use when creating features, refactoring, or navigating an iOS codebase — understand project structure, find where to make changes, follow existing patterns.","https:\u002F\u002Fgithub.com\u002FArisGuimera\u002FMobiAI-Core\u002Fblob\u002Fmain\u002Fskills\u002Fios\u002Fskills\u002Fmobiai-ios-architecture\u002FSKILL.md",[],[176,56,177,178,61,179,45,44,180,181,60,32,182,183,107,184,185,186,187,188],"architecture","ios architecture","mobiai ios architecture","project structure","refactoring","find","patterns","structure","understand","changes","codebase","Existing","features"]