Export Pipeline
jame581/GodotPrompter
A skill your agent uses when exporting and distributing Godot games — export presets, platform settings, CI/CD with GitHub Actions
Scaffold the test framework and CI — tests/ directory, engine test runner, GitHub Actions workflow.
$ npx skills add Donchitos/Claude-Code-Game-Studios --skill test-setup -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install Donchitos/Claude-Code-Game-Studios test-setup --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/Donchitos/Claude-Code-Game-Studios.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/test-setup .claude/skills/test-setup && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "test-setup" agent skill from https://github.com/Donchitos/Claude-Code-Game-Studios/tree/main/.claude/skills/test-setup into .claude/skills/test-setup/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-setup", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/Donchitos/Claude-Code-Game-Studios/tree/main/.claude/skills/test-setupType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add Donchitos/Claude-Code-Game-Studios --skill test-setup -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install Donchitos/Claude-Code-Game-Studios test-setup --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Donchitos/Claude-Code-Game-Studios.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/test-setup .agents/skills/test-setup && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "test-setup" agent skill from https://github.com/Donchitos/Claude-Code-Game-Studios/tree/main/.claude/skills/test-setup into .agents/skills/test-setup/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-setup", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Donchitos/Claude-Code-Game-Studios --skill test-setup -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install Donchitos/Claude-Code-Game-Studios test-setup --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Donchitos/Claude-Code-Game-Studios.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/test-setup .cursor/skills/test-setup && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "test-setup" agent skill from https://github.com/Donchitos/Claude-Code-Game-Studios/tree/main/.claude/skills/test-setup into .cursor/skills/test-setup/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-setup", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/Donchitos/Claude-Code-Game-Studios.git --path .claude/skills/test-setup--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add Donchitos/Claude-Code-Game-Studios --skill test-setup -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install Donchitos/Claude-Code-Game-Studios test-setup --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Donchitos/Claude-Code-Game-Studios.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/test-setup .gemini/skills/test-setup && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "test-setup" agent skill from https://github.com/Donchitos/Claude-Code-Game-Studios/tree/main/.claude/skills/test-setup into .gemini/skills/test-setup/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-setup", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install Donchitos/Claude-Code-Game-Studios test-setupInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add Donchitos/Claude-Code-Game-Studios --skill test-setup -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/Donchitos/Claude-Code-Game-Studios.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/test-setup .github/skills/test-setup && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "test-setup" agent skill from https://github.com/Donchitos/Claude-Code-Game-Studios/tree/main/.claude/skills/test-setup into .github/skills/test-setup/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-setup", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add Donchitos/Claude-Code-Game-Studios --skill test-setup -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install Donchitos/Claude-Code-Game-Studios test-setup --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/Donchitos/Claude-Code-Game-Studios.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/test-setup .opencode/skills/test-setup && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "test-setup" agent skill from https://github.com/Donchitos/Claude-Code-Game-Studios/tree/main/.claude/skills/test-setup into .opencode/skills/test-setup/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "test-setup", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
test-setupScaffold the test framework and CI — tests/ directory, engine test runner, GitHub Actions workflow.
Test Setup is an agent skill from Donchitos/Claude-Code-Game-Studios. Scaffold the test framework and CI — tests/ directory, engine test runner, GitHub Actions workflow. Once, before the first sprint.
Its SKILL.md is about 6k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Game Development, covering Game development and CI/CD. It works with GitHub Actions and Godot. The repository describes itself as: Turn Claude Code into a full game dev studio — 49 AI agents, 72 workflow skills, and a complete coordination system mirroring real studio hierarchy. The licence is MIT.
6 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit b21fa0f. It shows what the files ask for, not the result of running them.
Pre-approves these tools, so the agent can use them without asking each time:
ReadGlobGrepBashWriteBash(bash "*/.claude/skills/test-setup/../../hooks/yaml-helper.sh" resolve_config *)From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
bashFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Test Setup loads about 6k tokens when it runs. Until then it costs about 35 tokens; SKILL.md has 1,469 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check noted patterns worth knowing about, such as sudo or a known installer.
allowed-tools: Read, Glob, Grep, Bash, Write, Bash(bash "*/.claude/skills/test-setup/../../hooks/yaml-helper.sh" reAutomated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from Donchitos/Claude-Code-Game-Studios at commit b21fa0f, republished under its MIT licence (© Donchitos). 1,469 words, ~6,032 tokens.
.claude/skills/test-setup/SKILL.md (or your agent's skills folder).!bash "${CLAUDE_SKILL_DIR}/../../hooks/yaml-helper.sh" resolve_config --keys automation,workflow,qa.level
Automation mode: Resolve modes.automation (project.local.yaml →
project.yaml → default collaborative). Every AskUserQuestion call and
every file write follows .claude/docs/automation-modes.md
(collaborative asks always · guided major-only · autonomous logs and proceeds;
automation_always_ask categories always prompt).
This skill scaffolds the automated testing infrastructure for the project. It detects the configured engine, generates the appropriate test runner configuration, creates the standard directory layout, and wires up CI/CD so tests run on every push.
Run this once during the Technical Setup phase, before any implementation begins. A test framework installed at sprint start costs 30 minutes. A test framework installed at sprint four costs 3 sprints.
Output: tests/ directory structure + .github/workflows/tests.yml
Read engine config:
engine.name from project.yaml; if that key is absent or empty
(including when project.yaml has no engine: block), fall back to the
Engine: value in .claude/docs/technical-preferences.md.engine.name
absent/empty and technical-preferences.md shows [TO BE CONFIGURED] or is
missing), stop:
"Engine not configured. Run /setup-engine first, then re-run /test-setup."Check for existing test infrastructure:
tests/ — does the directory exist?tests/unit/ and tests/integration/ — do subdirectories exist?.github/workflows/ — does a CI workflow file exist?addons/gdUnit4/bin/GdUnitCmdTool.gd (Godot — note the capital U) or
Assets/Tests/EditMode/ (Unity) or Source/*/Private/Tests/ (Unreal) for
engine-specific artifacts. These are the test roots in
.claude/docs/directory-structure.md; tests anywhere else are never compiled
on Unity or Unreal.Report findings:
force argument was not passed:
"Test infrastructure appears to be in place. Re-run with /test-setup force
to regenerate. Proceeding will not overwrite existing test files."If the force argument is passed, skip the "already exists" early-exit and
proceed — but still do not overwrite files that already exist at a given path.
Only create files that are missing.
Based on the engine detected and the existing state, present a plan:
## Test Setup Plan — [Engine]
I will create the following (skipping any that already exist):
tests/
unit/ — Isolated unit tests for formulas, state, and logic (Godot only)
integration/ — Cross-system tests and save/load round-trips (Godot only)
smoke/ — Critical path test list (15-minute manual gate)
README.md — Test framework documentation
[Unity/Unreal: unit and integration tests go under the engine's test root
instead — Unity Assets/Tests/EditMode|PlayMode/, Unreal
Source/<Module>/Private/Tests/ — because neither compiles code in tests/]
production/qa/
evidence/ — Screenshot and manual test sign-off records
[Engine-specific files — see per-engine details below]
.github/workflows/tests.yml — CI: run tests on every push to main
Estimated time: ~5 minutes to create all files.Ask: "May I create these files? I will not overwrite any test files that already exist at these paths."
At collaborative and guided — do not proceed without approval. These are
new files, and automation-modes.md:81 gates new-file writes in guided too,
so the answer is the same in both modes. At autonomous — create them and log
the decision; do not block. An unconditional gate here would read as "block even
in autonomous" and contradict this skill's own header.
After approval, create the following files:
tests/README.md# Test Infrastructure
**Engine**: [engine name + version]
**Test Framework**: [GdUnit4 | Unity Test Framework | UE Automation]
**CI**: `.github/workflows/tests.yml`
**Setup date**: [date]
## Directory Layout
```
tests/
unit/ # Isolated unit tests (formulas, state machines, logic)
integration/ # Cross-system and save/load tests
smoke/ # Critical path test list for /smoke-check gate
```
[Unity/Unreal — replace the unit/integration lines: unit and integration tests
live under the engine's test root, `Assets/Tests/EditMode|PlayMode/[System]/`
or `Source/<Module>/Private/Tests/[System]/`; `tests/` keeps this README and
`smoke/`. Every `tests/unit/` path below means that test root.]
```
production/qa/
evidence/ # Screenshot logs and manual test sign-off records
```
> **Manual evidence lives under `production/qa/evidence/`, not `tests/`** — that
> is where every consumer reads it.
## Running Tests
[Engine-specific command — see below]
## Test Naming
Names follow the engine's language (`.claude/rules/test-standards.md`):
- **Godot**: file `[system]_[feature]_test.gd`, function `test_[scenario]_[expected]`
— `combat_damage_test.gd` → `test_base_attack_returns_expected_damage()`
- **Unity**: class `[System]Tests` in `[System]Tests.cs`, method `[Scenario]_[Expected]`
— `CombatTests.cs` → `BaseAttack_ReturnsExpectedDamage()`
- **Unreal**: class `F[System][Scenario]Test`, test name `<Project>.[System].[Scenario]`
— `FCombatBaseAttackTest` → `<Project>.Combat.BaseAttack`
[`<Project>` is the root the filter in `commands.test` uses — write it out:
the project name, or the distinct root `/setup-engine` chose]
## Story Type → Test Evidence
| Story Type | Required Evidence | Location |
|---|---|---|
| Logic | Automated unit test — must pass | `tests/unit/[system]/` |
| Integration | Integration test OR playtest doc | `tests/integration/[system]/` |
| Visual/Feel | Screenshot + lead sign-off | `production/qa/evidence/` |
| UI | Retained screenshot of each screen touched | `production/qa/evidence/` |
| Config/Data | Smoke check pass | `production/qa/smoke-*.md` |
## CI
Tests run automatically on every push to `main` and on every pull request.
A failed test suite blocks merging.The README and this skill's completion summary name the same evidence path —
production/qa/evidence/ is where /smoke-check, /test-evidence-review,
/qa-plan and the evidence table in .claude/docs/coding-standards.md read,
so a tests/evidence/ would be a directory nothing reads.
production/qa/evidence/.gitkeepCreate it empty. Git does not keep an empty directory, and this is where
/story-done, /smoke-check and /test-evidence-review look for screenshots and
sign-off records — the completion summary lists it, so it must exist.
Engine: Godot)Do not write a runner script. gdUnit4 ships its own command-line runner,
res://addons/gdUnit4/bin/GdUnitCmdTool.gd. The command CI, /smoke-check
and commands.test use is:
godot --headless --path . --import
godot --headless -s -d --remote-debug tcp://127.0.0.1:0 res://addons/gdUnit4/bin/GdUnitCmdTool.gd -a res://tests --ignoreHeadlessModeRun the import first. A fresh clone has no .godot/ class cache, and a run
without one exits 1 — GdUnitCmdTool.gd did not load (Failed to load script), so no test ran. A cache older than a new class_name fails valid
code with 105. The CI action imports on its own.
Exit code 0 when every test passes and 100 when any fails — verified
on Godot 4.6.1 with gdUnit4 6.1.3. 101 means every test passed but a test
leaked nodes: a warning, not a failure. 103 and 104 mean gdUnit4 could not run
(headless refused, Godot older than 4.3); 105 means a test script does not parse. -a res://tests runs every suite
under tests/; --ignoreHeadlessMode is required because gdUnit4 otherwise
refuses to run headless. --remote-debug tcp://127.0.0.1:0 is required too —
it is what gdUnit4's own runtest script passes. Without it a script error
opens Godot's interactive debugger, and the run waits at a debug> prompt
forever instead of exiting 105. The flag makes every run print two ERROR:
lines about the remote port (127.0.0.1:0); they are expected, not a failure.
A run that finds no tests prints No test cases found and exits 0 — that is
not a pass. The folder is addons/gdUnit4/ with a capital U.
Create tests/unit/.gdignore_placeholder with content:
# Unit tests go here — one subdirectory per system (e.g., tests/unit/combat/)
Create tests/integration/.gdignore_placeholder with content:
# Integration tests go here — one subdirectory per system
Note in the README: Installing GdUnit4
1. Open Godot → AssetLib → search "GdUnit4" → Download & Install
2. Enable the plugin: Project → Project Settings → Plugins → GdUnit4 ✓
3. Restart the editor
4. Verify: res://addons/gdUnit4/bin/GdUnitCmdTool.gd exists (capital U)Engine: Unity)Tests live under Assets/Tests/ — Unity compiles only Assets/ and
Packages/. A test under tests/ is never compiled, and the run then reports
0 tests, Passed, exit 0 (verified on 6000.3.23f1): a false pass.
First check the Test Framework package:
grep -q 'com.unity.test-framework' Packages/manifest.json. Without it
-runTests does not fail — it hangs. If absent, ask to add
"com.unity.test-framework" to dependencies at the version your editor
bundles. Unity 6 releases bundle different ones — 1.6.0 in 6000.3.23f1, 1.5.1 in
6000.1.0f1 — so read it rather than copy a number: on Windows it is the
version in Data/Resources/PackageManager/BuiltInPackages/com.unity.test-framework/package.json
under the folder that holds Unity.exe.
Create Assets/Tests/EditMode/EditModeTests.asmdef — unit tests, no Play Mode:
{
"name": "EditModeTests",
"references": ["UnityEngine.TestRunner", "UnityEditor.TestRunner"],
"includePlatforms": ["Editor"],
"overrideReferences": true,
"precompiledReferences": ["nunit.framework.dll"],
"autoReferenced": false,
"defineConstraints": ["UNITY_INCLUDE_TESTS"]
}Create Assets/Tests/PlayMode/PlayModeTests.asmdef — integration tests in a
running scene: the same JSON with "name": "PlayModeTests" and
"includePlatforms": [].
A test assembly cannot see code in the default
Assembly-CSharp. An.asmdefcan reference only other.asmdefs. If the game's scripts have no.asmdefof their own, ask before creating one (e.g.Assets/Scripts/Game.asmdef) and add"Game"to both test assemblies'references. Without it the first test that names a game class fails to compile. Moving scripts into an.asmdefchanges what they can see, so before creating it:
- List the packages the scripts use.
Assembly-CSharpreferences every package on its own; an.asmdefreferences only what it names. Read the scripts'usinglines and add the matching assemblies — commonly"Unity.InputSystem","Unity.TextMeshPro","UnityEngine.UI":{ "name": "Game", "references": ["Unity.InputSystem", "Unity.TextMeshPro"] }. Name only packages the project has installed.- Give each
Editor/folder under it its own.asmdefwith"includePlatforms": ["Editor"]and"references": ["Game"]. Otherwise editor scripts join the runtime assembly, andusing UnityEditor;breaks the player build.
Note in the README: Running Unity tests (use the editor executable —
Unity on PATH may be Unity's separate CLI, not the editor)
"<Unity editor>" -batchmode -runTests -projectPath . -testPlatform EditMode -testResults test-results/editmode.xml
"<Unity editor>" -batchmode -runTests -projectPath . -testPlatform PlayMode -testResults test-results/playmode.xmlExit 0 when every test passes, 2 when any fails. Exit 1 or 3 is a FAIL
too: 1 is a compile error, which writes no results file, and 3 a failed run.
So is 4 (an unknown -testPlatform), and any other non-zero exit.
Delete test-results/editmode.xml before each run so an old file is never read
as a new result. Read the <test-run>
element of the results file: testcasecount="0" means nothing was compiled or
found — report it as not assessed, never as a pass. Do not add -quit;
-runTests exits by itself. Play Mode is the second line: a separate run with
its own results file, read the same way, and deleted before each run the same
way. An Edit Mode run never runs the tests in Assets/Tests/PlayMode/, so
/smoke-check runs both whenever that folder holds tests.
Engine: Unreal or Engine: UE5)Tests live inside the game module: Source/<Module>/Private/Tests/, where
<Module> is the primary game module (for a C++ project, the .uproject name).
UnrealBuildTool compiles only module folders — a tests folder directly under
Source/ is not a module, so a test there is silently never built and every
run reports No automation tests matched.
Create Source/<Module>/Private/Tests/README.md. <Project>. in it — and
[ProjectName]. in the CI filter below — is the test root the filter in
commands.test uses: the project name, or the distinct root /setup-engine
chose when the project's name is also an engine area. Write that root:
# Unreal Automation Tests
Tests use the UE Automation Testing Framework and compile with this module.
Wrap each test file in `#if WITH_DEV_AUTOMATION_TESTS` … `#endif`.
Flags: `EAutomationTestFlags::EditorContext | EAutomationTestFlags::ProductFilter`
(there is no `GameFilter` flag).
Run via: Session Frontend → Automation → select "<Project>." tests
Or headlessly from the project root, after building the editor target — on a
fresh checkout the editor exits before any test runs:
"<UE root>/Engine/Binaries/DotNET/UnrealBuildTool/UnrealBuildTool.exe" <Project>Editor Win64 Development -Project="$(pwd -W 2>/dev/null || pwd)/<Project>.uproject"
"<UE root>/Engine/Binaries/Win64/UnrealEditor-Cmd.exe" "$(pwd -W 2>/dev/null || pwd)/<Project>.uproject" -ExecCmds="Automation RunTests <Project>.; Quit" -unattended -nullrhi -stdout -FullStdOutLogOutput
The project path must be absolute: UE does not find a relative one (exit 1,
"Project file not found"). Those two lines are Windows'. On Linux build with
`Engine/Build/BatchFiles/Linux/Build.sh <Project>Editor Linux Development -Project="$(pwd -W 2>/dev/null || pwd)/<Project>.uproject"` and run
the tests with `Engine/Binaries/Linux/UnrealEditor` and the same arguments; on
macOS build with `Engine/Build/BatchFiles/Mac/Build.sh <Project>Editor Mac Development -Project="$(pwd -W 2>/dev/null || pwd)/<Project>.uproject"`
— Epic documents no command-line editor inside `UnrealEditor.app` for the test
run (see `docs/engine-reference/unreal/current-best-practices.md`, "Command Line").
Read the output, not the exit code: a failing test and a run that matched nothing both exit 255.
`Result={Fail}` is a failure; `No automation tests matched` means no test was
built or named `<Project>.…`.
Test class naming: F[System][Scenario]Test — one class per test; a second
test reusing a class name fails to link
Test name: "<Project>.[System].[Scenario]"Create .github/workflows/tests.yml:
name: Automated Tests
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
test:
name: Run GdUnit4 Tests
runs-on: ubuntu-latest
# The action publishes its results as a check run. A new repository's
# token is read-only, and without checks: write the job fails even when
# every test passes. If you protect main, require the `Run GdUnit4 Tests` job
# check, not `test-results`: that check run concludes success even when a
# test fails.
permissions:
contents: read
checks: write
steps:
- name: Checkout
uses: actions/checkout@v4
with:
lfs: true
# godot-version must be a full release such as 4.6.1 (`godot --version`
# shows it); VERSION.md's "4.6" is not one. version: installed runs the
# gdUnit4 committed in addons/ -- without it the action deletes that
# copy and installs the latest release, which may not match your tests.
- name: Run GdUnit4 Tests
uses: godot-gdunit-labs/gdUnit4-action@v1
with:
godot-version: '[FULL GODOT VERSION, e.g. 4.6.1]'
version: 'installed'
paths: |
tests/unit
tests/integration
report-name: test-results
- name: Upload Test Results
if: always()
uses: actions/upload-artifact@v4
with:
name: test-results
path: reports/Create .github/workflows/tests.yml:
name: Automated Tests
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
test:
name: Run Unity Tests
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
lfs: true
- name: Run Edit Mode Tests
uses: game-ci/unity-test-runner@v4
env:
UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
with:
testMode: editmode
artifactsPath: test-results/editmode
- name: Run Play Mode Tests
uses: game-ci/unity-test-runner@v4
env:
UNITY_LICENSE: ${{ secrets.UNITY_LICENSE }}
with:
testMode: playmode
artifactsPath: test-results/playmode
- name: Upload Test Results
if: always()
uses: actions/upload-artifact@v4
with:
name: test-results
path: test-results/Note: Unity CI requires a UNITY_LICENSE secret. Add to GitHub repository
secrets before the first CI run.
Create .github/workflows/tests.yml:
name: Automated Tests
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
test:
name: Run UE Automation Tests
runs-on: [self-hosted, windows] # UE requires a local runner with the editor installed
# The quoted "{0}" in each `shell:` below: the Windows runner passes bash
# its script path unquoted, so with plain `shell: bash` every step fails
# ("No such file or directory") when the runner's folder has a space.
steps:
- name: Checkout
uses: actions/checkout@v4
with:
lfs: true
# Binaries/ is gitignored, so a fresh checkout has no compiled game
# module: without this step the editor stops with "The game module could
# not be found" before running any test. UnrealBuildTool.exe, not
# Build.bat -- from bash, Build.bat fails on an engine path with spaces.
- name: Build Editor Target
run: |
"$UE_ROOT/Engine/Binaries/DotNET/UnrealBuildTool/UnrealBuildTool.exe" [ProjectName]Editor Win64 Development \
-Project="${{ github.workspace }}/[ProjectName].uproject"
shell: bash --noprofile --norc -eo pipefail "{0}"
# -stdout -FullStdOutLogOutput: without them the editor prints nothing
# here, and the results are only in Saved/Logs/.
- name: Run Automation Tests
run: |
"$UE_ROOT/Engine/Binaries/Win64/UnrealEditor-Cmd.exe" "${{ github.workspace }}/[ProjectName].uproject" \
-nullrhi -nosound \
-ExecCmds="Automation RunTests [ProjectName].; Quit" \
-unattended -stdout -FullStdOutLogOutput
shell: bash --noprofile --norc -eo pipefail "{0}"
- name: Upload Logs
if: always()
uses: actions/upload-artifact@v4
with:
name: test-logs
path: Saved/Logs/Note: UE CI requires a self-hosted Windows runner with Unreal Editor installed.
The windows label keeps the job off any Linux self-hosted runner the
repository also has. Set the UE_ROOT environment variable on the runner to the engine folder
(e.g. C:/Program Files/Epic Games/UE_5.7). [ProjectName]Editor is the
editor target in Source/[ProjectName]Editor.Target.cs.
Create tests/smoke/critical-paths.md:
# Smoke Test: Critical Paths
**Purpose**: Run these 10-15 checks in under 15 minutes before any QA hand-off.
**Run via**: `/smoke-check` (which reads this file)
**Update**: Add new entries when new core systems are implemented.
## Core Stability (always run)
1. Game launches to main menu without crash
2. New game / session can be started from the main menu
3. Main menu responds to all inputs without freezing
## Core Mechanic (update per sprint)
<!-- Add the primary mechanic for each sprint here as it is implemented -->
<!-- Example: "Player can move, jump, and the camera follows correctly" -->
4. [Primary mechanic — update when first core system is implemented]
## Data Integrity
5. Save game completes without error (once save system is implemented)
6. Load game restores correct state (once load system is implemented)
## Performance
7. No visible frame rate drops on target hardware (60fps target)
8. No memory growth over 5 minutes of play (once core loop is implemented)After writing all files, report:
Test infrastructure created for [engine].
Files created:
- tests/README.md
- tests/unit/ and tests/integration/ (Godot) — or the engine's test root:
Unity Assets/Tests/EditMode/ and PlayMode/, Unreal Source/<Module>/Private/Tests/
- tests/smoke/critical-paths.md
- production/qa/evidence/.gitkeep
[engine-specific files]
- .github/workflows/tests.yml
Next steps:
1. [Engine-specific install step, e.g., "Install GdUnit4 via AssetLib"]
2. Write your first test in the engine's test root:
tests/unit/[system]/[system]_[feature]_test.gd (Godot),
Assets/Tests/EditMode/[System]Tests.cs (Unity), or
Source/<Module>/Private/Tests/[System]Test.cpp (Unreal)
3. Run `/qa-plan sprint` before your first sprint to classify stories and set
test evidence requirements. At `workflow: minimal` — the default — skip
this: there are no sprints. At `qa.level: minimal`, also the default, tests
are waived, so `/dev-story` writes none. Raise `qa.level` with `/settings`
to have it write them
4. `/smoke-check` before every QA hand-off
Gate note: /gate-check Technical Setup → Pre-Production now requires:
- the engine's test root: tests/unit/ and tests/integration/ (Godot),
Assets/Tests/EditMode/ and Assets/Tests/PlayMode/ (Unity), or
Source/<Module>/Private/Tests/ (Unreal)
- .github/workflows/tests.yml
- At least one example test file
Run /test-setup and write one example test before advancing.
(At `workflow: minimal` that gate requires only the engine.)
Verdict: **COMPLETE** — test framework scaffolded and CI/CD wired up./setup-engine. Do not guess.force flag skips the "already exists" early-exit but never overwrites.
It means "create any missing files even if the directory already exists."UNITY_LICENSE secret must be configured
manually. Do not attempt to automate license management.© Donchitos, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .claude/skills/test-setup of Donchitos/Claude-Code-Game-Studios.
Open the folder on GitHubat commit b21fa0f
Test Setup next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Test Setup this skillDonchitos/Claude-Code-Game-Studios | 26k | — | ~6k | Automated safety check: Notes | MIT | |
| Export Pipelinejame581/GodotPrompter | 792 | — | ~3.5k | Automated safety check: Pass | MIT | |
| Godot Export Buildsthedivergentai/GD-Agentic-Skills | 803 | — | ~3k | Automated safety check: Pass | LGPL-3.0 | |
| Scenario Unity Pipeline Automationscenario-labs/skills | 898 | — | ~5k | Automated safety check: Pass | MIT | |
| Scenario Godot Pipeline Automationscenario-labs/skills | 898 | — | ~5.5k | Automated safety check: Pass | MIT | |
| Godot Gdscript Headless Testinggamedev-skills/awesome-gamedev-agent-skills | 1.3k | — | ~2.3k | Automated safety check: Pass | Apache-2.0 |
jame581/GodotPrompter
A skill your agent uses when exporting and distributing Godot games — export presets, platform settings, CI/CD with GitHub Actions
thedivergentai/GD-Agentic-Skills
Expert patterns for multi-platform exports including export templates (Windows/Linux/macOS/Android/iOS/Web), command-line exports (headless mode), platform-specific settings (codesign, notarization…
scenario-labs/skills
A skill your agent uses when automating a Unity 6.3 content pipeline or build: importing an art drop (FBX, PNG) with AssetPostprocessor rules and naming conventions, generating prefabs or editing…
scenario-labs/skills
A skill your agent uses when Godot 4.7 work must run without a mouse or at scale: batch import of hundreds of GLB props or an AI image-to-3D art drop, naming rules, import presets and post-import…
gamedev-skills/awesome-gamedev-agent-skills
Run GDScript test suites from the command line with godot --headless, using a SceneTree/MainLoop runner script that exits non-zero on failure so CI can gate merges.
925236118/AlphaAgent
Master Godot 4 GDScript patterns including signals, scenes, state machines, and optimization.
Donchitos/Claude-Code-Game-Studios
Audits game assets against naming conventions, file size budgets and format standards, and finds orphaned assets and missing references.
Donchitos/Claude-Code-Game-Studios
Writes per-asset visual specs and AI image-generation prompts for a game's characters, enemies and screens, driven by the GDD, art bible and an entity inventory.
Donchitos/Claude-Code-Game-Studios
Checks game data and formulas for balance outliers, broken progression, degenerate strategies and economy problems, and answers 'could not run' when the data is missing.
Donchitos/Claude-Code-Game-Studios
Turns a description into a structured bug report, or scans code for likely bugs, then verifies and closes reports through four modes.
Donchitos/Claude-Code-Game-Studios
Reviews the open bug backlog, separates severity from priority, assigns fixes to sprints and reports systemic trends, writing a dated triage file.
Donchitos/Claude-Code-Game-Studios
Generates an internal or player-facing changelog from git commits and sprint data, filtering out framework maintenance commits so that only work on the game itself reaches release copy.
Works with
Categories
Scaffold the test framework and CI — tests/ directory, engine test runner, GitHub Actions workflow. Test Setup is an agent skill from Donchitos/Claude-Code-Game-Studios. Scaffold the test framework and CI — tests/ directory, engine test runner, GitHub Actions workflow.
Test Setup fits situations like: tasks that involve Game development; tasks that involve CI/CD.
Run `npx skills add Donchitos/Claude-Code-Game-Studios --skill test-setup -a claude-code`. Or copy the skill folder (.claude/skills/test-setup in Donchitos/Claude-Code-Game-Studios) into .claude/skills/test-setup in your project. Claude Code loads it when a task matches its description.
Run `npx skills add Donchitos/Claude-Code-Game-Studios --skill test-setup -a codex`. Or copy the skill folder (.claude/skills/test-setup in Donchitos/Claude-Code-Game-Studios) into .agents/skills/test-setup in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add Donchitos/Claude-Code-Game-Studios --skill test-setup -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/test-setup, .gemini/skills/test-setup, .github/skills/test-setup and .opencode/skills/test-setup in your project.
Going by SKILL.md and its folder, Test Setup needs the command-line tools its instructions call (bash). Its frontmatter pre-approves these tools: Read, Glob, Grep, Bash, Write, Bash(bash "*/.claude/skills/test-setup/../../hooks/yaml-helper.sh" resolve_config *).
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.
Test Setup is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 6k tokens (SKILL.md is roughly 24k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Test Setup: Export Pipeline (jame581/GodotPrompter, 792 stars), Godot Export Builds (thedivergentai/GD-Agentic-Skills, 803 stars), Scenario Unity Pipeline Automation (scenario-labs/skills, 898 stars) and Scenario Godot Pipeline Automation (scenario-labs/skills, 898 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
Donchitos (a GitHub user) maintains it in Donchitos/Claude-Code-Game-Studios, which has 25,834 GitHub stars. The repository holds 73 skills in this directory. The repository was last updated on September 29, 2026.
Source: Donchitos/Claude-Code-Game-Studios on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.