chore(bmad): automate wireframe screenshot embedding + add screen transitions section
- UX agent: add create-front-end-spec-from-wireframe command and dependency - New task: create-front-end-spec-from-wireframe.md (Playwright screenshot + template render) - Template: add Wireframe Screenshots section and Screen Transitions section - Installer: include prewarm for Python Playwright and conventions for output paths
This commit is contained in:
parent
ab70baca59
commit
616d1a7d96
|
|
@ -55,6 +55,7 @@ persona:
|
||||||
commands:
|
commands:
|
||||||
- help: Show numbered list of the following commands to allow selection
|
- help: Show numbered list of the following commands to allow selection
|
||||||
- create-front-end-spec: run task create-doc.md with template front-end-spec-tmpl.yaml
|
- create-front-end-spec: run task create-doc.md with template front-end-spec-tmpl.yaml
|
||||||
|
- create-front-end-spec-from-wireframe: run task create-front-end-spec-from-wireframe.md
|
||||||
- generate-ui-prompt: Run task generate-ai-frontend-prompt.md
|
- generate-ui-prompt: Run task generate-ai-frontend-prompt.md
|
||||||
- exit: Say goodbye as the UX Expert, and then abandon inhabiting this persona
|
- exit: Say goodbye as the UX Expert, and then abandon inhabiting this persona
|
||||||
dependencies:
|
dependencies:
|
||||||
|
|
@ -64,6 +65,7 @@ dependencies:
|
||||||
- create-doc.md
|
- create-doc.md
|
||||||
- execute-checklist.md
|
- execute-checklist.md
|
||||||
- generate-ai-frontend-prompt.md
|
- generate-ai-frontend-prompt.md
|
||||||
|
- create-front-end-spec-from-wireframe.md
|
||||||
templates:
|
templates:
|
||||||
- front-end-spec-tmpl.yaml
|
- front-end-spec-tmpl.yaml
|
||||||
```
|
```
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,65 @@
|
||||||
|
<!-- Powered by BMAD™ Core -->
|
||||||
|
|
||||||
|
# Create Front-end Spec from Local Wireframe (Auto Screenshot)
|
||||||
|
|
||||||
|
## Purpose
|
||||||
|
ローカルHTMLワイヤーフレームを自動でヘッドレスブラウザで撮影し、スクリーンショットをフロントエンド仕様に埋め込んだうえで、テンプレートに沿って仕様書を生成します。
|
||||||
|
|
||||||
|
## Inputs
|
||||||
|
- screen_id: 画面ID(例: AD-033)
|
||||||
|
- wireframe_html_path: ローカルHTMLワイヤーフレームの絶対パス
|
||||||
|
- project_root: プロジェクトルートの絶対パス(例: /Users/xxx/work/your-project)
|
||||||
|
|
||||||
|
## Defaults
|
||||||
|
- 仕様書出力先: `documents/frontend_spec/{{screen_id}}.md`
|
||||||
|
- スクリーンショット出力先: `documents/assets/{{screen_id}}-wireframe.png`
|
||||||
|
- テンプレート: `{root}/templates/front-end-spec-tmpl.yaml`
|
||||||
|
|
||||||
|
## Steps
|
||||||
|
1. Python Playwright をプリウォーム(環境に未導入なら導入)
|
||||||
|
2. Chromium で `file://` スキームのローカルHTMLを開き、1280x720 で撮影
|
||||||
|
3. 画像を `documents/assets/{{screen_id}}-wireframe.png` に保存
|
||||||
|
4. テンプレート `front-end-spec-tmpl.yaml` を用いて仕様書を作成
|
||||||
|
- 変数: `screen_id`, `wireframe_screenshot_relpath`(例: `../assets/{{screen_id}}-wireframe.png`)
|
||||||
|
5. 生成された仕様書に「Wireframe Screenshots」セクションが含まれることを確認
|
||||||
|
|
||||||
|
## Execution Notes
|
||||||
|
- 撮影後に画像パスを相対に変換し、仕様書から参照可能にします。
|
||||||
|
- 既存ファイルがある場合は追記/更新の方針をユーザーに確認してください。
|
||||||
|
|
||||||
|
## Commands
|
||||||
|
```bash
|
||||||
|
# 1) Ensure playwright env is ready (idempotent)
|
||||||
|
python3 -m pip install --user playwright
|
||||||
|
python3 -m playwright install chromium
|
||||||
|
|
||||||
|
# 2) Take screenshot
|
||||||
|
python3 - <<'PY'
|
||||||
|
from playwright.sync_api import sync_playwright
|
||||||
|
import os
|
||||||
|
screen_id = os.environ.get('BMAD_SCREEN_ID')
|
||||||
|
html = os.environ.get('BMAD_WIREFRAME_HTML')
|
||||||
|
project_root = os.environ.get('BMAD_PROJECT_ROOT')
|
||||||
|
out_abs = os.path.join(project_root, 'documents', 'assets', f"{screen_id}-wireframe.png")
|
||||||
|
os.makedirs(os.path.dirname(out_abs), exist_ok=True)
|
||||||
|
with sync_playwright() as p:
|
||||||
|
b = p.chromium.launch()
|
||||||
|
page = b.new_page(viewport={"width":1280, "height":720})
|
||||||
|
page.goto(f"file://{html}")
|
||||||
|
page.wait_for_timeout(1200)
|
||||||
|
page.screenshot(path=out_abs)
|
||||||
|
b.close()
|
||||||
|
print(out_abs)
|
||||||
|
PY
|
||||||
|
|
||||||
|
# 3) Render from template (tooling-dependent - example placeholder)
|
||||||
|
# bmad render --template {root}/templates/front-end-spec-tmpl.yaml \
|
||||||
|
# --out documents/frontend_spec/${BMAD_SCREEN_ID}.md \
|
||||||
|
# --var screen_id=${BMAD_SCREEN_ID} \
|
||||||
|
# --var wireframe_screenshot_relpath=../assets/${BMAD_SCREEN_ID}-wireframe.png
|
||||||
|
```
|
||||||
|
|
||||||
|
## Elicitation
|
||||||
|
本タスクは非対話で実行可能ですが、出力先が既存の場合は上書き可否の確認が必要です。
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -102,6 +102,39 @@ sections:
|
||||||
|
|
||||||
**Breadcrumb Strategy:** {{breadcrumb_strategy}}
|
**Breadcrumb Strategy:** {{breadcrumb_strategy}}
|
||||||
|
|
||||||
|
- id: screen-transitions
|
||||||
|
title: Screen Transitions
|
||||||
|
instruction: |
|
||||||
|
Document how users move between screens at an application level.
|
||||||
|
|
||||||
|
- Use Mermaid flow diagrams to visualize transitions
|
||||||
|
- Include decision points (permissions, confirmations) as diamond nodes
|
||||||
|
- Prefer concise labels for nodes and edges
|
||||||
|
- Reflect destructive actions (disable/delete) as in-place flows if no navigation occurs
|
||||||
|
sections:
|
||||||
|
- id: global-transitions-diagram
|
||||||
|
title: Global Transitions Diagram
|
||||||
|
type: mermaid
|
||||||
|
mermaid_type: graph
|
||||||
|
template: "{{screen_transitions_diagram}}"
|
||||||
|
examples:
|
||||||
|
- |
|
||||||
|
graph TD
|
||||||
|
A[Entry: Menu / Deep Link] --> P{Permission OK?}
|
||||||
|
P -- No --> X[403 / Redirect]
|
||||||
|
P -- Yes --> L[/Screen List/]
|
||||||
|
L -- Create --> M[Type Select Modal]
|
||||||
|
M --> N[/Screen New/]
|
||||||
|
N -- Save/Cancel --> L
|
||||||
|
L -- Edit --> E[/Screen Edit/:id/]
|
||||||
|
E -- Save/Cancel --> L
|
||||||
|
L -- Disable --> D{Confirm?}
|
||||||
|
D -- Yes --> API1[POST /disable]\nSuccess → Reload List
|
||||||
|
D -- No --> L
|
||||||
|
L -- Delete --> C{Confirm?}
|
||||||
|
C -- Yes --> API2[DELETE /:id]\nSuccess → Reload List
|
||||||
|
C -- No --> L
|
||||||
|
|
||||||
- id: user-flows
|
- id: user-flows
|
||||||
title: User Flows
|
title: User Flows
|
||||||
instruction: |
|
instruction: |
|
||||||
|
|
@ -144,6 +177,11 @@ sections:
|
||||||
Clarify where detailed visual designs will be created (Figma, Sketch, etc.) and how to reference them. If low-fidelity wireframes are needed, offer to help conceptualize layouts for key screens.
|
Clarify where detailed visual designs will be created (Figma, Sketch, etc.) and how to reference them. If low-fidelity wireframes are needed, offer to help conceptualize layouts for key screens.
|
||||||
elicit: true
|
elicit: true
|
||||||
sections:
|
sections:
|
||||||
|
- id: wireframe-screenshots
|
||||||
|
title: Wireframe Screenshots
|
||||||
|
instruction: |
|
||||||
|
If a local HTML wireframe exists, capture a screenshot automatically and embed it here. Provide relative path usable from the spec location.
|
||||||
|
template: ""
|
||||||
- id: design-files
|
- id: design-files
|
||||||
template: "**Primary Design Files:** {{design_tool_link}}"
|
template: "**Primary Design Files:** {{design_tool_link}}"
|
||||||
- id: key-screen-layouts
|
- id: key-screen-layouts
|
||||||
|
|
|
||||||
|
|
@ -115,6 +115,26 @@ class FileManager {
|
||||||
files: [],
|
files: [],
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Prewarm setup to reduce first-run latency for UX wireframe flows
|
||||||
|
// These commands are safe to run multiple times.
|
||||||
|
manifest.prewarm = [
|
||||||
|
{
|
||||||
|
name: 'python-playwright',
|
||||||
|
description:
|
||||||
|
'Install Python Playwright and Chromium browser for headless screenshots',
|
||||||
|
commands: [
|
||||||
|
'python3 -m pip install --user playwright',
|
||||||
|
'python3 -m playwright install chromium',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
];
|
||||||
|
|
||||||
|
// Conventions for auto-generated UI specs and assets
|
||||||
|
manifest.conventions = {
|
||||||
|
frontend_spec_output: 'documents/frontend_spec/{{screen_id}}.md',
|
||||||
|
wireframe_screenshot: 'documents/assets/{{screen_id}}-wireframe.png',
|
||||||
|
};
|
||||||
|
|
||||||
// Add file information
|
// Add file information
|
||||||
for (const file of files) {
|
for (const file of files) {
|
||||||
const filePath = path.join(installDir, file);
|
const filePath = path.join(installDir, file);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue