@simplysm/sd-claude 14.0.80 → 14.0.82

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 (88) 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 +306 -293
  13. package/claude/rules/sd-design-rules.md +44 -44
  14. package/claude/skills/sd-commit/SKILL.md +17 -17
  15. package/claude/skills/sd-config/SKILL.md +4 -4
  16. package/claude/skills/sd-demo/SKILL.md +40 -48
  17. package/claude/skills/sd-demo/evals/fixtures/inventory-list/.specs/inventory/spec.md +99 -0
  18. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/package.json +12 -0
  19. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/index.ts +3 -0
  20. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/inbound/inbound.list.ts +150 -0
  21. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/inventory/inventory-master.list.ts +143 -0
  22. package/claude/skills/sd-demo/evals/fixtures/inventory-list/packages/demo-client/src/screens/outbound/outbound.list.ts +150 -0
  23. package/claude/skills/sd-demo/evals/fixtures/inventory-list/pnpm-workspace.yaml +2 -0
  24. package/claude/skills/sd-demo/evals/fixtures/inventory-list/sd.config.ts +12 -0
  25. package/claude/skills/sd-demo/evals/golden.jsonl +1 -5
  26. package/claude/skills/sd-dev/SKILL.md +49 -22
  27. package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/package.json +8 -0
  28. package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/src/.gitkeep +0 -0
  29. package/claude/skills/sd-dev/evals/fixtures/minimal-ts-pkg/tests/.gitkeep +0 -0
  30. package/claude/skills/sd-dev/evals/fixtures/{case-modify → minimal-ts-pkg}/tsconfig.json +1 -3
  31. package/claude/skills/sd-dev/evals/golden.jsonl +1 -3
  32. package/claude/skills/sd-docs/SKILL.md +8 -8
  33. package/claude/skills/sd-impl/SKILL.md +172 -82
  34. package/claude/skills/sd-impl/evals/fixtures/case-a-new-screen/.specs/260513120000_warehouse/spec.md +101 -0
  35. package/claude/skills/sd-impl/evals/fixtures/case-b-update-with-demo/.specs/260513120000_warehouse/spec.md +101 -0
  36. package/claude/skills/sd-impl/evals/fixtures/case-b-update-with-demo/packages/app/src/screens/box-register/box-register.view.ts +46 -0
  37. package/claude/skills/sd-impl/evals/fixtures/case-c-new-cross/.specs/260513120000_warehouse/spec.md +89 -0
  38. package/claude/skills/sd-impl/evals/fixtures/case-d-spec-modify/.specs/260513120000_warehouse/spec.md +101 -0
  39. package/claude/skills/sd-impl/evals/golden.jsonl +4 -6
  40. package/claude/skills/sd-review/SKILL.md +33 -0
  41. package/claude/skills/sd-review/evals/fixtures/code-review/src/foo.ts +7 -0
  42. package/claude/skills/sd-review/evals/fixtures/doc-review/docs/foo.md +4 -0
  43. package/claude/skills/sd-review/evals/golden.jsonl +2 -0
  44. package/claude/skills/sd-skill/SKILL.md +99 -91
  45. package/claude/skills/sd-skill/evals/fixtures/existing-skill/.claude/skills/todo-format/SKILL.md +14 -0
  46. package/claude/skills/sd-skill/evals/fixtures/new-skill/.gitkeep +0 -0
  47. package/claude/skills/sd-skill/evals/golden.jsonl +2 -0
  48. package/claude/skills/sd-spec/SKILL.md +251 -246
  49. package/claude/skills/sd-spec/references/example-spec.md +1 -1
  50. package/claude/skills/sd-unpack/SKILL.md +83 -83
  51. package/claude/skills/sd-use/SKILL.md +4 -4
  52. package/package.json +1 -1
  53. package/claude/skills/sd-demo/evals/fixtures/empty/.specs/260513120000_warehouse/spec.md +0 -45
  54. package/claude/skills/sd-demo/evals/fixtures/with-existing-screen/.specs/260513120000_warehouse/spec.md +0 -42
  55. package/claude/skills/sd-demo/evals/fixtures/with-existing-screen/packages/app/src/screens/dashboard/dashboard.view.ts +0 -33
  56. package/claude/skills/sd-demo/evals/fixtures/with-master-screen/.specs/260513120000_warehouse/spec.md +0 -45
  57. package/claude/skills/sd-demo/evals/fixtures/with-master-screen/packages/app/src/screens/dashboard/dashboard.view.ts +0 -33
  58. package/claude/skills/sd-demo/evals/fixtures/with-modal/.specs/260513120000_warehouse/spec.md +0 -75
  59. package/claude/skills/sd-demo/evals/fixtures/with-modal/packages/app/src/screens/dashboard/dashboard.view.ts +0 -33
  60. package/claude/skills/sd-demo/evals/fixtures/with-screens/.specs/260513120000_warehouse/spec.md +0 -45
  61. package/claude/skills/sd-demo/evals/fixtures/with-screens/packages/app/src/screens/dashboard/dashboard.view.ts +0 -33
  62. package/claude/skills/sd-dev/evals/fixtures/case-add/package.json +0 -13
  63. package/claude/skills/sd-dev/evals/fixtures/case-add/src/index.ts +0 -10
  64. package/claude/skills/sd-dev/evals/fixtures/case-add/tests/index.test.ts +0 -11
  65. package/claude/skills/sd-dev/evals/fixtures/case-add/tsconfig.json +0 -12
  66. package/claude/skills/sd-dev/evals/fixtures/case-bug/package.json +0 -13
  67. package/claude/skills/sd-dev/evals/fixtures/case-bug/src/index.ts +0 -10
  68. package/claude/skills/sd-dev/evals/fixtures/case-bug/tests/index.test.ts +0 -11
  69. package/claude/skills/sd-dev/evals/fixtures/case-bug/tsconfig.json +0 -12
  70. package/claude/skills/sd-dev/evals/fixtures/case-modify/package.json +0 -13
  71. package/claude/skills/sd-dev/evals/fixtures/case-modify/src/index.ts +0 -10
  72. package/claude/skills/sd-dev/evals/fixtures/case-modify/tests/index.test.ts +0 -11
  73. package/claude/skills/sd-impl/evals/fixtures/case-001-new-screen/spec.md +0 -55
  74. package/claude/skills/sd-impl/evals/fixtures/case-002-auto-process/spec.md +0 -55
  75. package/claude/skills/sd-impl/evals/fixtures/case-003-update-screen/packages/client/src/pages/book-list.ts +0 -22
  76. package/claude/skills/sd-impl/evals/fixtures/case-003-update-screen/spec.md +0 -57
  77. package/claude/skills/sd-impl/evals/fixtures/case-004-ambiguous-spec/spec.md +0 -58
  78. package/claude/skills/sd-impl/evals/fixtures/case-005-id-mismatch/spec.md +0 -52
  79. 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
  80. 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
  81. 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
  82. 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
  83. package/claude/skills/sd-impl/evals/fixtures/case-006-with-reference-units/spec.md +0 -77
  84. package/claude/skills/sd-impl/evals/fixtures/case-new/.specs/260514120000_/352/261/260/353/236/230/354/262/230/spec.md +0 -101
  85. package/claude/skills/sd-impl/evals/fixtures/case-update/.specs/260514120000_/352/261/260/353/236/230/354/262/230/spec.md +0 -101
  86. 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
  87. 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
  88. package/claude/skills/sd-impl/references/spec-cross-check.md +0 -82
@@ -617,7 +617,7 @@ Actor: 창고 관리자
617
617
  - 대처: 위 전제 하에 지수 백오프로 재시도, 최대 5회
618
618
  - 재시도 한계 초과: 관리자 알림 (이후 수동 확인 필요)
619
619
 
620
- ## 10. 본문 외 결정사항
620
+ ## 10. 본문 외 확정 사항
621
621
 
622
622
  - 2026-04-01 [제외]: 직원 관리 사원번호 컬럼 추가
623
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.80",
3
+ "version": "14.0.82",
4
4
  "description": "심플리즘 패키지 - Claude Code 셋업",
5
5
  "author": "심플리즘",
6
6
  "license": "Apache-2.0",
@@ -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
- }
@@ -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
- }
@@ -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.