@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.
- package/.markdownlint-cli2.yaml +35 -0
- package/.nvmrc +1 -0
- package/.prettierignore +9 -0
- package/LICENSE +26 -0
- package/README.md +119 -0
- package/eslint.config.mjs +152 -0
- package/package.json +91 -0
- package/prettier.config.mjs +32 -0
- package/src/_module-installer/installer.js +110 -0
- package/src/_module-installer/platform-specifics/claude-code.js +23 -0
- package/src/_module-installer/platform-specifics/windsurf.js +18 -0
- package/src/agents/game-architect.agent.yaml +40 -0
- package/src/agents/game-designer.agent.yaml +45 -0
- package/src/agents/game-dev.agent.yaml +49 -0
- package/src/agents/game-qa.agent.yaml +63 -0
- package/src/agents/game-scrum-master.agent.yaml +56 -0
- package/src/agents/game-solo-dev.agent.yaml +49 -0
- package/src/agents/tech-writer/tech-writer.agent.yaml +45 -0
- package/src/gametest/qa-index.csv +18 -0
- package/src/module-help.csv +26 -0
- package/src/module.yaml +65 -0
- package/src/teams/default-party.csv +12 -0
- package/src/teams/team-gamedev.yaml +29 -0
- package/src/workflows/1-preproduction/brainstorm-game/game-brain-methods.csv +26 -0
- package/src/workflows/1-preproduction/brainstorm-game/workflow.yaml +62 -0
- package/src/workflows/1-preproduction/game-brief/workflow.yaml +67 -0
- package/src/workflows/2-design/gdd/game-types.csv +25 -0
- package/src/workflows/2-design/gdd/workflow.yaml +101 -0
- package/src/workflows/2-design/narrative/workflow.yaml +77 -0
- package/src/workflows/3-technical/game-architecture/architecture-patterns.yaml +507 -0
- package/src/workflows/3-technical/game-architecture/decision-catalog.yaml +340 -0
- package/src/workflows/3-technical/game-architecture/engine-mcps.yaml +270 -0
- package/src/workflows/3-technical/game-architecture/pattern-categories.csv +13 -0
- package/src/workflows/3-technical/game-architecture/workflow.yaml +101 -0
- package/src/workflows/4-production/code-review/instructions.xml +226 -0
- package/src/workflows/4-production/code-review/workflow.yaml +64 -0
- package/src/workflows/4-production/correct-course/workflow.yaml +65 -0
- package/src/workflows/4-production/create-story/instructions.xml +345 -0
- package/src/workflows/4-production/create-story/workflow.yaml +61 -0
- package/src/workflows/4-production/dev-story/instructions.xml +410 -0
- package/src/workflows/4-production/dev-story/workflow.yaml +27 -0
- package/src/workflows/4-production/retrospective/workflow.yaml +58 -0
- package/src/workflows/4-production/sprint-planning/sprint-status-template.yaml +55 -0
- package/src/workflows/4-production/sprint-planning/workflow.yaml +54 -0
- package/src/workflows/4-production/sprint-status/workflow.yaml +35 -0
- package/src/workflows/document-project/documentation-requirements.csv +12 -0
- package/src/workflows/document-project/templates/project-scan-report-schema.json +160 -0
- package/src/workflows/document-project/workflow.yaml +30 -0
- package/src/workflows/document-project/workflows/deep-dive.yaml +31 -0
- package/src/workflows/document-project/workflows/full-scan.yaml +31 -0
- package/src/workflows/gametest/automate/workflow.yaml +50 -0
- package/src/workflows/gametest/e2e-scaffold/workflow.yaml +145 -0
- package/src/workflows/gametest/performance/workflow.yaml +48 -0
- package/src/workflows/gametest/playtest-plan/workflow.yaml +59 -0
- package/src/workflows/gametest/test-design/workflow.yaml +47 -0
- package/src/workflows/gametest/test-framework/workflow.yaml +48 -0
- 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
|
package/.prettierignore
ADDED
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
|
+
[](https://www.npmjs.com/package/bmad-game-dev-studio)
|
|
4
|
+
[](LICENSE)
|
|
5
|
+
[](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
|
+

|
|
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
|
+
[](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
|