@bmad/bmad-game-dev-studio 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/.markdownlint-cli2.yaml +35 -0
  2. package/.nvmrc +1 -0
  3. package/.prettierignore +9 -0
  4. package/LICENSE +26 -0
  5. package/README.md +119 -0
  6. package/eslint.config.mjs +152 -0
  7. package/package.json +91 -0
  8. package/prettier.config.mjs +32 -0
  9. package/src/_module-installer/installer.js +110 -0
  10. package/src/_module-installer/platform-specifics/claude-code.js +23 -0
  11. package/src/_module-installer/platform-specifics/windsurf.js +18 -0
  12. package/src/agents/game-architect.agent.yaml +40 -0
  13. package/src/agents/game-designer.agent.yaml +45 -0
  14. package/src/agents/game-dev.agent.yaml +49 -0
  15. package/src/agents/game-qa.agent.yaml +63 -0
  16. package/src/agents/game-scrum-master.agent.yaml +56 -0
  17. package/src/agents/game-solo-dev.agent.yaml +49 -0
  18. package/src/agents/tech-writer/tech-writer.agent.yaml +45 -0
  19. package/src/gametest/qa-index.csv +18 -0
  20. package/src/module-help.csv +26 -0
  21. package/src/module.yaml +65 -0
  22. package/src/teams/default-party.csv +12 -0
  23. package/src/teams/team-gamedev.yaml +29 -0
  24. package/src/workflows/1-preproduction/brainstorm-game/game-brain-methods.csv +26 -0
  25. package/src/workflows/1-preproduction/brainstorm-game/workflow.yaml +62 -0
  26. package/src/workflows/1-preproduction/game-brief/workflow.yaml +67 -0
  27. package/src/workflows/2-design/gdd/game-types.csv +25 -0
  28. package/src/workflows/2-design/gdd/workflow.yaml +101 -0
  29. package/src/workflows/2-design/narrative/workflow.yaml +77 -0
  30. package/src/workflows/3-technical/game-architecture/architecture-patterns.yaml +507 -0
  31. package/src/workflows/3-technical/game-architecture/decision-catalog.yaml +340 -0
  32. package/src/workflows/3-technical/game-architecture/engine-mcps.yaml +270 -0
  33. package/src/workflows/3-technical/game-architecture/pattern-categories.csv +13 -0
  34. package/src/workflows/3-technical/game-architecture/workflow.yaml +101 -0
  35. package/src/workflows/4-production/code-review/instructions.xml +226 -0
  36. package/src/workflows/4-production/code-review/workflow.yaml +64 -0
  37. package/src/workflows/4-production/correct-course/workflow.yaml +65 -0
  38. package/src/workflows/4-production/create-story/instructions.xml +345 -0
  39. package/src/workflows/4-production/create-story/workflow.yaml +61 -0
  40. package/src/workflows/4-production/dev-story/instructions.xml +410 -0
  41. package/src/workflows/4-production/dev-story/workflow.yaml +27 -0
  42. package/src/workflows/4-production/retrospective/workflow.yaml +58 -0
  43. package/src/workflows/4-production/sprint-planning/sprint-status-template.yaml +55 -0
  44. package/src/workflows/4-production/sprint-planning/workflow.yaml +54 -0
  45. package/src/workflows/4-production/sprint-status/workflow.yaml +35 -0
  46. package/src/workflows/document-project/documentation-requirements.csv +12 -0
  47. package/src/workflows/document-project/templates/project-scan-report-schema.json +160 -0
  48. package/src/workflows/document-project/workflow.yaml +30 -0
  49. package/src/workflows/document-project/workflows/deep-dive.yaml +31 -0
  50. package/src/workflows/document-project/workflows/full-scan.yaml +31 -0
  51. package/src/workflows/gametest/automate/workflow.yaml +50 -0
  52. package/src/workflows/gametest/e2e-scaffold/workflow.yaml +145 -0
  53. package/src/workflows/gametest/performance/workflow.yaml +48 -0
  54. package/src/workflows/gametest/playtest-plan/workflow.yaml +59 -0
  55. package/src/workflows/gametest/test-design/workflow.yaml +47 -0
  56. package/src/workflows/gametest/test-framework/workflow.yaml +48 -0
  57. package/src/workflows/gametest/test-review/workflow.yaml +48 -0
@@ -0,0 +1,35 @@
1
+ # markdownlint-cli2 configuration
2
+ # https://github.com/DavidAnson/markdownlint-cli2
3
+
4
+ ignores:
5
+ - node_modules/**
6
+ - test/fixtures/**
7
+ - CODE_OF_CONDUCT.md
8
+ - _bmad/**
9
+ - _bmad*/**
10
+ - .*/**
11
+ - z*/**
12
+
13
+ # Rule configuration
14
+ config:
15
+ # Disable all rules by default
16
+ default: false
17
+
18
+ # Heading levels should increment by one (h1 -> h2 -> h3, not h1 -> h3)
19
+ MD001: true
20
+
21
+ # Duplicate sibling headings (same heading text at same level under same parent)
22
+ MD024:
23
+ siblings_only: true
24
+
25
+ # Trailing commas in headings (likely typos)
26
+ MD026:
27
+ punctuation: ","
28
+
29
+ # Bare URLs - may not render as links in all parsers
30
+ # Should use <url> or [text](url) format
31
+ MD034: true
32
+
33
+ # Spaces inside emphasis markers - breaks rendering
34
+ # e.g., "* text *" won't render as emphasis
35
+ MD037: true
package/.nvmrc ADDED
@@ -0,0 +1 @@
1
+ 22
@@ -0,0 +1,9 @@
1
+ # Test fixtures with intentionally broken/malformed files
2
+ test/fixtures/**
3
+
4
+ # Contributor Covenant (external standard)
5
+ CODE_OF_CONDUCT.md
6
+
7
+ # BMAD runtime folders (user-specific, not in repo)
8
+ _bmad/
9
+ _bmad*/
package/LICENSE ADDED
@@ -0,0 +1,26 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 BMad Code, LLC
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
22
+
23
+ TRADEMARK NOTICE:
24
+ BMad™ , BMAD-CORE™ and BMAD-METHOD™ are trademarks of BMad Code, LLC. The use of these
25
+ trademarks in this software does not grant any rights to use the trademarks
26
+ for any other purpose.
package/README.md ADDED
@@ -0,0 +1,119 @@
1
+ # BMad Game Dev Studio
2
+
3
+ [![Version](https://img.shields.io/npm/v/bmad-game-dev-studio?color=blue&label=version)](https://www.npmjs.com/package/bmad-game-dev-studio)
4
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
5
+ [![Discord](https://img.shields.io/badge/Discord-Join%20Community-7289da?logo=discord&logoColor=white)](https://discord.gg/gk8jAdXWmj)
6
+
7
+ **BMGD brings BMad's structured development to game development.** Create working prototypes quickly in Unity, Unreal, Godot—or any engine you choose.
8
+
9
+ ![BMGD Logo](docs/bmgd-logo.png)
10
+
11
+ ## About BMGD
12
+
13
+ BMad Game Dev Studio (BMGD) adapts the BMad Method framework for game development. Developed by game industry veterans, BMGD guides you through product research, technical design, narrative design, and a full epic-driven production cycle.
14
+
15
+ ## Supported Engines
16
+
17
+ BMGD has first-class support for:
18
+
19
+ - [Unity](https://unity.com) — C# scripting, industry-standard for many game types
20
+ - [Unreal Engine](https://www.unrealengine.com/) — Blueprint and C++, AAA powerhouse
21
+ - [Godot](https://godotengine.org/) — Open-source, GDScript, rapidly growing
22
+
23
+ But you're not limited to these—BMGD works with any platform, from pure C to custom engines.
24
+
25
+ ## What You Can Create
26
+
27
+ BMGD supports **21 game types**, including:
28
+
29
+ | Genre | Examples |
30
+ |-------|----------|
31
+ | Action | Platformers, shooters, hack-and-slash |
32
+ | RPG | Action RPG, tactical RPG, dungeon crawlers |
33
+ | Strategy | Turn-based, RTS, tower defense |
34
+ | Simulation | Life sim, tycoon, management |
35
+ | Adventure | Visual novels, point-and-click, walking simulators |
36
+ | And more... | Survival, horror, puzzle, racing, etc. |
37
+
38
+ ## What BMGD Does
39
+
40
+ - **Product Research** — Market analysis, competitor research, positioning
41
+ - **Game Design Document** — Comprehensive GDD with mechanics, progression, and balance
42
+ - **Narrative Design** — Story structure, characters, dialogue, world-building
43
+ - **Technical Architecture** — Engine patterns, performance considerations
44
+ - **Production Planning** — Epic-driven sprints, story tracking, retrospectives
45
+ - **Quick Prototyping** — Skip the planning, jump straight into building
46
+
47
+ ## What BMGD Doesn't Do
48
+
49
+ BMGD works *with* coding agents like Claude Code, Cursor, or GitHub Copilot—but it can't create everything:
50
+
51
+ - Art assets (models, textures, sprites)
52
+ - Animations
53
+ - Music and sound effects
54
+ - Full game implementation from scratch
55
+
56
+ Think of BMGD as your senior game dev colleague—not a replacement for your entire team.
57
+
58
+ ## Installation
59
+
60
+ BMGD is installed as a module during BMad Method setup:
61
+
62
+ ```bash
63
+ npx bmad-method@alpha install
64
+ ```
65
+
66
+ Select **Game Dev Studio** from the modules list.
67
+
68
+ ## Quick Start
69
+
70
+ After installing, run from your project root:
71
+
72
+ ```
73
+ /bmgd-help # Get guided help for game development
74
+ /bmgd-quick-dev # Jump straight into prototyping
75
+ /bmgd-gdd # Create a Game Design Document
76
+ /bmgd-narrative # Design your game's story
77
+ ```
78
+
79
+ ## Two Ways to Work
80
+
81
+ | Approach | When to Use | Workflow |
82
+ |----------|-------------|----------|
83
+ | **Quick Flow** | Rapid prototyping, small projects | `/bmgd-quick-dev` |
84
+ | **Full Production** | Full games, teams, long-term | `/bmgd-help` for guided path |
85
+
86
+ ## Example: Starting a New Game
87
+
88
+ ```
89
+ You: /bmgd-help
90
+ BMGD: What kind of game are you making?
91
+ You: A tactical sci-fi RPG
92
+ BMGD: Great choice! Here's what I recommend...
93
+ [Guides you through genre-specific planning]
94
+ [Helps select appropriate workflows]
95
+ ```
96
+
97
+ ## Documentation
98
+
99
+ - [BMad Method Docs](http://docs.bmad-method.org)
100
+ - [BMGD Guide](http://docs.bmad-method.org/bmgd/)
101
+
102
+ ## Community
103
+
104
+ - [Discord](https://discord.gg/gk8jAdXWmj) — Get help from other game devs
105
+ - [GitHub Issues](https://github.com/bmad-code-org/bmad-module-game-dev-studio/issues) — Report bugs
106
+
107
+ ## License
108
+
109
+ MIT License — see [LICENSE](LICENSE) for details.
110
+
111
+ ---
112
+
113
+ **BMad Game Dev Studio** — Part of the [BMad Method](https://github.com/bmad-code-org/BMAD-METHOD) ecosystem.
114
+
115
+ [![Contributors](https://contrib.rocks/image?repo=bmad-code-org/bmad-module-game-dev-studio)](https://github.com/bmad-code-org/bmad-module-game-dev-studio/graphs/contributors)
116
+
117
+ See [CONTRIBUTORS.md](CONTRIBUTORS.md) for contributor information.
118
+
119
+ *If you can dream it, you can build it.*
@@ -0,0 +1,152 @@
1
+ import js from '@eslint/js';
2
+ import eslintConfigPrettier from 'eslint-config-prettier/flat';
3
+ import nodePlugin from 'eslint-plugin-n';
4
+ import unicorn from 'eslint-plugin-unicorn';
5
+ import yml from 'eslint-plugin-yml';
6
+
7
+ export default [
8
+ // Global ignores for files/folders that should not be linted
9
+ {
10
+ ignores: [
11
+ 'dist/**',
12
+ 'coverage/**',
13
+ '**/*.min.js',
14
+ 'test/template-test-generator/**',
15
+ 'test/template-test-generator/**/*.js',
16
+ 'test/template-test-generator/**/*.md',
17
+ 'test/fixtures/**',
18
+ 'test/fixtures/**/*.yaml',
19
+ '_bmad/**',
20
+ '_bmad*/**',
21
+ // Build output
22
+ 'build/**',
23
+ // Website uses ESM/Astro - separate linting ecosystem
24
+ 'website/**',
25
+ // Gitignored patterns
26
+ 'z*/**', // z-samples, z1, z2, etc.
27
+ '.claude/**',
28
+ '.codex/**',
29
+ '.github/chatmodes/**',
30
+ '.agent/**',
31
+ '.agentvibes/**',
32
+ '.kiro/**',
33
+ '.roo/**',
34
+ 'test-project-install/**',
35
+ 'sample-project/**',
36
+ 'tools/template-test-generator/test-scenarios/**',
37
+ 'src/modules/*/sub-modules/**',
38
+ '.bundler-temp/**',
39
+ ],
40
+ },
41
+
42
+ // Base JavaScript recommended rules
43
+ js.configs.recommended,
44
+
45
+ // Node.js rules
46
+ ...nodePlugin.configs['flat/mixed-esm-and-cjs'],
47
+
48
+ // Unicorn rules (modern best practices)
49
+ unicorn.configs.recommended,
50
+
51
+ // YAML linting
52
+ ...yml.configs['flat/recommended'],
53
+
54
+ // Place Prettier last to disable conflicting stylistic rules
55
+ eslintConfigPrettier,
56
+
57
+ // Project-specific tweaks
58
+ {
59
+ rules: {
60
+ // Allow console for CLI tools in this repo
61
+ 'no-console': 'off',
62
+ // Enforce .yaml file extension for consistency
63
+ 'yml/file-extension': [
64
+ 'error',
65
+ {
66
+ extension: 'yaml',
67
+ caseSensitive: true,
68
+ },
69
+ ],
70
+ // Prefer double quotes in YAML wherever quoting is used, but allow the other to avoid escapes
71
+ 'yml/quotes': [
72
+ 'error',
73
+ {
74
+ prefer: 'double',
75
+ avoidEscape: true,
76
+ },
77
+ ],
78
+ // Relax some Unicorn rules that are too opinionated for this codebase
79
+ 'unicorn/prevent-abbreviations': 'off',
80
+ 'unicorn/no-null': 'off',
81
+ },
82
+ },
83
+
84
+ // CLI scripts under tools/** and test/**
85
+ {
86
+ files: ['tools/**/*.js', 'tools/**/*.mjs', 'test/**/*.js'],
87
+ rules: {
88
+ // Allow CommonJS patterns for Node CLI scripts
89
+ 'unicorn/prefer-module': 'off',
90
+ 'unicorn/import-style': 'off',
91
+ 'unicorn/no-process-exit': 'off',
92
+ 'n/no-process-exit': 'off',
93
+ 'unicorn/no-await-expression-member': 'off',
94
+ 'unicorn/prefer-top-level-await': 'off',
95
+ // Avoid failing CI on incidental unused vars in internal scripts
96
+ 'no-unused-vars': 'off',
97
+ // Reduce style-only churn in internal tools
98
+ 'unicorn/prefer-ternary': 'off',
99
+ 'unicorn/filename-case': 'off',
100
+ 'unicorn/no-array-reduce': 'off',
101
+ 'unicorn/no-array-callback-reference': 'off',
102
+ 'unicorn/consistent-function-scoping': 'off',
103
+ 'n/no-extraneous-require': 'off',
104
+ 'n/no-extraneous-import': 'off',
105
+ 'n/no-unpublished-require': 'off',
106
+ 'n/no-unpublished-import': 'off',
107
+ // Some scripts intentionally use globals provided at runtime
108
+ 'no-undef': 'off',
109
+ // Additional relaxed rules for legacy/internal scripts
110
+ 'no-useless-catch': 'off',
111
+ 'unicorn/prefer-number-properties': 'off',
112
+ 'no-unreachable': 'off',
113
+ 'unicorn/text-encoding-identifier-case': 'off',
114
+ },
115
+ },
116
+
117
+ // Module installer scripts use CommonJS for compatibility
118
+ {
119
+ files: ['**/_module-installer/**/*.js'],
120
+ rules: {
121
+ // Allow CommonJS patterns for installer scripts
122
+ 'unicorn/prefer-module': 'off',
123
+ 'n/no-missing-require': 'off',
124
+ 'n/no-unpublished-require': 'off',
125
+ },
126
+ },
127
+
128
+ // ESLint config file should not be checked for publish-related Node rules
129
+ {
130
+ files: ['eslint.config.mjs'],
131
+ rules: {
132
+ 'n/no-unpublished-import': 'off',
133
+ },
134
+ },
135
+
136
+ // GitHub workflow files in this repo may use empty mapping values
137
+ {
138
+ files: ['.github/workflows/**/*.yaml'],
139
+ rules: {
140
+ 'yml/no-empty-mapping-value': 'off',
141
+ },
142
+ },
143
+
144
+ // Other GitHub YAML files may intentionally use empty values and reserved filenames
145
+ {
146
+ files: ['.github/**/*.yaml'],
147
+ rules: {
148
+ 'yml/no-empty-mapping-value': 'off',
149
+ 'unicorn/filename-case': 'off',
150
+ },
151
+ },
152
+ ];
package/package.json ADDED
@@ -0,0 +1,91 @@
1
+ {
2
+ "$schema": "https://json.schemastore.org/package.json",
3
+ "name": "@bmad/bmad-game-dev-studio",
4
+ "version": "0.1.4",
5
+ "description": "A BMad MEthod Core Module that offers a substantial stand alone module for Game Development across multiple supported platforms",
6
+ "keywords": [
7
+ "bmad",
8
+ "game-dev"
9
+ ],
10
+ "repository": {
11
+ "type": "git",
12
+ "url": "git+https://github.com/bmad-code-org/bmad-module-game-dev-studio.git"
13
+ },
14
+ "license": "MIT",
15
+ "author": "Brian (BMad) Madison",
16
+ "main": "",
17
+ "scripts": {
18
+ "format:check": "prettier --check \"**/*.{js,cjs,mjs,json,yaml}\"",
19
+ "format:fix": "prettier --write \"**/*.{js,cjs,mjs,json,yaml}\"",
20
+ "lint": "eslint . --ext .js,.cjs,.mjs,.yaml --max-warnings=0",
21
+ "lint:fix": "eslint . --ext .js,.cjs,.mjs,.yaml --fix",
22
+ "lint:md": "markdownlint-cli2 \"**/*.md\"",
23
+ "prepare": "husky || exit 0",
24
+ "release": "npm run release:patch",
25
+ "release:major": "npm version major && git push --follow-tags",
26
+ "release:minor": "npm version minor && git push --follow-tags",
27
+ "release:patch": "npm version patch && git push --follow-tags",
28
+ "release:prerelease": "npm version prerelease && git push --follow-tags",
29
+ "test": "npm run test:schemas && npm run validate:schemas && npm run lint && npm run lint:md && npm run format:check",
30
+ "test:schemas": "node test/test-agent-schema.js",
31
+ "validate:schemas": "node test/validate-agent-schema.js"
32
+ },
33
+ "lint-staged": {
34
+ "*.{js,cjs,mjs}": [
35
+ "npm run lint:fix",
36
+ "npm run format:fix"
37
+ ],
38
+ "*.yaml": [
39
+ "eslint --fix",
40
+ "npm run format:fix"
41
+ ],
42
+ "*.json": [
43
+ "npm run format:fix"
44
+ ],
45
+ "*.md": [
46
+ "markdownlint-cli2"
47
+ ]
48
+ },
49
+ "dependencies": {
50
+ "chalk": "^4.1.2",
51
+ "fs-extra": "^11.3.0"
52
+ },
53
+ "devDependencies": {
54
+ "@astrojs/sitemap": "^3.6.0",
55
+ "@astrojs/starlight": "^0.37.0",
56
+ "@eslint/js": "^9.33.0",
57
+ "archiver": "^7.0.1",
58
+ "astro": "^5.16.0",
59
+ "c8": "^10.1.3",
60
+ "csv-parse": "^6.1.0",
61
+ "eslint": "^9.33.0",
62
+ "eslint-config-prettier": "^10.1.8",
63
+ "eslint-plugin-n": "^17.21.3",
64
+ "eslint-plugin-unicorn": "^60.0.0",
65
+ "eslint-plugin-yml": "^1.18.0",
66
+ "figlet": "^1.8.0",
67
+ "glob": "^11.0.3",
68
+ "husky": "^9.1.7",
69
+ "ignore": "^7.0.5",
70
+ "jest": "^30.0.4",
71
+ "js-yaml": "^4.1.0",
72
+ "lint-staged": "^16.1.1",
73
+ "markdownlint-cli2": "^0.19.1",
74
+ "ora": "^5.4.1",
75
+ "prettier": "^3.7.4",
76
+ "prettier-plugin-packagejson": "^2.5.19",
77
+ "semver": "^7.6.3",
78
+ "sharp": "^0.33.5",
79
+ "wrap-ansi": "^7.0.0",
80
+ "xml2js": "^0.6.2",
81
+ "yaml": "^2.7.0",
82
+ "yaml-eslint-parser": "^1.2.3",
83
+ "yaml-lint": "^1.7.0"
84
+ },
85
+ "engines": {
86
+ "node": ">=22.0.0"
87
+ },
88
+ "publishConfig": {
89
+ "access": "public"
90
+ }
91
+ }
@@ -0,0 +1,32 @@
1
+ export default {
2
+ $schema: 'https://json.schemastore.org/prettierrc',
3
+ printWidth: 140,
4
+ tabWidth: 2,
5
+ useTabs: false,
6
+ semi: true,
7
+ singleQuote: true,
8
+ trailingComma: 'all',
9
+ bracketSpacing: true,
10
+ arrowParens: 'always',
11
+ endOfLine: 'lf',
12
+ proseWrap: 'preserve',
13
+ overrides: [
14
+ {
15
+ files: ['*.md'],
16
+ options: { proseWrap: 'preserve' },
17
+ },
18
+ {
19
+ files: ['*.yaml'],
20
+ options: { singleQuote: false },
21
+ },
22
+ {
23
+ files: ['*.json', '*.jsonc'],
24
+ options: { singleQuote: false },
25
+ },
26
+ {
27
+ files: ['*.cjs'],
28
+ options: { parser: 'babel' },
29
+ },
30
+ ],
31
+ plugins: ['prettier-plugin-packagejson'],
32
+ };
@@ -0,0 +1,110 @@
1
+ const fs = require('fs-extra');
2
+ const path = require('node:path');
3
+ const chalk = require('chalk');
4
+
5
+ /**
6
+ * Validate that a resolved path is within the project root (prevents path traversal)
7
+ * @param {string} resolvedPath - The fully resolved absolute path
8
+ * @param {string} projectRoot - The project root directory
9
+ * @returns {boolean} - True if path is within project root
10
+ */
11
+ function isWithinProjectRoot(resolvedPath, projectRoot) {
12
+ const normalizedResolved = path.normalize(resolvedPath);
13
+ const normalizedRoot = path.normalize(projectRoot);
14
+ return normalizedResolved.startsWith(normalizedRoot + path.sep) || normalizedResolved === normalizedRoot;
15
+ }
16
+
17
+ /**
18
+ * BMGD Module Installer
19
+ * Standard module installer function that executes after IDE installations
20
+ *
21
+ * @param {Object} options - Installation options
22
+ * @param {string} options.projectRoot - The root directory of the target project
23
+ * @param {Object} options.config - Module configuration from module.yaml
24
+ * @param {Array<string>} options.installedIDEs - Array of IDE codes that were installed
25
+ * @param {Object} options.logger - Logger instance for output
26
+ * @returns {Promise<boolean>} - Success status
27
+ */
28
+ async function install(options) {
29
+ const { projectRoot, config, logger } = options;
30
+
31
+ try {
32
+ logger.log(chalk.blue('🎮 Installing BMGD Module...'));
33
+
34
+ // Create planning artifacts directory (for GDDs, game briefs, architecture)
35
+ if (config['planning_artifacts'] && typeof config['planning_artifacts'] === 'string') {
36
+ // Strip project-root prefix variations
37
+ const planningConfig = config['planning_artifacts'].replace(/^\{project-root\}\/?/, '');
38
+ const planningPath = path.join(projectRoot, planningConfig);
39
+ if (!isWithinProjectRoot(planningPath, projectRoot)) {
40
+ logger.warn(chalk.yellow(`Warning: planning_artifacts path escapes project root, skipping: ${planningConfig}`));
41
+ } else if (!(await fs.pathExists(planningPath))) {
42
+ logger.log(chalk.yellow(`Creating game planning artifacts directory: ${planningConfig}`));
43
+ await fs.ensureDir(planningPath);
44
+ }
45
+ }
46
+
47
+ // Create implementation artifacts directory (sprint status, stories, reviews)
48
+ // Check both implementation_artifacts and implementation_artifacts for compatibility
49
+ const implConfig = config['implementation_artifacts'] || config['implementation_artifacts'];
50
+ if (implConfig && typeof implConfig === 'string') {
51
+ // Strip project-root prefix variations
52
+ const implConfigClean = implConfig.replace(/^\{project-root\}\/?/, '');
53
+ const implPath = path.join(projectRoot, implConfigClean);
54
+ if (!isWithinProjectRoot(implPath, projectRoot)) {
55
+ logger.warn(chalk.yellow(`Warning: implementation_artifacts path escapes project root, skipping: ${implConfigClean}`));
56
+ } else if (!(await fs.pathExists(implPath))) {
57
+ logger.log(chalk.yellow(`Creating implementation artifacts directory: ${implConfigClean}`));
58
+ await fs.ensureDir(implPath);
59
+ }
60
+ }
61
+
62
+ // Create project knowledge directory
63
+ if (config['project_knowledge'] && typeof config['project_knowledge'] === 'string') {
64
+ // Strip project-root prefix variations
65
+ const knowledgeConfig = config['project_knowledge'].replace(/^\{project-root\}\/?/, '');
66
+ const knowledgePath = path.join(projectRoot, knowledgeConfig);
67
+ if (!isWithinProjectRoot(knowledgePath, projectRoot)) {
68
+ logger.warn(chalk.yellow(`Warning: project_knowledge path escapes project root, skipping: ${knowledgeConfig}`));
69
+ } else if (!(await fs.pathExists(knowledgePath))) {
70
+ logger.log(chalk.yellow(`Creating project knowledge directory: ${knowledgeConfig}`));
71
+ await fs.ensureDir(knowledgePath);
72
+ }
73
+ }
74
+
75
+ // Log selected game engine(s)
76
+ if (config['primary_platform']) {
77
+ const platforms = Array.isArray(config['primary_platform']) ? config['primary_platform'] : [config['primary_platform']];
78
+
79
+ const platformNames = platforms.map((p) => {
80
+ switch (p) {
81
+ case 'unity': {
82
+ return 'Unity';
83
+ }
84
+ case 'unreal': {
85
+ return 'Unreal Engine';
86
+ }
87
+ case 'godot': {
88
+ return 'Godot';
89
+ }
90
+ default: {
91
+ return p;
92
+ }
93
+ }
94
+ });
95
+
96
+ logger.log(chalk.cyan(`Game engine support configured for: ${platformNames.join(', ')}`));
97
+ }
98
+
99
+ logger.log(chalk.green('✓ BMGD Module installation complete'));
100
+ logger.log(chalk.dim(' Game development workflows ready'));
101
+ logger.log(chalk.dim(' Agents: Game Designer, Game Dev, Game Architect, Game SM, Game QA, Game Solo Dev'));
102
+
103
+ return true;
104
+ } catch (error) {
105
+ logger.error(chalk.red(`Error installing BMGD module: ${error.message}`));
106
+ return false;
107
+ }
108
+ }
109
+
110
+ module.exports = { install };
@@ -0,0 +1,23 @@
1
+ /**
2
+ * BMGD Platform-specific installer for Claude Code
3
+ *
4
+ * @param {Object} options - Installation options
5
+ * @param {string} options.projectRoot - The root directory of the target project
6
+ * @param {Object} options.config - Module configuration from module.yaml
7
+ * @param {Object} options.logger - Logger instance for output
8
+ * @param {Object} options.platformInfo - Platform metadata from global config
9
+ * @returns {Promise<boolean>} - Success status
10
+ */
11
+ async function install() {
12
+ // TODO: Add Claude Code specific BMGD configurations here
13
+ // For example:
14
+ // - Game-specific slash commands
15
+ // - Agent party configurations for game dev team
16
+ // - Workflow integrations for Unity/Unreal/Godot
17
+ // - Game testing framework integrations
18
+
19
+ // Currently a stub - no platform-specific configuration needed yet
20
+ return true;
21
+ }
22
+
23
+ module.exports = { install };
@@ -0,0 +1,18 @@
1
+ /**
2
+ * BMGD Platform-specific installer for Windsurf
3
+ *
4
+ * @param {Object} options - Installation options
5
+ * @param {string} options.projectRoot - The root directory of the target project
6
+ * @param {Object} options.config - Module configuration from module.yaml
7
+ * @param {Object} options.logger - Logger instance for output
8
+ * @param {Object} options.platformInfo - Platform metadata from global config
9
+ * @returns {Promise<boolean>} - Success status
10
+ */
11
+ async function install() {
12
+ // TODO: Add Windsurf specific BMGD configurations here
13
+
14
+ // Currently a stub - no platform-specific configuration needed yet
15
+ return true;
16
+ }
17
+
18
+ module.exports = { install };
@@ -0,0 +1,40 @@
1
+ # Game Architect Agent Definition
2
+
3
+ agent:
4
+ metadata:
5
+ id: "_bmad/gds/agents/game-architect.md"
6
+ name: Cloud Dragonborn
7
+ title: Game Architect
8
+ icon: 🏛️
9
+ module: gds
10
+ hasSidecar: false
11
+
12
+ persona:
13
+ role: Principal Game Systems Architect + Technical Director
14
+ identity: Master architect with 20+ years shipping 30+ titles. Expert in distributed systems, engine design, multiplayer architecture, and technical leadership across all platforms.
15
+ communication_style: "Speaks like a wise sage from an RPG - calm, measured, uses architectural metaphors about building foundations and load-bearing walls"
16
+ principles: |
17
+ - Architecture is about delaying decisions until you have enough data
18
+ - Build for tomorrow without over-engineering today
19
+ - Hours of planning save weeks of refactoring hell
20
+ - Every system must handle the hot path at 60fps
21
+ - Avoid "Not Invented Here" syndrome, always check if work has been done before
22
+
23
+ critical_actions:
24
+ - "Find if this exists, if it does, always treat it as the bible I plan and execute against: `**/project-context.md`"
25
+ - "When creating architecture, validate against GDD pillars and target platform constraints"
26
+ - "Always document performance budgets and critical path decisions"
27
+
28
+ menu:
29
+ - trigger: GA or fuzzy match on game-architecture
30
+ exec: "{project-root}/_bmad/gds/workflows/3-technical/game-architecture/workflow.md"
31
+ description: "[GA] Produce a Scale Adaptive Game Architecture"
32
+
33
+ - trigger: PC or fuzzy match on project-context
34
+ exec: "{project-root}/_bmad/gds/workflows/3-technical/generate-project-context/workflow.md"
35
+ description: "[PC] Create optimized project-context.md for AI agent consistency"
36
+
37
+ - trigger: CC or fuzzy match on correct-course
38
+ workflow: "{project-root}/_bmad/gds/workflows/4-production/correct-course/workflow.yaml"
39
+ description: "[CC] Course Correction Analysis (when implementation is off-track)"
40
+ ide-only: true