background-map
Generate and validate a fixed-viewport background, map base, or parallax plate as a ready-to-load Texture2D.
Seal the current tag: snapshot the per-tag working docs into docs/tags/<Tag>/, write a CHANGELOG entry, run `git tag`, and reset per-tag runtime state for the next /gm-gdd round. Does NOT package a release — that lives in a separate skill. Explicit invocation only — use
$ npx -y skills add RandallLiuXin/GodotMaker --skill gm-finalize --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/gm-finalizeContext preview
The summary Claude sees to decide when to auto-load this skill.
Seal the current tag: snapshot the per-tag working docs into docs/tags/<Tag>/, write a CHANGELOG entry, run `git tag`, and reset per-tag runtime state for the next /gm-gdd round. Does NOT package a release — that lives in a separate skill. Explicit invocation only — use
name: gm-finalize description: | Seal the current tag: snapshot the per-tag working docs into docs/tags/<Tag>/, write a CHANGELOG entry, run `git tag`, and reset per-tag runtime state for the next /gm-gdd round. Does NOT package a release — that lives in a separate skill. Explicit invocation only — use /gm-finalize. disable-model-invocation: true
$ARGUMENTS
You are sealing the **current tag** (vX.Y.Z) so the next `/gm-gdd` round can start cleanly. This is a per-tag operation, not a "the game is finished" operation. The user may continue to the next tag right after, or stop here — either way, this tag's deliverables are now archived and git-tagged.
**FIRST ACTION — before anything else:** Write `finalize` to `.godotmaker/current_role`.
Read `.godotmaker/stage.jsonl` (treat as empty if missing) — each line is `{"role": X, "ts": Y, ...}`.
(Events with `decision == "fix"` or `decision == "done"` are trace records, not completions.)
> "Tag {Tag} already finalized. Run /gm-gdd to start the next tag, or stop here. > If you need to redo this step or have other plans, just tell me."
**Resume condition for a half-finished archive.** `docs/tags/<Tag>/evidence/manifest.json` records whether the archive is sealed:
| Archive state | Meaning | What to do | |---|---|---| | directory absent | finalize never reached Step 4 | run Step 4 normally | | manifest absent, or `"sealed": false` | a previous run died mid-finalize | re-run Steps 4→6b; both commands overwrite a partial archive | | `"sealed": true` | the tag is already sealed | do NOT re-archive — `archive` / `index` exit 3 on purpose |
`"sealed": true` is written after every other file inside the archive, so an interrupted finalize always lands in the resumable row — there is no state where the tag reads as sealed but the archive is incomplete. If the tag is sealed but `docs/tags/README.md` does not list it, the seal succeeded and only the index write failed: run `python tools/seal_tag.py reindex`, not `archive` or `index`.
Never pass `--force` to work around exit 3. A sealed archive is immutable; if the user genuinely wants to reseal, say so explicitly and get their confirmation first.
Read `godot_path` from `.claude/godotmaker.yaml` and substitute it verbatim for `<godot_path>` in every `godot --headless …` command below. The path was validated at publish time and is the source of truth for which Godot binary this project uses.
If `.claude/godotmaker.yaml` is missing the `godot_path` field, fall back to plain `godot` (PATH lookup). If THAT also fails, STOP and tell the user `Godot binary not configured — re-run tools/publish.py to set godot_path in .claude/godotmaker.yaml`. Do NOT spelunk through PATH directories or guess install locations.
Read `PLAN.md`, extract `**Tag:**` header value (e.g. `v0.2.0`). All later steps refer to this as `<Tag>`.
If any check fails, STOP and tell the user which one — finalize must not seal a broken tag.
Run these fast gates before archiving. For passing gates, continue silently. For failures, update the root doc to match reality and remember the path for `doc_updates`.
Apply documentation fixes only. Finalize does not change code.
From the project root run:
python tools/seal_tag.py archive <Tag>
The helper copies per-tag working docs, the `memory/` subtree and best-effort runtime evidence:
| Destination | Source | |---|---| | `docs/tags/<Tag>/GDD-snapshot.md` | `GDD.md` | | `docs/tags/<Tag>/PLAN.md` | `PLAN.md` | | `docs/tags/<Tag>/STRUCTURE.md` | `STRUCTURE.md` | | `docs/tags/<Tag>/STYLE.md` | `STYLE.md` | | `docs/tags/<Tag>/SCENES.md` | `SCENES.md` | | `docs/tags/<Tag>/MEMORY.md` | `MEMORY.md` | | `docs/tags/<Tag>/memory/` | `memory/` | | `docs/tags/<Tag>/evaluation-final.json` | `.godotmaker/evaluation.json` | | `docs/tags/<Tag>/evidence/e2e/` | `e2e/` excluding `e2e/screenshots/` | | `docs/tags/<Tag>/evidence/screenshots/` | `e2e/screenshots/` | | `docs/tags/<Tag>/evidence/manifest.json` | generated by `tools/seal_tag.py archive` |
`memory/` is archived alongside `MEMORY.md` so the frozen architecture index still resolves inside the archive. The helper then link-checks the archived `MEMORY.md`:
Autonomous text-to-game pipeline for Godot, powered by Claude Code,Codex,Opencode
Repo: RandallLiuXin/GodotMaker
Generate and validate a fixed-viewport background, map base, or parallax plate as a ready-to-load Texture2D.
Produce reusable card art sources and native Godot card UI resources.
Produce one illustrated character SpriteFrames resource from high-level body-action intent, optional character and style references, and a resolved animation…
Produce a reusable compact-prop atlas from one provider source sheet, with independently loadable AtlasTexture resources for every declared prop.
Produce a standalone static Texture2D effect or one explicitly timed animated SpriteFrames effect.
Generate non-pixel-art, horizontally repeatable platform strips from real image sources as fixed Texture2D cells or AtlasTexture regions.