Repository navigation
Releases: Freakling/Godot-Director
Release list
v4.1.1
How to install
Designed to work with any AI coding assistant that reads AGENTS.md. Built and tested on Claude Code; other assistants are untested.
Your game needs git (git init if it has none) and no uncommitted changes. You also need Godot 4.5 or newer, and bash (on Windows it comes with Git for Windows).
Option 1: the skill. In your game's folder, run:
npx skills add Freakling/Godot-Director
That installs the skill for the assistant you choose in the prompt. In Claude Code it becomes a /godot-director command. The skill fetches the latest Godot Director release outside your game and runs onboarding.
Option 2: the Claude Code plugin. In Claude Code:
/plugin marketplace add Freakling/Godot-Director
/plugin install godot-director@godot-director
The plugin installs the latest release. Then open a new Claude Code session in your game's folder (or run /reload-plugins), and run /godot-director:godot-director.
Option 3: manual install. Put the latest release in your game's root folder, next to project.godot, as a folder named Godot-Director. The release's tag is v followed by its version number, and the Releases page shows the latest one. Either run git clone --branch <tag> --depth 1 https://github.com/Freakling/Godot-Director.git Godot-Director there, replacing <tag> with it, or download that release's source zip from the Releases page and rename the extracted folder. Then ask your assistant:
Read Godot-Director/ONBOARDING.md and follow it to install Godot Director into this project.
Afterwards, restart Claude Code so the new commands load. Each new clone of the game later needs one command: bash tools/setup-clone.sh.
With another AI assistant: tell onboarding, and it installs the tool-neutral core only (--tools none). Your assistant then reads AGENTS.md, which points it to .godot-director/rules.md and the procedures.
How to upgrade
- Skill: run
npx skills add Freakling/Godot-Directoragain to get the skill of the latest release, then ask for it (/godot-directorin Claude Code). - Plugin: run
/plugin marketplace update godot-directorand then/plugin update godot-director@godot-director. Start a new session in the game, and run/godot-director:godot-directoragain. - Manual: put the new Godot Director folder in the game, and ask for ONBOARDING.md again.
Only Godot Director's own files are replaced, and your edits to them are kept. When a new version also changes a file you edited, the new version is written next to it as <file>.gdir-new for you to merge. Review the result with git diff.
What's changed
- An install from a development snapshot says so. An install from a source whose
CHANGELOG.mdhas entries under## Unreleasedrecords# godot-director <version> + unreleased (<commit>)as the manifest's first line, and its closing lines say it is a development snapshot, not a release, with where the latest release is listed.VERSIONstays at the last release until a release is cut, so the manifest tells the truth. The commit comes from the source's git checkout (a release zip has none) and goes on a# source <commit>line, which release installs get too. An install from a release records the plain version. Upgrades read the old version without the suffix, so an upgrade from a snapshot works.- Upgrade steps: none: the next upgrade rewrites the manifest.
v4.1.0
How to install
Designed to work with any AI coding assistant that reads AGENTS.md. Built and tested on Claude Code; other assistants are untested.
Your game needs git (git init if it has none) and no uncommitted changes. You also need Godot 4.5 or newer, and bash (on Windows it comes with Git for Windows).
Option 1: the skill. In your game's folder, run:
npx skills add Freakling/Godot-Director
That installs the skill for the assistant you choose in the prompt. In Claude Code it becomes a /godot-director command. The skill fetches the latest Godot Director release outside your game and runs onboarding.
Option 2: the Claude Code plugin. In Claude Code:
/plugin marketplace add Freakling/Godot-Director
/plugin install godot-director@godot-director
The plugin installs the latest release. Then open a new Claude Code session in your game's folder (or run /reload-plugins), and run /godot-director:godot-director.
Option 3: manual install. Put the latest release in your game's root folder, next to project.godot, as a folder named Godot-Director. The release's tag is v followed by its version number, and the Releases page shows the latest one. Either run git clone --branch <tag> --depth 1 https://github.com/Freakling/Godot-Director.git Godot-Director there, replacing <tag> with it, or download that release's source zip from the Releases page and rename the extracted folder. Then ask your assistant:
Read Godot-Director/ONBOARDING.md and follow it to install Godot Director into this project.
Afterwards, restart Claude Code so the new commands load. Each new clone of the game later needs one command: bash tools/setup-clone.sh.
With another AI assistant: tell onboarding, and it installs the tool-neutral core only (--tools none). Your assistant then reads AGENTS.md, which points it to .godot-director/rules.md and the procedures.
How to upgrade
- Skill: run
npx skills add Freakling/Godot-Directoragain to get the skill of the latest release, then ask for it (/godot-directorin Claude Code). - Plugin: run
/plugin marketplace update godot-directorand then/plugin update godot-director@godot-director. Start a new session in the game, and run/godot-director:godot-directoragain. - Manual: put the new Godot Director folder in the game, and ask for ONBOARDING.md again.
Only Godot Director's own files are replaced, and your edits to them are kept. When a new version also changes a file you edited, the new version is written next to it as <file>.gdir-new for you to merge. Review the result with git diff.
What's changed
- Autoplay's no-focus check looks under the nodes the adapter names. A shell that keeps each view's flat UI outside the view node (a HUD layer, a
ui_rootit hands each view) or draws a view's page in a SubViewport with a stand-in control holding the window's focus no longer failsno-focuson every step. The adapter base has a new hook,focus_roots() -> Array[Node]: the nodes under which the current view's focusable controls and its focus owner live. It returns the view node by default, so a game whose adapter doesn't override it behaves as before.- The invariant. The focus owner satisfies the check when it is a root or under any root (a control in another window is still exempt); the check looks at a focusable control (an enabled button) under any root; a root that is a
SubViewport(a page on a sheet) counts its own focus owner as well as the window's, so the page's focused control satisfies the check while the window's focus sits on a stand-in in another root. An empty list means no rule for that step: a game may return[]for a screen that is mouse-only by design, and the invariant then doesn't apply there. The freed-view check still usesview_node(). - The finding names its roots, so a wrong hook is easy to spot:
the view hub has no focused control under ViewUI, HUD (so a keyboard or controller player can't act). A view with the default hook readsthe view shop has no focused control under ShopScreen (so ...): the text and the signature of an existing no-focus finding change with it. - A weight of 0 means never. A scenario's
weightsentry of 0 used to pick the first action when every candidate was at 0; now the step picks nothing. Smoke carries on to the progress action (and ends the turn it was playing), and a random or end_turn strategy that has nothing else to pick ends. - Seeds, example, docs.
tools/autoplay_adapter.gd(the seed) hasfocus_roots()stubbed with its comment, andtools/autoplay_scenarios.gd's header says a weight of 0 means never; the example adapter's header points at the hook.procedures/autoplay.mdsays how to read ano-focusfinding and fix it withfocus_roots(),rules.mdhas a rule for it, and the README names it. The selftest covers a HUD outside the view node (the hook and the default), the finding naming every root, a SubViewport page with a stand-in outside it, an empty list, and every candidate at weight 0. - Upgrade steps: none for a game whose views keep their UI under the view node: the hook is the base's and arrives on upgrade. A game that keeps a view's UI elsewhere adds
focus_roots()totools/autoplay_adapter.gd, returning the view node plus the nodes that hold its focus (such as[view, ui_root], plus any SubViewport page), and, once its smoke run is clean, setsenforce=["smoke"]under[autoplay]intools/check.cfg. A screen that is mouse-only by design returns[]. An adapter that overridesview_node()keeps working, since the default roots are the node it returns.
- The invariant. The focus owner satisfies the check when it is a root or under any root (a control in another window is still exempt); the check looks at a focusable control (an enabled button) under any root; a root that is a
v4.0.0
How to install
Designed to work with any AI coding assistant that reads AGENTS.md. Built and tested on Claude Code; other assistants are untested.
Your game needs git (git init if it has none) and no uncommitted changes. You also need Godot 4.5 or newer, and bash (on Windows it comes with Git for Windows).
Option 1: the skill. In your game's folder, run:
npx skills add Freakling/Godot-Director
That installs the skill for the assistant you choose in the prompt. In Claude Code it becomes a /godot-director command. The skill fetches the latest Godot Director release outside your game and runs onboarding.
Option 2: the Claude Code plugin. In Claude Code:
/plugin marketplace add Freakling/Godot-Director
/plugin install godot-director@godot-director
The plugin installs the latest release. Then open a new Claude Code session in your game's folder (or run /reload-plugins), and run /godot-director:godot-director.
Option 3: manual install. Put the latest release in your game's root folder, next to project.godot, as a folder named Godot-Director. The release's tag is v followed by its version number, and the Releases page shows the latest one. Either run git clone --branch <tag> --depth 1 https://github.com/Freakling/Godot-Director.git Godot-Director there, replacing <tag> with it, or download that release's source zip from the Releases page and rename the extracted folder. Then ask your assistant:
Read Godot-Director/ONBOARDING.md and follow it to install Godot Director into this project.
Afterwards, restart Claude Code so the new commands load. Each new clone of the game later needs one command: bash tools/setup-clone.sh.
With another AI assistant: tell onboarding, and it installs the tool-neutral core only (--tools none). Your assistant then reads AGENTS.md, which points it to .godot-director/rules.md and the procedures.
How to upgrade
- Skill: run
npx skills add Freakling/Godot-Directoragain to get the skill of the latest release, then ask for it (/godot-directorin Claude Code). - Plugin: run
/plugin marketplace update godot-directorand then/plugin update godot-director@godot-director. Start a new session in the game, and run/godot-director:godot-directoragain. - Manual: put the new Godot Director folder in the game, and ask for ONBOARDING.md again.
Only Godot Director's own files are replaced, and your edits to them are kept. When a new version also changes a file you edited, the new version is written next to it as <file>.gdir-new for you to merge. Review the result with git diff.
Why 4.0
The minimum Godot is now 4.5, because the engine Logger that captures errors inside the game needs it. Every game gets a play log, which runs on that Logger, so a game on Godot 4.3 or 4.4 upgrades the engine first.
What's changed
- New: the play log. Every game gets a log of what happened in each run, one plain-text line for you and one JSON line for tools, so an assistant can read what a playtest did. The framework owns
tools/play_log_base.gd; the game'sPlayLogautoload,tools/play_log.gd(a new seed, liketools/ui_screens.gd), extends it and fills its hooks. It works in debug and release builds.- Two files per run, one call.
PlayLog.log_event(category, event, text, data)writesHH:MM:SS T<turn> [category] texttouser://logs/play/run-<datetime>.log, and{"t": ms, "turn": n, "cat": "...", "event": "<stable_id>", "text": "...", "data": {...}}to the.jsonlbeside it. Tools read the stableeventid; the text is free to change. Each line is flushed as it's written, so a crash keeps everything up to it. Only the newestkeep_filesruns are kept (20 by default). - A run's files. Until the game decides the run, lines are held and stamped
T-.begin_run()starts the files with the held lines and returns the run id to keep in the run save;continue_run(id)appends to that run's files and drops the held lines (engine errors and warnings are kept), so a throwaway boot never reads as turn 0.continue_run()accepts only a run id (YYYYMMDD-HHMMSS, with a-NNsuffix when two start in one second): the id comes from a save the player can edit, so anything else gets new files. A launch that ends before any run began keeps its lines inboot-<datetime>.logand.jsonl, the newestkeep_boot_files(5) of them, so open-and-quit launches never push real runs out. Each session opens with a header: build version, Godot version, OS, debug or release, the command line, the game's_session_extras()(its settings, with secret ones left out) and a resource count per folder ofdata/. - A run's first view. A run that starts without the shell announcing a view gets the current one as its first
view.changedline, a few frames afterbegin_run()orcontinue_run()(first_view_frames, 3), named from the screen catalog (else the scene's node name in snake_case), or by the game's_current_view()hook for a shell that swaps views inside one scene. The log and its review then always carry the first view ("initial": truein the line's data). The shell's ownview_changedinside those frames is the line instead, so a view isn't logged twice, and a second run in the same session gets its own first view. - Built in, for any genre: engine errors and warnings through a
Logger(OS.add_logger; queued under a mutex from any thread and logged on the main thread, with the top frame of the script backtrace, which release builds have only withdebug/settings/gdscript/always_track_call_stacks; the same error is logged at mostmax_engine_repeatstimes, 20 by default, so a hook that fails every frame can't flood the files), InputMap actions pressed (by name, never typed text, and nothing while a text field has focus; polled once per frame, so a held stick logs once and an action a node handles is still logged), window and focus changes, frame hitches overhitch_threshold_ms, orphan-node counts at each snapshot in debug builds, view changes from the shell'sview_changed(name)signal (watch_views()), and the main progress button (watch_progress_button()): its blocked state each time it changes, and every press with what blocked it. - The game's hooks:
_session_extras(),_build_snapshot()(logged bylog_snapshot()wherever the player may act),progress_block_reason()and_install_id(). The seed has all four stubbed and marked## PLACEHOLDER. - Scrubbed in the base: the OS user name, the home folder (in every slash style), the install id and the text values of secret settings never reach the files. A setting is secret when its name contains
secret,token,password,passwd,_key,apikey,auth,credential,_id,uuid,guid,accountoremail(secret_names). The user name is replaced only as a whole word, and only when it has 3 characters or more, so a short name doesn't blank ordinary words; the home folder covers it in paths. A hard crash can lose the engine errors queued in its last frame, since they're written on the main thread; Godot's owngodot.logkeeps them. - Tests and tools.
start_capture()records lines into memory, also under the check, so a test asserts on them;tail()keeps the recent lines. Nothing is written under the check or a capture, or when a tool script runs the project (--script); thegodot_director_autoplaymeta turns writing back on, for autoplay. - Rules.
rules.mdgets five rules: everything is logged (every player action, turn step, view change and blocked progress logs a line with a stable event id, and a test asserts on it), every action is drivable (it appears in the autoplay adapter'slist_actions()with auiroute), agent-visible state (hidden values go in the dev menu's inspector and the snapshot; this replaces the advice to use the editor's Remote scene tree, which the agent can't see), seeded randomness (one seeded generator the run owns, its seed logged and its state saved) and privacy (nothing leaves the machine without the player's consent; logs hold no user name, home path, install id or typed text). Debug-only tools now says the play log ships in every build. - The example (
examples/market-day) registers itsPlayLog, logs each trade, day and the end of the market fromRunState, names the shop view and its Next Day button, and tests its lines throughstart_capture().
- Two files per run, one call.
- New: autoplay, the game plays itself.
bash tools/autoplay.sh <scenario>|--all [--seed N] [--steps N] [--no-images] [--size WxH]launches the real game through its main scene, with thegodot_director_autoplaymeta set anduser://pointed at a temporary folder, and plays a scenario through the game's adapter, so an assistant can playtest a change before you do. Exit codes as in capture: 0 clean, 1 findings, 3 couldn't run (no Godot, no display;--no-imagesplays headless). The framework ownstools/autoplay.sh,tools/autoplay.gd(the driver),tools/autoplay_adapter_base.gdandtools/autoplay_catalog.gd; the game owns three new seeds:tools/autoplay_adapter.gd,tools/autoplay_scenarios.gdandtools/autoplay_invariants.gd.- The adapter is the only way the driver reaches the game:
start_run(seed)(the run's seeded generator takes the seed),load_save(path),save_run(path),list_actions(),perform(action),state(),progress_block_reason()(the play log's by default),is_run_over(),current_view()andview_node(). An action has anid, alabel, akind(uiorapi) and, forui, a unique node name (%EndTurn) or an InputMap action; it may say it's theprogressaction, that itopensa catalog view or goesback, that itunblocksprogress, and itsweight. The seed's stubs are marked## PLACEHOLDER. - Real input. A
uiaction is a mouse click at the cen...
- The adapter is the only way the driver reaches the game:
v3.13.0
How to install
Designed to work with any AI coding assistant that reads AGENTS.md. Built and tested on Claude Code; other assistants are untested.
Your game needs git (git init if it has none) and no uncommitted changes. You also need Godot 4.3 or newer, and bash (on Windows it comes with Git for Windows).
Option 1: the skill. In your game's folder, run:
npx skills add Freakling/Godot-Director
That installs the skill for the assistant you choose in the prompt. In Claude Code it becomes a /godot-director command. The skill fetches the latest Godot Director release outside your game and runs onboarding.
Option 2: the Claude Code plugin. In Claude Code:
/plugin marketplace add Freakling/Godot-Director
/plugin install godot-director@godot-director
The plugin installs the latest release. Then open a new Claude Code session in your game's folder (or run /reload-plugins), and run /godot-director:godot-director.
Option 3: manual install. Put the latest release in your game's root folder, next to project.godot, as a folder named Godot-Director. The release's tag is v followed by its version number, and the Releases page shows the latest one. Either run git clone --branch <tag> --depth 1 https://github.com/Freakling/Godot-Director.git Godot-Director there, replacing <tag> with it, or download that release's source zip from the Releases page and rename the extracted folder. Then ask your assistant:
Read Godot-Director/ONBOARDING.md and follow it to install Godot Director into this project.
Afterwards, restart Claude Code so the new commands load. Each new clone of the game later needs one command: bash tools/setup-clone.sh.
With another AI assistant: tell onboarding, and it installs the tool-neutral core only (--tools none). Your assistant then reads AGENTS.md, which points it to .godot-director/rules.md and the procedures.
How to upgrade
- Skill: run
npx skills add Freakling/Godot-Directoragain to get the skill of the latest release, then ask for it (/godot-directorin Claude Code). - Plugin: run
/plugin marketplace update godot-directorand then/plugin update godot-director@godot-director. Start a new session in the game, and run/godot-director:godot-directoragain. - Manual: put the new Godot Director folder in the game, and ask for ONBOARDING.md again.
Only Godot Director's own files are replaced, and your edits to them are kept. When a new version also changes a file you edited, the new version is written next to it as <file>.gdir-new for you to merge. Review the result with git diff.
What's changed
- New: a Game Design Document template for you to fill in, in your own words (
design/director-gdd.md). Every game gets it, for a new game or one already underway. Its sections are overview and concept, gameplay mechanics and controls, art and visual style, audio, levels and world, UI and UX, and the milestone roadmap. Onboarding offers it before the design interview, as an alternative to the interview or an addition to it, and says why it helps: a written document gives the agent your intent and its context, and sets the stage for the design sessions and builds that follow. Fill it before onboarding, during it or later.- It stays yours.
design/gdd.mdremains the design record the agent maintains. Your document is input: the agent reads it, never edits it, and writes the current design into the GDD's own sections, so each fact lives in one place. - Onboarding reads a filled one first. For a new game it takes the interview's answers from it and asks only what it leaves open. For an existing game it builds the initial assessment (Architecture, GDD sections, first items) from it, together with the code and the existing documents. It marks what it took
(from your document)and what it worked out itself(inferred, please confirm), records decisions withwhy: from your document, and turns what is undecided into open questions. Tell the agent when the document changes and it brings the GDD in line.
- It stays yours.
- Align checks the GDD against reality.
align.md's item 6 is "Brief against reality". It reads the whole GDD and checks every statement of state (a section marked later or planned, a count, a list of what exists, a line saying work waits on something, "once X exists") against the built game, the done items and the latest releases. It also checks every decision line since the lastdocs: aligncommit one by one, not a sample. Mechanical drift gets fixed; design calls are reported with the stale statement named.
Upgrade steps
- Design document: the installer adds
design/director-gdd.mdwhen the game doesn't have it (project seeds are copied once and never overwritten). After the upgrade, the agent tells you it exists, where it is, and why writing it helps. If you fill it in, the agent reads it as ONBOARDING.md describes and bringsdesign/gdd.mdin line, marking what it inferred. Nothing else in the game changes. - Align: none. The procedure is framework-owned and arrives on upgrade.
v3.12.0
How to install
Designed to work with any AI coding assistant that reads AGENTS.md. Built and tested on Claude Code; other assistants are untested.
Install from the release, which installs the latest version. Pick one of three ways:
Option 1: the skill (any assistant):
npx skills add Freakling/Godot-Director
In Claude Code this becomes a /godot-director command. The skill fetches the latest Godot Director release and runs onboarding.
Option 2: the Claude Code plugin:
/plugin marketplace add Freakling/Godot-Director
/plugin install godot-director@godot-director
The plugin installs the latest release. Open a new session in your game, then run /godot-director:godot-director.
Option 3: manual:
Put the latest release in your game's root folder, next to project.godot, as a folder named Godot-Director. The release's tag is v followed by its version number, and the Releases page shows the latest one. Run git clone --branch <tag> --depth 1 https://github.com/Freakling/Godot-Director.git Godot-Director there, replacing <tag> with it, or download that release's source zip and rename the extracted folder. Then ask your assistant to read Godot-Director/ONBOARDING.md and follow it.
Upgrade:
- Skill: run
npx skills add Freakling/Godot-Directoragain to get the skill of the latest release, then ask for it (/godot-directorin Claude Code). - Plugin: run
/plugin marketplace update godot-directorand then/plugin update godot-director@godot-director. Start a new session in the game, and run/godot-director:godot-directoragain. - Manual: put the new Godot Director folder in the game, and ask for ONBOARDING.md again.
What's changed
- The repository ignores OS metadata files. A root
.gitignorekeeps.DS_Store,Thumbs.db,desktop.iniand__MACOSX/out of the repository, as the Claude plugin directory's scanner requires. - Fix: the protected-space guard blocks absolute paths. The guard for
director/matched file paths only as written, so a write todirector/given as an absolute path got through. It now resolves the path against the project root before matching, in Windows, Git Bash and POSIX forms, with..segments and case-insensitive matching on Windows. Paths outside the project root, and folders nameddirectorelsewhere in it, are still allowed. If you rely ondirector/being read-only for the agent, this release is the one that closes the absolute-path gap. /ui-designtells you how to open and save the starter drawing. The capture step gives one plain message: nothing to install, excalidraw.com in the browser with no account, how to open the starter (the menu's Open, or drag it in), how to save it asdirector/ui/<screen>.excalidraw, and that the drawing stays on the machine unless Live collaboration or a shareable link is used. In Chrome and Edge, Save to... lets you pick the folder; other browsers save to Downloads, so move and rename the file. The drawing guide (design/ui/README.md) gets a "Using Excalidraw" section with the same facts, plus the address-bar install.
Upgrade steps
None for games' own files. The .gitignore belongs to the Godot Director repository, and the hook is framework-owned and arrives on upgrade. An existing design/ui/README.md is the project's own and isn't rewritten; the capture step's message gives the same instructions the next time the agent hands over a starter drawing.
v3.11.0
How to install
Designed to work with any AI coding assistant that reads AGENTS.md. Built and tested on Claude Code; other assistants are untested.
Install from the release, which installs the latest version. Pick one of three ways:
Option 1: the skill (any assistant):
npx skills add Freakling/Godot-Director
In Claude Code this becomes a /godot-director command. The skill fetches the latest Godot Director release and runs onboarding.
Option 2: the Claude Code plugin:
/plugin marketplace add Freakling/Godot-Director
/plugin install godot-director@godot-director
The plugin installs the latest release. Open a new session in your game, then run /godot-director:godot-director.
Option 3: manual:
Put the latest release in your game's root folder, next to project.godot, as a folder named Godot-Director. The release's tag is v followed by its version number, and the Releases page shows the latest one. Run git clone --branch <tag> --depth 1 https://github.com/Freakling/Godot-Director.git Godot-Director there, replacing <tag> with it, or download that release's source zip and rename the extracted folder. Then ask your assistant to read Godot-Director/ONBOARDING.md and follow it.
Upgrade:
- Skill: run
npx skills add Freakling/Godot-Directoragain to get the skill of the latest release, then ask for it (/godot-directorin Claude Code). - Plugin: run
/plugin marketplace update godot-directorand then/plugin update godot-director@godot-director. Start a new session in the game, and run/godot-director:godot-directoragain. - Manual: put the new Godot Director folder in the game, and ask for ONBOARDING.md again.
What's changed
/ui-design lets you design your game's screens by drawing them, and checks the built screens against your drawings. The agent sees each screen the way a player does, so layout bugs that tests can't see are caught automatically. You draw over a screenshot in Excalidraw, which is free, open source, runs in a browser and needs no account. The agent reads exactly what you drew, asks about anything it can't tell, and then builds the screen to match.
The pieces:
- Capture: every screen, at every size.
bash tools/ui_capture.shrenders each screen offscreen at each size, with the project's stretch settings. For each screen and state it writes a screenshot, an element map (every visible control that is focusable, has text or has a unique name, with its position, focus order and overflow), the screenshot with each element outlined and numbered, and a layout lint. The screens are listed in a catalog (tools/ui_screens.gd), each with the scene it opens and how to put it in a representative state, built through the game's public APIs and debug hooks. Captures repeat exactly and touch no player data. Headless Godot renders nothing, so captures need a display; on Linux without one, the script usesxvfb-run. - Drawings: you draw the layout. Each screen gets a starter drawing with its screenshot locked inside a frame. You draw one rectangle per thing, colour says what changes (green new, blue kept but moved or resized, red removed, orange not sure), and
design/ui/README.mdexplains the rest./ui-design process <screen>reads the drawing, confirms its reading with you, settles open points with options and a recommendation, and records a screen spec, the decisions, and one item per screen. - Verify: the built screen is checked against its spec.
bash tools/ui_capture.sh <screen> --verifyprints one row per element in the spec: whether it is on screen, where it sits within a tolerance (4 percent of the screen by default), whether it can be reached by keyboard or controller, and whether it is lint-clean. It also lists unexpected elements and writes compare images that put your drawing beside the new capture. - A layout lint with seven rules: squeezed text, stretched controls, off-screen elements, overlaps, unreachable elements, no default focus, and hard-coded positions. Findings are advisory. You can turn the lint on in the project check for the screens you choose.
- Overlays. A catalog entry can name the HUD or toast layer a player sees over a screen, so captures show what players see.
- The workflow uses the spec. Build, review, the function check and align all work from the screen spec and drawing, and onboarding asks once whether you want to design screens by drawing.
- Selftest covers the wiring, the reader, the lint, the verify table and an upgrade from v3.10.0, and captures the example game's screens when a display is available.
Not tested in this release: macOS, Linux with xvfb, and a machine without a display.
Upgrade steps
- The installer creates
tools/ui_screens.gdandtools/ui_capture.cfgwhen the game doesn't have them, and adds the.gitignoreand.gitattributeslines; check that they're there, and commit the two files with their.uidfiles. - Replace the seed's main-scene entry in
tools/ui_screens.gdwith one entry per screen the game has (see.godot-director/procedures/ui-design.md› The catalog), or leave it for the next item that touches a screen. .claude/settings.jsonis framework-owned; if you edited it, merge.claude/settings.json.gdir-newand keep"Bash(bash tools/ui_capture.sh *)"inpermissions.allow. Restart Claude Code so the new skill loads.- The installer creates
design/ui/README.mdwhen the game doesn't have it. To design screens by drawing, createdirector/ui/and an emptydirector/.gdignore(so Godot doesn't import the PNGs you export there);director/is yours, and the agent never writes in it. - The installer writes
tools/ui_capture.cfgwith the layout lint in the check off (check_in_check=false,enforce=[]) when your game doesn't have it yet, and addstools/ui_verify.gdto the framework files. A game that already has the file keeps it: addcheck_in_check=falseandenforce=[]under[lint]andtolerance_pct=4.0under[verify](a missing key reads as off and as 4.0). To turn the lint on, setcheck_in_check=trueand list the screens whose capture is lint-clean inenforce; committools/ui_capture.cfgwith it, since the check's fingerprint covers it. - Run
bash tools/ui_capture.sh --missing(onboarding does this on an upgrade and reports; it never fails) and add a catalog entry for each screen scene it lists, or add the scene to[capture] skipif it isn't a screen. Give an entry theoverlaysa player sees over it (a HUD an autoload draws, for example"overlays": ["/root/Hud"]). - Add
design/ui/to the Layout table in your AGENTS.md (the template's row reads: screen specs, andcaptures/(gitignored); the director's drawings are indirector/ui/). If you want to design screens by drawing, set theUI / screen layoutrow in Ownership todirector designs (director/ui/), agent builds, keeping its placeholder. .claude/skills/ui-design/SKILL.mdand the proceduresbuild.md,review.md,function-check.mdandalign.mdare framework-owned: if you edited one, merge its.gdir-newfile. Restart Claude Code so the changed skill loads.
v3.10.0
How to install
Designed to work with any AI coding assistant that reads AGENTS.md. Built and tested on Claude Code; other assistants are untested.
Install from the release, which installs the latest version. Pick one of three ways:
Option 1: the skill (any assistant):
npx skills add Freakling/Godot-Director
In Claude Code this becomes a /godot-director command. The skill fetches the latest Godot Director release and runs onboarding.
Option 2: the Claude Code plugin:
/plugin marketplace add Freakling/Godot-Director
/plugin install godot-director@godot-director
The plugin installs the latest release. Open a new session in your game, then run /godot-director:godot-director.
Option 3: manual:
Put the latest release in your game's root folder, next to project.godot, as a folder named Godot-Director. The release's tag is v followed by its version number, and the Releases page shows the latest one. Run git clone --branch <tag> --depth 1 https://github.com/Freakling/Godot-Director.git Godot-Director there, replacing <tag> with it, or download that release's source zip and rename the extracted folder. Then ask your assistant to read Godot-Director/ONBOARDING.md and follow it.
Upgrade:
- Skill: run
npx skills add Freakling/Godot-Directoragain to get the skill of the latest release, then ask for it (/godot-directorin Claude Code). - Plugin: run
/plugin marketplace update godot-directorand then/plugin update godot-director@godot-director. Start a new session in the game, and run/godot-director:godot-directoragain. - Manual: put the new Godot Director folder in the game, and ask for ONBOARDING.md again.
What's changed
- New:
/releaseand a release step in onboarding (.godot-director/procedures/release.md). CI exports on every change; CD uploads builds to a platform's UAT branch or channel and, when you ask, promotes them to production.- You supply the upload commands; Godot Director knows no store.
release.cfgin the project root has one section per export preset with auatcommand, an optionalproductioncommand, andsecrets, the names of the environment variables the commands read. It is committed; only names are in it, never values. /releaseuploads to UAT and promotes only when asked. It checks the working tree is clean andbash tools/check.shpasses, exports the presets (/export), shows a dry run, then runstools/release.sh uat. Production needs your request, a passing UAT upload of the same commit and your yes. It never prints a secret.tools/release.sh uat|production [preset] [--dry-run]runs the commands fromrelease.cfgfor the presets whose builds are inbuilds/, and stops before running anything when a build is missing or a named secret is unset. Any CI can run it after its own export.- A GitHub Actions workflow template (
.godot-director/templates/release-workflow.yml, copied to.github/workflows/release.yml): it exports every preset on every push and pull request, uploads to UAT onmain, and has a production job run by hand that waits for approval from a protected GitHub Environment namedproduction. It is a starting point, not a finished workflow: the lines markedFILL IN(the Godot image, the upload tool to install, and the secret lines) are yours to fill in for your project. - Credentials are CI secrets only. Onboarding lists the secret names to set. They never go in the repo,
export_presets.cfg,release.cfgor the chat. - Onboarding offers the step after exports, and you can skip it: a skip adds an open question to GDD › Open Questions and a "Set up release" item that depends on it, as for exports.
- Selftest checks the wiring and the install, and runs
tools/release.shagainst a fakerelease.cfgwithechocommands, so it needs no network, export templates or credentials.
- You supply the upload commands; Godot Director knows no store.
Upgrade steps
- Ask the human whether the game should release builds, and run ONBOARDING.md › 6 › Release: the upload commands, the secret names, and (for GitHub Actions) the workflow file. If the human skips it, add the open question and the "Set up release" item that
.godot-director/procedures/release.md› "When the human skips it" gives, with the game's nextQandTnumbers.
v3.9.0
How to install
Designed to work with any AI coding assistant that reads AGENTS.md. Built and tested on Claude Code; other assistants are untested.
Install from the release, which installs the latest version. Pick one of three ways:
Option 1: the skill (any assistant):
npx skills add Freakling/Godot-Director
In Claude Code this becomes a /godot-director command. The skill fetches the latest Godot Director release and runs onboarding.
Option 2: the Claude Code plugin:
/plugin marketplace add Freakling/Godot-Director
/plugin install godot-director@godot-director
The plugin installs the latest release. Open a new session in your game, then run /godot-director:godot-director.
Option 3: manual:
Put the latest release in your game's root folder, next to project.godot, as a folder named Godot-Director. The release's tag is v followed by its version number, and the Releases page shows the latest one. Run git clone --branch <tag> --depth 1 https://github.com/Freakling/Godot-Director.git Godot-Director there, replacing <tag> with it, or download that release's source zip and rename the extracted folder. Then ask your assistant to read Godot-Director/ONBOARDING.md and follow it.
Upgrade:
- Skill: run
npx skills add Freakling/Godot-Directoragain to get the skill of the latest release, then ask for it (/godot-directorin Claude Code). - Plugin: run
/plugin marketplace update godot-directorand then/plugin update godot-director@godot-director. Start a new session in the game, and run/godot-director:godot-directoragain. - Manual: put the new Godot Director folder in the game, and ask for ONBOARDING.md again.
What's changed
- New:
/exportand an export step in onboarding (.godot-director/procedures/export.md). Exporting is Godot's own word for producing a game's binaries, so the skill is/export./exportexports the game. It reads the presets inexport_presets.cfg, finds Godot throughtools/godot_bin.local, checks that the export templates for the project's engine version are installed (and says how to install them when they aren't), runs--export-release(or--export-debugon request) headless for each preset, and reports the files it produced. Builds go tobuilds/<preset>/, which is gitignored. It commits nothing and changes no source file.- Onboarding asks for the export settings Godot doesn't have yet. The target platforms, and where exports run: on your machine, in a build container (local or in the cloud), or on a hosted service such as GitHub Actions, with guidance to set it up. The answers become presets in
export_presets.cfg, the platforms in the GDD, decision lines, and one line in AGENTS.md › Project rules. You can skip the step. - A skipped step stays visible. It adds an open question to GDD › Open Questions (which platforms, and where exports run) and a "Set up exports" item that depends on it.
/design Q<n>runs the step later, and/next-taskbuilds the setup once the question is answered. Changing exports later is a design session too. Depends oncan name an open question. An item that listsQ<n>there is ready once the question is no longer in Open Questions;/next-taskand the item format say so.- The installer adds
/builds/to the game's.gitignore. - Selftest checks that the procedure and skill exist and are wired into the rules, README, ONBOARDING and the skip path, that the installer ships them and the gitignore line, and needs no export templates. The example ignores
/builds/, and the scenarios gain one for/export.
Upgrade steps
- The installer adds
/builds/to the game's.gitignore; check that the line is there. - Ask the human whether the game should have exports, and run ONBOARDING.md › 6 › Exports: the platforms and where exports run. If the game already has
export_presets.cfg, read it first and ask only for what is missing. If the human skips it, add the open question and the "Set up exports" item that.godot-director/procedures/export.md› "When the human skips it" gives, with the game's nextQandTnumbers (bumpNextandNext IDs).
v3.8.0
How to install
Designed to work with any AI coding assistant that reads AGENTS.md. Built and tested on Claude Code; other assistants are untested.
Install from the release, which installs the latest version. Pick one of three ways:
Option 1: the skill (any assistant):
npx skills add Freakling/Godot-Director
In Claude Code this becomes a /godot-director command. The skill fetches the latest Godot Director release and runs onboarding.
Option 2: the Claude Code plugin:
/plugin marketplace add Freakling/Godot-Director
/plugin install godot-director@godot-director
The plugin installs the latest release. Open a new session in your game, then run /godot-director:godot-director.
Option 3: manual:
Put the latest release in your game's root folder, next to project.godot, as a folder named Godot-Director. The release's tag is v followed by its version number, and the Releases page shows the latest one. Run git clone --branch <tag> --depth 1 https://github.com/Freakling/Godot-Director.git Godot-Director there, replacing <tag> with it, or download that release's source zip and rename the extracted folder. Then ask your assistant to read Godot-Director/ONBOARDING.md and follow it.
Upgrade:
- Skill: run
npx skills add Freakling/Godot-Directoragain to get the skill of the latest release, then ask for it (/godot-directorin Claude Code). - Plugin: run
/plugin marketplace update godot-directorand then/plugin update godot-director@godot-director. Start a new session in the game, and run/godot-director:godot-directoragain. - Manual: put the new Godot Director folder in the game, and ask for ONBOARDING.md again.
What's changed
- The manual install clones the latest release. The README's manual option cloned
main, the integration branch, so a manual install got unreleased changes. It now clones the release tag (git clone --branch <tag> --depth 1), and says the tag isvfollowed by the version and where the latest one is listed; a release's source zip is the other way in. The manual upgrade wording still holds: put the new folder in and ask for ONBOARDING.md again. - Every install path gets the latest release. The installer skill and the Claude Code plugin now install the release tagged
v<version>;mainis where changes are integrated, not what people install. The skill clones--branch v<version>into a fresh temporary folder, the way SaaSAllTheThings does, and deletes it after onboarding, instead of cloningmaininto a fixed folder and pulling it on reuse. The marketplace names the plugin as agithubsource withrefv<version>, because Claude Code's relative-path source (./) can't pin a ref. The skill'smetadata.versionsaid 3.3.0; it now followsVERSION.CLAUDE.md› After any change lists every file that carries the version and says each release is taggedv<version>once its pull request is merged. The selftest checks that the skill's version and the release it clones, and the marketplace'sref, agree withVERSION. The README says the skill and the plugin install the latest release, and that upgrading the skill means runningnpx skills addagain.
Upgrade steps
None for the game's own files.
v3.7.0
How to install
Option 1: the skill (any assistant):
npx skills add Freakling/Godot-Director
In Claude Code this becomes a /godot-director command. The skill fetches Godot Director and runs onboarding.
Option 2: the Claude Code plugin:
/plugin marketplace add Freakling/Godot-Director
/plugin install godot-director@godot-director
Open a new session in your game, then run /godot-director:godot-director.
Option 3: manual:
Put this repository next to project.godot as a folder named Godot-Director, then ask your assistant to read Godot-Director/ONBOARDING.md and follow it.
Upgrade:
- Skill: ask for the skill again (
/godot-directorin Claude Code); it fetches the latest Godot Director each time. - Plugin: run
/plugin marketplace update godot-directorand then/plugin update godot-director@godot-director. Start a new session in the game, and run/godot-director:godot-directoragain. - Manual: put the new Godot Director folder in the game, and ask for ONBOARDING.md again.
Designed to work with any AI coding assistant that reads AGENTS.md. Built and tested on Claude Code; other assistants are untested.
What's changed
- New:
/research, the research assistant (.godot-director/procedures/research.md). When a design question depends on facts nobody has checked, or you ask for research, a read-onlyresearchersubagent looks into it in a fresh context and reports a note. It informs; you decide: its recommendation is one option shown with its reason, and it never records a decision, edits the GDD ordesign/decisions.md, answers an open question, or asks you anything. It states its assumptions in the note instead.- Research is a task type. Research items get their own IDs,
R<n>, drawn from theNext IDsline like bugs. Instead ofDone whenthey haveQuestion:and, when they feed an open question,Informs: Q<n>. They are sized like any item, and the size picks the model. An item is done when its note exists. - Two ways to start. On the fly: a design session delegates a complex question, or you run
/research <question>, and the item is created and run at once. For later: queue the item, and list it underDepends onof the tasks that need its findings. A task that needs the decision stays gated by the open question itself. /next-taskhands research items to theresearcher. No check runs and no review: research changes no code. This session writes the note todesign/research/YYYY-MM-DD-<slug>.mdand commits it with the records. A finished item that informsQ<n>makes that question ready for a design call, and a run goes on to the next item.- Design sessions list
design/research/first, show notes on the topic in the context brief, delegate a question that needs facts, and end the decision'swhywith the note's path so later sessions reuse the evidence. - The note is one dated file per topic: the conclusion first, the options and trade-offs, the recommendation, every claim with its source, source tier and confidence, the date the claims were verified, and what stays unknown.
- A Godot domain file (
.godot-director/research-domain.md) is read when the question touches the engine and its docs for the project's version, plugins and assets and their licences, export and store requirements, or how comparable games solve the problem (design references, checked against the Design Pillars). - Confidentiality. Project text and unpublished design never go into a public search query or fetch.
- The researcher has
Read,Grep,Glob,WebSearchandWebFetch: no edit, write or shell tool..claude/settings.jsonallows web search and fetch; everything with side effects keeps asking.
- Research is a task type. Research items get their own IDs,
- Align checks that
Next IDshas anRcounter, that research items have aQuestion:instead ofDone when, and that each done research item has its note. - Selftest checks that the research files exist and are wired into the procedures, the item format, the seeds and the docs, that the researcher has no edit, write or shell tool, that the installer ships everything (including with
--tools none), and that a research note commits without running the check. - The example (
examples/market-day) shows theRcounter and the note folder, and the scenarios gain two for research. - Web search and fetch are allowed in every session in a game, not only for the researcher, because Claude Code can't limit a permission to one subagent:
.claude/settings.jsonallowsWebSearchandWebFetch, so any session can search and fetch the web without asking.
Upgrade steps
- TASKS.md: add an
Rcounter to theNext IDsline, so**Next IDs:** T12 · B3becomes**Next IDs:** T12 · B3 · R1. design/research/: the installer creates the folder with a shortREADME.md(a project file, yours from then on) when the game doesn't have it. Notes are added there as research runs; commit them like the other records..claude/settings.jsonis framework-owned, so it is replaced on upgrade. If you edited it, the new version arrives as.claude/settings.json.gdir-new; merge it, and make sure"WebSearch"and"WebFetch"are inpermissions.allow, which lets the researcher read the web without asking each time. Restart Claude Code afterwards so the new skill, subagent and permissions load.
No other game-owned file changes are required.