@simplysm/sd-claude 14.0.79 → 14.0.81

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.
Files changed (96) hide show
  1. package/claude/references/sd-requirement-source-handling.md +17 -17
  2. package/claude/references/sd-simplysm14/README.md +58 -58
  3. package/claude/references/sd-simplysm14/manuals/client-component.md +739 -739
  4. package/claude/references/sd-simplysm14/manuals/client-crud.md +1 -1
  5. package/claude/references/sd-simplysm14/manuals/client-demo.md +1 -1
  6. package/claude/references/sd-simplysm14/manuals/client-setup.md +2 -2
  7. package/claude/references/sd-simplysm14/manuals/client-tab.md +2 -2
  8. package/claude/references/sd-simplysm14/manuals/logging.md +3 -3
  9. package/claude/references/sd-simplysm14/manuals/orm-union.md +7 -7
  10. package/claude/references/sd-simplysm14/manuals/orm.md +75 -75
  11. package/claude/references/sd-simplysm14/manuals/test.md +8 -8
  12. package/claude/rules/sd-base-rules.md +261 -354
  13. package/claude/rules/sd-design-rules.md +44 -0
  14. package/claude/{sd-check-forbidden-files.py → sd-check-edit.py} +2 -1
  15. package/claude/{sd-check-bash.py → sd-check-shell.py} +2 -2
  16. package/claude/settings.json +3 -4
  17. package/claude/skills/sd-commit/SKILL.md +17 -17
  18. package/claude/skills/sd-config/SKILL.md +4 -4
  19. package/claude/skills/sd-demo/SKILL.md +41 -43
  20. package/claude/skills/sd-demo/evals/fixtures/inventory-list/.specs/inventory/spec.md +99 -0
  21. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/package.json +12 -0
  22. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/index.ts +3 -0
  23. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/inbound/inbound.list.ts +150 -0
  24. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/inventory/inventory-master.list.ts +143 -0
  25. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/outbound/outbound.list.ts +150 -0
  26. package/claude/skills/sd-demo/evals/fixtures/inventory-list/pnpm-workspace.yaml +2 -0
  27. package/claude/skills/sd-demo/evals/fixtures/inventory-list/sd.config.ts +12 -0
  28. package/claude/skills/sd-demo/evals/golden.jsonl +1 -5
  29. package/claude/skills/sd-dev/SKILL.md +49 -22
  30. package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/package.json +8 -0
  31. package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/tests/.gitkeep +0 -0
  32. package/claude/skills/sd-dev/evals/fixtures/{case-modify → minimal-ts-pkg}/tsconfig.json +1 -3
  33. package/claude/skills/sd-dev/evals/golden.jsonl +1 -3
  34. package/claude/skills/sd-docs/SKILL.md +8 -8
  35. package/claude/skills/sd-impl/SKILL.md +172 -82
  36. package/claude/skills/sd-impl/evals/fixtures/case-a-new-screen/.specs/260513120000_warehouse/spec.md +101 -0
  37. package/claude/skills/sd-impl/evals/fixtures/case-b-update-with-demo/.specs/260513120000_warehouse/spec.md +101 -0
  38. package/claude/skills/sd-impl/evals/fixtures/case-b-update-with-demo/packages/app/src/screens/box-register/box-register.view.ts +46 -0
  39. package/claude/skills/sd-impl/evals/fixtures/case-c-new-cross/.specs/260513120000_warehouse/spec.md +89 -0
  40. package/claude/skills/sd-impl/evals/fixtures/case-d-spec-modify/.specs/260513120000_warehouse/spec.md +101 -0
  41. package/claude/skills/sd-impl/evals/golden.jsonl +4 -6
  42. package/claude/skills/sd-review/SKILL.md +33 -0
  43. package/claude/skills/sd-review/evals/fixtures/code-review/src/foo.ts +7 -0
  44. package/claude/skills/sd-review/evals/fixtures/doc-review/docs/foo.md +4 -0
  45. package/claude/skills/sd-review/evals/golden.jsonl +2 -0
  46. package/claude/skills/sd-skill/SKILL.md +217 -29
  47. package/claude/skills/sd-skill/evals/fixtures/existing-skill/.claude/skills/todo-format/SKILL.md +14 -0
  48. package/claude/skills/sd-skill/evals/fixtures/new-skill/.gitkeep +0 -0
  49. package/claude/skills/sd-skill/evals/golden.jsonl +2 -5
  50. package/claude/skills/sd-spec/SKILL.md +384 -305
  51. package/claude/skills/sd-spec/references/example-spec.md +41 -64
  52. package/claude/skills/sd-unpack/SKILL.md +83 -83
  53. package/claude/skills/sd-use/SKILL.md +4 -4
  54. package/package.json +1 -1
  55. package/claude/output-styles/sd-tone.md +0 -152
  56. package/claude/skills/sd-demo/evals/fixtures/empty/.specs/260513120000_warehouse/spec.md +0 -45
  57. package/claude/skills/sd-demo/evals/fixtures/with-existing-screen/.specs/260513120000_warehouse/spec.md +0 -42
  58. package/claude/skills/sd-demo/evals/fixtures/with-existing-screen/packages/app/src/screens/dashboard/dashboard.view.ts +0 -33
  59. package/claude/skills/sd-demo/evals/fixtures/with-master-screen/.specs/260513120000_warehouse/spec.md +0 -45
  60. package/claude/skills/sd-demo/evals/fixtures/with-master-screen/packages/app/src/screens/dashboard/dashboard.view.ts +0 -33
  61. package/claude/skills/sd-demo/evals/fixtures/with-modal/.specs/260513120000_warehouse/spec.md +0 -75
  62. package/claude/skills/sd-demo/evals/fixtures/with-modal/packages/app/src/screens/dashboard/dashboard.view.ts +0 -33
  63. package/claude/skills/sd-demo/evals/fixtures/with-screens/.specs/260513120000_warehouse/spec.md +0 -45
  64. package/claude/skills/sd-demo/evals/fixtures/with-screens/packages/app/src/screens/dashboard/dashboard.view.ts +0 -33
  65. package/claude/skills/sd-dev/evals/fixtures/case-add/package.json +0 -13
  66. package/claude/skills/sd-dev/evals/fixtures/case-add/src/index.ts +0 -10
  67. package/claude/skills/sd-dev/evals/fixtures/case-add/tests/index.test.ts +0 -11
  68. package/claude/skills/sd-dev/evals/fixtures/case-add/tsconfig.json +0 -12
  69. package/claude/skills/sd-dev/evals/fixtures/case-bug/package.json +0 -13
  70. package/claude/skills/sd-dev/evals/fixtures/case-bug/src/index.ts +0 -10
  71. package/claude/skills/sd-dev/evals/fixtures/case-bug/tests/index.test.ts +0 -11
  72. package/claude/skills/sd-dev/evals/fixtures/case-bug/tsconfig.json +0 -12
  73. package/claude/skills/sd-dev/evals/fixtures/case-modify/package.json +0 -13
  74. package/claude/skills/sd-dev/evals/fixtures/case-modify/src/index.ts +0 -10
  75. package/claude/skills/sd-dev/evals/fixtures/case-modify/tests/index.test.ts +0 -11
  76. package/claude/skills/sd-impl/evals/fixtures/case-001-new-screen/spec.md +0 -55
  77. package/claude/skills/sd-impl/evals/fixtures/case-002-auto-process/spec.md +0 -55
  78. package/claude/skills/sd-impl/evals/fixtures/case-003-update-screen/packages/client/src/pages/book-list.ts +0 -22
  79. package/claude/skills/sd-impl/evals/fixtures/case-003-update-screen/spec.md +0 -57
  80. package/claude/skills/sd-impl/evals/fixtures/case-004-ambiguous-spec/spec.md +0 -58
  81. package/claude/skills/sd-impl/evals/fixtures/case-005-id-mismatch/spec.md +0 -52
  82. package/claude/skills/sd-impl/evals/fixtures/case-006-with-reference-units/packages/client/src/pages//352/261/260/353/236/230/354/262/230//352/261/260/353/236/230/354/262/230-/353/252/251/353/241/235.test.ts +0 -10
  83. package/claude/skills/sd-impl/evals/fixtures/case-006-with-reference-units/packages/client/src/pages//352/261/260/353/236/230/354/262/230//352/261/260/353/236/230/354/262/230-/353/252/251/353/241/235.ts +0 -11
  84. package/claude/skills/sd-impl/evals/fixtures/case-006-with-reference-units/packages/server/src/data-access//352/261/260/353/236/230/354/262/230-/354/240/221/352/267/274.ts +0 -12
  85. package/claude/skills/sd-impl/evals/fixtures/case-006-with-reference-units/packages/server/src/models//352/261/260/353/236/230/354/262/230.ts +0 -8
  86. package/claude/skills/sd-impl/evals/fixtures/case-006-with-reference-units/spec.md +0 -77
  87. package/claude/skills/sd-impl/evals/fixtures/case-new/.specs/260514120000_/352/261/260/353/236/230/354/262/230/spec.md +0 -101
  88. package/claude/skills/sd-impl/evals/fixtures/case-update/.specs/260514120000_/352/261/260/353/236/230/354/262/230/spec.md +0 -101
  89. package/claude/skills/sd-impl/evals/fixtures/case-update/src//352/261/260/353/236/230/354/262/230//352/261/260/353/236/230/354/262/230-/353/252/250/353/215/270.txt +0 -1
  90. package/claude/skills/sd-impl/evals/fixtures/case-update/src//352/261/260/353/236/230/354/262/230//352/261/260/353/236/230/354/262/230-/353/252/251/353/241/235.txt +0 -1
  91. package/claude/skills/sd-impl/references/spec-cross-check.md +0 -82
  92. package/claude/skills/sd-skill/evals/fixtures/with-existing-review/.claude/skills/review/SKILL.md +0 -14
  93. package/claude/skills/sd-skill/references/eval-authoring.md +0 -81
  94. package/claude/skills/sd-skill/references/eval-run.md +0 -32
  95. package/claude/skills/sd-skill/references/skill-authoring.md +0 -70
  96. /package/claude/skills/{sd-skill/evals/fixtures/empty → sd-dev/evals/fixtures/minimal-ts-pkg/src}/.gitkeep +0 -0
@@ -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,9 +617,7 @@ flowchart LR
638
617
  - 대처: 위 전제 하에 지수 백오프로 재시도, 최대 5회
639
618
  - 재시도 한계 초과: 관리자 알림 (이후 수동 확인 필요)
640
619
 
641
- 관련 섹션: [화면.입고 스캔]
642
-
643
- ## 10. 본문 외 결정사항
620
+ ## 10. 본문 외 확정 사항
644
621
 
645
622
  - 2026-04-01 [제외]: 직원 관리 사원번호 컬럼 추가
646
623
  - 근거: 본 spec 범위 밖 — 인사 마스터 영역
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: sd-unpack
3
- description: 메일·문서(eml/msg/pdf/docx/pptx/xlsx/xlsb, 레거시 doc/ppt/xls)를 첨부 포함 재귀적으로 풀어 평문 트리로 펼친다. Use when 위 형식 파일의 본문·첨부 전반을 훑어야 할 때 (분석·요약·정리·검토 등). 단순 단답 조회(특정 값/셀 확인)나 옆에 이미 펼친 `<basename>_<ext>/` 폴더가 있으면 호출 X.
3
+ description: 메일·문서(eml/msg/pdf/docx/pptx/xlsx/xlsb, 레거시 doc/ppt/xls)를 첨부 포함 재귀적으로 풀어 평문 트리로 펼치기. Use when 위 형식 파일의 본문·첨부 전반을 훑어야 할 때 (분석·요약·정리·검토 등). 단순 단답 조회(특정 값/셀 확인)나 옆에 이미 펼친 `<basename>_<ext>/` 폴더가 있으면 호출 X.
4
4
 
5
5
  ---
6
6
 
@@ -12,9 +12,9 @@ description: 메일·문서(eml/msg/pdf/docx/pptx/xlsx/xlsb, 레거시 doc/ppt/x
12
12
  python .claude/skills/sd-unpack/scripts/unpack.py <입력파일 절대경로>
13
13
  ```
14
14
 
15
- 스크립트가 형식 분기·재귀 풀이·README 생성까지 알아서 처리한다. stdout 으로 결과 폴더 절대경로가 출력된다.
15
+ 스크립트가 형식 분기·재귀 풀이·README 생성까지 알아서 처리함. stdout 으로 결과 폴더 절대경로가 출력됨.
16
16
 
17
- 여러 파일을 풀어달라는 요청이 오면 단일 파일 단위로 반복 호출한다.
17
+ 여러 파일을 풀어달라는 요청이 오면 단일 파일 단위로 반복 호출함.
18
18
 
19
19
  ## 환경
20
20
 
@@ -22,11 +22,11 @@ Windows + MS Office 필요 (docx/pptx/xlsx 변환). Python 패키지 의존은 `
22
22
 
23
23
  ## 결과 폴더
24
24
 
25
- 입력 파일 옆에 `<basename>_<ext>/` 가 생긴다. 컨테이너 첨부는 같은 패턴으로 재귀적으로 풀린다. 폴더 안 `_source.<ext>` + `README.md` 가 풀린 폴더의 식별 마커.
25
+ 입력 파일 옆에 `<basename>_<ext>/` 가 생김. 컨테이너 첨부는 같은 패턴으로 재귀적으로 풀림. 폴더 안 `_source.<ext>` + `README.md` 가 풀린 폴더의 식별 마커.
26
26
 
27
27
  동일 입력 재호출 시 기존 결과 폴더는 사전 삭제 후 재생성 (이전 산출 잔존물 섞이지 않게).
28
28
 
29
- 시각은 PNG, 텍스트/구조는 JSONL/JSON/MD 로 분리해 출력한다.
29
+ 시각은 PNG, 텍스트/구조는 JSONL/JSON/MD 로 분리해 출력함.
30
30
 
31
31
  ```
32
32
  meeting_eml/
@@ -72,66 +72,66 @@ meeting_eml/
72
72
  모든 jsonl 출력은 **한 줄 = 한 노드 (또는 한 행/셀)**. 빈 키 생략. JSON 네이티브 타입 보존. datetime → ISO 8601 문자열.
73
73
 
74
74
  조회 패턴:
75
- - 좌표·인덱스 직격 grep (`"r":11`·`"slide":5`·`"node":42`)
76
- - 키 grep (`"type":"heading"`·`"_f"` 수식 행만)
77
- - Read offset = 행/노드 인덱스 1:1 (빈 노드도 한 줄 유지)
75
+ - 좌표·인덱스 직격 grep (`"r":11`·`"slide":5`·`"node":42`).
76
+ - 키 grep (`"type":"heading"`·`"_f"` 수식 행만).
77
+ - Read offset = 행/노드 인덱스 1:1 (빈 노드도 한 줄 유지).
78
78
 
79
79
  ## xlsx jsonl 규약
80
80
 
81
81
  시트별 `.jsonl` — 분석 핵심 (값·number_format·수식·merges·hyperlinks·comments). 시각 표시 (바탕색·border·폰트)·frozen·dims 는 미보존 (PNG 가 시각 보조, 필요 시 `_source.xlsx` 직접 추출).
82
82
 
83
- - 첫 줄: `{"_meta":{"merges":["A1:C1",...], "number_formats":{"E1":"yyyy-mm-dd",...}, "hyperlinks":{"D5":"http://..."}, "comments":{"E3":"메모"}}}`
84
- - `merges`: 머지된 셀 영역 (셀 좌표 해석에 필수 — 머지 영역 안 빈 셀 오해 차단)
85
- - `number_formats`: General(기본) 외 셀 표시 형식 — Date·통화·% 등 셀 값 의미 단서
86
- - `hyperlinks`: 셀 URL (URL 자체가 셀 정보)
87
- - `comments`: 셀 메모
88
- - 비어있는 메타 키는 생략 (모두 비면 `{"_meta":{}}`)
89
- - 데이터 줄: `{"r":11, "A":"P001", "I":7800, "J":12.5, "_f":{"I":"=SUM(...)", "J":"=I11*1.5"}}`
90
- - `r`: 1-based 행번호 (Excel 동일)
91
- - 열문자 키 (`A`·`B`·...·`AA`·...): 셀 값. 빈 셀은 키 생략
92
- - `_f`: 같은 행 수식 맵 `{열문자: 수식문자열}`. 수식 없는 행은 키 생략
93
- - 빈 행도 `{"r":N}` 한 줄 유지 → Read offset = 행번호 (오프바이원 차단)
94
- - 값 타입: JSON 네이티브 (`int`·`float`·`bool`·`str`), datetime 은 ISO 8601 문자열
83
+ - 첫 줄: `{"_meta":{"merges":["A1:C1",...], "number_formats":{"E1":"yyyy-mm-dd",...}, "hyperlinks":{"D5":"http://..."}, "comments":{"E3":"메모"}}}`.
84
+ - `merges`: 머지된 셀 영역 (셀 좌표 해석에 필수 — 머지 영역 안 빈 셀 오해 차단).
85
+ - `number_formats`: General(기본) 외 셀 표시 형식 — Date·통화·% 등 셀 값 의미 단서.
86
+ - `hyperlinks`: 셀 URL (URL 자체가 셀 정보).
87
+ - `comments`: 셀 메모.
88
+ - 비어있는 메타 키는 생략 (모두 비면 `{"_meta":{}}`).
89
+ - 데이터 줄: `{"r":11, "A":"P001", "I":7800, "J":12.5, "_f":{"I":"=SUM(...)", "J":"=I11*1.5"}}`.
90
+ - `r`: 1-based 행번호 (Excel 동일).
91
+ - 열문자 키 (`A`·`B`·...·`AA`·...): 셀 값. 빈 셀은 키 생략.
92
+ - `_f`: 같은 행 수식 맵 `{열문자: 수식문자열}`. 수식 없는 행은 키 생략.
93
+ - 빈 행도 `{"r":N}` 한 줄 유지 → Read offset = 행번호 (오프바이원 차단).
94
+ - 값 타입: JSON 네이티브 (`int`·`float`·`bool`·`str`), datetime 은 ISO 8601 문자열.
95
95
 
96
96
  ### Chartsheet (시트 자체가 차트)
97
97
 
98
98
  xlsx 안 시트는 일반 Worksheet 외에 **Chartsheet** (셀 없이 차트 1개) 도 있을 수 있음.
99
99
 
100
- - Chartsheet 는 `sheets/<idx>_<name>.jsonl` 미생성 (셀 없음)
101
- - Chartsheet 의 차트 데이터: `charts/sheet<idx>_chart.data.json`
102
- - README sheet_summaries 에 `(chart sheet — "...")` 명시
103
- - 일반 시트·Chartsheet 통합 시트 순서 (idx) 대로 보존
100
+ - Chartsheet 는 `sheets/<idx>_<name>.jsonl` 미생성 (셀 없음).
101
+ - Chartsheet 의 차트 데이터: `charts/sheet<idx>_chart.data.json`.
102
+ - README sheet_summaries 에 `(chart sheet — "...")` 명시.
103
+ - 일반 시트·Chartsheet 통합 시트 순서 (idx) 대로 보존.
104
104
 
105
105
  ### 워크북 단위 `workbook.meta.json`
106
106
 
107
107
  시트 외 워크북 공통 정보 (있을 때만 생성):
108
108
 
109
- - `defined_names`: `{"이름":["'Sheet1'!$A$1:$C$10", ...]}` (다중 destination 시 list 다수 항목)
110
- - `sheet_code_map`: `{"Sheet1":"BOA", ...}` (VBA codeName → raw 시트명. 매크로 모듈 파일명과 매칭용)
111
- - `pivots`: pivot table 정의 list. 각 항목 `{name, source, location, rowFields, colFields, pageFields, dataFields}`. 결과 셀은 시트별 jsonl 에 일반 셀로 들어감
109
+ - `defined_names`: `{"이름":["'Sheet1'!$A$1:$C$10", ...]}` (다중 destination 시 list 다수 항목).
110
+ - `sheet_code_map`: `{"Sheet1":"BOA", ...}` (VBA codeName → raw 시트명. 매크로 모듈 파일명과 매칭용).
111
+ - `pivots`: pivot table 정의 list. 각 항목 `{name, source, location, rowFields, colFields, pageFields, dataFields}`. 결과 셀은 시트별 jsonl 에 일반 셀로 들어감.
112
112
 
113
113
  ## pptx jsonl 규약
114
114
 
115
115
  슬라이드별 `slides/<idx>_<title>.jsonl`. 원본 XML 순서 (shape_idx 순) 그대로. 시각 순서는 `pos` 좌표 기반으로 Claude 가 필요시 정렬.
116
116
 
117
- - 첫 줄: `{"_meta":{"slide":N, "title":"슬라이드 제목 또는 빈 문자열", "size":[w,h], "shapes":S}}`
118
- - `size`: 슬라이드 폭/높이 (EMU 단위, python-pptx 원본)
119
- - `shapes`: 노드
120
- - 노드 줄: `{"slide":N, "type":"<type>", "pos":[x,y,w,h], "shape_idx":S, ...추가 키}`
121
- - `slide`: 1-based 슬라이드 번호
122
- - `type`: 노드 종류 (아래)
123
- - `pos`: [x,y,w,h] EMU 좌표 (914400 EMU = 1 inch)
124
- - `shape_idx`: 원본 XML shape index (0-based)
117
+ - 첫 줄: `{"_meta":{"slide":N, "title":"슬라이드 제목 또는 빈 문자열", "size":[w,h], "shapes":S}}`.
118
+ - `size`: 슬라이드 폭/높이 (EMU 단위, python-pptx 원본).
119
+ - `shapes`: 노드 수.
120
+ - 노드 줄: `{"slide":N, "type":"<type>", "pos":[x,y,w,h], "shape_idx":S, ...추가 키}`.
121
+ - `slide`: 1-based 슬라이드 번호.
122
+ - `type`: 노드 종류 (아래).
123
+ - `pos`: [x,y,w,h] EMU 좌표 (914400 EMU = 1 inch).
124
+ - `shape_idx`: 원본 XML shape index (0-based).
125
125
 
126
126
  노드 type:
127
- - `title`: 슬라이드 제목 placeholder. 키 `text`·`para_idx`
128
- - `para`: 일반 문단. 키 `text`·`para_idx`
129
- - `bullet`: 글머리 항목 (paragraph.level > 0). 키 `text`·`para_idx`·`level`
130
- - `table_cell`: 표 셀. 키 `table_idx`·`row`·`col` (1-based)·`text`
131
- - 셀 안 multi-paragraph 는 `\n` join
132
- - `image`: 그림. 키 `ref` (`images/...` 상대경로)
133
- - `chart`: 차트. 키 `ref` (`charts/...` 상대경로)
134
- - `shape`: 도형/SmartArt/그룹. 키 `subtype`
127
+ - `title`: 슬라이드 제목 placeholder. 키 `text`·`para_idx`.
128
+ - `para`: 일반 문단. 키 `text`·`para_idx`.
129
+ - `bullet`: 글머리 항목 (paragraph.level > 0). 키 `text`·`para_idx`·`level`.
130
+ - `table_cell`: 표 셀. 키 `table_idx`·`row`·`col` (1-based)·`text`.
131
+ - 셀 안 multi-paragraph 는 `\n` join.
132
+ - `image`: 그림. 키 `ref` (`images/...` 상대경로).
133
+ - `chart`: 차트. 키 `ref` (`charts/...` 상대경로).
134
+ - `shape`: 도형/SmartArt/그룹. 키 `subtype`.
135
135
 
136
136
  paragraph 안 hyperlink 가 있으면 `hyperlinks`: `[{"text":"...", "url":"..."}, ...]` 추가 키 (run 단위).
137
137
 
@@ -141,37 +141,37 @@ paragraph 안 hyperlink 가 있으면 `hyperlinks`: `[{"text":"...", "url":"..."
141
141
 
142
142
  문서 단일 시퀀스 `content.jsonl`. 페이지 단위 폐기 (Word 렌더 산물). 원본 = python-docx 의 문단/표/이미지 시퀀스.
143
143
 
144
- - 첫 줄: `{"_meta":{"paragraphs":P, "tables":T, "images":I}}`
145
- - 노드 줄: `{"node":N, "type":"<type>", ...추가 키}`
146
- - `node`: 0-based 시퀀스 인덱스 (Read offset = node)
144
+ - 첫 줄: `{"_meta":{"paragraphs":P, "tables":T, "images":I}}`.
145
+ - 노드 줄: `{"node":N, "type":"<type>", ...추가 키}`.
146
+ - `node`: 0-based 시퀀스 인덱스 (Read offset = node).
147
147
 
148
148
  노드 type:
149
- - `heading`: 키 `text`·`level` (1·2·3·...) — docx Heading 스타일 기반만 (휴리스틱 추정 X)
150
- - `para`: 키 `text` (빈 paragraph 도 노드로 보존, text="")
151
- - `bullet`: 키 `text`·`level` (0-based ilvl)
152
- - `table_cell`: 키 `table_idx`·`row`·`col` (1-based)·`text`. 머지 시 `colspan` 추가 (gridSpan>1 일 때만). vMerge='continue' cell 은 skip (origin 만)
153
- - `image`: 키 `ref` (`images/...` 상대경로)
149
+ - `heading`: 키 `text`·`level` (1·2·3·...) — docx Heading 스타일 기반만 (휴리스틱 추정 X).
150
+ - `para`: 키 `text` (빈 paragraph 도 노드로 보존, text="").
151
+ - `bullet`: 키 `text`·`level` (0-based ilvl).
152
+ - `table_cell`: 키 `table_idx`·`row`·`col` (1-based)·`text`. 머지 시 `colspan` 추가 (gridSpan>1 일 때만). vMerge='continue' cell 은 skip (origin 만).
153
+ - `image`: 키 `ref` (`images/...` 상대경로).
154
154
 
155
155
  paragraph 안 hyperlink 가 있으면 `hyperlinks`: `[{"text":"...", "url":"..."}, ...]` 추가 키.
156
156
 
157
157
  페이지 매핑 별도 `pages.meta.json`:
158
- - `{"001":{"text":"<페이지 평문>"}, "002":{...}, ...}` (PNG 페이지 ↔ fitz 추출 raw text)
159
- - PNG 는 fitz 페이지 분할 그대로 (시각 검증용)
160
- - 노드 인덱스 자동 매핑은 미적용 (fitz·python-docx 텍스트 분할 차이로 오매핑 위험) — Claude 가 페이지 text 와 content.jsonl 노드 text 를 직접 grep 비교
158
+ - `{"001":{"text":"<페이지 평문>"}, "002":{...}, ...}` (PNG 페이지 ↔ fitz 추출 raw text).
159
+ - PNG 는 fitz 페이지 분할 그대로 (시각 검증용).
160
+ - 노드 인덱스 자동 매핑은 미적용 (fitz·python-docx 텍스트 분할 차이로 오매핑 위험) — Claude 가 페이지 text 와 content.jsonl 노드 text 를 직접 grep 비교.
161
161
 
162
162
  ## pdf jsonl 규약
163
163
 
164
164
  페이지별 `pages/<NNN>.jsonl`. PDF 페이지는 원본 단위.
165
165
 
166
- - 첫 줄: `{"_meta":{"page":N, "size":[w,h], "blocks":B, "tables":T, "table_cells":C, "form_fields":F, "annotations":A}}`
166
+ - 첫 줄: `{"_meta":{"page":N, "size":[w,h], "blocks":B, "tables":T, "table_cells":C, "form_fields":F, "annotations":A}}`.
167
167
  - 노드 줄:
168
- - `text_block`: `{"page":N, "block":B, "type":"text_block", "bbox":[x0,y0,x1,y1], "text":"..."}`
169
- - `image_block`: `{"page":N, "block":B, "type":"image_block", "bbox":[...], "ref":"images/p001_b03.png"}`
170
- - `table_cell`: `{"page":N, "type":"table_cell", "table_idx":T, "table_bbox":[...], "row":R, "col":C, "text":"..."}`
171
- - `form_field`: `{"page":N, "type":"form_field", "name":"...", "field_type":"text", "value":"...", "bbox":[...]}` (PDF 양식 입력란)
172
- - `annotation`: `{"page":N, "type":"annotation", "subtype":"Highlight", "bbox":[...], "content":"...", "author":"..."}` (주석·highlight·sticky note)
173
- - 모든 블록 보존 (표 영역과 겹쳐도 skip 안 함) — find_tables 정확도 100% 가정 시 정보 손실 위험 회피. text_block·image_block·table_cell 노드가 동일 영역에 중복 출력될 수 있음. Claude 가 양쪽 비교 판단
174
- - bbox 는 PDF 기준 좌표 (left-top, pt 단위, raw float)
168
+ - `text_block`: `{"page":N, "block":B, "type":"text_block", "bbox":[x0,y0,x1,y1], "text":"..."}`.
169
+ - `image_block`: `{"page":N, "block":B, "type":"image_block", "bbox":[...], "ref":"images/p001_b03.png"}`.
170
+ - `table_cell`: `{"page":N, "type":"table_cell", "table_idx":T, "table_bbox":[...], "row":R, "col":C, "text":"..."}`.
171
+ - `form_field`: `{"page":N, "type":"form_field", "name":"...", "field_type":"text", "value":"...", "bbox":[...]}` (PDF 양식 입력란).
172
+ - `annotation`: `{"page":N, "type":"annotation", "subtype":"Highlight", "bbox":[...], "content":"...", "author":"..."}` (주석·highlight·sticky note).
173
+ - 모든 블록 보존 (표 영역과 겹쳐도 skip 안 함) — find_tables 정확도 100% 가정 시 정보 손실 위험 회피. text_block·image_block·table_cell 노드가 동일 영역에 중복 출력될 수 있음. Claude 가 양쪽 비교 판단.
174
+ - bbox 는 PDF 기준 좌표 (left-top, pt 단위, raw float).
175
175
 
176
176
  heading 추출은 미적용 (PDF 는 style 정보 없음). OCR 미적용 (스캔 PDF 는 image_block 만 추출).
177
177
 
@@ -179,11 +179,11 @@ heading 추출은 미적용 (PDF 는 style 정보 없음). OCR 미적용 (스캔
179
179
 
180
180
  본문 안 `<img cid:...>` 가 첨부의 어느 파일인지 추적.
181
181
 
182
- - `images.rels.json`: `{"<cid>":"attachments/image001.png", ...}` (HTML 본문 안 cid → 첨부 파일명)
183
- - HTML→평문 변환본 안 원래 `<img>` 위치에 `![image001.png](attachments/image001.png)` placeholder 삽입
184
- - text/plain 만 있을 때 → `body.md` 자체가 변환본 → placeholder 포함
185
- - text/plain·HTML 둘 다 있을 때 → `body.md` 는 plain (placeholder 없음), `body.from_html.md` 가 변환본 (placeholder 포함)
186
- - 인라인 이미지 없으면 `images.rels.json` 미생성
182
+ - `images.rels.json`: `{"<cid>":"attachments/image001.png", ...}` (HTML 본문 안 cid → 첨부 파일명).
183
+ - HTML→평문 변환본 안 원래 `<img>` 위치에 `![image001.png](attachments/image001.png)` placeholder 삽입.
184
+ - text/plain 만 있을 때 → `body.md` 자체가 변환본 → placeholder 포함.
185
+ - text/plain·HTML 둘 다 있을 때 → `body.md` 는 plain (placeholder 없음), `body.from_html.md` 가 변환본 (placeholder 포함).
186
+ - 인라인 이미지 없으면 `images.rels.json` 미생성.
187
187
 
188
188
  ## TNEF (winmail.dat) 풀이
189
189
 
@@ -195,27 +195,27 @@ Outlook RTF 메일이 첨부를 `winmail.dat` 단일 binary (TNEF 형식) 로
195
195
 
196
196
  본문 흐름 정확성(text/plain 우선) + 인라인 이미지 위치 단서(HTML→평문 변환본) 둘 다 보존:
197
197
 
198
- - `body.md`: 항상 별도 파일 (인라인 cutoff 폐기)
199
- - text/plain 있으면 우선 — 발신자가 의도한 평문, 변환 잡음 없음
200
- - 없으면 text/html → 평문 추출
201
- - `body.from_html.md`: text/plain·HTML 둘 다 있을 때만 별도 생성
202
- - HTML→평문 변환 (이미지 위치 placeholder 포함)
203
- - body.md 가 plain 이라 잃은 위치 정보를 보완
204
- - `body.html`: 원본 HTML (있을 때)
205
- - `headers.json`: 모든 메일 헤더 원본 보존 (envelope + `X-Mailer`·`Authentication-Results` 등 모두). 동일 키 다수면 list 누적
206
- - README 헤더 섹션에는 표준 envelope 키만 표기 (전체는 headers.json 직접 조회)
198
+ - `body.md`: 항상 별도 파일 (인라인 cutoff 폐기).
199
+ - text/plain 있으면 우선 — 발신자가 의도한 평문, 변환 잡음 없음.
200
+ - 없으면 text/html → 평문 추출.
201
+ - `body.from_html.md`: text/plain·HTML 둘 다 있을 때만 별도 생성.
202
+ - HTML→평문 변환 (이미지 위치 placeholder 포함).
203
+ - body.md 가 plain 이라 잃은 위치 정보를 보완.
204
+ - `body.html`: 원본 HTML (있을 때).
205
+ - `headers.json`: 모든 메일 헤더 원본 보존 (envelope + `X-Mailer`·`Authentication-Results` 등 모두). 동일 키 다수면 list 누적.
206
+ - README 헤더 섹션에는 표준 envelope 키만 표기 (전체는 headers.json 직접 조회).
207
207
 
208
208
  ## xlsb 클린업
209
209
 
210
- - legacy → xlsx 변환 시 `_converted.xlsx` 는 임시 폴더에서만 처리 (산출 폴더에 미잔존)
211
- - VBA 매크로는 원본 코드 그대로 `macros/<모듈명>.vba` 저장 (변형 X)
212
- - VBA 시트 객체명↔raw 시트명 매핑은 `workbook.meta.json` 의 `sheet_code_map` 키 (예: `{"Sheet1":"BOA","Sheet3":"Mapping"}`)
210
+ - legacy → xlsx 변환 시 `_converted.xlsx` 는 임시 폴더에서만 처리 (산출 폴더에 미잔존).
211
+ - VBA 매크로는 원본 코드 그대로 `macros/<모듈명>.vba` 저장 (변형 X).
212
+ - VBA 시트 객체명↔raw 시트명 매핑은 `workbook.meta.json` 의 `sheet_code_map` 키 (예: `{"Sheet1":"BOA","Sheet3":"Mapping"}`).
213
213
 
214
214
  ## 산출물 사용
215
215
 
216
- 후속 스킬(sd-spec 등)은 결과 폴더의 `README.md` 한 번 Read 로 본문 위치·헤더·첨부 목록·손실 영역을 모두 파악할 수 있다. 컨테이너 첨부는 자체 `README.md` 를 가지므로 재귀적으로 같은 방식으로 들어간다.
216
+ 후속 스킬(sd-spec 등)은 결과 폴더의 `README.md` 한 번 Read 로 본문 위치·헤더·첨부 목록·손실 영역을 모두 파악할 수 있음. 컨테이너 첨부는 자체 `README.md` 를 가지므로 재귀적으로 같은 방식으로 들어감.
217
217
 
218
218
  각 형식별 jsonl 의 grep 패턴:
219
- - xlsx: `"r":<행>` · `"_f"` (수식 행) · 열문자
220
- - pptx: `"slide":<N>` · `"type":"<type>"` · `"shape_idx":<S>`
221
- - docx: `"node":<N>` · `"type":"heading"` · `"table_idx":<T>`
219
+ - xlsx: `"r":<행>` · `"_f"` (수식 행) · 열문자 키.
220
+ - pptx: `"slide":<N>` · `"type":"<type>"` · `"shape_idx":<S>`.
221
+ - docx: `"node":<N>` · `"type":"heading"` · `"table_idx":<T>`.
@@ -1,9 +1,9 @@
1
1
  ---
2
2
  name: sd-use
3
- description: 사용자 요청을 분석해 워크스페이스의 sd-* 스킬 중 가장 적합한 스킬을 추천하는 스킬. Use when 어떤 sd-* 스킬을 써야 할지 모를
3
+ description: 사용자 요청을 분석해 워크스페이스의 sd-* 스킬 중 가장 적합한 스킬을 추천하는 스킬. Use when 어떤 sd-* 스킬을 써야 할지 모를 때.
4
4
  ---
5
5
 
6
- `/sd-use <요청>` 의 `<요청>` 에 적합한 sd-* 스킬을 추천만 하고 종료한다. 자동 실행·산출물 생성 금지.
7
- - 시스템 프롬프트내 sd-* 스킬의 프론트매터를 활용한다.
6
+ `/sd-use <요청>` 의 `<요청>` 에 적합한 sd-* 스킬을 추천만 하고 종료. 자동 실행·산출물 생성 금지.
7
+ - 시스템 프롬프트내 sd-* 스킬의 프론트매터를 활용함.
8
8
  - 추천 후보에서 sd-use 자신은 제외 (회귀 방지).
9
- - 추천할 여러 스킬이 있다면, 추천순대로 나열하고 각각의 추천 이유를 출력한다.
9
+ - 추천할 여러 스킬이 있다면, 추천순대로 나열하고 각각의 추천 이유를 출력함.
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.81",
4
4
  "description": "심플리즘 패키지 - Claude Code 셋업",
5
5
  "author": "심플리즘",
6
6
  "license": "Apache-2.0",