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.