Files
tutor-service/.opencode/commands/weave-spec.md

228 lines
7.2 KiB
Markdown
Raw Normal View History

---
description: 요구사항 정제 및 검증 기준 추출
---
# /weave-spec - 요구사항 정제
## 개요
기획 문서나 자연어 요구사항을 **구조화된 명세**로 정제합니다.
각 요구사항에서 **검증 기준(Acceptance Criteria)**을 추출하여, 이후 구현 완료의 성공 판정 기준으로 사용합니다.
**입력 방식**: `/weave-design`과 동일
- 정확한 경로: `docs/`, `wiki/spec.md`
- 자연어 힌트: `기획 폴더`, `README`
> 이 커맨드는 **선택 사항**입니다. `/weave-design`을 바로 실행해도 됩니다.
> 요구사항이 복잡하거나, 구현 완료 기준을 명확히 하고 싶을 때 사용합니다.
---
## 실행
```txt
weave command=spec docsPath="$ARGUMENTS"
```
---
## 사전 조건
`/weave-init`이 실행되어 있어야 합니다.
실행되지 않았다면 자동으로 init을 먼저 수행합니다.
---
## 실행 흐름
```
0. INIT CHECK
1. RESOLVE (입력 해석 → 실제 경로 찾기)
2. ANALYZE (문서에서 요구사항 추출)
3. STRUCTURE (요구사항 분류 + 검증 기준 도출)
4. REVIEW (유저에게 제시 → 피드백)
5. SAVE (스펙 파일 생성)
```
---
## 단계별 상세
### Step 0: INIT CHECK
`.opencode/weave/state.yaml` 존재 확인. 없으면 `/weave-init` 자동 실행.
### Step 1: RESOLVE
`/weave-design`과 동일한 경로 해석 로직. (정확한 경로, 디렉토리 힌트, 시간 힌트, 내용 힌트 등)
### Step 2: ANALYZE
**수행 작업**:
1. 해석된 경로의 모든 문서 읽기
2. 기능 요구사항과 비기능 요구사항 분리
3. 암묵적 요구사항 식별 (명시되지 않았지만 당연히 필요한 것)
4. 요구사항 간 의존관계 파악
5. 과거 유사 프로젝트 검색 (Memory 시스템)
### Step 3: STRUCTURE
각 요구사항을 정제하고, **검증 기준**을 도출합니다.
#### 요구사항 분류
| 분류 | 설명 | 예시 |
|------|------|------|
| `functional` | 시스템이 해야 하는 동작 | 사용자가 로그인할 수 있다 |
| `constraint` | 기술적/비즈니스 제약 | 데이터를 외부 서버로 전송하지 않는다 |
| `performance` | 성능 요구 | 목록 로딩 2초 이내 |
| `ux` | 사용성/접근성 요구 | 모바일에서도 사용 가능해야 한다 |
#### 우선순위 (MoSCoW)
| 값 | 의미 |
|----|------|
| `must` | 없으면 출시 불가 |
| `should` | 강력히 권장, 가능하면 포함 |
| `could` | 있으면 좋지만 없어도 됨 |
| `wont` | 이번 범위에서 명시적으로 제외 |
#### 검증 기준 유형
| type | 의미 | 실행 방법 |
|------|------|----------|
| `e2e` | 브라우저/UI 시나리오 테스트 | Playwright, Cypress 등 |
| `integration` | API/서비스 간 통합 테스트 | supertest, httpx, curl 등 |
| `script` | CLI/스크립트 실행 결과 확인 | shell script, node script |
| `performance` | 성능 기준 충족 | benchmark, lighthouse 등 |
| `manual` | 자동화 불가, 사용자 확인 | 체크리스트로 유저 핸드오프에 포함 |
#### 검증 기준 작성 원칙
- **모호하지 않을 것**: "잘 동작한다" ✗ → "저장 후 목록에서 확인 가능" ✓
- **실행 가능할 것**: 구체적인 입력과 기대 결과를 명시
- **독립적일 것**: 하나의 기준이 하나의 시나리오만 검증
- **유형은 정직하게**: E2E가 불가능한 것은 `manual`로. 억지로 자동화하지 않음
### Step 4: REVIEW
구조화된 명세를 유저에게 제시합니다:
```markdown
## 요구사항 명세
**스펙 이름**: `emotion-diary` (변경 가능)
### 기능 요구사항 (Functional)
**R1** [must]: 사용자가 감정을 선택하고 일기를 저장할 수 있다
- [e2e] 감정 선택 → 텍스트 입력 → 저장 → 목록에서 확인
- [e2e] 빈 텍스트로 저장 시도 → 에러 메시지 표시
**R2** [must]: 저장된 일기 목록을 조회할 수 있다
- [e2e] 저장된 일기 3개가 목록에 최신순으로 표시
### 비기능 요구사항
**R3** [should]: 일기 목록이 2초 이내에 로딩된다
- [performance] 100개 일기 기준 로딩 시간 < 2000ms
**R4** [could]: 오프라인에서도 저장된 일기를 조회할 수 있다
- [manual] 네트워크 차단 후 기존 일기 목록 접근 가능
---
빠진 요구사항이 있거나, 검증 기준을 수정하고 싶으면 말씀해주세요.
```
### Step 5: SAVE
유저 승인 시 스펙 파일을 생성합니다.
**파일 경로**: `.opencode/weave/specs/{spec-name}.yaml`
```yaml
spec_name: "emotion-diary"
project_name: "감정 일기 앱"
created_at: "2026-02-06"
source_docs:
- "docs/requirements.md"
requirements:
- id: R1
description: "사용자가 감정을 선택하고 일기를 저장할 수 있다"
category: functional
priority: must
acceptance:
- id: AC-R1-1
scenario: "감정 선택 → 텍스트 입력 → 저장 → 목록에서 확인"
type: e2e
- id: AC-R1-2
scenario: "빈 텍스트로 저장 시도 → 에러 메시지 표시"
type: e2e
- id: R2
description: "저장된 일기 목록을 조회할 수 있다"
category: functional
priority: must
acceptance:
- id: AC-R2-1
scenario: "저장된 일기 3개가 목록에 최신순으로 표시"
type: e2e
- id: R3
description: "일기 목록이 2초 이내에 로딩된다"
category: performance
priority: should
acceptance:
- id: AC-R3-1
scenario: "100개 일기 기준 로딩 시간 < 2000ms"
type: performance
- id: R4
description: "오프라인에서도 저장된 일기를 조회할 수 있다"
category: constraint
priority: could
acceptance:
- id: AC-R4-1
scenario: "네트워크 차단 후 기존 일기 목록 접근 가능"
type: manual
```
**완료 메시지**:
```markdown
## 요구사항 명세가 생성되었습니다
📁 파일: `.opencode/weave/specs/emotion-diary.yaml`
📊 요구사항: 4개 (functional 2, performance 1, constraint 1)
🎯 검증 기준: 5개 (e2e 3, performance 1, manual 1)
### 다음 단계
이 명세를 기반으로 실행 계획을 세우려면:
`/weave-design emotion-diary`
```
---
## 완료 후 검증 (필수)
스펙 파일 생성 후, 반드시 다음을 확인합니다:
1. **스펙 파일 존재 확인**: `.opencode/weave/specs/{spec-name}.yaml` 존재 검증
2. **YAML 파싱 가능 확인**: 파일 내용이 유효한 YAML인지 검증
3. **검증 실패 시**: 유저에게 오류를 알리고 재생성 시도
---
## 핵심 원칙
1. **명세만 수립, 계획/구현 금지**: Phase 분할이나 코드 구현은 하지 않음
2. **검증 기준은 구체적으로**: 입력 → 기대결과 형태로 작성
3. **유형은 정직하게**: 자동화 불가능하면 `manual`. 억지로 끼워맞추지 않음
4. **스펙 이름은 kebab-case**: 이후 `/weave-design`의 플랜 이름으로 사용됨
5. **wont도 기록**: 명시적으로 제외한 것을 기록해야 나중에 "왜 안 했어?"를 방지