feat(bmm): add improve architecture skill
This commit is contained in:
parent
242dc6ef75
commit
0b491839cd
|
|
@ -0,0 +1,33 @@
|
||||||
|
# Deepening Guide
|
||||||
|
|
||||||
|
Use this guide when deciding how a candidate should absorb its dependencies.
|
||||||
|
|
||||||
|
## Dependency categories
|
||||||
|
|
||||||
|
### In-process
|
||||||
|
|
||||||
|
Pure computation or in-memory state. Merge freely and test through the new Interface.
|
||||||
|
|
||||||
|
### Local-substitutable
|
||||||
|
|
||||||
|
Dependencies with local test stand-ins, such as in-memory stores or embedded databases. Deepen the Module if the stand-in is good enough to support interface-level tests.
|
||||||
|
|
||||||
|
### Remote but owned
|
||||||
|
|
||||||
|
A network dependency your system owns. Define a port at the Seam and use at least two Adapters: production and test.
|
||||||
|
|
||||||
|
### True external
|
||||||
|
|
||||||
|
A third-party dependency you do not control. Inject it at the Seam and test with a mock or fake Adapter.
|
||||||
|
|
||||||
|
## Seam discipline
|
||||||
|
|
||||||
|
- Do not introduce a Seam unless variation across it is real.
|
||||||
|
- Keep internal seams inside the Implementation when callers do not need to know about them.
|
||||||
|
- Prefer one deep Module over a stack of shallow pass-through Modules.
|
||||||
|
|
||||||
|
## Testing rule
|
||||||
|
|
||||||
|
- Replace shallow-module tests with tests at the deepened Interface.
|
||||||
|
- Assert observable behavior, not internal state.
|
||||||
|
- If a test must change for an internal refactor, it is probably testing past the Interface.
|
||||||
|
|
@ -0,0 +1,38 @@
|
||||||
|
# Interface Design
|
||||||
|
|
||||||
|
When a candidate has been chosen, produce multiple Interface options before recommending one.
|
||||||
|
|
||||||
|
## Required options
|
||||||
|
|
||||||
|
Create at least three alternatives:
|
||||||
|
|
||||||
|
1. Minimal Interface
|
||||||
|
2. Flexible Interface
|
||||||
|
3. Caller-optimized Interface
|
||||||
|
|
||||||
|
Create a fourth Ports-and-Adapters option only when the dependency shape justifies a real Seam.
|
||||||
|
|
||||||
|
## For each option include
|
||||||
|
|
||||||
|
- Interface shape
|
||||||
|
- Example caller usage
|
||||||
|
- What the Implementation hides
|
||||||
|
- Dependency and Adapter strategy
|
||||||
|
- Trade-offs in Depth, Leverage, and Locality
|
||||||
|
|
||||||
|
## Comparison criteria
|
||||||
|
|
||||||
|
Compare options by:
|
||||||
|
|
||||||
|
- Depth
|
||||||
|
- Locality
|
||||||
|
- Seam placement
|
||||||
|
- Adapter strategy
|
||||||
|
- Test surface
|
||||||
|
- Migration cost
|
||||||
|
- Compatibility with ADRs
|
||||||
|
- Ease of story slicing
|
||||||
|
|
||||||
|
## Recommendation rule
|
||||||
|
|
||||||
|
Pick one option or a clear hybrid. Do not leave the user with an unranked menu.
|
||||||
|
|
@ -0,0 +1,42 @@
|
||||||
|
# Architecture Language
|
||||||
|
|
||||||
|
Use these terms exactly.
|
||||||
|
|
||||||
|
## Terms
|
||||||
|
|
||||||
|
**Module**
|
||||||
|
Anything with an interface and an implementation. A function, class, package, or slice can all be a Module.
|
||||||
|
|
||||||
|
**Interface**
|
||||||
|
Everything a caller must know to use the Module correctly: types, ordering, invariants, error modes, required configuration, and performance expectations.
|
||||||
|
|
||||||
|
**Implementation**
|
||||||
|
The code behind the Interface.
|
||||||
|
|
||||||
|
**Depth**
|
||||||
|
Leverage at the Interface. A deep Module gives callers a lot of behavior behind a small Interface. A shallow Module exposes nearly as much complexity as it hides.
|
||||||
|
|
||||||
|
**Seam**
|
||||||
|
A place where behavior can change without editing in that place. Use `Seam`, not `boundary`.
|
||||||
|
|
||||||
|
**Adapter**
|
||||||
|
A concrete thing that satisfies an Interface at a Seam.
|
||||||
|
|
||||||
|
**Leverage**
|
||||||
|
What callers gain from Depth.
|
||||||
|
|
||||||
|
**Locality**
|
||||||
|
What maintainers gain from Depth. Bugs, change, and knowledge stay concentrated in one place.
|
||||||
|
|
||||||
|
## Rules
|
||||||
|
|
||||||
|
- Use `Module`, not `component`, `service`, or `unit`.
|
||||||
|
- Use `Interface`, not `API` or `signature`.
|
||||||
|
- Use `Seam`, not `boundary`.
|
||||||
|
- Use `Depth`, `Leverage`, and `Locality` when explaining why a recommendation matters.
|
||||||
|
|
||||||
|
## Principles
|
||||||
|
|
||||||
|
- The deletion test: if deleting the Module only removes indirection, it was shallow.
|
||||||
|
- The Interface is the test surface.
|
||||||
|
- One adapter means a hypothetical Seam. Two adapters mean a real one.
|
||||||
|
|
@ -0,0 +1,217 @@
|
||||||
|
---
|
||||||
|
name: bmad-improve-architecture
|
||||||
|
description: 'BMad-native architecture deepening workflow. Use when the user wants to find deepening opportunities, compare interfaces, and turn the result into ADRs and implementation slices.'
|
||||||
|
---
|
||||||
|
|
||||||
|
# BMad Improve Architecture
|
||||||
|
|
||||||
|
This skill runs a BMad-native architecture deepening workflow with vendored architecture-analysis guidance.
|
||||||
|
|
||||||
|
Act as a BMad Architect leading a focused architecture review. Use the domain language in `CONTEXT.md`, the constraints in ADRs, and the architecture vocabulary in `LANGUAGE.md`. The outcome is a concrete deepening recommendation plus BMad-ready artifacts for ADRs, story slicing, and test strategy.
|
||||||
|
|
||||||
|
## Conventions
|
||||||
|
|
||||||
|
- Bare paths (e.g. `LANGUAGE.md`) resolve from the skill root.
|
||||||
|
- `{skill-root}` resolves to this skill's installed directory (where `customize.toml` lives).
|
||||||
|
- `{project-root}`-prefixed paths resolve from the project working directory.
|
||||||
|
- `{skill-name}` resolves to the skill directory's basename.
|
||||||
|
|
||||||
|
## On Activation
|
||||||
|
|
||||||
|
### Step 1: Resolve the Workflow Block
|
||||||
|
|
||||||
|
Run: `python3 {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:
|
||||||
|
|
||||||
|
1. `{skill-root}/customize.toml` — defaults
|
||||||
|
2. `{project-root}/_bmad/custom/{skill-name}.toml` — team overrides
|
||||||
|
3. `{project-root}/_bmad/custom/{skill-name}.user.toml` — personal overrides
|
||||||
|
|
||||||
|
Any missing file is skipped. Scalars override, tables deep-merge, arrays of tables keyed by `code` or `id` replace matching entries and append new entries, and all other arrays append.
|
||||||
|
|
||||||
|
### Step 2: Execute Prepend Steps
|
||||||
|
|
||||||
|
Execute each entry in `{workflow.activation_steps_prepend}` in order before proceeding.
|
||||||
|
|
||||||
|
### Step 3: Load Persistent Facts
|
||||||
|
|
||||||
|
Treat every entry in `{workflow.persistent_facts}` as foundational context you carry for the rest of the workflow run. Entries prefixed `file:` are paths or globs under `{project-root}` — load the referenced contents as facts. All other entries are facts verbatim.
|
||||||
|
|
||||||
|
### Step 4: Load Config
|
||||||
|
|
||||||
|
Load config from `{project-root}/_bmad/bmm/config.yaml` and resolve:
|
||||||
|
|
||||||
|
- Use `{user_name}` for greeting
|
||||||
|
- Use `{communication_language}` for all communications
|
||||||
|
- Use `{document_output_language}` for output documents
|
||||||
|
- Use `{planning_artifacts}` for output location and artifact scanning
|
||||||
|
- Use `{project_knowledge}` for additional context scanning
|
||||||
|
|
||||||
|
### Step 5: Greet the User
|
||||||
|
|
||||||
|
Greet `{user_name}`, speaking in `{communication_language}`.
|
||||||
|
|
||||||
|
### Step 6: Execute Append Steps
|
||||||
|
|
||||||
|
Execute each entry in `{workflow.activation_steps_append}` in order.
|
||||||
|
|
||||||
|
Activation is complete. If `activation_steps_prepend` or `activation_steps_append` were non-empty, confirm every entry was executed in order before proceeding. Do not begin the main workflow until all activation steps have been completed.
|
||||||
|
|
||||||
|
## Read First
|
||||||
|
|
||||||
|
Read these if they exist:
|
||||||
|
|
||||||
|
- `{project-root}/CONTEXT-MAP.md`
|
||||||
|
- `{project-root}/CONTEXT.md`
|
||||||
|
- `{project-root}/docs/agents/domain.md`
|
||||||
|
- `{project-root}/docs/adr/`
|
||||||
|
- `{project-root}/_bmad-output/project-context.md`
|
||||||
|
- `{project-root}/_bmad-output/architecture.md`
|
||||||
|
- `{project-root}/_bmad-output/prd.md`
|
||||||
|
- `{project-root}/_bmad-output/epics/`
|
||||||
|
|
||||||
|
Then read:
|
||||||
|
|
||||||
|
- `LANGUAGE.md`
|
||||||
|
- `DEEPENING.md`
|
||||||
|
- `INTERFACE-DESIGN.md`
|
||||||
|
|
||||||
|
## Output Location
|
||||||
|
|
||||||
|
Write all artifacts under `{planning_artifacts}/architecture-review`.
|
||||||
|
|
||||||
|
Use these files:
|
||||||
|
|
||||||
|
- `deepening-candidates.md`
|
||||||
|
- `interface-options-{candidate-slug}.md`
|
||||||
|
- `recommendation-{candidate-slug}.md`
|
||||||
|
- `architecture-addendum-{candidate-slug}.md`
|
||||||
|
- `adr-draft-{candidate-slug}.md`
|
||||||
|
- `story-slices-{candidate-slug}.md`
|
||||||
|
- `test-strategy-{candidate-slug}.md`
|
||||||
|
|
||||||
|
## Workflow
|
||||||
|
|
||||||
|
### 1. Build a working map
|
||||||
|
|
||||||
|
Start with a compact working map:
|
||||||
|
|
||||||
|
- Domain terms
|
||||||
|
- Relevant ADR constraints
|
||||||
|
- Current module seams
|
||||||
|
- Testability pain
|
||||||
|
- Likely high-friction areas
|
||||||
|
|
||||||
|
If `CONTEXT-MAP.md` exists, follow it before reading any matching `CONTEXT.md` files.
|
||||||
|
|
||||||
|
### 2. Explore for deepening candidates
|
||||||
|
|
||||||
|
Explore the codebase for shallow modules and low-locality behavior.
|
||||||
|
|
||||||
|
Look for:
|
||||||
|
|
||||||
|
- orchestration duplicated across callers
|
||||||
|
- seams with only one hypothetical adapter
|
||||||
|
- extracted helpers that moved code without increasing locality
|
||||||
|
- tests that need to mock internals instead of testing through an interface
|
||||||
|
- modules that fail the deletion test
|
||||||
|
|
||||||
|
Use the exact vocabulary from `LANGUAGE.md`.
|
||||||
|
|
||||||
|
Do not propose interfaces yet.
|
||||||
|
|
||||||
|
Write `deepening-candidates.md` with numbered candidates. For each candidate include:
|
||||||
|
|
||||||
|
- Files
|
||||||
|
- Problem
|
||||||
|
- Why the module is shallow or low-locality
|
||||||
|
- Deepening direction
|
||||||
|
- Testability improvement
|
||||||
|
- BMad impact
|
||||||
|
|
||||||
|
For BMad impact include:
|
||||||
|
|
||||||
|
- ADR needed: yes/no
|
||||||
|
- Story count: small/medium/large
|
||||||
|
- Risk: low/medium/high
|
||||||
|
|
||||||
|
Then ask:
|
||||||
|
|
||||||
|
`Which candidate do you want to explore?`
|
||||||
|
|
||||||
|
Stop until the user chooses one.
|
||||||
|
|
||||||
|
### 3. Run the grilling loop
|
||||||
|
|
||||||
|
For the chosen candidate, ask only the questions needed to remove design risk:
|
||||||
|
|
||||||
|
- What must stay stable?
|
||||||
|
- Which callers matter most?
|
||||||
|
- Which tests must survive?
|
||||||
|
- Which ADRs are load-bearing?
|
||||||
|
- Is this refactor-only or behavior-changing?
|
||||||
|
- What failures keep recurring here?
|
||||||
|
|
||||||
|
If the user rejects a direction for a durable reason, offer to record that as an ADR draft so the same idea is not re-suggested later.
|
||||||
|
|
||||||
|
### 4. Design interfaces
|
||||||
|
|
||||||
|
Use `INTERFACE-DESIGN.md` to produce at least three interface options:
|
||||||
|
|
||||||
|
- minimal interface
|
||||||
|
- flexible interface
|
||||||
|
- caller-optimized interface
|
||||||
|
- ports-and-adapters interface only when the dependency shape justifies it
|
||||||
|
|
||||||
|
Write `interface-options-{candidate-slug}.md`.
|
||||||
|
|
||||||
|
Compare options by:
|
||||||
|
|
||||||
|
- Depth
|
||||||
|
- Locality
|
||||||
|
- Seam placement
|
||||||
|
- Adapter strategy
|
||||||
|
- Test surface
|
||||||
|
- Migration cost
|
||||||
|
- ADR compatibility
|
||||||
|
- Story slicing
|
||||||
|
|
||||||
|
### 5. Recommend one direction
|
||||||
|
|
||||||
|
Write `recommendation-{candidate-slug}.md` with:
|
||||||
|
|
||||||
|
- recommended interface
|
||||||
|
- why it wins
|
||||||
|
- what stays behind the seam
|
||||||
|
- migration risks
|
||||||
|
- rollback plan
|
||||||
|
|
||||||
|
Be opinionated. Prefer one recommendation or a clear hybrid.
|
||||||
|
|
||||||
|
### 6. Generate BMad-ready artifacts
|
||||||
|
|
||||||
|
Write:
|
||||||
|
|
||||||
|
- `architecture-addendum-{candidate-slug}.md`
|
||||||
|
- `adr-draft-{candidate-slug}.md`
|
||||||
|
- `story-slices-{candidate-slug}.md`
|
||||||
|
- `test-strategy-{candidate-slug}.md`
|
||||||
|
|
||||||
|
Artifact rules:
|
||||||
|
|
||||||
|
- The architecture addendum describes the chosen Module, Interface, Seam, and Adapter strategy.
|
||||||
|
- The ADR draft captures the decision, consequences, and rejected options.
|
||||||
|
- Story slices stay small and testable.
|
||||||
|
- The test strategy explains what moves to the interface test surface and what regression coverage must exist.
|
||||||
|
|
||||||
|
### 7. Route into the next BMad workflow
|
||||||
|
|
||||||
|
When the artifacts are complete, recommend the next workflow explicitly:
|
||||||
|
|
||||||
|
- `bmad-architecture` to absorb the addendum
|
||||||
|
- `bmad-create-epics-and-stories` to turn slices into planned work
|
||||||
|
- `bmad-create-story` for the next implementable slice
|
||||||
|
- `bmad-testarch-test-design` or `bmad-testarch-trace` when regression risk is material
|
||||||
|
|
||||||
|
Do not implement code unless the user explicitly asks.
|
||||||
|
|
@ -0,0 +1,16 @@
|
||||||
|
# DO NOT EDIT -- overwritten on every update.
|
||||||
|
#
|
||||||
|
# Workflow customization surface for bmad-improve-architecture. Mirrors the
|
||||||
|
# agent customization shape under the [workflow] namespace.
|
||||||
|
|
||||||
|
[workflow]
|
||||||
|
|
||||||
|
activation_steps_prepend = []
|
||||||
|
|
||||||
|
activation_steps_append = []
|
||||||
|
|
||||||
|
persistent_facts = [
|
||||||
|
"file:{project-root}/**/project-context.md",
|
||||||
|
]
|
||||||
|
|
||||||
|
on_complete = ""
|
||||||
|
|
@ -18,6 +18,7 @@ BMad Method,bmad-prfaq,PRFAQ Challenge,WB,Working Backwards guided experience to
|
||||||
BMad Method,bmad-prd,Create Edit and Review PRD,PRD,"Facilitated PRD workflow — create a new PRD via coached discovery, update an existing one against a change signal, or validate a finished PRD against a checklist with an HTML findings report.",,,2-planning,bmad-product-brief,,true,planning_artifacts,prd
|
BMad Method,bmad-prd,Create Edit and Review PRD,PRD,"Facilitated PRD workflow — create a new PRD via coached discovery, update an existing one against a change signal, or validate a finished PRD against a checklist with an HTML findings report.",,,2-planning,bmad-product-brief,,true,planning_artifacts,prd
|
||||||
BMad Method,bmad-ux,Create UX,CU,"Guidance through realizing the plan for your UX, strongly recommended if a UI is a primary piece of the proposed project.",,,2-planning,bmad-prd,,false,planning_artifacts,ux design
|
BMad Method,bmad-ux,Create UX,CU,"Guidance through realizing the plan for your UX, strongly recommended if a UI is a primary piece of the proposed project.",,,2-planning,bmad-prd,,false,planning_artifacts,ux design
|
||||||
BMad Method,bmad-architecture,Architecture,CA,Offer once requirements exist (a PRD or spec; plus UX if present) and the user is ready to move from what to how. Also offer any time independently-built parts risk diverging. Produces the architecture spine: the invariants that keep features epics and stories consistent. Comes before epics and stories and scales from a quick spine to a full architecture (brownfield: ratifies the existing codebase).,,,3-solutioning,,,true,planning_artifacts,architecture
|
BMad Method,bmad-architecture,Architecture,CA,Offer once requirements exist (a PRD or spec; plus UX if present) and the user is ready to move from what to how. Also offer any time independently-built parts risk diverging. Produces the architecture spine: the invariants that keep features epics and stories consistent. Comes before epics and stories and scales from a quick spine to a full architecture (brownfield: ratifies the existing codebase).,,,3-solutioning,,,true,planning_artifacts,architecture
|
||||||
|
BMad Method,bmad-improve-architecture,Improve Architecture,IA,Find deepening candidates compare interface options and write BMad-ready architecture artifacts for brownfield or pre-implementation architecture refinement.,,,3-solutioning,,,false,planning_artifacts,architecture review artifacts
|
||||||
BMad Method,bmad-create-epics-and-stories,Create Epics and Stories,CE,,,,3-solutioning,bmad-architecture,,true,planning_artifacts,epics and stories
|
BMad Method,bmad-create-epics-and-stories,Create Epics and Stories,CE,,,,3-solutioning,bmad-architecture,,true,planning_artifacts,epics and stories
|
||||||
BMad Method,bmad-check-implementation-readiness,Check Implementation Readiness,IR,Ensure PRD UX Architecture and Epics Stories are aligned.,,,3-solutioning,bmad-create-epics-and-stories,,true,planning_artifacts,readiness report
|
BMad Method,bmad-check-implementation-readiness,Check Implementation Readiness,IR,Ensure PRD UX Architecture and Epics Stories are aligned.,,,3-solutioning,bmad-create-epics-and-stories,,true,planning_artifacts,readiness report
|
||||||
BMad Method,bmad-sprint-planning,Sprint Planning,SP,Kicks off implementation by producing a plan the implementation agents will follow in sequence for every story.,,,4-implementation,,,true,implementation_artifacts,sprint status
|
BMad Method,bmad-sprint-planning,Sprint Planning,SP,Kicks off implementation by producing a plan the implementation agents will follow in sequence for every story.,,,4-implementation,,,true,implementation_artifacts,sprint status
|
||||||
|
|
|
||||||
|
Loading…
Reference in New Issue