diff --git a/src/modules/bmgd/_module-installer/installer.js b/src/modules/bmgd/_module-installer/installer.js index befcc84f..8b1bbfc3 100644 --- a/src/modules/bmgd/_module-installer/installer.js +++ b/src/modules/bmgd/_module-installer/installer.js @@ -3,6 +3,18 @@ const path = require('node:path'); const chalk = require('chalk'); const platformCodes = require(path.join(__dirname, '../../../../tools/cli/lib/platform-codes')); +/** + * Validate that a resolved path is within the project root (prevents path traversal) + * @param {string} resolvedPath - The fully resolved absolute path + * @param {string} projectRoot - The project root directory + * @returns {boolean} - True if path is within project root + */ +function isWithinProjectRoot(resolvedPath, projectRoot) { + const normalizedResolved = path.normalize(resolvedPath); + const normalizedRoot = path.normalize(projectRoot); + return normalizedResolved.startsWith(normalizedRoot + path.sep) || normalizedResolved === normalizedRoot; +} + /** * BMGD Module Installer * Standard module installer function that executes after IDE installations @@ -21,10 +33,13 @@ async function install(options) { logger.log(chalk.blue('๐ŸŽฎ Installing BMGD Module...')); // Create planning artifacts directory (for GDDs, game briefs, architecture) - if (config['planning_artifacts']) { - const planningConfig = config['planning_artifacts'].replace('{project-root}/', ''); + if (config['planning_artifacts'] && typeof config['planning_artifacts'] === 'string') { + // Strip project-root prefix variations + const planningConfig = config['planning_artifacts'].replace(/^\{project-root\}\/?/, ''); const planningPath = path.join(projectRoot, planningConfig); - if (!(await fs.pathExists(planningPath))) { + if (!isWithinProjectRoot(planningPath, projectRoot)) { + logger.warn(chalk.yellow(`Warning: planning_artifacts path escapes project root, skipping: ${planningConfig}`)); + } else if (!(await fs.pathExists(planningPath))) { logger.log(chalk.yellow(`Creating game planning artifacts directory: ${planningConfig}`)); await fs.ensureDir(planningPath); } @@ -33,20 +48,26 @@ async function install(options) { // Create implementation artifacts directory (sprint status, stories, reviews) // Check both implementation_artifacts and sprint_artifacts for compatibility const implConfig = config['implementation_artifacts'] || config['sprint_artifacts']; - if (implConfig) { - const implConfigClean = implConfig.replace('{project-root}/', ''); + if (implConfig && typeof implConfig === 'string') { + // Strip project-root prefix variations + const implConfigClean = implConfig.replace(/^\{project-root\}\/?/, ''); const implPath = path.join(projectRoot, implConfigClean); - if (!(await fs.pathExists(implPath))) { + if (!isWithinProjectRoot(implPath, projectRoot)) { + logger.warn(chalk.yellow(`Warning: implementation_artifacts path escapes project root, skipping: ${implConfigClean}`)); + } else if (!(await fs.pathExists(implPath))) { logger.log(chalk.yellow(`Creating implementation artifacts directory: ${implConfigClean}`)); await fs.ensureDir(implPath); } } // Create project knowledge directory - if (config['project_knowledge']) { - const knowledgeConfig = config['project_knowledge'].replace('{project-root}/', ''); + if (config['project_knowledge'] && typeof config['project_knowledge'] === 'string') { + // Strip project-root prefix variations + const knowledgeConfig = config['project_knowledge'].replace(/^\{project-root\}\/?/, ''); const knowledgePath = path.join(projectRoot, knowledgeConfig); - if (!(await fs.pathExists(knowledgePath))) { + if (!isWithinProjectRoot(knowledgePath, projectRoot)) { + logger.warn(chalk.yellow(`Warning: project_knowledge path escapes project root, skipping: ${knowledgeConfig}`)); + } else if (!(await fs.pathExists(knowledgePath))) { logger.log(chalk.yellow(`Creating project knowledge directory: ${knowledgeConfig}`)); await fs.ensureDir(knowledgePath); } @@ -117,12 +138,15 @@ async function configureForIDE(ide, projectRoot, config, logger) { const platformHandler = require(platformSpecificPath); if (typeof platformHandler.install === 'function') { - await platformHandler.install({ + const success = await platformHandler.install({ projectRoot, config, logger, platformInfo: platformCodes.getPlatform(ide), }); + if (!success) { + logger.warn(chalk.yellow(` Warning: BMGD platform handler for ${platformName} returned failure`)); + } } } else { // No platform-specific handler for this IDE diff --git a/src/modules/bmgd/_module-installer/platform-specifics/claude-code.js b/src/modules/bmgd/_module-installer/platform-specifics/claude-code.js index bcca82b2..8ad050aa 100644 --- a/src/modules/bmgd/_module-installer/platform-specifics/claude-code.js +++ b/src/modules/bmgd/_module-installer/platform-specifics/claude-code.js @@ -1,5 +1,3 @@ -const chalk = require('chalk'); - /** * BMGD Platform-specific installer for Claude Code * @@ -10,26 +8,16 @@ const chalk = require('chalk'); * @param {Object} options.platformInfo - Platform metadata from global config * @returns {Promise} - Success status */ -async function install(options) { - const { logger, platformInfo } = options; - // projectRoot and config available for future use +async function install() { + // TODO: Add Claude Code specific BMGD configurations here + // For example: + // - Game-specific slash commands + // - Agent party configurations for game dev team + // - Workflow integrations for Unity/Unreal/Godot + // - Game testing framework integrations - try { - const platformName = platformInfo ? platformInfo.name : 'Claude Code'; - logger.log(chalk.cyan(` BMGD-${platformName} Specifics installed`)); - - // Add Claude Code specific BMGD configurations here - // For example: - // - Game-specific slash commands - // - Agent party configurations for game dev team - // - Workflow integrations for Unity/Unreal/Godot - // - Game testing framework integrations - - return true; - } catch (error) { - logger.error(chalk.red(`Error installing BMGD Claude Code specifics: ${error.message}`)); - return false; - } + // Currently a stub - no platform-specific configuration needed yet + return true; } module.exports = { install }; diff --git a/src/modules/bmgd/_module-installer/platform-specifics/windsurf.js b/src/modules/bmgd/_module-installer/platform-specifics/windsurf.js index 061d4fce..46f03c9c 100644 --- a/src/modules/bmgd/_module-installer/platform-specifics/windsurf.js +++ b/src/modules/bmgd/_module-installer/platform-specifics/windsurf.js @@ -1,5 +1,3 @@ -const chalk = require('chalk'); - /** * BMGD Platform-specific installer for Windsurf * @@ -10,21 +8,11 @@ const chalk = require('chalk'); * @param {Object} options.platformInfo - Platform metadata from global config * @returns {Promise} - Success status */ -async function install(options) { - const { logger, platformInfo } = options; - // projectRoot and config available for future use +async function install() { + // TODO: Add Windsurf specific BMGD configurations here - try { - const platformName = platformInfo ? platformInfo.name : 'Windsurf'; - logger.log(chalk.cyan(` BMGD-${platformName} Specifics installed`)); - - // Add Windsurf specific BMGD configurations here - - return true; - } catch (error) { - logger.error(chalk.red(`Error installing BMGD Windsurf specifics: ${error.message}`)); - return false; - } + // Currently a stub - no platform-specific configuration needed yet + return true; } module.exports = { install }; diff --git a/src/modules/bmgd/agents/game-architect.agent.yaml b/src/modules/bmgd/agents/game-architect.agent.yaml index ca2aeb13..7fba70dc 100644 --- a/src/modules/bmgd/agents/game-architect.agent.yaml +++ b/src/modules/bmgd/agents/game-architect.agent.yaml @@ -18,7 +18,6 @@ agent: - Hours of planning save weeks of refactoring hell - Every system must handle the hot path at 60fps - Avoid "Not Invented Here" syndrome, always check if work has been done before - - Find if this exists, if it does, always treat it as the bible I plan and execute against: `**/project-context.md` critical_actions: - "Find if this exists, if it does, always treat it as the bible I plan and execute against: `**/project-context.md`" diff --git a/src/modules/bmgd/agents/game-designer.agent.yaml b/src/modules/bmgd/agents/game-designer.agent.yaml index 3c54d873..59de8f56 100644 --- a/src/modules/bmgd/agents/game-designer.agent.yaml +++ b/src/modules/bmgd/agents/game-designer.agent.yaml @@ -16,7 +16,6 @@ agent: - Design what players want to FEEL, not what they say they want - Prototype fast - one hour of playtesting beats ten hours of discussion - Every mechanic must serve the core fantasy - - Find if this exists, if it does, always treat it as the bible I plan and execute against: `**/project-context.md` critical_actions: - "Find if this exists, if it does, always treat it as the bible I plan and execute against: `**/project-context.md`" diff --git a/src/modules/bmgd/agents/game-dev.agent.yaml b/src/modules/bmgd/agents/game-dev.agent.yaml index bdaa1841..381aef21 100644 --- a/src/modules/bmgd/agents/game-dev.agent.yaml +++ b/src/modules/bmgd/agents/game-dev.agent.yaml @@ -17,7 +17,6 @@ agent: - Write code designers can iterate without fear - Ship early, ship often, iterate on player feedback - Red-green-refactor: tests first, implementation second - - Find if this exists, if it does, always treat it as the bible I plan and execute against: `**/project-context.md` critical_actions: - "Find if this exists, if it does, always treat it as the bible I plan and execute against: `**/project-context.md`" diff --git a/src/modules/bmgd/agents/game-qa.agent.yaml b/src/modules/bmgd/agents/game-qa.agent.yaml index 13c4f861..1c8dc595 100644 --- a/src/modules/bmgd/agents/game-qa.agent.yaml +++ b/src/modules/bmgd/agents/game-qa.agent.yaml @@ -18,7 +18,6 @@ agent: - Every shipped bug is a process failure, not a people failure - Flaky tests are worse than no tests - they erode trust - Profile before optimize, test before ship - - Find if this exists, if it does, always treat it as the bible I plan and execute against: `**/project-context.md` critical_actions: - "Consult {project-root}/_bmad/bmgd/gametest/qa-index.csv to select knowledge fragments under knowledge/ and load only the files needed for the current task" @@ -32,7 +31,7 @@ agent: description: Get workflow status or check current project state - trigger: test-framework - workflow: "{project-root}/_bmad/bmgd/workflows/gametest/framework/workflow.yaml" + workflow: "{project-root}/_bmad/bmgd/workflows/gametest/test-framework/workflow.yaml" description: Initialize game test framework (Unity/Unreal/Godot) - trigger: test-design diff --git a/src/modules/bmgd/agents/game-scrum-master.agent.yaml b/src/modules/bmgd/agents/game-scrum-master.agent.yaml index 7786094e..39c41004 100644 --- a/src/modules/bmgd/agents/game-scrum-master.agent.yaml +++ b/src/modules/bmgd/agents/game-scrum-master.agent.yaml @@ -17,12 +17,11 @@ agent: - Clean separation between design and implementation - Keep the team moving through each phase - Stories are single source of truth for implementation - - Find if this exists, if it does, always treat it as the bible I plan and execute against: `**/project-context.md` critical_actions: - "Find if this exists, if it does, always treat it as the bible I plan and execute against: `**/project-context.md`" - "When running *create-story for game features, use GDD, Architecture, and Tech Spec to generate complete draft stories without elicitation, focusing on playable outcomes." - - "Always run as *yolo when creating stories - generate complete drafts from existing documentation" + - "Generate complete story drafts from existing documentation without additional elicitation" menu: - trigger: workflow-status diff --git a/src/modules/bmgd/agents/game-solo-dev.agent.yaml b/src/modules/bmgd/agents/game-solo-dev.agent.yaml index b996b186..1b63be37 100644 --- a/src/modules/bmgd/agents/game-solo-dev.agent.yaml +++ b/src/modules/bmgd/agents/game-solo-dev.agent.yaml @@ -17,12 +17,15 @@ agent: - A playable build beats a perfect design doc. Ship early, playtest often. - 60fps is non-negotiable. Performance is a feature. - The core loop must be fun before anything else matters. - - Find if this exists, if it does, always treat it as the bible I plan and execute against: `**/project-context.md` critical_actions: - "Find if this exists, if it does, always treat it as the bible I plan and execute against: `**/project-context.md`" menu: + - trigger: workflow-status + workflow: "{project-root}/_bmad/bmgd/workflows/workflow-status/workflow.yaml" + description: Get workflow status or check current project state + - trigger: quick-prototype workflow: "{project-root}/_bmad/bmgd/workflows/bmgd-quick-flow/quick-prototype/workflow.yaml" description: Rapid prototype to test if the mechanic is fun (Start here for new ideas) @@ -40,9 +43,14 @@ agent: description: Review code quality (use fresh context for best results) - trigger: test-framework - workflow: "{project-root}/_bmad/bmgd/workflows/gametest/framework/workflow.yaml" + workflow: "{project-root}/_bmad/bmgd/workflows/gametest/test-framework/workflow.yaml" description: Set up automated testing for your game engine - trigger: party-mode exec: "{project-root}/_bmad/core/workflows/party-mode/workflow.md" description: Bring in other experts when specialized backup is needed + + - trigger: advanced-elicitation + exec: "{project-root}/_bmad/core/tasks/advanced-elicitation.xml" + description: Advanced elicitation techniques to challenge the LLM to get better results + web-only: true diff --git a/src/modules/bmgd/docs/quick-start.md b/src/modules/bmgd/docs/quick-start.md index 1ad7bf5b..6e625d44 100644 --- a/src/modules/bmgd/docs/quick-start.md +++ b/src/modules/bmgd/docs/quick-start.md @@ -76,11 +76,11 @@ BMGD follows four game development phases: **Workflows:** - `sprint-planning` - Plan and track sprints -- `create-story-draft` - Create implementable stories +- `sprint-status` - View progress and get recommendations +- `create-story` - Create implementable stories - `dev-story` - Implement stories - `code-review` - Quality assurance -- `story-done` - Complete stories -- `epic-retrospective` - Learn and improve +- `retrospective` - Learn and improve after epics **Output:** Working game code @@ -154,7 +154,7 @@ Agent: [Sets up sprint tracking and epic management] ## Choosing Your Agent -BMGD provides four specialized agents: +BMGD provides six specialized agents: | Agent | Icon | When to Use | | --------------------- | ---- | ----------------------------------------- | @@ -162,6 +162,8 @@ BMGD provides four specialized agents: | **Game Architect** | ๐Ÿ›๏ธ | Architecture, technical decisions | | **Game Developer** | ๐Ÿ•น๏ธ | Implementation, code reviews | | **Game Scrum Master** | ๐ŸŽฏ | Sprint planning, story management | +| **Game QA** | ๐Ÿงช | Test framework, test design, automation | +| **Game Solo Dev** | ๐ŸŽฎ | Quick prototyping, indie development | ### Typical Flow @@ -191,13 +193,12 @@ BMGD provides four specialized agents: ### Phase 4: Production - `sprint-planning` - Plan sprints -- `epic-tech-context` - Create Epic Tech Spec +- `sprint-status` - View progress and recommendations - `create-story` - Create story -- `story-context` - Generate story context - `dev-story` - Implement story - `code-review` - Review code -- `story-done` - Complete story -- `epic-retrospective` - Team retrospective +- `retrospective` - Team retrospective +- `correct-course` - Handle sprint changes ### Quick-Flow (Fast-Track) diff --git a/src/modules/bmgd/docs/unnamed.jpg b/src/modules/bmgd/docs/unnamed.jpg deleted file mode 100644 index 3f61b3c5..00000000 Binary files a/src/modules/bmgd/docs/unnamed.jpg and /dev/null differ diff --git a/src/modules/bmgd/docs/workflows-guide.md b/src/modules/bmgd/docs/workflows-guide.md index 524e15da..b0fb0684 100644 --- a/src/modules/bmgd/docs/workflows-guide.md +++ b/src/modules/bmgd/docs/workflows-guide.md @@ -439,20 +439,19 @@ Deep exploration techniques to challenge assumptions and surface hidden requirem --- -## Workflow Inheritance +## Standalone BMGD Workflows -BMGD Phase 4 workflows use a `workflow-install` pattern to inherit from BMM: +BMGD Phase 4 workflows are standalone implementations tailored for game development: ```yaml workflow: '{project-root}/_bmad/bmgd/workflows/4-production/dev-story/workflow.yaml' -workflow-install: '{project-root}/_bmad/bmgd/workflows/4-production/dev-story/workflow.yaml' ``` This means: -1. Core workflow logic comes from BMM -2. BMGD overrides provide game-specific templates and checklists -3. Updates to BMM flow automatically to BMGD +1. BMGD workflows are self-contained with game-specific logic +2. Game-focused templates, checklists, and instructions +3. No dependency on BMM workflow files --- diff --git a/src/modules/bmgd/gametest/knowledge/certification-testing.md b/src/modules/bmgd/gametest/knowledge/certification-testing.md index d282c6d9..4e268f8d 100644 --- a/src/modules/bmgd/gametest/knowledge/certification-testing.md +++ b/src/modules/bmgd/gametest/knowledge/certification-testing.md @@ -131,11 +131,11 @@ REQUIREMENT: Save Data Portability (PS4โ†’PS5) ### Xbox (XR) | Requirement | Description | Priority | -| ----------- | ----------------------------- | ----------- | --- | +| ----------- | ----------------------------- | ----------- | | XR-015 | Title timeout handling | Critical | | XR-045 | User sign-out handling | Critical | | XR-067 | Active user requirement | Critical | -| XR-074 | Quick Resume support | Series X | S | +| XR-074 | Quick Resume support | Series X/S | | XR-115 | Xbox Accessibility Guidelines | Recommended | ### Nintendo Switch diff --git a/src/modules/bmgd/gametest/knowledge/playtesting.md b/src/modules/bmgd/gametest/knowledge/playtesting.md index 00fbd032..c22242a9 100644 --- a/src/modules/bmgd/gametest/knowledge/playtesting.md +++ b/src/modules/bmgd/gametest/knowledge/playtesting.md @@ -88,6 +88,253 @@ Before each playtest session, define: - Menu navigation patterns - Control scheme preferences +## Playtesting by Game Type + +Different genres require different playtesting approaches and focus areas. + +### Action/Platformer Games + +**Focus Areas:** + +- Control responsiveness and "game feel" +- Difficulty curve across levels +- Checkpoint placement and frustration points +- Visual clarity during fast-paced action + +**Key Questions:** + +- Does the character feel good to control? +- Are deaths feeling fair or cheap? +- Is the player learning organically or hitting walls? + +### RPG/Story Games + +**Focus Areas:** + +- Narrative pacing and engagement +- Quest clarity and tracking +- Character/dialogue believability +- Progression and reward timing + +**Key Questions:** + +- Do players understand their current objective? +- Are choices feeling meaningful? +- Is the story holding attention or being skipped? + +### Puzzle Games + +**Focus Areas:** + +- Solution discoverability +- "Aha moment" timing +- Hint system effectiveness +- Difficulty progression + +**Key Questions:** + +- Are players solving puzzles the intended way? +- How long before frustration sets in? +- Do solutions feel satisfying or arbitrary? + +### Multiplayer/Competitive Games + +**Focus Areas:** + +- Balance across characters/builds/strategies +- Meta development and dominant strategies +- Social dynamics and toxicity vectors +- Matchmaking feel + +**Key Questions:** + +- Are there "must-pick" or "never-pick" options? +- Do losing players understand why they lost? +- Is the skill ceiling high enough for mastery? + +### Survival/Sandbox Games + +**Focus Areas:** + +- Early game onboarding and survival +- Goal clarity vs. freedom balance +- Resource economy and pacing +- Emergent gameplay moments + +**Key Questions:** + +- Do players know what to do first? +- Is the loop engaging beyond the first hour? +- Are players creating their own goals? + +### Mobile/Casual Games + +**Focus Areas:** + +- Session length appropriateness +- One-hand playability (if applicable) +- Interruption handling (calls, notifications) +- Monetization friction points + +**Key Questions:** + +- Can players play in 2-minute sessions? +- Is the core loop immediately understandable? +- Where do players churn? + +### Horror Games + +**Focus Areas:** + +- Tension and release pacing +- Scare effectiveness and desensitization +- Safe space placement +- Audio/visual atmosphere + +**Key Questions:** + +- When do players feel safe vs. threatened? +- Are scares landing or becoming predictable? +- Is anxiety sustainable or exhausting? + +## Processing Feedback Effectively + +Raw feedback is noise. Processed feedback is signal. + +### The Feedback Processing Pipeline + +``` +Raw Feedback โ†’ Categorize โ†’ Pattern Match โ†’ Root Cause โ†’ Prioritize โ†’ Action +``` + +### Step 1: Categorize Feedback + +Sort all feedback into buckets: + +| Category | Examples | +| ------------- | ---------------------------------- | +| **Bugs** | Crashes, glitches, broken features | +| **Usability** | Confusing UI, unclear objectives | +| **Balance** | Too hard, too easy, unfair | +| **Feel** | Controls, pacing, satisfaction | +| **Content** | Wants more of X, dislikes Y | +| **Polish** | Audio, visuals, juice | + +### Step 2: Pattern Matching + +Individual feedback is anecdotal. Patterns are data. + +**Threshold Guidelines:** + +- 1 person mentions it โ†’ Note it +- 3+ people mention it โ†’ Investigate +- 50%+ mention it โ†’ Priority issue + +**Watch for:** + +- Same complaint, different words +- Same area, different complaints (signals deeper issue) +- Contradictory feedback (may indicate preference split) + +### Step 3: Root Cause Analysis + +Players report symptoms, not diseases. + +**Example:** + +- **Symptom:** "The boss is too hard" +- **Possible Root Causes:** + - Boss mechanics unclear + - Player didn't learn required skill earlier + - Checkpoint too far from boss + - Health/damage tuning off + - Boss pattern has no safe windows + +**Ask "Why?" five times** to get to root cause. + +### Step 4: Separate Fact from Opinion + +| Fact (Actionable) | Opinion (Context) | +| --------------------------------- | ----------------------- | +| "I died 12 times on level 3" | "Level 3 is too hard" | +| "I didn't use the shield ability" | "The shield is useless" | +| "I quit after 20 minutes" | "The game is boring" | + +**Facts tell you WHAT happened. Opinions tell you how they FELT about it.** + +Both matter, but facts drive solutions. + +### Step 5: The Feedback Matrix + +Plot issues on impact vs. effort: + +``` + High Impact + โ”‚ + Quick โ”‚ Major + Wins โ”‚ Projects + โ”‚ +โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ + โ”‚ + Fill โ”‚ Reconsider + Time โ”‚ + โ”‚ + Low Impact + Low Effort โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ High Effort +``` + +### Step 6: Validate Before Acting + +Before making changes based on feedback: + +1. **Reproduce** - Can you see the issue yourself? +2. **Quantify** - How many players affected? +3. **Contextualize** - Is this your target audience? +4. **Test solutions** - Will the fix create new problems? + +### Handling Contradictory Feedback + +When Player A wants X and Player B wants the opposite: + +1. **Check sample size** - Is it really split or just 2 loud voices? +2. **Segment audiences** - Are these different player types? +3. **Find the underlying need** - Both may want the same thing differently +4. **Consider options** - Difficulty settings, toggles, multiple paths +5. **Make a decision** - You can't please everyone; know your target + +### Feedback Red Flags + +**Dismiss or investigate carefully:** + +- "Make it like [other game]" - They want a feeling, not a clone +- "Add multiplayer" - Feature creep disguised as feedback +- "I would have bought it if..." - Hypothetical customers aren't real +- Feedback from non-target audience - Know who you're building for + +**Take seriously:** + +- Confusion about core mechanics +- Consistent drop-off at same point +- "I wanted to like it but..." +- Silent quitting (no feedback, just gone) + +### Documentation Best Practices + +**For each playtest session, record:** + +- Date and build version +- Tester demographics/experience +- Session length +- Key observations (timestamped if recorded) +- Quantitative survey results +- Top 3 issues identified +- Actions taken as result + +**Maintain a living document** that tracks: + +- Issue โ†’ First reported โ†’ Times reported โ†’ Status โ†’ Resolution +- This prevents re-discovering the same issues + ## Common Playtesting Pitfalls ### Leading Questions diff --git a/src/modules/bmgd/gametest/knowledge/smoke-testing.md b/src/modules/bmgd/gametest/knowledge/smoke-testing.md index 2db2fa47..20be2ae0 100644 --- a/src/modules/bmgd/gametest/knowledge/smoke-testing.md +++ b/src/modules/bmgd/gametest/knowledge/smoke-testing.md @@ -125,6 +125,8 @@ TEST: Settings Persist ```csharp using System.Collections; using NUnit.Framework; +using UnityEngine; +using UnityEngine.UI; using UnityEngine.TestTools; using UnityEngine.SceneManagement; @@ -256,6 +258,7 @@ bool FPlayerMovementTest::RunTest(const FString& Parameters) // Wait for physics ADD_LATENT_AUTOMATION_COMMAND(FWaitForSeconds(0.5f)); + // Note: FVerifyPlayerMoved is a custom latent command - implement to verify player position changed ADD_LATENT_AUTOMATION_COMMAND(FVerifyPlayerMoved(StartPos)); return true; diff --git a/src/modules/bmgd/gametest/knowledge/unity-testing.md b/src/modules/bmgd/gametest/knowledge/unity-testing.md index 8c7340e6..f1b872d9 100644 --- a/src/modules/bmgd/gametest/knowledge/unity-testing.md +++ b/src/modules/bmgd/gametest/knowledge/unity-testing.md @@ -12,7 +12,7 @@ Unity provides a built-in Test Framework based on NUnit for writing and running // manifest.json - usually pre-installed { "dependencies": { - "com.unity.test-framework": "1.1.33" + "com.unity.test-framework": "1.6.0" } } ``` diff --git a/src/modules/bmgd/gametest/knowledge/unreal-testing.md b/src/modules/bmgd/gametest/knowledge/unreal-testing.md index a611bdd7..0863bd0c 100644 --- a/src/modules/bmgd/gametest/knowledge/unreal-testing.md +++ b/src/modules/bmgd/gametest/knowledge/unreal-testing.md @@ -312,7 +312,7 @@ bool FMemoryLeakTest::RunTest(const FString& Parameters) { UObject* Obj = NewObject(); // ... use object - Obj->MarkPendingKill(); + Obj->MarkAsGarbage(); // UE5 API (was MarkPendingKill in UE4) } CollectGarbage(GARBAGE_COLLECTION_KEEPFLAGS); @@ -331,16 +331,18 @@ bool FMemoryLeakTest::RunTest(const FString& Parameters) ### Command Line ```bash -# Run all tests -UE4Editor.exe MyGame -ExecCmds="Automation RunTests Now" -unattended -nopause +# Run all tests (UE5) +UnrealEditor.exe MyGame -ExecCmds="Automation RunTests Now" -unattended -nopause # Run specific test -UE4Editor.exe MyGame -ExecCmds="Automation RunTests MyGame.Combat" -unattended +UnrealEditor.exe MyGame -ExecCmds="Automation RunTests MyGame.Combat" -unattended # Run with report -UE4Editor.exe MyGame \ +UnrealEditor.exe MyGame \ -ExecCmds="Automation RunTests Now; Automation ReportResults" \ -ReportOutputPath=TestResults.xml + +# Note: For UE4, use UE4Editor.exe instead of UnrealEditor.exe ``` ### GitHub Actions @@ -351,7 +353,8 @@ test: steps: - name: Run Tests run: | - & "$env:UE_ROOT/Engine/Binaries/Win64/UE4Editor-Cmd.exe" ` + # UE5: UnrealEditor-Cmd.exe, UE4: UE4Editor-Cmd.exe + & "$env:UE_ROOT/Engine/Binaries/Win64/UnrealEditor-Cmd.exe" ` "${{ github.workspace }}/MyGame.uproject" ` -ExecCmds="Automation RunTests Now" ` -unattended -nopause -nullrhi diff --git a/src/modules/bmgd/gametest/qa-index.csv b/src/modules/bmgd/gametest/qa-index.csv index 84e53cfc..af026afd 100644 --- a/src/modules/bmgd/gametest/qa-index.csv +++ b/src/modules/bmgd/gametest/qa-index.csv @@ -14,4 +14,4 @@ input-testing,Input Testing,"Controller, keyboard, and touch input validation"," localization-testing,Localization Testing,"Text, audio, and cultural validation for international releases","localization,i18n,text",knowledge/localization-testing.md certification-testing,Platform Certification,"Console TRC/XR requirements and certification testing","certification,console,trc,xr",knowledge/certification-testing.md smoke-testing,Smoke Testing,"Critical path validation for build verification","smoke-tests,bvt,ci",knowledge/smoke-testing.md -test-priorities,Test Priorities Matrix,"P0-P3 criteria, coverage targets, execution ordering for games","prioritization,risk,coverage",knowledge/test-priorities.md +test-priorities,Test Priorities Matrix,"P0-P3 criteria, coverage targets, execution ordering for games","prioritization,risk,coverage",knowledge/test-priorities.md \ No newline at end of file diff --git a/src/modules/bmgd/module.yaml b/src/modules/bmgd/module.yaml index c36313cd..22d61813 100644 --- a/src/modules/bmgd/module.yaml +++ b/src/modules/bmgd/module.yaml @@ -15,7 +15,7 @@ project_name: default: "{directory_name}" result: "{value}" -user_skill_level: +game_dev_experience: prompt: - "What is your game development experience level?" - "This affects how agents explain concepts in chat." diff --git a/src/modules/bmgd/teams/team-gamedev.yaml b/src/modules/bmgd/teams/team-gamedev.yaml index bca80ee9..05dd4aae 100644 --- a/src/modules/bmgd/teams/team-gamedev.yaml +++ b/src/modules/bmgd/teams/team-gamedev.yaml @@ -16,7 +16,7 @@ workflows: - game-brief - gdd - narrative - - create-architecture + - game-architecture - sprint-planning - sprint-status - create-story diff --git a/src/modules/bmgd/workflows/1-preproduction/game-brief/template.md b/src/modules/bmgd/workflows/1-preproduction/game-brief/template.md deleted file mode 100644 index 79453077..00000000 --- a/src/modules/bmgd/workflows/1-preproduction/game-brief/template.md +++ /dev/null @@ -1,205 +0,0 @@ -# Game Brief: {{game_name}} - -**Date:** {{date}} -**Author:** {{user_name}} -**Status:** Draft for GDD Development - ---- - -## Executive Summary - -{{executive_summary}} - ---- - -## Game Vision - -### Core Concept - -{{core_concept}} - -### Elevator Pitch - -{{elevator_pitch}} - -### Vision Statement - -{{vision_statement}} - ---- - -## Target Market - -### Primary Audience - -{{primary_audience}} - -### Secondary Audience - -{{secondary_audience}} - -### Market Context - -{{market_context}} - ---- - -## Game Fundamentals - -### Core Gameplay Pillars - -{{core_gameplay_pillars}} - -### Primary Mechanics - -{{primary_mechanics}} - -### Player Experience Goals - -{{player_experience_goals}} - ---- - -## Scope and Constraints - -### Target Platforms - -{{target_platforms}} - -### Development Timeline - -{{development_timeline}} - -### Budget Considerations - -{{budget_considerations}} - -### Team Resources - -{{team_resources}} - -### Technical Constraints - -{{technical_constraints}} - ---- - -## Reference Framework - -### Inspiration Games - -{{inspiration_games}} - -### Competitive Analysis - -{{competitive_analysis}} - -### Key Differentiators - -{{key_differentiators}} - ---- - -## Content Framework - -### World and Setting - -{{world_setting}} - -### Narrative Approach - -{{narrative_approach}} - -### Content Volume - -{{content_volume}} - ---- - -## Art and Audio Direction - -### Visual Style - -{{visual_style}} - -### Audio Style - -{{audio_style}} - -### Production Approach - -{{production_approach}} - ---- - -## Risk Assessment - -### Key Risks - -{{key_risks}} - -### Technical Challenges - -{{technical_challenges}} - -### Market Risks - -{{market_risks}} - -### Mitigation Strategies - -{{mitigation_strategies}} - ---- - -## Success Criteria - -### MVP Definition - -{{mvp_definition}} - -### Success Metrics - -{{success_metrics}} - -### Launch Goals - -{{launch_goals}} - ---- - -## Next Steps - -### Immediate Actions - -{{immediate_actions}} - -### Research Needs - -{{research_needs}} - -### Open Questions - -{{open_questions}} - ---- - -## Appendices - -### A. Research Summary - -{{research_summary}} - -### B. Stakeholder Input - -{{stakeholder_input}} - -### C. References - -{{references}} - ---- - -_This Game Brief serves as the foundational input for Game Design Document (GDD) creation._ - -_Next Steps: Use the `workflow gdd` command to create detailed game design documentation._ diff --git a/src/modules/bmgd/workflows/2-design/gdd/gdd-template.md b/src/modules/bmgd/workflows/2-design/gdd/gdd-template.md deleted file mode 100644 index a0a20ef9..00000000 --- a/src/modules/bmgd/workflows/2-design/gdd/gdd-template.md +++ /dev/null @@ -1,153 +0,0 @@ -# {{game_name}} - Game Design Document - -**Author:** {{user_name}} -**Game Type:** {{game_type}} -**Target Platform(s):** {{platforms}} - ---- - -## Executive Summary - -### Core Concept - -{{description}} - -### Target Audience - -{{target_audience}} - -### Unique Selling Points (USPs) - -{{unique_selling_points}} - ---- - -## Goals and Context - -### Project Goals - -{{goals}} - -### Background and Rationale - -{{context}} - ---- - -## Core Gameplay - -### Game Pillars - -{{game_pillars}} - -### Core Gameplay Loop - -{{gameplay_loop}} - -### Win/Loss Conditions - -{{win_loss_conditions}} - ---- - -## Game Mechanics - -### Primary Mechanics - -{{primary_mechanics}} - -### Controls and Input - -{{controls}} - ---- - -{{GAME_TYPE_SPECIFIC_SECTIONS}} - ---- - -## Progression and Balance - -### Player Progression - -{{player_progression}} - -### Difficulty Curve - -{{difficulty_curve}} - -### Economy and Resources - -{{economy_resources}} - ---- - -## Level Design Framework - -### Level Types - -{{level_types}} - -### Level Progression - -{{level_progression}} - ---- - -## Art and Audio Direction - -### Art Style - -{{art_style}} - -### Audio and Music - -{{audio_music}} - ---- - -## Technical Specifications - -### Performance Requirements - -{{performance_requirements}} - -### Platform-Specific Details - -{{platform_details}} - -### Asset Requirements - -{{asset_requirements}} - ---- - -## Development Epics - -### Epic Structure - -{{epics}} - ---- - -## Success Metrics - -### Technical Metrics - -{{technical_metrics}} - -### Gameplay Metrics - -{{gameplay_metrics}} - ---- - -## Out of Scope - -{{out_of_scope}} - ---- - -## Assumptions and Dependencies - -{{assumptions_and_dependencies}} diff --git a/src/modules/bmgd/workflows/2-design/gdd/steps/step-02-context.md b/src/modules/bmgd/workflows/2-design/gdd/steps/step-02-context.md index 00aed323..f00ddaa0 100644 --- a/src/modules/bmgd/workflows/2-design/gdd/steps/step-02-context.md +++ b/src/modules/bmgd/workflows/2-design/gdd/steps/step-02-context.md @@ -184,7 +184,7 @@ I'll use this to identify the right game type framework for our GDD." I'll be listening for signals to help us identify the right game type framework." -**AFTER this message, continue to Section 4.** +**AFTER this message, SKIP to Section 4.** --- diff --git a/src/modules/bmgd/workflows/2-design/narrative/narrative-template.md b/src/modules/bmgd/workflows/2-design/narrative/narrative-template.md deleted file mode 100644 index 4a703ff9..00000000 --- a/src/modules/bmgd/workflows/2-design/narrative/narrative-template.md +++ /dev/null @@ -1,195 +0,0 @@ -# {{game_name}} - Narrative Design Document - -**Author:** {{user_name}} -**Game Type:** {{game_type}} -**Narrative Complexity:** {{narrative_complexity}} - ---- - -## Executive Summary - -### Narrative Premise - -{{narrative_premise}} - -### Core Themes - -{{core_themes}} - -### Tone and Atmosphere - -{{tone_atmosphere}} - ---- - -## Story Structure - -### Story Type - -{{story_type}} - -**Structure used:** (3-act, hero's journey, kishลtenketsu, episodic, branching, etc.) - -### Act Breakdown - -{{act_breakdown}} - -### Story Beats - -{{story_beats}} - -### Pacing and Flow - -{{pacing_flow}} - ---- - -## Characters - -### Protagonist(s) - -{{protagonists}} - -### Antagonist(s) - -{{antagonists}} - -### Supporting Characters - -{{supporting_characters}} - -### Character Arcs - -{{character_arcs}} - ---- - -## World and Lore - -### World Overview - -{{world_overview}} - -### History and Backstory - -{{history_backstory}} - -### Factions and Organizations - -{{factions_organizations}} - -### Locations - -{{locations}} - -### Cultural Elements - -{{cultural_elements}} - ---- - -## Dialogue Framework - -### Dialogue Style - -{{dialogue_style}} - -### Key Conversations - -{{key_conversations}} - -### Branching Dialogue - -{{branching_dialogue}} - -### Voice and Characterization - -{{voice_characterization}} - ---- - -## Environmental Storytelling - -### Visual Storytelling - -{{visual_storytelling}} - -### Audio Storytelling - -{{audio_storytelling}} - -### Found Documents - -{{found_documents}} - -### Environmental Clues - -{{environmental_clues}} - ---- - -## Narrative Delivery - -### Cutscenes and Cinematics - -{{cutscenes}} - -### In-Game Storytelling - -{{ingame_storytelling}} - -### Optional Content - -{{optional_content}} - -### Multiple Endings - -{{multiple_endings}} - ---- - -## Integration with Gameplay - -### Narrative-Gameplay Harmony - -{{narrative_gameplay}} - -### Story Gates - -{{story_gates}} - -### Player Agency - -{{player_agency}} - ---- - -## Production Notes - -### Writing Scope - -{{writing_scope}} - -### Localization Considerations - -{{localization}} - -### Voice Acting - -{{voice_acting}} - ---- - -## Appendix - -### Character Relationship Map - -{{relationship_map}} - -### Timeline - -{{timeline}} - -### References and Inspirations - -{{references}} diff --git a/src/modules/bmgd/workflows/2-design/narrative/steps/step-01-init.md b/src/modules/bmgd/workflows/2-design/narrative/steps/step-01-init.md index eed5a57b..269cb176 100644 --- a/src/modules/bmgd/workflows/2-design/narrative/steps/step-01-init.md +++ b/src/modules/bmgd/workflows/2-design/narrative/steps/step-01-init.md @@ -56,7 +56,7 @@ Validate workflow readiness, check for existing narrative document, load GDD con **Search for workflow status file:** -Check if `{output_folder}/bmm-workflow-status.yaml` exists. +Check if `{output_folder}/bmgd-workflow-status.yaml` exists. **If status file found:** diff --git a/src/modules/bmgd/workflows/3-technical/game-architecture/architecture-template.md b/src/modules/bmgd/workflows/3-technical/game-architecture/architecture-template.md deleted file mode 100644 index 5012469d..00000000 --- a/src/modules/bmgd/workflows/3-technical/game-architecture/architecture-template.md +++ /dev/null @@ -1,103 +0,0 @@ -# Architecture - -## Executive Summary - -{{executive_summary}} - -{{project_initialization_section}} - -## Decision Summary - -| Category | Decision | Version | Affects Epics | Rationale | -| -------- | -------- | ------- | ------------- | --------- | - -{{decision_table_rows}} - -## Project Structure - -``` -{{project_root}}/ -{{source_tree}} -``` - -## Epic to Architecture Mapping - -{{epic_mapping_table}} - -## Technology Stack Details - -### Core Technologies - -{{core_stack_details}} - -### Integration Points - -{{integration_details}} - -{{novel_pattern_designs_section}} - -## Implementation Patterns - -These patterns ensure consistent implementation across all AI agents: - -{{implementation_patterns}} - -## Consistency Rules - -### Naming Conventions - -{{naming_conventions}} - -### Code Organization - -{{code_organization_patterns}} - -### Error Handling - -{{error_handling_approach}} - -### Logging Strategy - -{{logging_approach}} - -## Data Architecture - -{{data_models_and_relationships}} - -## API Contracts - -{{api_specifications}} - -## Security Architecture - -{{security_approach}} - -## Performance Considerations - -{{performance_strategies}} - -## Deployment Architecture - -{{deployment_approach}} - -## Development Environment - -### Prerequisites - -{{development_prerequisites}} - -### Setup Commands - -```bash -{{setup_commands}} -``` - -## Architecture Decision Records (ADRs) - -{{key_architecture_decisions}} - ---- - -_Generated by BMAD Decision Architecture Workflow v1.0_ -_Date: {{date}}_ -_For: {{user_name}}_ diff --git a/src/modules/bmgd/workflows/4-production/create-story/instructions.xml b/src/modules/bmgd/workflows/4-production/create-story/instructions.xml index e3805451..524a979b 100644 --- a/src/modules/bmgd/workflows/4-production/create-story/instructions.xml +++ b/src/modules/bmgd/workflows/4-production/create-story/instructions.xml @@ -21,7 +21,7 @@ Parse user-provided story path: extract epic_num, story_num, story_title from format like "1-2-user-auth" Set {{epic_num}}, {{story_num}}, {{story_key}} from user input - GOTO step 2a + GOTO step 2 Check if {{sprint_status}} file exists for auto discover @@ -47,12 +47,12 @@ Parse user input: extract epic_num, story_num, story_title Set {{epic_num}}, {{story_num}}, {{story_key}} from user input - GOTO step 2a + GOTO step 2 Use user-provided path for story documents - GOTO step 2a + GOTO step 2 @@ -114,64 +114,8 @@ ๐Ÿ“Š Epic {{epic_num}} status updated to in-progress - GOTO step 2a + GOTO step 2 - Load the FULL file: {{sprint_status}} - Read ALL lines from beginning to end - do not skip any content - Parse the development_status section completely - - Find the FIRST story (by reading in order from top to bottom) where: - - Key matches pattern: number-number-name (e.g., "1-2-user-auth") - - NOT an epic key (epic-X) or retrospective (epic-X-retrospective) - - Status value equals "backlog" - - - - ๐Ÿ“‹ No backlog stories found in sprint-status.yaml - - All stories are either already created, in progress, or done. - - **Options:** - 1. Run sprint-planning to refresh story tracking - 2. Load PM agent and run correct-course to add more stories - 3. Check if current sprint is complete and run retrospective - - HALT - - - Extract from found story key (e.g., "1-2-user-authentication"): - - epic_num: first number before dash (e.g., "1") - - story_num: second number after first dash (e.g., "2") - - story_title: remainder after second dash (e.g., "user-authentication") - - Set {{story_id}} = "{{epic_num}}.{{story_num}}" - Store story_key for later use (e.g., "1-2-user-authentication") - - - Check if this is the first story in epic {{epic_num}} by looking for {{epic_num}}-1-* pattern - - Load {{sprint_status}} and check epic-{{epic_num}} status - If epic status is "backlog" โ†’ update to "in-progress" - If epic status is "contexted" (legacy status) โ†’ update to "in-progress" (backward compatibility) - If epic status is "in-progress" โ†’ no change needed - - ๐Ÿšซ ERROR: Cannot create story in completed epic - Epic {{epic_num}} is marked as 'done'. All stories are complete. - If you need to add more work, either: - 1. Manually change epic status back to 'in-progress' in sprint-status.yaml - 2. Create a new epic for additional work - HALT - Cannot proceed - - - ๐Ÿšซ ERROR: Invalid epic status '{{epic_status}}' - Epic {{epic_num}} has invalid status. Expected: backlog, in-progress, or done - Please fix sprint-status.yaml manually or run sprint-planning to regenerate - HALT - Cannot proceed - - ๐Ÿ“Š Epic {{epic_num}} status updated to in-progress - - - GOTO step 2a diff --git a/src/modules/bmgd/workflows/gametest/playtest-plan/workflow.yaml b/src/modules/bmgd/workflows/gametest/playtest-plan/workflow.yaml index 722a4334..b721681b 100644 --- a/src/modules/bmgd/workflows/gametest/playtest-plan/workflow.yaml +++ b/src/modules/bmgd/workflows/gametest/playtest-plan/workflow.yaml @@ -23,6 +23,18 @@ variables: session_duration: 60 # minutes participant_count: 5 +# Smart input file references - for understanding game mechanics to test +input_file_patterns: + gdd: + description: "Game Design Document for mechanics to validate" + whole: "{output_folder}/*gdd*.md" + sharded: "{output_folder}/*gdd*/*.md" + load_strategy: "FULL_LOAD" + game_brief: + description: "Game Brief for understanding core pillars" + whole: "{output_folder}/*brief*.md" + load_strategy: "FULL_LOAD" + # Output configuration default_output_file: "{output_folder}/playtest-plan.md" diff --git a/src/modules/bmgd/workflows/gametest/framework/checklist.md b/src/modules/bmgd/workflows/gametest/test-framework/checklist.md similarity index 100% rename from src/modules/bmgd/workflows/gametest/framework/checklist.md rename to src/modules/bmgd/workflows/gametest/test-framework/checklist.md diff --git a/src/modules/bmgd/workflows/gametest/framework/instructions.md b/src/modules/bmgd/workflows/gametest/test-framework/instructions.md similarity index 100% rename from src/modules/bmgd/workflows/gametest/framework/instructions.md rename to src/modules/bmgd/workflows/gametest/test-framework/instructions.md diff --git a/src/modules/bmgd/workflows/gametest/framework/workflow.yaml b/src/modules/bmgd/workflows/gametest/test-framework/workflow.yaml similarity index 93% rename from src/modules/bmgd/workflows/gametest/framework/workflow.yaml rename to src/modules/bmgd/workflows/gametest/test-framework/workflow.yaml index 5c9b9cd2..903b69b1 100644 --- a/src/modules/bmgd/workflows/gametest/framework/workflow.yaml +++ b/src/modules/bmgd/workflows/gametest/test-framework/workflow.yaml @@ -12,7 +12,7 @@ document_output_language: "{config_source}:document_output_language" date: system-generated # Workflow components -installed_path: "{project-root}/_bmad/bmgd/workflows/gametest/framework" +installed_path: "{project-root}/_bmad/bmgd/workflows/gametest/test-framework" instructions: "{installed_path}/instructions.md" validation: "{installed_path}/checklist.md" diff --git a/src/modules/bmgd/workflows/workflow-status/workflow.yaml b/src/modules/bmgd/workflows/workflow-status/workflow.yaml index bdac979e..269b2c5f 100644 --- a/src/modules/bmgd/workflows/workflow-status/workflow.yaml +++ b/src/modules/bmgd/workflows/workflow-status/workflow.yaml @@ -9,7 +9,7 @@ output_folder: "{config_source}:output_folder" user_name: "{config_source}:user_name" communication_language: "{config_source}:communication_language" document_output_language: "{config_source}:document_output_language" -user_skill_level: "{config_source}:game_dev_experience" +game_dev_experience: "{config_source}:game_dev_experience" date: system-generated # Workflow components