/project-scaffold
Generate a new Godot game project with standardized ECS structure and tooling. Use when starting a new game: "create a project", "set up a new game", "scaffold", "initialize", "new project", "start building", "let's make it". Triggers after game-planner produces a confirmed
$ npx -y skills add RandallLiuXin/GodotMaker --skill project-scaffold --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/project-scaffold
Context preview
The summary Claude sees to decide when to auto-load this skill.
Generate a new Godot game project with standardized ECS structure and tooling. Use when starting a new game: "create a project", "set up a new game", "scaffold", "initialize", "new project", "start building", "let's make it". Triggers after game-planner produces a confirmed
SKILL.md
project-scaffold.SKILL.mdname: project-scaffold
description: |
Generate a new Godot game project with standardized ECS structure and tooling.
Use when starting a new game: "create a project", "set up a new game",
"scaffold", "initialize", "new project", "start building", "let's make it".
Triggers after game-planner produces a confirmed plan, or when the user
provides a game name + genre directly. Even for simple requests like
"make me a new Godot project", use this skill to ensure proper ECS structure.
Creates directory structure, project.godot, CLAUDE.md, gecs World setup,
addon stubs, and template source files based on the game plan or user input.
Project Scaffold
$ARGUMENTS
Generate a new Godot game project with GodotMaker's ECS architecture. Read templates from this skill's `templates/` directory, fill `{{placeholders}}` with values from the game plan or user input, and write results to the target.
Step 1 — Gather Variables
If a confirmed Game Plan exists in the conversation (from game-planner), extract variables from it. Otherwise, ask the user for **game name** and **genre** at minimum — use genre defaults for everything else.
| Variable | Source | Default | |----------|--------|---------| | `{{game_name}}` | user input, snake_case, used as directory name | *required* | | `{{game_title}}` | user input or Title Case of game_name | *required* | | `{{genre}}` | Game Plan "Genre" or user | `"platformer"` | | `{{perspective}}` | Fixed framework target | `"2D"` | | `{{viewport_width}}` | genre defaults table | `1280` | | `{{viewport_height}}` | genre defaults table | `720` | | `{{rendering_method}}` | fixed 2D renderer | `"gl_compatibility"` | | `{{root_node_type}}` | fixed 2D root | `"Node2D"` | | `{{camera_type}}` | fixed 2D camera | `"Camera2D"` | | `{{game_description}}` | Game Plan summary or one-line from user | genre name + " game" |
**Genre defaults:**
| Genre | Viewport | Gravity | Input Actions | |-------|----------|---------|---------------| | Platformer | 1280x720 | 980.0 | move_left, move_right, jump | | Top-down | 1280x720 | none | move_up, move_down, move_left, move_right | | Puzzle | 1280x720 | none | select, confirm, cancel | | Endless runner | 720x1280 | 980.0 | jump |
Step 2 — Create Directory Structure
Create the project root and all subdirectories:
{{game_name}}/
├── project.godot
├── CLAUDE.md
├── .gitignore
├── src/
│ ├── components/ # C_ prefixed component scripts
│ ├── systems/ # NameSystem scripts
│ ├── entities/ # Entity scene definitions
│ └── ui/ # UI scenes and scripts
├── scenes/
│ ├── main.tscn # Entry point scene
│ └── game_world.tscn # Gameplay scene with camera
├── test/
│ └── test_example.gd # gdUnit4 test template
├── e2e/
│ └── conftest.py # E2E test config (GODOT_PROJECT = "..")
├── assets/
│ ├── sprites/
│ ├── audio/
│ ├── fonts/
│ └── ui/
├── references/ # Scene reference images (generated by /gm-asset)
└── addons/ # gecs + gdUnit4 + godot_e2e installed here.tscn Generation Rules
When writing `.tscn` files (from templates or manually), follow these rules strictly:
1. **No UID references** — use `res://path/to/script.gd` paths, never `uid://xxx`. UID references fail in headless/CI environments because `uid_cache.bin` cannot be rebuilt. 2. **load_steps formula** — `load_steps = ext_resource_count + sub_resource_count + 1`. Count carefully; mismatch causes parse errors. 3. **parent attribute required** — only the root `[node]` omits `parent`. Every other node MUST have `parent="."` (direct child of root) or `parent="path/to/parent"`. 4. **World node setup** — always set `system_nodes_root = NodePath(".")` and `entity_nodes_root = NodePath(".")` when using SystemGroups.
Step 3 — Fill Templates
Read each template from `templates/`, replace all `{{placeholders}}`, write output. Remove any template comments (lines starting with `; TEMPLATE:`) from the output.
| Template | Output Path | Notes | |----------|------------|-------| | `project.godot.tmpl` | `project.godot` | Must be valid Godot ConfigFile | | `claude.md.tmpl` | `CLAUDE.md` | Fill game info + ECS reference | | `gitignore.tmpl` | `.gitignore` | Use as-is, no placeholders | | `main_scene.tmpl` | `scenes/main.tscn` | Use a 2D root node | | `world_scene.tmpl` | `scenes/game_world.tscn` | Use 2D node + camera types; gameplay scene gets a World child node added during `/gm-build` | | `test_example.tmpl` | `test/test_example.gd` | Replace `{{GameNamePascal}}` | | `component.tmpl` | `src/components/c_example.gd` | Example stub | | `system.tmpl` | `src/systems/example_system.gd` | Example stub |
gecs World setup
gecs v7.1.0 ships `class_name World` in `addons/gecs/ecs/world.gd`. The canonical scene-node pattern:
- Add a `Node` child to your gameplay scene with
`script = res://addons/gecs/ecs/world.gd`, named `World`, with `system_nodes_root = NodePath("Systems")` and `entity_nodes_root = NodePath("Entities")`.
- The main scene script wires it up:
`@onready var world: World = $World` then `ECS.world = world` in `_ready()`.
- Drive systems via `world.process(delta, "gameplay")` /
`world.process(delta, "physics")` from `_process` / `_physics_process`.
Scaffold leaves the World node out — gameplay scene structure is filled in during `/gm-build`. See the gecs skill for the full World API.
Game Plan ECS stubs
If the Game Plan includes an ECS Architecture section with components and systems:
- **Components**: for each planned component (e.g., `C_Velocity`), create a file in
`src/components/` based on `component.tmpl`. Fill the class name and add `@export` vars from the plan.
- **Systems**: for each planned system (e.g., `MovementSystem`), create a file in
`src/systems/` based on `system.tmpl`. Fill the class name and `query()` with the required components.
- **World**: register systems by adding them as chil
Read more
name: project-scaffold description: | Generate a new Godot game project with standardized ECS structure and tooling. Use when starting a new game: "create a project", "set up a new game", "scaffold", "initialize", "new project", "start building", "let's make it". Triggers after game-planner produces a confirmed plan, or when the user provides a game name + genre directly. Even for simple requests like "make me a new Godot project", use this skill to ensure proper ECS structure. Creates directory structure, project.godot, CLAUDE.md, gecs World setup, addon stubs, and template source files based on the game plan or user input.
Project Scaffold
$ARGUMENTS
Generate a new Godot game project with GodotMaker's ECS architecture. Read templates from this skill's `templates/` directory, fill `{{placeholders}}` with values from the game plan or user input, and write results to the target.
Step 1 — Gather Variables
If a confirmed Game Plan exists in the conversation (from game-planner), extract variables from it. Otherwise, ask the user for **game name** and **genre** at minimum — use genre defaults for everything else.
| Variable | Source | Default | |----------|--------|---------| | `{{game_name}}` | user input, snake_case, used as directory name | *required* | | `{{game_title}}` | user input or Title Case of game_name | *required* | | `{{genre}}` | Game Plan "Genre" or user | `"platformer"` | | `{{perspective}}` | Fixed framework target | `"2D"` | | `{{viewport_width}}` | genre defaults table | `1280` | | `{{viewport_height}}` | genre defaults table | `720` | | `{{rendering_method}}` | fixed 2D renderer | `"gl_compatibility"` | | `{{root_node_type}}` | fixed 2D root | `"Node2D"` | | `{{camera_type}}` | fixed 2D camera | `"Camera2D"` | | `{{game_description}}` | Game Plan summary or one-line from user | genre name + " game" |
**Genre defaults:**
| Genre | Viewport | Gravity | Input Actions | |-------|----------|---------|---------------| | Platformer | 1280x720 | 980.0 | move_left, move_right, jump | | Top-down | 1280x720 | none | move_up, move_down, move_left, move_right | | Puzzle | 1280x720 | none | select, confirm, cancel | | Endless runner | 720x1280 | 980.0 | jump |
Step 2 — Create Directory Structure
Create the project root and all subdirectories:
{{game_name}}/
├── project.godot
├── CLAUDE.md
├── .gitignore
├── src/
│ ├── components/ # C_ prefixed component scripts
│ ├── systems/ # NameSystem scripts
│ ├── entities/ # Entity scene definitions
│ └── ui/ # UI scenes and scripts
├── scenes/
│ ├── main.tscn # Entry point scene
│ └── game_world.tscn # Gameplay scene with camera
├── test/
│ └── test_example.gd # gdUnit4 test template
├── e2e/
│ └── conftest.py # E2E test config (GODOT_PROJECT = "..")
├── assets/
│ ├── sprites/
│ ├── audio/
│ ├── fonts/
│ └── ui/
├── references/ # Scene reference images (generated by /gm-asset)
└── addons/ # gecs + gdUnit4 + godot_e2e installed here.tscn Generation Rules
When writing `.tscn` files (from templates or manually), follow these rules strictly:
1. **No UID references** — use `res://path/to/script.gd` paths, never `uid://xxx`. UID references fail in headless/CI environments because `uid_cache.bin` cannot be rebuilt. 2. **load_steps formula** — `load_steps = ext_resource_count + sub_resource_count + 1`. Count carefully; mismatch causes parse errors. 3. **parent attribute required** — only the root `[node]` omits `parent`. Every other node MUST have `parent="."` (direct child of root) or `parent="path/to/parent"`. 4. **World node setup** — always set `system_nodes_root = NodePath(".")` and `entity_nodes_root = NodePath(".")` when using SystemGroups.
Step 3 — Fill Templates
Read each template from `templates/`, replace all `{{placeholders}}`, write output. Remove any template comments (lines starting with `; TEMPLATE:`) from the output.
| Template | Output Path | Notes | |----------|------------|-------| | `project.godot.tmpl` | `project.godot` | Must be valid Godot ConfigFile | | `claude.md.tmpl` | `CLAUDE.md` | Fill game info + ECS reference | | `gitignore.tmpl` | `.gitignore` | Use as-is, no placeholders | | `main_scene.tmpl` | `scenes/main.tscn` | Use a 2D root node | | `world_scene.tmpl` | `scenes/game_world.tscn` | Use 2D node + camera types; gameplay scene gets a World child node added during `/gm-build` | | `test_example.tmpl` | `test/test_example.gd` | Replace `{{GameNamePascal}}` | | `component.tmpl` | `src/components/c_example.gd` | Example stub | | `system.tmpl` | `src/systems/example_system.gd` | Example stub |
gecs World setup
gecs v7.1.0 ships `class_name World` in `addons/gecs/ecs/world.gd`. The canonical scene-node pattern:
- Add a `Node` child to your gameplay scene with
`script = res://addons/gecs/ecs/world.gd`, named `World`, with `system_nodes_root = NodePath("Systems")` and `entity_nodes_root = NodePath("Entities")`.
- The main scene script wires it up:
`@onready var world: World = $World` then `ECS.world = world` in `_ready()`.
- Drive systems via `world.process(delta, "gameplay")` /
`world.process(delta, "physics")` from `_process` / `_physics_process`.
Scaffold leaves the World node out — gameplay scene structure is filled in during `/gm-build`. See the gecs skill for the full World API.
Game Plan ECS stubs
If the Game Plan includes an ECS Architecture section with components and systems:
- **Components**: for each planned component (e.g., `C_Velocity`), create a file in
`src/components/` based on `component.tmpl`. Fill the class name and add `@export` vars from the plan.
- **Systems**: for each planned system (e.g., `MovementSystem`), create a file in
`src/systems/` based on `system.tmpl`. Fill the class name and `query()` with the required components.
- **World**: register systems by adding them as chil
Autonomous text-to-game pipeline for Godot, powered by Claude Code,Codex,Opencode
Repo: RandallLiuXin/GodotMaker
Other skills on godotmaker.
- /background-map
Generate and validate a fixed-viewport background, map base, or parallax plate as a ready-to-load Texture2D.
Open skill - /card-kit
Produce reusable card art sources and native Godot card UI resources.
Open skill - /character-bundle
Produce one illustrated character SpriteFrames resource from high-level body-action intent, optional character and style references, and a resolved animation plan.
Open skill - /compact-prop-pack
Produce a reusable compact-prop atlas from one provider source sheet, with independently loadable AtlasTexture resources for every declared prop.
Open skill - /fx-bundle
Produce a standalone static Texture2D effect or one explicitly timed animated SpriteFrames effect.
Open skill - /platform-strip
Generate non-pixel-art, horizontally repeatable platform strips from real image sources as fixed Texture2D cells or AtlasTexture regions.
Open skill

