@simplysm/sd-claude 14.0.80 → 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 +306 -293
- package/claude/rules/sd-design-rules.md +44 -44
- 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 +40 -48
- 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/src/.gitkeep +0 -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 +99 -91
- 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 -0
- package/claude/skills/sd-spec/SKILL.md +251 -246
- package/claude/skills/sd-spec/references/example-spec.md +1 -1
- 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/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
|
@@ -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
|
+
- 추천할 여러 스킬이 있다면, 추천순대로 나열하고 각각의 추천 이유를 출력함.
|
package/package.json
CHANGED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
# 창고 관리 요구 분석서
|
|
2
|
-
|
|
3
|
-
## 1. 개요
|
|
4
|
-
|
|
5
|
-
### 1.1 핵심 목적
|
|
6
|
-
|
|
7
|
-
창고 입출고 및 기준정보를 관리한다.
|
|
8
|
-
|
|
9
|
-
## 4. 화면
|
|
10
|
-
|
|
11
|
-
| § | 분류 | 화면 | 유형 | 장치 |
|
|
12
|
-
| --- | -------- | ------------- | ------ | ---- |
|
|
13
|
-
| 4.1 | 기준정보 | Item Register | 마스터 | PC |
|
|
14
|
-
|
|
15
|
-
### 4.1 Item Register (PC) [확정: 2026-05-13]
|
|
16
|
-
|
|
17
|
-
Actor: Warehouse Manager
|
|
18
|
-
|
|
19
|
-
기능 개요:
|
|
20
|
-
|
|
21
|
-
- Register and edit items.
|
|
22
|
-
|
|
23
|
-
와이어프레임:
|
|
24
|
-
|
|
25
|
-
```
|
|
26
|
-
┌──────────────────────────┐
|
|
27
|
-
│ Code [ ] │
|
|
28
|
-
│ Name [ ] │
|
|
29
|
-
│ [Save] [Cancel] │
|
|
30
|
-
└──────────────────────────┘
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
항목:
|
|
34
|
-
|
|
35
|
-
**입력 폼**
|
|
36
|
-
|
|
37
|
-
| 항목 | 종류 | 필수 | 도메인 매핑 | 비고 |
|
|
38
|
-
| ---- | ------ | ---- | ---------------- | ---- |
|
|
39
|
-
| Code | 텍스트 | O | [모델.Item.code] | - |
|
|
40
|
-
| Name | 텍스트 | O | [모델.Item.name] | - |
|
|
41
|
-
|
|
42
|
-
동작:
|
|
43
|
-
|
|
44
|
-
- [Save]: Save the form.
|
|
45
|
-
- [Cancel]: Reset the form.
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
# 창고 관리 요구 분석서
|
|
2
|
-
|
|
3
|
-
## 1. 개요
|
|
4
|
-
|
|
5
|
-
### 1.1 핵심 목적
|
|
6
|
-
|
|
7
|
-
창고 입출고 및 기준정보를 관리한다.
|
|
8
|
-
|
|
9
|
-
## 4. 화면
|
|
10
|
-
|
|
11
|
-
| § | 분류 | 화면 | 유형 | 장치 |
|
|
12
|
-
| --- | ---- | --------- | ---- | ---- |
|
|
13
|
-
| 4.1 | 메인 | Dashboard | 조회 | PC |
|
|
14
|
-
|
|
15
|
-
### 4.1 Dashboard (PC) [확정: 2026-05-13]
|
|
16
|
-
|
|
17
|
-
Actor: Warehouse Manager
|
|
18
|
-
|
|
19
|
-
기능 개요:
|
|
20
|
-
|
|
21
|
-
- Show warehouse summary.
|
|
22
|
-
|
|
23
|
-
와이어프레임:
|
|
24
|
-
|
|
25
|
-
```
|
|
26
|
-
┌──────────────────────────┐
|
|
27
|
-
│ Total stock: ____ │
|
|
28
|
-
│ [Refresh] │
|
|
29
|
-
└──────────────────────────┘
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
항목:
|
|
33
|
-
|
|
34
|
-
**입력 폼**
|
|
35
|
-
|
|
36
|
-
| 항목 | 종류 | 필수 | 도메인 매핑 | 비고 |
|
|
37
|
-
| ----------- | ---- | ---- | ----------- | -------------------- |
|
|
38
|
-
| Total stock | 숫자 | X | - | 표시 전용 (readonly) |
|
|
39
|
-
|
|
40
|
-
동작:
|
|
41
|
-
|
|
42
|
-
- [Refresh]: Refresh data.
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ChangeDetectionStrategy,
|
|
3
|
-
Component,
|
|
4
|
-
ViewEncapsulation,
|
|
5
|
-
signal,
|
|
6
|
-
} from "@angular/core";
|
|
7
|
-
import { SdBaseContainer, injectViewTypeSignal } from "@simplysm/angular";
|
|
8
|
-
|
|
9
|
-
@Component({
|
|
10
|
-
selector: "app-dashboard-view",
|
|
11
|
-
standalone: true,
|
|
12
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
13
|
-
encapsulation: ViewEncapsulation.None,
|
|
14
|
-
imports: [SdBaseContainer],
|
|
15
|
-
template: `
|
|
16
|
-
<sd-base-container
|
|
17
|
-
[(ready)]="ready"
|
|
18
|
-
[initialized]="initialized()"
|
|
19
|
-
[(busyCount)]="busyCount"
|
|
20
|
-
[viewType]="viewType()"
|
|
21
|
-
>
|
|
22
|
-
<ng-template #contentTpl>
|
|
23
|
-
<div class="p-default">Existing Dashboard - manually edited</div>
|
|
24
|
-
</ng-template>
|
|
25
|
-
</sd-base-container>
|
|
26
|
-
`,
|
|
27
|
-
})
|
|
28
|
-
export class DashboardView {
|
|
29
|
-
ready = signal(false);
|
|
30
|
-
initialized = signal(true);
|
|
31
|
-
busyCount = signal(0);
|
|
32
|
-
viewType = injectViewTypeSignal();
|
|
33
|
-
}
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
# 창고 관리 요구 분석서
|
|
2
|
-
|
|
3
|
-
## 1. 개요
|
|
4
|
-
|
|
5
|
-
### 1.1 핵심 목적
|
|
6
|
-
|
|
7
|
-
창고 입출고 및 기준정보를 관리한다.
|
|
8
|
-
|
|
9
|
-
## 4. 화면
|
|
10
|
-
|
|
11
|
-
| § | 분류 | 화면 | 유형 | 장치 |
|
|
12
|
-
| --- | -------- | --------------- | ------ | ---- |
|
|
13
|
-
| 4.1 | 기준정보 | Location Master | 마스터 | PC |
|
|
14
|
-
|
|
15
|
-
### 4.1 Location Master (PC) [확정: 2026-05-13]
|
|
16
|
-
|
|
17
|
-
Actor: Warehouse Admin
|
|
18
|
-
|
|
19
|
-
기능 개요:
|
|
20
|
-
|
|
21
|
-
- 창고 로케이션 마스터를 관리한다 (등록·수정·삭제·복구·엑셀 입출력 포함 표준 마스터 화면).
|
|
22
|
-
|
|
23
|
-
와이어프레임:
|
|
24
|
-
|
|
25
|
-
```
|
|
26
|
-
[등록] [선택 삭제] [선택 복구] [엑셀 업로드] [엑셀 다운로드]
|
|
27
|
-
| [ ] | ID | 코드 | 이름 |
|
|
28
|
-
| [ ] | [E 2] | L-02 | 2층 창고 |
|
|
29
|
-
| [ ] | [E 1] | L-01 | 1층 창고 |
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
범례: `[ ]` = 행 선택 체크박스, `[E N]` = 편집 버튼 (N = ID). 클릭 시 인라인 편집.
|
|
33
|
-
|
|
34
|
-
항목:
|
|
35
|
-
|
|
36
|
-
**시트 컬럼**
|
|
37
|
-
|
|
38
|
-
| 컬럼 | 종류 | 도메인 매핑 | 비고 |
|
|
39
|
-
| ---- | ------ | -------------------- | ---- |
|
|
40
|
-
| 코드 | 텍스트 | [모델.Location.code] | - |
|
|
41
|
-
| 이름 | 텍스트 | [모델.Location.name] | - |
|
|
42
|
-
|
|
43
|
-
동작:
|
|
44
|
-
|
|
45
|
-
- 표준 마스터 동작 (등록·선택 삭제·선택 복구·엑셀 업/다운로드·ID 편집 클릭 시 인라인 편집).
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ChangeDetectionStrategy,
|
|
3
|
-
Component,
|
|
4
|
-
ViewEncapsulation,
|
|
5
|
-
signal,
|
|
6
|
-
} from "@angular/core";
|
|
7
|
-
import { SdBaseContainer, injectViewTypeSignal } from "@simplysm/angular";
|
|
8
|
-
|
|
9
|
-
@Component({
|
|
10
|
-
selector: "app-dashboard-view",
|
|
11
|
-
standalone: true,
|
|
12
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
13
|
-
encapsulation: ViewEncapsulation.None,
|
|
14
|
-
imports: [SdBaseContainer],
|
|
15
|
-
template: `
|
|
16
|
-
<sd-base-container
|
|
17
|
-
[(ready)]="ready"
|
|
18
|
-
[initialized]="initialized()"
|
|
19
|
-
[(busyCount)]="busyCount"
|
|
20
|
-
[viewType]="viewType()"
|
|
21
|
-
>
|
|
22
|
-
<ng-template #contentTpl>
|
|
23
|
-
<div class="p-default">대시보드</div>
|
|
24
|
-
</ng-template>
|
|
25
|
-
</sd-base-container>
|
|
26
|
-
`,
|
|
27
|
-
})
|
|
28
|
-
export class DashboardView {
|
|
29
|
-
ready = signal(false);
|
|
30
|
-
initialized = signal(true);
|
|
31
|
-
busyCount = signal(0);
|
|
32
|
-
viewType = injectViewTypeSignal();
|
|
33
|
-
}
|
package/claude/skills/sd-demo/evals/fixtures/with-modal/.specs/260513120000_warehouse/spec.md
DELETED
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
# 창고 관리 요구 분석서
|
|
2
|
-
|
|
3
|
-
## 1. 개요
|
|
4
|
-
|
|
5
|
-
### 1.1 핵심 목적
|
|
6
|
-
|
|
7
|
-
창고 입출고 및 기준정보를 관리한다.
|
|
8
|
-
|
|
9
|
-
## 4. 화면
|
|
10
|
-
|
|
11
|
-
| § | 분류 | 화면 | 유형 | 장치 |
|
|
12
|
-
| --- | -------- | --------------- | -------- | ---- |
|
|
13
|
-
| 4.1 | 기준정보 | Item List | 조회 | PC |
|
|
14
|
-
| 4.2 | 기준정보 | Item Edit Modal | 트랜잭션 | PC |
|
|
15
|
-
|
|
16
|
-
### 4.1 Item List (PC) [확정: 2026-05-13]
|
|
17
|
-
|
|
18
|
-
Actor: Warehouse Manager
|
|
19
|
-
|
|
20
|
-
기능 개요:
|
|
21
|
-
|
|
22
|
-
- Browse items registered in the warehouse.
|
|
23
|
-
|
|
24
|
-
와이어프레임:
|
|
25
|
-
|
|
26
|
-
```
|
|
27
|
-
[Register]
|
|
28
|
-
| Code | Name | Edit |
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
항목:
|
|
32
|
-
|
|
33
|
-
**시트 컬럼**
|
|
34
|
-
|
|
35
|
-
| 컬럼 | 종류 | 도메인 매핑 | 비고 |
|
|
36
|
-
| ---- | ------ | ---------------- | ---- |
|
|
37
|
-
| Code | 텍스트 | [모델.Item.code] | - |
|
|
38
|
-
| Name | 텍스트 | [모델.Item.name] | - |
|
|
39
|
-
|
|
40
|
-
동작:
|
|
41
|
-
|
|
42
|
-
- [Register]: → [화면.Item Edit Modal] 을 모달로 띄움.
|
|
43
|
-
- [Edit] (행 버튼): → [화면.Item Edit Modal] 을 모달로 띄움.
|
|
44
|
-
|
|
45
|
-
### 4.2 Item Edit Modal (PC) [확정: 2026-05-13]
|
|
46
|
-
|
|
47
|
-
Actor: Warehouse Manager
|
|
48
|
-
|
|
49
|
-
기능 개요:
|
|
50
|
-
|
|
51
|
-
- Create or edit an item via modal.
|
|
52
|
-
|
|
53
|
-
와이어프레임:
|
|
54
|
-
|
|
55
|
-
```
|
|
56
|
-
┌──────────────────────────┐
|
|
57
|
-
│ Code [ ] │
|
|
58
|
-
│ Name [ ] │
|
|
59
|
-
│ [Save] [Cancel] │
|
|
60
|
-
└──────────────────────────┘
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
항목:
|
|
64
|
-
|
|
65
|
-
**입력 폼**
|
|
66
|
-
|
|
67
|
-
| 항목 | 종류 | 필수 | 도메인 매핑 | 비고 |
|
|
68
|
-
| ---- | ------ | ---- | ---------------- | ---- |
|
|
69
|
-
| Code | 텍스트 | O | [모델.Item.code] | - |
|
|
70
|
-
| Name | 텍스트 | O | [모델.Item.name] | - |
|
|
71
|
-
|
|
72
|
-
동작:
|
|
73
|
-
|
|
74
|
-
- [Save]: Save and close the modal.
|
|
75
|
-
- [Cancel]: Close without saving.
|
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ChangeDetectionStrategy,
|
|
3
|
-
Component,
|
|
4
|
-
ViewEncapsulation,
|
|
5
|
-
signal,
|
|
6
|
-
} from "@angular/core";
|
|
7
|
-
import { SdBaseContainer, injectViewTypeSignal } from "@simplysm/angular";
|
|
8
|
-
|
|
9
|
-
@Component({
|
|
10
|
-
selector: "app-dashboard-view",
|
|
11
|
-
standalone: true,
|
|
12
|
-
changeDetection: ChangeDetectionStrategy.OnPush,
|
|
13
|
-
encapsulation: ViewEncapsulation.None,
|
|
14
|
-
imports: [SdBaseContainer],
|
|
15
|
-
template: `
|
|
16
|
-
<sd-base-container
|
|
17
|
-
[(ready)]="ready"
|
|
18
|
-
[initialized]="initialized()"
|
|
19
|
-
[(busyCount)]="busyCount"
|
|
20
|
-
[viewType]="viewType()"
|
|
21
|
-
>
|
|
22
|
-
<ng-template #contentTpl>
|
|
23
|
-
<div class="p-default">대시보드</div>
|
|
24
|
-
</ng-template>
|
|
25
|
-
</sd-base-container>
|
|
26
|
-
`,
|
|
27
|
-
})
|
|
28
|
-
export class DashboardView {
|
|
29
|
-
ready = signal(false);
|
|
30
|
-
initialized = signal(true);
|
|
31
|
-
busyCount = signal(0);
|
|
32
|
-
viewType = injectViewTypeSignal();
|
|
33
|
-
}
|
package/claude/skills/sd-demo/evals/fixtures/with-screens/.specs/260513120000_warehouse/spec.md
DELETED
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
# 창고 관리 요구 분석서
|
|
2
|
-
|
|
3
|
-
## 1. 개요
|
|
4
|
-
|
|
5
|
-
### 1.1 핵심 목적
|
|
6
|
-
|
|
7
|
-
창고 입출고 및 기준정보를 관리한다.
|
|
8
|
-
|
|
9
|
-
## 4. 화면
|
|
10
|
-
|
|
11
|
-
| § | 분류 | 화면 | 유형 | 장치 |
|
|
12
|
-
| --- | -------- | ------------- | ------ | ---- |
|
|
13
|
-
| 4.1 | 기준정보 | Item Register | 마스터 | PC |
|
|
14
|
-
|
|
15
|
-
### 4.1 Item Register (PC) [확정: 2026-05-13]
|
|
16
|
-
|
|
17
|
-
Actor: Warehouse Manager
|
|
18
|
-
|
|
19
|
-
기능 개요:
|
|
20
|
-
|
|
21
|
-
- Register and edit items.
|
|
22
|
-
|
|
23
|
-
와이어프레임:
|
|
24
|
-
|
|
25
|
-
```
|
|
26
|
-
┌──────────────────────────┐
|
|
27
|
-
│ Code [ ] │
|
|
28
|
-
│ Name [ ] │
|
|
29
|
-
│ [Save] [Cancel] │
|
|
30
|
-
└──────────────────────────┘
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
항목:
|
|
34
|
-
|
|
35
|
-
**입력 폼**
|
|
36
|
-
|
|
37
|
-
| 항목 | 종류 | 필수 | 도메인 매핑 | 비고 |
|
|
38
|
-
| ---- | ------ | ---- | ---------------- | ---- |
|
|
39
|
-
| Code | 텍스트 | O | [모델.Item.code] | - |
|
|
40
|
-
| Name | 텍스트 | O | [모델.Item.name] | - |
|
|
41
|
-
|
|
42
|
-
동작:
|
|
43
|
-
|
|
44
|
-
- [Save]: Save the form.
|
|
45
|
-
- [Cancel]: Reset the form.
|