From 6a56d2eb11b520be48bd67a6162c4678301cd2bc Mon Sep 17 00:00:00 2001 From: Brian Madison Date: Wed, 13 May 2026 16:33:47 -0500 Subject: [PATCH] fix(bmad-prd): utf-8 encoding on render script, correct workflow-map outputs - render-validation-html.py reads findings/template and writes HTML/MD with explicit utf-8 encoding so non-ASCII content (smart quotes, em-dashes, non-English text under {document_output_language}) does not break on platforms whose default encoding is not utf-8. - workflow-map.md 'Produces' column for bmad-prd now distinguishes Create/Update outputs from the Validate intent's validation-report artifacts. --- docs/reference/workflow-map.md | 2 +- .../bmad-prd/scripts/render-validation-html.py | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/reference/workflow-map.md b/docs/reference/workflow-map.md index 42d80dd52..e3368c7d4 100644 --- a/docs/reference/workflow-map.md +++ b/docs/reference/workflow-map.md @@ -46,7 +46,7 @@ Define what to build and for whom. | Workflow | Purpose | Produces | |-------------------------|-------------------------------------------------------------------------------------|---------------------------------------------------| -| `bmad-prd` | Create, update, or validate a PRD — facilitated discovery, three intents in one skill | `prd.md`, `addendum.md`, `decision-log.md` | +| `bmad-prd` | Create, update, or validate a PRD — facilitated discovery, three intents in one skill | Create/Update: `prd.md`, `addendum.md`, `decision-log.md`; Validate: `validation-report.html` + `.md` | | `bmad-create-ux-design` | Design user experience (when UX matters) | `ux-spec.md` | :::tip[Three intents in one skill] diff --git a/src/bmm-skills/2-plan-workflows/bmad-prd/scripts/render-validation-html.py b/src/bmm-skills/2-plan-workflows/bmad-prd/scripts/render-validation-html.py index b89db9ae8..802f9b511 100644 --- a/src/bmm-skills/2-plan-workflows/bmad-prd/scripts/render-validation-html.py +++ b/src/bmm-skills/2-plan-workflows/bmad-prd/scripts/render-validation-html.py @@ -220,7 +220,7 @@ def main(argv: list[str]) -> int: output_path = Path(args.output) try: - data = json.loads(findings_path.read_text()) + data = json.loads(findings_path.read_text(encoding="utf-8")) except FileNotFoundError: print(f"error: findings file not found: {findings_path}", file=sys.stderr) return 1 @@ -228,7 +228,7 @@ def main(argv: list[str]) -> int: print(f"error: findings file is not valid JSON ({findings_path}): {e}", file=sys.stderr) return 1 try: - template = template_path.read_text() + template = template_path.read_text(encoding="utf-8") except FileNotFoundError: print(f"error: template file not found: {template_path}", file=sys.stderr) return 1 @@ -268,10 +268,10 @@ def main(argv: list[str]) -> int: } rendered = string.Template(template).safe_substitute(substitutions) - output_path.write_text(rendered) + output_path.write_text(rendered, encoding="utf-8") md_path = output_path.with_suffix(".md") - md_path.write_text(render_markdown_report(data, findings, stats, grade)) + md_path.write_text(render_markdown_report(data, findings, stats, grade), encoding="utf-8") print(json.dumps({ "output": str(output_path),