{
  "id": "swiftui-swift-test-ci",
  "type": "loadout",
  "title": "SwiftUI with a Swift package core tested by swift test in CI",
  "summary": "SwiftUI screens as thin views over @Observable view models in a Swift package, tested with Swift Testing by swift test on Linux and macOS CI.",
  "description": "Agents writing SwiftUI put the logic in body, where nothing can test it, and then claim the feature works because Xcode built. This loadout gives your agent a structure that can be tested. Each screen's state, validation and side effects live in a main-actor @Observable view model inside a local Swift package. The network and clock come in through Sendable protocols, so tests swap in actor fakes. The SwiftUI view stays thin and sits behind canImport(SwiftUI), so the package builds and tests on Linux too. A cheap Linux CI job runs swift format lint and swift test in the Swift 6.4.1 container. A macOS job builds the views for the iOS simulator. The verifier runs the full example in the Swift 6 language mode on Swift 6.4.1: six tests and nine cases pass. It also checks that a swallowed error fails the tests and that a main-actor violation fails the build.\n",
  "highlights": [
    "@MainActor @Observable view model with enum state and no SwiftUI import",
    "Injected Sendable client and clock; actor fakes in tests",
    "Swift Testing with parameterised cases instead of XCTest copies",
    "Linux CI runs swift test; macOS CI compiles the views for the simulator",
    "Verified on Swift 6.4.1 in the Swift 6 language mode"
  ],
  "version": "1.0.0",
  "license": "MIT",
  "author": {
    "name": "Agent Loadout",
    "url": "https://loadout.jnw-it.com"
  },
  "credits": [
    {
      "title": "Swift Testing documentation",
      "url": "https://developer.apple.com/documentation/testing"
    },
    {
      "title": "Apple: Managing model data in your app (Observation)",
      "url": "https://developer.apple.com/documentation/swiftui/managing-model-data-in-your-app"
    },
    {
      "title": "Swift.org: migrating to Swift 6 (data-race safety)",
      "url": "https://www.swift.org/migration/documentation/migrationguide/"
    },
    {
      "title": "swiftlang/swift-format",
      "url": "https://github.com/swiftlang/swift-format"
    },
    {
      "title": "Swift official Docker images",
      "url": "https://hub.docker.com/_/swift"
    }
  ],
  "categories": [
    "web-app",
    "workflow"
  ],
  "stacks": [
    "swift",
    "swiftui",
    "ios",
    "github-actions"
  ],
  "files": [
    {
      "path": "AGENTS.md",
      "role": "instructions",
      "description": "Rules for a SwiftUI app whose view models live in a Swift package tested by swift test.",
      "skill": null,
      "agent": null,
      "install_to": {
        "claude-code": "AGENTS.md",
        "codex": "AGENTS.md",
        "cursor": "AGENTS.md",
        "gemini-cli": "AGENTS.md",
        "antigravity-cli": "AGENTS.md",
        "copilot": "AGENTS.md"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/AGENTS.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/latest/AGENTS.md",
      "bytes": 1648,
      "lang": "markdown",
      "content": "# AGENTS.md: SwiftUI app with a tested Swift package core\n\nAn iOS and macOS app in SwiftUI. Screens are thin views over `@Observable` view models that live in a local Swift\npackage (`Packages/`), built in the Swift 6 language mode and tested with Swift Testing. Check `Package.swift` for\ntools version and platforms before using an API.\n\n## Commands (run in the package folder)\n- Lint: `swift format lint --strict --recursive Sources Tests Package.swift`. Fix: `swift format --in-place --recursive Sources Tests`.\n- Build and test: `swift build --build-tests` then `swift test --parallel`. This works on Linux and macOS.\n- Views (macOS only): `xcodebuild -scheme <Package> -destination 'generic/platform=iOS Simulator' build`.\n- Done means: lint clean, `swift test` green with a test for the behaviour you changed, and the summary says\n  whether the views were compiled.\n\n## Rules\n- Use the `swiftui-testable-feature` skill when adding a screen or changing view logic.\n- View models are `@MainActor @Observable final class` with `private(set)` state and no SwiftUI import.\n  Logic lives there, not in `body`.\n- Side effects (network, disk, clock) go through `Sendable` protocols injected in `init`. Tests use actor fakes.\n- New tests use Swift Testing (`@Test`, `#expect`), with `arguments:` for input tables.\n- Fix strict concurrency errors properly. Never add `@unchecked Sendable`, `nonisolated(unsafe)` or\n  `@preconcurrency` to silence them.\n- No force unwraps or `try!` outside tests. No new package dependencies without saying so.\n- Do not change signing, entitlements, bundle identifiers or the Xcode project's build settings unless asked.\n"
    },
    {
      "path": "CLAUDE.md",
      "role": "adapter",
      "description": "Imports AGENTS.md for Claude Code.",
      "skill": null,
      "agent": "claude-code",
      "install_to": {
        "claude-code": "CLAUDE.md",
        "codex": null,
        "cursor": null,
        "gemini-cli": null,
        "antigravity-cli": null,
        "copilot": null
      },
      "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/CLAUDE.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/latest/CLAUDE.md",
      "bytes": 427,
      "lang": "markdown",
      "content": "# CLAUDE.md\n\n@AGENTS.md\n\n## Claude Code notes\n\n- Skills from this loadout live in `.claude/skills/`: `swiftui-testable-feature`. Use them when their description matches the task.\n- Follow AGENTS.md above; where this file and AGENTS.md disagree, AGENTS.md wins.\n\n<!-- From the Agent Loadout \"SwiftUI with a Swift package core tested by swift test in CI\" v1.0.0 — https://loadout.jnw-it.com/loadouts/swiftui-swift-test-ci/ -->\n"
    },
    {
      "path": "GEMINI.md",
      "role": "adapter",
      "description": "Imports AGENTS.md for Gemini CLI.",
      "skill": null,
      "agent": "gemini-cli",
      "install_to": {
        "claude-code": null,
        "codex": null,
        "cursor": null,
        "gemini-cli": "GEMINI.md",
        "antigravity-cli": null,
        "copilot": null
      },
      "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/GEMINI.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/latest/GEMINI.md",
      "bytes": 428,
      "lang": "markdown",
      "content": "# GEMINI.md\n\n@./AGENTS.md\n\n## Gemini CLI notes\n\n- Skills from this loadout live in `.agents/skills/`: `swiftui-testable-feature`. Use them when their description matches the task.\n- Follow AGENTS.md above; where this file and AGENTS.md disagree, AGENTS.md wins.\n\n<!-- From the Agent Loadout \"SwiftUI with a Swift package core tested by swift test in CI\" v1.0.0 — https://loadout.jnw-it.com/loadouts/swiftui-swift-test-ci/ -->\n"
    },
    {
      "path": "skills/swiftui-testable-feature/SKILL.md",
      "role": "skill",
      "description": "Layout, view model and view rules, tests and commands.",
      "skill": "swiftui-testable-feature",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/swiftui-testable-feature/SKILL.md",
        "codex": ".agents/skills/swiftui-testable-feature/SKILL.md",
        "cursor": ".agents/skills/swiftui-testable-feature/SKILL.md",
        "gemini-cli": ".agents/skills/swiftui-testable-feature/SKILL.md",
        "antigravity-cli": ".agents/skills/swiftui-testable-feature/SKILL.md",
        "copilot": ".agents/skills/swiftui-testable-feature/SKILL.md"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/SKILL.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/latest/skills/swiftui-testable-feature/SKILL.md",
      "bytes": 3739,
      "lang": "markdown",
      "content": "---\nname: swiftui-testable-feature\ndescription: Build a SwiftUI feature with its state and logic in a Swift package view model that swift test covers on Linux and macOS, with a thin view on top. Use when adding a screen, changing view logic, or writing Swift tests.\n---\n\n# SwiftUI feature with a testable core\n\nSwiftUI views are hard to test and only build on Apple platforms. So the view stays thin, and everything worth\ntesting lives in an `@Observable` view model inside a Swift package that builds and tests anywhere, including\na cheap Linux CI runner.\n\n## Layout\n\n```\nPackages/NotesCore/\n  Package.swift                      swift-tools-version 6.2, Swift 6 language mode\n  Sources/NotesCore/Note.swift       value types + the client protocol (Sendable)\n  Sources/NotesCore/NotesModel.swift @MainActor @Observable view model, no SwiftUI import\n  Sources/NotesCore/NotesView.swift  the view, wrapped in #if canImport(SwiftUI)\n  Tests/NotesCoreTests/...           Swift Testing (@Suite, @Test, #expect)\n```\n\nThe app target (Xcode project) depends on the package and only creates the model with the real client.\n\n## Rules for the view model\n\n- `@MainActor @Observable final class`, with `private(set)` state. The view reads it and calls methods.\n- State is an enum (`idle`, `loading`, `loaded`, `failed(message)`), not several booleans that can disagree.\n- Every side effect goes through a `Sendable` protocol passed into `init` (network, disk, clock). Time comes\n  from an injected `now` closure, so tests are deterministic.\n- Derived values (sorting, filtering, validation) are computed properties or methods on the model, not code\n  in `body`.\n- Errors become a user-facing message in state. Never swallow them into an empty list.\n- No `import SwiftUI`, `UIKit` or `AppKit` in the model file.\n\n## Rules for the view\n\n- Wrap the file in `#if canImport(SwiftUI)` so the package still builds on Linux.\n- Own the model with `@State`, pass it down as a plain property, bind with `$model.field`.\n- Load in `.task { await model.load() }`, refresh with `.refreshable`.\n- No business logic in the view: if you want to test it, move it into the model.\n\n## Tests\n\n- Swift Testing, not XCTest, for new tests: `@Suite`, `@Test(\"sentence\")`, `#expect`, and\n  `#expect(throws:)`. Use `arguments:` for tables of inputs instead of copy-pasted tests.\n- Mark the suite `@MainActor` to call the model directly.\n- Fakes are `actor`s that implement the client protocol and record calls. No mocking frameworks.\n- Each behaviour has a test: happy path, each error, edge input (blank, too long, whitespace), and that\n  invalid input never reaches the client.\n\n## Commands (from the package folder)\n\n```bash\nswift format lint --strict --recursive Sources Tests Package.swift   # config: references/swift-format.json as .swift-format\nswift build --build-tests\nswift test --parallel\n```\n\nOn a Mac, also build for the simulator so the views compile:\n`xcodebuild -scheme NotesCore -destination 'generic/platform=iOS Simulator' build`.\nCI runs both (see `references/swift-ci.yml`): Linux in the `swift:6.4.1-noble` container, macOS with Xcode 26.6.\n\n## Done means\n\n- Lint is clean and `swift test` passes, with a new or changed `@Test` for the behaviour you touched.\n- Strict concurrency errors are fixed, not silenced: no `@unchecked Sendable`, `nonisolated(unsafe)` or\n  `@preconcurrency` added to get a build through.\n- The summary says whether the views were built on macOS or only the core was tested on Linux.\n\n## References\n\n`references/Package.swift`, `references/Note.swift`, `references/NotesModel.swift`,\n`references/NotesView.swift`, `references/NotesModelTests.swift` (six tests, nine cases),\n`references/swift-format.json`, `references/swift-ci.yml`.\n"
    },
    {
      "path": "skills/swiftui-testable-feature/references/Package.swift",
      "role": "reference",
      "description": "Swift 6 language mode package for iOS 18 and macOS 15.",
      "skill": "swiftui-testable-feature",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/swiftui-testable-feature/references/Package.swift",
        "codex": ".agents/skills/swiftui-testable-feature/references/Package.swift",
        "cursor": ".agents/skills/swiftui-testable-feature/references/Package.swift",
        "gemini-cli": ".agents/skills/swiftui-testable-feature/references/Package.swift",
        "antigravity-cli": ".agents/skills/swiftui-testable-feature/references/Package.swift",
        "copilot": ".agents/skills/swiftui-testable-feature/references/Package.swift"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/Package.swift",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/latest/skills/swiftui-testable-feature/references/Package.swift",
      "bytes": 391,
      "lang": "markdown",
      "content": "// swift-tools-version: 6.2\nimport PackageDescription\n\nlet package = Package(\n    name: \"NotesCore\",\n    platforms: [.iOS(.v18), .macOS(.v15)],\n    products: [\n        .library(name: \"NotesCore\", targets: [\"NotesCore\"])\n    ],\n    targets: [\n        .target(name: \"NotesCore\"),\n        .testTarget(name: \"NotesCoreTests\", dependencies: [\"NotesCore\"]),\n    ],\n    swiftLanguageModes: [.v6]\n)\n"
    },
    {
      "path": "skills/swiftui-testable-feature/references/Note.swift",
      "role": "reference",
      "description": "Value type, client protocol and errors.",
      "skill": "swiftui-testable-feature",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/swiftui-testable-feature/references/Note.swift",
        "codex": ".agents/skills/swiftui-testable-feature/references/Note.swift",
        "cursor": ".agents/skills/swiftui-testable-feature/references/Note.swift",
        "gemini-cli": ".agents/skills/swiftui-testable-feature/references/Note.swift",
        "antigravity-cli": ".agents/skills/swiftui-testable-feature/references/Note.swift",
        "copilot": ".agents/skills/swiftui-testable-feature/references/Note.swift"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/Note.swift",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/latest/skills/swiftui-testable-feature/references/Note.swift",
      "bytes": 737,
      "lang": "markdown",
      "content": "import Foundation\n\npublic struct Note: Identifiable, Equatable, Sendable, Codable {\n    public let id: UUID\n    public var title: String\n    public var body: String\n    public var updatedAt: Date\n\n    public init(id: UUID = UUID(), title: String, body: String, updatedAt: Date) {\n        self.id = id\n        self.title = title\n        self.body = body\n        self.updatedAt = updatedAt\n    }\n}\n\n/// The only way the view model reaches the network or disk. Tests pass a fake.\npublic protocol NotesClient: Sendable {\n    func fetchNotes() async throws -> [Note]\n    func save(_ note: Note) async throws -> Note\n}\n\npublic enum NotesError: Error, Equatable, Sendable {\n    case offline\n    case server(status: Int)\n    case invalidTitle\n}\n"
    },
    {
      "path": "skills/swiftui-testable-feature/references/NotesModel.swift",
      "role": "reference",
      "description": "@MainActor @Observable view model.",
      "skill": "swiftui-testable-feature",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/swiftui-testable-feature/references/NotesModel.swift",
        "codex": ".agents/skills/swiftui-testable-feature/references/NotesModel.swift",
        "cursor": ".agents/skills/swiftui-testable-feature/references/NotesModel.swift",
        "gemini-cli": ".agents/skills/swiftui-testable-feature/references/NotesModel.swift",
        "antigravity-cli": ".agents/skills/swiftui-testable-feature/references/NotesModel.swift",
        "copilot": ".agents/skills/swiftui-testable-feature/references/NotesModel.swift"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/NotesModel.swift",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/latest/skills/swiftui-testable-feature/references/NotesModel.swift",
      "bytes": 2517,
      "lang": "markdown",
      "content": "import Foundation\nimport Observation\n\n/// View state for the notes screen. Owns no SwiftUI types, so it builds and tests on Linux.\n@MainActor\n@Observable\npublic final class NotesModel {\n    public enum State: Equatable {\n        case idle\n        case loading\n        case loaded([Note])\n        case failed(String)\n    }\n\n    public private(set) var state: State = .idle\n    public var searchText = \"\"\n\n    private let client: any NotesClient\n    private let now: @Sendable () -> Date\n\n    public init(client: any NotesClient, now: @escaping @Sendable () -> Date = Date.init) {\n        self.client = client\n        self.now = now\n    }\n\n    /// Notes to show: newest first, filtered by the search text (title or body, case-insensitive).\n    public var visibleNotes: [Note] {\n        guard case .loaded(let notes) = state else { return [] }\n        let query = searchText.trimmingCharacters(in: .whitespacesAndNewlines)\n        let filtered =\n            query.isEmpty\n            ? notes\n            : notes.filter { $0.title.localizedCaseInsensitiveContains(query) || $0.body.localizedCaseInsensitiveContains(query) }\n        return filtered.sorted { $0.updatedAt > $1.updatedAt }\n    }\n\n    public func load() async {\n        if case .loading = state { return }\n        state = .loading\n        do {\n            state = .loaded(try await client.fetchNotes())\n        } catch {\n            state = .failed(Self.message(for: error))\n        }\n    }\n\n    /// Validates, saves through the client, and replaces or appends the saved note.\n    public func save(title: String, body: String, id: UUID? = nil) async throws {\n        let trimmed = title.trimmingCharacters(in: .whitespacesAndNewlines)\n        guard !trimmed.isEmpty, trimmed.count <= 120 else { throw NotesError.invalidTitle }\n        let saved = try await client.save(Note(id: id ?? UUID(), title: trimmed, body: body, updatedAt: now()))\n        guard case .loaded(var notes) = state else {\n            state = .loaded([saved])\n            return\n        }\n        if let index = notes.firstIndex(where: { $0.id == saved.id }) {\n            notes[index] = saved\n        } else {\n            notes.append(saved)\n        }\n        state = .loaded(notes)\n    }\n\n    static func message(for error: any Error) -> String {\n        switch error {\n        case NotesError.offline: \"You're offline. Pull to try again.\"\n        case NotesError.server(let status): \"The server returned an error (\\(status)).\"\n        default: \"Something went wrong.\"\n        }\n    }\n}\n"
    },
    {
      "path": "skills/swiftui-testable-feature/references/NotesView.swift",
      "role": "reference",
      "description": "Thin SwiftUI view behind canImport(SwiftUI).",
      "skill": "swiftui-testable-feature",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/swiftui-testable-feature/references/NotesView.swift",
        "codex": ".agents/skills/swiftui-testable-feature/references/NotesView.swift",
        "cursor": ".agents/skills/swiftui-testable-feature/references/NotesView.swift",
        "gemini-cli": ".agents/skills/swiftui-testable-feature/references/NotesView.swift",
        "antigravity-cli": ".agents/skills/swiftui-testable-feature/references/NotesView.swift",
        "copilot": ".agents/skills/swiftui-testable-feature/references/NotesView.swift"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/NotesView.swift",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/latest/skills/swiftui-testable-feature/references/NotesView.swift",
      "bytes": 1157,
      "lang": "markdown",
      "content": "#if canImport(SwiftUI)\nimport SwiftUI\n\n/// Thin view: reads model state, forwards user intent. No logic worth testing lives here.\npublic struct NotesView: View {\n    @State private var model: NotesModel\n\n    public init(model: NotesModel) {\n        _model = State(initialValue: model)\n    }\n\n    public var body: some View {\n        NavigationStack {\n            content\n                .navigationTitle(\"Notes\")\n                .searchable(text: $model.searchText)\n                .refreshable { await model.load() }\n                .task { await model.load() }\n        }\n    }\n\n    @ViewBuilder private var content: some View {\n        switch model.state {\n        case .idle, .loading:\n            ProgressView()\n        case .failed(let message):\n            ContentUnavailableView(\"Couldn't load notes\", systemImage: \"wifi.slash\", description: Text(message))\n        case .loaded:\n            List(model.visibleNotes) { note in\n                VStack(alignment: .leading) {\n                    Text(note.title).font(.headline)\n                    Text(note.body).font(.subheadline).lineLimit(2)\n                }\n            }\n        }\n    }\n}\n#endif\n"
    },
    {
      "path": "skills/swiftui-testable-feature/references/NotesModelTests.swift",
      "role": "reference",
      "description": "Swift Testing suite with actor fakes.",
      "skill": "swiftui-testable-feature",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/swiftui-testable-feature/references/NotesModelTests.swift",
        "codex": ".agents/skills/swiftui-testable-feature/references/NotesModelTests.swift",
        "cursor": ".agents/skills/swiftui-testable-feature/references/NotesModelTests.swift",
        "gemini-cli": ".agents/skills/swiftui-testable-feature/references/NotesModelTests.swift",
        "antigravity-cli": ".agents/skills/swiftui-testable-feature/references/NotesModelTests.swift",
        "copilot": ".agents/skills/swiftui-testable-feature/references/NotesModelTests.swift"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/NotesModelTests.swift",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/latest/skills/swiftui-testable-feature/references/NotesModelTests.swift",
      "bytes": 3818,
      "lang": "markdown",
      "content": "import Foundation\nimport Testing\n\n@testable import NotesCore\n\n/// Fake client: canned results, records saves. An actor, so it is Sendable without locks.\nactor FakeNotesClient: NotesClient {\n    var notes: [Note]\n    var fetchError: NotesError?\n    private(set) var saved: [Note] = []\n\n    init(notes: [Note] = [], fetchError: NotesError? = nil) {\n        self.notes = notes\n        self.fetchError = fetchError\n    }\n\n    func fetchNotes() async throws -> [Note] {\n        if let fetchError { throw fetchError }\n        return notes\n    }\n\n    func save(_ note: Note) async throws -> Note {\n        saved.append(note)\n        return note\n    }\n}\n\nlet day: TimeInterval = 86_400\nlet fixed = Date(timeIntervalSince1970: 1_790_000_000)\n\nfunc note(_ title: String, _ body: String = \"\", daysAgo: Double) -> Note {\n    Note(title: title, body: body, updatedAt: fixed.addingTimeInterval(-daysAgo * day))\n}\n\n@MainActor\n@Suite(\"NotesModel\")\nstruct NotesModelTests {\n    @Test(\"load shows notes newest first\")\n    func loadSortsNewestFirst() async {\n        let client = FakeNotesClient(notes: [note(\"Old\", daysAgo: 3), note(\"New\", daysAgo: 0), note(\"Mid\", daysAgo: 1)])\n        let model = NotesModel(client: client, now: { fixed })\n        await model.load()\n        #expect(model.visibleNotes.map(\\.title) == [\"New\", \"Mid\", \"Old\"])\n    }\n\n    @Test(\n        \"a failed load shows a message, not an empty list\",\n        arguments: [\n            (NotesError.offline, \"You're offline. Pull to try again.\"),\n            (NotesError.server(status: 503), \"The server returned an error (503).\"),\n        ])\n    func loadFailure(error: NotesError, message: String) async {\n        let model = NotesModel(client: FakeNotesClient(fetchError: error), now: { fixed })\n        await model.load()\n        #expect(model.state == .failed(message))\n        #expect(model.visibleNotes.isEmpty)\n    }\n\n    @Test(\"search matches title or body, case-insensitively, ignoring spaces\")\n    func search() async {\n        let client = FakeNotesClient(notes: [\n            note(\"Groceries\", \"milk, eggs\", daysAgo: 0), note(\"Ideas\", \"Buy MILK frother\", daysAgo: 1), note(\"Trip\", daysAgo: 2),\n        ])\n        let model = NotesModel(client: client, now: { fixed })\n        await model.load()\n        model.searchText = \"  milk \"\n        #expect(model.visibleNotes.map(\\.title) == [\"Groceries\", \"Ideas\"])\n    }\n\n    @Test(\"save trims the title, stamps the time and appends\")\n    func saveAppends() async throws {\n        let client = FakeNotesClient(notes: [note(\"First\", daysAgo: 1)])\n        let model = NotesModel(client: client, now: { fixed })\n        await model.load()\n        try await model.save(title: \"  Second  \", body: \"b\")\n        #expect(model.visibleNotes.map(\\.title) == [\"Second\", \"First\"])\n        let saved = await client.saved\n        #expect(saved.count == 1)\n        #expect(saved.first?.updatedAt == fixed)\n    }\n\n    @Test(\"save with an existing id replaces that note\")\n    func saveReplaces() async throws {\n        let existing = note(\"Draft\", daysAgo: 2)\n        let model = NotesModel(client: FakeNotesClient(notes: [existing]), now: { fixed })\n        await model.load()\n        try await model.save(title: \"Final\", body: \"done\", id: existing.id)\n        #expect(model.visibleNotes.count == 1)\n        #expect(model.visibleNotes.first?.title == \"Final\")\n    }\n\n    @Test(\"blank or over-long titles are rejected before the client is called\", arguments: [\"\", \"   \", String(repeating: \"x\", count: 121)])\n    func invalidTitle(title: String) async {\n        let client = FakeNotesClient()\n        let model = NotesModel(client: client, now: { fixed })\n        await #expect(throws: NotesError.invalidTitle) {\n            try await model.save(title: title, body: \"\")\n        }\n        #expect(await client.saved.isEmpty)\n    }\n}\n"
    },
    {
      "path": "skills/swiftui-testable-feature/references/swift-format.json",
      "role": "reference",
      "description": "swift-format config, saved as .swift-format.",
      "skill": "swiftui-testable-feature",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/swiftui-testable-feature/references/swift-format.json",
        "codex": ".agents/skills/swiftui-testable-feature/references/swift-format.json",
        "cursor": ".agents/skills/swiftui-testable-feature/references/swift-format.json",
        "gemini-cli": ".agents/skills/swiftui-testable-feature/references/swift-format.json",
        "antigravity-cli": ".agents/skills/swiftui-testable-feature/references/swift-format.json",
        "copilot": ".agents/skills/swiftui-testable-feature/references/swift-format.json"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/swift-format.json",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/latest/skills/swiftui-testable-feature/references/swift-format.json",
      "bytes": 373,
      "lang": "json",
      "content": "{\n  \"version\": 1,\n  \"indentation\": { \"spaces\": 4 },\n  \"lineLength\": 140,\n  \"indentConditionalCompilationBlocks\": false,\n  \"rules\": {\n    \"AllPublicDeclarationsHaveDocumentation\": false,\n    \"NeverForceUnwrap\": true,\n    \"NeverUseForceTry\": true,\n    \"NeverUseImplicitlyUnwrappedOptionals\": true,\n    \"OrderedImports\": true,\n    \"UseLetInEveryBoundCaseVariable\": true\n  }\n}\n"
    },
    {
      "path": "skills/swiftui-testable-feature/references/swift-ci.yml",
      "role": "reference",
      "description": "Linux swift test job and macOS simulator build job.",
      "skill": "swiftui-testable-feature",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/swiftui-testable-feature/references/swift-ci.yml",
        "codex": ".agents/skills/swiftui-testable-feature/references/swift-ci.yml",
        "cursor": ".agents/skills/swiftui-testable-feature/references/swift-ci.yml",
        "gemini-cli": ".agents/skills/swiftui-testable-feature/references/swift-ci.yml",
        "antigravity-cli": ".agents/skills/swiftui-testable-feature/references/swift-ci.yml",
        "copilot": ".agents/skills/swiftui-testable-feature/references/swift-ci.yml"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/swift-ci.yml",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/latest/skills/swiftui-testable-feature/references/swift-ci.yml",
      "bytes": 1132,
      "lang": "yaml",
      "content": "# .github/workflows/swift.yml\n# Linux: format lint and swift test for the core package (fast, cheap, no Xcode).\n# macOS: build the package for macOS and the iOS simulator, so the SwiftUI views compile too.\nname: Swift\n\non:\n  push:\n    branches: [main]\n  pull_request:\n\npermissions:\n  contents: read\n\njobs:\n  linux:\n    runs-on: ubuntu-24.04\n    container: swift:6.4.1-noble\n    timeout-minutes: 15\n    defaults:\n      run:\n        working-directory: Packages/NotesCore\n    steps:\n      - uses: actions/checkout@v7\n      - run: swift format lint --strict --recursive Sources Tests Package.swift\n      - run: swift build --build-tests\n      - run: swift test --parallel\n\n  macos:\n    runs-on: macos-26\n    timeout-minutes: 30\n    defaults:\n      run:\n        working-directory: Packages/NotesCore\n    steps:\n      - uses: actions/checkout@v7\n      - run: sudo xcode-select -s /Applications/Xcode_26.6.app\n      - run: swift test --parallel\n      - name: Build for the iOS simulator (compiles the SwiftUI views)\n        run: xcodebuild -scheme NotesCore -destination 'generic/platform=iOS Simulator' -skipPackagePluginValidation build\n"
    }
  ],
  "requires": {
    "tools": [
      "swift"
    ],
    "env": [],
    "mcp": []
  },
  "tested": {
    "status": "untested",
    "last_run": null,
    "fixture": null,
    "per_agent": {
      "claude-code": "untested",
      "codex": "untested",
      "cursor": "untested",
      "gemini-cli": "untested",
      "antigravity-cli": "untested",
      "copilot": "untested"
    }
  },
  "security": {
    "scanned": true,
    "scanner": "intake-precheck/1",
    "verdict": "clean",
    "network": false,
    "scripts": [],
    "notes": "No dependencies beyond the Swift toolchain and Foundation. Tests use in-memory actor fakes and make no network calls."
  },
  "featured": false,
  "deprecated": false,
  "last_checked": "2026-10-17",
  "published": "2026-10-17",
  "updated": "2026-10-17",
  "compatibility": {
    "claude-code": "native",
    "codex": "native",
    "cursor": "native",
    "gemini-cli": "native",
    "antigravity-cli": "native",
    "copilot": "native"
  },
  "counts": {
    "rules": 1,
    "skills": 1,
    "mcp": 0
  },
  "url": "https://loadout.jnw-it.com/loadouts/swiftui-swift-test-ci/",
  "api_url": "https://loadout.jnw-it.com/api/loadouts/swiftui-swift-test-ci.json",
  "verification": {
    "level": "verified-install",
    "status": "verified",
    "label": "Verified install",
    "verified": true,
    "checked_at": "2026-10-17T20:59:33Z",
    "commit": "08c3710727a4d6fc320a98ecf32bdc0a780eaa6c",
    "content_current": true,
    "agent_tests": "not-run",
    "counts": {
      "pass": 9,
      "fail": 0,
      "skip": 0,
      "not_applicable": 1
    },
    "meaning": "Level 1: automated checks on the files (parse, install paths, MCP config, safety scan, references, size, licence, starter build). No AI agent was run.",
    "checks": [
      {
        "id": "listing",
        "name": "Listing",
        "status": "pass",
        "summary": "Schema valid; 11 files declared, none missing or extra",
        "details": [
          "tested.status: untested (agent tests are separate from Level 1)"
        ]
      },
      {
        "id": "parse",
        "name": "Files parse",
        "status": "pass",
        "summary": "All 11 files parse; front matter valid",
        "details": []
      },
      {
        "id": "adapters",
        "name": "Adapters",
        "status": "pass",
        "summary": "CLAUDE.md and GEMINI.md import AGENTS.md and are up to date",
        "details": [
          "CLAUDE.md: matches the generator",
          "GEMINI.md: matches the generator"
        ]
      },
      {
        "id": "install-paths",
        "name": "Install paths",
        "status": "pass",
        "summary": "Correct paths for all 6 agents; layouts re-discovered",
        "details": [
          "Claude Code: 10 files, 1 skill in .claude/skills/",
          "Codex CLI: 9 files, 1 skill in .agents/skills/",
          "Cursor: 9 files, 1 skill in .agents/skills/",
          "Gemini CLI: 10 files, 1 skill in .agents/skills/",
          "Antigravity CLI: 9 files, 1 skill in .agents/skills/",
          "GitHub Copilot: 9 files, 1 skill in .agents/skills/"
        ]
      },
      {
        "id": "mcp",
        "name": "MCP config",
        "status": "n/a",
        "summary": "No MCP servers in this loadout",
        "details": []
      },
      {
        "id": "safety",
        "name": "Safety scan",
        "status": "pass",
        "summary": "Clean: no credentials, risky shell or hidden text",
        "details": [
          "Scanner intake-precheck/1: verdict clean; network no (listing says no)"
        ]
      },
      {
        "id": "references",
        "name": "References",
        "status": "pass",
        "summary": "3 references between files resolve for every agent",
        "details": []
      },
      {
        "id": "size",
        "name": "Size limits",
        "status": "pass",
        "summary": "11 files, 16.0 KB total; largest skills/swiftui-testable-feature/references/NotesModelTests.swift 3.7 KB",
        "details": [
          "Limits: 30 files, 32 KB per file, 128 KB total, 500 lines per skill or rule"
        ]
      },
      {
        "id": "licence",
        "name": "Licence",
        "status": "pass",
        "summary": "MIT, by Agent Loadout; text in the repository LICENSE",
        "details": []
      },
      {
        "id": "starter-build",
        "name": "Starter build",
        "status": "pass",
        "summary": "The swiftui-testable-feature skill's package (view model, models, #if-guarded SwiftUI view, Swift Testing suite) builds in the Swift 6 language mode and passes swift format lint --strict and swift test (6 tests, 9 cases) on Linux; a swallowed error fails the tests and a main-actor violation fails th",
        "details": [
          "Applied 19 loadout files at every agent's paths",
          "✓ place the skill's package: bash -c R=.agents/skills/swiftui-testable-feature/references; P=Packages/NotesCore; mkdir -p $P/Sources/NotesCore $P/Tests/NotesCoreTests && cp $R/Package.swift $P/ && cp $R/Note.swift $R/NotesModel.swift $R/NotesView.swift $P/Sources/NotesCore/ && cp $R/NotesModelTests.swift $P/Tests/NotesCoreTests/ && cp $R/swift-format.json $P/.swift-format && echo placed",
          "✓ swift format lint --strict: bash -c cd Packages/NotesCore && swift format lint --strict --recursive Sources Tests Package.swift && echo lint clean",
          "✓ swift build --build-tests (Swift 6 language mode): bash -c cd Packages/NotesCore && swift build --build-tests 2>&1",
          "✓ swift test: bash -c cd Packages/NotesCore && swift test --parallel 2>&1",
          "✓ a swallowed load error fails the tests: bash -c rm -rf m && mkdir m && cp -r Packages/NotesCore/Package.swift Packages/NotesCore/Sources Packages/NotesCore/Tests m/ && sed -i 's/            state = .failed(Self.message(for: error))/            state = .loaded([])/' m/Sources/NotesCore/NotesModel.swift && grep -q 'state = .loaded(\\[\\])' m/Sources/NotesCore/NotesModel.swift && cd m && swift test 2>&1; test $? -ne 0 && echo caught",
          "✓ mutating main-actor state from a detached task fails the build: bash -c cd m && cp ../Packages/NotesCore/Sources/NotesCore/NotesModel.swift Sources/NotesCore/ && sed -i 's/^    public func load() async {/    public func refreshInBackground() {\\n        Task.detached { self.state = .loading }\\n    }\\n\\n    public func load() async {/' Sources/NotesCore/NotesModel.swift && grep -q 'Task.detached' Sources/NotesCore/NotesModel.swift && swift build 2>&1; test $? -ne 0 && echo refused",
          "Covers: @MainActor @Observable view model with enum state, injected Sendable client and clock",
          "Covers: SwiftUI view guarded by #if canImport(SwiftUI) so the package builds and tests on Linux",
          "Covers: Swift Testing suite with parameterised cases and actor fakes",
          "Covers: Swift 6 strict concurrency enforced; swift format lint --strict"
        ]
      }
    ]
  },
  "install": {
    "claude-code": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "CLAUDE.md",
          "target": "CLAUDE.md",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/CLAUDE.md",
          "role": "adapter"
        },
        {
          "path": "skills/swiftui-testable-feature/SKILL.md",
          "target": ".claude/skills/swiftui-testable-feature/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/swiftui-testable-feature/references/Package.swift",
          "target": ".claude/skills/swiftui-testable-feature/references/Package.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/Package.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/Note.swift",
          "target": ".claude/skills/swiftui-testable-feature/references/Note.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/Note.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/NotesModel.swift",
          "target": ".claude/skills/swiftui-testable-feature/references/NotesModel.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/NotesModel.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/NotesView.swift",
          "target": ".claude/skills/swiftui-testable-feature/references/NotesView.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/NotesView.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/NotesModelTests.swift",
          "target": ".claude/skills/swiftui-testable-feature/references/NotesModelTests.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/NotesModelTests.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/swift-format.json",
          "target": ".claude/skills/swiftui-testable-feature/references/swift-format.json",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/swift-format.json",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/swift-ci.yml",
          "target": ".claude/skills/swiftui-testable-feature/references/swift-ci.yml",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/swift-ci.yml",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/swiftui-swift-test-ci/claude-code.zip"
    },
    "codex": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/swiftui-testable-feature/SKILL.md",
          "target": ".agents/skills/swiftui-testable-feature/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/swiftui-testable-feature/references/Package.swift",
          "target": ".agents/skills/swiftui-testable-feature/references/Package.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/Package.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/Note.swift",
          "target": ".agents/skills/swiftui-testable-feature/references/Note.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/Note.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/NotesModel.swift",
          "target": ".agents/skills/swiftui-testable-feature/references/NotesModel.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/NotesModel.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/NotesView.swift",
          "target": ".agents/skills/swiftui-testable-feature/references/NotesView.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/NotesView.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/NotesModelTests.swift",
          "target": ".agents/skills/swiftui-testable-feature/references/NotesModelTests.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/NotesModelTests.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/swift-format.json",
          "target": ".agents/skills/swiftui-testable-feature/references/swift-format.json",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/swift-format.json",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/swift-ci.yml",
          "target": ".agents/skills/swiftui-testable-feature/references/swift-ci.yml",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/swift-ci.yml",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/swiftui-swift-test-ci/codex.zip"
    },
    "cursor": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/swiftui-testable-feature/SKILL.md",
          "target": ".agents/skills/swiftui-testable-feature/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/swiftui-testable-feature/references/Package.swift",
          "target": ".agents/skills/swiftui-testable-feature/references/Package.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/Package.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/Note.swift",
          "target": ".agents/skills/swiftui-testable-feature/references/Note.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/Note.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/NotesModel.swift",
          "target": ".agents/skills/swiftui-testable-feature/references/NotesModel.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/NotesModel.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/NotesView.swift",
          "target": ".agents/skills/swiftui-testable-feature/references/NotesView.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/NotesView.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/NotesModelTests.swift",
          "target": ".agents/skills/swiftui-testable-feature/references/NotesModelTests.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/NotesModelTests.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/swift-format.json",
          "target": ".agents/skills/swiftui-testable-feature/references/swift-format.json",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/swift-format.json",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/swift-ci.yml",
          "target": ".agents/skills/swiftui-testable-feature/references/swift-ci.yml",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/swift-ci.yml",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/swiftui-swift-test-ci/cursor.zip"
    },
    "gemini-cli": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "GEMINI.md",
          "target": "GEMINI.md",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/GEMINI.md",
          "role": "adapter"
        },
        {
          "path": "skills/swiftui-testable-feature/SKILL.md",
          "target": ".agents/skills/swiftui-testable-feature/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/swiftui-testable-feature/references/Package.swift",
          "target": ".agents/skills/swiftui-testable-feature/references/Package.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/Package.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/Note.swift",
          "target": ".agents/skills/swiftui-testable-feature/references/Note.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/Note.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/NotesModel.swift",
          "target": ".agents/skills/swiftui-testable-feature/references/NotesModel.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/NotesModel.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/NotesView.swift",
          "target": ".agents/skills/swiftui-testable-feature/references/NotesView.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/NotesView.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/NotesModelTests.swift",
          "target": ".agents/skills/swiftui-testable-feature/references/NotesModelTests.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/NotesModelTests.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/swift-format.json",
          "target": ".agents/skills/swiftui-testable-feature/references/swift-format.json",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/swift-format.json",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/swift-ci.yml",
          "target": ".agents/skills/swiftui-testable-feature/references/swift-ci.yml",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/swift-ci.yml",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/swiftui-swift-test-ci/gemini-cli.zip"
    },
    "antigravity-cli": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/swiftui-testable-feature/SKILL.md",
          "target": ".agents/skills/swiftui-testable-feature/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/swiftui-testable-feature/references/Package.swift",
          "target": ".agents/skills/swiftui-testable-feature/references/Package.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/Package.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/Note.swift",
          "target": ".agents/skills/swiftui-testable-feature/references/Note.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/Note.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/NotesModel.swift",
          "target": ".agents/skills/swiftui-testable-feature/references/NotesModel.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/NotesModel.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/NotesView.swift",
          "target": ".agents/skills/swiftui-testable-feature/references/NotesView.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/NotesView.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/NotesModelTests.swift",
          "target": ".agents/skills/swiftui-testable-feature/references/NotesModelTests.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/NotesModelTests.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/swift-format.json",
          "target": ".agents/skills/swiftui-testable-feature/references/swift-format.json",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/swift-format.json",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/swift-ci.yml",
          "target": ".agents/skills/swiftui-testable-feature/references/swift-ci.yml",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/swift-ci.yml",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/swiftui-swift-test-ci/antigravity-cli.zip"
    },
    "copilot": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/swiftui-testable-feature/SKILL.md",
          "target": ".agents/skills/swiftui-testable-feature/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/swiftui-testable-feature/references/Package.swift",
          "target": ".agents/skills/swiftui-testable-feature/references/Package.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/Package.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/Note.swift",
          "target": ".agents/skills/swiftui-testable-feature/references/Note.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/Note.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/NotesModel.swift",
          "target": ".agents/skills/swiftui-testable-feature/references/NotesModel.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/NotesModel.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/NotesView.swift",
          "target": ".agents/skills/swiftui-testable-feature/references/NotesView.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/NotesView.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/NotesModelTests.swift",
          "target": ".agents/skills/swiftui-testable-feature/references/NotesModelTests.swift",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/NotesModelTests.swift",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/swift-format.json",
          "target": ".agents/skills/swiftui-testable-feature/references/swift-format.json",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/swift-format.json",
          "role": "reference"
        },
        {
          "path": "skills/swiftui-testable-feature/references/swift-ci.yml",
          "target": ".agents/skills/swiftui-testable-feature/references/swift-ci.yml",
          "raw_url": "https://loadout.jnw-it.com/raw/swiftui-swift-test-ci/1.0.0/skills/swiftui-testable-feature/references/swift-ci.yml",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/swiftui-swift-test-ci/copilot.zip"
    }
  },
  "source_zip_url": "https://loadout.jnw-it.com/download/swiftui-swift-test-ci/source.zip"
}