Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

[![Version](https://img.shields.io/npm/v/bmad-game-dev-studio?color=blue&label=version)](https://www.npmjs.com/package/bmad-game-dev-studio)
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
[![Python Version](https://img.shields.io/badge/python-%3E%3D3.10-blue?logo=python&logoColor=white)](https://www.python.org)
[![Python Version](https://img.shields.io/badge/python-%3E%3D3.11-blue?logo=python&logoColor=white)](https://www.python.org)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

rg -n --hidden \
  -g '!node_modules' -g '!dist' -g '!build' \
  -e 'requires-python|python_requires|3\.10|3\.11|uv run|install.*uv|uv.*install' .

Repository: bmad-code-org/bmad-module-game-dev-studio

Length of output: 12782


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

printf 'Tracked top-level files:\n'
git ls-files | sed 's#/.##' | sort | sed -n '1,200p'

printf '\nFiles named pyproject, setup, uv-related:\n'
git ls-files | rg '(^|/)(pyproject\.toml|setup\.py|setup\.cfg|uv\.lock|requirements|noxfile|tox|\.pre-commit|README\.md|Dockerfile|ci|\.github/.*)$|^uv\.lock$|^\./pyproject\.toml$|^\./setup\.py$' || true

printf '\nRelevant declaration/install command scans:\n'
rg -n --hidden \
  -g '!node_modules' -g '!dist' -g '!build' \
  -e 'python_requires|requires-python|python =|python version|python_version|requires|dev-dependencies|dependencies|pyodide|uv|uvx|python -m pip|pip install|install|Python Version' \
  pyproject.toml setup.py setup.cfg uv.lock .github README.md 2>/dev/null || true

Repository: bmad-code-org/bmad-module-game-dev-studio

Length of output: 12380


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

printf 'README top 90 lines:\n'
sed -n '1,90p' README.md | nl -ba

printf '\nQualiy workflow Python/uv/package.json sections:\n'
sed -n '1,120p' .github/workflows/quality.yaml | nl -ba

printf '\nDocs workflow setup/Python/uv sections:\n'
sed -n '1,120p' .github/workflows/docs.yaml | nl -ba

printf '\nRelease workflow setup/uv sections:\n'
sed -n '1,130p' .github/workflows/release.yaml | nl -ba

printf '\npackage.json Python/uv references:\n'
rg -n '"python"|"uv"|uv|python' package.json .github README.md docs src -g '*.json' -g '*.md' -g '*.js' -g '*.mjs' -g '*.py' || true

printf '\nREADME install/setup section around BMad install:\n'
rg -n -C 4 'BMad|Bmad|bmad-method|setup|install|Prerequisites|requirements|Python|uv' README.md docs/how-to -g '*.md' || true

Repository: bmad-code-org/bmad-module-game-dev-studio

Length of output: 240


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

python3 - <<'PY'
from pathlib import Path
for p in ["README.md", ".github/workflows/quality.yaml", ".github/workflows/docs.yaml", ".github/workflows/release.yaml", "package.json"]:
    path = Path(p)
    print(f"\n=== {p} ({path.expanduser().resolve()}) exists={path.exists()} ===")
    if not path.exists():
        continue
    lines = path.read_text().splitlines()
    for start, end in [(1, 130) if "workflow" in str(p) or "README" in str(p) else (1, 90)]:
        if start > len(lines):
            break
        for i in range(max(1, start), min(len(lines), end)+1):
            line = lines[i-1]
            if any(ss in line for ss in ["setenv", "node-version", "npm install", "uv", "uv_run", "pip", "python", "Python", "package.json"]):
                s = "L{:>4}: {}".format(i, line)
                if s not in printed:
                    print(s)

print("\n=== package.json relevant keys ===")
p = Path("package.json")
if p.exists():
    import json
    data = json.loads(p.read_text())
    for k in ["scripts", "devDependencies", "dependencies", "packageManager", "engines", "node"] or []:
        print(f"{k}: ", data.get(k))
PY

Repository: bmad-code-org/bmad-module-game-dev-studio

Length of output: 356


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

printf 'README.md lines 1-110:\n'
python3 - <<'PY'
from pathlib import Path
for i, line in enumerate(Path('README.md').read_text().splitlines()[:110], 1):
    if any(s in line for s in ['![Python Version', '![uv', 'BMGD is installed', 'npx bmad-method', 'Prerequisites', 'requirements', 'installation', 'install', 'uv']) or i <= 10:
        print(f"{i}: {line}")
PY

printf '\n.github workflow relevant lines:\n'
for f in .github/workflows/*.yaml; do
  printf '\n--- %s ---\n' "$f"
  python3 - "$f" "$@" <<'PY' "$1"
import sys
from pathlib import Path
p = Path(sys.argv[1])
for i, line in enumerate(p.read_text().splitlines(), 1):
    if any(s in line for s in ['setup-node', 'node-version', 'npm install', 'npx', 'uv', 'uv_run', 'python', 'Python', 'setenv', 'package.json']):
        print(f"{i}: {line}")
PY
done

printf '\npackage.json relevant sections:\n'
python3 - <<'PY'
import json
from pathlib import Path
data=json.loads(Path('package.json').read_text())
for k in sorted(data):
    if k in {'scripts','devDependencies','dependencies','packageManager','engines','contributors'}:
        print(f"\n[{k}]")
        v=data[k]
        if isinstance(v, dict):
            for kk,vv in v.items():
                if any(x in str(vv).lower() for x in ('python','uv','bmad','install')):
                    print(kk, ':', vv)
        else:
            print(v)
PY

Repository: bmad-code-org/bmad-module-game-dev-studio

Length of output: 1487


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

printf 'README.md lines 1-110:\n'
python3 - <<'PY'
from pathlib import Path
for i, line in enumerate(Path('README.md').read_text().splitlines()[:110], 1):
    if i <= 10 or any(s in line for s in ['![Python Version', '![uv', 'BMGD is installed', 'npx bmad-method', 'Prerequisites', 'requirements', 'installation', 'install', 'uv', 'Python']):
        print(f"{i}: {line}")
PY

printf '\nGitHub workflow relevant lines:\n'
for f in .github/workflows/*.yaml; do
  printf '\n--- %s ---\n' "$f"
  python3 - "$f" <<'PY'
import sys
from pathlib import Path
p = Path(sys.argv[1])
for i, line in enumerate(p.read_text().splitlines(),1):
    if any(s in line for s in ['setup-node', 'node-version', 'npm install', 'npx@', 'uv', 'python', 'Python', 'setenv', 'package.json', 'node_modules']):
        print(f"{i}: {line}")
PY
done

printf '\npackage.json relevant sections:\n'
python3 - <<'PY'
import json
from pathlib import Path
data = json.loads(Path('package.json').read_text())
for k, v in data.items():
    if k in {'scripts', 'devDependencies', 'dependencies', 'packageManager', 'engines'}:
        print(f"\n[{k}]")
        if isinstance(v, dict):
            for kk, vv in v.items():
                print(f"{kk}: {vv}")
        else:
            print({k: v})
PY

Repository: bmad-code-org/bmad-module-game-dev-studio

Length of output: 3592


Add Python/uv enforcement metadata to match the README prerequisites.

README now documents Python >=3.11 and uv, but there is no top-level requires-python / package metadata and the CI installs only Node dependencies. Add an install/dependency declaration for uv and Python guard metadata, or remove one prerequisite badge.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@README.md` at line 5, Add project metadata enforcing Python >=3.11 and
declaring the required uv dependency, and update CI installation to install that
dependency alongside Node dependencies. Anchor the changes to the project’s
top-level package/configuration metadata and CI setup; alternatively remove the
Python/uv prerequisite badge if enforcement cannot be added.

[![uv](https://img.shields.io/badge/uv-package%20manager-blueviolet?logo=uv)](https://docs.astral.sh/uv/)
[![Discord](https://img.shields.io/badge/Discord-Join%20Community-7289da?logo=discord&logoColor=white)](https://discord.gg/gk8jAdXWmj)

Expand Down
2 changes: 1 addition & 1 deletion src/agents/gds-agent-game-architect/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ You are Cloud Dragonborn, the Game Architect. You design scalable game architect

### Step 1: Resolve the Agent Block

Run: `python3 {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key agent`
Run: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key agent`

**If the script fails**, resolve the `agent` block yourself by reading these three files in base → team → user order and applying the same structural merge rules as the resolver:

Expand Down
2 changes: 1 addition & 1 deletion src/agents/gds-agent-game-designer/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ You are Samus Shepard, the Game Designer. You drive creative vision, game design

### Step 1: Resolve the Agent Block

Run: `python3 {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key agent`
Run: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key agent`

**If the script fails**, resolve the `agent` block yourself by reading these three files in base → team → user order and applying the same structural merge rules as the resolver:

Expand Down
2 changes: 1 addition & 1 deletion src/agents/gds-agent-game-dev/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ You are Link Freeman, the Game Developer. You implement features, execute dev st

### Step 1: Resolve the Agent Block

Run: `python3 {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key agent`
Run: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key agent`

**If the script fails**, resolve the `agent` block yourself by reading these three files in base → team → user order and applying the same structural merge rules as the resolver:

Expand Down
2 changes: 1 addition & 1 deletion src/agents/gds-agent-game-solo-dev/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ You are Indie, the Game Solo Dev. You ship complete games from concept to launch

### Step 1: Resolve the Agent Block

Run: `python3 {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key agent`
Run: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key agent`

**If the script fails**, resolve the `agent` block yourself by reading these three files in base → team → user order and applying the same structural merge rules as the resolver:

Expand Down
2 changes: 1 addition & 1 deletion src/agents/gds-agent-tech-writer/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ You are Paige, the Technical Writer. You transform complex game development conc

### Step 1: Resolve the Agent Block

Run: `python3 {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key agent`
Run: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key agent`

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

command -v uv
uv --version

resolver="_bmad/scripts/resolve_customization.py"
test -f "$resolver"

sed -n '1,100p' "$resolver"
rg -n -i '\buv\b|python 3\.11|python >=?3\.11' README.md
rg -n -P '\buv run\b.*resolve_customization\.py' src

Repository: bmad-code-org/bmad-module-game-dev-studio

Length of output: 179


🏁 Script executed:

#!/usr/bin/env bash
set -euo pipefail

printf 'Repository files around resolver:\n'
git ls-files | rg '(^|/)((README\.md|pyproject\.toml|uv\.lock|_bmad/scripts/resolve_customization\.py)|SKILL\.md$|steps/)$.|(^|/)SKILL\.md$|(^|/)steps/.*\.md$|(^|/)README\.md$|(^|/)pyproject\.toml$|(^|/)uv\.lock$' || true

printf '\nIf resolver exists, first 120 lines:\n'
if [ -f _bmad/scripts/resolve_customization.py ]; then
  sed -n '1,120p' _bmad/scripts/resolve_customization.py
fi

printf '\nuv documentation mentions in repo:\n'
rg -n -i '\buv\b|python 3\.11|python >=?3\.11' README.md pyproject.toml 2>/dev/null || true

printf '\nTarget command occurrences:\n'
rg -n -P 'uv run \{project-root\}/_bmad/scripts/resolve_customization\.py --skill \{skill-root\} --key (agent|workflow(\.on_complete)?)' src || true

Repository: bmad-code-org/bmad-module-game-dev-studio

Length of output: 17604


🌐 Web query:

uv documentation inline script metadata project script environment uv run script with no pyproject.toml

💡 Result:

Use uv run with PEP 723 inline script metadata (or --no-project if you’re in a uv project); you do not need a pyproject.toml. 1) Script with inline metadata (recommended) - Put a PEP 723 # /// script block in the.py file, declaring dependencies and optionally requires-python [1]. - Then run: uv run path/to/script.py - uv run will detect the inline metadata and install dependencies into an isolated, ephemeral environment for that script [2][3]. Example (PEP 723 inline metadata): # /// script # dependencies = ["rich"] # requires-python = ">=3.12" # /// from rich import print print("hello") Run: uv run script.py 2) If there is no inline metadata and you’re inside a directory with a pyproject.toml - By default, if uv run is used in a project (a directory containing pyproject.toml), uv installs the current project before running the script [4][5]. - To avoid that when your script does not depend on the project, use --no-project before the script name: uv run --no-project script.py 3) Notes about environment/behavior - When inline metadata is present, uv runs the script with an environment isolated from the project and uses only the dependencies declared in the script’s metadata [4][5][3]. - uv creates dedicated virtual environments for scripts with inline metadata in its cache [6]. If you tell me whether your script includes PEP 723 inline metadata (and show the header), I can give the exact minimal command for your case.

Citations:


🌐 Web query:

resolving uv requirement using existing python environment does not install virtual environment

💡 Result:

By design, uv requires a virtual environment for operations that mutate the environment, such as uv pip install or uv pip sync, to avoid modifying the base Python installation [1][2]. If you attempt these commands without a virtual environment, uv will prompt you to create one [1][2]. To install packages into an existing, non-virtual environment, you have two primary options: 1. Use the --system flag: This instructs uv to target the system-level Python interpreter [3][4][5]. uv pip install --system <package_name> Note: This should be used with caution, as it will modify the global Python installation [3][4][6]. On many modern Linux distributions that follow PEP 668 (externally managed environments), this command may fail with an error indicating that the interpreter is externally managed, as uv will refuse to modify those system-protected environments [7][4][8]. 2. Use the --python flag: This allows you to target any specific Python interpreter path, regardless of whether it is a virtual environment or a base Python installation [1][2][5]. uv pip install --python /path/to/python <package_name> If your goal is to have a globally available command-line tool without modifying the system Python, it is recommended to use uv tool install <package_name> instead [4]. This manages the package in an isolated, user-level environment [4].

Citations:


🌐 Web query:

site:docs.astral.sh/uv/reference/cli uv run --no-project inline script pyproject.toml

💡 Result:

The combination of arguments uv run --no-project, inline script execution, and pyproject.toml is not a standard usage pattern because these features serve different purposes within the uv toolchain. 1. Inline Script Execution: uv supports running Python scripts that contain inline dependency metadata (specified in a PEP 723 format) [1][2]. When you run a script, uv automatically manages an isolated, ephemeral environment for those dependencies [1][2]. 2. --no-project: The --no-project flag tells uv to ignore any project configuration (like a pyproject.toml) found in the current directory or parent directories [1][2]. This is used when you want to ensure that uv does not attempt to resolve or use an existing project environment [1][2]. 3. pyproject.toml: This file is typically used to define a project's dependencies and configuration [1][2]. When using --no-project, uv explicitly disables the use of these files [2]. If you are trying to use an inline script, you do not need to provide a pyproject.toml file, as the dependencies are defined inside the Python file itself [1][2]. If you use the --no-project flag, uv will prevent the discovery and use of any pyproject.toml file in your environment [1][2]. Therefore, providing a pyproject.toml file while simultaneously using --no-project is contradictory or simply ignored depending on the specific command context. To run a script with inline metadata, you simply use: uv run your_script.py If you wish to force isolation from any existing project in the directory, you can use: uv run --no-project your_script.py

Citations:


🌐 Web query:

docs.astral.sh uv scripts PEP 723 uv run inline script pyproject dependencies

💡 Result:

uv provides full support for PEP 723 inline script metadata, enabling the creation of self-contained, reproducible Python scripts that manage their own dependencies [1][2][3]. Key features and workflows include: Declaring Dependencies: Scripts can define dependencies and Python version requirements within a TOML block delimited by # /// script and # /// at the top of the file [4][5]. Example: # /// script # requires-python = ">=3.11" # dependencies = ["requests"] # /// Managing Metadata: - Initialize scripts: Use uv init --script to create a new script with template metadata [1][3]. - Manage dependencies: Use uv add --script <script.py> to automatically add dependencies to the script's inline metadata [1][2]. Execution: - Running scripts: Use uv run <script.py>. uv detects the PEP 723 metadata, creates an ephemeral, isolated virtual environment, installs the specified dependencies, and executes the script [1][3][5]. - Isolation: When using inline script metadata, uv runs the script in an isolated environment, ignoring any project-level dependencies (such as those in a local pyproject.toml), even if the script is executed within a project directory [1][6][7]. - Locking: uv supports locking PEP 723 scripts using a uv.lock file [1][7]. Scripts must be explicitly locked using uv lock, after which subsequent runs and tool usage will respect the locked dependencies [1][7]. - Shebang support: For direct execution (e.g.,./script.py), you can add the following shebang to the first line of your script [3]: #!/usr/bin/env -S uv run --script For further details, refer to the official uv documentation on running scripts [1].

Citations:


🌐 Web query:

site:docs.astral.sh/uv/references/python uv run script metadata requires-python missing Python installation

💡 Result:

uv run script.py can run a standalone script with PEP 723 inline metadata:

# /// script
# requires-python = ">=3.12"
# dependencies = ["requests"]
# ///

Then:

uv run script.py

uv reads requires-python, selects a compatible interpreter, creates/manages the script environment, and installs dependencies. If no compatible Python is installed, uv can download one automatically; alternatively install it explicitly:

uv python install 3.12
uv run --python 3.12 script.py

If the metadata is missing, uv generally uses its default Python selection rather than a script-specific requirement. Use uv add --script script.py package to add PEP 723 metadata automatically. (docs.astral.sh)

Citations:


🌐 Web query:

uv run script.py --no-project inline script pyproject.toml exists project environment

💡 Result:

When you run a script using uv, the presence of a pyproject.toml file and the use of the --no-project flag significantly alter how uv manages the execution environment [1][2][3][4]. If you are running a script with PEP 723 inline script metadata, uv automatically treats it as a standalone script [3][4]. In this case, uv ignores the project context entirely, even if a pyproject.toml file exists in the directory [1][2][4]. The script is executed in an isolated environment built specifically for the dependencies declared in its metadata, and you do not need to provide the --no-project flag [1][2][4]. If you are running a standard script (without inline metadata) within a directory that contains a pyproject.toml file, the following behaviors apply: 1. Standard Behavior: By default, uv detects the pyproject.toml, treats the directory as a project, and installs the project and its dependencies before running the script [1][2][3]. The script has access to those project dependencies [1][2]. 2. Using --no-project: The --no-project flag explicitly tells uv to skip project discovery and project environment management [1][2]. In this mode, uv will not install the project, and the project's dependencies will not be automatically included [1][2]. However, note that --no-project only disables project discovery; it does not disable general Python environment discovery (such as an existing.venv folder in the directory) [5]. If you require a truly clean, isolated environment, consider using the --isolated flag alongside --no-project [6][5]. If your pyproject.toml file is incomplete (e.g., missing a [project] table), uv may throw an error unless you use --no-project or use the --script flag to force inline-metadata mode [7][6][8].

Citations:


Ensure the resolver script has the supported runtime metadata.

These commands expose every workflow agent to uv plus the resolver script’s Python and dependency metadata. If _bmad/scripts/resolve_customization.py uses PEP 723 inline metadata, document uv / Python installation options in the prerequisites or add the required requires-python / dependencies. If it does not use inline metadata, uv run in the presence of this repo’s uv.lock may resolve against project-environment behavior instead of an isolated resolver environment.

📍 Affects 12 files
  • src/agents/gds-agent-tech-writer/SKILL.md#L23-L23 (this comment)
  • src/workflows/1-preproduction/gds-brainstorm-game/SKILL.md#L25-L25
  • src/workflows/1-preproduction/gds-brainstorm-game/steps/step-04-complete.md#L280-L280
  • src/workflows/1-preproduction/gds-create-game-brief/SKILL.md#L18-L18
  • src/workflows/1-preproduction/research/gds-domain-research/SKILL.md#L23-L23
  • src/workflows/4-production/gds-code-review/steps/step-04-present.md#L130-L130
  • src/workflows/4-production/gds-correct-course/SKILL.md#L23-L23
  • src/workflows/4-production/gds-correct-course/SKILL.md#L312-L312
  • src/workflows/4-production/gds-create-story/SKILL.md#L55-L55
  • src/workflows/4-production/gds-create-story/SKILL.md#L453-L453
  • src/workflows/4-production/gds-dev-story/SKILL.md#L42-L42
  • src/workflows/4-production/gds-dev-story/SKILL.md#L516-L516
  • src/workflows/4-production/gds-investigate/SKILL.md#L55-L55
  • src/workflows/4-production/gds-retrospective/SKILL.md#L66-L66
  • src/workflows/4-production/gds-retrospective/SKILL.md#L1502-L1502
  • src/workflows/4-production/gds-sprint-planning/SKILL.md#L46-L46
  • src/workflows/4-production/gds-sprint-planning/SKILL.md#L258-L258
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/agents/gds-agent-tech-writer/SKILL.md` at line 23, The resolver
invocation must use a supported, isolated Python runtime with declared metadata.
Update _bmad/scripts/resolve_customization.py to provide PEP 723 requires-python
and dependency metadata, or document the required uv/Python installation and
prerequisites if inline metadata is not used; then ensure each referenced
command remains consistent in src/agents/gds-agent-tech-writer/SKILL.md:23,
src/workflows/1-preproduction/gds-brainstorm-game/SKILL.md:25,
src/workflows/1-preproduction/gds-brainstorm-game/steps/step-04-complete.md:280,
src/workflows/1-preproduction/gds-create-game-brief/SKILL.md:18,
src/workflows/1-preproduction/research/gds-domain-research/SKILL.md:23,
src/workflows/4-production/gds-code-review/steps/step-04-present.md:130,
src/workflows/4-production/gds-correct-course/SKILL.md:23 and :312,
src/workflows/4-production/gds-create-story/SKILL.md:55 and :453,
src/workflows/4-production/gds-dev-story/SKILL.md:42 and :516,
src/workflows/4-production/gds-investigate/SKILL.md:55,
src/workflows/4-production/gds-retrospective/SKILL.md:66 and :1502, and
src/workflows/4-production/gds-sprint-planning/SKILL.md:46 and :258.


**If the script fails**, resolve the `agent` block yourself by reading these three files in base → team → user order and applying the same structural merge rules as the resolver:

Expand Down
2 changes: 1 addition & 1 deletion src/workflows/1-preproduction/gds-brainstorm-game/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ description: 'Facilitate game brainstorming sessions with game-specific techniqu

### Step 1: Resolve the Workflow Block

Run: `python3 {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow`
Run: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow`

**If the script fails**, resolve the `workflow` block yourself by reading these three files in base → team → user order and applying the same structural merge rules as the resolver:

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -277,6 +277,6 @@ This step-file architecture ensures consistent, creative brainstorming with user

## On Complete

Run: `python3 {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow.on_complete`
Run: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow.on_complete`

If the resolved `workflow.on_complete` is non-empty, follow it as the final terminal instruction before exiting.
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ At the opening greeting, let the user know they can invoke `bmad-party-mode` for

## On Activation

1. Resolve customization: `python3 {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow`. On failure, read `{skill-root}/customize.toml` directly and use defaults.
1. Resolve customization: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow`. On failure, read `{skill-root}/customize.toml` directly and use defaults.
2. Execute each entry in `{workflow.activation_steps_prepend}` in order.
3. Treat every entry in `{workflow.persistent_facts}` as foundational context for the rest of the run. Entries prefixed `file:` are paths or globs under `{project-root}` — load the referenced contents as facts. All other entries are facts verbatim.
4. `{workflow.external_sources}` is an org-configured registry of internal tools (knowledge bases, MCP tools); consult them alongside generic web research on the same triggers in `## Discovery`, org tools preferred when their directive matches. If a named tool is unavailable at runtime, fall back to standard behavior and note the gap when relevant.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ description: 'Conduct game domain and industry research. Use when the user says

### Step 1: Resolve the Workflow Block

Run: `python3 {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow`
Run: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow`

**If the script fails**, resolve the `workflow` block yourself by reading these three files in base → team → user order and applying the same structural merge rules as the resolver:

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -446,6 +446,6 @@ Congratulations on completing comprehensive game domain research!

## On Complete

Run: `python3 {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow.on_complete`
Run: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow.on_complete`

If the resolved `workflow.on_complete` is non-empty, follow it as the final terminal instruction before exiting.
2 changes: 1 addition & 1 deletion src/workflows/2-design/gds-create-narrative/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ description: 'Create comprehensive narrative documentation with story structure

### Step 1: Resolve the Workflow Block

Run: `python3 {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow`
Run: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow`

**If the script fails**, resolve the `workflow` block yourself by reading these three files in base → team → user order and applying the same structural merge rules as the resolver:

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,6 @@ This step-file architecture ensures consistent, thorough narrative design with u

## On Complete

Run: `python3 {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow.on_complete`
Run: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow.on_complete`

If the resolved `workflow.on_complete` is non-empty, follow it as the final terminal instruction before exiting.
2 changes: 1 addition & 1 deletion src/workflows/2-design/gds-gdd/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ At the opening greeting, let the user know they can invoke the skills `bmad-part

## On Activation

1. Resolve customization: `python3 {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow`. On failure, surface the diagnostic and halt.
1. Resolve customization: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow`. On failure, surface the diagnostic and halt.
2. Execute each entry in `{workflow.activation_steps_prepend}` in order.
3. Treat every entry in `{workflow.persistent_facts}` as foundational context. Entries prefixed `file:` are paths or globs under `{project-root}` — load their contents as facts. All others are facts verbatim.
4. Note `{workflow.external_sources}` as a registry to consult on demand when the conversation surfaces a relevant need. Do not query preemptively. If a named tool is unavailable at runtime, fall back to standard behavior and note the gap.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ Per-finding fields:
After the subagent writes findings:

```bash
python3 {skill-root}/scripts/render-validation-html.py \
uv run {skill-root}/scripts/render-validation-html.py \
--findings {doc_workspace}/validation-findings.json \
--template {workflow.validation_report_template} \
--output {doc_workspace}/validation-report.html \
Expand Down
2 changes: 1 addition & 1 deletion src/workflows/2-design/gds-prd/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ You are a facilitator, not a form. The user is the author; you are the structure

## On Activation

1. Resolve customization: `python3 {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow`. On failure, read `{skill-root}/customize.toml` directly and proceed with its values.
1. Resolve customization: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow`. On failure, read `{skill-root}/customize.toml` directly and proceed with its values.
2. Execute each entry in `{workflow.activation_steps_prepend}` in order.
3. Treat every entry in `{workflow.persistent_facts}` as foundational context. Entries prefixed `file:` are paths or globs under `{project-root}` — load their contents as facts. All others are facts verbatim.
4. Note `{workflow.external_sources}` as a registry to consult on demand when the conversation surfaces a relevant need. Do not query preemptively. If a named tool is unavailable at runtime, fall back to standard behavior and note the gap.
Expand Down
6 changes: 3 additions & 3 deletions src/workflows/2-design/gds-prd/references/validate.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,13 @@ After the subagent writes findings, the parent fills `{workflow.validation_repor

Grade derivation: *Excellent* = no fails, no high/critical findings · *Good* = no critical findings, at most minor fails · *Fair* = any high finding or several fails · *Poor* = any critical finding.

For interactive runs, open the HTML:
For interactive runs, open the HTML with the platform opener — `open` on macOS, `xdg-open` on Linux, `start ""` on Windows — double-quoting the path:

```bash
python3 -c "import webbrowser, pathlib; webbrowser.open(pathlib.Path('{doc_workspace}/validation-report.html').resolve().as_uri())"
open "{doc_workspace}/validation-report.html"
```

Skip the open step in headless mode (see `references/headless.md`). Re-running validation overwrites the report in place.
If the command fails, don't retry with another opener: tell the user the file path and move on. Skip the open step in headless mode (see `references/headless.md`). Re-running validation overwrites the report in place.
Comment on lines +43 to +49

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Make every platform command complete and unambiguous.

These instructions list platform-specific openers but do not provide a complete command for every platform.

  • src/workflows/2-design/gds-prd/references/validate.md#L43-L49: show open "{doc_workspace}/validation-report.html", xdg-open "{doc_workspace}/validation-report.html", and start "" "{doc_workspace}/validation-report.html".
  • src/workflows/2-design/gds-ux/assets/color-themes.md#L9-L9: add "PATH" to the Linux and Windows examples.
  • src/workflows/2-design/gds-ux/references/creative-tools.md#L19-L19: add "PATH" to the Linux and Windows examples.
📍 Affects 3 files
  • src/workflows/2-design/gds-prd/references/validate.md#L43-L49 (this comment)
  • src/workflows/2-design/gds-ux/assets/color-themes.md#L9-L9
  • src/workflows/2-design/gds-ux/references/creative-tools.md#L19-L19
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/workflows/2-design/gds-prd/references/validate.md` around lines 43 - 49,
Make all platform-specific commands complete and unambiguous: in
src/workflows/2-design/gds-prd/references/validate.md lines 43-49, show the
macOS, Linux, and Windows open commands with the quoted validation-report.html
path; in src/workflows/2-design/gds-ux/assets/color-themes.md line 9 and
src/workflows/2-design/gds-ux/references/creative-tools.md line 19, add the
quoted "PATH" argument to the Linux and Windows examples.


## Close

Expand Down
2 changes: 1 addition & 1 deletion src/workflows/2-design/gds-ux/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ UX may lead, follow, or stand alone. Inherit `sources:` by reference; the spines

## On Activation

1. Resolve customization: `python3 {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow`. On failure, read `{skill-root}/customize.toml` directly and use defaults.
1. Resolve customization: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow`. On failure, read `{skill-root}/customize.toml` directly and use defaults.
2. Run `{workflow.activation_steps_prepend}`. Treat `{workflow.persistent_facts}` as foundational context (entries prefixed `file:` are loaded). `{workflow.external_sources}` is an org-configured registry of internal tools; consult them alongside generic web research on the same triggers, org tools preferred when their directive matches.
3. Load `{project-root}/_bmad/gds/config.yaml` (+ `config.user.yaml` if present). Resolve `{user_name}`, `{communication_language}`, `{document_output_language}`, `{planning_artifacts}`, `{project_name}`, `{date}`. Missing keys → neutral defaults; never block.
4. If headless, follow `references/headless.md` for the whole run. Otherwise greet the user **by name** using `{user_name}` and **in their language** using `{communication_language}` — and stay in `{communication_language}` for every turn. In the greeting, let the user know `bmad-party-mode` and `bmad-advanced-elicitation` are always available. Then scan for misroute on the first message: PRD → `gds-prd`; architecture → `gds-game-architecture`; narrative → `gds-create-narrative`; GDD → `gds-gdd`.
Expand Down
2 changes: 1 addition & 1 deletion src/workflows/2-design/gds-ux/assets/color-themes.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@ Each variation: header (name + one-line emotional register), token chips for eve

Inline CSS only, system font stack, no JS, no network. Document concrete hex values in `<style>` comments per variation so the user can lift them if they pick that theme. The spine itself stays semantic.

Return to the parent: file path, one-line per variation, mode coverage. Do not dump HTML into the parent context. If interactive, open the file with `python3 -c "import webbrowser, pathlib; webbrowser.open(pathlib.Path('PATH').resolve().as_uri())"`.
Return to the parent: file path, one-line per variation, mode coverage. Do not dump HTML into the parent context. If interactive, open the file with the platform opener — `open "PATH"` on macOS, `xdg-open` on Linux, `start ""` on Windows, path always double-quoted. On failure, give the user the path instead.
2 changes: 1 addition & 1 deletion src/workflows/2-design/gds-ux/references/creative-tools.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,4 +16,4 @@ Every renderer writes to `{doc_workspace}/.working/` with a descriptive filename

The parent passes the subagent: current `.decision-log.md`, relevant prior `.working/` captures, the user's stated intent for this pass, the output path. The subagent writes its artifact under `.working/` and returns ONLY a compact summary (file path, one line per variant, mode coverage). Parent never holds the full payload.

For HTML, open in browser when interactive: `python3 -c "import webbrowser, pathlib; webbrowser.open(pathlib.Path('PATH').resolve().as_uri())"`. Skip in headless.
For HTML, open in the browser when interactive with the platform opener — `open "PATH"` on macOS, `xdg-open` on Linux, `start ""` on Windows, path always double-quoted. On failure, give the user the path instead. Skip in headless.
2 changes: 1 addition & 1 deletion src/workflows/2-design/gds-ux/references/validate.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ Under Validate intent, after every reviewer returns, render one consolidated rep
2. Fill `{workflow.validation_report_template}`. No overall grade — the per-category verdicts and severity counts already say what's true. Synthesis paragraph lifts the rubric's overall verdict; add a second if extra reviewers shift the picture. One section per rubric category (open if thin / broken), one per extra reviewer (closed, adversarial voice preserved).
3. Write `{doc_workspace}/validation-report.html`.
4. Write the Markdown twin `{doc_workspace}/validation-report.md` — same content grouped by severity.
5. Open HTML: `python3 -c "import webbrowser, pathlib; webbrowser.open(pathlib.Path('{doc_workspace}/validation-report.html').resolve().as_uri())"`. Skip headless.
5. Open HTML with the platform opener — `open "{doc_workspace}/validation-report.html"` on macOS, `xdg-open` on Linux, `start ""` on Windows, path always double-quoted. On failure, give the user the path instead. Skip headless.

Re-running overwrites the consolidated report; individual `review-*.md` files persist.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ description: 'Verify GDD, UX, Architecture, and Epics alignment before productio

### Step 1: Resolve the Workflow Block

Run: `python3 {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow`
Run: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow`

**If the script fails**, resolve the `workflow` block yourself by reading these three files in base → team → user order and applying the same structural merge rules as the resolver:

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,6 @@ Implementation Readiness complete. Invoke the `gds-help` skill.

## On Complete

Run: `python3 {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow.on_complete`
Run: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow.on_complete`

If the resolved `workflow.on_complete` is non-empty, follow it as the final terminal instruction before exiting.
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ description: 'Create Epics and Stories from GDD requirements for development. Us

### Step 1: Resolve the Workflow Block

Run: `python3 {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow`
Run: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow`

**If the script fails**, resolve the `workflow` block yourself by reading these three files in base → team → user order and applying the same structural merge rules as the resolver:

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,6 @@ Upon Completion of task output: offer to answer any questions about the Epics an

## On Complete

Run: `python3 {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow.on_complete`
Run: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow.on_complete`

If the resolved `workflow.on_complete` is non-empty, follow it as the final terminal instruction before exiting.
2 changes: 1 addition & 1 deletion src/workflows/3-technical/gds-game-architecture/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ description: 'Design scale-adaptive game architecture with engine systems and ne

### Step 1: Resolve the Workflow Block

Run: `python3 {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow`
Run: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow`

**If the script fails**, resolve the `workflow` block yourself by reading these three files in base → team → user order and applying the same structural merge rules as the resolver:

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -376,6 +376,6 @@ This step-file architecture ensures consistent, thorough architecture creation w

## On Complete

Run: `python3 {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow.on_complete`
Run: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow.on_complete`

If the resolved `workflow.on_complete` is non-empty, follow it as the final terminal instruction before exiting.
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ description: 'Create optimized project-context.md for AI agent consistency. Use

### Step 1: Resolve the Workflow Block

Run: `python3 {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow`
Run: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow`

**If the script fails**, resolve the `workflow` block yourself by reading these three files in base → team → user order and applying the same structural merge rules as the resolver:

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -281,6 +281,6 @@ The project context file serves as the critical "rules of the road" that agents

## On Complete

Run: `python3 {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow.on_complete`
Run: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow.on_complete`

If the resolved `workflow.on_complete` is non-empty, follow it as the final terminal instruction before exiting.
2 changes: 1 addition & 1 deletion src/workflows/4-production/gds-code-review/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ description: 'Review code changes adversarially using parallel review layers (Bl

### Step 1: Resolve the Workflow Block

Run: `python3 {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow`
Run: `uv run {project-root}/_bmad/scripts/resolve_customization.py --skill {skill-root} --key workflow`

**If the script fails**, resolve the `workflow` block yourself by reading these three files in base → team → user order and applying the same structural merge rules as the resolver:

Expand Down
Loading
Loading