Workflow customization:
- bmad-product-brief adopts the customize.yaml pattern with new standard
keys (activation_steps_prepend, activation_steps_append, skill_end)
that apply to any skill type, not just workflows.
- SKILL.md resolves customization as the first activation step, executes
prepend items immediately, retains append for after greeting, and
re-resolves skill_end after Stage 5 (Finalize).
- Added {skill-root} to the Conventions block.
- Normalized all sub-prompt path references to bare-from-skill-root
(../agents/ -> agents/, sibling filenames -> prompts/<file>).
Metadata:
- Added "DO NOT EDIT -- overwritten on every update." header to all 6
agent customize.yaml files.
Resolver:
- find_project_root now walks from skill_dir first, then falls back to
cwd. Nested-workspace setups where an ancestor of cwd has an unrelated
_bmad/ would previously bind the resolver to the wrong project.
Installer:
- Added 'memory' to the nonModuleDirs sets at all three filter sites so
sidecar-generated _bmad/memory/<agent>/ folders aren't treated as
modules and don't receive a generated config.yaml.
- detectCustomFiles now skips the entire _memory/ and memory/ subtrees
generically, replacing the old v6.1-specific -sidecar substring check.
Agent runtime state is never flagged as custom/modified noise on update.
First workflow to adopt the customize.yaml + three-layer merge pattern
that was previously agent-only. Proves the resolver works for workflow
skills and exercises the deep-merge fix from the previous commit.
Standard workflow customization surface:
additional_resources: [] # files for the workflow to reference
inject:
before: "" # prompt injected before workflow begins
after: "" # prompt injected after workflow completes
SKILL.md now:
- Adds a Conventions block defining {skill-root}, {project-root}, {skill-name}
- Resolves customization as step 1 of On Activation and applies
inject.before + notes additional_resources
- Resolves inject.after in a new Post-Workflow Customization section
that fires after Stage 5 (Finalize) completes
Verified end-to-end:
- Defaults resolve cleanly (empty strings, empty array)
- Team override of inject.before preserves inject.after default
(the deep-merge behavior docs promise)
- User layer adds inject.after on top of team's inject.before
- Dotted --key inject.after extraction works for the post-workflow call