{
  "id": "go-service",
  "type": "loadout",
  "title": "Go service rules",
  "summary": "Go rules for agents: wrapped errors with errors.Is, context first, owned goroutines, 1.22+ routing, timeouts, and gofmt, vet and go test -race as the gate.",
  "description": "Go is simple enough that agents produce working code fast, and idiomatic enough that reviewers spot the shortcuts: errors compared by string, goroutines with no way to stop, the default HTTP client with no timeout, a router library for what the standard mux now does. This loadout writes down the conventions from Effective Go and the Go blog, uses Go 1.22's method and path patterns, and ships a handler skill whose example and table-driven tests the verifier runs under the race detector.\n",
  "highlights": [
    "gofmt, go vet and go test -race as the done-gate",
    "Errors wrapped with %w and checked with errors.Is / errors.As",
    "context first; every goroutine has an owner and a stop",
    "Go 1.22+ ServeMux patterns; no router library needed",
    "Server and client timeouts, size-limited JSON bodies"
  ],
  "version": "1.0.0",
  "license": "MIT",
  "author": {
    "name": "Agent Loadout",
    "url": "https://loadout.jnw-it.com"
  },
  "credits": [
    {
      "title": "Effective Go",
      "url": "https://go.dev/doc/effective_go"
    },
    {
      "title": "Go blog: routing enhancements for Go 1.22",
      "url": "https://go.dev/blog/routing-enhancements"
    },
    {
      "title": "Go blog: working with errors in Go 1.13",
      "url": "https://go.dev/blog/go1.13-errors"
    },
    {
      "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": [
    "go"
  ],
  "files": [
    {
      "path": "AGENTS.md",
      "role": "instructions",
      "description": "Go rules for errors, concurrency, HTTP and dependencies.",
      "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/go-service/1.0.0/AGENTS.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/go-service/latest/AGENTS.md",
      "bytes": 1881,
      "lang": "markdown",
      "content": "# AGENTS.md: Go service\n\nGo module. Check the `go` directive in `go.mod` before using newer language or standard library features.\n\n## Commands\n- Build: `go build ./...`. Tests: `go test -race ./...`. Vet: `go vet ./...`.\n- Format: `gofmt -l .` must print nothing (or `goimports` if the project uses it).\n- Lint, if `.golangci.yml` exists: `golangci-lint run`.\n- Done means: gofmt clean, vet clean, tests green with `-race`.\n\n## Errors\n- Return errors; never `panic` on input. Wrap with context: `fmt.Errorf(\"load user %d: %w\", id, err)`.\n- Compare with `errors.Is` and `errors.As`, never by string. Define sentinel errors (`var ErrNotFound = errors.New(...)`)\n  for conditions callers handle.\n- Handle every error once: either return it or log it, not both.\n\n## Concurrency\n- `context.Context` is the first parameter of anything that does I/O or may block. Respect cancellation.\n- Every goroutine has an owner and a way to stop (context, closed channel or `errgroup`). No fire-and-forget goroutines.\n- Shared state behind a mutex or owned by one goroutine. `go test -race` must stay clean.\n\n## HTTP\n- Go 1.22+ routing: `mux.HandleFunc(\"GET /items/{id}\", h)` and `r.PathValue(\"id\")`. Do not add a router library for that.\n- Servers set timeouts (`ReadHeaderTimeout` at least). Clients use a `http.Client` with `Timeout`, never the default client\n  for external calls.\n- Write JSON with the right `Content-Type` and status; decode with a size limit (`http.MaxBytesReader`).\n\n## Dependencies and style\n- Standard library first. Ask before adding a module; then `go get <module>@<version>` and `go mod tidy`.\n- Logging with `log/slog`, structured key-value pairs. No secrets in logs.\n- Table-driven tests with `t.Run`; `net/http/httptest` for handlers. New handlers: use the `go-http-handler` skill.\n- Small interfaces, defined where they are used. Accept interfaces, return structs.\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/go-service/1.0.0/CLAUDE.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/go-service/latest/CLAUDE.md",
      "bytes": 362,
      "lang": "markdown",
      "content": "# CLAUDE.md\n\n@AGENTS.md\n\n## Claude Code notes\n- Skills from this loadout live in `.claude/skills/`: `go-http-handler`. 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 \"Go service rules\" v1.0.0 — https://loadout.jnw-it.com/loadouts/go-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/go-service/1.0.0/GEMINI.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/go-service/latest/GEMINI.md",
      "bytes": 363,
      "lang": "markdown",
      "content": "# GEMINI.md\n\n@./AGENTS.md\n\n## Gemini CLI notes\n- Skills from this loadout live in `.agents/skills/`: `go-http-handler`. 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 \"Go service rules\" v1.0.0 — https://loadout.jnw-it.com/loadouts/go-service/ -->\n"
    },
    {
      "path": "skills/go-http-handler/SKILL.md",
      "role": "skill",
      "description": "Add an HTTP handler with tests.",
      "skill": "go-http-handler",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/go-http-handler/SKILL.md",
        "codex": ".agents/skills/go-http-handler/SKILL.md",
        "cursor": ".agents/skills/go-http-handler/SKILL.md",
        "gemini-cli": ".agents/skills/go-http-handler/SKILL.md",
        "antigravity-cli": ".agents/skills/go-http-handler/SKILL.md",
        "copilot": ".agents/skills/go-http-handler/SKILL.md"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/go-service/1.0.0/skills/go-http-handler/SKILL.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/go-service/latest/skills/go-http-handler/SKILL.md",
      "bytes": 1018,
      "lang": "markdown",
      "content": "---\nname: go-http-handler\ndescription: Add a Go net/http handler with 1.22+ routing, a size-limited JSON body, wrapped errors mapped to status codes and table-driven httptest tests. Use when adding or changing an HTTP endpoint.\n---\n\n# Go HTTP handler\n\n1. Read how the service builds its `http.ServeMux` and stores dependencies (usually a struct with methods).\n2. Follow `references/handler.go`: a method on the server struct, `r.PathValue` for path parameters,\n   `http.MaxBytesReader` plus `json.Decoder` with `DisallowUnknownFields` for bodies.\n3. Map errors to status codes in one place: `errors.Is(err, ErrNotFound)` gives 404, validation 400, everything else 500\n   with the detail logged through `slog`, not sent to the client.\n4. Register the route with method and pattern: `mux.HandleFunc(\"POST /items\", s.createItem)`.\n5. Tests like `references/handler_test.go`: table-driven, `httptest.NewRecorder`, one row per status code.\n6. Run `gofmt -l .`, `go vet ./...` and `go test -race ./...`. Report the results.\n"
    },
    {
      "path": "skills/go-http-handler/references/handler.go",
      "role": "reference",
      "description": "Example handlers with routing and error mapping.",
      "skill": "go-http-handler",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/go-http-handler/references/handler.go",
        "codex": ".agents/skills/go-http-handler/references/handler.go",
        "cursor": ".agents/skills/go-http-handler/references/handler.go",
        "gemini-cli": ".agents/skills/go-http-handler/references/handler.go",
        "antigravity-cli": ".agents/skills/go-http-handler/references/handler.go",
        "copilot": ".agents/skills/go-http-handler/references/handler.go"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/go-service/1.0.0/skills/go-http-handler/references/handler.go",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/go-service/latest/skills/go-http-handler/references/handler.go",
      "bytes": 2740,
      "lang": "markdown",
      "content": "// Package items is an example of a net/http handler set: Go 1.22+ routing, limited JSON bodies, errors mapped to status.\npackage items\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"log/slog\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"sync\"\n)\n\n// ErrNotFound is returned when an item does not exist.\nvar ErrNotFound = errors.New(\"item not found\")\n\n// Item is the public representation of an item.\ntype Item struct {\n\tID         int    `json:\"id\"`\n\tName       string `json:\"name\"`\n\tPricePence int    `json:\"price_pence\"`\n}\n\n// Server holds dependencies for the handlers.\ntype Server struct {\n\tmu    sync.Mutex\n\titems map[int]Item\n\tlog   *slog.Logger\n}\n\n// NewServer returns a Server with an empty store.\nfunc NewServer(log *slog.Logger) *Server {\n\treturn &Server{items: map[int]Item{}, log: log}\n}\n\n// Routes registers the handlers on a new mux.\nfunc (s *Server) Routes() *http.ServeMux {\n\tmux := http.NewServeMux()\n\tmux.HandleFunc(\"POST /items\", s.createItem)\n\tmux.HandleFunc(\"GET /items/{id}\", s.getItem)\n\treturn mux\n}\n\nfunc (s *Server) find(id int) (Item, error) {\n\ts.mu.Lock()\n\tdefer s.mu.Unlock()\n\tit, ok := s.items[id]\n\tif !ok {\n\t\treturn Item{}, fmt.Errorf(\"find %d: %w\", id, ErrNotFound)\n\t}\n\treturn it, nil\n}\n\nfunc (s *Server) getItem(w http.ResponseWriter, r *http.Request) {\n\tid, err := strconv.Atoi(r.PathValue(\"id\"))\n\tif err != nil {\n\t\thttp.Error(w, \"id must be a number\", http.StatusBadRequest)\n\t\treturn\n\t}\n\tit, err := s.find(id)\n\tif err != nil {\n\t\ts.fail(w, err)\n\t\treturn\n\t}\n\twriteJSON(w, http.StatusOK, it)\n}\n\nfunc (s *Server) createItem(w http.ResponseWriter, r *http.Request) {\n\tr.Body = http.MaxBytesReader(w, r.Body, 1<<20)\n\tdec := json.NewDecoder(r.Body)\n\tdec.DisallowUnknownFields()\n\tvar in struct {\n\t\tName       string `json:\"name\"`\n\t\tPricePence int    `json:\"price_pence\"`\n\t}\n\tif err := dec.Decode(&in); err != nil {\n\t\thttp.Error(w, \"invalid JSON body\", http.StatusBadRequest)\n\t\treturn\n\t}\n\tif in.Name == \"\" || in.PricePence < 0 {\n\t\thttp.Error(w, \"name is required and price_pence must be 0 or more\", http.StatusBadRequest)\n\t\treturn\n\t}\n\ts.mu.Lock()\n\tit := Item{ID: len(s.items) + 1, Name: in.Name, PricePence: in.PricePence}\n\ts.items[it.ID] = it\n\ts.mu.Unlock()\n\twriteJSON(w, http.StatusCreated, it)\n}\n\n// fail maps errors to status codes in one place. Internal detail is logged, not sent.\nfunc (s *Server) fail(w http.ResponseWriter, err error) {\n\tswitch {\n\tcase errors.Is(err, ErrNotFound):\n\t\thttp.Error(w, \"not found\", http.StatusNotFound)\n\tdefault:\n\t\ts.log.Error(\"request failed\", \"err\", err)\n\t\thttp.Error(w, \"internal error\", http.StatusInternalServerError)\n\t}\n}\n\nfunc writeJSON(w http.ResponseWriter, status int, v any) {\n\tw.Header().Set(\"Content-Type\", \"application/json\")\n\tw.WriteHeader(status)\n\t_ = json.NewEncoder(w).Encode(v)\n}\n"
    },
    {
      "path": "skills/go-http-handler/references/handler_test.go",
      "role": "reference",
      "description": "Table-driven httptest tests.",
      "skill": "go-http-handler",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/go-http-handler/references/handler_test.go",
        "codex": ".agents/skills/go-http-handler/references/handler_test.go",
        "cursor": ".agents/skills/go-http-handler/references/handler_test.go",
        "gemini-cli": ".agents/skills/go-http-handler/references/handler_test.go",
        "antigravity-cli": ".agents/skills/go-http-handler/references/handler_test.go",
        "copilot": ".agents/skills/go-http-handler/references/handler_test.go"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/go-service/1.0.0/skills/go-http-handler/references/handler_test.go",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/go-service/latest/skills/go-http-handler/references/handler_test.go",
      "bytes": 1196,
      "lang": "markdown",
      "content": "package items\n\nimport (\n\t\"io\"\n\t\"log/slog\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"strings\"\n\t\"testing\"\n)\n\nfunc TestHandlers(t *testing.T) {\n\tsrv := NewServer(slog.New(slog.NewTextHandler(io.Discard, nil)))\n\th := srv.Routes()\n\n\ttests := []struct {\n\t\tname, method, path, body string\n\t\twant                     int\n\t}{\n\t\t{\"create\", \"POST\", \"/items\", `{\"name\":\"Tea\",\"price_pence\":250}`, http.StatusCreated},\n\t\t{\"read created\", \"GET\", \"/items/1\", \"\", http.StatusOK},\n\t\t{\"missing\", \"GET\", \"/items/99\", \"\", http.StatusNotFound},\n\t\t{\"bad id\", \"GET\", \"/items/abc\", \"\", http.StatusBadRequest},\n\t\t{\"unknown field\", \"POST\", \"/items\", `{\"name\":\"Tea\",\"colour\":\"red\"}`, http.StatusBadRequest},\n\t\t{\"negative price\", \"POST\", \"/items\", `{\"name\":\"Tea\",\"price_pence\":-1}`, http.StatusBadRequest},\n\t\t{\"wrong method\", \"DELETE\", \"/items/1\", \"\", http.StatusMethodNotAllowed},\n\t}\n\tfor _, tc := range tests {\n\t\tt.Run(tc.name, func(t *testing.T) {\n\t\t\treq := httptest.NewRequest(tc.method, tc.path, strings.NewReader(tc.body))\n\t\t\trec := httptest.NewRecorder()\n\t\t\th.ServeHTTP(rec, req)\n\t\t\tif rec.Code != tc.want {\n\t\t\t\tt.Fatalf(\"%s %s: got %d, want %d (%s)\", tc.method, tc.path, rec.Code, tc.want, rec.Body.String())\n\t\t\t}\n\t\t})\n\t}\n}\n"
    }
  ],
  "requires": {
    "tools": [
      "go"
    ],
    "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": "go get downloads modules through the Go module proxy. 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/go-service/",
  "api_url": "https://loadout.jnw-it.com/api/loadouts/go-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 no (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, 7.4 KB total; largest skills/go-http-handler/references/handler.go 2.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 go-http-handler skill's example handler and table-driven tests drop into a Go module: gofmt and go vet are clean and all seven status-code cases pass under the race detector",
        "details": [
          "Applied 9 loadout files at every agent's paths",
          "✓ place the example: bash -c mkdir -p items && cp .agents/skills/go-http-handler/references/handler.go .agents/skills/go-http-handler/references/handler_test.go items/ && echo placed",
          "✓ gofmt -l: bash -c out=$(gofmt -l items); if [ -n \"$out\" ]; then echo \"unformatted: $out\"; exit 1; fi; echo gofmt ok",
          "✓ go vet: go vet ./...",
          "✓ go test -race: go test -race -count=1 -v ./...",
          "Covers: Go 1.22+ method and path patterns with r.PathValue",
          "Covers: MaxBytesReader and DisallowUnknownFields on JSON bodies",
          "Covers: Wrapped sentinel error mapped to 404 with errors.Is; internal errors logged with slog",
          "Covers: Table-driven httptest tests, race detector clean"
        ]
      }
    ]
  },
  "install": {
    "claude-code": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/go-service/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "CLAUDE.md",
          "target": "CLAUDE.md",
          "raw_url": "https://loadout.jnw-it.com/raw/go-service/1.0.0/CLAUDE.md",
          "role": "adapter"
        },
        {
          "path": "skills/go-http-handler/SKILL.md",
          "target": ".claude/skills/go-http-handler/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/go-service/1.0.0/skills/go-http-handler/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/go-http-handler/references/handler.go",
          "target": ".claude/skills/go-http-handler/references/handler.go",
          "raw_url": "https://loadout.jnw-it.com/raw/go-service/1.0.0/skills/go-http-handler/references/handler.go",
          "role": "reference"
        },
        {
          "path": "skills/go-http-handler/references/handler_test.go",
          "target": ".claude/skills/go-http-handler/references/handler_test.go",
          "raw_url": "https://loadout.jnw-it.com/raw/go-service/1.0.0/skills/go-http-handler/references/handler_test.go",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/go-service/claude-code.zip"
    },
    "codex": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/go-service/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/go-http-handler/SKILL.md",
          "target": ".agents/skills/go-http-handler/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/go-service/1.0.0/skills/go-http-handler/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/go-http-handler/references/handler.go",
          "target": ".agents/skills/go-http-handler/references/handler.go",
          "raw_url": "https://loadout.jnw-it.com/raw/go-service/1.0.0/skills/go-http-handler/references/handler.go",
          "role": "reference"
        },
        {
          "path": "skills/go-http-handler/references/handler_test.go",
          "target": ".agents/skills/go-http-handler/references/handler_test.go",
          "raw_url": "https://loadout.jnw-it.com/raw/go-service/1.0.0/skills/go-http-handler/references/handler_test.go",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/go-service/codex.zip"
    },
    "cursor": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/go-service/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/go-http-handler/SKILL.md",
          "target": ".agents/skills/go-http-handler/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/go-service/1.0.0/skills/go-http-handler/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/go-http-handler/references/handler.go",
          "target": ".agents/skills/go-http-handler/references/handler.go",
          "raw_url": "https://loadout.jnw-it.com/raw/go-service/1.0.0/skills/go-http-handler/references/handler.go",
          "role": "reference"
        },
        {
          "path": "skills/go-http-handler/references/handler_test.go",
          "target": ".agents/skills/go-http-handler/references/handler_test.go",
          "raw_url": "https://loadout.jnw-it.com/raw/go-service/1.0.0/skills/go-http-handler/references/handler_test.go",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/go-service/cursor.zip"
    },
    "gemini-cli": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/go-service/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "GEMINI.md",
          "target": "GEMINI.md",
          "raw_url": "https://loadout.jnw-it.com/raw/go-service/1.0.0/GEMINI.md",
          "role": "adapter"
        },
        {
          "path": "skills/go-http-handler/SKILL.md",
          "target": ".agents/skills/go-http-handler/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/go-service/1.0.0/skills/go-http-handler/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/go-http-handler/references/handler.go",
          "target": ".agents/skills/go-http-handler/references/handler.go",
          "raw_url": "https://loadout.jnw-it.com/raw/go-service/1.0.0/skills/go-http-handler/references/handler.go",
          "role": "reference"
        },
        {
          "path": "skills/go-http-handler/references/handler_test.go",
          "target": ".agents/skills/go-http-handler/references/handler_test.go",
          "raw_url": "https://loadout.jnw-it.com/raw/go-service/1.0.0/skills/go-http-handler/references/handler_test.go",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/go-service/gemini-cli.zip"
    },
    "antigravity-cli": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/go-service/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/go-http-handler/SKILL.md",
          "target": ".agents/skills/go-http-handler/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/go-service/1.0.0/skills/go-http-handler/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/go-http-handler/references/handler.go",
          "target": ".agents/skills/go-http-handler/references/handler.go",
          "raw_url": "https://loadout.jnw-it.com/raw/go-service/1.0.0/skills/go-http-handler/references/handler.go",
          "role": "reference"
        },
        {
          "path": "skills/go-http-handler/references/handler_test.go",
          "target": ".agents/skills/go-http-handler/references/handler_test.go",
          "raw_url": "https://loadout.jnw-it.com/raw/go-service/1.0.0/skills/go-http-handler/references/handler_test.go",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/go-service/antigravity-cli.zip"
    },
    "copilot": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/go-service/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/go-http-handler/SKILL.md",
          "target": ".agents/skills/go-http-handler/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/go-service/1.0.0/skills/go-http-handler/SKILL.md",
          "role": "skill"
        },
        {
          "path": "skills/go-http-handler/references/handler.go",
          "target": ".agents/skills/go-http-handler/references/handler.go",
          "raw_url": "https://loadout.jnw-it.com/raw/go-service/1.0.0/skills/go-http-handler/references/handler.go",
          "role": "reference"
        },
        {
          "path": "skills/go-http-handler/references/handler_test.go",
          "target": ".agents/skills/go-http-handler/references/handler_test.go",
          "raw_url": "https://loadout.jnw-it.com/raw/go-service/1.0.0/skills/go-http-handler/references/handler_test.go",
          "role": "reference"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/go-service/copilot.zip"
    }
  },
  "source_zip_url": "https://loadout.jnw-it.com/download/go-service/source.zip"
}