Use when you have a written implementation plan to execute in a separate session with review checkpoints
npx skills add 30eggis/claude-frontend-skills --skill "spec-scenario-loader"
Install specific skill from multi-skill repository
# Description
|
# SKILL.md
name: spec-scenario-loader
description: |
์ ์ง์ ์ผ๋ก ์๋๋ฆฌ์ค ๊ณํ์๋ฅผ ๋ก๋ฉํฉ๋๋ค.
ํ๋ฅด์๋๋ณ, ํ๋ฉด๋ณ, Critical Path๋ณ ๋ก๋ฉ ์ง์.
Agent์ ์ปจํ
์คํธ ํจ์จ์ฑ์ ์ํด ํ์ํ ๋ถ๋ถ๋ง ์ ํ์ ์ผ๋ก ๋ก๋ฉํฉ๋๋ค.
allowed-tools: Read, Glob, Grep
argument-hint: "
permissionMode: bypassPermissions
spec-scenario-loader
์๋๋ฆฌ์ค ๊ณํ์๋ฅผ ์ ์ง์ ์ผ๋ก ๋ก๋ฉํ์ฌ Agent์ ์ปจํ ์คํธ๋ฅผ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค.
์ฌ์ฉ ๋ชฉ์
- E2E ์๋๋ฆฌ์ค๊ฐ ๋ง์ผ๋ฉด Agent ํธ์ถ ์ ์ปจํ ์คํธ ์ด๊ณผ ์ํ
- ํ์ํ ์๋๋ฆฌ์ค๋ง ์ ์ง์ ์ผ๋ก ๋ก๋ฉ
- Critical Path ์ฐ์ , ํ๋ฉด๋ณ/ํ๋ฅด์๋๋ณ ์ธ๋ถํ๋ ๋ก๋ฉ
์ฌ์ฉ๋ฒ
์ ์ฒด ์๋๋ฆฌ์ค ๋ชฉ๋ก (์์ฝ)
/spec-scenario-loader {spec-folder} --list
์ถ๋ ฅ:
# ์๋๋ฆฌ์ค ๋ชฉ๋ก ์์ฝ
## Critical Path (5๊ฐ)
1. ํ์๊ฐ์
โ ๋ก๊ทธ์ธ โ ๋์๋ณด๋ ์ ๊ทผ
2. ์ข
๋ชฉ ๊ฒ์ โ ์์ธ ๋ณด๊ธฐ โ ๊ด์ฌ์ข
๋ชฉ ์ถ๊ฐ
3. ํฌํธํด๋ฆฌ์ค ์กฐํ โ ๋งค์/๋งค๋
4. ์๋ฆผ ์ค์ โ ์๋ฆผ ์์ ํ์ธ
5. ์ค์ ๋ณ๊ฒฝ โ ๋ก๊ทธ์์
## ํ๋ฉด๋ณ ์๋๋ฆฌ์ค
| ํ๋ฉด | ์๋๋ฆฌ์ค ์ | ์ฃผ์ ํ๋ก์ฐ |
|------|-------------|-------------|
| Dashboard | 8 | ์ค์๊ฐ ๋ฐ์ดํฐ, ์์ ฏ ์ํธ์์ฉ |
| StockDetail | 6 | ์ฐจํธ, ๋งค๋งค, ์๋ฆผ |
| Settings | 4 | ํ๋กํ, ์๋ฆผ, ํ
๋ง |
| Search | 3 | ๊ฒ์, ํํฐ, ์ ๋ ฌ |
## ํ๋ฅด์๋๋ณ ์๋๋ฆฌ์ค
| ํ๋ฅด์๋ | ์๋๋ฆฌ์ค ์ | ํต์ฌ ๋์ฆ |
|----------|-------------|-----------|
| Busy Professional | 5 | ๋น ๋ฅธ ์ ๋ณด ํ์ธ |
| Casual Investor | 4 | ๊ฐ๋จํ ๋งค๋งค |
| Day Trader | 6 | ์ค์๊ฐ ๋ฐ์ดํฐ, ๋น ๋ฅธ ์ฃผ๋ฌธ |
ํ๋ฅด์๋๋ณ ๋ก๋ฉ
/spec-scenario-loader {spec-folder} --persona "Busy Professional"
/spec-scenario-loader {spec-folder} --persona "Casual Investor"
์ถ๋ ฅ: ํด๋น ํ๋ฅด์๋์ ๋ชจ๋ ์๋๋ฆฌ์ค ์ ์ฒด ๋ด์ฉ
ํ๋ฉด๋ณ ์๋๋ฆฌ์ค
/spec-scenario-loader {spec-folder} --screen dashboard
/spec-scenario-loader {spec-folder} --screen stock-detail
/spec-scenario-loader {spec-folder} --screen settings
์ถ๋ ฅ: ํด๋น ํ๋ฉด์ ๋ชจ๋ ์๋๋ฆฌ์ค ์ ์ฒด ๋ด์ฉ
Critical Path๋ง
/spec-scenario-loader {spec-folder} --critical-path
์ถ๋ ฅ: Critical Path ์๋๋ฆฌ์ค๋ง ๋ก๋ฉ (๊ฐ์ฅ ์ค์ํ ์ฌ์ฉ์ ํ๋ฆ)
์คํจํ ์๋๋ฆฌ์ค๋ง (์ฌ์คํ์ฉ)
/spec-scenario-loader {spec-folder} --failed
์ถ๋ ฅ: ๋ง์ง๋ง E2E ์คํ์์ ์คํจํ ์๋๋ฆฌ์ค๋ง ๋ก๋ฉ
Spec ํด๋ ๊ตฌ์กฐ
{spec-folder}/04-review/scenarios/
โโโ critical-path.md โ Critical Path ์๋๋ฆฌ์ค (legacy)
โโโ critical-path.yaml โ Critical Path (YAML preferred)
โโโ screen-dashboard.md โ Dashboard ํ๋ฉด ์๋๋ฆฌ์ค
โโโ screen-dashboard.yaml โ Dashboard (YAML preferred)
โโโ screen-stock-detail.md โ ์ข
๋ชฉ ์์ธ ํ๋ฉด ์๋๋ฆฌ์ค
โโโ screen-settings.md โ ์ค์ ํ๋ฉด ์๋๋ฆฌ์ค
โโโ screen-search.md โ ๊ฒ์ ํ๋ฉด ์๋๋ฆฌ์ค
โโโ persona-busy-professional.md
โโโ persona-casual-investor.md
โโโ persona-day-trader.md
Format Detection
The loader auto-detects spec format by file extension:
| Extension | Format | Priority |
|---|---|---|
.yaml |
YAML (structured) | Preferred |
.md |
Markdown (legacy) | Fallback |
When both formats exist for a scenario, YAML takes precedence.
๋ก๋ฉ ๋ก์ง
--list ๋ชจ๋
1. Glob: {spec-folder}/04-review/scenarios/*.{yaml,md}
2. ๊ฐ ํ์ผ์์ ๋ฉํ๋ฐ์ดํฐ ์ถ์ถ:
- YAML: direct parse from id, screen, persona fields
- MD: regex parse from headers
- ์๋๋ฆฌ์ค ๊ฐ์
- ํ๋ฉด/ํ๋ฅด์๋ ๋ถ๋ฅ
- Critical Path ์ฌ๋ถ
3. ์์ฝ ํ
์ด๋ธ ์์ฑ
--persona ๋ชจ๋
1. Read: {spec-folder}/04-review/scenarios/persona-{name}.yaml (preferred)
2. Fallback: {spec-folder}/04-review/scenarios/persona-{name}.md
3. ์์ผ๋ฉด Grep์ผ๋ก ํ๋ฅด์๋๋ช
๊ฒ์
4. ๊ด๋ จ ์๋๋ฆฌ์ค ํตํฉ ์ถ๋ ฅ
--screen ๋ชจ๋
1. Read: {spec-folder}/04-review/scenarios/screen-{name}.yaml (preferred)
2. Fallback: {spec-folder}/04-review/scenarios/screen-{name}.md
3. ํด๋น ํ๋ฉด์ ๋ชจ๋ ์๋๋ฆฌ์ค ์ถ๋ ฅ
--critical-path ๋ชจ๋
1. Read: {spec-folder}/04-review/scenarios/critical-path.yaml (preferred)
2. Fallback: {spec-folder}/04-review/scenarios/critical-path.md
3. ์ ์ฒด ๋ด์ฉ ์ถ๋ ฅ
--failed ๋ชจ๋
1. Read: .spec-it/execute/{sessionId}/logs/e2e-results.json
2. ์คํจํ ์๋๋ฆฌ์ค ID ์ถ์ถ
3. ํด๋น ์๋๋ฆฌ์ค๋ง ๋ก๋ฉ (YAML ์ฐ์ )
4. ์คํจ ์์ธ ์ปจํ
์คํธ ํฌํจ
YAML Parsing Guide
YAML ํฌ๋งท ์๋๋ฆฌ์ค ์คํ์์ ๋ฐ์ดํฐ ์ถ์ถ:
# ๋ฉํ๋ฐ์ดํฐ
id: "SCN-001" โ ์๋๋ฆฌ์ค ID
name: "์ค์๊ฐ ์ฃผ๊ฐ ํ์ธ" โ ์๋๋ฆฌ์ค ์ด๋ฆ
screen: "dashboard" โ ํ๋ฉด
persona: "Busy Professional"
priority: "P0"
criticalPath: true
# ์๋๋ฆฌ์ค ๋ด์ฉ
given:
- "์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ๋ ์ํ"
- "๊ด์ฌ์ข
๋ชฉ์ด ์ต์ 1๊ฐ ์ด์ ๋ฑ๋ก๋จ"
when:
- "Dashboard ํ์ด์ง ์ ๊ทผ"
- "์ค์๊ฐ ์ฃผ๊ฐ ์์ ฏ ํ์ธ"
then:
- "๊ด์ฌ์ข
๋ชฉ ์ฃผ๊ฐ๊ฐ ์ค์๊ฐ์ผ๋ก ์
๋ฐ์ดํธ๋จ"
- "๋ฑ๋ฝ๋ฅ ์ด ์์์ผ๋ก ๊ตฌ๋ถ๋จ"
playwright:
selector: "[data-testid='price-widget']"
assertion: "toBeVisible"
์๋๋ฆฌ์ค ํฌ๋งท
๊ฐ ์๋๋ฆฌ์ค ํ์ผ์ ๋ค์ ํ์์ ๋ฐ๋ฆ ๋๋ค:
# Screen: Dashboard
## Scenario: SC-001 ์ค์๊ฐ ์ฃผ๊ฐ ํ์ธ
**ํ๋ฅด์๋:** Busy Professional
**Priority:** P0
**Critical Path:** Yes
### Given (์ ์ ์กฐ๊ฑด)
- ์ฌ์ฉ์๊ฐ ๋ก๊ทธ์ธ๋ ์ํ
- ๊ด์ฌ์ข
๋ชฉ์ด ์ต์ 1๊ฐ ์ด์ ๋ฑ๋ก๋จ
### When (๋์)
1. Dashboard ํ์ด์ง ์ ๊ทผ
2. ์ค์๊ฐ ์ฃผ๊ฐ ์์ ฏ ํ์ธ
### Then (๊ธฐ๋๊ฒฐ๊ณผ)
- [ ] ๊ด์ฌ์ข
๋ชฉ ์ฃผ๊ฐ๊ฐ ์ค์๊ฐ์ผ๋ก ์
๋ฐ์ดํธ๋จ
- [ ] ๋ฑ๋ฝ๋ฅ ์ด ์์์ผ๋ก ๊ตฌ๋ถ๋จ (์์น: ๋นจ๊ฐ, ํ๋ฝ: ํ๋)
- [ ] ๋ง์ง๋ง ์
๋ฐ์ดํธ ์๊ฐ์ด ํ์๋จ
### Playwright ํํธ
```typescript
await page.goto('/dashboard');
await expect(page.locator('[data-testid="price-widget"]')).toBeVisible();
await expect(page.locator('[data-testid="last-update"]')).toContainText(/\d{2}:\d{2}/);
## Agent ์ฐ๋ ์์
### Phase 7: SCENARIO-TEST์์ ์ฌ์ฉ
Task(e2e-implementer, opus):
prompt: "
# Step 1: Critical Path ๋จผ์ ๊ตฌํ
Skill(spec-scenario-loader {spec-folder} --critical-path)
โ E2E ํ
์คํธ ๊ตฌํ
# Step 2: ํ๋ฉด๋ณ ์๋๋ฆฌ์ค
FOR screen IN [dashboard, stock-detail, settings]:
Skill(spec-scenario-loader {spec-folder} --screen {screen})
โ E2E ํ
์คํธ ๊ตฌํ
# Step 3: ์คํจ ์ผ์ด์ค ์ฌํ์ธ
Skill(spec-scenario-loader {spec-folder} --failed)
โ ์คํจ ์์ธ ๋ถ์ ๋ฐ ์์
"
### ์ ์ง์ ๋ก๋ฉ ํจํด
1๋จ๊ณ: ์ ์ฒด ๊ตฌ์กฐ ํ์
Skill(spec-scenario-loader specs --list)
2๋จ๊ณ: Critical Path ์ฐ์ (๊ฐ์ฅ ์ค์)
Skill(spec-scenario-loader specs --critical-path)
3๋จ๊ณ: ํ๋ฉด๋ณ ์ธ๋ถ ์๋๋ฆฌ์ค
Skill(spec-scenario-loader specs --screen dashboard)
4๋จ๊ณ: ํน์ ํ๋ฅด์๋ ์๋๋ฆฌ์ค
Skill(spec-scenario-loader specs --persona "Busy Professional")
## ์ถ๋ ฅ ํฌ๋งท
๋ชจ๋ ์ถ๋ ฅ์ Markdown ํ์์ผ๋ก ์ ๊ณต๋ฉ๋๋ค:
```markdown
# {๋ก๋ฉ ํ์
} ์๋๋ฆฌ์ค
## ๋ฉํ๋ฐ์ดํฐ
- ๋ก๋ฉ ์ผ์: {timestamp}
- ์์ค: {spec-folder}
- ํํฐ: {filter-type}
- ์๋๋ฆฌ์ค ์: {count}
## ์๋๋ฆฌ์ค ๋ชฉ๋ก
{actual content}
---
*Loaded by spec-scenario-loader*
E2E ์คํ ๊ฒฐ๊ณผ ์ฐ๋
์คํจ ์๋๋ฆฌ์ค ์ถ์
// .spec-it/execute/{sessionId}/logs/e2e-results.json
{
"timestamp": "2026-01-30T15:00:00Z",
"total": 15,
"passed": 13,
"failed": 2,
"failures": [
{
"scenarioId": "SC-003",
"file": "screen-dashboard.md",
"error": "Timeout waiting for price update",
"screenshot": "screenshots/sc-003-failure.png"
}
]
}
--failed ๋ชจ๋ ์ถ๋ ฅ
# ์คํจํ ์๋๋ฆฌ์ค (2๊ฑด)
## SC-003: ์ค์๊ฐ ์ฃผ๊ฐ ์
๋ฐ์ดํธ
**ํ์ผ:** screen-dashboard.md
**์๋ฌ:** Timeout waiting for price update
**์คํฌ๋ฆฐ์ท:** screenshots/sc-003-failure.png
### ์๋ณธ ์๋๋ฆฌ์ค
{scenario content}
### ์คํจ ๋ถ์
- WebSocket ์ฐ๊ฒฐ ์ง์ฐ ๊ฐ๋ฅ์ฑ
- Mock ์๋ฒ ์๋ต ํ์ธ ํ์
---
๊ด๋ จ Skill
spec-test-loader: ํ ์คํธ ๊ณํ์ ๋ก๋ฉspec-component-loader: ์ปดํฌ๋ํธ ์คํ ๋ก๋ฉspec-it-execute: Phase 7์์ ์ด skill ์ฌ์ฉ
# Supported AI Coding Agents
This skill is compatible with the SKILL.md standard and works with all major AI coding agents:
Learn more about the SKILL.md standard and how to use these skills with your preferred AI coding agent.