Loading...
Loading...
XP 프랙티스에 맞는 사용자 스토리를 AI와 대화 형식으로 함께 작성하고 TrackerBoot(MCP)에 자동 등록하는 스킬.
npx skill4agent add junhyunny/skills write-story/write-story <project-id>project-idproject-idproject-id❌ TrackerBoot 프로젝트 ID가 필요합니다.
프로젝트 ID 없이 실행하면 권한이 있는 임의의 프로젝트에 스토리가 등록될 수 있습니다.
사용법: /write-story <project-id>
예시: /write-story 12345678project-id.agents/skills/write-story/references/persona.md❌ 페르소나 정보가 없습니다.
사용자 스토리는 구체적인 페르소나 없이 작성할 수 없습니다.
먼저 `.agents/skills/write-story/references/persona.md` 파일을 작성해주세요.구상하고 계신 사용자 시나리오를 설명해주세요.
누가 어떤 상황에서 무엇을 하려는지 자유롭게 서술해주시면 됩니다.
하나의 시나리오를 작은 스토리들로 나눠드리겠습니다.
예시:
"쇼핑몰에서 사용자가 상품을 장바구니에 담고, 결제 수단을 선택한 뒤,
주문을 완료하고 확인 이메일을 받는 전체 흐름".agents/skills/write-story/references/story-splitting-guide.md"버튼 하나 추가"가 너무 작아 보여도, UI 인터랙션 흐름 단위에서는 유효한 스토리다.
## 📋 스토리 분리 결과
시나리오를 [N]개의 스토리로 나눴습니다.
---
**[1] [스토리 제목]**
### Why
**As** [페르소나]
**I want** [기능]
**So that** [가치]
> 분리 이유: [왜 이 단위로 나눴는지]
**[2] [스토리 제목]**
### Why
**As** [페르소나]
**I want** [기능]
**So that** [가치]
> 분리 이유: [왜 이 단위로 나눴는지]
...
---
이 분리가 적절한가요?
→ "ok" — 인수 기준 작성으로 진행
→ "split [번호]" — 더 잘게 나누기
→ "merge [번호] [번호]" — 합치기
→ "edit [번호]" — 수정ac-writing-guide.mdac-writing-guide.md## 📋 인수 기준 초안 (전체 [N]개 스토리)
---
### [1] [스토리 제목]
```gherkin
Scenario: [시나리오 이름]
Given [사전 조건]
When [사용자 행동]
Then [기대되는 결과]
Scenario: [시나리오 이름]
Given [사전 조건]
When [사용자 행동]
Then [기대되는 결과]Scenario: [시나리오 이름]
Given [사전 조건]
When [사용자 행동]
Then [기대되는 결과]
표시 후:
PAUSE. 변경 사항 반영 후 재표시. "done" 을 받으면 Step 4로 진행한다.
AC 작성 상세 규칙은 `.agents/skills/write-story/references/ac-writing-guide.md` 참조.
---
## Step 4: 레이블 선택
### 4-1. 레이블 추천
전체 스토리 내용을 분석하여 공통 레이블과 개별 레이블을 추천한다.
스토리 번호는 `S1`, `S2` 형식으로 표기하고, 연속된 범위는 `S1~S4` 형식으로 묶어 표시한다.
PAUSE. 변경 사항 반영 후 재표시. "ok" / "done" 을 받으면 레이블을 확정하고 4-2로 진행한다.
### 4-2. 관련 스토리 조회 및 문맥 반영
레이블이 확정되면, TrackerBoot MCP로 동일 프로젝트 내 동일 레이블의 기존 스토리를 조회한다.
조회 시 반드시 Step 0에서 저장한 `project-id`를 함께 전달한다.
**관련 스토리가 없으면:** 조용히 진행한다.
**관련 스토리가 있으면:** 다음 순서로 분석한다.
#### 1) 기존 스토리 목록 표시
#### 2) 문맥 분석
기존 스토리들에서 다음 항목을 추출한다:
- **페르소나 표현** — "As a" 뒤에 쓰인 페르소나 명칭 (기존과 일치시킴)
- **동사/행동 표현** — "I want to" 뒤에 쓰인 동사 패턴 (기존 용어 우선)
- **화면·UI 용어** — 기존 스토리에서 사용한 화면 이름, 버튼 명칭
- **AC 형식** — GIVEN/WHEN/THEN 작성 스타일 및 상세 수준
- **중복 스코프** — 새 스토리와 동일하거나 겹치는 기능
#### 3) 변경이 필요한 경우 개발자에게 알림
분석 결과 새 스토리 조정이 필요하면 변경 사항을 표시하고 확인을 받는다:
PAUSE. "ok" 를 받으면 스토리와 AC에 조정 사항을 반영하고 Step 5로 진행한다.
**변경이 필요하지 않은 경우:** 조용히 Step 5로 진행한다.
---
## Step 5: 최종 확인
완성된 전체 스토리 목록을 표시하고 최종 승인을 받는다.
```markdown
## ✅ 최종 스토리 Preview ([N]개)
---
### [1] [스토리 제목]
### Why
**As** [페르소나]
**I want** [기능]
**So that** [가치]
### Acceptance Criteria
```gherkin
Scenario: [시나리오 이름]
Given [조건]
When [행동]
Then [결과]
PAUSE.
---
## Step 6: TrackerBoot 등록
개발자가 확인하면 TrackerBoot MCP로 스토리를 **역순(마지막 스토리부터)**으로 등록한다.
> TrackerBoot는 새로 등록된 스토리를 목록 상단에 추가하므로, 원하는 순서대로 화면에 표시되려면 **마지막 스토리(S[N])부터 첫 번째 스토리(S1) 순서**로 등록해야 한다.
### MCP 도구
### 등록 절차
스토리마다 다음 2단계로 등록한다. **S[N] → S[N-1] → ... → S[1] 순서로 진행한다.**
**1단계 — 스토리 생성:**
라벨은 MCP가 지원하지 않으므로 `description`의 `**Notes:**` 섹션에 ul 형식으로 포함한다.
추후 MCP 서버가 라벨 생성을 지원하면 `labels` 파라미터를 함께 전달한다.
```json
{
"projectId": "[Step 0에서 저장한 project-id]",
"title": "[스토리 제목]",
"storyType": "Feature",
"description": "### Why\n\n**As** [페르소나]\n**I want** [기능]\n**So that** [가치]\n\n**Notes:**\n\n- [레이블1]\n- [레이블2]"
}{
"storyId": "[생성된 스토리 ID]",
"titles": [
"GIVEN [조건] WHEN [행동] THEN [결과]",
"GIVEN [조건] WHEN [행동] THEN [결과]"
]
}⏳ [N/N] 등록 중... [마지막 스토리 제목]
✅ [N/N] [마지막 스토리 제목] — 완료 (ID: [스토리 ID])
⏳ [N-1/N] 등록 중... [N-1번째 스토리 제목]
✅ [N-1/N] [N-1번째 스토리 제목] — 완료 (ID: [스토리 ID])
...
⏳ [1/N] 등록 중... [첫 번째 스토리 제목]
✅ [1/N] [첫 번째 스토리 제목] — 완료 (ID: [스토리 ID])✅ 전체 [N]개 스토리 등록 완료
등록된 스토리:
- #[스토리 ID] [스토리 제목]
- #[스토리 ID] [스토리 제목]
...
→ /tdd-plan <project-id> <story-id> 로 각 스토리의 TDD 세션을 시작할 수 있습니다.❌ [N번 스토리] 등록 실패: [오류 메시지]
→ "retry" — 다시 시도
→ "skip" — 이 스토리 건너뛰고 다음으로
→ "copy" — 해당 스토리 내용을 Markdown 형식으로 출력
→ "cancel" — 전체 등록 중단| 파일 | 사용 시점 |
|---|---|
| Step 2 스토리 분리 시 |
| Step 2 스토리 초안 형식 |
| Step 3 AC 작성 시 |