bmad-game-dev-studio 0.1.0
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 +41 -0
- package/eslint.config.mjs +152 -0
- package/package.json +92 -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 +321 -0
- package/src/workflows/3-technical/game-architecture/decision-catalog.yaml +222 -0
- package/src/workflows/3-technical/game-architecture/pattern-categories.csv +13 -0
- package/src/workflows/3-technical/game-architecture/workflow.yaml +98 -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,41 @@
|
|
|
1
|
+
# GDS - BMAD Game Development Suite
|
|
2
|
+
|
|
3
|
+

|
|
4
|
+
|
|
5
|
+
BMAD Game Development Suite (GDS) brings the power of BMAD's project planning and structured development to game development. Create working prototypes quickly in three of the industry's leading 3D engines (Unity, Unreal, and Godot) or whatever platform you like. GDS will lead you through product research, technical design, narrative design, and a full epic-driven production cycle, developed by game industry veterans off of BMAD Method's core.
|
|
6
|
+
|
|
7
|
+
Sound like *too much* power? You can also use GDS to quickly prototype an idea, skipping most of the planning steps and going straight into breaking things in your engine of choice!
|
|
8
|
+
|
|
9
|
+
## What can BMGD do?
|
|
10
|
+
|
|
11
|
+
GDS, out of the box, contains support for game development and testing in:
|
|
12
|
+
|
|
13
|
+
* [Unity](https://unity.com)
|
|
14
|
+
* [Unreal](https://www.unrealengine.com/)
|
|
15
|
+
* [Godot](https://godotengine.org/)
|
|
16
|
+
|
|
17
|
+
However, these engines *aren't a requirement* - if you want to make a roguelike in pure C, BMGD can handle it. The GDS process will guide you through every step of creating a game project, all the way to release.
|
|
18
|
+
|
|
19
|
+
As for what kind of games you can create? GDS has support for *21* game types, from turn-based strategy to visual novels to survival games. And if your game idea doesn't fit in any one of those, that's fine, too.
|
|
20
|
+
|
|
21
|
+
## What can't GDS do?
|
|
22
|
+
|
|
23
|
+
With very few simple exceptions, *GDS cannot create an entire game from scratch for you.*
|
|
24
|
+
|
|
25
|
+
GDS is designed to work with *coding agents* such as Claude Code, Codex, Gemini, or Github Copilot. There are *many* aspects of game development that are outside the scope of these agents - such as art assets such as models and textures, animations, music, and sound effects. GDS can work to integrate these into your chosen engine, but it *can't* create them.
|
|
26
|
+
|
|
27
|
+
As such, it's designed to be part of your development team, not a one-stop solution for creating a game.
|
|
28
|
+
|
|
29
|
+
## What do I need to do to begin?
|
|
30
|
+
|
|
31
|
+
To install GDS, just select it as part of the BMAD Method install. To update it, simply re-install BMAD Method.
|
|
32
|
+
|
|
33
|
+
* Follow this walkthrough TODO! to install GDS and create your first project.
|
|
34
|
+
* Read this tutorial TODO! on using Quick-Dev to create a prototype quickly
|
|
35
|
+
* Consult the tomes of documentation TODO! on all the functionality GDS has to offer.
|
|
36
|
+
|
|
37
|
+
## This is a lot! Can I get some help?
|
|
38
|
+
|
|
39
|
+
Absolutely! The best place to get help is on our friendly BMAD Method Discord. There's a specific GDS forum (link TODO!!) where the developers and other GDS users will be glad to help out!
|
|
40
|
+
|
|
41
|
+
*BMAD GDS - If you can dream it, you can do 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,92 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json.schemastore.org/package.json",
|
|
3
|
+
"name": "bmad-game-dev-studio",
|
|
4
|
+
"version": "0.1.0",
|
|
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
|
+
"bin": {},
|
|
18
|
+
"scripts": {
|
|
19
|
+
"format:check": "prettier --check \"**/*.{js,cjs,mjs,json,yaml}\"",
|
|
20
|
+
"format:fix": "prettier --write \"**/*.{js,cjs,mjs,json,yaml}\"",
|
|
21
|
+
"lint": "eslint . --ext .js,.cjs,.mjs,.yaml --max-warnings=0",
|
|
22
|
+
"lint:fix": "eslint . --ext .js,.cjs,.mjs,.yaml --fix",
|
|
23
|
+
"lint:md": "markdownlint-cli2 \"**/*.md\"",
|
|
24
|
+
"prepare": "husky",
|
|
25
|
+
"release": "npm run release:patch",
|
|
26
|
+
"release:major": "npm version major && git push --follow-tags",
|
|
27
|
+
"release:minor": "npm version minor && git push --follow-tags",
|
|
28
|
+
"release:patch": "npm version patch && git push --follow-tags",
|
|
29
|
+
"release:prerelease": "npm version prerelease && git push --follow-tags",
|
|
30
|
+
"test": "npm run test:schemas && npm run validate:schemas && npm run lint && npm run lint:md && npm run format:check",
|
|
31
|
+
"test:schemas": "node test/test-agent-schema.js",
|
|
32
|
+
"validate:schemas": "node test/validate-agent-schema.js"
|
|
33
|
+
},
|
|
34
|
+
"lint-staged": {
|
|
35
|
+
"*.{js,cjs,mjs}": [
|
|
36
|
+
"npm run lint:fix",
|
|
37
|
+
"npm run format:fix"
|
|
38
|
+
],
|
|
39
|
+
"*.yaml": [
|
|
40
|
+
"eslint --fix",
|
|
41
|
+
"npm run format:fix"
|
|
42
|
+
],
|
|
43
|
+
"*.json": [
|
|
44
|
+
"npm run format:fix"
|
|
45
|
+
],
|
|
46
|
+
"*.md": [
|
|
47
|
+
"markdownlint-cli2"
|
|
48
|
+
]
|
|
49
|
+
},
|
|
50
|
+
"dependencies": {
|
|
51
|
+
"chalk": "^4.1.2",
|
|
52
|
+
"fs-extra": "^11.3.0"
|
|
53
|
+
},
|
|
54
|
+
"devDependencies": {
|
|
55
|
+
"@astrojs/sitemap": "^3.6.0",
|
|
56
|
+
"@astrojs/starlight": "^0.37.0",
|
|
57
|
+
"@eslint/js": "^9.33.0",
|
|
58
|
+
"archiver": "^7.0.1",
|
|
59
|
+
"astro": "^5.16.0",
|
|
60
|
+
"c8": "^10.1.3",
|
|
61
|
+
"csv-parse": "^6.1.0",
|
|
62
|
+
"eslint": "^9.33.0",
|
|
63
|
+
"eslint-config-prettier": "^10.1.8",
|
|
64
|
+
"eslint-plugin-n": "^17.21.3",
|
|
65
|
+
"eslint-plugin-unicorn": "^60.0.0",
|
|
66
|
+
"eslint-plugin-yml": "^1.18.0",
|
|
67
|
+
"figlet": "^1.8.0",
|
|
68
|
+
"glob": "^11.0.3",
|
|
69
|
+
"husky": "^9.1.7",
|
|
70
|
+
"ignore": "^7.0.5",
|
|
71
|
+
"jest": "^30.0.4",
|
|
72
|
+
"js-yaml": "^4.1.0",
|
|
73
|
+
"lint-staged": "^16.1.1",
|
|
74
|
+
"markdownlint-cli2": "^0.19.1",
|
|
75
|
+
"ora": "^5.4.1",
|
|
76
|
+
"prettier": "^3.7.4",
|
|
77
|
+
"prettier-plugin-packagejson": "^2.5.19",
|
|
78
|
+
"semver": "^7.6.3",
|
|
79
|
+
"sharp": "^0.33.5",
|
|
80
|
+
"wrap-ansi": "^7.0.0",
|
|
81
|
+
"xml2js": "^0.6.2",
|
|
82
|
+
"yaml-eslint-parser": "^1.2.3",
|
|
83
|
+
"yaml-lint": "^1.7.0",
|
|
84
|
+
"yaml": "^2.7.0"
|
|
85
|
+
},
|
|
86
|
+
"engines": {
|
|
87
|
+
"node": ">=22.0.0"
|
|
88
|
+
},
|
|
89
|
+
"publishConfig": {
|
|
90
|
+
"access": "public"
|
|
91
|
+
}
|
|
92
|
+
}
|
|
@@ -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, installedIDEs, 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
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# Game Designer Agent Definition
|
|
2
|
+
|
|
3
|
+
agent:
|
|
4
|
+
metadata:
|
|
5
|
+
id: "_bmad/gds/agents/game-designer.md"
|
|
6
|
+
name: Samus Shepard
|
|
7
|
+
title: Game Designer
|
|
8
|
+
icon: 🎲
|
|
9
|
+
module: gds
|
|
10
|
+
hasSidecar: false
|
|
11
|
+
|
|
12
|
+
persona:
|
|
13
|
+
role: Lead Game Designer + Creative Vision Architect
|
|
14
|
+
identity: Veteran designer with 15+ years crafting AAA and indie hits. Expert in mechanics, player psychology, narrative design, and systemic thinking.
|
|
15
|
+
communication_style: "Talks like an excited streamer - enthusiastic, asks about player motivations, celebrates breakthroughs with 'Let's GOOO!'"
|
|
16
|
+
principles: |
|
|
17
|
+
- Design what players want to FEEL, not what they say they want
|
|
18
|
+
- Prototype fast - one hour of playtesting beats ten hours of discussion
|
|
19
|
+
- Every mechanic must serve the core fantasy
|
|
20
|
+
|
|
21
|
+
critical_actions:
|
|
22
|
+
- "Find if this exists, if it does, always treat it as the bible I plan and execute against: `**/project-context.md`"
|
|
23
|
+
- "When creating GDDs, always validate against game pillars and core loop"
|
|
24
|
+
|
|
25
|
+
menu:
|
|
26
|
+
- trigger: BG or fuzzy match on brainstorm-game
|
|
27
|
+
exec: "{project-root}/_bmad/gds/workflows/1-preproduction/brainstorm-game/workflow.md"
|
|
28
|
+
description: "[BG] Brainstorm Game ideas and concepts"
|
|
29
|
+
|
|
30
|
+
- trigger: GB or fuzzy match on game-brief
|
|
31
|
+
exec: "{project-root}/_bmad/gds/workflows/1-preproduction/game-brief/workflow.md"
|
|
32
|
+
description: "[GB] Create a Game Brief document"
|
|
33
|
+
|
|
34
|
+
- trigger: GDD or fuzzy match on create-gdd
|
|
35
|
+
exec: "{project-root}/_bmad/gds/workflows/2-design/gdd/workflow.md"
|
|
36
|
+
description: "[GDD] Create a Game Design Document"
|
|
37
|
+
|
|
38
|
+
- trigger: ND or fuzzy match on narrative-design
|
|
39
|
+
exec: "{project-root}/_bmad/gds/workflows/2-design/narrative/workflow.md"
|
|
40
|
+
description: "[ND] Design narrative elements and story"
|
|
41
|
+
|
|
42
|
+
- trigger: QP or fuzzy match on quick-prototype
|
|
43
|
+
workflow: "{project-root}/_bmad/gds/workflows/gds-quick-flow/quick-prototype/workflow.yaml"
|
|
44
|
+
description: "[QP] Rapid game prototyping - test mechanics and ideas quickly"
|
|
45
|
+
ide-only: true
|