[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7AFMXYRP3YEKA2Z1AXJHTAD":3,"skill-same:01M7AFMXYRP3YEKA2Z1AXJHTAD":45},{"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":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":24,"commitSha":25,"skillDirectory":26,"forksCount":27,"repositoryHtmlUrl":28,"repositoryHomepageUrl":28,"ownerHtmlUrl":29,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":30,"install":31,"resources":44},"01M7AFMXYRP3YEKA2Z1AXJHTAD","trove-swift",null,"Swift 6 and SwiftUI coding conventions for iOS development. Auto-activates when working with Swift files. Covers @Observable, async\u002Fawait, NavigationStack, Swift Testing, and accessibility. Use when: swift conventions; swiftui view; swift testing.","bravew\u002Ftrove","bravew","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F10855844?v=4","01M7ACJ91JZSQYHT81XPVYR7VA","Yong","01M7AFERNR92HDPGNGP5QA16DM",10,"MIT","https:\u002F\u002Fgithub.com\u002Fbravew\u002Ftrove\u002Fblob\u002Fmain\u002Fplugins\u002Ftrove-dev\u002F.copilot\u002Fskills\u002Ftrove-swift\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: trove-swift\ndescription: \"Swift 6 and SwiftUI coding conventions for iOS development. Auto-activates when working with Swift files. Covers @Observable, async\u002Fawait, NavigationStack, Swift Testing, and accessibility. Use when: swift conventions; swiftui view; swift testing.\"\n---\n\u003C!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->\n\u003C!-- Regenerate: bun run build:skills -->\n\n## Session Init\n\nThis skill ships Trove conventions. Prefer existing project patterns over generic best practices when they conflict.\n\n# Swift 6 \u002F SwiftUI Conventions\n\n## @Observable (Preferred over ObservableObject)\n\n```swift\n@Observable\nfinal class UserViewModel {\n    var name = \"\"\n    var isLoading = false\n\n    func load() async {\n        isLoading = true\n        defer { isLoading = false }\n        name = try await fetchUserName()\n    }\n}\n```\n\nUse `@Observable` instead of `ObservableObject` + `@Published` in new code.\n\n## Async\u002FAwait\n\n- Use structured concurrency (`async let`, `TaskGroup`)\n- Annotate main-actor-bound code with `@MainActor`\n- Use `Task { }` only at boundaries (view lifecycle, button actions)\n\n```swift\n\u002F\u002F Parallel fetching\nasync let user = fetchUser(id)\nasync let posts = fetchPosts(userId: id)\nlet (userData, postsData) = try await (user, posts)\n```\n\n## NavigationStack\n\n```swift\nNavigationStack(path: $router.path) {\n    ContentView()\n        .navigationDestination(for: Route.self) { route in\n            switch route {\n            case .detail(let id): DetailView(id: id)\n            case .settings: SettingsView()\n            }\n        }\n}\n```\n\n## Error Handling\n\n- Use typed `throws` where possible\n- Define domain-specific error enums conforming to `LocalizedError`\n- Never force-unwrap (`!`) outside of tests\n\n## AI Gotchas\n\n- **Sendable**: Mark types shared across concurrency domains as `Sendable`\n- **MainActor**: UI updates must happen on `@MainActor`\n- **Observation**: `@Observable` replaces `ObservableObject` in Swift 5.9+\n- **SwiftUI previews**: Use `#Preview` macro instead of `PreviewProvider`\n","\u003C!-- AUTO-GENERATED from SKILL.md.tmpl — do not edit directly -->\n\u003C!-- Regenerate: bun run build:skills -->\n\n## Session Init\n\nThis skill ships Trove conventions. Prefer existing project patterns over generic best practices when they conflict.\n\n# Swift 6 \u002F SwiftUI Conventions\n\n## @Observable (Preferred over ObservableObject)\n\n```swift\n@Observable\nfinal class UserViewModel {\n    var name = \"\"\n    var isLoading = false\n\n    func load() async {\n        isLoading = true\n        defer { isLoading = false }\n        name = try await fetchUserName()\n    }\n}\n```\n\nUse `@Observable` instead of `ObservableObject` + `@Published` in new code.\n\n## Async\u002FAwait\n\n- Use structured concurrency (`async let`, `TaskGroup`)\n- Annotate main-actor-bound code with `@MainActor`\n- Use `Task { }` only at boundaries (view lifecycle, button actions)\n\n```swift\n\u002F\u002F Parallel fetching\nasync let user = fetchUser(id)\nasync let posts = fetchPosts(userId: id)\nlet (userData, postsData) = try await (user, posts)\n```\n\n## NavigationStack\n\n```swift\nNavigationStack(path: $router.path) {\n    ContentView()\n        .navigationDestination(for: Route.self) { route in\n            switch route {\n            case .detail(let id): DetailView(id: id)\n            case .settings: SettingsView()\n            }\n        }\n}\n```\n\n## Error Handling\n\n- Use typed `throws` where possible\n- Define domain-specific error enums conforming to `LocalizedError`\n- Never force-unwrap (`!`) outside of tests\n\n## AI Gotchas\n\n- **Sendable**: Mark types shared across concurrency domains as `Sendable`\n- **MainActor**: UI updates must happen on `@MainActor`\n- **Observation**: `@Observable` replaces `ObservableObject` in Swift 5.9+\n- **SwiftUI previews**: Use `#Preview` macro instead of `PreviewProvider`\n",{"name":5,"description":7},"main","f88db1f1cf0e0703dd962051ebc142db961d7799","plugins\u002Ftrove-dev\u002F.copilot\u002Fskills\u002Ftrove-swift",1,"https:\u002F\u002Fgithub.com\u002Fbravew\u002Ftrove","https:\u002F\u002Fgithub.com\u002Fbravew","2026-11-12 07:56:32",{"source":8,"skillName":5,"commands":32,"prompt":42,"zipAvailable":43},[33,36,39],{"tool":34,"command":35},"npx","npx skills add bravew\u002Ftrove --skill trove-swift",{"tool":37,"command":38},"bunx","bunx skills add bravew\u002Ftrove --skill trove-swift",{"tool":40,"command":41},"pnpm","pnpm dlx skills add bravew\u002Ftrove --skill trove-swift","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fbravew\u002Ftrove\u002Fblob\u002Fmain\u002Fplugins\u002Ftrove-dev\u002F.copilot\u002Fskills\u002Ftrove-swift\u002FSKILL.md",true,[],[46,53,60,67,74,81],{"skillNo":47,"name":48,"nameZh":6,"description":49,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":50,"categories":51,"keywords":52,"publishedAt":19},"01M7AGJDHTQAS1VK6P7VJAV79G","using-trove","Skill discipline anchor for the Trove marketplace. Loaded once per session; routes the agent to the right trove-* skill before code, planning, review, or git actions.","https:\u002F\u002Fgithub.com\u002Fbravew\u002Ftrove\u002Fblob\u002Fmain\u002Fskills\u002Fworkflow\u002Fusing-trove\u002FSKILL.md",[],[],{"skillNo":54,"name":55,"nameZh":6,"description":56,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":57,"categories":58,"keywords":59,"publishedAt":19},"01M7AGJAS4V4TXE6TV6F839BGZ","trove-write-skill","Skill authoring workflow. Use when creating or updating a Codex or Trove skill, including rubrics, tasks, metadata, and validation.","https:\u002F\u002Fgithub.com\u002Fbravew\u002Ftrove\u002Fblob\u002Fmain\u002Fskills\u002Fworkflow\u002Ftrove-write-skill\u002FSKILL.md",[],[],{"skillNo":61,"name":62,"nameZh":6,"description":63,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":64,"categories":65,"keywords":66,"publishedAt":19},"01M7AGJ87K41ZAC8DDBAV17QFW","trove-worktree","Git worktree workflow for spikes, risky experiments, and broad refactors that should not disturb the user's current branch.","https:\u002F\u002Fgithub.com\u002Fbravew\u002Ftrove\u002Fblob\u002Fmain\u002Fskills\u002Fworkflow\u002Ftrove-worktree\u002FSKILL.md",[],[],{"skillNo":68,"name":69,"nameZh":6,"description":70,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":73,"publishedAt":19},"01M7AGJ32V58VYBFYMS9EMHRY4","trove-why","Reconstruct design rationale and decision history from evidence — source control, issue tracker (Linear), docs (Notion), chat (Slack), error tracking (Sentry) — with calibrated confidence. Use for \"why does X work this way\", \"why did we pick Y\", regressions, and postmortems. Use trove-explain for how it works now.","https:\u002F\u002Fgithub.com\u002Fbravew\u002Ftrove\u002Fblob\u002Fmain\u002Fskills\u002Fworkflow\u002Ftrove-why\u002FSKILL.md",[],[],{"skillNo":75,"name":76,"nameZh":6,"description":77,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":78,"categories":79,"keywords":80,"publishedAt":19},"01M7AGJ0FHJSRR8MMXC3V8XNHF","trove-verify","Completion verification workflow. Use before claiming done, fixed, complete, ready, or shipped.","https:\u002F\u002Fgithub.com\u002Fbravew\u002Ftrove\u002Fblob\u002Fmain\u002Fskills\u002Fworkflow\u002Ftrove-verify\u002FSKILL.md",[],[],{"skillNo":82,"name":83,"nameZh":6,"description":84,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":85,"categories":86,"keywords":87,"publishedAt":19},"01M7AGHWV4B9SDS60RH5W0B0K5","trove-unslop","Cut AI tells from writing — PR descriptions, release notes, specs, commit bodies, and replies. Use before finalizing prose, or when the user asks to clean up, de-slop, or make text sound human.","https:\u002F\u002Fgithub.com\u002Fbravew\u002Ftrove\u002Fblob\u002Fmain\u002Fskills\u002Fworkflow\u002Ftrove-unslop\u002FSKILL.md",[],[]]