@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.
- package/claude/references/sd-requirement-source-handling.md +17 -17
- package/claude/references/sd-simplysm14/README.md +58 -58
- package/claude/references/sd-simplysm14/manuals/client-component.md +739 -739
- package/claude/references/sd-simplysm14/manuals/client-crud.md +1 -1
- package/claude/references/sd-simplysm14/manuals/client-demo.md +1 -1
- package/claude/references/sd-simplysm14/manuals/client-setup.md +2 -2
- package/claude/references/sd-simplysm14/manuals/client-tab.md +2 -2
- package/claude/references/sd-simplysm14/manuals/logging.md +3 -3
- package/claude/references/sd-simplysm14/manuals/orm-union.md +7 -7
- package/claude/references/sd-simplysm14/manuals/orm.md +75 -75
- package/claude/references/sd-simplysm14/manuals/test.md +8 -8
- package/claude/rules/sd-base-rules.md +261 -354
- package/claude/rules/sd-design-rules.md +44 -0
- package/claude/{sd-check-forbidden-files.py → sd-check-edit.py} +2 -1
- package/claude/{sd-check-bash.py → sd-check-shell.py} +2 -2
- package/claude/settings.json +3 -4
- package/claude/skills/sd-commit/SKILL.md +17 -17
- package/claude/skills/sd-config/SKILL.md +4 -4
- package/claude/skills/sd-demo/SKILL.md +41 -43
- package/claude/skills/sd-demo/evals/fixtures/inventory-list/.specs/inventory/spec.md +99 -0
- package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/package.json +12 -0
- package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/index.ts +3 -0
- package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/inbound/inbound.list.ts +150 -0
- package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/inventory/inventory-master.list.ts +143 -0
- package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/outbound/outbound.list.ts +150 -0
- package/claude/skills/sd-demo/evals/fixtures/inventory-list/pnpm-workspace.yaml +2 -0
- package/claude/skills/sd-demo/evals/fixtures/inventory-list/sd.config.ts +12 -0
- package/claude/skills/sd-demo/evals/golden.jsonl +1 -5
- package/claude/skills/sd-dev/SKILL.md +49 -22
- package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/package.json +8 -0
- package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/tests/.gitkeep +0 -0
- package/claude/skills/sd-dev/evals/fixtures/{case-modify → minimal-ts-pkg}/tsconfig.json +1 -3
- package/claude/skills/sd-dev/evals/golden.jsonl +1 -3
- package/claude/skills/sd-docs/SKILL.md +8 -8
- package/claude/skills/sd-impl/SKILL.md +172 -82
- package/claude/skills/sd-impl/evals/fixtures/case-a-new-screen/.specs/260513120000_warehouse/spec.md +101 -0
- package/claude/skills/sd-impl/evals/fixtures/case-b-update-with-demo/.specs/260513120000_warehouse/spec.md +101 -0
- package/claude/skills/sd-impl/evals/fixtures/case-b-update-with-demo/packages/app/src/screens/box-register/box-register.view.ts +46 -0
- package/claude/skills/sd-impl/evals/fixtures/case-c-new-cross/.specs/260513120000_warehouse/spec.md +89 -0
- package/claude/skills/sd-impl/evals/fixtures/case-d-spec-modify/.specs/260513120000_warehouse/spec.md +101 -0
- package/claude/skills/sd-impl/evals/golden.jsonl +4 -6
- package/claude/skills/sd-review/SKILL.md +33 -0
- package/claude/skills/sd-review/evals/fixtures/code-review/src/foo.ts +7 -0
- package/claude/skills/sd-review/evals/fixtures/doc-review/docs/foo.md +4 -0
- package/claude/skills/sd-review/evals/golden.jsonl +2 -0
- package/claude/skills/sd-skill/SKILL.md +217 -29
- package/claude/skills/sd-skill/evals/fixtures/existing-skill/.claude/skills/todo-format/SKILL.md +14 -0
- package/claude/skills/sd-skill/evals/fixtures/new-skill/.gitkeep +0 -0
- package/claude/skills/sd-skill/evals/golden.jsonl +2 -5
- package/claude/skills/sd-spec/SKILL.md +384 -305
- package/claude/skills/sd-spec/references/example-spec.md +41 -64
- package/claude/skills/sd-unpack/SKILL.md +83 -83
- package/claude/skills/sd-use/SKILL.md +4 -4
- package/package.json +1 -1
- package/claude/output-styles/sd-tone.md +0 -152
- package/claude/skills/sd-demo/evals/fixtures/empty/.specs/260513120000_warehouse/spec.md +0 -45
- package/claude/skills/sd-demo/evals/fixtures/with-existing-screen/.specs/260513120000_warehouse/spec.md +0 -42
- package/claude/skills/sd-demo/evals/fixtures/with-existing-screen/packages/app/src/screens/dashboard/dashboard.view.ts +0 -33
- package/claude/skills/sd-demo/evals/fixtures/with-master-screen/.specs/260513120000_warehouse/spec.md +0 -45
- package/claude/skills/sd-demo/evals/fixtures/with-master-screen/packages/app/src/screens/dashboard/dashboard.view.ts +0 -33
- package/claude/skills/sd-demo/evals/fixtures/with-modal/.specs/260513120000_warehouse/spec.md +0 -75
- package/claude/skills/sd-demo/evals/fixtures/with-modal/packages/app/src/screens/dashboard/dashboard.view.ts +0 -33
- package/claude/skills/sd-demo/evals/fixtures/with-screens/.specs/260513120000_warehouse/spec.md +0 -45
- package/claude/skills/sd-demo/evals/fixtures/with-screens/packages/app/src/screens/dashboard/dashboard.view.ts +0 -33
- package/claude/skills/sd-dev/evals/fixtures/case-add/package.json +0 -13
- package/claude/skills/sd-dev/evals/fixtures/case-add/src/index.ts +0 -10
- package/claude/skills/sd-dev/evals/fixtures/case-add/tests/index.test.ts +0 -11
- package/claude/skills/sd-dev/evals/fixtures/case-add/tsconfig.json +0 -12
- package/claude/skills/sd-dev/evals/fixtures/case-bug/package.json +0 -13
- package/claude/skills/sd-dev/evals/fixtures/case-bug/src/index.ts +0 -10
- package/claude/skills/sd-dev/evals/fixtures/case-bug/tests/index.test.ts +0 -11
- package/claude/skills/sd-dev/evals/fixtures/case-bug/tsconfig.json +0 -12
- package/claude/skills/sd-dev/evals/fixtures/case-modify/package.json +0 -13
- package/claude/skills/sd-dev/evals/fixtures/case-modify/src/index.ts +0 -10
- package/claude/skills/sd-dev/evals/fixtures/case-modify/tests/index.test.ts +0 -11
- package/claude/skills/sd-impl/evals/fixtures/case-001-new-screen/spec.md +0 -55
- package/claude/skills/sd-impl/evals/fixtures/case-002-auto-process/spec.md +0 -55
- package/claude/skills/sd-impl/evals/fixtures/case-003-update-screen/packages/client/src/pages/book-list.ts +0 -22
- package/claude/skills/sd-impl/evals/fixtures/case-003-update-screen/spec.md +0 -57
- package/claude/skills/sd-impl/evals/fixtures/case-004-ambiguous-spec/spec.md +0 -58
- package/claude/skills/sd-impl/evals/fixtures/case-005-id-mismatch/spec.md +0 -52
- 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
- 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
- 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
- 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
- package/claude/skills/sd-impl/evals/fixtures/case-006-with-reference-units/spec.md +0 -77
- package/claude/skills/sd-impl/evals/fixtures/case-new/.specs/260514120000_/352/261/260/353/236/230/354/262/230/spec.md +0 -101
- package/claude/skills/sd-impl/evals/fixtures/case-update/.specs/260514120000_/352/261/260/353/236/230/354/262/230/spec.md +0 -101
- 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
- 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
- package/claude/skills/sd-impl/references/spec-cross-check.md +0 -82
- package/claude/skills/sd-skill/evals/fixtures/with-existing-review/.claude/skills/review/SKILL.md +0 -14
- package/claude/skills/sd-skill/references/eval-authoring.md +0 -81
- package/claude/skills/sd-skill/references/eval-run.md +0 -32
- package/claude/skills/sd-skill/references/skill-authoring.md +0 -70
- /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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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)를 첨부 포함 재귀적으로 풀어 평문 트리로
|
|
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 생성까지 알아서
|
|
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>/` 가
|
|
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>` 위치에 `` 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>` 위치에 `` 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 로 본문 위치·헤더·첨부 목록·손실 영역을 모두 파악할 수
|
|
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
|
+
- 추천할 여러 스킬이 있다면, 추천순대로 나열하고 각각의 추천 이유를 출력함.
|