TDD Workflow
hellangleZ/burn-in-cceverywhere-ralph
A skill your agent uses when writing new features, fixing bugs, or refactoring code.
Bootstrapping GlueUnitTests that touch GlueState.Self/GlueCommands.Self/ProjectManager.
$ npx skills add vchelaru/FlatRedBall --skill glue-unit-test-bootstrap -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install vchelaru/FlatRedBall glue-unit-test-bootstrap --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/vchelaru/FlatRedBall.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/glue-unit-test-bootstrap .claude/skills/glue-unit-test-bootstrap && 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 "glue-unit-test-bootstrap" agent skill from https://github.com/vchelaru/FlatRedBall/tree/NetStandard/.claude/skills/glue-unit-test-bootstrap into .claude/skills/glue-unit-test-bootstrap/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "glue-unit-test-bootstrap", 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/vchelaru/FlatRedBall/tree/NetStandard/.claude/skills/glue-unit-test-bootstrapType 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 vchelaru/FlatRedBall --skill glue-unit-test-bootstrap -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install vchelaru/FlatRedBall glue-unit-test-bootstrap --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/vchelaru/FlatRedBall.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.claude/skills/glue-unit-test-bootstrap .agents/skills/glue-unit-test-bootstrap && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "glue-unit-test-bootstrap" agent skill from https://github.com/vchelaru/FlatRedBall/tree/NetStandard/.claude/skills/glue-unit-test-bootstrap into .agents/skills/glue-unit-test-bootstrap/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "glue-unit-test-bootstrap", 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 vchelaru/FlatRedBall --skill glue-unit-test-bootstrap -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install vchelaru/FlatRedBall glue-unit-test-bootstrap --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/vchelaru/FlatRedBall.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.claude/skills/glue-unit-test-bootstrap .cursor/skills/glue-unit-test-bootstrap && 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 "glue-unit-test-bootstrap" agent skill from https://github.com/vchelaru/FlatRedBall/tree/NetStandard/.claude/skills/glue-unit-test-bootstrap into .cursor/skills/glue-unit-test-bootstrap/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "glue-unit-test-bootstrap", 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/vchelaru/FlatRedBall.git --path .claude/skills/glue-unit-test-bootstrap--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 vchelaru/FlatRedBall --skill glue-unit-test-bootstrap -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install vchelaru/FlatRedBall glue-unit-test-bootstrap --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/vchelaru/FlatRedBall.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.claude/skills/glue-unit-test-bootstrap .gemini/skills/glue-unit-test-bootstrap && 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 "glue-unit-test-bootstrap" agent skill from https://github.com/vchelaru/FlatRedBall/tree/NetStandard/.claude/skills/glue-unit-test-bootstrap into .gemini/skills/glue-unit-test-bootstrap/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "glue-unit-test-bootstrap", 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 vchelaru/FlatRedBall glue-unit-test-bootstrapInstalls 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 vchelaru/FlatRedBall --skill glue-unit-test-bootstrap -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/vchelaru/FlatRedBall.git skills-src && mkdir -p .github/skills && cp -r skills-src/.claude/skills/glue-unit-test-bootstrap .github/skills/glue-unit-test-bootstrap && 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 "glue-unit-test-bootstrap" agent skill from https://github.com/vchelaru/FlatRedBall/tree/NetStandard/.claude/skills/glue-unit-test-bootstrap into .github/skills/glue-unit-test-bootstrap/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "glue-unit-test-bootstrap", 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 vchelaru/FlatRedBall --skill glue-unit-test-bootstrap -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install vchelaru/FlatRedBall glue-unit-test-bootstrap --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/vchelaru/FlatRedBall.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.claude/skills/glue-unit-test-bootstrap .opencode/skills/glue-unit-test-bootstrap && 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 "glue-unit-test-bootstrap" agent skill from https://github.com/vchelaru/FlatRedBall/tree/NetStandard/.claude/skills/glue-unit-test-bootstrap into .opencode/skills/glue-unit-test-bootstrap/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "glue-unit-test-bootstrap", 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.
glue-unit-test-bootstrapBootstrapping GlueUnitTests that touch GlueState.Self/GlueCommands.Self/ProjectManager.
Glue Unit Test Bootstrap is an agent skill from vchelaru/FlatRedBall. Bootstrapping GlueUnitTests that touch GlueState.Self/GlueCommands.Self/ProjectManager. Triggers: NullReferenceException in tests from ProjectManager.CodeProjectHelper, FileWatchManager, EditorObjects.IoC.Container, or MainGlueWindow.Self.Invoke.
Its SKILL.md is about 4.3k 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 Testing & QA, covering Unit testing. The repository describes itself as: Cross-platform 2D game engine focused on ultimate productivity built in .NET. The licence is MIT.
Read from SKILL.md and the folder at commit fa654ab. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
dotnetgitFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git, which can reach the network depending on how they are called.
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.
Glue Unit Test Bootstrap loads about 4.3k tokens when it runs. Until then it costs about 68 tokens; SKILL.md has 2,192 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 found no risky patterns in SKILL.md.
Automated 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 vchelaru/FlatRedBall at commit fa654ab, republished under its MIT licence (© vchelaru). 2,192 words, ~4,322 tokens.
.claude/skills/glue-unit-test-bootstrap/SKILL.md (or your agent's skills folder).GlueCommands.Self/GlueState.Self aren't usable out of the box in a plain xunit host — Glue.exe's real
startup (Program.cs/MainGlueWindow.cs) does several one-time registrations first. Any test that drives
production code through those statics (not just calling a pure static method directly) needs:
GlueUnitTests.TestSupport.GlueTestBootstrap.EnsureInitialized();Call it in the test's constructor. It's idempotent (safe to call every test, cheap after the first call).
Skipping it is what produces the NRE chain: DI container not built, legacy EditorObjects.IoC.Container
locator not registered, ProjectManager.CodeProjectHelper null, FileWatchManager not initialized.
None of this is faked — GlueTestBootstrap runs the same production init calls Glue.exe makes, just
outside a live WinForms app. See its doc comment at
FRBDK/Glue/Tests/GlueUnitTests/TestSupport/GlueTestBootstrap.cs for exactly what it registers.
RegisterPluginForTesting adds a plugin to both mPluginContainers and ImportedPlugins. Those back
different dispatch paths: CallPluginMethod walks the containers, but every ReactTo* event enumerates
ImportedPlugins. A plugin in only the first answers direct calls and is never notified of anything —
which reads as "the plugin ran and chose to do nothing," not as a wiring bug.
Also process-wide static state a test may need to control alongside the bootstrap:
TaskManager.SynchronousMode — set true to run TaskManager.Self.Add/AddAsync inline instead of
on the background thread. See GlueUnitTests/Tasks/TaskManagerSynchronousModeTests.cs.
TaskManager.UiThreadMarshaller — swap in an inline IUiThreadMarshaller to avoid needing a real
WinForms message loop for DoOnUiThread/OnUiThread calls.
TestVisualStudioProjectFactory (GlueUnitTests/TestSupport/TestVisualStudioProjectFactory.cs) —
builds a real (not fake) VisualStudioProject from a minimal non-SDK .csproj, for tests that need
GlueState.CurrentMainProject to be non-null.
ObjectFinder.Self.GlueProject — assign a GlueProjectSave for anything reaching ObjectFinder
lookups (GetEntitySaveUnqualified, GetAllReferencedFiles).
GlueState.Self.Current* setters work headless. Selection is by model object, so
CurrentNamedObjectSave = nos takes effect as long as nos is in ObjectFinder.Self.GlueProject (an
object in no element reads as nothing selected). It really dispatches ReactToItemsSelected to registered
plugins: set PluginManager.HandleExceptions = false in such a test, or a throwing handler is swallowed and
the plugin silently disabled for the rest of the run. A plugin that builds its WPF view on selection must
gate the view on GlueGui.ShowGui (off in the bootstrap); see MainCollisionPlugin.TryHandleSelectedCollidable.
Every one of these is process-wide, which is why the whole assembly runs non-parallel — see
GlueUnitTests/AssemblyInfo.cs. So cross-class interleaving isn't a hazard, but leakage still is: a test
which assigns one of these must restore it (IDisposable/try-finally), or it silently changes the
setup of whatever runs next. The failure mode is a test that passes under --filter and fails in the
full run.
GoldProject/GoldProjectCompileTests (GlueUnitTests/TestSupport, GlueUnitTests/Projects) drive a
checked-in sample through the real ProjectLoader.LoadProject, regenerate, and build. That is the only way
to cover generators that ask another plugin something at generation time. Needs
GlueTestBootstrap.EnsureGameProjectPluginsRegistered() and [StaFact]. Two non-obvious requirements:
*.Generated.cs first. Glue doesn't rewrite a file whose content is unchanged, so otherwise
"codegen produced this" and "codegen never ran" are indistinguishable.*.Generated.cs is gitignored repo-wide, and the samples are checked in without it. A clean
git diff after regenerating proves nothing, and no sample builds until Glue regenerates it. Assert
nothing about these files existing beforehand — your working copy has them from earlier runs and a
fresh CI clone does not. Before pushing, find Samples -name "*.Generated.cs" -delete and re-run, or
CI is the first thing to see the real starting state.WinForms installs a WindowsFormsSynchronizationContext on a thread the moment the first control is created
there — FakeMainGlueWindow's PropertyGrid, a MenuStrip, a plugin toolbar. Continuations then post back
to it and only run while a message loop pumps, which no test host does. Combined with
TaskManager.SynchronousMode (whose RunSynchronously blocks the caller on the awaited task), the first
plugin that awaits during a load hangs forever: one blocked thread, no child process, nothing executing, and
no timeout anywhere. GlueTestBootstrap sets WindowsFormsSynchronizationContext.AutoInstall = false; don't
undo it, and don't diagnose this shape as a slow build. A stack dump (dotnet-stack report -p <pid>, real
Windows PID) showing exactly one blocked thread and nothing else running is the signature.
PluginManager a MenuStripGlueGui.Initialize(menuStrip) is needed (PluginBase.AddMenuItemTo reads GlueGui.MenuStrip.Items).
PluginManager.ShareMenuStripReference is the opposite: PluginCommand marshals every plugin call through
mMenuStrip.Invoke whenever mMenuStrip is non-null, so with no message loop the calls silently never run
and CallPluginMethod returns null. Leaving PluginManager's null keeps its "no live menu strip means run
inline" guard doing the right thing.
GenerateAllCodeSync calls the async Task CodeWriter.GenerateCode without awaiting it, so an exception
during one element's generation is captured into a discarded Task and lost. The symptom is an empty
.Generated.cs (the placeholder from CreateGeneratedFileIfNecessary) for that one element, no error
anywhere, and every later step for it — its factory, its project entry — silently skipped. To see the real
exception, await CodeWriter.GenerateCode(element) directly. ErrorRecordingPlugin subscribes to Glue's
error and output channels so a partial regeneration fails a test rather than passing quietly.
MSBUILD_EXE_PATH must be set before the first MSBuild evaluation in the processMicrosoft.Build caches its toolset on first use, so setting the variable later has no effect. A test that
evaluates a bare non-SDK project first (TestVisualStudioProjectFactory) fixes the toolset for the whole
run, and a later real-project load then fails with The SDK 'Microsoft.NET.SDK.WorkloadAutoImportPropsLocator' specified could not be found — while passing when run alone. Call
GlueTestBootstrap.EnsureMsBuildEnvironmentVariable() before anything touches MSBuild.
IMainGlueWindow/IUiThreadMarshaller only cover calls that were already routed through MainGlueWindow.Self/TaskManager. A plugin method you're calling directly for the first time (bypassing PluginManager.CallPluginMethod's silent no-op to get real coverage — see REFACTORING.md's Collision/Gum entries) may still contain its own unseamed MessageBox.Show(...) on some branch (e.g. an "already exists, overwrite?" check). That call blocks the test thread on a real, visible modal dialog on the developer's actual desktop — not something GlueTestBootstrap catches, and not obvious from reading the test in isolation.
Before exercising a plugin method's real logic for the first time: skim it (and what it calls) for MessageBox.Show/similar dialog calls, and design the test to never take that branch (fresh unique temp directory per test, askToOverwrite/equivalent flags set to avoid the prompt, call the method at most once per test run rather than twice to probe an idempotency branch). If you ever see an unexpected pause or the user reports a popup, stop immediately, confirm no process is still blocked waiting on it, and fix the test to avoid the branch rather than building a dialog seam just to unblock one test.
obj/bin can report a stale test as green, or a real compile error as passingdotnet test after an edit does an incremental build: MSBuild decides per-file whether to recompile, and
in practice a git stash/git rebase/repeated edit-and-rerun cycle can leave it not recompiling a file you
just changed — the run reports the previous binary's result, not the current source's. This produced a
green "317/317" locally on issue #2016's PR while the actual pushed source had two CS0103 compile errors
(missing usings) that only CI's from-scratch build caught, plus masked a real regression (a broadened
FakeFindManager behavior that broke two unrelated tests) for the same reason.
Before reporting "full suite green" as a claim someone will act on (a PR description, a "tests pass"
verdict, this file), rebuild from scratch at least once: rm -rf FRBDK/Glue/Tests/GlueUnitTests/obj FRBDK/Glue/Tests/GlueUnitTests/bin
then dotnet test without --no-build. --no-build/--no-restore reruns are fine for fast iteration
between clean checkpoints, not as the last thing before trusting the result.
dotnet test on the bare csproj fails with MSB3073/*Undefined* pathsRunning dotnet test FRBDK/Glue/Tests/GlueUnitTests/GlueUnitTests.csproj directly fails building OfficialPlugins.csproj's PostBuild target: it copies its output using $(SolutionDir)Glue\bin\Debug\Plugins\..., and SolutionDir is a solution-scoped MSBuild property that's simply undefined when you build/test a project file directly (no .sln in the invocation) — same failure would hit any of the plugin projects with a similar post-build copy step, not just OfficialPlugins.
Fix: pass SolutionDir explicitly, pointed at FRBDK/Glue/ (the directory containing Glue with All.sln, since the copy path is $(SolutionDir)Glue\...), with a trailing backslash:
dotnet test FRBDK/Glue/Tests/GlueUnitTests/GlueUnitTests.csproj -p:SolutionDir="<repo>\FRBDK\Glue\\"Rough orders of magnitude on a warm dev machine, so "is it stuck or just slow?" is answerable without
guessing. All with --no-build after a successful build:
| Run | Tests | On a CI runner |
|---|---|---|
Warm incremental build of GlueUnitTests.csproj | ~40s (a real build is most of a full run's wall clock) | |
--filter "Category!=BuildSmoke&Category!=LiveGame" | 827 | ~100s |
--filter "Category=LiveGame" | 17 | ~210s |
--filter "Category=BuildSmoke" | 69 | ~570s |
BuildSmoke is slow by nature - every test copies a sample project to a temp directory and loads it through
a real headless editor, and AssemblyInfo.cs disables parallelization assembly-wide because Glue's
singletons are shared. A dev machine beats these numbers, so treat them as the ceiling rather than a target.
Wall clock alone will not tell you a run is wedged. The signature is the child dotnet build having
already exited while testhost is still alive - that is the pipe hang below, not work in progress.
dotnet call must go through NestedDotnetCliBuildSmoke tests shell out to real dotnet build/dotnet run. The obvious way to write that — redirect
both streams, StandardOutput.ReadToEnd(), WaitForExit() — hangs for 10–15 minutes instead of failing,
because dotnet build starts MSBuild worker nodes with /nodeReuse:true that outlive it while holding the
inherited stdout pipe open, so ReadToEnd() never sees EOF. It is intermittent by nature: only the run that
starts the nodes inherits the handles, so the same test hangs once and passes on an immediate retry.
GlueUnitTests/TestSupport/NestedDotnetCli.cs is the only sanctioned way to spawn one — it disables the
persistent build servers, pumps both streams concurrently, and kills the entire child tree on timeout.
NestedDotnetCliTests fails the build if a redirected Process.Start reappears anywhere in the assembly.
See GitHub issue #1969.
A timeout passed to Run covers cold start too — the CLI, MSBuild evaluation and any process the build
itself spawns can eat tens of seconds on a CI runner before the command does the thing being measured. A
budget sized against a warm dev machine is therefore mostly startup on a cold one, and expires before the
test's premise is even true. When the budget is meant to bound something after that warm-up, pass a
StartupGate (see NestedDotnetCli.Run): it waits untimed until the gate opens and only then starts the
clock. See GitHub issue #1992.
ShouldContain ignores casesomeString.ShouldContain("Expected") passes against "expected"; Shouldly defaults string containment
to Case.Insensitive. A test asserting that a path or generated line keeps its capitalization must pass
Case.Sensitive, or it stays green while the code lower-cases.
A dotnet test/dotnet build that is cancelled or killed mid-flight leaves its tree (dotnet, MSBuild
nodes, VBCSCompiler, testhost) behind; a run that completes normally now cleans up after itself. So
this is a response to an interruption, not a ritual before every command:
Get-Process testhost,vstest.console,MSBuild,VBCSCompiler -ErrorAction SilentlyContinue | Stop-Process -ForceNever end a turn (report status, stop) while a dotnet test/dotnet build is still running detached in
the background — wait for it synchronously, or explicitly confirm it finished/kill it first. A background
run left alive across a stop/resume cycle is how the count climbs into the dozens over a long session.
testhost locks the output DLLs, and the next run looks like a hangA cancelled or timed-out dotnet test can leave testhost.exe alive holding GlueUnitTests/bin/.../*.dll open. The next run then can't copy dependencies into bin, and fails with MSB3021/MSB3027 naming the holder (The file is locked by: "testhost (PID)"). The trap is that the build stalls through its 10 retries × 1s per file while producing no test output — piped through a grep, that buffers to nothing and reads as a hung test suite rather than a locked file.
Before diagnosing a slow or silent run as a test problem, clear the holders:
Get-Process testhost,vstest.console,MSBuild -ErrorAction SilentlyContinue | Stop-Process -ForceThen re-run with --no-build when nothing was recompiled since the last successful build — it skips the copy step the lock blocks, and the full non-BuildSmoke suite finishes in seconds.
FullyQualifiedName~ filter silently sweeps in Category=BuildSmoke tests and thrashes the machineGumRuntimeMemberContractTests, GumGeneratedCodeCompilesTests, and the *CreationSmokeTests classes are
tagged [Trait("Category", "BuildSmoke")] because they shell out to real dotnet build/dotnet test
child processes (building the whole engine or a scaffolded project) instead of just exercising codegen
in-memory. pr-tests.yml deliberately runs them as their own step, Category=LiveGame as another, and
everything else with --filter "Category!=BuildSmoke&Category!=LiveGame".
Category=LiveGame behaves the same way and costs more: each of those tests builds and launches a real
game process (see glue-live-game-testing).
A filter like --filter "FullyQualifiedName~GumPlugin" does not know about that split — it matches
BuildSmoke tests in the same namespace right along with the fast ones. Run several of those together and
each spawns its own nested dotnet/testhost/VBCSCompiler tree; a handful of them running serially is
enough to make the machine crawl and a run that should take seconds look hung for many minutes.
Always AND in Category!=BuildSmoke&Category!=LiveGame unless you specifically intend to run one of the
slow suites:
dotnet test FRBDK/Glue/Tests/GlueUnitTests/GlueUnitTests.csproj -p:SolutionDir="<repo>\FRBDK\Glue\\" --filter "FullyQualifiedName~GumPlugin&Category!=BuildSmoke&Category!=LiveGame"For the full story of why each seam was needed and what's still NRE-prone (e.g. AvailableAssetTypes.CommonAtis
requiring real PluginManager plugin loading), see REFACTORING.md's "Unblock WizardProjectLogic
AddGameScreen testing" and "Wizard apply-engine test seams" entries.
© vchelaru, 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/glue-unit-test-bootstrap of vchelaru/FlatRedBall.
Open the folder on GitHubat commit fa654ab
Glue Unit Test Bootstrap 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 |
|---|---|---|---|---|---|---|
| Glue Unit Test Bootstrap this skillvchelaru/FlatRedBall | 578 | — | ~4.3k | Automated safety check: Pass | MIT | |
| TDD WorkflowhellangleZ/burn-in-cceverywhere-ralph | 112 | 11 repos | ~2.4k | Automated safety check: Pass | None | |
| Testing OpenLogi UIAprilNEA/OpenLogi | 23k | — | ~1.1k | Automated safety check: Pass | Apache-2.0 | |
| Go Testingcxuu/golang-skills | 172 | 1 repos | ~1.3k | Automated safety check: Pass | Apache-2.0 | |
| Contractssamchon/nestia | 2.2k | — | ~1.3k | Automated safety check: Pass | MIT | |
| Cohesion Over TestabilityEpicenterHQ/epicenter | 4.8k | — | ~2k | Automated safety check: Pass | Custom licence |
hellangleZ/burn-in-cceverywhere-ralph
A skill your agent uses when writing new features, fixing bugs, or refactoring code.
AprilNEA/OpenLogi
Verifies OpenLogi's native GPUI interface with focused tests, the component gallery and a mock agent, choosing the evidence that fits each change.
cxuu/golang-skills
A skill your agent uses when writing, reviewing, or improving Go test code — including table-driven tests, subtests, parallel tests, test helpers, test doubles, and assertions with cmp.Diff.
samchon/nestia
Defines self-acknowledgments for production declarations and tests.
EpicenterHQ/epicenter
Collapse test-shaped production boundaries while preserving behavior and coverage.
liaohch3/claude-tap
Tests JavaScript embedded in an HTML file in two layers: pytest checks of the logic ported to Python, and Playwright runs in a real browser for the DOM.
vchelaru/FlatRedBall
Testing GlueControl's embedded runtime (CommandReceiver, GlueControlManager) against a real running game process.
vchelaru/FlatRedBall
A skill your agent uses when adding, modifying, or reasoning about Gluj/Glux file format versions, the GluxVersions enum, FileVersion checks, or anything that gates behavior on the version of a…
vchelaru/FlatRedBall
A skill your agent uses when working on Glue's Gum code generation — adding/removing/version-gating generated properties on Gum standard runtime types (NineSlice, Text, Container, Sprite, etc.), or…
vchelaru/FlatRedBall
FRB1 (engine + Glue) release runbook — gh CLI sequence for Engine.yml/glue.yml, version scheme, release notes.
vchelaru/FlatRedBall
Drafts FRB1 release notes from commits/PRs since the last release.
vchelaru/FlatRedBall
Creates and updates skill files (.claude/skills//SKILL.md). An agent skill from vchelaru/FlatRedBall.
Categories
Bootstrapping GlueUnitTests that touch GlueState.Self/GlueCommands.Self/ProjectManager. Glue Unit Test Bootstrap is an agent skill from vchelaru/FlatRedBall.Self/ProjectManager.
Glue Unit Test Bootstrap fits situations like: tasks that involve Unit testing.
Run `npx skills add vchelaru/FlatRedBall --skill glue-unit-test-bootstrap -a claude-code`. Or copy the skill folder (.claude/skills/glue-unit-test-bootstrap in vchelaru/FlatRedBall) into .claude/skills/glue-unit-test-bootstrap in your project. Claude Code loads it when a task matches its description.
Run `npx skills add vchelaru/FlatRedBall --skill glue-unit-test-bootstrap -a codex`. Or copy the skill folder (.claude/skills/glue-unit-test-bootstrap in vchelaru/FlatRedBall) into .agents/skills/glue-unit-test-bootstrap 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 vchelaru/FlatRedBall --skill glue-unit-test-bootstrap -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/glue-unit-test-bootstrap, .gemini/skills/glue-unit-test-bootstrap, .github/skills/glue-unit-test-bootstrap and .opencode/skills/glue-unit-test-bootstrap in your project.
Going by SKILL.md and its folder, Glue Unit Test Bootstrap needs the command-line tools its instructions call (dotnet and git).
SKILL.md contains no URLs. Its commands use git, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Glue Unit Test Bootstrap is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 4.3k tokens (SKILL.md is roughly 17k 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 Glue Unit Test Bootstrap: TDD Workflow (hellangleZ/burn-in-cceverywhere-ralph, 112 stars), Testing OpenLogi UI (AprilNEA/OpenLogi, 23k stars), Go Testing (cxuu/golang-skills, 172 stars) and Contracts (samchon/nestia, 2.2k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
vchelaru (a GitHub user) maintains it in vchelaru/FlatRedBall, which has 578 GitHub stars. The repository holds 32 skills in this directory. The repository was last updated on October 8, 2026.
Source: vchelaru/FlatRedBall on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.