@simplysm/sd-claude 14.0.71 → 14.0.72
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-simplysm14/README.md +1 -0
- package/claude/references/sd-simplysm14/apis/excel/README.md +2 -2
- package/claude/skills/sd-spec/SKILL.md +34 -14
- package/claude/skills/sd-spec/references/example-spec.md +6 -2
- package/claude/skills/sd-spec/references/spec-authoring.md +15 -4
- package/claude/skills/sd-unpack/scripts/handlers/__pycache__/__init__.cpython-314.pyc +0 -0
- package/claude/skills/sd-unpack/scripts/handlers/__pycache__/_common.cpython-314.pyc +0 -0
- package/claude/skills/sd-unpack/scripts/handlers/__pycache__/dispatch.cpython-314.pyc +0 -0
- package/claude/skills/sd-unpack/scripts/handlers/__pycache__/office_com.cpython-314.pyc +0 -0
- package/claude/skills/sd-unpack/scripts/handlers/office_com.py +4 -1
- package/claude/skills/sd-unpack/scripts/handlers/office_worker.py +5 -3
- package/package.json +1 -1
|
@@ -17,6 +17,7 @@ ORM 호출, 파일 변환, 비즈니스 로직 등은 위 두 사유에 해당
|
|
|
17
17
|
|
|
18
18
|
- **기본 검증 (평소 사용)**: `pnpm check --fix` — typecheck + lint 일괄, 자동 수정 포함.
|
|
19
19
|
- **보조**: `pnpm typecheck`, `pnpm lint` — `pnpm check` 에서 문제 났을 때 각각 따로 보기 위함. 단독 사용은 회피.
|
|
20
|
+
- **`-t` 타겟 표기**: `sd.config.ts` 의 `packages` 키(`@simplysm/` 접두사 **제외** 한 짧은 이름. 예: `excel`, `core-node`, `sd-cli`) 임을 본문에 명시. 풀네임 사용을 막기 위해 예시도 짧은 이름으로 통일.
|
|
20
21
|
|
|
21
22
|
## 개발 매뉴얼
|
|
22
23
|
|
|
@@ -16,7 +16,7 @@ new ExcelWorkbook(arg?: Blob | Bytes)
|
|
|
16
16
|
getWorksheetNames(): Promise<string[]>
|
|
17
17
|
addWorksheet(name): Promise<ExcelWorksheet>
|
|
18
18
|
getWorksheet(nameOrIndex: string | number): Promise<ExcelWorksheet> // 인덱스 0 기반
|
|
19
|
-
setDefaultStyle(opts: ExcelStyleOptions): Promise<void> //
|
|
19
|
+
setDefaultStyle(opts: ExcelStyleOptions): Promise<void> // fonts[0]/fills[0]/borders[0] 덮어쓰기, 모든 셀에 전역 적용
|
|
20
20
|
toBytes(): Promise<Bytes>
|
|
21
21
|
toBlob(): Promise<Blob> // xlsx MIME
|
|
22
22
|
close(): Promise<void> // 멱등, 이후 모든 메서드는 throw
|
|
@@ -34,7 +34,7 @@ getDataTable(opt?: { headerRowIndex?; checkEndColIndex?; usableHeaderNameFn? })
|
|
|
34
34
|
setDataMatrix(matrix: ExcelValueType[][]) // 0,0 부터
|
|
35
35
|
setRecords(records: Record<string, ExcelValueType>[]) // 첫 행 헤더 자동
|
|
36
36
|
copyCell / copyRow / copyCellStyle / copyRowStyle / insertCopyRow
|
|
37
|
-
setZoom(percent) / freezeAt({ r?, c? })
|
|
37
|
+
setZoom(percent) / freezeAt({ r?, c? }) / setTabColor(color) // color: ARGB 8자리
|
|
38
38
|
addConditionalFormat({ ref, rules: ExcelConditionalRule[] }) // 호출마다 priority 누적
|
|
39
39
|
addImage({ bytes, ext, from, to? }) // ext 는 mime lookup. to 생략 시 from+1,+1
|
|
40
40
|
```
|
|
@@ -53,29 +53,43 @@ description: SI/업무시스템 요구사항을 분석해 spec.md 로 구조화
|
|
|
53
53
|
|
|
54
54
|
Requirement Source 의 모든 요구를 일괄 분류 → 채팅으로만 제시 (spec.md 는 2단계에서 생성).
|
|
55
55
|
|
|
56
|
-
|
|
56
|
+
**§2/§3 본질** (분류 판정 기준):
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
- **§2 업무 프로세스** = 사람의 다단계 업무 흐름. 다음 중 1개 이상 있음: 시간 지연(오늘 등록 → 내일 결과) / 역할 전환(관리자 → User) / 외부 채널(메일·세무 포털·은행 웹 등) / 동일인의 다른 시점 행위(스캔 후 별도 시점 결과 확인). BPMN 그릴 분량.
|
|
59
|
+
- **§3 기타 요구사항** = 단일 화면·단일 액션으로 완결. 다단계 흐름 없음. BPMN 그릴 게 없음.
|
|
60
|
+
|
|
61
|
+
§5 자동 처리 (스케줄러·이벤트 워커) 는 1단계 시야 밖 — §2.x/§3.x 흐름의 자동 단계로 흡수(아래 2번 흡수 분기), §5.x 분리는 5단계에서.
|
|
62
|
+
|
|
63
|
+
**절차 진입 전 자문 (내부)**: 외부 관계자 평면(구매처·공급처·고객·하청·감독기관 등) 식별 + 관계자별 흐름 한 줄("주는 것 / 받는 것 / 사이클"). 6번 헤더 명칭의 어휘 근거. spec.md 에 기록 X.
|
|
64
|
+
|
|
65
|
+
**절차** (내부 수행, 사용자에겐 7번 결과만 제시):
|
|
59
66
|
|
|
60
67
|
1. **평면화**: source 의 모든 요구 후보를 평면 목록으로. 메일 항목·슬라이드·첨부·원본 자체 카테고리(업데이트/추가 기능 등) 의 구조는 분류 단위와 무관.
|
|
61
68
|
|
|
62
|
-
2. **항목별
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
-
|
|
69
|
+
2. **항목별 본질 자문** (2단계 순서):
|
|
70
|
+
1. 사람이 여러 단계를 거치는 흐름인가? (시간 지연 / 역할 전환 / 외부 채널 / 동일인 다른 시점 행위 중 1개 이상) → Yes = §2.x 후보
|
|
71
|
+
2. (No 면) 단일 화면·단일 액션 완결 사용자 요구인가? → Yes = §3.x 후보
|
|
72
|
+
|
|
73
|
+
그 외 분기:
|
|
74
|
+
- **다른 §x.x 흐름의 일부분** (사전·부수·케이스/서브 타입·자동 단계 등) → 별도 §x.x X. 그 §x.x 안에서 흡수
|
|
68
75
|
- **기존 화면/흐름 미세 변경 (필드 추가·라벨·동작 조정·버그 수정·인식률 개선) 또는 자료 해석·파라미터 규칙** → §9 분석 제외 항목
|
|
69
76
|
|
|
70
|
-
3. **§
|
|
77
|
+
3. **§x.x 묶기/쪼개기 기준** (As-Is 추정 차단):
|
|
78
|
+
- 같은 §x.x 안 묶기는 **목적·산출물·이해관계자가 모두 같을 때만**. 셋 중 1개라도 다르면 별도 §x.x.
|
|
79
|
+
- **메뉴 그룹화·기존 화면 폴더 위치·코드 As-Is 구조 등 As-Is 그룹화는 묶기 근거 X** (sd-base-rules "결정 근거 안티패턴 — As-Is 기술" 적용).
|
|
80
|
+
- 동일 multi-step 흐름이 데이터만 다르게 반복 (예: 받을돈 회수 / 줄돈 지급 = 동일 흐름·다른 데이터) → 1개 §x.x 로 묶고 본문에서 데이터 차이 분기.
|
|
81
|
+
|
|
82
|
+
4. **출처 자기검증** (내부, As-Is 추정 차단):
|
|
83
|
+
- 각 §x.x 후보 + 그 안에 흡수되는 항목(마스터·화면 등) 마다 사용자 발언 verbatim 또는 자료 위치로 출처 인용 가능한가 자문.
|
|
84
|
+
- 인용 불가능 (추정·As-Is 그룹화만 근거) → 후보·흡수에 두지 말고 **별도 질문 항목으로 분리**해 사용자에 묻기.
|
|
71
85
|
|
|
72
|
-
|
|
86
|
+
5. **OPEN 표기**: 후속 요청 예정·구현 시점 미정 항목도 2~4번 동일 적용. 해당 카테고리에 추가하되 `[OPEN: YYYY-MM-DD]` 마커.
|
|
73
87
|
|
|
74
|
-
|
|
88
|
+
6. **헤더 명칭 규칙**: 헤더는 위 외부 관계자 평면 기반 도메인 업무 동사구. 시스템·문서·메뉴·양식 명칭을 그대로 헤더에 쓰지 X. 외부 관계자 관계가 드러나야 함.
|
|
75
89
|
- ❌ 나쁜 예: `발주서 변경 요청` (발주서 = 시스템 문서)
|
|
76
90
|
- ✅ 좋은 예: `구매처 발주 변경 요청`
|
|
77
91
|
|
|
78
|
-
|
|
92
|
+
7. **제시**: 분류별로 헤더 + 그 안에 흡수되는 마스터·화면을 들여쓰기로 명시. 자문 내용·내부 절차 해설·출처 인용 X (출처는 내부 자기검증용). 4번에 따라 분리된 추정 흡수 후보는 별도 질문 항목으로 함께 제시.
|
|
79
93
|
|
|
80
94
|
### 2단계: 초기 생성
|
|
81
95
|
|
|
@@ -83,7 +97,9 @@ Requirement Source 의 모든 요구를 일괄 분류 → 채팅으로만 제시
|
|
|
83
97
|
|
|
84
98
|
- slug 임의안 (한글, 1단계 헤더가 주제를 드러내므로 그를 근거로 도출).
|
|
85
99
|
- 폴더: `.specs/{yyMMddHHmmss}_{slug}/`
|
|
86
|
-
- spec.md = [spec-md-template](references/spec-md-template.md) + 1단계 결과
|
|
100
|
+
- spec.md = [spec-md-template](references/spec-md-template.md) + 1단계 결과 반영.
|
|
101
|
+
- §2.x/§3.x: 모든 헤더에 `[OPEN: YYYY-MM-DD]` 일괄 마킹, 본문은 자료 위치 1줄 참조 포인터 (1단계 출처 자기검증에서 파악된 위치 그대로 옮김). 임의안 본문 X.
|
|
102
|
+
- §9 분석 제외 항목: 1단계 제외 결정 반영.
|
|
87
103
|
|
|
88
104
|
### 3단계: §1 개요
|
|
89
105
|
|
|
@@ -109,7 +125,11 @@ Requirement Source 의 모든 요구를 일괄 분류 → 채팅으로만 제시
|
|
|
109
125
|
|
|
110
126
|
**Re-Read**: spec-authoring.md §4 화면 목록 표, example-spec.md §4 헤더 + §5 헤더.
|
|
111
127
|
|
|
112
|
-
§2.x/§3.x 가 매핑되는 화면(§4) / 자동 처리(§5) 의 §번호 +
|
|
128
|
+
§2.x/§3.x 가 매핑되는 화면(§4) / 자동 처리(§5) 의 §번호 + 이름을 순서대로 나열 (채팅 임의안). §4 일 땐 화면 목록 표 (spec-authoring §4) 도 함께.
|
|
129
|
+
|
|
130
|
+
확정 시 spec.md 갱신:
|
|
131
|
+
- 모든 §4.x/§5.x 헤더에 `[OPEN: YYYY-MM-DD]` 일괄 마킹, 본문은 관련 §2.x/§3.x 1줄 참조 포인터. 임의안 본문(와이어프레임·항목·동작·Flowchart 등) X.
|
|
132
|
+
- §4 화면 목록 표 spec.md 에 박기.
|
|
113
133
|
|
|
114
134
|
### 6단계: §4.x/§5.x 본문 작성
|
|
115
135
|
|
|
@@ -573,8 +573,12 @@ flowchart LR
|
|
|
573
573
|
|
|
574
574
|
### 9.1 분석 제외 항목 [확정: 2026-04-01]
|
|
575
575
|
|
|
576
|
-
- 직원 관리 사원번호 컬럼 추가
|
|
577
|
-
-
|
|
576
|
+
- 직원 관리 사원번호 컬럼 추가
|
|
577
|
+
- 후속 처리: sd-dev
|
|
578
|
+
- 자료 위치: 회의록.md L42
|
|
579
|
+
- 재고 확인 화면 정렬 버그
|
|
580
|
+
- 후속 처리: 운영 잔손
|
|
581
|
+
- 자료 위치: 이슈 #128
|
|
578
582
|
|
|
579
583
|
## 10. 변경 이력
|
|
580
584
|
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
| 마커 | 의미 |
|
|
27
27
|
| --------------------------------------------- | ------------------------------------------------------------------------------------------------- |
|
|
28
28
|
| `[확정: YYYY-MM-DD]` | 섹션 확정. 본문에 인라인 `[OPEN]` 있어도 무방. |
|
|
29
|
-
| `[OPEN: YYYY-MM-DD]` | 섹션
|
|
29
|
+
| `[OPEN: YYYY-MM-DD]` | 섹션 미확정 (사용자 보류 또는 헤더 분할 직후 자동). 본문 = 재분석용 참조 포인터만. 임의안(BPMN/와이어프레임/항목 등) 채우지 X. |
|
|
30
30
|
| `[확정: YYYY-MM-DD, 구현: YYYY-MM-DD]` | §4 화면 / §5 자동 처리 한정. `[확정]` 마커에 `구현: 날짜` 를 콤마로 이어붙인 확장형. sd-impl 이 시연 검증까지 통과한 시점에 부착. 본문이 변경되면 `[확정]` 날짜 갱신 여부와 무관하게 `구현: …` 부분을 제거 (구버전 구현 무효화). |
|
|
31
31
|
|
|
32
32
|
대괄호 쌍을 연달아 두면(`[확정: …][구현: …]`) 마크다운이 reference-style 링크로 해석해 렌더링이 깨지므로, **단일 대괄호 안 콤마 결합** 형식을 사용한다.
|
|
@@ -44,7 +44,12 @@
|
|
|
44
44
|
|
|
45
45
|
### 헤더 `[OPEN]` 본문 — 재분석용 참조 포인터
|
|
46
46
|
|
|
47
|
-
|
|
47
|
+
발생 경로 2가지 (본문 메커니즘·재개 절차는 동일):
|
|
48
|
+
|
|
49
|
+
- **사용자 명시 보류**: 임의안 제시 후 사용자가 보류 지시.
|
|
50
|
+
- **헤더 분할 직후 자동 OPEN**: SKILL.md 2단계(§2.x/§3.x) · 5단계(§4.x/§5.x) 확정 직후 본문 미작성 상태로 일괄 OPEN. 본문은 자료 위치 1줄이면 충분 (분류·분할 시 파악된 위치 그대로).
|
|
51
|
+
|
|
52
|
+
본문에 담을 항목 (임의안 X):
|
|
48
53
|
|
|
49
54
|
- **자료 위치**: Requirement Source 파일·범위 (예: `회의록.md L12-30`, `첨부A.pdf p.3`).
|
|
50
55
|
- **LLM 과의 대화 발췌**: 분석 세션 중 사용자가 보류 즈음 준 부분 의견·근거·미결 코멘트 1~2줄 직접 인용 (Requirement Source 발화 X — 그건 "자료 위치" 로 처리).
|
|
@@ -275,12 +280,18 @@ ASCII 그림 공통 규칙은 `sd-base-rules.md` 의 "ASCII 그림" 절 참조.
|
|
|
275
280
|
|
|
276
281
|
### 분석 제외 항목
|
|
277
282
|
|
|
278
|
-
1단계 헤더 분류 + 이후 본문 작성 중 식별된 "제외" 결정을 1
|
|
283
|
+
1단계 헤더 분류 + 이후 본문 작성 중 식별된 "제외" 결정을 누적. 본 spec 에서 다루지 않지만 다른 spec / sd-dev / 운영 잔손 등으로 후속 처리될 항목 포함. 형식 (`- <요구 한 줄>` 1행 + 자식 불릿 2~3종):
|
|
279
284
|
|
|
280
285
|
```
|
|
281
|
-
- <요구 한 줄>
|
|
286
|
+
- <요구 한 줄>
|
|
287
|
+
- 후속 처리: <다른 spec 신규 / 다른 spec 합류 / sd-dev / 운영 잔손 등>
|
|
288
|
+
- 자료 위치: <Requirement Source 파일·범위 (예: 회의록.md L12-30)>
|
|
289
|
+
- 메모: <대화 발췌 1~2줄, 필요 시>
|
|
282
290
|
```
|
|
283
291
|
|
|
292
|
+
- `후속 처리` · `자료 위치` 필수. `메모` 는 후속 처리 시 참고할 단서가 있을 때만.
|
|
293
|
+
- 다른 spec / sd-dev 후속 처리 항목은 자료 위치를 충실히 — 후속 도구가 재독해야 함.
|
|
294
|
+
|
|
284
295
|
## §10 변경 이력
|
|
285
296
|
|
|
286
297
|
- 본문 수정·추가 사항을 날짜순으로 누적 기록.
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -361,10 +361,13 @@ def _run_worker(cmd: str, *args: str, timeout: float, capture_stdout: bool = Fal
|
|
|
361
361
|
|
|
362
362
|
호출자는 com_lock 으로 sequential 보장. worker 자체는 단독 process 라 인스턴스 격리됨.
|
|
363
363
|
"""
|
|
364
|
+
# worker 는 동일 sys.executable 로 실행되므로 호출 전 호스트 환경에 pywin32 보장 → worker 가 import 가능.
|
|
365
|
+
_common.ensure_pip("pythoncom", "pywin32")
|
|
364
366
|
import subprocess
|
|
367
|
+
# errors="replace": Windows COM 에러 메시지가 cp949 등 비-utf8 로 올 수 있음 → None 변환 회피.
|
|
365
368
|
proc = subprocess.run(
|
|
366
369
|
[sys.executable, str(_WORKER_PATH), cmd, *args],
|
|
367
|
-
capture_output=True, text=True, timeout=timeout, encoding="utf-8",
|
|
370
|
+
capture_output=True, text=True, timeout=timeout, encoding="utf-8", errors="replace",
|
|
368
371
|
)
|
|
369
372
|
if proc.returncode != 0:
|
|
370
373
|
raise RuntimeError(
|
|
@@ -192,14 +192,16 @@ def _export_one_sheet(wb, tmp: Path, sheets_dir: Path,
|
|
|
192
192
|
sheet_ranges[raw_name] = (last_row, last_col)
|
|
193
193
|
|
|
194
194
|
data_range = ws.Range(ws.Cells(1, 1), ws.Cells(last_row, last_col))
|
|
195
|
-
# Range → 클립보드
|
|
196
|
-
# xlScreen=1,
|
|
195
|
+
# Range → 클립보드 EMF → 임시 ChartObject paste → Chart.Export("PNG").
|
|
196
|
+
# xlScreen=1, xlPicture=-4147
|
|
197
|
+
# Format=xlBitmap(2) 는 화면 픽셀 버퍼 캡처라 Excel.Visible=False headless 환경에서 빈/부분 비트맵 생성됨 → xlPicture(EMF) 사용.
|
|
198
|
+
# EMF 는 메타파일 명령으로 시트 콘텐츠 직접 직렬화 → 화면 렌더 의존 없음.
|
|
197
199
|
# ChartObject pt 그대로. PNG 는 시각/레이아웃용, 정확한 텍스트는 .md 가 책임.
|
|
198
200
|
# 사이즈 키우면 큰 시트가 Chart.Export PNG dimension 16-bit cap (65535px) 에 걸림.
|
|
199
201
|
chart_w = data_range.Width
|
|
200
202
|
chart_h = data_range.Height
|
|
201
203
|
try:
|
|
202
|
-
data_range.CopyPicture(Appearance=1, Format
|
|
204
|
+
data_range.CopyPicture(Appearance=1, Format=-4147)
|
|
203
205
|
chart_obj = ws.ChartObjects().Add(0, 0, chart_w, chart_h)
|
|
204
206
|
try:
|
|
205
207
|
chart_obj.Activate()
|