[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71JVR8M8YY7DMJ7YDB2KH02":3,"skill-same:01M71JVR8M8YY7DMJ7YDB2KH02":77},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":44,"commitSha":45,"skillDirectory":46,"forksCount":47,"repositoryHtmlUrl":48,"repositoryHomepageUrl":6,"ownerHtmlUrl":49,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":50,"install":51,"resources":64},"01M71JVR8M8YY7DMJ7YDB2KH02","gds-test-framework",null,"Initialize game test framework for Unity, Unreal, or Godot. Use when the user says \"test framework\" or \"set up testing\"","developAgent\u002Fbmad-start","developAgent","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F264530239?v=4","01M71J8X6CY24V5ZZHFGETRMSW","01M71J8X739FS28DGQAAY7V4QR",1,"MIT","https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fgds-test-framework\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"test","test framework","framework","gds test framework","testing","SET","game","initialize","user","use","up","unreal","godot","unity","for","when","2026-11-10 10:12:30",false,"---\nname: gds-test-framework\ndescription: 'Initialize game test framework for Unity, Unreal, or Godot. Use when the user says \"test framework\" or \"set up testing\"'\n---\n\n# Game Test Framework Setup\n\n**Workflow ID**: `gds-test-framework`\n**Version**: 1.0 (BMad v6)\n\n## Conventions\n\n- Bare paths (e.g. `template.md`) resolve from the skill root.\n- `{skill-root}` resolves to this skill's installed directory (where `customize.toml` lives).\n- `{project-root}`-prefixed paths resolve from the project working directory.\n- `{skill-name}` resolves to the skill directory's basename.\n\n## On Activation\n\n### Step 1: Resolve the Workflow Block\n\nRun: `python3 {project-root}\u002F_bmad\u002Fscripts\u002Fresolve_customization.py --skill {skill-root} --key workflow`\n\n**If the script fails**, resolve the `workflow` block yourself by reading these three files in base → team → user order and applying the same structural merge rules as the resolver:\n\n1. `{skill-root}\u002Fcustomize.toml` — defaults\n2. `{project-root}\u002F_bmad\u002Fcustom\u002F{skill-name}.toml` — team overrides\n3. `{project-root}\u002F_bmad\u002Fcustom\u002F{skill-name}.user.toml` — personal overrides\n\nAny missing file is skipped. Scalars override, tables deep-merge, arrays of tables keyed by `code` or `id` replace matching entries and append new entries, and all other arrays append.\n\n### Step 2: Execute Prepend Steps\n\nExecute each entry in `{workflow.activation_steps_prepend}` in order before proceeding.\n\n### Step 3: Load Persistent Facts\n\nTreat every entry in `{workflow.persistent_facts}` as foundational context you carry for the rest of the workflow run. Entries prefixed `file:` are paths or globs under `{project-root}` — load the referenced contents as facts. All other entries are facts verbatim.\n\n### Step 4: Load Config\n\nLoad config from `{project-root}\u002F_bmad\u002Fgds\u002Fconfig.yaml` and resolve:\n\n- `user_name`\n- `communication_language`\n\n### Step 5: Greet the User\n\nGreet `{user_name}`, speaking in `{communication_language}`.\n\n### Step 6: Execute Append Steps\n\nExecute each entry in `{workflow.activation_steps_append}` in order.\n\nActivation is complete. Begin the workflow below.\n\n## Goal\n\nInitialize a production-ready game test framework for Unity, Unreal Engine, or Godot projects. This workflow scaffolds the complete testing infrastructure including unit tests, integration tests, and play mode tests appropriate for the detected game engine.\n\n## Role\n\nYou are a Game QA Architect specializing in test infrastructure. You detect the game engine in use, scaffold the appropriate test framework, generate working example tests, and produce documentation — leaving the team with a fully operational testing setup from day one.\n\n---\n\n## WORKFLOW ARCHITECTURE\n\nThis workflow detects the game engine and creates all necessary test infrastructure files directly in the game project.\n\n**Primary Output**: `{test_dir}\u002FREADME.md`\n\n**Supporting Components**:\n- Validation: `{installed_path}\u002Fchecklist.md`\n\n**Knowledge Base References**:\n- `knowledge\u002Funity-testing.md`\n- `knowledge\u002Funreal-testing.md`\n- `knowledge\u002Fgodot-testing.md`\n\n\nLoad and resolve configuration from `{module_config}`:\n\n```yaml\noutput_folder: {from config}\nuser_name: {from config}\ncommunication_language: {from config}\ndocument_output_language: {from config}\ngame_dev_experience: {from config}\ndate: {system-generated}\n```\n\nResolve workflow variables:\n```yaml\ntest_dir: \"{project-root}\u002Ftests\"    # Root test directory\ngame_engine: \"auto\"                  # auto | unity | unreal | godot\ntest_framework: \"auto\"               # auto | gut (godot) | unity-test-framework | unreal-automation\n```\n\n---\n\n## EXECUTION\n\n### Preflight Requirements\n\n**Critical:** Verify these requirements before proceeding. If any fail, HALT and notify the user.\n\n- Game project exists with identifiable engine\n- No test framework already configured (check for existing test directories)\n- Project structure is accessible\n\n---\n\n### Step 1: Detect Game Engine\n\n#### Actions\n\n1. **Identify Engine Type**\n\n   Look for engine-specific files:\n   - **Unity**: `Assets\u002F`, `ProjectSettings\u002FProjectSettings.asset`, `*.unity` scene files\n   - **Unreal**: `*.uproject`, `Source\u002F`, `Config\u002FDefaultEngine.ini`\n   - **Godot**: `project.godot`, `*.tscn`, `*.gd` files\n\n2. **Verify Engine Version**\n   - Unity: Check `ProjectSettings\u002FProjectVersion.txt`\n   - Unreal: Check `*.uproject` file for `EngineAssociation`\n   - Godot: Check `project.godot` for `config_version`\n\n3. **Check for Existing Test Framework**\n   - Unity: Check for `Tests\u002F` folder, `*.Tests.asmdef`\n   - Unreal: Check for `Tests\u002F` in Source, `*Tests.Build.cs`\n   - Godot: Check for `tests\u002F` folder, GUT plugin in `addons\u002Fgut\u002F`\n\n**Halt Condition:** If existing framework detected, offer upgrade path or HALT.\n\n---\n\n### Step 2: Scaffold Framework\n\n#### Unity Test Framework\n\n**Knowledge Base Reference**: `knowledge\u002Funity-testing.md`\n\n1. **Create Directory Structure**\n\n   ```\n   Assets\u002F\n   ├── Tests\u002F\n   │   ├── EditMode\u002F\n   │   │   ├── EditModeTests.asmdef\n   │   │   └── ExampleEditModeTest.cs\n   │   └── PlayMode\u002F\n   │       ├── PlayModeTests.asmdef\n   │       └── ExamplePlayModeTest.cs\n   ```\n\n2. **Generate Assembly Definitions**\n\n   `EditModeTests.asmdef`:\n\n   ```json\n   {\n     \"name\": \"EditModeTests\",\n     \"references\": [\"\u003CGameAssembly>\"],\n     \"includePlatforms\": [\"Editor\"],\n     \"defineConstraints\": [\"UNITY_INCLUDE_TESTS\"],\n     \"optionalUnityReferences\": [\"TestAssemblies\"]\n   }\n   ```\n\n   `PlayModeTests.asmdef`:\n\n   ```json\n   {\n     \"name\": \"PlayModeTests\",\n     \"references\": [\"\u003CGameAssembly>\"],\n     \"includePlatforms\": [],\n     \"defineConstraints\": [\"UNITY_INCLUDE_TESTS\"],\n     \"optionalUnityReferences\": [\"TestAssemblies\"]\n   }\n   ```\n\n3. **Generate Sample Tests**\n\n   Edit Mode test example:\n\n   ```csharp\n   using NUnit.Framework;\n\n   [TestFixture]\n   public class DamageCalculatorTests\n   {\n       [Test]\n       public void Calculate_BaseDamage_ReturnsCorrectValue()\n       {\n           \u002F\u002F Arrange\n           var calculator = new DamageCalculator();\n\n           \u002F\u002F Act\n           float result = calculator.Calculate(100f, 1f);\n\n           \u002F\u002F Assert\n           Assert.AreEqual(100f, result);\n       }\n   }\n   ```\n\n   Play Mode test example:\n\n   ```csharp\n   using System.Collections;\n   using NUnit.Framework;\n   using UnityEngine;\n   using UnityEngine.TestTools;\n\n   public class PlayerMovementTests\n   {\n       [UnityTest]\n       public IEnumerator Player_WhenInputApplied_Moves()\n       {\n           \u002F\u002F Arrange\n           var playerGO = new GameObject(\"Player\");\n           var controller = playerGO.AddComponent\u003CPlayerController>();\n\n           \u002F\u002F Act\n           controller.SetMoveInput(Vector2.right);\n           yield return new WaitForSeconds(0.5f);\n\n           \u002F\u002F Assert\n           Assert.Greater(playerGO.transform.position.x, 0f);\n\n           \u002F\u002F Cleanup\n           Object.Destroy(playerGO);\n       }\n   }\n   ```\n\n---\n\n#### Unreal Engine Automation\n\n**Knowledge Base Reference**: `knowledge\u002Funreal-testing.md`\n\n1. **Create Directory Structure**\n\n   ```\n   Source\u002F\n   ├── \u003CProjectName>\u002F\n   │   └── ...\n   └── \u003CProjectName>Tests\u002F\n       ├── \u003CProjectName>Tests.Build.cs\n       └── Private\u002F\n           ├── DamageCalculationTests.cpp\n           └── PlayerCombatTests.cpp\n   ```\n\n2. **Generate Module Build File**\n\n   `\u003CProjectName>Tests.Build.cs`:\n\n   ```csharp\n   using UnrealBuildTool;\n\n   public class \u003CProjectName>Tests : ModuleRules\n   {\n       public \u003CProjectName>Tests(ReadOnlyTargetRules Target) : base(Target)\n       {\n           PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;\n\n           PublicDependencyModuleNames.AddRange(new string[] {\n               \"Core\",\n               \"CoreUObject\",\n               \"Engine\",\n               \"\u003CProjectName>\"\n           });\n\n           PrivateDependencyModuleNames.AddRange(new string[] {\n               \"AutomationController\"\n           });\n       }\n   }\n   ```\n\n3. **Generate Sample Tests**\n\n   ```cpp\n   #include \"Misc\u002FAutomationTest.h\"\n\n   IMPLEMENT_SIMPLE_AUTOMATION_TEST(\n       FDamageCalculationTest,\n       \"\u003CProjectName>.Combat.DamageCalculation\",\n       EAutomationTestFlags::ApplicationContextMask |\n       EAutomationTestFlags::ProductFilter\n   )\n\n   bool FDamageCalculationTest::RunTest(const FString& Parameters)\n   {\n       \u002F\u002F Arrange\n       float BaseDamage = 100.f;\n       float CritMultiplier = 2.f;\n\n       \u002F\u002F Act\n       float Result = UDamageCalculator::Calculate(BaseDamage, CritMultiplier);\n\n       \u002F\u002F Assert\n       TestEqual(\"Critical hit doubles damage\", Result, 200.f);\n\n       return true;\n   }\n   ```\n\n---\n\n#### Godot GUT Framework\n\n**Knowledge Base Reference**: `knowledge\u002Fgodot-testing.md`\n\n1. **Create Directory Structure**\n\n   ```\n   project\u002F\n   ├── addons\u002F\n   │   └── gut\u002F (plugin files)\n   ├── tests\u002F\n   │   ├── unit\u002F\n   │   │   └── test_damage_calculator.gd\n   │   └── integration\u002F\n   │       └── test_player_combat.gd\n   └── gut_config.json\n   ```\n\n2. **Generate GUT Configuration**\n\n   `gut_config.json`:\n\n   ```json\n   {\n     \"dirs\": [\"res:\u002F\u002Ftests\u002F\"],\n     \"include_subdirs\": true,\n     \"prefix\": \"test_\",\n     \"suffix\": \".gd\",\n     \"should_exit\": true,\n     \"should_exit_on_success\": true,\n     \"log_level\": 1,\n     \"junit_xml_file\": \"results.xml\"\n   }\n   ```\n\n3. **Generate Sample Tests**\n\n   `tests\u002Funit\u002Ftest_damage_calculator.gd`:\n\n   ```gdscript\n   extends GutTest\n\n   var calculator: DamageCalculator\n\n   func before_each():\n       calculator = DamageCalculator.new()\n\n   func after_each():\n       calculator.free()\n\n   func test_calculate_base_damage():\n       var result = calculator.calculate(100.0, 1.0)\n       assert_eq(result, 100.0, \"Base damage should equal input\")\n\n   func test_calculate_critical_hit():\n       var result = calculator.calculate(100.0, 2.0)\n       assert_eq(result, 200.0, \"Critical hit should double damage\")\n   ```\n\n---\n\n### Step 3: Generate Documentation\n\nCreate `tests\u002FREADME.md` with:\n\n- Test framework overview for the detected engine\n- Directory structure explanation\n- Running tests locally\n- CI integration commands\n- Best practices for game testing\n- Links to knowledge base fragments\n\n---\n\n### Step 4: Deliverables\n\n#### Primary Artifacts Created\n\n1. **Directory Structure** — Engine-appropriate test folders\n2. **Configuration Files** — Framework-specific config (asmdef, Build.cs, gut_config.json)\n3. **Sample Tests** — Working examples for unit and integration tests\n4. **Documentation** — `tests\u002FREADME.md`\n\n---\n\n## Output Summary\n\nAfter completing this workflow, provide a summary:\n\n```markdown\n## Game Test Framework Scaffold Complete\n\n**Engine Detected**: {Unity | Unreal | Godot}\n**Framework**: {Unity Test Framework | Unreal Automation | GUT}\n\n**Artifacts Created**:\n\n- Test directory structure\n- Framework configuration\n- Sample unit tests\n- Sample integration\u002Fplay mode tests\n- Documentation\n\n**Next Steps**:\n\n1. Review sample tests and adapt to your game\n2. Run initial tests to verify setup\n3. Use `test-design` workflow to plan comprehensive test coverage\n4. Use `automate` workflow to generate additional tests\n\n**Knowledge Base References Applied**:\n\n- {engine}-testing.md\n- qa-automation.md\n- test-priorities.md\n```\n\n---\n\n## Validation\n\nRefer to `checklist.md` for comprehensive validation criteria.\n\n## On Complete\n\nRun: `python3 {project-root}\u002F_bmad\u002Fscripts\u002Fresolve_customization.py --skill {skill-root} --key workflow.on_complete`\n\nIf the resolved `workflow.on_complete` is non-empty, follow it as the final terminal instruction before exiting.\n","# Game Test Framework Setup\n\n**Workflow ID**: `gds-test-framework`\n**Version**: 1.0 (BMad v6)\n\n## Conventions\n\n- Bare paths (e.g. `template.md`) resolve from the skill root.\n- `{skill-root}` resolves to this skill's installed directory (where `customize.toml` lives).\n- `{project-root}`-prefixed paths resolve from the project working directory.\n- `{skill-name}` resolves to the skill directory's basename.\n\n## On Activation\n\n### Step 1: Resolve the Workflow Block\n\nRun: `python3 {project-root}\u002F_bmad\u002Fscripts\u002Fresolve_customization.py --skill {skill-root} --key workflow`\n\n**If the script fails**, resolve the `workflow` block yourself by reading these three files in base → team → user order and applying the same structural merge rules as the resolver:\n\n1. `{skill-root}\u002Fcustomize.toml` — defaults\n2. `{project-root}\u002F_bmad\u002Fcustom\u002F{skill-name}.toml` — team overrides\n3. `{project-root}\u002F_bmad\u002Fcustom\u002F{skill-name}.user.toml` — personal overrides\n\nAny missing file is skipped. Scalars override, tables deep-merge, arrays of tables keyed by `code` or `id` replace matching entries and append new entries, and all other arrays append.\n\n### Step 2: Execute Prepend Steps\n\nExecute each entry in `{workflow.activation_steps_prepend}` in order before proceeding.\n\n### Step 3: Load Persistent Facts\n\nTreat every entry in `{workflow.persistent_facts}` as foundational context you carry for the rest of the workflow run. Entries prefixed `file:` are paths or globs under `{project-root}` — load the referenced contents as facts. All other entries are facts verbatim.\n\n### Step 4: Load Config\n\nLoad config from `{project-root}\u002F_bmad\u002Fgds\u002Fconfig.yaml` and resolve:\n\n- `user_name`\n- `communication_language`\n\n### Step 5: Greet the User\n\nGreet `{user_name}`, speaking in `{communication_language}`.\n\n### Step 6: Execute Append Steps\n\nExecute each entry in `{workflow.activation_steps_append}` in order.\n\nActivation is complete. Begin the workflow below.\n\n## Goal\n\nInitialize a production-ready game test framework for Unity, Unreal Engine, or Godot projects. This workflow scaffolds the complete testing infrastructure including unit tests, integration tests, and play mode tests appropriate for the detected game engine.\n\n## Role\n\nYou are a Game QA Architect specializing in test infrastructure. You detect the game engine in use, scaffold the appropriate test framework, generate working example tests, and produce documentation — leaving the team with a fully operational testing setup from day one.\n\n---\n\n## WORKFLOW ARCHITECTURE\n\nThis workflow detects the game engine and creates all necessary test infrastructure files directly in the game project.\n\n**Primary Output**: `{test_dir}\u002FREADME.md`\n\n**Supporting Components**:\n- Validation: `{installed_path}\u002Fchecklist.md`\n\n**Knowledge Base References**:\n- `knowledge\u002Funity-testing.md`\n- `knowledge\u002Funreal-testing.md`\n- `knowledge\u002Fgodot-testing.md`\n\n\nLoad and resolve configuration from `{module_config}`:\n\n```yaml\noutput_folder: {from config}\nuser_name: {from config}\ncommunication_language: {from config}\ndocument_output_language: {from config}\ngame_dev_experience: {from config}\ndate: {system-generated}\n```\n\nResolve workflow variables:\n```yaml\ntest_dir: \"{project-root}\u002Ftests\"    # Root test directory\ngame_engine: \"auto\"                  # auto | unity | unreal | godot\ntest_framework: \"auto\"               # auto | gut (godot) | unity-test-framework | unreal-automation\n```\n\n---\n\n## EXECUTION\n\n### Preflight Requirements\n\n**Critical:** Verify these requirements before proceeding. If any fail, HALT and notify the user.\n\n- Game project exists with identifiable engine\n- No test framework already configured (check for existing test directories)\n- Project structure is accessible\n\n---\n\n### Step 1: Detect Game Engine\n\n#### Actions\n\n1. **Identify Engine Type**\n\n   Look for engine-specific files:\n   - **Unity**: `Assets\u002F`, `ProjectSettings\u002FProjectSettings.asset`, `*.unity` scene files\n   - **Unreal**: `*.uproject`, `Source\u002F`, `Config\u002FDefaultEngine.ini`\n   - **Godot**: `project.godot`, `*.tscn`, `*.gd` files\n\n2. **Verify Engine Version**\n   - Unity: Check `ProjectSettings\u002FProjectVersion.txt`\n   - Unreal: Check `*.uproject` file for `EngineAssociation`\n   - Godot: Check `project.godot` for `config_version`\n\n3. **Check for Existing Test Framework**\n   - Unity: Check for `Tests\u002F` folder, `*.Tests.asmdef`\n   - Unreal: Check for `Tests\u002F` in Source, `*Tests.Build.cs`\n   - Godot: Check for `tests\u002F` folder, GUT plugin in `addons\u002Fgut\u002F`\n\n**Halt Condition:** If existing framework detected, offer upgrade path or HALT.\n\n---\n\n### Step 2: Scaffold Framework\n\n#### Unity Test Framework\n\n**Knowledge Base Reference**: `knowledge\u002Funity-testing.md`\n\n1. **Create Directory Structure**\n\n   ```\n   Assets\u002F\n   ├── Tests\u002F\n   │   ├── EditMode\u002F\n   │   │   ├── EditModeTests.asmdef\n   │   │   └── ExampleEditModeTest.cs\n   │   └── PlayMode\u002F\n   │       ├── PlayModeTests.asmdef\n   │       └── ExamplePlayModeTest.cs\n   ```\n\n2. **Generate Assembly Definitions**\n\n   `EditModeTests.asmdef`:\n\n   ```json\n   {\n     \"name\": \"EditModeTests\",\n     \"references\": [\"\u003CGameAssembly>\"],\n     \"includePlatforms\": [\"Editor\"],\n     \"defineConstraints\": [\"UNITY_INCLUDE_TESTS\"],\n     \"optionalUnityReferences\": [\"TestAssemblies\"]\n   }\n   ```\n\n   `PlayModeTests.asmdef`:\n\n   ```json\n   {\n     \"name\": \"PlayModeTests\",\n     \"references\": [\"\u003CGameAssembly>\"],\n     \"includePlatforms\": [],\n     \"defineConstraints\": [\"UNITY_INCLUDE_TESTS\"],\n     \"optionalUnityReferences\": [\"TestAssemblies\"]\n   }\n   ```\n\n3. **Generate Sample Tests**\n\n   Edit Mode test example:\n\n   ```csharp\n   using NUnit.Framework;\n\n   [TestFixture]\n   public class DamageCalculatorTests\n   {\n       [Test]\n       public void Calculate_BaseDamage_ReturnsCorrectValue()\n       {\n           \u002F\u002F Arrange\n           var calculator = new DamageCalculator();\n\n           \u002F\u002F Act\n           float result = calculator.Calculate(100f, 1f);\n\n           \u002F\u002F Assert\n           Assert.AreEqual(100f, result);\n       }\n   }\n   ```\n\n   Play Mode test example:\n\n   ```csharp\n   using System.Collections;\n   using NUnit.Framework;\n   using UnityEngine;\n   using UnityEngine.TestTools;\n\n   public class PlayerMovementTests\n   {\n       [UnityTest]\n       public IEnumerator Player_WhenInputApplied_Moves()\n       {\n           \u002F\u002F Arrange\n           var playerGO = new GameObject(\"Player\");\n           var controller = playerGO.AddComponent\u003CPlayerController>();\n\n           \u002F\u002F Act\n           controller.SetMoveInput(Vector2.right);\n           yield return new WaitForSeconds(0.5f);\n\n           \u002F\u002F Assert\n           Assert.Greater(playerGO.transform.position.x, 0f);\n\n           \u002F\u002F Cleanup\n           Object.Destroy(playerGO);\n       }\n   }\n   ```\n\n---\n\n#### Unreal Engine Automation\n\n**Knowledge Base Reference**: `knowledge\u002Funreal-testing.md`\n\n1. **Create Directory Structure**\n\n   ```\n   Source\u002F\n   ├── \u003CProjectName>\u002F\n   │   └── ...\n   └── \u003CProjectName>Tests\u002F\n       ├── \u003CProjectName>Tests.Build.cs\n       └── Private\u002F\n           ├── DamageCalculationTests.cpp\n           └── PlayerCombatTests.cpp\n   ```\n\n2. **Generate Module Build File**\n\n   `\u003CProjectName>Tests.Build.cs`:\n\n   ```csharp\n   using UnrealBuildTool;\n\n   public class \u003CProjectName>Tests : ModuleRules\n   {\n       public \u003CProjectName>Tests(ReadOnlyTargetRules Target) : base(Target)\n       {\n           PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs;\n\n           PublicDependencyModuleNames.AddRange(new string[] {\n               \"Core\",\n               \"CoreUObject\",\n               \"Engine\",\n               \"\u003CProjectName>\"\n           });\n\n           PrivateDependencyModuleNames.AddRange(new string[] {\n               \"AutomationController\"\n           });\n       }\n   }\n   ```\n\n3. **Generate Sample Tests**\n\n   ```cpp\n   #include \"Misc\u002FAutomationTest.h\"\n\n   IMPLEMENT_SIMPLE_AUTOMATION_TEST(\n       FDamageCalculationTest,\n       \"\u003CProjectName>.Combat.DamageCalculation\",\n       EAutomationTestFlags::ApplicationContextMask |\n       EAutomationTestFlags::ProductFilter\n   )\n\n   bool FDamageCalculationTest::RunTest(const FString& Parameters)\n   {\n       \u002F\u002F Arrange\n       float BaseDamage = 100.f;\n       float CritMultiplier = 2.f;\n\n       \u002F\u002F Act\n       float Result = UDamageCalculator::Calculate(BaseDamage, CritMultiplier);\n\n       \u002F\u002F Assert\n       TestEqual(\"Critical hit doubles damage\", Result, 200.f);\n\n       return true;\n   }\n   ```\n\n---\n\n#### Godot GUT Framework\n\n**Knowledge Base Reference**: `knowledge\u002Fgodot-testing.md`\n\n1. **Create Directory Structure**\n\n   ```\n   project\u002F\n   ├── addons\u002F\n   │   └── gut\u002F (plugin files)\n   ├── tests\u002F\n   │   ├── unit\u002F\n   │   │   └── test_damage_calculator.gd\n   │   └── integration\u002F\n   │       └── test_player_combat.gd\n   └── gut_config.json\n   ```\n\n2. **Generate GUT Configuration**\n\n   `gut_config.json`:\n\n   ```json\n   {\n     \"dirs\": [\"res:\u002F\u002Ftests\u002F\"],\n     \"include_subdirs\": true,\n     \"prefix\": \"test_\",\n     \"suffix\": \".gd\",\n     \"should_exit\": true,\n     \"should_exit_on_success\": true,\n     \"log_level\": 1,\n     \"junit_xml_file\": \"results.xml\"\n   }\n   ```\n\n3. **Generate Sample Tests**\n\n   `tests\u002Funit\u002Ftest_damage_calculator.gd`:\n\n   ```gdscript\n   extends GutTest\n\n   var calculator: DamageCalculator\n\n   func before_each():\n       calculator = DamageCalculator.new()\n\n   func after_each():\n       calculator.free()\n\n   func test_calculate_base_damage():\n       var result = calculator.calculate(100.0, 1.0)\n       assert_eq(result, 100.0, \"Base damage should equal input\")\n\n   func test_calculate_critical_hit():\n       var result = calculator.calculate(100.0, 2.0)\n       assert_eq(result, 200.0, \"Critical hit should double damage\")\n   ```\n\n---\n\n### Step 3: Generate Documentation\n\nCreate `tests\u002FREADME.md` with:\n\n- Test framework overview for the detected engine\n- Directory structure explanation\n- Running tests locally\n- CI integration commands\n- Best practices for game testing\n- Links to knowledge base fragments\n\n---\n\n### Step 4: Deliverables\n\n#### Primary Artifacts Created\n\n1. **Directory Structure** — Engine-appropriate test folders\n2. **Configuration Files** — Framework-specific config (asmdef, Build.cs, gut_config.json)\n3. **Sample Tests** — Working examples for unit and integration tests\n4. **Documentation** — `tests\u002FREADME.md`\n\n---\n\n## Output Summary\n\nAfter completing this workflow, provide a summary:\n\n```markdown\n## Game Test Framework Scaffold Complete\n\n**Engine Detected**: {Unity | Unreal | Godot}\n**Framework**: {Unity Test Framework | Unreal Automation | GUT}\n\n**Artifacts Created**:\n\n- Test directory structure\n- Framework configuration\n- Sample unit tests\n- Sample integration\u002Fplay mode tests\n- Documentation\n\n**Next Steps**:\n\n1. Review sample tests and adapt to your game\n2. Run initial tests to verify setup\n3. Use `test-design` workflow to plan comprehensive test coverage\n4. Use `automate` workflow to generate additional tests\n\n**Knowledge Base References Applied**:\n\n- {engine}-testing.md\n- qa-automation.md\n- test-priorities.md\n```\n\n---\n\n## Validation\n\nRefer to `checklist.md` for comprehensive validation criteria.\n\n## On Complete\n\nRun: `python3 {project-root}\u002F_bmad\u002Fscripts\u002Fresolve_customization.py --skill {skill-root} --key workflow.on_complete`\n\nIf the resolved `workflow.on_complete` is non-empty, follow it as the final terminal instruction before exiting.\n",{"name":5,"description":7},"main","1907bbe850fb749efa8b499b8da7ebb78a663519",".agents\u002Fskills\u002Fgds-test-framework",0,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start","https:\u002F\u002Fgithub.com\u002FdevelopAgent","2026-07-19 05:19:22",{"source":8,"skillName":5,"commands":52,"prompt":62,"zipAvailable":63},[53,56,59],{"tool":54,"command":55},"npx","npx skills add developAgent\u002Fbmad-start --skill gds-test-framework",{"tool":57,"command":58},"bunx","bunx skills add developAgent\u002Fbmad-start --skill gds-test-framework",{"tool":60,"command":61},"pnpm","pnpm dlx skills add developAgent\u002Fbmad-start --skill gds-test-framework","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fgds-test-framework\u002FSKILL.md",true,[65,71],{"path":66,"resourceType":67,"resourceTypeDesc":68,"sizeBytes":69,"sourceHtmlUrl":70},"checklist.md","REFERENCE","参考文档",2418,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fgds-test-framework\u002Fchecklist.md",{"path":72,"resourceType":73,"resourceTypeDesc":74,"sizeBytes":75,"sourceHtmlUrl":76},"customize.toml","OTHER","其他",1652,"https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fgds-test-framework\u002Fcustomize.toml",[78,99,129,147,160,185],{"skillNo":79,"name":80,"nameZh":6,"description":81,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":82,"categories":83,"keywords":89,"publishedAt":98},"01M71R3M9DJTTY0ARFQ6K04NMP","gds-correct-course","Manage significant changes during sprint execution. Use when the user says \"correct course\" or \"propose sprint change\"","https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.rovodev\u002Fskills\u002Fgds-correct-course\u002FSKILL.md",[84],{"categoryNo":85,"categoryName":86,"taxonomyType":87,"taxonomyTypeDesc":88},"01JBSEEDCAT000000000000039","教师与教育","PROFESSION","适用职业",[90,91,92,31,93,94,38,32,95,96,97],"gds correct course","course","correct","changes","change","execution","manage","sprint","2026-11-10 13:02:02",{"skillNo":100,"name":101,"nameZh":6,"description":102,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":103,"categories":104,"keywords":111,"publishedAt":98},"01M71R3GENSFD1A1XVZTTQG1KF","gds-code-review","Review code changes adversarially using parallel review layers (Blind Hunter, Edge Case Hunter, Acceptance Auditor) with structured triage into actionable categories. Use when the user says \"run code review\" or \"review this code\"","https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.rovodev\u002Fskills\u002Fgds-code-review\u002FSKILL.md",[105,108],{"categoryNo":106,"categoryName":107,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000007","代码审查",{"categoryNo":109,"categoryName":110,"taxonomyType":87,"taxonomyTypeDesc":88},"01JBSEEDCAT000000000000030","开发工程师",[112,113,114,115,116,93,117,118,119,120,121,122,123,38,124,32,125,126,127,128],"code review","code","review","gds code review","categories","triage","review code","run","parallel","case","with","run code","acceptance","edge","actionable","layers","hunter",{"skillNo":130,"name":131,"nameZh":6,"description":132,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":133,"categories":134,"keywords":135,"publishedAt":98},"01M71R3DD098MQRD6F8S4GG0AW","gds-check-implementation-readiness","Verify GDD, UX, Architecture, and Epics alignment before production. Use when the user says \"check readiness\" or \"implementation readiness\"","https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.rovodev\u002Fskills\u002Fgds-check-implementation-readiness\u002FSKILL.md",[],[136,137,138,139,140,141,31,142,143,144,145,38,32,146],"check","readiness","Implementation Readiness","gds check implementation readiness","implementation","check readiness","Production","ux","verify","architecture","alignment",{"skillNo":148,"name":149,"nameZh":6,"description":150,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":151,"categories":152,"keywords":153,"publishedAt":98},"01M71R3ACAA1G0NVQ330JQNJPK","gds-brainstorm-game","Facilitate game brainstorming sessions with game-specific techniques. Use when the user says \"brainstorm game\" or \"game ideas\"","https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.rovodev\u002Fskills\u002Fgds-brainstorm-game\u002FSKILL.md",[],[154,29,155,31,156,122,38,32,157,158,159],"gds brainstorm game","brainstorm","brainstorming","techniques","sessions","ideas",{"skillNo":161,"name":162,"nameZh":6,"description":163,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":164,"categories":165,"keywords":169,"publishedAt":98},"01M71R377MJ6WJTTFARGKH3HX7","gds-agent-tech-writer","Technical documentation specialist and knowledge curator for game projects. Use when the user asks to talk to Paige or requests the Technical Writer.","https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.rovodev\u002Fskills\u002Fgds-agent-tech-writer\u002FSKILL.md",[166],{"categoryNo":167,"categoryName":168,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发",[170,171,172,173,32,174,175,37,176,38,31,177,178,179,180,181,182,183,29,184],"gds agent tech writer","tech","writer","technical writer","technical","knowledge","projects","technical documentation","talk","specialist","documentation specialist","knowledge curator","requests","documentation","curator",{"skillNo":186,"name":187,"nameZh":6,"description":188,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":189,"categories":190,"keywords":192,"publishedAt":98},"01M71R34RGT2ZX3TSFA2CRT0NC","gds-agent-game-solo-dev","Elite indie game developer for rapid prototyping and solo quick-flow development. Use when the user asks to talk to Indie or requests the Game Solo Dev.","https:\u002F\u002Fgithub.com\u002FdevelopAgent\u002Fbmad-start\u002Fblob\u002Fmain\u002F.rovodev\u002Fskills\u002Fgds-agent-game-solo-dev\u002FSKILL.md",[191],{"categoryNo":167,"categoryName":168,"taxonomyType":20,"taxonomyTypeDesc":21},[193,29,194,195,196,197,31,178,182,198,199,38,32,200,37,201,202],"solo","gds agent game solo dev","dev","flow","developer","RAPID","game developer","prototyping","development","quick"]