원클릭으로
playwright-ui
Run interactive browser UI tests against the running SlateFlow dev server using MCP Playwright.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Run interactive browser UI tests against the running SlateFlow dev server using MCP Playwright.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
Run deep browser UI tests against the admin panels (global and project-level) using MCP Playwright.
Run deep browser UI tests against the SlateFlow Kanban board using MCP Playwright — covers board load, card CRUD, DnD lane transitions, card modal tabs, task checklists, filters, and lane management.
Create a GitHub issue from a bug or problem description found during testing.
Audit recent changes and verify that README.md, ROADMAP.md, and CLAUDE.md were all updated.
Reset and re-seed slateflow.db with realistic test data for local dev and demos.
Keep the OpenAPI spec in sync with route changes by diffing spec against actual route definitions.
SOC 직업 분류 기준
| name | playwright-ui |
| description | Run interactive browser UI tests against the running SlateFlow dev server using MCP Playwright. |
You are executing the /playwright-ui skill. Follow these steps exactly.
This skill runs a sequence of browser-based UI verification flows against the running SlateFlow dev server using MCP Playwright. It tests critical user journeys: login, Kanban board DnD, card modals, sprints, admin flags, auth guards, and the roadmap.
/playwright-ui # run all 7 flows (default)
/playwright-ui login # only login
/playwright-ui board modal # only board and modal flows
/playwright-ui guard # only auth guard
/playwright-ui sprint flags roadmap
Valid flow tokens: login, board, modal, sprint, flags, guard, roadmap
If no flows are specified, all 7 run.
Determine which flows to run from the command arguments. Default: all (login, board, modal, sprint, flags, guard, roadmap).
First, create a unique run folder for this invocation to isolate all artifacts:
RUN_ID=$(node -e "process.stdout.write(new Date().toISOString().replace(/[:.]/g,'-').slice(0,16))")
RUN_DIR=".playwright-mcp/run-$RUN_ID"
mkdir -p "$RUN_DIR"
echo "Run folder: $RUN_DIR"
Store $RUN_DIR as a variable for cleanup at the end.
Now run the health check script to confirm both servers are up and detect the frontend port:
node .claude/skills/playwright-ui/check-servers.mjs
Parse the output to extract FRONTEND_PORT=<port> (either 5173 or 5174) and store it in a variable for use in all subsequent steps.
If the script exits non-zero, stop here and tell the user to run npm run dev first.
Purpose: Establish session (sf_token httpOnly cookie) in the browser context for all subsequent flows.
Use the MCP Playwright tools:
browser_navigate to http://localhost:$FRONTEND_PORT/loginbrowser_screenshot — confirm the login form is visible (email + password fields, sign-in button)browser_type into the email field: admin@flow.localbrowser_type into the password field: Admin1234!browser_click on the "Sign in" / submit buttonbrowser_wait_for_url to not contain /login (should redirect to /dashboard or similar)browser_screenshot — confirm the dashboard page renderedIf login fails, stop here and report the failure. Otherwise, continue to the requested flows below.
Board Flow (if requested):
browser_navigate to http://localhost:$FRONTEND_PORT/projects/1/boardbrowser_screenshot — confirm swim lanes (To Do, In Progress, Review, Done) are visiblebrowser_click the "Add Card" button (or icon) in the first lanebrowser_type a card title (e.g., "Test card created by MCP")browser_click the "Create" / submit buttonbrowser_screenshot — confirm the card appears in the lanebrowser_drag_and_drop the card to the next lane (e.g., To Do → In Progress)browser_screenshot — confirm the card is now in the destination lane (visual + SSE real-time update)Modal Flow (if requested):
browser_click any card on the board to open the CardModalbrowser_screenshot — confirm the modal is open and shows the card titlebrowser_screenshotbrowser_screenshotbrowser_type a comment text with @admin mention (e.g., "This is a @admin mention test")browser_click the submit/send buttonbrowser_screenshot — confirm the comment is saved and the @admin mention is highlightedbrowser_screenshotbrowser_screenshotbrowser_screenshotbrowser_screenshotSprint Flow (if requested):
browser_navigate to http://localhost:$FRONTEND_PORT/projects/1/sprintsbrowser_screenshot — confirm the sprints list is visiblebrowser_type sprint name (e.g., "Test Sprint MCP")browser_type start and end dates (or use date pickers)browser_click the "Create" buttonbrowser_screenshot — confirm the sprint appears in the list with "Planned" statusbrowser_click the "Activate" button on the new sprintbrowser_screenshot — confirm the status badge changes to "Active"browser_screenshot — confirm the burndown chart is visiblebrowser_click the "Complete Sprint" buttonbrowser_screenshot — confirm the status badge changes to "Completed"Flags Flow (if requested):
browser_navigate to http://localhost:$FRONTEND_PORT/adminbrowser_screenshot — confirm the admin panel loadedbrowser_screenshot — confirm feature flags are visible (toggle switches)browser_click a feature flag toggle (e.g., "Calendar" flag)browser_screenshot — confirm the toggle state changed visuallybrowser_navigate to http://localhost:$FRONTEND_PORT/dashboardbrowser_screenshot — confirm the sidebar now shows or hides the Calendar nav link based on the flag stateGuard Flow (if requested):
browser_evaluate('document.cookie = ""') to simulate an unauthenticated userbrowser_navigate to http://localhost:$FRONTEND_PORT/dashboardbrowser_screenshot — confirm the browser redirects to /login (the <ProtectedRoute> guard should redirect)Roadmap Flow (if requested):
browser_navigate to http://localhost:$FRONTEND_PORT/projects/1/roadmapbrowser_screenshot — confirm the Gantt-style timeline is visible (epic/feature rows with date bars)browser_click on a date bar (to open the date editor popover)browser_screenshot — confirm the popover appeared and is editableCompile the results of each flow into a summary table and report:
## UI Verification Report
| Flow | Status | Notes |
|------|--------|-------|
| login | ✅ PASS | Dashboard loaded, sf_token cookie established |
| board | ✅ PASS | Card created, DnD to next lane confirmed |
| modal | ✅ PASS | All 6 tabs rendered, @mention comment saved |
| sprint | ✅ PASS | Sprint lifecycle: planned → active → completed |
| flags | ✅ PASS | Calendar flag toggled, sidebar nav updated |
| guard | ✅ PASS | Unauthenticated access redirected to /login |
| roadmap | ✅ PASS | Gantt bars rendered, date editor popover works |
For each flow, note:
✅ PASS or ❌ FAILEmbed a representative screenshot from each flow. Use browser_screenshot to capture the visual state after each major action.
After the report is complete, move all generated files into the run folder:
mv .playwright-mcp/*.log "$RUN_DIR/" 2>/dev/null || true
mv .playwright-mcp/*.yml "$RUN_DIR/" 2>/dev/null || true
mv .playwright-mcp/*.png "$RUN_DIR/" 2>/dev/null || true
echo "All artifacts saved to $RUN_DIR"
This keeps each run's screenshots, logs, and snapshots isolated in its own timestamped subfolder, preventing conflicts between concurrent or sequential runs.
| Issue | Cause | Fix |
|---|---|---|
| Health check fails | Dev server not running | Run npm run dev in another terminal |
| Login times out | Login form not found or incorrect selectors | Check that frontend is on $FRONTEND_PORT (5173 or 5174) and the login page loads |
| Card won't drag | DnD not working or selector incorrect | Use browser_drag_and_drop from card element to lane target |
| Modal tabs click fails | Tab selector changed in code | Use browser_get_element_by or retry with updated selectors |
| Sprint create fails | Form fields have changed | Verify the sprint creation form structure in the UI |
| Auth guard doesn't redirect | ProtectedRoute not working | Check browser console for errors; verify the redirect URL |
| Roadmap bars don't render | Gantt component not rendering | Check browser console for recharts errors |
Session Notes:
server/slateflow.db) — reset anytime with /seed-db*.png), console logs (*.log), and page snapshots (*.yml) from this run are automatically moved into .playwright-mcp/run-<timestamp>/ at the end — concurrent and sequential runs stay isolated