@simplysm/sd-claude 14.0.101 → 14.0.102

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.
@@ -43,10 +43,12 @@ busy 컨테이너로 감싸고(`page` 면 탑바 포함) 권한 없음 placehold
43
43
  목록 골격(`sd-base-container` + `sd-sheet`). 시트·검색 폼·등록/삭제/복구·CTRL+S 저장·페이징·정렬·선택·인라인 편집·모달 선택을 일괄 제공. `SdCommandDirective` 호스트.
44
44
 
45
45
  - `ready: model(false)` / `initialized: input(false)` / `busyCount: model(0)` / `restricted: input(false)` — base 로 전달.
46
- - `readonly: input(false)` — true등록/삭제/복구 버튼 숨김 + 인라인 편집 비활성 + 삭제 행 취소선.
47
- - `inlineEdit: input(true)` — true(비-readonly)시트를 `<sd-form>` 으로 감싸 인라인 편집 + 삭제 컬럼 + 저장. false 면 인라인 편집 chrome 제거(조회·선택 전용, `submit` 미발화).
46
+ - `canCreate: input(true)` — false등록 버튼 숨김.
47
+ - `canEdit: input(true)` — false 인라인 편집(저장 버튼·`<sd-form>` 래핑) 비활성. `inlineEdit` AND(둘 true 여야 인라인 편집).
48
+ - `canDelete: input(true)` — false 면 선택 삭제/복구 버튼·per-row 삭제 컬럼 숨김 + 멀티선택 기본값 해제(`undefined`).
49
+ - `inlineEdit: input(true)` — `canEdit` 면 시트를 `<sd-form>` 으로 감싸 셀 인라인 편집 + 저장. per-row 삭제 컬럼은 `canDelete` 면 표시. false 면 인라인 편집 chrome 제거(조회·선택 전용, `submit` 미발화).
48
50
  - `viewType: input.required<SdViewType>` — `"page"` = 탑바 저장 버튼(인라인 편집 시); `"modal"` = 하단 선택 명령바("선택 해제", multi 면 "확인(n)").
49
- - `selectMode: "single"|"multi"|undefined` — `"single"` = 선택 삭제/복구 숨김·클릭 즉시 modal close; `"multi"` = 다중 선택·삭제/복구·"확인(n)"; `undefined`(비-modal) = 비-readonly 면 `'multi'`.
51
+ - `selectMode: "single"|"multi"|undefined` — `"single"` = 선택 삭제/복구 숨김·클릭 즉시 modal close; `"multi"` = 다중 선택·삭제/복구·"확인(n)"; `undefined`(비-modal) = `canDelete` 면 `'multi'`.
50
52
  - `key: input.required<string>` — 시트 설정 키(내부 시트는 `key()+'-sheet'`).
51
53
  - `items: TItem[]` (기본 `[]`) — 행 데이터.
52
54
  - `currDeletedItems: TItem[]` (기본 `[]`) — 삭제(soft delete) 행. 취소선·복구 버튼·삭제/복구 아이콘 토글에. 삭제항목 포함 검색 목록은 필수.
@@ -58,7 +60,7 @@ busy 컨테이너로 감싸고(`page` 면 탑바 포함) 권한 없음 placehold
58
60
  - 슬롯: `#filterTpl`(검색 폼; 내부가 이미 `form-box-inline`) / `#toolTpl`(도구 버튼) / `#commandTpl` / `#bottomCommandTpl`. `<sd-sheet-column>` 직속 자식은 내부 시트로 자동 투영.
59
61
 
60
62
  ```html
61
- <sd-crud-list [(ready)]="ready" [initialized]="initialized()" [(busyCount)]="busyCount" [restricted]="!perms().includes('use')" [readonly]="!canEdit()" [viewType]="viewType()" [selectMode]="selectMode() ?? 'multi'" [key]="'role'" [items]="items()" [currDeletedItems]="deletedItems()" [trackByFn]="trackByFn" [(selectedKeys)]="selectedKeys" [(currentPage)]="page" [totalPageCount]="pageLength()" [(sorts)]="sortingDefs" (filterSubmit)="onFilterSubmit()" (submit)="onSubmit()" (create)="onCreate()" (delete)="onDelete($event)" (restore)="onRestore($event)">
63
+ <sd-crud-list [(ready)]="ready" [initialized]="initialized()" [(busyCount)]="busyCount" [restricted]="!perms().includes('use')" [canCreate]="canEdit()" [canEdit]="canEdit()" [canDelete]="canEdit()" [viewType]="viewType()" [selectMode]="selectMode() ?? 'multi'" [key]="'role'" [items]="items()" [currDeletedItems]="deletedItems()" [trackByFn]="trackByFn" [(selectedKeys)]="selectedKeys" [(currentPage)]="page" [totalPageCount]="pageLength()" [(sorts)]="sortingDefs" (filterSubmit)="onFilterSubmit()" (submit)="onSubmit()" (create)="onCreate()" (delete)="onDelete($event)" (restore)="onRestore($event)">
62
64
  <ng-template #filterTpl>...</ng-template>
63
65
  <sd-sheet-column [key]="'name'" [header]="'이름'"><ng-template [cell]="items()" let-item="item">...</ng-template></sd-sheet-column>
64
66
  </sd-crud-list>
@@ -14,7 +14,9 @@
14
14
  [initialized]="initialized()"
15
15
  [(busyCount)]="busyCount"
16
16
  [restricted]="!perms().includes('use')"
17
- [readonly]="!canEdit()"
17
+ [canCreate]="canEdit()"
18
+ [canEdit]="canEdit()"
19
+ [canDelete]="canEdit()"
18
20
  [viewType]="viewType()"
19
21
  [selectMode]="selectMode() ?? 'multi'"
20
22
  [key]="'<도메인-키>'"
@@ -65,9 +67,9 @@
65
67
 
66
68
  ### 편집 방식 (`inlineEdit`, 기본 `true`)
67
69
 
68
- - `true` — 시트를 `<sd-form>` 으로 감싸 셀 인라인 편집 + 저장 버튼/CTRL+S + per-row 삭제 컬럼 제공.
70
+ - `true` — `canEdit` 면 시트를 `<sd-form>` 으로 감싸 셀 인라인 편집 + 저장 버튼/CTRL+S. per-row 삭제 컬럼은 `canDelete` 면 표시.
69
71
  - `false` — 인라인 편집 chrome 제거. 시트는 조회·선택 전용이며, 편집은 호스트가 `selectedKeys`(또는 별도 진입)로 상세/모달을 열어 처리. 등록·선택 삭제·복구·필터·페이징은 그대로 유지. 이 모드에선 `submit` 출력이 발화하지 않음.
70
- - `readonly` 와 직교: `readonly=true` 면 편집 자체 불가, `readonly=false` + `inlineEdit=false` 면 편집은 가능하되 인라인이 아님(외부 모달·상세).
72
+ - `canCreate`/`canEdit`/`canDelete` 와 직교: `inlineEdit` 은 편집을 인라인으로 표현할지만 정함. `canEdit=false` 면 `inlineEdit` 값과 무관하게 인라인 편집 비활성, `canEdit=true` + `inlineEdit=false` 면 편집은 가능하되 인라인이 아님(외부 모달·상세). 각 동작 사용여부는 세 입력이 정함(읽기 전용 = 셋 다 false).
71
73
 
72
74
  ### 모달 선택 모드
73
75
 
@@ -78,7 +80,7 @@
78
80
 
79
81
  호출측은 `_sdModal.showAsync(...)` 결과로 `{ selectedKeys }` 페이로드 수신.
80
82
 
81
- `selectMode` 는 `readonly` 독립 — selectMode 지정만으로는 편집이 막히지 않음. 등록·인라인 편집은 그대로 유지되고, `single` 일 때 "선택 삭제/복구" 버튼만 숨김. 읽기 전용이 필요하면 `readonly=true` 를 별도로 전달. `sd-shared-data-select-list` 가 모달을 띄울 때도 `selectMode="single"` 만 주입하므로 모달 내용은 편집 가능 상태로 유지됨.
83
+ `selectMode` 는 capability 입력과 독립 — selectMode 지정만으로는 편집·삭제가 막히지 않음. 등록·인라인 편집·삭제는 `canCreate`/`canEdit`/`canDelete` 로 정해지고, `single` 일 때 "선택 삭제/복구" 버튼만 숨김. 읽기 전용이 필요하면 `canCreate`/`canEdit`/`canDelete` 를 false 전달. `sd-shared-data-select-list` 가 모달을 띄울 때도 `selectMode="single"` 만 주입하므로 모달 내용은 편집 가능 상태로 유지됨.
82
84
 
83
85
  ### 행을 클릭해 상세 편집으로 진입하려면 (inlineEdit=false)
84
86
 
@@ -31,7 +31,7 @@ perms = injectPermsSignal(
31
31
  );
32
32
  ```
33
33
 
34
- `restricted`/`readonly` 인라인 전달 방식은 [client-component.md "권한 (perms)"](./client-component.md) 의 규약을 그대로 따름.
34
+ `restricted` 및 편집 권한 입력(목록 `sd-crud-list` 는 `canCreate`/`canEdit`/`canDelete`, 단건 `sd-crud-detail` 는 `readonly`) 인라인 전달 방식은 [client-component.md "권한 (perms)"](./client-component.md) 의 규약을 그대로 따름.
35
35
 
36
36
  ## 액션 핸들러 (시뮬레이션 금지)
37
37
 
@@ -58,7 +58,7 @@ if (!result) return;
58
58
  // sd-demo: 미구현 — 동작 자리
59
59
  ```
60
60
 
61
- 영역 한정 호출(`→ [화면.Y] 의 <영역> — 선택 전용` 등) 은 모달의 입력 시그널(`selectMode` 등) 로 전달. spec 마커 매핑: "선택 전용"·multiselect 는 `selectMode`(`single`/`multi`) 로, "편집 가능 여부" 는 `readonly` 따로 전달. "선택 전용" 은 선택 목적을 뜻할 뿐 편집을 막지 않으므로(readonly 아님), 편집까지 차단하려면 `readonly=true` 함께 줄 것.
61
+ 영역 한정 호출(`→ [화면.Y] 의 <영역> — 선택 전용` 등) 은 모달의 입력 시그널(`selectMode` 등) 로 전달. spec 마커 매핑: "선택 전용"·multiselect 는 `selectMode`(`single`/`multi`) 로, "편집 가능 여부" 는 편집 권한 입력(목록 `sd-crud-list` 는 `canCreate`/`canEdit`/`canDelete`, 단건 `sd-crud-detail` 는 `readonly`)으로 따로 전달. "선택 전용" 은 선택 목적을 뜻할 뿐 편집을 막지 않으므로, 편집까지 차단하려면 그 입력들(목록은 셋 다 false, 단건은 `readonly=true`)을 함께 줄 것.
62
62
 
63
63
  단건 편집을 모달로 띄우는 경우 피호출 화면은 `.detail.ts`(`<sd-crud-detail>` 루트, `viewType='modal'` 자동 주입)이며 모달 표시용 별도 `.modal.ts` 를 만들지 않음. 모달 전용 비-CRUD 화면(`.modal.ts`)은 `sd-crud-detail` 대신 `sd-busy-container` 등으로 자체 구성.
64
64
 
@@ -11,6 +11,12 @@ Claude 에이전트가 코드 작성·설계·변경 시 따라야 할 행동
11
11
  - "어렵다" 와 "불가능하다" 를 구분 — 어려우면 그냥 구현. 정말 불가능할 때만 그 사실을 중립적으로 보고("X 때문에 불가, 원인 Y")하고, 단순화·축소 여부는 사용자가 결정. "안 하자·우회하자" 식 추천 금지.
12
12
  - 나쁜 예: "구현이 복잡해지니 이 기능은 빼거나 A 방식으로 우회하는 게 어떨까요?"
13
13
  - 좋은 예: 복잡해도 정의대로 구현. 진짜 불가능하면 원인만 사실 보고.
14
+ - 공유·공개 코드(라이브러리 컴포넌트·공개 API)의 설계·변경 시 **선언된 모든 입력·모드를 1급으로 다룸.** 현재 소비처의 사용 양상(특정 입력을 늘 같은 값으로 호출하는 등)을 설계 근거나 기본 가정으로 삼지 않음 — 소비처가 어떻게 쓸지는 알 수 없음.
15
+ - 나쁜 예: "소비 화면이 전부 `inlineEdit=false` 니 비인라인이 기본형" 이라며 한 모드 위주로 설계·판단.
16
+ - 좋은 예: `inlineEdit` 의 true·false 를 동등하게 놓고 각 모드 동작을 모두 정의.
17
+ - 인터페이스를 쪼개거나 재구성할 때, **각 표면 요소를 그것이 수행하는 목적·액션에 귀속**시키는 일은 도출이지 사용자 결정이 아님. 목적에서 답이 정해지면 선택지로 만들어 묻지 말고 직접 귀속해 확정. (단순화·기능축소 불가 원칙과 같은 맥락)
18
+ - 나쁜 예: 삭제 버튼을 어느 권한에 걸지 "A안/B안" 으로 사용자에게 질문.
19
+ - 좋은 예: 삭제 버튼은 delete 액션이므로 delete 권한에 귀속 — 도출해 확정.
14
20
 
15
21
  ## 불필요한 래핑·추상화 금지
16
22
 
@@ -32,11 +38,12 @@ API·함수가 단순 입력(리터럴·기본값·직접 인자)을 그대로
32
38
  - 나쁜 예: 제품 분류(빈 값 가능)를 `category ?? ""` 로 받아 미분류와 빈 분류를 같은 것으로 취급.
33
39
  - 좋은 예: 받는 타입을 `category?: string` 로 정의해 미분류(undefined)를 끝까지 유지.
34
40
 
35
- ## 변경 전 기존 패턴 조사
41
+ ## 변경·분석 전 기존 패턴·매뉴얼 조사
36
42
 
37
- 변경 전, 변경 영역의 기존 코드 패턴과 개발 매뉴얼을 먼저 조사.
43
+ 변경·분석 전, 대상 영역의 기존 코드 패턴과 개발 매뉴얼을 먼저 조사.
38
44
 
39
- - `@simplysm/*` 14.x 패키지 변경 → `.claude/references/sd-simplysm14/README.md` 참조.
45
+ - `@simplysm/*` 14.x 심볼(provider·함수·컴포넌트 등)을 쓰거나·바꾸거나·동작을 해석할 때 → `.claude/references/sd-simplysm14/README.md` 의 트리거 표로 해당 매뉴얼을 먼저 확인.
46
+ - `@simplysm/*` 동작이 불확실하면 추측·우회·미확인(보류)로 넘어가기 전에 그 매뉴얼부터 확인 — 매뉴얼로 풀리는 것을 미확인으로 남기지 않음.
40
47
 
41
48
  ## 라이브러리 우회 금지
42
49
 
@@ -33,7 +33,7 @@ Claude 에이전트가 반드시 지켜야 할 행동 지침.
33
33
 
34
34
  ## 사용자 발언 의도 파악
35
35
 
36
- 턴, 의도를 추측해 진행하지 말고 분류로 못박아 자기검증.
36
+ 둘을 지킴 줄에 의도를 분류로 표기, 그리고 답을 기억·추측이 아니라 도구로 읽은 맥락에서 구성.
37
37
 
38
38
  **의도 표기**: 응답 첫 줄에 1줄 출력 (도구만 쓰는 턴 포함).
39
39
 
@@ -42,6 +42,8 @@ Claude 에이전트가 반드시 지켜야 할 행동 지침.
42
42
  - 원문 인용이 불가능하거나 의도가 불분명하면, 응답하지 말고 의도부터 되물음.
43
43
  - 자기 발언("~할게"·"수정할게") 인용 금지 — 자기 승인 둔갑 차단.
44
44
 
45
+ **맥락 선행**: 맥락(이번 대화의 앞선 합의·정정·결정, 답이 의존하는 파일·코드·상태)에 기대는 답·실행은, 그 맥락을 도구로 읽은 내용으로 구성 — 기억·추측을 맥락 자리에 놓는 경로를 두지 않음. 안 읽었으면 다음 행위는 답이 아니라 읽기.
46
+
45
47
  **발언 형태 분류**:
46
48
 
47
49
  | 발언 형태 | 예 | 분류 신호 예 | 기대 출력 |
@@ -261,6 +263,8 @@ Claude 에이전트가 반드시 지켜야 할 행동 지침.
261
263
 
262
264
  규명을 마친 뒤에 건너뛸지·보고할지·재시도할지 판단.
263
265
 
266
+ 서브에이전트(`Agent`) 실행이 일시적 서버 오류(예: 529 overloaded)로 실패하면, 원인이 명확하므로 임의 재시도하지 않고 멈춰 사용자에게 보고. 사용자가 재시도를 확인하면 그때 재시도.
267
+
264
268
  ### 일괄치환 금지
265
269
 
266
270
  한 번에 여러 매치를 치환하면 의도 밖 위치까지 바뀌어 코드가 깨짐. 매치는 1건씩, 변경 직전에 주변 코드를 확인.
@@ -31,6 +31,8 @@ disable-model-invocation: true
31
31
 
32
32
  누락된 입력이 있으면 사용자에게 묻기. spec.md 사용 시 식별자 매칭이 안 되면 "화면"(§4) 섹션의 화면 목록 표에서 후보 제시 후 확정.
33
33
 
34
+ **입력 spec.md 완독** (spec.md 사용 시): 대상 화면 항목만 추출하기 전 spec.md 를 처음부터 끝까지 Read — 부분 읽기(`offset`/`limit`)·grep 으로 §4 대상 화면만 보고 끝내지 않음. 다른 세션이 §10 본문 외 확정 사항·본문 인라인 `[OPEN]`·진행방법 NOTE 에 그 화면 관련 결정·제약을 남겼을 수 있어, 추측으로 덮어쓰지 않으려면 전체 완독이 전제임.
35
+
34
36
  **충돌 확인**: 대상 화면(또는 동반 모달 화면) 의 파일이 이미 존재하면 묻기 — ① 덮어쓰기 / ② 명세 변경분만 보강 / ③ 취소. 호출자 발화에 명시된 분기가 있으면 묻지 않고 그 분기로 진행.
35
37
 
36
38
  ### 2단계: 대상 화면 명세 확보
@@ -29,6 +29,8 @@ spec.md 단위(§4.x 화면 / §5.x 자동 처리 / §6.x 공통·기반 기능)
29
29
 
30
30
  없으면 묻기. spec.md 에서 식별자 매칭이 안 되면 §4 화면 목록 표 / §5 자동 처리 / §6 공통·기반 기능 헤더 목록에서 후보를 제시 후 확정.
31
31
 
32
+ **입력 spec.md 완독**: 경로·식별자 확보 후 spec.md 를 처음부터 끝까지 Read — 부분 읽기(`offset`/`limit`)·grep 으로 대상 § 만 보고 끝내지 않음. spec.md 는 다른 세션이 누적한 결정의 영속 산출물이라, 안 읽은 영역(특히 §10 본문 외 확정 사항·본문 인라인 `[OPEN]`·진행방법 NOTE)의 결정·제약을 추측으로 덮어쓰지 않으려면 전체 완독이 전제임.
33
+
32
34
  ### 2단계: 외부 입력 점검
33
35
 
34
36
  작업 대상 §4.x/§5.x/§6.x 와 작업 대상이 참조하는 §5/§6/§7/§8/§9 항목을 점검:
@@ -122,6 +122,8 @@ sd-spec init 배치의 spec ↔ 코드 단위 대조를 수행해줘.
122
122
 
123
123
  초안 배치·init 배치(신규 spec.md 작성) 외의 모든 지시는 SKILL.md 가 메인 에이전트로 직접 처리. 재진입(기존 spec.md 에 대한 추가 작업 — "설계만 다시"·재설계 포함)도 이 경로.
124
124
 
125
+ **입력 spec.md 완독**: 기존 spec.md 에 대한 작업이므로, 어떤 부분 수정이든 착수 전 spec.md 를 처음부터 끝까지 Read — 부분 읽기(`offset`/`limit`)·grep 으로 대상 § 만 보고 끝내지 않음. 다른 세션이 §10 본문 외 확정 사항·본문 인라인 `[OPEN]`·진행방법 NOTE 에 누적한 결정·제약을 추측으로 덮어쓰지 않기 위한 전제임.
126
+
125
127
  - **정밀 지시** ("§4.2 의 X 컬럼을 Y로", "이 항목 [OPEN] 으로") → 바로 Edit. 무관 섹션은 건드리지 않음 (일괄 치환 금지 — Edit 의 `old_string` 을 유일 매칭되게 좁혀서 수정).
126
128
  - **모호 지적** ("이 섹션 이상해", "여기 흐름이 안 맞아") → 무엇이 문제인지 진단을 먼저 제시 → 사용자 합의 → Edit. 추측으로 바로 고치지 않음.
127
129
  - **구조 변경** (병합·분할·추가: "A 화면과 B 화면을 합쳐", "이 프로세스를 둘로 나눠") → 이름 기반 참조 cascade:
@@ -132,18 +134,16 @@ sd-spec init 배치의 spec ↔ 코드 단위 대조를 수행해줘.
132
134
 
133
135
  ### §4~6 `[구현]` 마커 제거
134
136
 
135
- §4.x/§5.x/§6.x 본문, 또는 그 본문이 의존하는 § 본문을 수정하면 그 §4~6 의 이전 구현은 무효가 됨 → 해당 §4.x/§5.x/§6.x 헤더의 `[구현]` 마커 제거 (sd-impl 재실행 대기 상태로). sd-spec 부분 수정·sd-impl spec 수정 양쪽이 절을 따름 (의존 식별·합의의 단일 출처).
137
+ §4.x/§5.x/§6.x 본문이나 그 본문이 의존하는 § 수정했을 때, 그 §4~6 헤더의 `[구현]` 마커를 제거할지 판정. sd-spec 부분 수정·sd-impl spec 수정 양쪽이 따르는 단일 출처(sd-impl 지금 재구현 중인 본 단위는 제외).
136
138
 
137
- **의존 식별** — §4.x/§5.x/§6.x 본문에 다음 하나라도 나타나는 §x.x 는 §4~6 의존 대상:
139
+ **의존 식별** — §4.x/§5.x/§6.x 본문에 다음이 나타나면§의 의존 대상:
138
140
 
139
141
  - `관련 섹션:` 줄의 `[프로세스.X]`·`[기타.X]`·`[화면.X]`·`[자동 처리.X]`·`[기반.X]`·`[외부 인터페이스.X]`.
140
- - 본문 어느 위치든 등장하는 `[모델.X…]`·`[공통 정의.X]`.
141
- - §7 외부 자료 명세를 컬럼명 일치로 끌어다 쓴 양식 매핑 표 (해당 §7.x).
142
+ - 본문 어디든 등장하는 `[모델.X…]`·`[공통 정의.X]`.
143
+ - §7 외부 자료 명세를 컬럼명 일치로 끌어다 쓴 양식 매핑 표(해당 §7.x).
142
144
  - 모달 호출 `→ [화면.X]` 의 그 §4.x.
143
145
 
144
- 수정 대상이 §4~6 자신이면 자신의 `[구현]` 제거 대상 (sd-spec). sd-impl 작업 단위(재구현 ) 제외.
145
-
146
- **합의** — 영향 §4.x/§5.x/§6.x 를 번호 매겨 각각 한 줄 이유와 묶어 "맞나요?" 합의 → 전체 동의 일괄 제거 / 일부 유지 지목 시 지목 항목만 마커 유지.
146
+ **판정·보고** — 그 수정 때문에 §4~6 구현을 새로 만들거나 고쳐야 하면 제거(sd-impl 재실행 대기), 구현 변경 없이 spec 맞는 문서상 변경(문구·참조 정리 등)이면 유지. 기능 추가도 구현을 고쳐야 하므로 제거 — 직접·의존 수정 구분이 아니라 구현 변경 필요 여부로만 판정. 에이전트가 영향 §4~6 마다 판정해 결과만 보고하고, 불분명한 항목만 번호·한 줄 이유로 합의.
147
147
 
148
148
  ### 연산 사이 검토
149
149
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@simplysm/sd-claude",
3
- "version": "14.0.101",
3
+ "version": "14.0.102",
4
4
  "description": "심플리즘 패키지 - Claude Code 셋업",
5
5
  "author": "심플리즘",
6
6
  "license": "Apache-2.0",