{
  "id": "godot-4-game-jam",
  "type": "loadout",
  "title": "Godot 4 game jam",
  "summary": "GDScript conventions, jam-scope discipline and a ship-to-itch.io skill so your agent helps you finish a Godot 4 game in 48 hours.",
  "description": "Game jams are lost to scope creep and a broken web build at hour 47. This loadout teaches your agent\ntyped GDScript and Godot 4 scene conventions, makes it protect the core loop before adding features,\nand gives it a step-by-step skill for exporting a web build and pushing it to itch.io with butler.\n",
  "highlights": [
    "Typed GDScript 4 conventions, signals over hard references, scenes as the unit of reuse",
    "Jam rules: playable loop first, feature freeze, a cut list instead of crunch",
    "Ship skill covering headless web export, the single-threaded vs threaded trap, and butler pushes",
    "Cursor rule scoped to .gd files"
  ],
  "version": "1.0.0",
  "license": "MIT",
  "author": {
    "name": "Agent Loadout",
    "url": "https://loadout.jnw-it.com"
  },
  "categories": [
    "gamedev"
  ],
  "stacks": [
    "godot",
    "gdscript"
  ],
  "files": [
    {
      "path": "AGENTS.md",
      "role": "instructions",
      "description": "Godot 4 project and game jam rules.",
      "skill": null,
      "agent": null,
      "install_to": {
        "claude-code": "AGENTS.md",
        "codex": "AGENTS.md",
        "cursor": "AGENTS.md",
        "gemini-cli": "AGENTS.md",
        "copilot": "AGENTS.md"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/godot-4-game-jam/1.0.0/AGENTS.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/godot-4-game-jam/latest/AGENTS.md",
      "bytes": 2956,
      "lang": "markdown",
      "content": "# AGENTS.md: Godot 4 game jam\n\nThis is a Godot 4 project made for a game jam. Finishing beats polish. Polish beats features.\n\n## Jam rules (follow these over any instinct to add things)\n1. **Core loop first.** Until the game can be started, played, won or lost, and restarted, only work on that.\n2. **Keep a cut list.** When the human asks for something big, offer the smallest version that sells the idea,\n   and add the rest to `CUTLIST.md` instead of building it.\n3. **Feature freeze** when the human says so (default: 75% of the way through the jam). After that: bugs,\n   juice (screen shake, sound, particles), menus, and the build. Nothing new.\n4. **Ship a build early.** Get a web export on itch.io (draft page) on day one so the final upload is boring.\n5. Never refactor working code in the last few hours unless it fixes a crash.\n\n## Project layout\n```\nscenes/       one folder per thing: player/, enemies/, ui/, levels/ (each .tscn next to its .gd)\nautoload/     global singletons (GameState, Audio) — keep these few and small\nassets/       art/, audio/, fonts/ — imported files, never edited by code\n```\n- Commit `.tscn`, `.tres`, `.gd`, `project.godot`, `export_presets.cfg` and the `*.uid` / `*.import` files.\n  Ignore `.godot/` and build output.\n\n## GDScript conventions (Godot 4)\n- Static typing everywhere: `var speed: float = 200.0`, `func take_damage(amount: int) -> void:`.\n  Use `:=` when the type is obvious.\n- `snake_case` for files, functions and variables; `PascalCase` for `class_name` and nodes; `UPPER_SNAKE` for constants.\n- Use `@export` for tunable values so the human can tweak them in the inspector instead of asking you.\n- Use `@onready var sprite: Sprite2D = $Sprite2D` for child references. No `get_node()` with long paths across the tree.\n- Signals for \"something happened\" (`signal died`, `health_changed.emit(hp)`), direct calls for \"do this\".\n  Children signal up; parents call down.\n- Connect signals in code with callables: `button.pressed.connect(_on_start_pressed)`.\n- Physics and movement in `_physics_process(delta)`; visuals and input polling in `_process(delta)` or `_unhandled_input`.\n- Use groups (`add_to_group(\"enemies\")`) instead of searching the tree.\n- Use `await get_tree().create_timer(0.5).timeout` for simple delays; `Tween` (`create_tween()`) for movement and juice.\n- Godot 3 syntax is wrong here: no `onready`, `export`, `yield`, `KinematicBody2D`, or `connect(\"signal\", self, \"method\")`.\n\n## Editing scenes\n- Prefer creating nodes in the editor (tell the human what to add) or in code. If you must edit a `.tscn` by hand,\n  keep `ext_resource` ids consistent and do not reorder sections.\n- Input actions belong in Project Settings → Input Map (`project.godot`), never hard-coded key codes.\n\n## Before you say \"done\"\n- Run the project headless to catch script errors: `godot --headless --quit` (or ask the human to press F5).\n- Say what the human should test by hand, in one or two lines.\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,
        "copilot": null
      },
      "raw_url": "https://loadout.jnw-it.com/raw/godot-4-game-jam/1.0.0/CLAUDE.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/godot-4-game-jam/latest/CLAUDE.md",
      "bytes": 367,
      "lang": "markdown",
      "content": "# CLAUDE.md\n\n@AGENTS.md\n\n## Claude Code notes\n- Skills from this loadout live in `.claude/skills/`: `godot-jam-ship`. 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 \"Godot 4 game jam\" v1.0.0 — https://loadout.jnw-it.com/loadouts/godot-4-game-jam/ -->\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",
        "copilot": null
      },
      "raw_url": "https://loadout.jnw-it.com/raw/godot-4-game-jam/1.0.0/GEMINI.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/godot-4-game-jam/latest/GEMINI.md",
      "bytes": 368,
      "lang": "markdown",
      "content": "# GEMINI.md\n\n@./AGENTS.md\n\n## Gemini CLI notes\n- Skills from this loadout live in `.agents/skills/`: `godot-jam-ship`. 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 \"Godot 4 game jam\" v1.0.0 — https://loadout.jnw-it.com/loadouts/godot-4-game-jam/ -->\n"
    },
    {
      "path": ".cursor/rules/gdscript.mdc",
      "role": "rules",
      "description": "GDScript style rule, applied to .gd files.",
      "skill": null,
      "agent": null,
      "install_to": {
        "claude-code": null,
        "codex": null,
        "cursor": ".cursor/rules/gdscript.mdc",
        "gemini-cli": null,
        "copilot": null
      },
      "raw_url": "https://loadout.jnw-it.com/raw/godot-4-game-jam/1.0.0/.cursor/rules/gdscript.mdc",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/godot-4-game-jam/latest/.cursor/rules/gdscript.mdc",
      "bytes": 875,
      "lang": "markdown",
      "content": "---\ndescription: Godot 4 GDScript style and API rules\nglobs: \"**/*.gd\"\nalwaysApply: false\n---\n\n- Godot 4 syntax only: `@export`, `@onready`, `await`, `signal.emit()`, `signal.connect(callable)`, `CharacterBody2D`/`3D`.\n- Type every variable, parameter and return value. `-> void` on functions that return nothing.\n- `CharacterBody2D`: set `velocity`, then call `move_and_slide()` with no arguments.\n- Use `Input.get_vector(\"move_left\", \"move_right\", \"move_up\", \"move_down\")` for movement; action names come from the Input Map.\n- Expose tuning values with `@export` (and `@export_range` where sensible) instead of magic numbers.\n- Prefer signals and groups to absolute node paths. Avoid `get_parent().get_parent()`.\n- Free nodes with `queue_free()`, never `free()`, during gameplay.\n- Keep scripts under ~200 lines; split behaviour into child nodes/components when they grow.\n"
    },
    {
      "path": "skills/godot-jam-ship/SKILL.md",
      "role": "skill",
      "description": "Exports a web build and publishes it to itch.io.",
      "skill": "godot-jam-ship",
      "agent": null,
      "install_to": {
        "claude-code": ".claude/skills/godot-jam-ship/SKILL.md",
        "codex": ".agents/skills/godot-jam-ship/SKILL.md",
        "cursor": ".agents/skills/godot-jam-ship/SKILL.md",
        "gemini-cli": ".agents/skills/godot-jam-ship/SKILL.md",
        "copilot": ".agents/skills/godot-jam-ship/SKILL.md"
      },
      "raw_url": "https://loadout.jnw-it.com/raw/godot-4-game-jam/1.0.0/skills/godot-jam-ship/SKILL.md",
      "raw_latest_url": "https://loadout.jnw-it.com/raw/godot-4-game-jam/latest/skills/godot-jam-ship/SKILL.md",
      "bytes": 2662,
      "lang": "markdown",
      "content": "---\nname: godot-jam-ship\ndescription: Export a Godot 4 project to the web and publish it to itch.io. Use when the user wants to build, export, upload, publish or submit their game jam entry.\n---\n\n# Ship a Godot 4 jam build to itch.io\n\n## 0. Preconditions (check, then tell the human what is missing)\n- Godot 4 is on the PATH (`godot --version`) and the **export templates for that exact version** are installed\n  (Editor → Manage Export Templates). Headless export fails without them.\n- `export_presets.cfg` contains a preset named `Web`. If not, ask the human to add one in Project → Export\n  (Add… → Web) and save; do not invent the file from scratch.\n- `butler` is installed and logged in (`butler login`, or `BUTLER_API_KEY` set) if publishing.\n- The itch.io project page exists (it can be a draft). You need `user/game-slug`.\n\n## 1. Pick threading\n- **Thread Support off** (default for Godot 4.3+ Web preset): works anywhere, including itch.io, with no special headers. Use this unless the human needs threads.\n- **Thread Support on**: needs cross-origin isolation (SharedArrayBuffer). On itch.io tick\n  \"SharedArrayBuffer support\" in the embed options, or the game shows a blank screen.\n\n## 2. Export\n```sh\nmkdir -p build/web\ngodot --headless --export-release \"Web\" build/web/index.html\n```\n- The entry file must be `index.html` for itch.io.\n- Check `build/web` contains `index.html`, `.js`, `.wasm` and `.pck` files. If the `.pck` is huge, look for\n  uncompressed audio or unused assets and mention it.\n\n## 3. Smoke test locally\n```sh\nnpx serve build/web   # or: python3 -m http.server -d build/web 8000\n```\nAsk the human to open it and play for 30 seconds. Web builds can behave differently from the editor\n(audio needs a click to start; mouse capture needs a user gesture).\n\n## 4. Publish\n```sh\nbutler push build/web user/game-slug:html5 --userversion \"jam-$(date +%Y%m%d-%H%M)\"\nbutler status user/game-slug:html5\n```\n- First push only: the human must set \"Kind of project\" to HTML on the itch page and tick\n  \"This file will be played in the browser\" for the html5 upload, and set the viewport size to the project's window size.\n\n## 5. Optional desktop builds\nIf presets exist: `godot --headless --export-release \"Windows Desktop\" build/win/game.exe` then\n`butler push build/win user/game-slug:windows`. Same for `Linux` and `macOS` (macOS builds are unsigned — tell the human players will need to right-click → Open).\n\n## 6. Report\nTell the human: the itch.io URL, the channel(s) pushed, the build version string, and anything that still needs a click on the itch dashboard. Do not submit to the jam itself — that is the human's button.\n"
    }
  ],
  "requires": {
    "tools": [
      "godot-4",
      "butler"
    ],
    "env": [
      "BUTLER_API_KEY"
    ],
    "mcp": []
  },
  "tested": {
    "status": "untested",
    "last_run": null,
    "fixture": null,
    "per_agent": {
      "claude-code": "untested",
      "codex": "untested",
      "cursor": "untested",
      "gemini-cli": "untested",
      "copilot": "untested"
    }
  },
  "security": {
    "scanned": true,
    "scanner": "intake-precheck/1",
    "verdict": "clean",
    "network": true,
    "scripts": [],
    "notes": "The ship skill uploads builds to itch.io with butler, only when you ask it to."
  },
  "featured": true,
  "deprecated": false,
  "last_checked": "2026-10-15",
  "published": "2026-10-15",
  "updated": "2026-10-15",
  "compatibility": {
    "claude-code": "native",
    "codex": "native",
    "cursor": "native",
    "gemini-cli": "native",
    "copilot": "native"
  },
  "counts": {
    "rules": 2,
    "skills": 1,
    "mcp": 0
  },
  "url": "https://loadout.jnw-it.com/loadouts/godot-4-game-jam/",
  "api_url": "https://loadout.jnw-it.com/api/loadouts/godot-4-game-jam.json",
  "verification": {
    "level": "verified-install",
    "status": "verified",
    "label": "Verified install",
    "verified": true,
    "checked_at": "2026-10-16T22:54:03Z",
    "commit": "ad36e852567aa3c87821d2a9e2fe4052fd983374",
    "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; 5 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 5 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 5 agents; layouts re-discovered",
        "details": [
          "Claude Code: 3 files, 1 skill in .claude/skills/",
          "Codex CLI: 2 files, 1 skill in .agents/skills/",
          "Cursor: 3 files, 1 skill in .agents/skills/, 1 rule",
          "Gemini CLI: 3 files, 1 skill in .agents/skills/",
          "GitHub Copilot: 2 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": "No cross-file references to check",
        "details": []
      },
      {
        "id": "size",
        "name": "Size limits",
        "status": "pass",
        "summary": "5 files, 7.1 KB total; largest AGENTS.md 2.9 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": "Godot 4 project in the loadout's layout imports and runs headless with no script errors, using the loadout's own check command",
        "details": [
          "Applied 6 loadout files at every agent's paths",
          "godot 4.7.2-stable",
          "✓ import project (headless): ${GODOT_BIN} --headless --import --path .",
          "✓ run headless (godot --headless --quit): ${GODOT_BIN} --headless --path . --quit-after 600",
          "Covers: scenes/<thing>/ with .tscn next to .gd, a small autoload, Input Map actions in project.godot (AGENTS.md)",
          "Covers: Godot 4 GDScript from the Cursor rule: static types, @export/@export_range, @onready, signal.emit()/connect(callable), CharacterBody2D + move_and_slide(), Input.get_vector, groups, await timers, tweens",
          "Covers: The loadout's \"run headless to catch script errors\" step works in CI",
          "Covers: Not covered: web export and itch.io upload (export templates are ~1 GB; uploads need a butler key)"
        ]
      }
    ]
  },
  "install": {
    "claude-code": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/godot-4-game-jam/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "CLAUDE.md",
          "target": "CLAUDE.md",
          "raw_url": "https://loadout.jnw-it.com/raw/godot-4-game-jam/1.0.0/CLAUDE.md",
          "role": "adapter"
        },
        {
          "path": "skills/godot-jam-ship/SKILL.md",
          "target": ".claude/skills/godot-jam-ship/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/godot-4-game-jam/1.0.0/skills/godot-jam-ship/SKILL.md",
          "role": "skill"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/godot-4-game-jam/claude-code.zip"
    },
    "codex": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/godot-4-game-jam/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/godot-jam-ship/SKILL.md",
          "target": ".agents/skills/godot-jam-ship/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/godot-4-game-jam/1.0.0/skills/godot-jam-ship/SKILL.md",
          "role": "skill"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/godot-4-game-jam/codex.zip"
    },
    "cursor": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/godot-4-game-jam/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": ".cursor/rules/gdscript.mdc",
          "target": ".cursor/rules/gdscript.mdc",
          "raw_url": "https://loadout.jnw-it.com/raw/godot-4-game-jam/1.0.0/.cursor/rules/gdscript.mdc",
          "role": "rules"
        },
        {
          "path": "skills/godot-jam-ship/SKILL.md",
          "target": ".agents/skills/godot-jam-ship/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/godot-4-game-jam/1.0.0/skills/godot-jam-ship/SKILL.md",
          "role": "skill"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/godot-4-game-jam/cursor.zip"
    },
    "gemini-cli": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/godot-4-game-jam/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "GEMINI.md",
          "target": "GEMINI.md",
          "raw_url": "https://loadout.jnw-it.com/raw/godot-4-game-jam/1.0.0/GEMINI.md",
          "role": "adapter"
        },
        {
          "path": "skills/godot-jam-ship/SKILL.md",
          "target": ".agents/skills/godot-jam-ship/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/godot-4-game-jam/1.0.0/skills/godot-jam-ship/SKILL.md",
          "role": "skill"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/godot-4-game-jam/gemini-cli.zip"
    },
    "copilot": {
      "files": [
        {
          "path": "AGENTS.md",
          "target": "AGENTS.md",
          "raw_url": "https://loadout.jnw-it.com/raw/godot-4-game-jam/1.0.0/AGENTS.md",
          "role": "instructions"
        },
        {
          "path": "skills/godot-jam-ship/SKILL.md",
          "target": ".agents/skills/godot-jam-ship/SKILL.md",
          "raw_url": "https://loadout.jnw-it.com/raw/godot-4-game-jam/1.0.0/skills/godot-jam-ship/SKILL.md",
          "role": "skill"
        }
      ],
      "manual_steps": [],
      "zip_url": "https://loadout.jnw-it.com/download/godot-4-game-jam/copilot.zip"
    }
  },
  "source_zip_url": "https://loadout.jnw-it.com/download/godot-4-game-jam/source.zip"
}