Skip to content
Automation
Skill

/gm-finalize

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

From plugin
godotmaker
56241 skills7 agents15 hooks

Claude Code

$ npx -y skills add RandallLiuXin/GodotMaker --skill gm-finalize --agent claude-code

SKILL.md

gm-finalize.SKILL.md
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

GodotMaker Finalize

$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.

Session Setup

**FIRST ACTION — before anything else:** Write `finalize` to `.godotmaker/current_role`.

Resume Check

Read `.godotmaker/stage.jsonl` (treat as empty if missing) — each line is `{"role": X, "ts": Y, ...}`.

  • If `PLAN.md` does not exist or is missing the `**Tag:**` header → STOP. Tell the user the project is in a bad state; re-run `/gm-gdd` to regenerate the current tag's working docs.
  • If **no event with `role == "accept"` and `decision == "accept"`** exists anywhere in the file → STOP. Tell user to run `/gm-accept` first.

(Events with `decision == "fix"` or `decision == "done"` are trace records, not completions.)

  • If `.godotmaker/final_report.json` exists **and** `git tag <Tag>` already exists → STOP. Tell the user:

> "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."

  • Otherwise → proceed.

**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.

Resolve `godot` binary

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.

Process

1. Read the current tag

Read `PLAN.md`, extract `**Tag:**` header value (e.g. `v0.2.0`). All later steps refer to this as `<Tag>`.

2. Quick Sanity Check

  • `"<godot_path>" --headless --quit 2>&1` — builds clean
  • `PLAN.md` — no `pending` or `in_progress` tasks; all `verified`
  • `.godotmaker/evaluation.json` exists with `result: "approve"`

If any check fails, STOP and tell the user which one — finalize must not seal a broken tag.

3. Document Consistency Check (current tag scope)

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`.

  • **PLAN.md**: All tasks are `verified`; Tag Mechanics and Inherited Mechanics sections exist.
  • **STRUCTURE.md**: `extends Component` and `extends System` filenames under `src/` appear in the component/system listings, and architecture ownership, dependencies, ordering constraints, and stable invariants match the final implementation.
  • **ASSETS.md**: Asset paths for current-tag generated rows exist under `assets/` or `references/`.
  • **SCENES.md**: Scene paths referenced for this tag exist on disk.

Apply documentation fixes only. Finalize does not change code.

4. Archive into `docs/tags/<Tag>/`

From the project root run:

python tools/seal_tag.py archive <Tag>

The helper copies per-tag working docs 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>/DESIGN.md` | `DESIGN.md` | | `docs/tags/<Tag>/SCENES.md` | `SCENES.md` | | `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` |

Other exit codes: 2 if any required document source is missing, 1 if a required document copy fails, 3 if the tag is already sealed.

Then verify the archive landed — list `docs/tags/<Tag>/` and confirm all document destination files are present. If a required document destination is missing or has stale content (size or mtime mismatching the source), STOP and report to the user.

Do not Edit/Write these destinations yourself.

Do NOT archive `ASSETS.md`, `.godotmaker/stage.jsonl`, `metrics.jsonl`, or `traces/`. Caches and temp files (`__pycache__/`, `*.pyc`, `*.tmp`, `*.log`, …) are filtered out by the helper.

5. Generate `docs/tags/<Tag>/CHANGELOG.md`

From the

Read more
@randallliuxin
Ships withgodotmaker

Autonomous text-to-game pipeline for Godot, powered by Claude Code,Codex,Opencode

56241 skills7 agents
Get the whole plugin

Stars on GitHub

Momentum

stars in total
562
Star history of RandallLiuXin/GodotMaker on GitHub, a chart by star-history.com

Other skills on godotmaker.

platform-strip

platform-strip

Generate non-pixel-art, horizontally repeatable platform strips from real image sources as fixed Texture2D cells or AtlasTexture…

More skills from other plugins.

agent-builder

agent-builder

Load immediately after an Agent intent, before the first agent_builder_* call. Governs how you create, configure, test, and…

n8n2w209k
@n8n-io@n8n-ioInstall Skill
browser-use

browser-use

Direct browser control via CDP for web interaction: automation, scraping, testing, screenshots, and site/app work. Also covers…

@browser-use@browser-useInstall Skill
add-anydoc

add-anydoc

Add local office-document-to-Markdown conversion to NanoClaw agent containers with the pinned Firecrawl AnyDoc CLI. Use when…

@nanocoai@nanocoaiInstall Skill

Questions about gm-finalize.

Which coding agents can use gm-finalize?
gm-finalize installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.