{
  "id": "fastapi-service",
  "type": "loadout",
  "title": "FastAPI service rules",
  "summary": "Rules and an endpoint skill for FastAPI with uv and Pydantic v2: Annotated dependencies, typed responses, async only when awaited, lifespan, tested routes.",
  "description": "FastAPI is one of the stacks agents write most often, and the same mistakes keep turning up in their output: blocking calls inside async routes, ORM objects returned unvalidated, Pydantic v1 syntax, on_event hooks, wildcard CORS with credentials. This loadout pins the current conventions from the FastAPI docs (Annotated dependencies, return-type response models, lifespan, dependency overrides in tests) and gives the agent an endpoint skill with an example router and tests that the verifier runs.\n",
  "highlights": [
    "uv for everything: uv add, uv run fastapi dev, uv run pytest",
    "Annotated[..., Depends()] aliases and dependency_overrides in tests",
    "async def only when everything inside is awaited",
    "Typed response models; 201, 404 and 422 handled properly",
    "Example router and tests checked by the verifier"
  ],
  "version": "1.0.0",
  "license": "MIT",
  "author": {
    "name": "Agent Loadout",
    "url": "https://loadout.jnw-it.com"
  },
  "credits": [
    {
      "title": "FastAPI docs: dependencies with Annotated",
      "url": "https://fastapi.tiangolo.com/tutorial/dependencies/"
    },
    {
      "title": "FastAPI docs: concurrency and async / await",
      "url": "https://fastapi.tiangolo.com/async/"
    },
    {
      "title": "FastAPI docs: lifespan events",
      "url": "https://fastapi.tiangolo.com/advanced/events/"
    },
    {
      "title": "FastAPI docs: testing dependencies with overrides",
      "url": "https://fastapi.tiangolo.com/advanced/testing-dependencies/"
    },
    {
      "title": "@geronco: CLAUDE.md templates per framework with exact commands and a never-do list",
      "url": "https://x.com/geronco/status/2108014691582681184"
    }
  ],
  "categories": [
    "web-app"
  ],
  "stacks": [
    "python",
    "fastapi",
    "uv",
    "pytest"
  ],
  "files": [
    {
      "path": "AGENTS.md",
      "role": "instructions",
      "description": "FastAPI, Pydantic v2 and uv rules with commands.",
      "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/fastapi-service/1.0.0/AGENTS.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/fastapi-service/latest/AGENTS.md",
      "bytes": 2251,
      "lang": "markdown",
      "content": "# AGENTS.md: FastAPI service\n\nPython API built with FastAPI and Pydantic v2, managed with uv.\n\n## Commands\n- Install and sync: `uv sync`. Add a dependency: `uv add <package>` (never `pip install` into the project).\n- Run locally: `uv run fastapi dev app/main.py`. Production entry point: `uv run fastapi run app/main.py`.\n- Tests: `uv run pytest -q`. Lint and format: `uv run ruff check . && uv run ruff format --check .`.\n- Types: `uv run mypy app` if mypy is configured in pyproject.toml.\n- Before saying a change is done: tests, ruff check and ruff format all pass.\n\n## Layout\n- `app/main.py` creates the app and includes routers. One `APIRouter` per resource in `app/routers/`.\n- Request and response models in `app/schemas/`; database models separate from API models.\n- Settings in `app/config.py` with pydantic-settings `BaseSettings`, read from the environment. No values in code.\n\n## Rules\n- Dependencies with `Annotated[T, Depends(...)]`; define reusable aliases (`SessionDep`, `CurrentUser`).\n- Every route declares its response type (return annotation or `response_model`) so output is validated and documented.\n  Never return ORM objects or dicts with extra fields straight from a route.\n- Use `async def` only when everything awaited inside is async. Blocking calls (most DB drivers, `requests`, file I/O)\n  go in plain `def` routes, which FastAPI runs in a threadpool. Never call blocking code inside `async def`.\n- Startup and shutdown in a `lifespan` context manager, not `@app.on_event`.\n- Errors: raise `HTTPException` with the right status (404 missing, 409 conflict, 422 is automatic for bad input).\n  Do not return 200 with an error body.\n- Pydantic v2 only: `model_config = ConfigDict(...)`, `model_dump()`, `field_validator`. No v1 `class Config` or `.dict()`.\n- Auth: check it in a dependency, not inside each route. Never log tokens, passwords or full request bodies.\n- CORS: list exact origins. Never `allow_origins=[\"*\"]` together with `allow_credentials=True`.\n\n## Tests\n- `TestClient(app)` for HTTP tests. Swap dependencies with `app.dependency_overrides[...]`, and clear them after.\n- Every new route gets a happy-path test and at least one failure test (404, 422 or auth).\n- New endpoints: use the `add-endpoint` skill.\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/fastapi-service/1.0.0/CLAUDE.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/fastapi-service/latest/CLAUDE.md",
      "bytes": 369,
      "lang": "markdown",
      "content": "# CLAUDE.md\n\n@AGENTS.md\n\n## Claude Code notes\n- Skills from this loadout live in `.claude/skills/`: `add-endpoint`. 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 \"FastAPI service rules\" v1.0.0 — https://loadout.jnw-it.com/loadouts/fastapi-service/ -->\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/fastapi-service/1.0.0/GEMINI.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/fastapi-service/latest/GEMINI.md",
      "bytes": 370,
      "lang": "markdown",
      "content": "# GEMINI.md\n\n@./AGENTS.md\n\n## Gemini CLI notes\n- Skills from this loadout live in `.agents/skills/`: `add-endpoint`. 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 \"FastAPI service rules\" v1.0.0 — https://loadout.jnw-it.com/loadouts/fastapi-service/ -->\n"
    },
    {
      "path": "skills/add-endpoint/SKILL.md",
      "role": "skill",
      "description": "Add a typed, tested FastAPI route.",
      "skill": "add-endpoint",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/add-endpoint/SKILL.md",
        "codex": ".agents/skills/add-endpoint/SKILL.md",
        "cursor": ".agents/skills/add-endpoint/SKILL.md",
        "gemini-cli": ".agents/skills/add-endpoint/SKILL.md",
        "antigravity-cli": ".agents/skills/add-endpoint/SKILL.md",
        "copilot": ".agents/skills/add-endpoint/SKILL.md"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/fastapi-service/1.0.0/skills/add-endpoint/SKILL.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/fastapi-service/latest/skills/add-endpoint/SKILL.md",
      "bytes": 1081,
      "lang": "markdown",
      "content": "---\nname: add-endpoint\ndescription: Add a FastAPI endpoint with typed request and response models, an Annotated dependency and tests for success and failure. Use when adding or changing a route.\n---\n\n# Add an endpoint\n\n1. Read `app/main.py` and the router for the resource. If there is no router yet, start from `references/items.py`.\n2. Define models: a `Create` model for input and a `Public` model for output. Output models never include secrets or\n   internal fields.\n3. Write the route with a return annotation, the right status code (`status_code=201` for creation) and dependencies via\n   `Annotated[..., Depends(...)]`. Plain `def` if it calls blocking code.\n4. Raise `HTTPException(status_code=404, ...)` for missing items. Let FastAPI return 422 for invalid input.\n5. Include the router in `app/main.py` if new: `app.include_router(items.router)`.\n6. Tests, following `references/test_items.py`: success, 404, 422, and a dependency override instead of real storage.\n7. Run `uv run pytest -q`, `uv run ruff check .` and `uv run ruff format --check .`. Report the results.\n"
    },
    {
      "path": "skills/add-endpoint/references/items.py",
      "role": "reference",
      "description": "Example router with models and a dependency.",
      "skill": "add-endpoint",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/add-endpoint/references/items.py",
        "codex": ".agents/skills/add-endpoint/references/items.py",
        "cursor": ".agents/skills/add-endpoint/references/items.py",
        "gemini-cli": ".agents/skills/add-endpoint/references/items.py",
        "antigravity-cli": ".agents/skills/add-endpoint/references/items.py",
        "copilot": ".agents/skills/add-endpoint/references/items.py"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/fastapi-service/1.0.0/skills/add-endpoint/references/items.py",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/fastapi-service/latest/skills/add-endpoint/references/items.py",
      "bytes": 1417,
      "lang": "markdown",
      "content": "\"\"\"Example router: typed models, an Annotated dependency, correct status codes.\"\"\"\n\nfrom typing import Annotated\n\nfrom fastapi import APIRouter, Depends, HTTPException, status\nfrom pydantic import BaseModel, ConfigDict, Field\n\n\nclass ItemCreate(BaseModel):\n    name: str = Field(min_length=1, max_length=100)\n    price_pence: int = Field(ge=0)\n\n\nclass ItemPublic(BaseModel):\n    model_config = ConfigDict(from_attributes=True)\n\n    id: int\n    name: str\n    price_pence: int\n\n\nclass ItemStore:\n    \"\"\"In-memory store. Replace with the project's database session dependency.\"\"\"\n\n    def __init__(self) -> None:\n        self.items: dict[int, ItemPublic] = {}\n\n    def add(self, data: ItemCreate) -> ItemPublic:\n        item = ItemPublic(id=len(self.items) + 1, **data.model_dump())\n        self.items[item.id] = item\n        return item\n\n\n_store = ItemStore()\n\n\ndef get_store() -> ItemStore:\n    return _store\n\n\nStoreDep = Annotated[ItemStore, Depends(get_store)]\n\nrouter = APIRouter(prefix=\"/items\", tags=[\"items\"])\n\n\n@router.post(\"\", status_code=status.HTTP_201_CREATED)\ndef create_item(data: ItemCreate, store: StoreDep) -> ItemPublic:\n    return store.add(data)\n\n\n@router.get(\"/{item_id}\")\ndef read_item(item_id: int, store: StoreDep) -> ItemPublic:\n    item = store.items.get(item_id)\n    if item is None:\n        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=\"Item not found\")\n    return item\n"
    },
    {
      "path": "skills/add-endpoint/references/test_items.py",
      "role": "reference",
      "description": "Tests for success, 404 and 422 with an override.",
      "skill": "add-endpoint",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/add-endpoint/references/test_items.py",
        "codex": ".agents/skills/add-endpoint/references/test_items.py",
        "cursor": ".agents/skills/add-endpoint/references/test_items.py",
        "gemini-cli": ".agents/skills/add-endpoint/references/test_items.py",
        "antigravity-cli": ".agents/skills/add-endpoint/references/test_items.py",
        "copilot": ".agents/skills/add-endpoint/references/test_items.py"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/fastapi-service/1.0.0/skills/add-endpoint/references/test_items.py",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/fastapi-service/latest/skills/add-endpoint/references/test_items.py",
      "bytes": 943,
      "lang": "markdown",
      "content": "\"\"\"Tests for the items router: success, 404, 422, with the store swapped by a dependency override.\"\"\"\n\nimport pytest\nfrom fastapi.testclient import TestClient\n\nfrom app.main import app\nfrom app.routers.items import ItemStore, get_store\n\n\n@pytest.fixture\ndef client():\n    store = ItemStore()\n    app.dependency_overrides[get_store] = lambda: store\n    with TestClient(app) as c:\n        yield c\n    app.dependency_overrides.clear()\n\n\ndef test_create_and_read(client):\n    r = client.post(\"/items\", json={\"name\": \"Tea\", \"price_pence\": 250})\n    assert r.status_code == 201\n    item = r.json()\n    assert item == {\"id\": 1, \"name\": \"Tea\", \"price_pence\": 250}\n    assert client.get(f\"/items/{item['id']}\").json() == item\n\n\ndef test_missing_item_is_404(client):\n    assert client.get(\"/items/999\").status_code == 404\n\n\ndef test_invalid_input_is_422(client):\n    assert client.post(\"/items\", json={\"name\": \"\", \"price_pence\": -1}).status_code == 422\n"
    }
  ],
  "requires": {
    "tools": [
      "uv"
    ],
    "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": true,
    "scripts": [],
    "notes": "uv sync and uv add download packages from PyPI. The example code makes 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/fastapi-service/",
  "api_url": "https://loadout.jnw-it.com/api/loadouts/fastapi-service.json",
  "verification": {
    "level": "verified-install",
    "status": "verified",
    "label": "Verified install",
    "verified": true,
    "checked_at": "2026-10-17T08:14:40Z",
    "commit": "c77eea0ac5a582348e3cda4c6db3ff5403facd65",
    "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; 6 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 6 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: 5 files, 1 skill in .claude/skills/",
          "Codex CLI: 4 files, 1 skill in .agents/skills/",
          "Cursor: 4 files, 1 skill in .agents/skills/",
          "Gemini CLI: 5 files, 1 skill in .agents/skills/",
          "Antigravity CLI: 4 files, 1 skill in .agents/skills/",
          "GitHub Copilot: 4 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 yes (listing says yes)"
        ]
      },
      {
        "id": "references",
        "name": "References",
        "status": "pass",
        "summary": "1 reference between files resolves for every agent",
        "details": []
      },
      {
        "id": "size",
        "name": "Size limits",
        "status": "pass",
        "summary": "6 files, 6.3 KB total; largest AGENTS.md 2.2 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 add-endpoint skill's example router and tests drop into a FastAPI app and pass: 201 on create, 404 on a missing item, 422 on bad input, with a dependency override; ruff check and format are clean",
        "details": [
          "Applied 9 loadout files at every agent's paths",
          "✓ place the example router and tests: bash -c mkdir -p tests && cp .agents/skills/add-endpoint/references/items.py app/routers/items.py && cp .agents/skills/add-endpoint/references/test_items.py tests/test_items.py && echo placed",
          "✓ pytest: uv run --no-project --python 3.12 --with fastapi==0.143.3 --with httpx==0.28.1 --with pytest==9.1.1 python -m pytest -q -p no:cacheprovider tests",
          "✓ ruff check: uvx ruff@0.17.1 check app tests",
          "✓ ruff format --check: uvx ruff@0.17.1 format --check app tests",
          "Covers: Annotated dependency alias and dependency_overrides in tests (AGENTS.md rules)",
          "Covers: Return-type annotations as response models; 201, 404 and automatic 422",
          "Covers: Pydantic v2 API only (ConfigDict, model_dump, Field constraints)",
          "Covers: lifespan instead of on_event; ruff with the ASYNC rules clean"
        ]
      }
    ]
  },
  "install": {
    "claude-code": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/fastapi-service/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "CLAUDE.md",
          "target": "CLAUDE.md",
          "raw_url": "https://loadout.jnw-it.com/raw/fastapi-service/1.0.0/CLAUDE.md",
          "role": "adapter"
        },
        {
          "path": "skills/add-endpoint/SKILL.md",
          "target": ".claude/skills/add-endpoint/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/fastapi-service/1.0.0/skills/add-endpoint/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/add-endpoint/references/items.py",
          "target": ".claude/skills/add-endpoint/references/items.py",
          "raw_url": "https://loadout.jnw-it.com/raw/fastapi-service/1.0.0/skills/add-endpoint/references/items.py",
          "role": "reference"
        },
        {
          "path": "skills/add-endpoint/references/test_items.py",
          "target": ".claude/skills/add-endpoint/references/test_items.py",
          "raw_url": "https://loadout.jnw-it.com/raw/fastapi-service/1.0.0/skills/add-endpoint/references/test_items.py",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/fastapi-service/claude-code.zip"
    },
    "codex": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/fastapi-service/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/add-endpoint/SKILL.md",
          "target": ".agents/skills/add-endpoint/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/fastapi-service/1.0.0/skills/add-endpoint/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/add-endpoint/references/items.py",
          "target": ".agents/skills/add-endpoint/references/items.py",
          "raw_url": "https://loadout.jnw-it.com/raw/fastapi-service/1.0.0/skills/add-endpoint/references/items.py",
          "role": "reference"
        },
        {
          "path": "skills/add-endpoint/references/test_items.py",
          "target": ".agents/skills/add-endpoint/references/test_items.py",
          "raw_url": "https://loadout.jnw-it.com/raw/fastapi-service/1.0.0/skills/add-endpoint/references/test_items.py",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/fastapi-service/codex.zip"
    },
    "cursor": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/fastapi-service/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/add-endpoint/SKILL.md",
          "target": ".agents/skills/add-endpoint/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/fastapi-service/1.0.0/skills/add-endpoint/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/add-endpoint/references/items.py",
          "target": ".agents/skills/add-endpoint/references/items.py",
          "raw_url": "https://loadout.jnw-it.com/raw/fastapi-service/1.0.0/skills/add-endpoint/references/items.py",
          "role": "reference"
        },
        {
          "path": "skills/add-endpoint/references/test_items.py",
          "target": ".agents/skills/add-endpoint/references/test_items.py",
          "raw_url": "https://loadout.jnw-it.com/raw/fastapi-service/1.0.0/skills/add-endpoint/references/test_items.py",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/fastapi-service/cursor.zip"
    },
    "gemini-cli": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/fastapi-service/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "GEMINI.md",
          "target": "GEMINI.md",
          "raw_url": "https://loadout.jnw-it.com/raw/fastapi-service/1.0.0/GEMINI.md",
          "role": "adapter"
        },
        {
          "path": "skills/add-endpoint/SKILL.md",
          "target": ".agents/skills/add-endpoint/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/fastapi-service/1.0.0/skills/add-endpoint/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/add-endpoint/references/items.py",
          "target": ".agents/skills/add-endpoint/references/items.py",
          "raw_url": "https://loadout.jnw-it.com/raw/fastapi-service/1.0.0/skills/add-endpoint/references/items.py",
          "role": "reference"
        },
        {
          "path": "skills/add-endpoint/references/test_items.py",
          "target": ".agents/skills/add-endpoint/references/test_items.py",
          "raw_url": "https://loadout.jnw-it.com/raw/fastapi-service/1.0.0/skills/add-endpoint/references/test_items.py",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/fastapi-service/gemini-cli.zip"
    },
    "antigravity-cli": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/fastapi-service/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/add-endpoint/SKILL.md",
          "target": ".agents/skills/add-endpoint/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/fastapi-service/1.0.0/skills/add-endpoint/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/add-endpoint/references/items.py",
          "target": ".agents/skills/add-endpoint/references/items.py",
          "raw_url": "https://loadout.jnw-it.com/raw/fastapi-service/1.0.0/skills/add-endpoint/references/items.py",
          "role": "reference"
        },
        {
          "path": "skills/add-endpoint/references/test_items.py",
          "target": ".agents/skills/add-endpoint/references/test_items.py",
          "raw_url": "https://loadout.jnw-it.com/raw/fastapi-service/1.0.0/skills/add-endpoint/references/test_items.py",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/fastapi-service/antigravity-cli.zip"
    },
    "copilot": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/fastapi-service/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/add-endpoint/SKILL.md",
          "target": ".agents/skills/add-endpoint/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/fastapi-service/1.0.0/skills/add-endpoint/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/add-endpoint/references/items.py",
          "target": ".agents/skills/add-endpoint/references/items.py",
          "raw_url": "https://loadout.jnw-it.com/raw/fastapi-service/1.0.0/skills/add-endpoint/references/items.py",
          "role": "reference"
        },
        {
          "path": "skills/add-endpoint/references/test_items.py",
          "target": ".agents/skills/add-endpoint/references/test_items.py",
          "raw_url": "https://loadout.jnw-it.com/raw/fastapi-service/1.0.0/skills/add-endpoint/references/test_items.py",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/fastapi-service/copilot.zip"
    }
  },
  "source_zip_url": "https://loadout.jnw-it.com/download/fastapi-service/source.zip"
}