basic BMAD setup

This commit is contained in:
Ebbe Baß
2026-10-15 08:57:23 +02:00
parent 44029127dc
commit 5e747654b9
438 changed files with 41818 additions and 0 deletions
@@ -0,0 +1,17 @@
---
name: {name}
description: '{description}'
---
Run the following command exactly once without changing the current working directory.
Replace `{project-root}` with the nearest folder containing `_bmad/`, from the working directory upward.
Replace `{skill-root}` with the absolute path to this skill's directory.
```bash
uv run --no-cache "{project-root}/_bmad/scripts/render_skill.py" --project-root "{project-root}" --skill "{skill-root}"
```
- When the invocation names a {selector} ({the allowed values, and the words that mean each}), append `--set workflow.{selector}=<value>` to the command.
- The command should print one line to stdout. `read and follow <rendered workflow.md>`: read that file and follow it. `HALT: <reason>`: report the reason and stop.
- If the script does not exist, BMad is not set up in this project yet. Offer to set it up using `bmad` skill, then run the command again. If you do not have the `bmad` skill, offer to install it first.
- On any other output or failure, including `uv` being unavailable, report the command output and stop. Do not run any workflow source directly.
@@ -0,0 +1,30 @@
# DO NOT EDIT -- overwritten on every update.
#
# Default customization values for {name}.
# Override in {project-root}/_bmad/custom/{name}.toml (team) or
# {project-root}/_bmad/custom/{name}.user.toml (personal). A single run
# overrides with `--set workflow.<key>=<value>`.
#
# Merge rules: strings replace, lists append, tables merge key by key,
# arrays of tables merge by `id`.
[workflow]
# Instructions run before the user is greeted.
activation_steps_prepend = []
# Instructions run after the greeting and before step 01.
activation_steps_append = []
# Facts kept in context for the whole run: literal text, or `file:` paths and
# globs under {project-root}, loaded on activation.
persistent_facts = []
# {What the selector chooses between.} One of: "{value_a}", "{value_b}".
# Any other value halts the render.
{selector} = "{value_a}"
# {What the block instructs.} Replace the whole text to change the rule.
{block} = """
{default instruction, as many lines as it needs}
"""
@@ -0,0 +1,29 @@
# Step {NN}: {title}
{purpose: what this step produces and for whom, in one or two lines.}
## {body}
{Instructions as outcomes with their reason. Branch on the selector only where the branches differ:}
{% if workflow.{selector} == "{value}" %}
{instructions for this value}
{% else %}
{instructions for the other values}
{% endif %}
{An instruction a team may replace whole is a customization value, inserted where it runs:}
{{ workflow.{block} }}
{An agent-facing double-brace placeholder is kept out of the renderer:}
{% raw %}{{placeholder}}{% endraw %}
## Next
{The last line is one of these two.}
Read fully and follow `{{ rendered("{next_step}") }}`.
Workflow complete.
@@ -0,0 +1,27 @@
{% if workflow.{selector} not in ({allowed_values}) %}{{ halt("workflow.{selector} must be one of {allowed_values}, not " ~ workflow.{selector}) }}{% endif %}
# {title}
{purpose: one paragraph. What the workflow produces, for whom, and what must be true of it for them to act. Said once.}
## Conventions
- When a step directs you to another file, read it fully and follow it. Load one step at a time, when it is reached.
- A step that shows a menu halts there and waits for the user.
## On activation
Run each of these in order before step 1 (`_None._` means skip):
{{ workflow.activation_steps_prepend }}
Hold every entry below as fact for the whole run. Entries prefixed `file:` are paths or globs under `{project-root}` to read; the rest are facts verbatim (`_None._` means none):
{{ workflow.persistent_facts }}
Then run each of these in order (`_None._` means skip):
{{ workflow.activation_steps_append }}
## First step
Read fully and follow `{{ rendered("step-01-{first_step}.md") }}`.