@simplysm/sd-claude 14.0.62 → 14.0.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/claude/references/sd-simplysm-v14/sd-claude/assets.md +3 -2
- package/claude/rules/sd-ask.md +242 -0
- package/claude/rules/sd-clarify.md +36 -131
- package/claude/rules/sd-claude-rules.md +6 -6
- package/claude/rules/sd-response-format.md +3 -1
- package/claude/skills/sd-issue/SKILL.md +6 -2
- package/claude/skills/sd-plan/SKILL.md +22 -0
- package/claude/skills/sd-plan/references/api-spec.md +64 -0
- package/claude/skills/sd-plan/references/db-model-change.md +45 -0
- package/claude/skills/sd-plan/references/sequence-diagram.md +66 -0
- package/claude/skills/sd-plan/references/state-machine.md +83 -0
- package/claude/skills/sd-sit/SKILL.md +141 -0
- package/claude/skills/sd-sit-plan/SKILL.md +159 -0
- package/claude/skills/sd-subdomain/SKILL.md +439 -0
- package/claude/skills/sd-use/SKILL.md +0 -1
- package/package.json +1 -1
- package/claude/skills/sd-deliverable/SKILL.md +0 -320
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
# API/서비스 메서드 명세 작성 가이드
|
|
2
|
+
|
|
3
|
+
서비스 / API 섹션 안에 작성. 메서드별 요청·응답·에러·권한을 상세히 정리한다.
|
|
4
|
+
|
|
5
|
+
## 표현 형식
|
|
6
|
+
|
|
7
|
+
메서드별로 표 또는 정의 블록으로 작성한다.
|
|
8
|
+
|
|
9
|
+
| 항목 | 내용 |
|
|
10
|
+
|---|---|
|
|
11
|
+
| 메서드 | `WorkService.createWork(dto): Promise<Work>` |
|
|
12
|
+
| 요청 (CreateWorkDto) | 필드별 타입·필수·검증 규칙 |
|
|
13
|
+
| 응답 (성공) | 응답 타입의 모든 필드 |
|
|
14
|
+
| 에러 케이스 | 에러 타입 + 발생 조건 |
|
|
15
|
+
| 권한 | 호출 가능한 권한 |
|
|
16
|
+
|
|
17
|
+
## 작성 원칙
|
|
18
|
+
|
|
19
|
+
- 요청 스키마: 필드명·타입·필수/선택·검증 규칙(길이/범위/형식) 모두 명시.
|
|
20
|
+
- 응답 스키마: 모든 반환 필드. nullable 필드 표시.
|
|
21
|
+
- 에러 케이스: 발생 조건과 에러 타입을 짝으로. 사용자 메시지 또는 에러 코드 포함.
|
|
22
|
+
- 권한: Role 명시 + 조건부 권한(예: "본인 데이터만")이면 조건도 명시.
|
|
23
|
+
- 페이지네이션·정렬·필터가 있는 조회 메서드는 그 옵션도 명시.
|
|
24
|
+
|
|
25
|
+
## 좋은 예 (작업 등록)
|
|
26
|
+
|
|
27
|
+
| 항목 | 내용 |
|
|
28
|
+
|---|---|
|
|
29
|
+
| 메서드 | `WorkService.createWork(dto: CreateWorkDto): Promise<Work>` |
|
|
30
|
+
| 요청 | `title (string, 필수, 1~200자, trim)`, `dueDate (Date, 선택, 오늘 이후)`, `assigneeId (uuid, 필수)`, `description (string, 선택, 0~1000자)` |
|
|
31
|
+
| 응답 | `Work { id, title, dueDate (nullable), assigneeId, status: 'pending', createdAt }` |
|
|
32
|
+
| 에러 | `ValidationError` (title 빈/초과, dueDate 과거, description 초과), `NotFoundError` (assigneeId에 해당 User 없음), `PermissionError` (호출자가 ADMIN 아님) |
|
|
33
|
+
| 권한 | `ROLE.ADMIN` |
|
|
34
|
+
|
|
35
|
+
## 좋은 예 (조회 메서드 — 페이지네이션 포함)
|
|
36
|
+
|
|
37
|
+
| 항목 | 내용 |
|
|
38
|
+
|---|---|
|
|
39
|
+
| 메서드 | `WorkService.listWorks(query: ListWorksQuery): Promise<{ items: Work[], total: number }>` |
|
|
40
|
+
| 요청 | `status (Work.status, 선택, 다중 선택 가능)`, `assigneeId (uuid, 선택)`, `keyword (string, 선택, title 부분 일치)`, `page (number, 기본 1)`, `pageSize (number, 기본 20, 최대 100)`, `sort (Enum, 기본 'createdAt:desc')` |
|
|
41
|
+
| 응답 | `{ items: Work[], total: number }` |
|
|
42
|
+
| 에러 | `ValidationError` (pageSize 범위 초과) |
|
|
43
|
+
| 권한 | `ROLE.ADMIN` (전체 조회) / `ROLE.STAFF` (`assigneeId = self` 자동 적용) |
|
|
44
|
+
|
|
45
|
+
## 무엇을 잡아주나
|
|
46
|
+
|
|
47
|
+
- 검증 규칙 (길이·형식·범위) 명시 — Gherkin Scenario 작성의 기반
|
|
48
|
+
- 에러 케이스 누락 — 어떤 입력에 어떤 에러를 내는지
|
|
49
|
+
- 권한 요구사항 — 누가 호출할 수 있는지, 조건부 권한은 어떤 조건인지
|
|
50
|
+
- 응답 필드 누락 — 클라이언트가 어떤 필드를 받는지
|
|
51
|
+
- nullable·선택 필드 — 클라이언트의 처리 분기
|
|
52
|
+
|
|
53
|
+
## 나쁜 예
|
|
54
|
+
|
|
55
|
+
- "title을 받아서 Work 생성" — 검증 규칙·에러 누락
|
|
56
|
+
- 에러 케이스에 "ValidationError 발생"만 기록 (어떤 조건에 발생하는지 모호)
|
|
57
|
+
- 권한 누락 (누구나 호출 가능한지 ADMIN만인지 모호)
|
|
58
|
+
- 응답을 `Work` 한 단어로만 표현 (필드 정보 모호)
|
|
59
|
+
- 페이지네이션 메서드인데 `page`/`pageSize` 기본값·최대값 누락
|
|
60
|
+
|
|
61
|
+
## 기존 시그니처와의 차이
|
|
62
|
+
|
|
63
|
+
- 시그니처: `createWork(dto): Promise<Work>` — 함수의 형태만
|
|
64
|
+
- 명세: 검증 규칙 + 에러 케이스 + 권한 + 응답 필드까지 — 함수의 계약 전체
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# DB 모델 변경 표 작성 가이드
|
|
2
|
+
|
|
3
|
+
엔티티 섹션 안에 작성. 신규/수정 모델·컬럼·관계·인덱스를 하나의 매트릭스로 정리한다.
|
|
4
|
+
|
|
5
|
+
## 표현 형식
|
|
6
|
+
|
|
7
|
+
| 모델 | 변경 종류 | 컬럼·내용 | 인덱스 |
|
|
8
|
+
|---|---|---|---|
|
|
9
|
+
|
|
10
|
+
컬럼 단위 표현이 더 명확하면 컬럼 단위 행으로 풀어 쓴다.
|
|
11
|
+
|
|
12
|
+
## 작성 원칙
|
|
13
|
+
|
|
14
|
+
- 변경 종류: `신규` / `컬럼 추가` / `컬럼 수정` / `컬럼 삭제` / `인덱스 추가/삭제` / `관계 변경`
|
|
15
|
+
- 컬럼은 타입·NULL 여부·기본값·외래키·`ON DELETE` 동작을 모두 명시.
|
|
16
|
+
- 인덱스는 단일/복합 구분, 사용 목적(조회 빈번 컬럼) 명시.
|
|
17
|
+
- 외래키는 `FK → {대상모델}.{컬럼}` 형식. 카스케이드 동작 명시.
|
|
18
|
+
- 컬럼 길이·정밀도는 도메인 값 범위에 충분한지 검토 후 결정.
|
|
19
|
+
|
|
20
|
+
## 좋은 예 (작업 등록)
|
|
21
|
+
|
|
22
|
+
| 모델 | 변경 | 컬럼·내용 | 인덱스 |
|
|
23
|
+
|---|---|---|---|
|
|
24
|
+
| `Work` | 신규 | `id (uuid, PK)`, `title (varchar 200, NOT NULL)`, `dueDate (date, NULL)`, `assigneeId (uuid, NOT NULL, FK → User.id)`, `status (varchar 20, NOT NULL, default 'pending')`, `createdAt (datetime, NOT NULL, default NOW())` | `assigneeId`, `status` |
|
|
25
|
+
| `WorkLog` | 신규 | `id (uuid, PK)`, `workId (uuid, NOT NULL, FK → Work.id, ON DELETE CASCADE)`, `userId (uuid, NOT NULL, FK → User.id)`, `action (varchar 20)`, `createdAt (datetime, NOT NULL, default NOW())` | `workId`, `userId` |
|
|
26
|
+
| `User` | 컬럼 추가 | `lastWorkAt (datetime, NULL)` | — |
|
|
27
|
+
|
|
28
|
+
## 검증 체크리스트
|
|
29
|
+
|
|
30
|
+
작성 후 다음을 확인한다.
|
|
31
|
+
|
|
32
|
+
- 모든 외래키에 `ON DELETE` 동작 명시했는가 (`CASCADE` / `RESTRICT` / `SET NULL`)
|
|
33
|
+
- 조회 빈번한 컬럼에 인덱스가 있는가
|
|
34
|
+
- `NOT NULL` 컬럼에 기본값이 있거나 INSERT 시 반드시 채워지는가
|
|
35
|
+
- 신규 테이블의 PK가 정의됐는가
|
|
36
|
+
- 컬럼 타입·길이가 도메인 값 범위에 충분한가
|
|
37
|
+
- 복합 유일 제약(unique)이 필요한 케이스를 놓치지 않았는가
|
|
38
|
+
|
|
39
|
+
## 나쁜 예
|
|
40
|
+
|
|
41
|
+
- "Work 테이블 추가" — 컬럼 누락
|
|
42
|
+
- 외래키 동작 명시 안 함 — `ON DELETE CASCADE` vs `RESTRICT` vs `SET NULL` 모호
|
|
43
|
+
- 인덱스 누락 — 조회 자주 하는 컬럼인데 INDEX 없음
|
|
44
|
+
- `NOT NULL`인데 기본값·INSERT 경로 모호 (마이그레이션 시 실패 위험)
|
|
45
|
+
- 길이 미정 (`varchar`만 적고 길이 없음)
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# 시퀀스 다이어그램 작성 가이드
|
|
2
|
+
|
|
3
|
+
구현 설계 시작(영향 범위 다음)에 작성. 모듈 간 호출 흐름을 mermaid `sequenceDiagram`으로 시각화한다.
|
|
4
|
+
|
|
5
|
+
## 작성 원칙
|
|
6
|
+
|
|
7
|
+
- 참여자(`participant`)는 패키지·모듈 단위로 정의 (예: `client-admin`, `server`, `WorkService`, `db-main`).
|
|
8
|
+
- 외부 사용자는 `actor`로 표시.
|
|
9
|
+
- 호출 화살표는 동기 `->>`, 응답 `-->>`. 비동기는 `->>` + `Note`로 명시.
|
|
10
|
+
- 트랜잭션·반복·분기는 `Note`/`alt`/`loop`로 표현.
|
|
11
|
+
- 권한 체크·검증·로그 같은 부수 동작도 메시지로 표시 (자주 누락되는 영역).
|
|
12
|
+
- 한 다이어그램의 메시지 수는 20개 이내. 넘으면 단계별로 분할.
|
|
13
|
+
|
|
14
|
+
## 좋은 예 (작업 등록)
|
|
15
|
+
|
|
16
|
+
```mermaid
|
|
17
|
+
sequenceDiagram
|
|
18
|
+
actor U as 관리자
|
|
19
|
+
participant UI as client-admin
|
|
20
|
+
participant API as server (라우터)
|
|
21
|
+
participant SVC as WorkService
|
|
22
|
+
participant DB as db-main
|
|
23
|
+
participant Q as 알림 큐
|
|
24
|
+
|
|
25
|
+
U->>UI: 작업 등록 폼 저장
|
|
26
|
+
UI->>API: createWork(dto)
|
|
27
|
+
API->>API: 권한 체크 (ROLE.ADMIN)
|
|
28
|
+
API->>SVC: createWork(dto)
|
|
29
|
+
SVC->>SVC: dto 검증
|
|
30
|
+
|
|
31
|
+
Note over SVC,DB: TX BEGIN (READ COMMITTED)
|
|
32
|
+
SVC->>DB: INSERT Work
|
|
33
|
+
SVC->>DB: INSERT WorkLog (action='created')
|
|
34
|
+
Note over SVC,DB: TX COMMIT
|
|
35
|
+
|
|
36
|
+
SVC->>Q: enqueue 담당자 알림 (TX 외부)
|
|
37
|
+
SVC-->>API: Work
|
|
38
|
+
API-->>UI: 201 Created
|
|
39
|
+
UI-->>U: 토스트 + 목록 갱신
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## 무엇을 명시해야 하나
|
|
43
|
+
|
|
44
|
+
- **권한 체크 위치**: 어느 참여자에서? (API 진입? Service?)
|
|
45
|
+
- **트랜잭션 경계**: BEGIN ~ COMMIT을 `Note over`로 명시
|
|
46
|
+
- **외부 호출**: 알림·이메일·외부 API. TX 외부에 둘지 안에 둘지
|
|
47
|
+
- **에러 분기**: 실패 케이스가 핵심이면 `alt`/`else`로 표현
|
|
48
|
+
- **비동기 처리**: 반환을 기다리지 않으면 `Note`로 명시
|
|
49
|
+
|
|
50
|
+
## 나쁜 예
|
|
51
|
+
|
|
52
|
+
- `participant`에 클래스명만 (`WorkServiceImpl`) — 모듈/패키지 컨텍스트 누락
|
|
53
|
+
- 권한 체크 누락 (그냥 `SVC.createWork`만 호출하는 걸로 끝)
|
|
54
|
+
- 트랜잭션 경계 표시 없음 (어디서 BEGIN/COMMIT인지 모호)
|
|
55
|
+
- 외부 호출이 TX 안에 있는데 명시 안 됨 (락 길어짐 위험)
|
|
56
|
+
- 한 다이어그램에 모든 시나리오를 욱여넣어 메시지 30개 이상
|
|
57
|
+
|
|
58
|
+
## sd-wbs mermaid와의 차이
|
|
59
|
+
|
|
60
|
+
| 구분 | sd-wbs (사용자 시점) | sd-plan 시퀀스 (개발자 시점) |
|
|
61
|
+
|---|---|---|
|
|
62
|
+
| 노드 | 사용자가 인지하는 단계 | 패키지/모듈/클래스 |
|
|
63
|
+
| 동작 라벨 | "도서 검색", "대출 신청" | `findWork(id)`, `createWork(dto)` |
|
|
64
|
+
| 부수 동작 | (없음) | 트랜잭션, 권한 체크, 알림 큐 |
|
|
65
|
+
|
|
66
|
+
같은 정보를 양쪽에 중복하지 않는다.
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# 상태 전이도 (FSM) 작성 가이드
|
|
2
|
+
|
|
3
|
+
엔티티 섹션 인접에 작성. 도메인 객체의 내부 상태 머신을 mermaid `stateDiagram-v2` + 전이 표로 정리한다.
|
|
4
|
+
|
|
5
|
+
## 표현 형식
|
|
6
|
+
|
|
7
|
+
다이어그램과 표를 함께 작성한다.
|
|
8
|
+
|
|
9
|
+
### 다이어그램
|
|
10
|
+
|
|
11
|
+
```mermaid
|
|
12
|
+
stateDiagram-v2
|
|
13
|
+
[*] --> {초기상태}: {생성 이벤트}
|
|
14
|
+
{상태} --> {다음상태}: {전이 이벤트}
|
|
15
|
+
{상태} --> [*]
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
### 전이 표
|
|
19
|
+
|
|
20
|
+
| 현재 상태 | 이벤트 | 다음 상태 | 가드 | 사이드 이펙트 |
|
|
21
|
+
|---|---|---|---|---|
|
|
22
|
+
|
|
23
|
+
## 작성 원칙
|
|
24
|
+
|
|
25
|
+
- 상태 라벨은 DB `status` 컬럼 값 그대로 사용 (`pending`, `in_progress` 등). 한글 라벨 금지.
|
|
26
|
+
- 전이 이벤트는 메서드명 또는 시스템 이벤트명.
|
|
27
|
+
- 가드: 권한 조건·데이터 조건·타이밍 조건. 비어있으면 `—`.
|
|
28
|
+
- 사이드 이펙트: 알림·로그·외부 호출·다른 컬럼 갱신. 자주 누락되는 영역이라 명시 강제.
|
|
29
|
+
- 모든 가능 전이를 빠짐없이 나열한다 (완전성).
|
|
30
|
+
- 종료 상태(`[*]`)로 가는 경로를 명시.
|
|
31
|
+
|
|
32
|
+
## 좋은 예 (작업 도메인)
|
|
33
|
+
|
|
34
|
+
```mermaid
|
|
35
|
+
stateDiagram-v2
|
|
36
|
+
[*] --> pending: createWork
|
|
37
|
+
pending --> in_progress: startWork
|
|
38
|
+
pending --> cancelled: cancelWork
|
|
39
|
+
in_progress --> completed: completeWork
|
|
40
|
+
in_progress --> blocked: blockWork
|
|
41
|
+
in_progress --> cancelled: cancelWork
|
|
42
|
+
blocked --> in_progress: unblockWork
|
|
43
|
+
completed --> [*]
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
| 현재 | 이벤트 | 다음 | 가드 | 사이드 이펙트 |
|
|
47
|
+
|---|---|---|---|---|
|
|
48
|
+
| (initial) | `createWork` | `pending` | — | 담당자 알림 |
|
|
49
|
+
| `pending` | `startWork` | `in_progress` | 호출자 = 담당자 | `startedAt` 기록 |
|
|
50
|
+
| `pending` | `cancelWork` | `cancelled` | 호출자 = `ADMIN` | 담당자 알림 |
|
|
51
|
+
| `in_progress` | `completeWork` | `completed` | 호출자 = 담당자 | 완료 알림 + 보고서 생성 |
|
|
52
|
+
| `in_progress` | `blockWork` | `blocked` | 사유 필수 | 관리자 알림 |
|
|
53
|
+
| `in_progress` | `cancelWork` | `cancelled` | 호출자 = `ADMIN` | 담당자 알림 |
|
|
54
|
+
| `blocked` | `unblockWork` | `in_progress` | 호출자 = 담당자/`ADMIN` | — |
|
|
55
|
+
|
|
56
|
+
## 검증 체크리스트
|
|
57
|
+
|
|
58
|
+
작성 후 다음을 확인한다.
|
|
59
|
+
|
|
60
|
+
- 모든 상태에서 가능한 모든 이벤트가 표에 있는가
|
|
61
|
+
- 종료 상태(`[*]`)로 가는 경로가 정의됐는가
|
|
62
|
+
- 가드 조건의 검증 위치가 명확한가 (Service 안? DB constraint?)
|
|
63
|
+
- 사이드 이펙트가 트랜잭션 내부인지 외부인지 (알림은 보통 TX 외부)
|
|
64
|
+
- 동시성 — 같은 객체에 두 이벤트가 동시에 오면? 락·낙관적 동시성 정책
|
|
65
|
+
|
|
66
|
+
## 나쁜 예
|
|
67
|
+
|
|
68
|
+
- 상태 라벨이 한글 (`진행중`) — DB `status` 값과 불일치, sd-wbs와 헷갈림
|
|
69
|
+
- 가드·사이드 이펙트 컬럼 빠진 단순 다이어그램 (전이만 그림)
|
|
70
|
+
- 일부 전이 누락 — 어떤 상태에서 `cancelWork`가 가능한지 모호
|
|
71
|
+
- 종료 상태로 가는 경로 누락
|
|
72
|
+
- 사이드 이펙트(알림·로그)를 트랜잭션 안에 두면서 명시 안 함
|
|
73
|
+
|
|
74
|
+
## sd-wbs stateDiagram과의 차이
|
|
75
|
+
|
|
76
|
+
| 구분 | sd-wbs (사용자 시점) | sd-plan FSM (개발자 시점) |
|
|
77
|
+
|---|---|---|
|
|
78
|
+
| 라벨 | "진행 중" (사용자 표시) | `in_progress` (DB 컬럼 값) |
|
|
79
|
+
| 트리거 | "완료 표시" (사용자 동작) | `completeWork` (메서드명) |
|
|
80
|
+
| 가드 | (없음 또는 단순 권한) | 권한·데이터·타이밍 조건 |
|
|
81
|
+
| 사이드 이펙트 | (없음) | 알림·로그·외부 호출 명시 |
|
|
82
|
+
|
|
83
|
+
같은 객체 상태라도 정보 깊이가 다르다. sd-wbs와 sd-plan에 같은 정보를 중복 작성하지 않는다.
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sd-sit
|
|
3
|
+
description: SIT 문서(sit.md) 기반 검증을 실제로 실행하며 결과를 갱신하는 스킬. "SIT 검증해줘", "SIT 진행", "SIT 실행" 등을 요청할 때 사용한다.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# sd-sit: SIT 검증 진행
|
|
7
|
+
|
|
8
|
+
sit.md 체크리스트를 위에서 아래로 자동 실행하며 통과 항목을 `[x]`로 갱신한다. 한계 도달 시 즉시 중단하고 후속 액션을 제안한다.
|
|
9
|
+
|
|
10
|
+
## 공통 규칙
|
|
11
|
+
|
|
12
|
+
### 출력 갱신 형식
|
|
13
|
+
|
|
14
|
+
각 항목은 실행 직후 sit.md에서 다음 형식으로 갱신한다.
|
|
15
|
+
|
|
16
|
+
- 통과: `- [x] {항목명} — {결과 1줄 요약}`
|
|
17
|
+
- 실패(중단점): `- [ ] {항목명} — 실패: {사유 1줄}`
|
|
18
|
+
- 미수행: 변경하지 않는다 (`- [ ] {항목명}` 그대로 둔다)
|
|
19
|
+
|
|
20
|
+
체크박스 마커는 `[x]`/`[ ]` 두 개만 사용한다. `[!]`·`[?]`·`[/]` 등 비표준 마커 금지.
|
|
21
|
+
결과 1줄 요약은 항목과 같은 줄 끝에 ` — ` 구분자로 붙인다. 들여쓰기 자식 항목·별도 진행 표 등 다른 위치에 추가 금지.
|
|
22
|
+
|
|
23
|
+
### 중단 트리거
|
|
24
|
+
|
|
25
|
+
다음 사유 중 하나라도 발생하면 즉시(MUST) 중단하고 Step 4로 진입한다. 추정·우회·임의 다음 항목 진행 금지.
|
|
26
|
+
|
|
27
|
+
- playwright 자동화 한계 (셀렉터 미발견·페이지 로드 실패·인증 차단 등)
|
|
28
|
+
- 코드 버그 (애플리케이션 예외·네트워크 오류 등)
|
|
29
|
+
- 데이터 시드 부족 (검증에 필요한 사전 데이터 없음)
|
|
30
|
+
- 권한·설정 누락 (DB·계정·환경변수 부재)
|
|
31
|
+
- 그 외 어떤 사유든 자동 실행이 막히는 경우
|
|
32
|
+
|
|
33
|
+
### 임의 변형 금지
|
|
34
|
+
|
|
35
|
+
CRITICAL: 입력 sit.md에 없던 항목을 추가하거나 항목 문구를 의역·축약하지 않는다.
|
|
36
|
+
`[x]`는 실제 통과한 항목에만 부여한다 (통과하지 않은 항목에 `[x]` 거짓 부여 금지).
|
|
37
|
+
한계에 부딪힌 항목은 `- [ ] {항목명} — 실패: {사유 1줄}` 형식으로 반드시 갱신한 뒤 중단한다.
|
|
38
|
+
sit.md 외 파일은 수정·생성하지 않는다 (`.claude/`·소스 디렉토리·다른 `.tasks/` 하위 등).
|
|
39
|
+
|
|
40
|
+
## Step 1: 입력 sit.md 확인
|
|
41
|
+
|
|
42
|
+
호출 시 전달된 sit.md 경로를 식별하여 끝까지 읽는다.
|
|
43
|
+
|
|
44
|
+
### 입력 부재 처리
|
|
45
|
+
|
|
46
|
+
sit.md 경로가 없거나 파일이 존재하지 않으면, 임의로 sit.md를 신규 생성하지 말고 `sd-clarify` 지침에 따라 다음을 안내한다.
|
|
47
|
+
|
|
48
|
+
- 입력으로 받을 sit.md 경로 요청
|
|
49
|
+
- sit.md가 없는 경우 `/sd-sit-plan` 호출 권유
|
|
50
|
+
|
|
51
|
+
## Step 2: 환경 정보 수집
|
|
52
|
+
|
|
53
|
+
sit.md 본문 구조(Task/Story 섹션·단계 헤더·항목 리스트)를 파악한 뒤, sit.md에 등장하는 단계에 따라 사용자에게 환경 정보를 사전 요청한다.
|
|
54
|
+
|
|
55
|
+
### 수집 항목
|
|
56
|
+
|
|
57
|
+
sit.md에 등장하는 단계에 따라 필요한 항목만 묻는다.
|
|
58
|
+
|
|
59
|
+
- 메뉴 진입·CRUD 흐름·엑셀 업·다운로드·매트릭스/결과 검증 항목 존재 시: 접속 주소
|
|
60
|
+
- 데이터 시드·DB 권한·설정 항목 존재 시: DB 연결 정보 또는 시드 처리 책임자(sd-sit 자체 시도 vs 사용자 위임)
|
|
61
|
+
|
|
62
|
+
CRITICAL: 접속 주소를 임의로 결정하지 않는다 (`http://localhost:XXXX` 추측 금지). 반드시 사용자에게 묻는다.
|
|
63
|
+
|
|
64
|
+
### 명확화 적용
|
|
65
|
+
|
|
66
|
+
수집 항목 요청은 `sd-clarify` 지침을 따른다. 한 번에 하나씩, `sd-ask`의 5블록 형식으로 제시한다.
|
|
67
|
+
|
|
68
|
+
## Step 3: 항목 순차 실행
|
|
69
|
+
|
|
70
|
+
sit.md를 위에서 아래로 첫 `[ ]` 항목부터 1개씩 처리한다. 이미 `[x]`된 항목은 다시 실행하지 않고 건너뛴다 (재호출 시 진행 재개 동작).
|
|
71
|
+
|
|
72
|
+
### 3-1. 항목 도구 매핑
|
|
73
|
+
|
|
74
|
+
항목이 속한 단계 헤더에 따라 도구를 선택한다.
|
|
75
|
+
|
|
76
|
+
| 단계 헤더 | 도구 |
|
|
77
|
+
|---|---|
|
|
78
|
+
| 데이터 시드 | SQL/HTTP/CLI 자체 시도 |
|
|
79
|
+
| 메뉴 진입 / CRUD 흐름 / 엑셀 업·다운로드 / 매트릭스·결과 검증 | `playwright-cli` 스킬 호출 |
|
|
80
|
+
|
|
81
|
+
위 분류에 해당하지 않는 단계 헤더의 항목은 처리 방식을 사용자에게 묻는다.
|
|
82
|
+
|
|
83
|
+
### 3-2. 항목 실행
|
|
84
|
+
|
|
85
|
+
도구 호출 후 결과를 판정한다.
|
|
86
|
+
|
|
87
|
+
- 통과: 도구 호출 결과가 항목의 검증 조건을 만족함
|
|
88
|
+
- 실패(중단점): 중단 트리거 중 하나라도 해당함
|
|
89
|
+
|
|
90
|
+
판정 기준이 모호한 경우 임의 판정 금지(NEVER) — 사용자에게 결과를 보고하고 통과/실패 응답을 받는다.
|
|
91
|
+
|
|
92
|
+
### 3-3. sit.md 갱신
|
|
93
|
+
|
|
94
|
+
항목 실행 직후 즉시 sit.md를 갱신한다.
|
|
95
|
+
|
|
96
|
+
- 통과 시: 해당 항목 줄을 `- [x] {항목명} — {결과 1줄 요약}` 형식으로 갱신
|
|
97
|
+
- 실패 시: 해당 항목 줄을 `- [ ] {항목명} — 실패: {사유 1줄}` 형식으로 갱신한 뒤 Step 4로 진행
|
|
98
|
+
|
|
99
|
+
### 3-4. 다음 항목으로 진행
|
|
100
|
+
|
|
101
|
+
통과 후 `[ ]` 항목이 더 있으면 3-1로 돌아가 다음 항목 처리. 모든 항목이 `[x]`로 갱신되면 Step 5로 진행.
|
|
102
|
+
|
|
103
|
+
## Step 4: 중단 처리 및 후속 액션 제안
|
|
104
|
+
|
|
105
|
+
한계 도달로 중단된 경우 다음을 수행한다.
|
|
106
|
+
|
|
107
|
+
### 4-1. 상황 보고
|
|
108
|
+
|
|
109
|
+
다음 형식으로 사용자에게 보고한다.
|
|
110
|
+
|
|
111
|
+
```
|
|
112
|
+
중단점: {sit.md 경로}:{줄번호} — {항목명}
|
|
113
|
+
한계 사유: {1줄 사유}
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### 4-2. 후속 액션 제안
|
|
117
|
+
|
|
118
|
+
추정 원인에 따라 1개 이상의 후속 액션을 제시한다 (`sd-ask` 형식).
|
|
119
|
+
|
|
120
|
+
| 한계 사유 | 후속 액션 후보 |
|
|
121
|
+
|---|---|
|
|
122
|
+
| playwright 자동화 한계 | 셀렉터 점검·DOM 변경 확인 후 `/sd-sit` 재호출 |
|
|
123
|
+
| 코드 버그 | `/sd-debug`로 원인 분석 → 코드 수정 후 `/sd-sit` 재호출 |
|
|
124
|
+
| 데이터 시드 부족 | 시드 SQL/스크립트 실행 후 `/sd-sit` 재호출 |
|
|
125
|
+
| 권한·설정 누락 | DB 권한 부여·환경 변수 설정 후 `/sd-sit` 재호출 |
|
|
126
|
+
|
|
127
|
+
CRITICAL: 후속 액션을 자동으로 호출(`Skill` tool로 sd-debug 등 직접 실행)하지 않는다. 사용자가 처리하도록 안내만 한다.
|
|
128
|
+
|
|
129
|
+
### 4-3. 사용자 처리 후 재개
|
|
130
|
+
|
|
131
|
+
사용자가 처리 후 동일 sit.md 경로로 `/sd-sit`을 재호출하면 Step 3에서 첫 `[ ]` 항목부터 자동 재개된다 (이전 통과 `[x]` 항목은 건너뜀).
|
|
132
|
+
|
|
133
|
+
## Step 5: 완료 보고
|
|
134
|
+
|
|
135
|
+
모든 항목이 `[x]`로 통과되면 다음을 보고한다.
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
SIT 진행 완료: {sit.md 경로}
|
|
139
|
+
- 통과 항목 수: {N}
|
|
140
|
+
- 중단·실패 없음
|
|
141
|
+
```
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sd-sit-plan
|
|
3
|
+
description: 시스템 통합 테스트(SIT) 검증 체크리스트 문서를 생성하는 스킬. "SIT 문서 만들어줘", "통합 테스트 체크리스트", "검증 항목 만들어줘" 등을 요청할 때 사용한다.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# sd-sit-plan: SIT 검증 문서 작성
|
|
7
|
+
|
|
8
|
+
자유 입력(자연어 / 외부 자료 / sd-* 산출물 경로)을 받아 SIT 검증 체크리스트(`sit.md`)를 생성·갱신한다.
|
|
9
|
+
|
|
10
|
+
## Step 1: 입력 자료 수집
|
|
11
|
+
|
|
12
|
+
호출 시 전달된 인자에서 다음 자료를 식별하여 끝까지 읽는다.
|
|
13
|
+
|
|
14
|
+
- **자연어 본문** — 명령 메시지 본문에서 메뉴·화면 정의·검증 요건 추출
|
|
15
|
+
- **파일 경로 (.docx/.xlsx/.pdf/.eml/.msg 등)** — `/sd-doc-extract`로 텍스트·이미지 추출 후 활용
|
|
16
|
+
- **sd-* 산출물 경로 (`.tasks/{...}/wbs.md`·Task 문서)** — Read 도구로 완독
|
|
17
|
+
|
|
18
|
+
### 자료 부족 처리
|
|
19
|
+
|
|
20
|
+
자료에서 메뉴·화면·검증 대상 식별자를 추출할 수 없거나 SIT 항목 1개 이상 도출이 불가하면, 임의로 항목을 채우지 말고 `sd-clarify` 지침에 따라 추가 정보를 명확화한다.
|
|
21
|
+
|
|
22
|
+
## Step 2: 출력 경로 결정
|
|
23
|
+
|
|
24
|
+
입력에 `.tasks/{timestamp}_{topic}/` 형태의 경로가 포함되면 해당 디렉토리에 `sit.md`를 생성·갱신한다.
|
|
25
|
+
|
|
26
|
+
- 기존 `sit.md`가 없으면 신규 생성한다.
|
|
27
|
+
- 기존 `sit.md`가 있으면 갱신 모드로 동작한다. 기존 체크박스 상태(`[x]`/`[ ]`)·사용자 메모는 보존하고 신규 항목만 추가한다.
|
|
28
|
+
|
|
29
|
+
입력에 해당 경로가 없으면 `.tasks/{yyMMddHHmmss}_{topic}/sit.md`를 신규 생성한다.
|
|
30
|
+
|
|
31
|
+
- `{yyMMddHHmmss}` — `date +%y%m%d%H%M%S` 실행 결과
|
|
32
|
+
- `{topic}` — 영어 kebab-case (예: `book-register`)
|
|
33
|
+
|
|
34
|
+
NEVER: `tests/sit/`, `packages/**/sit/` 등 결정된 경로 외부에 SIT 문서를 생성하지 않는다.
|
|
35
|
+
|
|
36
|
+
## Step 3: SIT 항목 도출
|
|
37
|
+
|
|
38
|
+
수집한 자료에서 검증 항목을 추출하여 다음 구조로 정리한다.
|
|
39
|
+
|
|
40
|
+
### 그룹핑 단위
|
|
41
|
+
|
|
42
|
+
자료의 식별자 유형에 따라 섹션을 그룹핑한다.
|
|
43
|
+
|
|
44
|
+
- 자료에 Task/Story 식별자가 있으면 (`Task {N}.{M}`, `Story {N}.{M}.{L}`) 동일 식별자로 섹션을 만든다.
|
|
45
|
+
- 식별자가 없으면 화면·메뉴 단위로 섹션을 만든다.
|
|
46
|
+
|
|
47
|
+
평면 체크리스트(섹션 없이 모든 항목 나열)는 금지한다.
|
|
48
|
+
|
|
49
|
+
### 검증 단계 분리
|
|
50
|
+
|
|
51
|
+
각 Story·화면 섹션 안에 적용 가능한 단계 헤더를 둔다. 기능에 해당 단계가 없으면 그 헤더는 생략한다.
|
|
52
|
+
|
|
53
|
+
- 데이터 시드
|
|
54
|
+
- 메뉴 진입
|
|
55
|
+
- CRUD 흐름
|
|
56
|
+
- 엑셀 업·다운로드
|
|
57
|
+
- 매트릭스/결과 검증
|
|
58
|
+
|
|
59
|
+
`sit.md` 본문 전체에는 위 단계 헤더가 최소 1개 이상 등장한다.
|
|
60
|
+
|
|
61
|
+
### 항목 형식
|
|
62
|
+
|
|
63
|
+
모든 검증 항목은 `- [ ] {항목명}` 마크다운 체크박스 형식으로 작성한다.
|
|
64
|
+
|
|
65
|
+
- 정량/열거값(수치·필드명·상태값 등)은 입력 자료의 표현을 그대로 옮긴다. 의역·축약 금지 (예: "도서명·저자·ISBN" → "필수 항목들" 금지).
|
|
66
|
+
- 입력 자료에 없는 항목(가짜 비즈니스 규칙·실재 안 함 화면 동작·자료에 명시된 제외 사항)은 추가하지 않는다.
|
|
67
|
+
|
|
68
|
+
## Step 4: sit.md 생성
|
|
69
|
+
|
|
70
|
+
다음 템플릿으로 작성한다.
|
|
71
|
+
|
|
72
|
+
````markdown
|
|
73
|
+
# SIT: {주제}
|
|
74
|
+
|
|
75
|
+
## 참조 자료
|
|
76
|
+
|
|
77
|
+
- {입력 자료 경로 — `@path` 형태. 자연어만 들어온 경우 `자연어 입력`으로 표기 후 본문 발췌 인용}
|
|
78
|
+
|
|
79
|
+
## {Task {N}.{M} {이름} | 화면명 | 메뉴명}
|
|
80
|
+
|
|
81
|
+
### {Story {N}.{M}.{L} {이름} | 하위 화면명}
|
|
82
|
+
|
|
83
|
+
#### 데이터 시드
|
|
84
|
+
|
|
85
|
+
- [ ] {시드 항목}
|
|
86
|
+
|
|
87
|
+
#### 메뉴 진입
|
|
88
|
+
|
|
89
|
+
- [ ] {진입 항목}
|
|
90
|
+
|
|
91
|
+
#### CRUD 흐름
|
|
92
|
+
|
|
93
|
+
- [ ] {등록/조회/수정/삭제 항목}
|
|
94
|
+
|
|
95
|
+
#### 엑셀 업·다운로드
|
|
96
|
+
|
|
97
|
+
- [ ] {업로드/다운로드 항목}
|
|
98
|
+
|
|
99
|
+
#### 매트릭스/결과 검증
|
|
100
|
+
|
|
101
|
+
- [ ] {결과 검증 항목}
|
|
102
|
+
````
|
|
103
|
+
|
|
104
|
+
## Step 5: 격리 검증 (정보 유실·누락 점검)
|
|
105
|
+
|
|
106
|
+
**CRITICAL: 자체 판단으로 생략 금지(NEVER). 자체 요약 텍스트로 대체 금지(NEVER). 반드시 Agent tool 호출로 수행한다.**
|
|
107
|
+
|
|
108
|
+
문서 작성 후, 작성자 편향 제거와 정보 유실 차단을 위해 메인 세션과 분리된 Agent tool로 격리 검증을 수행한다.
|
|
109
|
+
|
|
110
|
+
### 5-1. 검증 호출
|
|
111
|
+
|
|
112
|
+
Agent tool(effort: `low`)을 다음 입력으로 호출한다:
|
|
113
|
+
|
|
114
|
+
- **sit.md 절대 경로** — Step 4에서 작성한 검증 대상
|
|
115
|
+
- **입력 자료 절대 경로 목록** — 자연어만 들어온 경우 사용자 초기 요청 메시지 본문을 프롬프트에 인라인 삽입
|
|
116
|
+
- **사용자 초기 요청 메시지 본문** — 프롬프트에 인라인 삽입
|
|
117
|
+
|
|
118
|
+
Agent tool에 부여할 제약: "보고만 수행. sit.md를 수정하지 말 것."
|
|
119
|
+
|
|
120
|
+
### Agent tool 프롬프트에 포함할 검증 가이드
|
|
121
|
+
|
|
122
|
+
#### 검증 항목
|
|
123
|
+
|
|
124
|
+
1. **정량 매핑 표 (양방향 커버리지)** — 입력 자료에서 검증 항목 후보(화면 동작·필드·검증 조건·수치·열거값·예외 흐름)를 추출하여 sit.md 위치(섹션 헤더)에 1:1 매핑.
|
|
125
|
+
|
|
126
|
+
- 컬럼: `원본 표현` / `출처(자료명·위치)` / `sit.md 반영 위치` / `sit 표현` (반영 위치 빈칸 = 누락)
|
|
127
|
+
- 누락: 원본에 있는데 sit.md에 매핑되지 않은 항목
|
|
128
|
+
- 근거 없는 추가: sit.md에 있는데 입력 자료에서 추적 불가한 항목
|
|
129
|
+
|
|
130
|
+
2. **의역 변형 검출** — 원문이 구체적인데 sit.md가 추상화된 사례 (예: 원문 "도서명·저자·ISBN" → sit "필수 항목들")
|
|
131
|
+
|
|
132
|
+
3. **체크박스 형식 검증** — sit.md의 모든 검증 항목이 `- [ ] {항목명}` 형식으로 작성되었는지 확인 (`* `, `1.`, `- ` 단독, 체크박스 누락은 위반).
|
|
133
|
+
|
|
134
|
+
4. **그룹핑 형식 검증** — 입력 자료에 Task/Story 식별자가 있을 때 sit.md 본문에 Task 단위 섹션 + Story 단위 하위 섹션이 등장하는지 확인. 평면 체크리스트는 위반.
|
|
135
|
+
|
|
136
|
+
5. **단계 헤더 등장 검증** — sit.md 본문 전체에 데이터 시드/메뉴 진입/CRUD 흐름/엑셀 업·다운로드/매트릭스·결과 검증 중 1개 이상의 단계 헤더가 등장하는지 확인.
|
|
137
|
+
|
|
138
|
+
#### 완독 의무
|
|
139
|
+
|
|
140
|
+
원본 자료(첨부 파일·인라인 요청 메시지·sd-* 산출물)와 sit.md는 끝까지 읽는다. 키워드 검색만으로 종결하지 않는다.
|
|
141
|
+
|
|
142
|
+
#### 출력 포맷
|
|
143
|
+
|
|
144
|
+
- **요약** — 입력 항목 수 / 매핑·누락·근거 없는 추가·의역 변형·형식 위반 (각 정수)
|
|
145
|
+
- **정량 매핑 표** (항목 1)
|
|
146
|
+
- **누락 / 근거 없는 추가 / 의역 변형 / 형식 위반 / 단계 헤더 누락 목록** — 각 항목 출처, 권장 반영 위치, 권장 처리 방향 포함
|
|
147
|
+
|
|
148
|
+
### 5-2. 메인의 결과 처리
|
|
149
|
+
|
|
150
|
+
1. 모든 결과 항목은 `sd-clarify` 지침에 따라 명확화한다.
|
|
151
|
+
2. SIT 항목 재작성이 필요하면 Step 3으로 되돌아간다.
|
|
152
|
+
|
|
153
|
+
## Step 6: 다음 단계 안내
|
|
154
|
+
|
|
155
|
+
SIT 문서 작성 완료 후 다음 단계를 안내한다.
|
|
156
|
+
|
|
157
|
+
```
|
|
158
|
+
/sd-sit {sit.md 경로}
|
|
159
|
+
```
|