[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6H82PJ42CMZDRKB7SAGE0A5":3,"skill-same:01M6H82PJ42CMZDRKB7SAGE0A5":118},{"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":46,"linkOnly":47,"markdownContent":48,"markdownBody":49,"frontMatter":50,"refName":54,"commitSha":55,"skillDirectory":56,"forksCount":14,"repositoryHtmlUrl":57,"repositoryHomepageUrl":6,"ownerHtmlUrl":58,"ownerBlogUrl":59,"ownerDescription":60,"updatedAt":61,"install":62,"resources":75},"01M6H82PJ42CMZDRKB7SAGE0A5","swift-testing",null,"How Swift tests are written in these repos: Swift Testing (`@Test`, `#expect`, `#require`), suites, traits and tags, parameterized tests, async and actor-isolated tests, confirmations, testing `@Observable` models and SwiftData, and migrating from XCTest. TRIGGER — load BEFORE writing, editing or reviewing any Swift test file: a path under a `*Tests\u002F` or `*UITests\u002F` directory, a file ending `Tests.swift`\u002F`Test.swift`, or one that imports `Testing` or `XCTest`. Also when the task says `@Test`, `#expect`, XCTestCase, XCTest migration, test plan, flaky test or \"write a test\" in a Swift or Xcode project. Plain requests count: \"add tests for this model\", \"fix the failing test\", or a feature task whose last step is testing it. Load alongside swift-ios, not instead of it. SKIP when no Swift test code is written or judged.","O-Marsters-1997\u002Fmy-claude-code","O-Marsters-1997","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F72571979?v=4","01M6H800V7V9BSXYZKDM0JXTJ2","Olly Marsters","01M6H800ZYDJR42TNRH0E6ZVZ7",0,"MIT","https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fcode\u002Fswift-testing\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,44,45],"swift","swift testing","testing","task","failing","when","for","load","traits","tags","trigger","feature","tests","project","async","fix","editing","model","test plan","file","code","writing","2026-11-10 10:12:30",false,"---\nname: swift-testing\ndescription: >\n  How Swift tests are written in these repos: Swift Testing (`@Test`, `#expect`, `#require`),\n  suites, traits and tags, parameterized tests, async and actor-isolated tests, confirmations,\n  testing `@Observable` models and SwiftData, and migrating from XCTest. TRIGGER — load BEFORE\n  writing, editing or reviewing any Swift test file: a path under a `*Tests\u002F` or `*UITests\u002F`\n  directory, a file ending `Tests.swift`\u002F`Test.swift`, or one that imports `Testing` or\n  `XCTest`. Also when the task says `@Test`, `#expect`, XCTestCase, XCTest migration, test plan,\n  flaky test or \"write a test\" in a Swift or Xcode project. Plain requests count: \"add tests for\n  this model\", \"fix the failing test\", or a feature task whose last step is testing it. Load\n  alongside swift-ios, not instead of it. SKIP when no Swift test code is written or judged.\nlicense: MIT\nmetadata:\n  sources: >\n    Merged from twostraws\u002FSwift-Testing-Agent-Skill (Paul Hudson, MIT), AvdLee\u002FSwift-Testing-Agent-Skill\n    (Antoine van der Lee, MIT), and the testing references of twostraws\u002FSwift-Concurrency-Agent-Skill and\n    AvdLee\u002FSwift-Concurrency-Agent-Skill (MIT).\n---\n\n# Swift Testing\n\nHow a Swift test is written. What to test is the repo's `testing-policy` when it ships one. For\nthe red-green-refactor loop, use `tdd`; for the code under test, `swift-ios`.\n\nSwift Testing ships new APIs several times a year, and most training data and blog posts are\nXCTest. Your instincts reskin XCTest. The rules below exist to stop that. Trust the installed\ntoolchain over memory and over Apple's docs, which lag behind it.\n\n## Before you write\n\n1. Read the toolchain: `swift --version`, `xcodebuild -version`, or `swift-tools-version` in\n   `Package.swift`. Gate anything in `references\u002Fnew-features.md` on it.\n2. Check the test target's default actor isolation (`SWIFT_DEFAULT_ACTOR_ISOLATION` in build\n   settings, `.defaultIsolation(MainActor.self)` in `Package.swift`). It decides whether tests\n   already run on the main actor.\n3. See what the target already uses. New tests are Swift Testing. Existing XCTest stays as it\n   is unless the task is a migration.\n\n## Your defaults that are wrong here\n\n| You reach for                                       | Do this instead                                                        |\n| --------------------------------------------------- | ---------------------------------------------------------------------- |\n| `class FooTests: XCTestCase`, `XCTAssert*`          | A `struct` with `@Test` methods, `#expect`                              |\n| `@Suite` on every test type                         | Nothing. `@Suite` only to give a display name or attach traits          |\n| `setUp()` \u002F `tearDown()`                            | `init()` (async\u002Fthrows allowed); `deinit` on a class; a scoping trait for async teardown |\n| `func testUserLogsOut()`                            | `func userLogsOut()`; the `test` prefix means nothing                   |\n| `#expect(!isLoggedIn)`                              | `#expect(isLoggedIn == false)`; `!` hides the value in the failure     |\n| `users.first!`, `XCTUnwrap`                         | `let first = try #require(users.first)`                                 |\n| `#expect(throws: Error.self)`                       | The specific error or case: `#expect(throws: LoginError.locked)`        |\n| Copy-pasted tests that differ by one input, a `for` loop in a test | `@Test(arguments:)`                                       |\n| `Task.sleep` to wait for work                       | `await` the work; `confirmation()`; return the `Task` and await it      |\n| `XCTestExpectation` + `wait(for:)`                  | `await confirmation { confirm in … }`, or a continuation               |\n| `.serialized` to fix a flaky test                   | Remove the shared state. `.serialized` only as a dated transition       |\n| `.timeLimit(.seconds(10))`                          | `.timeLimit(.minutes(1))`; minutes is the only unit                     |\n| `@available` on a suite                             | `@available` on each test function                                      |\n| `@MainActor` on every test                          | Only where the code under test is main-actor isolated                   |\n| Commenting a test out                               | `.disabled(\"reason\", .bug(...))`, or `withKnownIssue` to keep it running |\n| Unit-testing a SwiftUI view                         | Test the `@Observable` model or service behind it                       |\n\n## Rules\n\n1. XCTest stays only for UI automation (`XCUIApplication`), performance metrics (`XCTMetric`,\n   `measure`) and Objective-C tests. Everything else new is Swift Testing.\n2. `import Testing` only in test targets, never in app, library or executable targets.\n3. Suites are `struct`s unless they need `deinit` or reference identity. Each test gets a fresh\n   instance, so stored properties set in `init()` are per-test state, not shared.\n4. `#expect` is the default. `try #require` when the rest of the test is meaningless if it fails:\n   preconditions and optional unwraps. Never `!` inside either macro.\n5. Throwing code: `#expect(throws: SpecificError.case)`, or capture the returned error and\n   assert on it. `#expect(throws: Never.self)` for \"does not throw\".\n6. Parameterize when tests share logic and differ in data. Pair inputs with expected outputs as\n   an array of tuples, not `zip` of two arrays. Two argument collections form a Cartesian\n   product. Expected values are literals, never derived from the input.\n7. Every test runs in parallel and in random order. Shared mutable state (`static var`,\n   singletons, `UserDefaults.standard`, the file system) is the bug. Inject it per test.\n8. Async: make the test `async` and `await` the real work. Code that spawns a `Task` it never\n   returns can't be tested reliably: make it `async` or return the `Task`. Wrap callback APIs in\n   `withCheckedContinuation`. No sleeps as synchronisation.\n9. Test behaviour through the public or `@testable` internal API. Don't add `nonisolated`\n   accessors or test-only hooks to production code to reach into an actor.\n10. Unit tests never touch the network, the real clock, or persistent storage. Use a protocol\n    double for `URLSession`, an injected clock and an in-memory `ModelContainer`.\n11. New dependencies (Swift Numerics, swift-concurrency-extras, snapshot libraries) need the\n    user's permission first.\n12. Mirror the production folder layout in the test target for new tests. Don't reorganise\n    existing tests without asking.\n\n## Reviews\n\nWhen asked to review tests, list findings by file. For each: line, the rule broken, a short\nbefore\u002Fafter. Skip clean files, and end with a prioritised summary. Report real problems only.\nWhen asked to write or fix tests, make the change; don't produce a report.\n\n## Where to look\n\n| If you're…                                                          | Load                                     |\n| ------------------------------------------------------------------- | ---------------------------------------- |\n| Structuring suites, `init`\u002F`deinit`, nested suites, `@available`     | `references\u002Ffundamentals.md`             |\n| Choosing `#expect`\u002F`#require`, testing throws, `Issue.record`, `withKnownIssue` | `references\u002Fexpectations.md`  |\n| Turning repeated tests into `arguments:`, pairing inputs             | `references\u002Fparameterized.md`            |\n| Disabling, gating, tagging, linking bugs, test plans                 | `references\u002Ftraits-and-tags.md`          |\n| Testing async code, callbacks, actors, `confirmation()`, cancellation | `references\u002Fasync-and-concurrency.md`   |\n| Fixing a flaky or order-dependent test, deciding on `.serialized`    | `references\u002Fisolation-and-parallelism.md` |\n| Testing an `@Observable` model, a service, SwiftData, or picking XCUITest | `references\u002Ftesting-app-code.md`    |\n| Converting XCTest                                                    | `references\u002Fmigrating-from-xctest.md`    |\n| Using raw identifiers, exit tests, attachments, scoping traits, range confirmations | `references\u002Fnew-features.md` |\n\n## See also\n\n| Skill            | When                                                    |\n| ---------------- | ------------------------------------------------------- |\n| `swift-ios`      | The code under test: SwiftUI, models, concurrency       |\n| `tdd`            | Writing the test first, one behaviour at a time         |\n| `testing-policy` | What to test in this repo (per repo, when present)      |\n","# Swift Testing\n\nHow a Swift test is written. What to test is the repo's `testing-policy` when it ships one. For\nthe red-green-refactor loop, use `tdd`; for the code under test, `swift-ios`.\n\nSwift Testing ships new APIs several times a year, and most training data and blog posts are\nXCTest. Your instincts reskin XCTest. The rules below exist to stop that. Trust the installed\ntoolchain over memory and over Apple's docs, which lag behind it.\n\n## Before you write\n\n1. Read the toolchain: `swift --version`, `xcodebuild -version`, or `swift-tools-version` in\n   `Package.swift`. Gate anything in `references\u002Fnew-features.md` on it.\n2. Check the test target's default actor isolation (`SWIFT_DEFAULT_ACTOR_ISOLATION` in build\n   settings, `.defaultIsolation(MainActor.self)` in `Package.swift`). It decides whether tests\n   already run on the main actor.\n3. See what the target already uses. New tests are Swift Testing. Existing XCTest stays as it\n   is unless the task is a migration.\n\n## Your defaults that are wrong here\n\n| You reach for                                       | Do this instead                                                        |\n| --------------------------------------------------- | ---------------------------------------------------------------------- |\n| `class FooTests: XCTestCase`, `XCTAssert*`          | A `struct` with `@Test` methods, `#expect`                              |\n| `@Suite` on every test type                         | Nothing. `@Suite` only to give a display name or attach traits          |\n| `setUp()` \u002F `tearDown()`                            | `init()` (async\u002Fthrows allowed); `deinit` on a class; a scoping trait for async teardown |\n| `func testUserLogsOut()`                            | `func userLogsOut()`; the `test` prefix means nothing                   |\n| `#expect(!isLoggedIn)`                              | `#expect(isLoggedIn == false)`; `!` hides the value in the failure     |\n| `users.first!`, `XCTUnwrap`                         | `let first = try #require(users.first)`                                 |\n| `#expect(throws: Error.self)`                       | The specific error or case: `#expect(throws: LoginError.locked)`        |\n| Copy-pasted tests that differ by one input, a `for` loop in a test | `@Test(arguments:)`                                       |\n| `Task.sleep` to wait for work                       | `await` the work; `confirmation()`; return the `Task` and await it      |\n| `XCTestExpectation` + `wait(for:)`                  | `await confirmation { confirm in … }`, or a continuation               |\n| `.serialized` to fix a flaky test                   | Remove the shared state. `.serialized` only as a dated transition       |\n| `.timeLimit(.seconds(10))`                          | `.timeLimit(.minutes(1))`; minutes is the only unit                     |\n| `@available` on a suite                             | `@available` on each test function                                      |\n| `@MainActor` on every test                          | Only where the code under test is main-actor isolated                   |\n| Commenting a test out                               | `.disabled(\"reason\", .bug(...))`, or `withKnownIssue` to keep it running |\n| Unit-testing a SwiftUI view                         | Test the `@Observable` model or service behind it                       |\n\n## Rules\n\n1. XCTest stays only for UI automation (`XCUIApplication`), performance metrics (`XCTMetric`,\n   `measure`) and Objective-C tests. Everything else new is Swift Testing.\n2. `import Testing` only in test targets, never in app, library or executable targets.\n3. Suites are `struct`s unless they need `deinit` or reference identity. Each test gets a fresh\n   instance, so stored properties set in `init()` are per-test state, not shared.\n4. `#expect` is the default. `try #require` when the rest of the test is meaningless if it fails:\n   preconditions and optional unwraps. Never `!` inside either macro.\n5. Throwing code: `#expect(throws: SpecificError.case)`, or capture the returned error and\n   assert on it. `#expect(throws: Never.self)` for \"does not throw\".\n6. Parameterize when tests share logic and differ in data. Pair inputs with expected outputs as\n   an array of tuples, not `zip` of two arrays. Two argument collections form a Cartesian\n   product. Expected values are literals, never derived from the input.\n7. Every test runs in parallel and in random order. Shared mutable state (`static var`,\n   singletons, `UserDefaults.standard`, the file system) is the bug. Inject it per test.\n8. Async: make the test `async` and `await` the real work. Code that spawns a `Task` it never\n   returns can't be tested reliably: make it `async` or return the `Task`. Wrap callback APIs in\n   `withCheckedContinuation`. No sleeps as synchronisation.\n9. Test behaviour through the public or `@testable` internal API. Don't add `nonisolated`\n   accessors or test-only hooks to production code to reach into an actor.\n10. Unit tests never touch the network, the real clock, or persistent storage. Use a protocol\n    double for `URLSession`, an injected clock and an in-memory `ModelContainer`.\n11. New dependencies (Swift Numerics, swift-concurrency-extras, snapshot libraries) need the\n    user's permission first.\n12. Mirror the production folder layout in the test target for new tests. Don't reorganise\n    existing tests without asking.\n\n## Reviews\n\nWhen asked to review tests, list findings by file. For each: line, the rule broken, a short\nbefore\u002Fafter. Skip clean files, and end with a prioritised summary. Report real problems only.\nWhen asked to write or fix tests, make the change; don't produce a report.\n\n## Where to look\n\n| If you're…                                                          | Load                                     |\n| ------------------------------------------------------------------- | ---------------------------------------- |\n| Structuring suites, `init`\u002F`deinit`, nested suites, `@available`     | `references\u002Ffundamentals.md`             |\n| Choosing `#expect`\u002F`#require`, testing throws, `Issue.record`, `withKnownIssue` | `references\u002Fexpectations.md`  |\n| Turning repeated tests into `arguments:`, pairing inputs             | `references\u002Fparameterized.md`            |\n| Disabling, gating, tagging, linking bugs, test plans                 | `references\u002Ftraits-and-tags.md`          |\n| Testing async code, callbacks, actors, `confirmation()`, cancellation | `references\u002Fasync-and-concurrency.md`   |\n| Fixing a flaky or order-dependent test, deciding on `.serialized`    | `references\u002Fisolation-and-parallelism.md` |\n| Testing an `@Observable` model, a service, SwiftData, or picking XCUITest | `references\u002Ftesting-app-code.md`    |\n| Converting XCTest                                                    | `references\u002Fmigrating-from-xctest.md`    |\n| Using raw identifiers, exit tests, attachments, scoping traits, range confirmations | `references\u002Fnew-features.md` |\n\n## See also\n\n| Skill            | When                                                    |\n| ---------------- | ------------------------------------------------------- |\n| `swift-ios`      | The code under test: SwiftUI, models, concurrency       |\n| `tdd`            | Writing the test first, one behaviour at a time         |\n| `testing-policy` | What to test in this repo (per repo, when present)      |\n",{"name":5,"license":15,"metadata":51,"description":53},{"sources":52},"Merged from twostraws\u002FSwift-Testing-Agent-Skill (Paul Hudson, MIT), AvdLee\u002FSwift-Testing-Agent-Skill (Antoine van der Lee, MIT), and the testing references of twostraws\u002FSwift-Concurrency-Agent-Skill and AvdLee\u002FSwift-Concurrency-Agent-Skill (MIT).","How Swift tests are written in these repos: Swift Testing (`@Test`, `#expect`, `#require`), suites, traits and tags, parameterized tests, async and actor-isolated tests, confirmations, testing `@Observable` models and SwiftData, and migrating from XCTest. TRIGGER — load BEFORE writing, editing or reviewing any Swift test file: a path under a `*Tests\u002F` or `*UITests\u002F` directory, a file ending `Tests.swift`\u002F`Test.swift`, or one that imports `Testing` or `XCTest`. Also when the task says `@Test`, `#expect`, XCTestCase, XCTest migration, test plan, flaky test or \"write a test\" in a Swift or Xcode project. Plain requests count: \"add tests for this model\", \"fix the failing test\", or a feature task whose last step is testing it. Load alongside swift-ios, not instead of it. SKIP when no Swift test code is written or judged.\n","main","aede9f7bc29a2d9127fa7ce29682c242596c7759","skills\u002Fcode\u002Fswift-testing","https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code","https:\u002F\u002Fgithub.com\u002FO-Marsters-1997","https:\u002F\u002Fpersonal-portfolio-v2-phi.vercel.app","Go & TypeScript developer building tooling for AI-assisted development: git worktree workflows, Claude Code skills and agent orchestration.","2026-11-11 04:20:46",{"source":8,"skillName":5,"commands":63,"prompt":73,"zipAvailable":74},[64,67,70],{"tool":65,"command":66},"npx","npx skills add O-Marsters-1997\u002Fmy-claude-code --skill swift-testing",{"tool":68,"command":69},"bunx","bunx skills add O-Marsters-1997\u002Fmy-claude-code --skill swift-testing",{"tool":71,"command":72},"pnpm","pnpm dlx skills add O-Marsters-1997\u002Fmy-claude-code --skill swift-testing","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fcode\u002Fswift-testing\u002FSKILL.md",true,[76,82,86,90,94,98,102,106,110,114],{"path":77,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":80,"sourceHtmlUrl":81},"evals\u002Fevals.json","REFERENCE","参考文档",14866,"https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fcode\u002Fswift-testing\u002Fevals\u002Fevals.json",{"path":83,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":84,"sourceHtmlUrl":85},"references\u002Fasync-and-concurrency.md",6801,"https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fcode\u002Fswift-testing\u002Freferences\u002Fasync-and-concurrency.md",{"path":87,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":88,"sourceHtmlUrl":89},"references\u002Fexpectations.md",3729,"https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fcode\u002Fswift-testing\u002Freferences\u002Fexpectations.md",{"path":91,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":92,"sourceHtmlUrl":93},"references\u002Ffundamentals.md",3188,"https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fcode\u002Fswift-testing\u002Freferences\u002Ffundamentals.md",{"path":95,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":96,"sourceHtmlUrl":97},"references\u002Fisolation-and-parallelism.md",3419,"https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fcode\u002Fswift-testing\u002Freferences\u002Fisolation-and-parallelism.md",{"path":99,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":100,"sourceHtmlUrl":101},"references\u002Fmigrating-from-xctest.md",4615,"https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fcode\u002Fswift-testing\u002Freferences\u002Fmigrating-from-xctest.md",{"path":103,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":104,"sourceHtmlUrl":105},"references\u002Fnew-features.md",3817,"https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fcode\u002Fswift-testing\u002Freferences\u002Fnew-features.md",{"path":107,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":108,"sourceHtmlUrl":109},"references\u002Fparameterized.md",2958,"https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fcode\u002Fswift-testing\u002Freferences\u002Fparameterized.md",{"path":111,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":112,"sourceHtmlUrl":113},"references\u002Ftesting-app-code.md",7155,"https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fcode\u002Fswift-testing\u002Freferences\u002Ftesting-app-code.md",{"path":115,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":116,"sourceHtmlUrl":117},"references\u002Ftraits-and-tags.md",2403,"https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fcode\u002Fswift-testing\u002Freferences\u002Ftraits-and-tags.md",[119,143,168,195,217,235],{"skillNo":120,"name":121,"nameZh":6,"description":122,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":123,"categories":124,"keywords":125,"publishedAt":46},"01M6H88J6TYRV9T8RKWW569YM8","to-tickets","Breaks a source into independently-grabbable GitHub tickets. For a code feature the source is the plan (`docs\u002Fplans\u002F\u003Cfeature>.md`, from \u002Fto-plan) and every new or changed symbol lands in exactly one ticket, its signatures copied into the ticket body; a non-code feature is cut from the PRD's slices. Cuts tickets for one feature per run. If a code feature has no approved plan, offers \u002Fto-plan instead of cutting from prose. In a repo that runs command-centre, also emits `[[task]]` blocks into its config; in a plain treepad repo, emits a Batch Manifest instead so the tickets materialise as stacked worktrees.","https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fworkflow\u002Fto-tickets\u002FSKILL.md",[],[126,127,128,129,44,130,131,132,133,134,135,27,136,35,137,138,139,140,141,30,142],"to tickets","tickets","github","run","batch","manifest","plan","repo","command","worktrees","signatures","plans","as","cut","ticket","true","new",{"skillNo":144,"name":145,"nameZh":6,"description":146,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":147,"categories":148,"keywords":152,"publishedAt":46},"01M6H88E98X9KGGYBGSVDS1E8H","to-seams","Records an agreed-but-unlanded cross-repo interface as a seam: the file a consumer's agent gets pasted into its prompt as ground truth, plus the `[[seam]]` block command-centre reads for the retirement pointer. Use when two repos need to build against an interface neither has landed yet — \"record a seam for X\", \"we agreed on this schema, seam it\", \"add a seam so Y can build against Z's new field\". Halts for approval before writing either file.","https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fworkflow\u002Fto-seams\u002FSKILL.md",[149],{"categoryNo":150,"categoryName":151,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[153,45,154,43,133,155,134,156,157,158,159,160,161,138,162,163,164,165,141,166,30,167,29,142],"to seams","repos","prompt","use","schema","build","but","either","record","records","it","block","interface","can","neither",{"skillNo":169,"name":170,"nameZh":6,"description":171,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":172,"categories":173,"keywords":179,"publishedAt":46},"01M6H889PSQM2E1ATS2JC10QRV","to-roadmap","Prioritises settled features into a Now \u002F Next \u002F Later kanban board, rendered as a self-contained .\u002Fideas\u002Froadmap.html. Each card is a feature, not a ticket — one card later becomes several tickets via \u002Fto-prd -> \u002Fto-plan -> \u002Fto-tickets. Boards the features in .\u002Fdocs\u002Fapproach.md, or the \"## Accepted ideas\" in .\u002Fideas\u002FCONTEXT.md when there is no approach doc. The approach doc is settled truth: this assigns tiers and reasons about ordering, it never re-litigates what was decided.","https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fworkflow\u002Fto-roadmap\u002FSKILL.md",[174],{"categoryNo":175,"categoryName":176,"taxonomyType":177,"taxonomyTypeDesc":178},"01JBSEEDCAT000000000000031","产品经理","PROFESSION","适用职业",[180,181,182,132,183,184,185,186,187,188,35,138,140,189,190,127,191,192,193,141,194,29],"roadmap","to roadmap","doc","board","never","later","next","self","ideas","via","card","now","about","re","features",{"skillNo":196,"name":197,"nameZh":6,"description":198,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":199,"categories":200,"keywords":202,"publishedAt":46},"01M6H885QAK839Q771ZBKBK1KA","to-prd","Turns one feature idea into a PRD built on journeys: a one-line problem, journeys (each ending in an observable state) and delivery slices that say what is usable after each. Interviews, explores the codebase, and saves to docs\u002Fprds\u002F\u003Cfeature>.md. Covers exactly one feature: given a multi-feature source, ask which one. Reads any approach doc or ideate report as priors so it doesn't re-ask what's settled, but needs none. Starts the per-feature spine (\u002Fto-prd -> \u002Fto-plan -> \u002Fto-tickets).","https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fworkflow\u002Fto-prd\u002FSKILL.md",[201],{"categoryNo":175,"categoryName":176,"taxonomyType":177,"taxonomyTypeDesc":178},[203,204,205,206,132,207,208,209,35,138,210,211,127,212,213,214,193,141,215,216],"to prd","prd","report","state","ask","say","delivery","line","problem","spine","multi","interviews","which","codebase",{"skillNo":218,"name":219,"nameZh":6,"description":220,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":221,"categories":222,"keywords":223,"publishedAt":46},"01M6H881QEEP49HPBMDYDFJQP9","to-plan","Turns one feature's PRD into a skimmable plan in docs\u002Fplans\u002F\u003Cfeature>.md: a short overview, then per phase a glossary, the journeys it satisfies, and its new and modified definitions (types, enums, ports, schema), with the project:\u003Cslug> label. No code, branch or PR; the user's review of the file is the gate. Use for \"plan this feature\", \"write the contract\", \"what are the types\". One feature per run. Slash-only.","https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fworkflow\u002Fto-plan\u002FSKILL.md",[],[132,224,225,44,43,226,227,228,229,230,156,157,231,37,232,35,137,233,141,30,234,142],"to plan","pr","ports","glossary","branch","short","overview","only","contract","types","\u003Cslug>",{"skillNo":236,"name":237,"nameZh":6,"description":238,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":239,"categories":240,"keywords":241,"publishedAt":46},"01M6H87XEQEXSGT0PR5QWQZZ5P","ticket-tracker","Use when the request is about the *current state* of GitHub issues rather than creating new ones: \"where are my tickets\", \"show the board\", \"what's in progress\", \"what's ready to pick up\", \"move issue N to in-review\", \"mark N done\", \"update the ticket status\". Live triage board over GitHub issues via the gh CLI, moving each between backlog -> ready -> in-progress -> in-review -> done using status labels. This is the ticket-level board; .\u002Fideas\u002Froadmap.html is the feature-level one. To file new tickets, use \u002Fto-tickets, file-issue for a single ad-hoc one, or \u002Fsweep for a batch of small fixes.","https:\u002F\u002Fgithub.com\u002FO-Marsters-1997\u002Fmy-claude-code\u002Fblob\u002Fmain\u002Fskills\u002Fworkflow\u002Fticket-tracker\u002FSKILL.md",[],[242,140,243,244,245,246,247,248,130,43,249,250,156,251,180,252,253,254,255,188,35,256,257,30,258,259,260,29,142],"tracker","ticket tracker","review","cli","current state","update","issues","gh","pick","ready","up","show","done","backlog","progress","move","fixes","labels","request"]