@simplysm/sd-claude 14.0.79 → 14.0.80

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.
@@ -75,8 +75,7 @@ flowchart LR
75
75
 
76
76
  ### 2.2 출고 [OPEN: 2026-04-01]
77
77
 
78
- - 자료 위치: 회의록.md L40-50
79
- - 대화 발췌: 사용자 — "출고 부분은 입고 끝나고 다음 단계에서 보자"
78
+ 분석 방법: 회의록.md L40-50 재독 (입고 분석 끝난 후). 사용자 보류 발언 — "출고 부분은 입고 끝나고 다음 단계에서 보자".
80
79
 
81
80
  ## 3. 기타 요구사항
82
81
 
@@ -112,7 +111,7 @@ Actor: 창고 관리자
112
111
 
113
112
  - 품목 마스터 CRUD (등록 / 편집 / 삭제·복구 / 엑셀 업·다운로드)
114
113
 
115
- 와이어프레임:
114
+ #### 와이어프레임
116
115
 
117
116
  ```
118
117
  ┌──────────────────────────────────────────────────────────────────────────┐
@@ -126,7 +125,7 @@ Actor: 창고 관리자
126
125
  └──────────────────────────────────────────────────────────────────────────┘
127
126
  ```
128
127
 
129
- 항목:
128
+ #### 항목
130
129
 
131
130
  **필터**
132
131
 
@@ -143,7 +142,7 @@ Actor: 창고 관리자
143
142
  | 코드 | 문자 | - | [모델.품목.코드] | |
144
143
  | 명칭 | 문자 | - | [모델.품목.명칭] | |
145
144
 
146
- 동작:
145
+ #### 동작
147
146
 
148
147
  - `[조회]` 클릭: 검색 필터 조건으로 목록 갱신
149
148
  - `[등록]` 클릭: [화면.품목 등록·편집] 을 빈 폼으로 모달 띄움
@@ -152,15 +151,15 @@ Actor: 창고 관리자
152
151
  - `[선택 복구]` 클릭: 선택된 행들의 활성 여부 true 전환
153
152
  - `[엑셀 업로드]` 클릭: 엑셀 파일 선택 → 코드 기준 일괄 등록/수정
154
153
  - `[엑셀 다운로드]` 클릭: 현재 검색 필터 적용된 목록을 엑셀로 내보내기
155
- - `[화주 자료 업로드]` 클릭: [공통 정의.화주 품목 자료] 파일 선택 → 아래 양식 매핑 적용 후 코드 기준 일괄 등록/수정
154
+ - `[화주 자료 업로드]` 클릭: [공통 정의.화주 품목 자료] 파일 선택 → 아래 업로드 양식 적용 후 코드 기준 일괄 등록/수정
156
155
 
157
- 시각 규칙:
156
+ #### 시각 규칙
158
157
 
159
158
  - 비활성 행: 전체 취소선 + 회색
160
159
 
161
- 양식 매핑:
160
+ #### 업로드 양식
162
161
 
163
- **업로드 양식** ([공통 정의.화주 품목 자료] → [모델.품목])
162
+ [공통 정의.화주 품목 자료] → [모델.품목]
164
163
 
165
164
  | 파일 컬럼 | 도메인 모델 | 변환·규칙 |
166
165
  | ------------------ | ---------------- | -------------------------------- |
@@ -176,7 +175,7 @@ Actor: 창고 관리자
176
175
 
177
176
  - 품목 신규 등록 또는 기존 품목 편집 (호출하는 쪽에서 빈 폼/기존 데이터로 모달 띄움)
178
177
 
179
- 와이어프레임:
178
+ #### 와이어프레임
180
179
 
181
180
  ```
182
181
  ┌──────────────────────────────────────┐
@@ -188,7 +187,7 @@ Actor: 창고 관리자
188
187
  └──────────────────────────────────────┘
189
188
  ```
190
189
 
191
- 항목:
190
+ #### 항목
192
191
 
193
192
  **입력 폼**
194
193
 
@@ -197,7 +196,7 @@ Actor: 창고 관리자
197
196
  | 코드 | 텍스트 입력 | O | [모델.품목.코드] | |
198
197
  | 명칭 | 텍스트 입력 | O | [모델.품목.명칭] | |
199
198
 
200
- 동작:
199
+ #### 동작
201
200
 
202
201
  - `[저장]` 클릭: 활성 품목 내 코드·명칭 유일성 검증 → 저장 → 모달 닫음
203
202
  - `[취소]` 클릭: 변경 사항 폐기 → 모달 닫음
@@ -212,7 +211,7 @@ Actor: 창고 관리자
212
211
  - Location 마스터 CRUD (등록 / 편집 / 삭제·복구 / 엑셀 업·다운로드)
213
212
  - 두 가지 바코드 출력: A4 다중 + 라벨프린터 1매씩
214
213
 
215
- 와이어프레임:
214
+ #### 와이어프레임
216
215
 
217
216
  ```
218
217
  ┌────────────────────────────────────────────────────────────────────────────────────┐
@@ -225,7 +224,7 @@ Actor: 창고 관리자
225
224
  └────────────────────────────────────────────────────────────────────────────────────┘
226
225
  ```
227
226
 
228
- 항목:
227
+ #### 항목
229
228
 
230
229
  **필터**
231
230
 
@@ -241,7 +240,7 @@ Actor: 창고 관리자
241
240
  | ID | 숫자 + 편집 버튼 | - | [모델.Location.ID] | 클릭 시 편집 모달 |
242
241
  | 코드 | 문자 | - | [모델.Location.코드] | |
243
242
 
244
- 동작:
243
+ #### 동작
245
244
 
246
245
  - `[조회]` 클릭: 검색 필터 조건으로 목록 갱신
247
246
  - `[등록]` 클릭: [화면.Location 등록·편집] 을 빈 폼으로 모달 띄움
@@ -261,7 +260,7 @@ Actor: 창고 관리자
261
260
  1. 선택된 Location 을 [공통 정의.Location 라벨] 규격으로 라벨프린터 1매씩 출력
262
261
  2. 다중 선택 시 선택 수만큼 연속 출력
263
262
 
264
- 시각 규칙:
263
+ #### 시각 규칙
265
264
 
266
265
  - 비활성 행: 전체 취소선 + 회색
267
266
 
@@ -274,7 +273,7 @@ Actor: 창고 관리자
274
273
 
275
274
  - Location 신규 등록 또는 기존 Location 편집 (호출하는 쪽에서 빈 폼/기존 데이터로 모달 띄움)
276
275
 
277
- 와이어프레임:
276
+ #### 와이어프레임
278
277
 
279
278
  ```
280
279
  ┌──────────────────────────────────────┐
@@ -286,7 +285,7 @@ Actor: 창고 관리자
286
285
  └──────────────────────────────────────┘
287
286
  ```
288
287
 
289
- 항목:
288
+ #### 항목
290
289
 
291
290
  **입력 폼**
292
291
 
@@ -294,7 +293,7 @@ Actor: 창고 관리자
294
293
  | ---- | ----------- | ---- | -------------------- | ----------------------- |
295
294
  | 코드 | 텍스트 입력 | O | [모델.Location.코드] | 영문 대문자/숫자/하이픈 |
296
295
 
297
- 동작:
296
+ #### 동작
298
297
 
299
298
  - `[저장]` 클릭: 활성 Location 내 코드 유일성 검증 → 저장 → 모달 닫음
300
299
  - `[취소]` 클릭: 변경 사항 폐기 → 모달 닫음
@@ -308,7 +307,7 @@ Actor: 창고 작업자
308
307
 
309
308
  - 박스 → Location 순서로 스캔하여 재고 등록
310
309
 
311
- 와이어프레임:
310
+ #### 와이어프레임
312
311
 
313
312
  ```
314
313
  ┌────────────────────────┐
@@ -321,7 +320,7 @@ Actor: 창고 작업자
321
320
  (360 × 568)
322
321
  ```
323
322
 
324
- 항목:
323
+ #### 항목
325
324
 
326
325
  **스캔 입력 폼**
327
326
 
@@ -330,7 +329,7 @@ Actor: 창고 작업자
330
329
  | 박스 바코드 | 텍스트 입력 | O | - | PDA 스캐너 입력. 파싱 = 품목코드 + 수량 + 박스번호 |
331
330
  | Location | 텍스트 입력 | O | [모델.Location.코드] | PDA 스캐너 입력 |
332
331
 
333
- 동작:
332
+ #### 동작
334
333
 
335
334
  - `[등록]` 클릭:
336
335
  - 절차:
@@ -349,7 +348,7 @@ Actor: 창고 관리자
349
348
  - 현재 재고: Location 별 적치된 박스 + 품목·수량 조회
350
349
  - 과거 시점 재고: 특정 날짜의 스냅샷 조회
351
350
 
352
- 와이어프레임:
351
+ #### 와이어프레임
353
352
 
354
353
  ```
355
354
  ┌──────────────────────────────────────────────────────────────────────────┐
@@ -362,7 +361,7 @@ Actor: 창고 관리자
362
361
  └──────────────────────────────────────────────────────────────────────────┘
363
362
  ```
364
363
 
365
- 항목:
364
+ #### 항목
366
365
 
367
366
  **필터**
368
367
 
@@ -381,7 +380,7 @@ Actor: 창고 관리자
381
380
  | 품목 | 문자 | - | [모델.재고.박스.품목.코드] | 품목 코드 표시 |
382
381
  | 수량 | 숫자 | - | [모델.재고.박스.수량] | |
383
382
 
384
- 동작:
383
+ #### 동작
385
384
 
386
385
  - `[조회]` 클릭:
387
386
  - 기준일 비어있음: 현재 [모델.재고] 조회
@@ -393,68 +392,49 @@ Actor: 창고 관리자
393
392
 
394
393
  ### 5.1 재고 스냅샷 [확정: 2026-04-01]
395
394
 
396
- ```mermaid
397
- flowchart LR
398
- S([매일 0시]) --> T1[현재 재고 전체 조회]
399
- T1 --> T2[스냅샷 테이블에 날짜별 저장]
400
- T2 --> E1([완료])
401
- ```
395
+ 목적: 과거 시점 재고 조회 지원
402
396
 
403
- 목적:
397
+ 트리거: 매일 0시 정각
404
398
 
405
- - 과거 시점 재고 조회 지원
406
-
407
- 트리거:
408
-
409
- - 매일 0시 정각
399
+ 관련 섹션: [기타.과거 재고 조회], [화면.재고 확인]
410
400
 
411
- 처리:
401
+ #### 처리
412
402
 
413
403
  - [모델.재고] 전체를 [모델.재고 스냅샷] 에 날짜별로 저장
414
404
 
415
- 예외 처리:
405
+ #### 예외 처리
416
406
 
417
407
  - 스냅샷 생성 실패 시:
418
408
  - 위험: 당일 분 누락 시 해당 날짜의 과거 시점 조회 불가
419
409
  - 대처: 관리자 알림. 동일 일자 재실행 시 (날짜, 박스) 유일성 검증으로 중복 생성 방지
420
410
  - 재시도 한계: 별도 재시도 없음 (다음 날 0시 정상 동작)
421
411
 
422
- 관련 섹션: [기타.과거 재고 조회], [화면.재고 확인]
423
-
424
412
  ## 6. 횡단 처리
425
413
 
426
414
  ### 6.1 마스터 데이터 변경 이력 [확정: 2026-04-01]
427
415
 
428
- ```mermaid
429
- flowchart LR
430
- S([마스터 엔티티 insert/update/delete]) --> T1[변경 전·후 값 캡처]
431
- T1 --> T2[DataLog 테이블에 한 행 적재]
432
- T2 --> E1([완료])
433
- ```
434
-
435
- 목적:
436
-
437
- - 마스터 변경 추적·감사 (누가 언제 무엇을 어떻게 바꿨는지)
416
+ 목적: 마스터 변경 추적·감사 (누가 언제 무엇을 어떻게 바꿨는지)
438
417
 
439
418
  트리거 (부수효과 발동 조건):
440
-
441
419
  - 마스터 엔티티의 insert / update / delete 트랜잭션 commit 시
442
420
  - 적용 범위: [모델.품목], [모델.Location]
443
421
  - 적용 제외: 트랜잭션 모델 ([모델.재고], [모델.재고 스냅샷])
444
422
 
445
- 처리:
423
+ 관련 섹션: [기타.마스터 데이터 변경 이력], [모델.품목], [모델.Location], [모델.DataLog]
424
+
425
+ #### 처리
446
426
 
447
427
  - 변경 전 값과 변경 후 값 캡처 (insert 시 변경 전 = null, delete 시 변경 후 = null)
448
428
  - [모델.DataLog] 에 한 행 적재 (테이블·키·전·후·작업자·시각)
449
429
 
450
- 예외 처리:
430
+ #### 예외 처리
451
431
 
452
432
  - DataLog 적재 실패 시:
453
433
  - 위험: 변경 추적 누락
454
434
  - 대처: 본 트랜잭션은 정상 commit 유지, DataLog 적재 실패만 별도 큐로 적재 후 관리자 알림
455
435
  - 재시도 한계: 큐에서 5회 지수 백오프 후 운영팀 알림
456
436
 
457
- 모델 매핑:
437
+ #### 모델 매핑
458
438
 
459
439
  | 필드 ([모델.DataLog]) | 용도 |
460
440
  | --------------------- | ------------------------------- |
@@ -465,8 +445,6 @@ flowchart LR
465
445
  | [모델.DataLog.작업자] | 세션 사용자 |
466
446
  | [모델.DataLog.시각] | 변경 commit 시각 |
467
447
 
468
- 관련 섹션: [기타.마스터 데이터 변경 이력], [모델.품목], [모델.Location], [모델.DataLog]
469
-
470
448
  ## 7. 공통 정의
471
449
 
472
450
  ### 7.1 용어 사전 [확정: 2026-04-01]
@@ -478,8 +456,7 @@ flowchart LR
478
456
 
479
457
  ### 7.2 박스 바코드 형식 [OPEN: 2026-04-01]
480
458
 
481
- - 자료 위치: 첨부B.pdf p.5 "박스 코드 체계" 외부 송장 시스템 규격 명세
482
- - 자료 연결 메모: 박스 코드는 외부 규격이지만 [모델.박스] 식별 키 구조와 직결 — §8 박스 확정과 함께 검토
459
+ 분석 방법: 첨부B.pdf p.5 "박스 코드 체계" (외부 송장 시스템 규격) 분석. [모델.박스] 식별 키 구조와 직결 — §8 박스 확정과 함께 검토.
483
460
 
484
461
  ### 7.3 Location 라벨 [확정: 2026-04-01]
485
462
 
@@ -621,7 +598,9 @@ flowchart LR
621
598
  - 방향: WMS → ERP
622
599
  - 전송 방식: REST API (POST)
623
600
 
624
- 자료 매핑:
601
+ 관련 섹션: [화면.입고 스캔]
602
+
603
+ #### 자료 매핑
625
604
 
626
605
  | ERP 필드 | WMS 출처 |
627
606
  | -------- | --------------------- |
@@ -630,7 +609,7 @@ flowchart LR
630
609
  | 박스번호 | [모델.박스.박스번호] |
631
610
  | 발생시각 | 입고 등록 시각 |
632
611
 
633
- 예외 처리:
612
+ #### 예외 처리
634
613
 
635
614
  - 호출 실패 (네트워크 오류, ERP 서버 일시 다운 등):
636
615
  - 위험: 단순 재시도 시 ERP 에 같은 박스가 2번 입고 등록될 수 있음 (첫 호출이 실제로는 ERP 에 도달했는데 응답만 못 받은 경우 등)
@@ -638,8 +617,6 @@ flowchart LR
638
617
  - 대처: 위 전제 하에 지수 백오프로 재시도, 최대 5회
639
618
  - 재시도 한계 초과: 관리자 알림 (이후 수동 확인 필요)
640
619
 
641
- 관련 섹션: [화면.입고 스캔]
642
-
643
620
  ## 10. 본문 외 결정사항
644
621
 
645
622
  - 2026-04-01 [제외]: 직원 관리 사원번호 컬럼 추가
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@simplysm/sd-claude",
3
- "version": "14.0.79",
3
+ "version": "14.0.80",
4
4
  "description": "심플리즘 패키지 - Claude Code 셋업",
5
5
  "author": "심플리즘",
6
6
  "license": "Apache-2.0",
@@ -1,152 +0,0 @@
1
- ---
2
- name: sd-tone
3
- description: simplysm 워크스페이스 기본 톤·표현 규칙
4
- keep-coding-instructions: true
5
- ---
6
-
7
- # 톤·표현 규칙
8
-
9
- **적용**: 모든 응답 + 산출물(spec.md·문서·코드 주석 등 Write/Edit 본문).
10
-
11
- **자가 점검** (매 응답·Write/Edit 직전):
12
-
13
- - 압축 룰을 적용했는가?
14
- - 한국어 모국어 사용자가 한 번 읽고 흐름대로 이해되는가?
15
-
16
- ## 도메인 어휘로 풀이
17
-
18
- - 산출물 소비자의 도메인 어휘로 응답.
19
- - 시스템 내부 용어 회피.
20
- - 간결·명확.
21
- - 다음은 단독 노출 금지 — 옆에 의미 동반 또는 도메인 어휘·시나리오로 풀이:
22
- - 식별자 — 실제 의미를 옆에 표기 (원본 없이도 문장만으로 의미 전달):
23
- - 코드 심볼
24
- - 영문 변수명·함수명 (예: `surplus`·`isCompleted`·`joinSingle`)
25
- - 기술 약어 (API·DB 컬럼 축약 등)
26
- - 수식·계산식 (예: `(A − B) − C`) — 값 대입 시나리오 1건 동반
27
- - SQL·프레임워크·구현 용어 (예: "LEFT JOIN 깊이 1 자르기"·"subagent 위탁") — 도메인 흐름으로 풀이
28
- - "이해 못함"·"무슨 소리야" 피드백 시 같은 내용 반복 X. 도메인 시나리오로 재풀이.
29
-
30
- ## 내부 문서 거론 시
31
-
32
- **적용**: 사용자 응답 중 내부 문서 (룰·스킬·합의 산출물·참고 자료) 거론 시.
33
-
34
- **원칙**: 사용자는 *문서 역할* 만 인지, *문서 내부* 는 미인지.
35
-
36
- **경계**:
37
-
38
- - 면제 (문서 자체): 파일명·분류명
39
- - 풀이 (문서 내부): §·헤더·룰명·결정 단어·내부 식별자
40
-
41
- **풀이 형식**:
42
-
43
- - 의미·내용 1줄 동반 또는 도메인 시나리오로 풀이
44
- - 자가 점검 — "이 표현이 문서 내부를 가리키는가? 사용자 처음 보는가?"
45
-
46
- **❌ 위반 패턴**:
47
-
48
- - `<§·룰명·내부 식별자> 에 따라 X` — 식별자만 노출, 풀이 누락
49
-
50
- **✅ 정상 패턴**:
51
-
52
- - `<§·룰의 본질·의미> → X` — 의미를 일반어로 풀어쓰기
53
- - 필요 시 `(출처: <문서명>)` 짧게 부기
54
-
55
- ## 응답·산출물 표현
56
-
57
- **구조 선호** (산문체 회피·세로 정돈):
58
-
59
- - 2개 이상의 정보·예시·항목은 라벨/헤더 + bullet 으로. 줄글로 풀지 말 것.
60
- - 한 bullet 안 열거가 3개 이상이거나 한 줄이 시각적으로 길면 sub-bullet 으로 세로 분리.
61
- - 예외: 짧은 토큰(부연 없는 단어급)만의 묶음은 시각적 길이 기준만 적용.
62
- - 라벨/헤더 뒤 부연이 두 절(clause) 이상이면 bullet 으로 분리.
63
-
64
- **압축 룰**:
65
-
66
- - 어미·조사 압축 — "~할 수도 있을 것 같습니다" → "~ 가능"
67
- - 접속어 제거. 인과는 화살표 `X → Y` 로 표현. 예시 접속어:
68
- - 인과: 그래서·따라서
69
- - 대등·역접: 또한·하지만
70
- - 1단어 가능 시 1단어
71
- - preamble·sign-off 금지. 예시:
72
- - 인사
73
- - 작업 개시
74
- - 마무리
75
- - 키워드+기호 구조 권장 — `원인: X → Y` · `해결: Z`
76
- - 중복 bullet 병합
77
-
78
- **절대 보존** (압축·약어화·재서술 X):
79
-
80
- - 코드 심볼·함수명
81
- - API명·에러 문자열
82
- - URL·파일경로
83
- - 명령어
84
- - 기술 용어·고유명사
85
- - 날짜·버전
86
- - 숫자·환경변수
87
- - 사용자 발언 verbatim 인용
88
- - 도메인 어휘 (위 "도메인 어휘로 풀이" 룰)
89
- - 구조 (보존하고 안의 텍스트만 압축 룰 적용):
90
- - 헤딩
91
- - bullet 계층·numbered
92
- - 표·frontmatter
93
- - 질문 구조 `[맥락+선택지+추천+질문]`
94
-
95
- **압축 미적용 조건** (표준 톤 응답):
96
-
97
- - 보안 경고·되돌릴 수 없는 작업 컨펌
98
- - 다단계 시퀀스에서 압축이 오독 위험
99
- - 압축 자체가 기술 모호함 생성
100
-
101
- ## 한국어 가독성 가드
102
-
103
- 원칙:
104
-
105
- - 압축 강도 유지.
106
- - 영어 직역체로 인한 가독성 저하만 차단.
107
-
108
- **직역체 회피**:
109
-
110
- - 어순 — 한국어 SOV: 중요 정보·결론은 문장 뒤.
111
- - 수동태 — `X 가 Y 에 의해 Z 되었다` → `Y 가 X 를 Z 했다`.
112
- - 직역 패턴:
113
- - `~에 의해(서)` → 주어를 능동형으로
114
- - `~에 대하여`·`~에 관하여` → 생략 또는 `~을/를`
115
- - `~로부터` → `~에서`
116
- - `~을 통해` → `~로`·`~으로써`·동사로 풀이
117
- - `~에 있어` → `~에`·`~에서`
118
- - `~하기 위해` → `~하려고`·`~할`
119
- - `~로 인해` → `~때문에`
120
- - `~의 경우` (첫머리) → `~는/은`·생략
121
- - `X 를 가진`·`가지고 있다` → `X 가 있다`·`X 다`
122
- - `~하는 중이다` → 현재형
123
- - `~에도 불구하고` → `~지만`·`~인데도`
124
- - `위치하다` → `있다`
125
-
126
- **남용 회피**:
127
-
128
- - 대명사 (그·그것·그녀·그들) — 명사 반복 또는 생략
129
- - 복수 표지 `들` — 한국어는 단수형으로 다수 표현 가능
130
- - `의` — 띄어쓰기 가능 시 생략
131
-
132
- **허용**:
133
-
134
- - 일상 한국어 단어 — 일상에 정착한 압축어(예: `비추`) 포함
135
- - 명사구 종결 — 압축 일관성 유지
136
-
137
- ## ASCII 그림
138
-
139
- 적용 대상 — 모든 ASCII 그림:
140
-
141
- - 다이어그램
142
- - 구성도
143
- - 와이어프레임 등
144
-
145
- 룰:
146
-
147
- - 이모지(✏ ☐ ❌ ⭐ ♥ 등) 금지 — 렌더러별 1칸/2칸 변동 → 정렬 깨짐.
148
- - 그 외 폭 안정 문자 허용:
149
- - ASCII·한글
150
- - 박스 라인 ┌─┐ │ └┘ ├┤
151
- - 도형 ▲ ▼ ► ◄
152
- - 화살표 ← → ↑ ↓
@@ -1,14 +0,0 @@
1
- ---
2
- name: review
3
- description: PR을 리뷰한다. Use when 사용자가 PR 또는 코드 변경사항에 대한 리뷰를 요청할 때
4
- ---
5
-
6
- # Review
7
-
8
- PR 또는 변경사항을 검토하고 피드백을 제공한다.
9
-
10
- ## 워크 플로
11
-
12
- 1. 변경사항 파악 - 어떤 파일이 어떻게 변경되었는지 확인
13
- 2. 영향 범위 분석 - 변경이 다른 코드에 미치는 영향 검토
14
- 3. 피드백 작성 - 개선 제안과 잠재적 이슈를 정리
@@ -1,5 +0,0 @@
1
- {"id": "create-basic-001", "input": "/sd-skill 현재 디렉토리의 README.md 가 'Title', 'Description', 'Installation', 'Usage' 4개 섹션을 모두 포함하는지 검증하는 스킬을 만들어줘", "rubric": [".claude/skills/ 아래에 새 스킬 디렉토리가 정확히 하나 생성되었고 그 안에 SKILL.md 가 존재하는가?", "SKILL.md 의 frontmatter 가 '---' 로 감싸져 있고 'name', 'description' 키가 모두 존재하며 'name' 값이 디렉토리명과 정확히 일치하는가?", "frontmatter 의 description 에 'Use when' 문구가 포함되어 있는가?", "SKILL.md 본문이 100줄 이내인가?", "생성된 스킬의 evals/golden.jsonl 파일이 존재하고, 모든 라인이 유효한 JSON 이며 각 라인이 id/input/rubric/fixture 4개 키를 모두 포함하는가?", "golden.jsonl 의 각 케이스가 참조하는 fixture 명과 동일한 이름의 디렉토리가 evals/fixtures/<name>/ 경로에 실제로 존재하는가?", "에이전트의 events 에 Bash 도구로 'run_eval.py' 를 실행하려는 호출이 1회 이상 존재하는가?"], "fixture": "empty"}
2
- {"id": "create-with-script-001", "input": "/sd-skill SKILL.md frontmatter 가 유효한지(name 키 존재, description 키 존재, description 에 'Use when' 포함, 본문 100줄 이내) 결정론적으로 검증하는 스킬을 만들어줘", "rubric": [".claude/skills/ 아래에 새 스킬 디렉토리가 정확히 하나 생성되었고 그 안에 SKILL.md 가 존재하는가?", "SKILL.md 의 frontmatter 에 'name', 'description' 키가 모두 존재하며 description 에 'Use when' 문구가 포함되는가?", "스킬 디렉토리 아래 scripts/ 폴더가 존재하고 그 안에 .py 또는 .sh 파일이 1개 이상 존재하는가?", "SKILL.md 본문에서 scripts/ 아래 추가된 스크립트 파일 경로 또는 파일명을 명시적으로 참조(언급)하는가?", "스크립트 본문에 frontmatter 의 'name' 또는 'description' 키 존재 여부를 검사하는 로직(문자열 검색이든 파싱이든)이 포함되어 있는가?", "생성된 스킬의 evals/golden.jsonl 과 evals/fixtures/<name>/ 디렉토리가 골든셋과 정합성 있게 존재하는가?"], "fixture": "empty"}
3
- {"id": "modify-rule-add-001", "input": "/sd-skill review 스킬에 응답을 항상 한국어로 하라는 강제 조건을 추가해줘", "rubric": [".claude/skills/review/SKILL.md 파일이 여전히 존재하는가?", "수정 후 SKILL.md 의 frontmatter 'name' 값이 'review' 로 유지되어 있는가?", "기존 워크플로 항목 표현 3개('변경사항 파악', '영향 범위 분석', '피드백 작성') 가 SKILL.md 본문에 모두 그대로 남아있는가?", "한국어 응답을 강제하는 새 지시 문장이 SKILL.md 본문에 추가되었는가? (본문에 '한국어' 키워드를 포함하는 강제 어조의 문장 1개 이상)"], "fixture": "with-existing-review"}
4
- {"id": "modify-add-script-001", "input": "/sd-skill review 스킬에 'git diff origin/main...HEAD' 로 변경 파일 목록과 diff 본문을 자동으로 가져오는 스크립트를 추가하고, SKILL.md 워크플로에서 그 스크립트를 사용하도록 갱신해줘", "rubric": [".claude/skills/review/SKILL.md 파일이 여전히 존재하고 frontmatter 의 'name' 값이 'review' 로 유지되는가?", "기존 워크플로 항목 표현 3개('변경사항 파악', '영향 범위 분석', '피드백 작성') 가 SKILL.md 본문에 모두 그대로 남아있는가?", ".claude/skills/review/scripts/ 디렉토리가 새로 생성되었고 그 안에 'git diff' 문자열을 포함하는 스크립트 파일이 1개 이상 존재하는가?", "수정된 SKILL.md 본문에서 새로 추가한 스크립트 파일을 사용/실행하라는 안내 문장이 추가되었는가? (스크립트 파일명 또는 'scripts/' 경로를 본문에서 언급)"], "fixture": "with-existing-review"}
5
- {"id": "create-large-split-001", "input": "/sd-skill PR 코드리뷰 가이드 스킬을 만들어줘. 다음 4개 영역의 상세 체크리스트와 각 영역별 코드 예시 3개를 포함해야 한다: (1) 보안(SQL injection, XSS, CSRF), (2) 성능(N+1, 메모리 누수, 캐싱), (3) 테스트 커버리지(단위/통합/E2E), (4) DB 마이그레이션 안전성.", "rubric": [".claude/skills/ 아래에 새 스킬 디렉토리가 정확히 하나 생성되었고 그 안에 SKILL.md 가 존재하는가?", "SKILL.md frontmatter 에 'name', 'description' 키가 모두 존재하고 description 에 'Use when' 문구가 포함되는가?", "SKILL.md 본문이 100줄 이내인가? (sd-skill 분리 룰: 100줄 초과 시 references/ 로 분리해야 함)", "스킬 디렉토리 아래 references/ 폴더가 존재하고 그 안에 .md 파일이 1개 이상 존재하는가?", "SKILL.md 본문에서 references/ 폴더의 파일 1개 이상을 마크다운 링크 또는 경로 문자열로 명시적으로 참조하는가?", "생성된 스킬의 evals/golden.jsonl 과 evals/fixtures/<name>/ 디렉토리가 골든셋과 정합성 있게 존재하는가?"], "fixture": "empty"}
@@ -1,81 +0,0 @@
1
- # Eval 작성
2
-
3
- ## 전제: 자동답변 환경
4
-
5
- Eval 실행 시 사용자 응답을 받을 수 없다. 대상 스킬은 입력이 필요한 모든 시점에 **스스로 답변**하며 끝까지 진행한다 (대화 흐름·산출물 형식 검증용). 케이스 설계는 이 제약을 전제로 한다.
6
-
7
- - **`input` 은 1턴짜리 사용자 발화**. 후속 응답을 가정하지 말 것.
8
- - **rubric 은 자체 답변 가능 영역만 검증**: 산출물 존재/형식/구조, 흐름 진행 여부, frontmatter 키 등. *"사용자가 X 를 골랐을 때 Y 가 나오는가"* 처럼 특정 사용자 응답 값에 의존하는 항목 금지 (자체 답변값이 매번 다를 수 있음).
9
- - **사용자 응답 발생 자체에 의존하는 rubric 금지**: 검증 대상 스킬이 "사용자에게 질문", "OPEN 처리/대기", "임의 채움 금지" 류 룰을 갖고 있어도, 그 룰의 발현 자체는 eval 로 검증 불가. 자동답변 환경은 사용자 답변을 즉시 생성해 진행하므로 "사용자 질문/대기" 흐름이 본질적으로 발생하지 않는다.
10
- - 나쁜 예: `"사용자에게 질문하거나 OPEN 처리하는 흐름이 등장하는가"` (자체 답변으로 채운 뒤 진행 = 룰의 위반이 아니라 eval 환경의 정상 동작)
11
- - 나쁜 예: `"임의 채움 흔적이 없는가"` (자체 답변 자체가 "임의 채움" 으로 보임)
12
- - 대응: 케이스 자체를 재설계하거나, `input` 본문에 룰 강조 문장을 명시 (예: "모호 발견 시 OPEN 마커만 spec 에 박고 종료").
13
- - **fixture 는 자체 답변이 막히지 않게 구성**: 외부 시크릿·실시간 API 없이 진행 가능한 초기 상태로.
14
-
15
- ## 근거 제약
16
-
17
- eval 입력/rubric 의 근거는 **검증 대상 SKILL.md (수정 시: 수정 후 버전) 명세뿐**. 이전 버전 동작·대화 메모리에 떠 있는 옛 컨텍스트는 인용 금지.
18
-
19
- - 검증 대상 명세에 없는 동작은 입력에도, rubric 에도 등장하지 않는다.
20
- - "이전 버전과 다르게 X 하는가" 형태의 negative rubric 금지. 현재 명세상 X 가 요구되면 `"X 하는가"` 로 직접 검증한다.
21
-
22
- ## Golden 케이스 작성
23
-
24
- `evals/golden.jsonl` 에 한 줄당 한 케이스:
25
-
26
- ```json
27
- {"id": "case-001", "input": "/<skill-name> ...", "rubric": ["체크 질문 1", "체크 질문 2"], "fixture": "<fixture-dir-name>"}
28
- ```
29
-
30
- - `id`: 케이스 식별자.
31
- - `input`: 평가 대상 스킬에 전달할 사용자 입력.
32
- - `rubric`: PASS/FAIL 로 판정할 체크 질문 목록.
33
- - `fixture`: 케이스 시작 시점의 샌드박스 초기 상태 디렉토리 이름.
34
-
35
- **케이스 크기 제약**: 한 케이스가 요구하는 작업량이 단일 실행 컨텍스트를 소진할 정도로 크면 안 된다. eval 은 흐름·산출물 형식 검증이 목적이므로, 풀 구현·대량 분석을 요구하는 input 은 피하고 최소 시연 수준의 작업으로 좁힌다. 본질이 큰 풀구현 스킬은 input 의 평가 환경 단서로 rubric 검증에 불필요한 워크플로 단계를 명시 스킵한다.
36
-
37
- ## Rubric 작성 요령
38
-
39
- 각 항목은 **PASS/FAIL 로 판정 가능한 명확한 체크 질문**이어야 한다. 추상적 표현은 judge 가 매번 다르게 판단하므로 피한다.
40
-
41
- **모호한 부사·형용사 회피**: "잘", "적절히", "합리적으로", "명확히" 같은 표현은 기준이 사람마다 달라진다.
42
-
43
- - 나쁜 예: `"한국어 지원이 잘 되었는가?"` ("잘" 이 모호)
44
- - 좋은 예: `"본문에 한국어 응답 강제 지시가 명시적 문장으로 들어갔는가?"` (검증 기준 분명)
45
-
46
- **형식 검증을 선호하라**: 의미보다는 형식·존재 여부로 좁히면 judge 의 흔들림이 줄어든다.
47
-
48
- - 나쁜 예: `"description 이 트리거 조건을 명확히 표현하는가?"`
49
- - 좋은 예: `"description 끝에 'Use when ~' 형식 문장이 포함되었는가?"`
50
-
51
- **관찰 가능한 산출물에 묶어라**: 파일 존재, 특정 키 포함, 특정 디렉토리 구조 등 tree/events 에서 직접 확인 가능한 사실을 묻는다.
52
-
53
- - 좋은 예: `"기존 .claude/skills/review/SKILL.md 파일이 손실되지 않고 보존되었는가?"`
54
- - 좋은 예: `"SKILL.md 의 frontmatter 에 name 과 description 키가 모두 존재하는가?"`
55
-
56
- **명세 어휘 매칭 금지**: 명세에 등장하는 특정 단어를 rubric 에 그대로 박아 정확 매칭을 요구하지 말 것. LLM 응답은 동의어·다른 표현으로 동일 본질을 전달하므로, 어휘 정확 매칭은 본질-무관 FAIL 을 양산한다. rubric 은 본질(형식·구조·존재 여부)만 검증.
57
-
58
- - 나쁜 예: `"분해 표 첫 컬럼이 '항목' 인가"` (LLM 이 'ID'·'식별자' 로 출력해도 본질은 동일)
59
- - 좋은 예: `"분해 표가 마크다운 표 형식으로 출력되고 컬럼 6개가 모두 존재하는가"`
60
-
61
- **도구명 매칭 금지**: "events 에 특정 도구(Glob/Grep/Read 등) 호출이 있었는가" 는 그 도구의 사용 자체가 본질일 때만 사용. 본질이 "탐색·조사·읽기" 등 행위면 동등 효과의 다른 도구(Bash 의 ls/find/dir/cat 등)도 PASS 처리해야 한다.
62
-
63
- - 나쁜 예: `"events 에 Glob 또는 Grep 호출이 1회 이상 있는가"` (Bash ls/find 로 동등 효과인데 FAIL)
64
- - 좋은 예: `"events 에 코드베이스 탐색 흔적(Glob·Grep 호출 또는 Bash 의 ls/find/dir 등 동등 명령) 이 1회 이상 있는가"`
65
-
66
- ## Fixtures 작성
67
-
68
- `evals/fixtures/<name>/` 는 케이스 시작 시점의 샌드박스 초기 상태이다. 케이스 실행 시 이 디렉토리가 통째로 샌드박스로 복사된다.
69
-
70
- - **빈 워크스페이스**: 디렉토리만 존재하면 됨 (`.gitkeep` 등으로 자리 표시).
71
- - **기존 스킬 수정 케이스**: 그 스킬의 SKILL.md 와 관련 파일을 미리 배치해 둔다.
72
-
73
- 예시: `with-existing-review/.claude/skills/review/SKILL.md` — 케이스 시작 시 review 스킬이 이미 존재하는 상태.
74
-
75
- ## 케이스 커버리지
76
-
77
- 골든 셋은 단순 PASS 케이스 외에 다음 분기를 커버하면 회귀 감지가 강해진다:
78
-
79
- - 신규 작성 / 기존 수정 각각.
80
- - 워크플로의 주요 분기점 (예: 스크립트 필요/불필요, 참조 파일 분리 필요/불필요).
81
- - 과거에 실패한 패턴 — FAIL 케이스의 reason 분석 후 재발 방지용으로 추가한다.
@@ -1,32 +0,0 @@
1
- # Eval 실행
2
-
3
- ## 입력
4
-
5
- `python .claude/skills/sd-skill/scripts/run_eval.py <대상-스킬-이름>`
6
-
7
- 대상 스킬에 `evals/golden.jsonl` + `evals/fixtures/<fixture-name>/` 가 있어야 한다.
8
-
9
- ## 동작
10
-
11
- 각 케이스마다:
12
-
13
- 1. 격리된 작업 공간 준비 (`.claude/` 복사 + fixture 오버레이)
14
- 2. 대상 스킬 실행. `EVAL_MODE_PREFIX` 가 사용자 입력에 prepend 되어, 대상 스킬이 입력 필요 시점마다 스스로 답변하며 끝까지 진행하도록 지시된다. 자체 답변은 사용자의 명시적 발언과 동등하게 취급된다 (다이얼로그 기반 스킬도 평가 가능, 단 자체 답변이라 흐름·형식 검증용)
15
- 3. 에이전트 동작 기록과 종료 시점 파일 트리 수집
16
- 4. 별도 평가 에이전트가 rubric 항목별 PASS/FAIL 채점 → 모두 PASS 시 케이스 PASS
17
-
18
- ## 출력
19
-
20
- stdout: summary JSON
21
- - `run_id`, `results_dir`
22
- - `summary`: total / pass / fail / error
23
- - `cases[]`: 케이스별 verdict + 결과 dir 경로
24
-
25
- 각 케이스 결과 파일 (`results_dir/cases/<id>/`):
26
- - `judge_output.json` — rubric 항목별 PASS/FAIL + reason
27
- - `events.json` — 에이전트 이벤트 시퀀스
28
- - `tree.json` — 샌드박스 종료 시 파일 트리
29
-
30
- ## FAIL 분석
31
-
32
- 위 결과 파일 읽어 reason 확인 → 스킬/eval 어느 쪽 문제인지 판단.