mirror of
https://github.com/bmad-code-org/BMAD-METHOD.git
synced 2026-09-19 08:11:52 +08:00
cf54f4d76d
* refactor(bmm): move sprint-planning and sprint-status to plan/ They sit at the plan/ship boundary and their outputs are planning artifacts of the dev cycle; next commit makes sprint-planning the readiness gate, which is plan-side work. * refactor(bmm): fold readiness gate into sprint-planning, retire check-implementation-readiness The old skill was 1,154 lines of legacy numbered-step ceremony whose document discovery hardcoded filename globs (*prd*, *ux*, *epic*) that miss what current skills produce (SPEC.md, DESIGN.md) and still treated retired sharded docs as first-class. Sprint-planning now opens with a lean readiness gate: generic artifact discovery by content, forward/back traceability, PASS/CONCERNS/FAIL, stop on FAIL with findings. The IR trigger on John's and Winston's menus dispatches sprint-planning, so 'check implementation readiness' still works everywhere it used to. * refactor(bmm): modernize sprint-planning with deterministic script core SKILL.md drops the legacy XML step dialect for the product-brief style (~100 lines, uv run, headless contract). New scripts/sprint_plan.py owns the mechanical work — epic parsing, key derivation, ordering, preserve- never-downgrade merge, story-file detection, action_items carry-over, atomic writes, drift checks — with 11 tests wired in as test:sprint-planning. Judgment stays with the LLM: epic discovery, the readiness gate, and reconciling script-reported orphans and unparsed headings. checklist.md retired (the script performs that checklist); sprint-status-template.yaml is the single source for the status vocabulary. Output stays byte-compatible with build's sprint sync and retrospective's tooling. * refactor(bmm): fold sprint-status into sprint-planning's status view sprint_plan.py gains a status subcommand: counts (legacy values mapped), risk flags, open action items, and a priority-ordered next-action recommendation — the old skill's inference-driven summary, computed deterministically and covered by 9 new tests. bmad-sprint-status becomes a v6-shims husk that forwards with status-view intent and a deprecation notice; its dead data/validate modes had zero callers and are gone. If a hand-edited status file defeats the script, the skill falls back to reading it directly and summarizing by best judgment. New explanation page docs/explanation/sprint-planning.md covers the consolidated skill; workflow maps and references updated across all languages. * docs: changelog entries for skill reorg and sprint consolidation * fix(bmm): harden sprint_plan.py per review; add validate/fix intents with full progressive disclosure Review fixes (PR #2659 findings, bot + internal review): - Normalize legacy v6 statuses (drafted/contexted) on every read — merged by meaning and reported, never treated as illegal or reset - dropped_orphans carry their old status; transplant renames via --set - project_key/tracking_system/story_location preserved from the existing file unless overridden; refresh round-trips custom keys and user comments - Hardened write path: dump-to-bytes, fsync, permission-preserving atomic write inside the guarded block, explicit checks (no asserts), atomic restore - JSON-only argparse (errors and -h emit JSON); unicode-aware slugs with hash fallback; fenced code blocks ignored when parsing epics - Odd retro keys, date-typed stamps, and non-mapping YAML report cleanly instead of crashing; unparseable timestamps warn instead of silently disabling the staleness check; malformed action items flagged, not dropped - Dead check subcommand removed; generate --dry-run reports drift/in_sync - test:sprint-planning wired into quality and CI (was test-only) - Retro tests use a vendored template fixture (PATH-05); repo-level test-template-sync.js keeps it byte-identical to the source; template example timestamps and story_location fixed; header block pinned to the template by test New capability: - validate subcommand + reference: structural validation, never writes - fix flow: evidence-gathering subagents -> user-confirmed state table -> generate --fresh --set writes a pristine file (the one path allowed to downgrade); universal script-failure fallback to inference for every intent - SKILL.md is now a lean router: gate, tracking, status, fix, and validate each load as progressive-disclosure references Docs: explanation page gains Repair section; workflow-map and getting-started across all five languages mention the status view; headless payload nests under 'report' to avoid the status key collision; changelog updated. Test suite grows 20 -> 37; retro suite 91/91; docs build and validators green. * docs: mention repair in sprint-planning explanation description
317 lines
15 KiB
HTML
317 lines
15 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="fr">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>Carte des Workflows - Méthode BMad</title>
|
||
<style>
|
||
:root {
|
||
--analysis: #0ea5e9;
|
||
--planning: #22c55e;
|
||
--solutioning: #eab308;
|
||
--implementation: #ef4444;
|
||
--bg: #0f172a;
|
||
--card: #1e293b;
|
||
--text: #f8fafc;
|
||
--text-muted: #94a3b8;
|
||
--border: #334155;
|
||
--success: #10b981;
|
||
--arrow: #f59e0b;
|
||
}
|
||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||
body {
|
||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
||
background: var(--bg);
|
||
color: var(--text);
|
||
line-height: 1.4;
|
||
padding: 12px;
|
||
}
|
||
.header { text-align: center; margin-bottom: 16px; }
|
||
.header-badge {
|
||
display: inline-flex; align-items: center; gap: 6px;
|
||
background: linear-gradient(135deg, var(--analysis), var(--planning));
|
||
padding: 4px 12px; border-radius: 20px;
|
||
font-size: 0.75rem; font-weight: 600; margin-bottom: 8px;
|
||
}
|
||
h1 { font-size: 1.5rem; font-weight: 700; }
|
||
.subtitle { color: var(--text-muted); font-size: 0.8rem; }
|
||
|
||
.flow-legend {
|
||
background: rgba(245, 158, 11, 0.1); border: 1px solid rgba(245, 158, 11, 0.3);
|
||
border-radius: 8px; padding: 8px 12px; margin-bottom: 16px; text-align: center;
|
||
font-size: 0.7rem; color: var(--arrow);
|
||
}
|
||
|
||
.flow-grid {
|
||
display: grid;
|
||
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
|
||
gap: 8px;
|
||
margin-bottom: 16px;
|
||
}
|
||
|
||
.phase {
|
||
background: var(--card);
|
||
border-radius: 10px;
|
||
border: 1px solid var(--border);
|
||
border-top: 3px solid;
|
||
}
|
||
.phase.analysis { border-top-color: var(--analysis); }
|
||
.phase.planning { border-top-color: var(--planning); }
|
||
.phase.solutioning { border-top-color: var(--solutioning); }
|
||
.phase.implementation { border-top-color: var(--implementation); }
|
||
|
||
.phase-header { padding: 10px 12px 8px; border-bottom: 1px solid var(--border); display: flex; align-items: center; gap: 8px; }
|
||
.phase-num { width: 22px; height: 22px; border-radius: 6px; display: flex; align-items: center; justify-content: center; font-size: 0.75rem; font-weight: 700; }
|
||
.analysis .phase-num { background: var(--analysis); }
|
||
.planning .phase-num { background: var(--planning); }
|
||
.solutioning .phase-num { background: var(--solutioning); color: #000; }
|
||
.implementation .phase-num { background: var(--implementation); }
|
||
.phase-title { font-size: 0.95rem; font-weight: 700; }
|
||
.phase-opt { font-size: 0.6rem; padding: 2px 6px; border-radius: 4px; background: rgba(14, 165, 233, 0.2); color: #7dd3fc; }
|
||
|
||
.workflows { padding: 8px 10px; }
|
||
|
||
.workflow {
|
||
background: rgba(255,255,255,0.03); border-radius: 6px;
|
||
padding: 8px; margin-bottom: 6px;
|
||
font-size: 0.7rem;
|
||
}
|
||
.workflow-header {
|
||
display: flex; justify-content: space-between; align-items: center;
|
||
margin-bottom: 4px;
|
||
}
|
||
.workflow-name {
|
||
font-family: monospace; color: var(--success);
|
||
background: rgba(16, 185, 129, 0.1); padding: 2px 6px;
|
||
border-radius: 3px; font-size: 0.65rem;
|
||
}
|
||
.workflow-meta { display: flex; justify-content: space-between; align-items: center; }
|
||
.agent { display: flex; align-items: center; gap: 4px; }
|
||
.agent-icon { width: 14px; height: 14px; border-radius: 3px; display: flex; align-items: center; justify-content: center; font-size: 0.55rem; font-weight: 700; }
|
||
.agent-icon.mary { background: linear-gradient(135deg, #f472b6, #ec4899); }
|
||
.agent-icon.john { background: linear-gradient(135deg, #60a5fa, #3b82f6); }
|
||
.agent-icon.sally { background: linear-gradient(135deg, #fbbf24, #f59e0b); color: #000; }
|
||
.agent-icon.winston { background: linear-gradient(135deg, #a78bfa, #8b5cf6); }
|
||
.agent-icon.amelia { background: linear-gradient(135deg, #fb7185, #ef4444); }
|
||
|
||
.agent-name { font-size: 0.65rem; }
|
||
.output { color: var(--success); font-family: monospace; font-size: 0.6rem; }
|
||
.badge { font-size: 0.55rem; padding: 1px 4px; border-radius: 3px; }
|
||
.badge.opt { background: rgba(251,191,36,0.15); color: #fbbf24; }
|
||
.badge.iffy { background: rgba(168,85,247,0.15); color: #a855f7; }
|
||
.badge.adhoc { background: rgba(59,130,246,0.15); color: #3b82f6; }
|
||
|
||
.arrow { display: flex; align-items: center; justify-content: center; color: var(--arrow); font-size: 0.9rem; margin: 6px 0; }
|
||
|
||
.decision { background: linear-gradient(135deg, #a855f7, #9333ea); padding: 4px 8px; border-radius: 4px; text-align: center; font-size: 0.65rem; font-weight: 600; margin: 6px 0; }
|
||
|
||
.context { background: rgba(14, 165, 233, 0.08); border-radius: 10px; padding: 12px; font-size: 0.75rem; }
|
||
.context-header { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; font-weight: 600; }
|
||
.context-items { display: flex; flex-wrap: wrap; gap: 6px; }
|
||
.context-items code { font-family: monospace; color: var(--success); background: rgba(16, 185, 129, 0.1); padding: 2px 5px; border-radius: 3px; font-size: 0.65rem; }
|
||
.context-items span { color: var(--text-muted); }
|
||
|
||
.legend { display: flex; justify-content: center; gap: 12px; flex-wrap: wrap; font-size: 0.7rem; margin-top: 12px; }
|
||
.legend-item { display: flex; align-items: center; gap: 4px; }
|
||
.legend-dot { width: 12px; height: 3px; border-radius: 2px; }
|
||
</style>
|
||
</head>
|
||
<body>
|
||
<div class="header">
|
||
<div class="header-badge">⚡ Carte des Workflows V6</div>
|
||
<h1>Méthode BMad</h1>
|
||
<p class="subtitle">Ingénierie du contexte pour le développement piloté par l’IA</p>
|
||
</div>
|
||
|
||
<div class="flow-legend">→ les flèches montrent le flux des artefacts entre les workflows</div>
|
||
|
||
<div class="flow-grid">
|
||
<!-- Phase 1: Analysis -->
|
||
<div class="phase analysis">
|
||
<div class="phase-header">
|
||
<div class="phase-num">1</div>
|
||
<div class="phase-title">Analyse</div>
|
||
<span class="phase-opt">Optionnel</span>
|
||
</div>
|
||
<div class="workflows">
|
||
<div class="workflow">
|
||
<div class="workflow-header">
|
||
<span class="workflow-name">brainstorm</span>
|
||
<span class="badge opt">opt</span>
|
||
</div>
|
||
<div class="workflow-meta">
|
||
<div class="agent"><div class="agent-icon mary">M</div><span class="agent-name">Mary</span></div>
|
||
<span class="output">brainstorming-report.md</span>
|
||
</div>
|
||
</div>
|
||
<div class="workflow">
|
||
<div class="workflow-header">
|
||
<span class="workflow-name">research</span>
|
||
<span class="badge opt">opt</span>
|
||
</div>
|
||
<div class="workflow-meta">
|
||
<div class="agent"><div class="agent-icon mary">M</div><span class="agent-name">Mary</span></div>
|
||
<span class="output">résultats</span>
|
||
</div>
|
||
</div>
|
||
<div class="workflow">
|
||
<div class="workflow-header">
|
||
<span class="workflow-name">product-brief</span>
|
||
<span class="badge opt">ou ↓</span>
|
||
</div>
|
||
<div class="workflow-meta">
|
||
<div class="agent"><div class="agent-icon mary">M</div><span class="agent-name">Mary</span></div>
|
||
<span class="output">product-brief.md →</span>
|
||
</div>
|
||
</div>
|
||
<div class="workflow">
|
||
<div class="workflow-header">
|
||
<span class="workflow-name">prfaq</span>
|
||
<span class="badge opt">ou ↑</span>
|
||
</div>
|
||
<div class="workflow-meta">
|
||
<div class="agent"><div class="agent-icon mary">M</div><span class="agent-name">Mary</span></div>
|
||
<span class="output">prfaq.md →</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="arrow">→</div>
|
||
</div>
|
||
|
||
<!-- Phase 2: Planning -->
|
||
<div class="phase planning">
|
||
<div class="phase-header">
|
||
<div class="phase-num">2</div>
|
||
<div class="phase-title">Planification</div>
|
||
</div>
|
||
<div class="workflows">
|
||
<div class="workflow">
|
||
<div class="workflow-header">
|
||
<span class="workflow-name">prd</span>
|
||
</div>
|
||
<div class="workflow-meta">
|
||
<div class="agent"><div class="agent-icon john">J</div><span class="agent-name">Au choix</span></div>
|
||
<span class="output">prd.md →</span>
|
||
</div>
|
||
</div>
|
||
<div class="decision">Interface utilisateur ?</div>
|
||
<div class="workflow">
|
||
<div class="workflow-header">
|
||
<span class="workflow-name">create-ux-design</span>
|
||
<span class="badge iffy">si oui</span>
|
||
</div>
|
||
<div class="workflow-meta">
|
||
<div class="agent"><div class="agent-icon sally">S</div><span class="agent-name">Sally</span></div>
|
||
<span class="output">ux-spec.md →</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="arrow">→</div>
|
||
</div>
|
||
|
||
<!-- Phase 3: Solutioning -->
|
||
<div class="phase solutioning">
|
||
<div class="phase-header">
|
||
<div class="phase-num">3</div>
|
||
<div class="phase-title">Solutioning</div>
|
||
</div>
|
||
<div class="workflows">
|
||
<div class="workflow">
|
||
<div class="workflow-header">
|
||
<span class="workflow-name">create-architecture</span>
|
||
</div>
|
||
<div class="workflow-meta">
|
||
<div class="agent"><div class="agent-icon winston">W</div><span class="agent-name">Winston</span></div>
|
||
<span class="output">architecture.md →</span>
|
||
</div>
|
||
</div>
|
||
<div class="workflow">
|
||
<div class="workflow-header">
|
||
<span class="workflow-name">create-epics-and-stories</span>
|
||
</div>
|
||
<div class="workflow-meta">
|
||
<div class="agent"><div class="agent-icon john">J</div><span class="agent-name">John</span></div>
|
||
<span class="output">epics.md →</span>
|
||
</div>
|
||
</div>
|
||
<div class="workflow">
|
||
<div class="workflow-header">
|
||
<span class="workflow-name">sprint-planning</span>
|
||
</div>
|
||
<div class="workflow-meta">
|
||
<div class="agent"><div class="agent-icon john">J</div><span class="agent-name">John</span></div>
|
||
<span class="output">jalon + sprint-status.yaml →</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<div class="arrow">→</div>
|
||
</div>
|
||
|
||
<!-- Phase 4: Implementation -->
|
||
<div class="phase implementation">
|
||
<div class="phase-header">
|
||
<div class="phase-num">4</div>
|
||
<div class="phase-title">Implémentation</div>
|
||
</div>
|
||
<div class="workflows">
|
||
<div class="decision">Intention directe ou contexte planifié ↓</div>
|
||
<div class="workflow">
|
||
<div class="workflow-header">
|
||
<span class="workflow-name">build</span>
|
||
</div>
|
||
<div class="workflow-meta">
|
||
<div class="agent"><div class="agent-icon amelia">A</div><span class="agent-name">Amelia</span></div>
|
||
<span class="output">spec + code + revue →</span>
|
||
</div>
|
||
</div>
|
||
<div class="workflow">
|
||
<div class="workflow-header">
|
||
<span class="workflow-name">code-review</span>
|
||
</div>
|
||
<div class="workflow-meta">
|
||
<div class="agent"><div class="agent-icon amelia">A</div><span class="agent-name">Amelia</span></div>
|
||
<span class="output">approbation</span>
|
||
</div>
|
||
</div>
|
||
<div class="workflow">
|
||
<div class="workflow-header">
|
||
<span class="workflow-name">correct-course</span>
|
||
<span class="badge adhoc">ad-hoc</span>
|
||
</div>
|
||
<div class="workflow-meta">
|
||
<div class="agent"><div class="agent-icon john">J</div><span class="agent-name">John</span></div>
|
||
<span class="output">plan mis à jour</span>
|
||
</div>
|
||
</div>
|
||
<div class="workflow">
|
||
<div class="workflow-header">
|
||
<span class="workflow-name">retrospective</span>
|
||
<span class="badge adhoc">par Epic</span>
|
||
</div>
|
||
<div class="workflow-meta">
|
||
<div class="agent"><div class="agent-icon amelia">A</div><span class="agent-name">Amelia</span></div>
|
||
<span class="output">leçons apprises</span>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="context">
|
||
<div class="context-header">📚 Flux de Contexte</div>
|
||
<p style="margin-bottom: 8px; color: var(--text-muted);">Les documents disponibles enrichissent le contexte avant l’implémentation.</p>
|
||
<div class="context-items">
|
||
<span><code>build</code> <span>charge l’intention, issue, spec, PRD, architecture, UX, epic, story et contexte de sprint disponibles</span></span>
|
||
<span><code>code-review</code> <span>ajoute une validation indépendante si nécessaire</span></span>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="legend">
|
||
<div class="legend-item"><div class="legend-dot" style="background: var(--analysis);"></div>Analyse</div>
|
||
<div class="legend-item"><div class="legend-dot" style="background: var(--planning);"></div>Planification</div>
|
||
<div class="legend-item"><div class="legend-dot" style="background: var(--solutioning);"></div>Solutioning</div>
|
||
<div class="legend-item"><div class="legend-dot" style="background: var(--implementation);"></div>Implémentation</div>
|
||
</div>
|
||
</body>
|
||
</html>
|