@simplysm/sd-claude 14.0.90 → 14.0.92
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 +7 -6
- package/claude/references/sd-simplysm14/apis/angular/README.md +59 -39
- package/claude/references/sd-simplysm14/apis/angular/controls.md +119 -186
- package/claude/references/sd-simplysm14/apis/angular/crud.md +70 -31
- package/claude/references/sd-simplysm14/apis/angular/directives.md +55 -57
- package/claude/references/sd-simplysm14/apis/angular/features.md +86 -105
- package/claude/references/sd-simplysm14/apis/angular/infra.md +48 -57
- package/claude/references/sd-simplysm14/apis/angular/layout.md +37 -47
- package/claude/references/sd-simplysm14/apis/angular/overlay.md +82 -74
- package/claude/references/sd-simplysm14/apis/angular/routing-appstructure.md +61 -50
- package/claude/references/sd-simplysm14/apis/angular/shared-data.md +74 -57
- package/claude/references/sd-simplysm14/apis/angular/sheet.md +63 -72
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-auto-update/README.md +23 -18
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-file-system/README.md +21 -19
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-intent/README.md +23 -18
- package/claude/references/sd-simplysm14/apis/capacitor-plugin-usb-storage/README.md +72 -32
- package/claude/references/sd-simplysm14/apis/core-browser/README.md +18 -18
- package/claude/references/sd-simplysm14/apis/core-browser/dom-element.md +29 -29
- package/claude/references/sd-simplysm14/apis/core-browser/indexed-db.md +41 -41
- package/claude/references/sd-simplysm14/apis/core-common/README.md +97 -90
- package/claude/references/sd-simplysm14/apis/core-common/async-runtime.md +75 -51
- package/claude/references/sd-simplysm14/apis/core-common/collection-ext.md +81 -0
- package/claude/references/sd-simplysm14/apis/core-common/errors.md +27 -29
- package/claude/references/sd-simplysm14/apis/core-common/obj.md +44 -45
- package/claude/references/sd-simplysm14/apis/core-common/serialization.md +34 -33
- package/claude/references/sd-simplysm14/apis/core-common/value-types.md +86 -0
- package/claude/references/sd-simplysm14/apis/core-node/README.md +6 -6
- package/claude/references/sd-simplysm14/apis/core-node/consola.md +3 -0
- package/claude/references/sd-simplysm14/apis/core-node/cpx.md +2 -2
- package/claude/references/sd-simplysm14/apis/core-node/fs-watcher.md +1 -1
- package/claude/references/sd-simplysm14/apis/core-node/fsx.md +2 -2
- package/claude/references/sd-simplysm14/apis/core-node/worker.md +6 -3
- package/claude/references/sd-simplysm14/apis/excel/README.md +10 -10
- package/claude/references/sd-simplysm14/apis/excel/conditional-format.md +4 -2
- package/claude/references/sd-simplysm14/apis/excel/utils.md +1 -1
- package/claude/references/sd-simplysm14/apis/excel/workbook-worksheet.md +6 -6
- package/claude/references/sd-simplysm14/apis/lint/README.md +6 -32
- package/claude/references/sd-simplysm14/apis/lint/recommended.md +60 -0
- package/claude/references/sd-simplysm14/apis/lint/rules.md +17 -17
- package/claude/references/sd-simplysm14/apis/orm-common/README.md +15 -6
- package/claude/references/sd-simplysm14/apis/orm-common/db-context.md +68 -102
- package/claude/references/sd-simplysm14/apis/orm-common/expr.md +75 -89
- package/claude/references/sd-simplysm14/apis/orm-common/queryable.md +87 -99
- package/claude/references/sd-simplysm14/apis/orm-common/schema.md +110 -147
- package/claude/references/sd-simplysm14/apis/orm-common/types.md +48 -51
- package/claude/references/sd-simplysm14/apis/orm-node/README.md +8 -13
- package/claude/references/sd-simplysm14/apis/orm-node/db-conn.md +5 -5
- package/claude/references/sd-simplysm14/apis/sd-cli/README.md +9 -6
- package/claude/references/sd-simplysm14/apis/sd-cli/SdTsCompiler.md +9 -8
- package/claude/references/sd-simplysm14/apis/sd-cli/sd-config-types.md +23 -19
- package/claude/references/sd-simplysm14/apis/service-client/README.md +20 -12
- package/claude/references/sd-simplysm14/apis/service-client/orm.md +6 -6
- package/claude/references/sd-simplysm14/apis/service-client/transport.md +1 -1
- package/claude/references/sd-simplysm14/apis/service-common/README.md +35 -32
- package/claude/references/sd-simplysm14/apis/service-common/app-structure.md +23 -22
- package/claude/references/sd-simplysm14/apis/service-common/protocol.md +23 -23
- package/claude/references/sd-simplysm14/apis/service-server/README.md +51 -43
- package/claude/references/sd-simplysm14/apis/service-server/service-authoring.md +6 -6
- package/claude/references/sd-simplysm14/apis/service-server/transport-internals.md +31 -21
- package/claude/references/sd-simplysm14/apis/service-server/v1-legacy.md +8 -8
- package/claude/references/sd-simplysm14/apis/storage/README.md +55 -49
- package/claude/references/sd-simplysm14/manuals/client-app-structure.md +1 -8
- package/claude/references/sd-simplysm14/manuals/client-component.md +843 -740
- package/claude/references/sd-simplysm14/manuals/client-crud.md +8 -0
- package/claude/references/sd-simplysm14/manuals/client-demo.md +6 -16
- package/claude/references/sd-simplysm14/manuals/client-shared-data.md +26 -0
- package/claude/references/sd-simplysm14/manuals/client-system-log.md +6 -2
- package/claude/references/sd-simplysm14/manuals/logging.md +1 -1
- package/claude/references/sd-simplysm14/manuals/orm.md +15 -1
- package/claude/rules/sd-design-rules.md +7 -0
- package/claude/sd-system-prompt.md +5 -8
- package/claude/skills/sd-debug/SKILL.md +43 -0
- package/claude/skills/sd-debug/workflow.js +390 -0
- package/claude/skills/sd-demo/SKILL.md +18 -20
- package/claude/skills/sd-dev/SKILL.md +127 -24
- package/claude/skills/sd-docs/SKILL.md +8 -4
- package/claude/skills/sd-docs/references/subagent-prompt.md +16 -2
- package/claude/skills/sd-impl/SKILL.md +18 -18
- package/claude/skills/sd-manual/SKILL.md +1 -0
- package/claude/skills/sd-review/SKILL.md +24 -18
- package/claude/skills/sd-review/workflow.js +324 -0
- package/claude/skills/sd-spec/SKILL.md +96 -679
- package/claude/skills/sd-spec/references/example-spec.md +28 -50
- package/claude/skills/sd-spec/references/format-analyze.md +232 -0
- package/claude/skills/sd-spec/references/format-design.md +248 -0
- package/claude/skills/sd-spec/workflow-analyze.js +615 -0
- package/claude/skills/sd-spec/workflow-design.js +667 -0
- package/claude/skills/sd-unpack/scripts/handlers/office_com.py +5 -1
- package/package.json +1 -1
- package/scripts/postinstall.mjs +157 -18
- package/claude/references/sd-simplysm14/apis/angular/selection-managers.md +0 -68
- package/claude/references/sd-simplysm14/apis/core-common/array-ext.md +0 -77
- package/claude/references/sd-simplysm14/apis/core-common/datetime.md +0 -86
- package/claude/skills/sd-skill/SKILL.md +0 -245
- package/claude/skills/sd-skill/scripts/run_eval.py +0 -380
|
@@ -56,6 +56,12 @@
|
|
|
56
56
|
- **`'control'`** — view 안에 임베드. 명령 영역에 저장 버튼.
|
|
57
57
|
- **`'modal'`** — 모달. `selectMode` 와 함께 쓰면 close 시 `{ selectedKeys }` 페이로드를 자동 전달.
|
|
58
58
|
|
|
59
|
+
### 편집 방식 (`inlineEdit`, 기본 `true`)
|
|
60
|
+
|
|
61
|
+
- `true` — 시트를 `<sd-form>` 으로 감싸 셀 인라인 편집 + 저장 버튼/CTRL+S + per-row 삭제 컬럼 제공.
|
|
62
|
+
- `false` — 인라인 편집 chrome 제거. 시트는 조회·선택 전용이며, 편집은 호스트가 `selectedKeys`(또는 별도 진입)로 상세/모달을 열어 처리. 등록·선택 삭제·복구·필터·페이징은 그대로 유지. 이 모드에선 `submit` 출력이 발화하지 않음.
|
|
63
|
+
- `readonly` 와 직교: `readonly=true` 면 편집 자체 불가, `readonly=false` + `inlineEdit=false` 면 편집은 가능하되 인라인이 아님(외부 모달·상세).
|
|
64
|
+
|
|
59
65
|
### 모달 선택 모드
|
|
60
66
|
|
|
61
67
|
`viewType="modal"` + `selectMode` 지정 시:
|
|
@@ -65,6 +71,8 @@
|
|
|
65
71
|
|
|
66
72
|
호출측은 `_sdModal.showAsync(...)` 결과로 `{ selectedKeys }` 페이로드 수신.
|
|
67
73
|
|
|
74
|
+
`selectMode` 는 `readonly` 와 독립 — selectMode 지정만으로는 편집이 막히지 않음. 등록·인라인 편집은 그대로 유지되고, `single` 일 때 "선택 삭제/복구" 버튼만 숨김. 읽기 전용이 필요하면 `readonly=true` 를 별도로 전달. `sd-shared-data-select-list` 가 모달을 띄울 때도 `selectMode="single"` 만 주입하므로 모달 내용은 편집 가능 상태로 유지됨.
|
|
75
|
+
|
|
68
76
|
## `sd-crud-detail`
|
|
69
77
|
|
|
70
78
|
단일 레코드 편집 화면의 표준 골격. 다음 기능을 일괄 제공: 폼 래핑, CTRL+S 단축키 저장, 저장 버튼, 모달의 "확인" 버튼 자동 처리.
|
|
@@ -10,11 +10,13 @@
|
|
|
10
10
|
| 단건 입력 폼 | `<domain>.detail.ts` |
|
|
11
11
|
| 좌 목록 + 우 단건 | `<domain>.view.ts` + `.list.ts` + `.detail.ts` |
|
|
12
12
|
| 좌 헤더 목록 + 우(헤더 정보 + 라인 시트) 마스터-라인 | `<domain>.view.ts` + `.list.ts` + `.detail.ts` — 우 라인 영역은 `.detail.ts` (헤더 단건 + 라인) |
|
|
13
|
-
| 모달
|
|
13
|
+
| 모달 전용 비-CRUD 화면 (도구·검색·설정 등) | `<domain>.modal.ts` |
|
|
14
14
|
| 프린트 양식 | `<domain>.print-template.ts` |
|
|
15
15
|
|
|
16
16
|
`<domain>` 은 화면명을 dash-case 영문으로 음역한 슬러그. 같은 도메인 폴더에 같은 역할의 파일이 2개 이상이면 `<domain>-<갈래>.<역할>.ts` 형식 사용.
|
|
17
17
|
|
|
18
|
+
동작 섹션의 `→ [화면.X] 을 모달로 띄움` 표기는 표시 방식일 뿐 파일 역할이 아님. 화면.X 가 단건 편집이면 `.detail.ts` 를 `showAsync` 로 띄우고(= 위 "단건 입력 폼" 행), 모달 전용 비-CRUD UI 일 때만 `.modal.ts`. 판별 기준은 [client-component.md "detail 과 modal 구분"](./client-component.md) 참조.
|
|
19
|
+
|
|
18
20
|
## 와이어프레임 기준
|
|
19
21
|
|
|
20
22
|
화면 정의 섹션(4번 섹션) 의 와이어프레임이 모든 시각 요소(버튼·필터·시트·탭·검색) 의 **존재·영역·순서** 결정의 1순위. 표준 슬롯이나 기본 UI(사용자 인터페이스) 와 충돌하면 와이어프레임에 맞춰 슬롯을 비우거나 컴포넌트를 교체. 줄 수·픽셀 좌표는 기준이 아님 (폼 inline 자동 wrap 등의 표현 한계 때문).
|
|
@@ -69,9 +71,9 @@ if (!result) return;
|
|
|
69
71
|
// sd-demo: 미구현 — 동작 자리
|
|
70
72
|
```
|
|
71
73
|
|
|
72
|
-
영역 한정 호출(`→ [화면.Y] 의 <영역> — 선택 전용` 등) 은 모달의 입력 시그널(`selectMode` 등) 로 전달.
|
|
74
|
+
영역 한정 호출(`→ [화면.Y] 의 <영역> — 선택 전용` 등) 은 모달의 입력 시그널(`selectMode` 등) 로 전달. spec 마커 매핑: "선택 전용"·multiselect 는 `selectMode`(`single`/`multi`) 로, "편집 가능 여부" 는 `readonly` 로 따로 전달. "선택 전용" 은 선택 목적을 뜻할 뿐 편집을 막지 않으므로(readonly 아님), 편집까지 차단하려면 `readonly=true` 를 함께 줄 것.
|
|
73
75
|
|
|
74
|
-
피호출
|
|
76
|
+
단건 편집을 모달로 띄우는 경우 피호출 화면은 `.detail.ts`(`<sd-crud-detail>` 루트, `viewType='modal'` 자동 주입)이며 모달 표시용 별도 `.modal.ts` 를 만들지 않음. 모달 전용 비-CRUD 화면(`.modal.ts`)은 `sd-crud-detail` 대신 `sd-busy-container` 등으로 자체 구성. 어느 경우든 임의 `close` output 규약을 만들지 말 것 — `_sdModal.showAsync` 의 페이로드 반환 규약만 사용.
|
|
75
77
|
|
|
76
78
|
**동반 모달**: 동작 섹션에 `→ [화면.Y] 을 모달로 띄움` 으로 등장하는 모든 모달은 같은 호출에서 함께 생성. 이미 존재하면 재사용.
|
|
77
79
|
|
|
@@ -109,19 +111,7 @@ state = signal<"draft" | "confirmed">("draft");
|
|
|
109
111
|
|
|
110
112
|
## "선택하세요." 빈 화면
|
|
111
113
|
|
|
112
|
-
list 와 detail 의 합성 view 에서 항목 미선택 빈 상태는
|
|
113
|
-
|
|
114
|
-
```html
|
|
115
|
-
<div
|
|
116
|
-
class="flex-fill tx-theme-gray-default p-xxl"
|
|
117
|
-
style="font-size: 48px; line-height: 1.5em"
|
|
118
|
-
>
|
|
119
|
-
<ng-icon [svg]="tablerArrowLeft" />
|
|
120
|
-
선택하세요.
|
|
121
|
-
</div>
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
[client-component.md "list + detail 합성"](./client-component.md) 의 단순 `<div class="flex-fill p-default">선택하세요.</div>` 코드를 위 사례로 대체.
|
|
114
|
+
list 와 detail 의 합성 view 에서 항목 미선택 빈 상태는 [client-component.md "list + detail 합성"](./client-component.md) 의 빈 상태 규약(`p-xxl` + `font-size: 48px` + `tablerArrowLeft` 아이콘) 을 그대로 따름.
|
|
125
115
|
|
|
126
116
|
## 라우팅·메뉴 따라가기
|
|
127
117
|
|
|
@@ -139,6 +139,32 @@ sharedProducts = useSharedSignal("품목");
|
|
|
139
139
|
|
|
140
140
|
- `register` 에 쓴 이름 문자열을 그대로 넘기면 `TAppSharedData` 에서 타입이 추론됨.
|
|
141
141
|
|
|
142
|
+
## 선택 컨트롤에서 관리·선택 모달 띄우기
|
|
143
|
+
|
|
144
|
+
공유데이터 선택 컨트롤(`sd-shared-data-select` · `sd-shared-data-select-list`)은 그 자리에서 해당 마스터를 관리·선택하는 모달을 여는 입력을 가짐. 마스터 목록 화면(`sd-crud-list` 기반)을 모달로 재사용해, 선택 컨트롤 옆에서 등록·수정·선택을 끝낼 수 있음.
|
|
145
|
+
|
|
146
|
+
| 입력 | 컨트롤 | 동작 |
|
|
147
|
+
| ------------ | ------------------- | -------------------------------------------------------------------------------------------------- |
|
|
148
|
+
| `[modal]` | select · select-list | 선택형 모달. 모달에 `selectMode: "single"` 과 현재 선택 키가 주입되어 열리고, 닫힘 결과의 첫 키로 선택을 갱신. |
|
|
149
|
+
| `[editModal]` | select | 관리 전용 모달(선택을 바꾸지 않음). 닫혀도 현재 선택은 그대로 유지. |
|
|
150
|
+
|
|
151
|
+
```html
|
|
152
|
+
<sd-shared-data-select-list
|
|
153
|
+
[items]="sharedRoles.items()"
|
|
154
|
+
[(selectedItem)]="selectedRole"
|
|
155
|
+
[modal]="{ type: RoleList, title: '역할', inputs: {} }"
|
|
156
|
+
>
|
|
157
|
+
<ng-template [itemOf]="sharedRoles.items()" let-item="item">{{ item.name }}</ng-template>
|
|
158
|
+
</sd-shared-data-select-list>
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
- `[modal]` 값은 `{ type, title, inputs }` (모달 호출과 동일 형태, [client-component.md](./client-component.md) 의 '모달 호출' 참조).
|
|
162
|
+
- `[modal]` 로 띄울 목록 컴포넌트는 **선택 모달 계약**을 구현해야 함:
|
|
163
|
+
- `selectMode` input + `selectedKeys` model 보유.
|
|
164
|
+
- `SdModalContentDef<SelectModalOutputResult<TKey> | undefined>` 구현 (close 페이로드로 `{ selectedKeys }` 전달).
|
|
165
|
+
- 이 계약은 `sd-crud-list` 의 모달 선택 모드와 동일 ([client-crud.md](./client-crud.md) 참조). 즉 목록 화면 하나가 일반 페이지·선택 모달 양쪽으로 재사용됨.
|
|
166
|
+
- 선택 컨트롤이 띄울 때는 항상 `selectMode: "single"` 로 주입되므로, 목록은 단건 선택 모드로 동작함.
|
|
167
|
+
|
|
142
168
|
## 지킬 것
|
|
143
169
|
|
|
144
170
|
- 항목 추가 시 세 곳(`register` · `TAppSharedData` · 인터페이스)을 모두 갱신. 하나라도 빠지면 타입 불일치 또는 미등록 데이터가 됨.
|
|
@@ -39,6 +39,10 @@ export const SystemLog = Table("SystemLog")
|
|
|
39
39
|
`provideAppInitializer` 안에서 `SdSystemLogProvider.writeFn` 에 적재 함수를 할당.
|
|
40
40
|
|
|
41
41
|
```ts
|
|
42
|
+
import { inject, provideAppInitializer } from "@angular/core";
|
|
43
|
+
import { DateTime, json } from "@simplysm/core-common";
|
|
44
|
+
import { SdSystemLogProvider } from "@simplysm/angular";
|
|
45
|
+
|
|
42
46
|
provideAppInitializer(() => {
|
|
43
47
|
const appService = inject(AppServiceProvider);
|
|
44
48
|
const appOrm = inject(AppOrmProvider);
|
|
@@ -50,7 +54,7 @@ provideAppInitializer(() => {
|
|
|
50
54
|
{
|
|
51
55
|
dateTime: new DateTime(),
|
|
52
56
|
severity,
|
|
53
|
-
message:
|
|
57
|
+
message: data
|
|
54
58
|
.map((l) =>
|
|
55
59
|
typeof l === "string"
|
|
56
60
|
? l
|
|
@@ -71,7 +75,7 @@ provideAppInitializer(() => {
|
|
|
71
75
|
```
|
|
72
76
|
|
|
73
77
|
- `CLIENT_NAME` 은 `provideSdAngular({ clientName: CLIENT_NAME })` 에 넘긴 값과 동일하게 두어 어느 앱에서 난 로그인지 구분.
|
|
74
|
-
- `data` 는 가변 인자
|
|
78
|
+
- `data` 는 가변 인자 배열. 각 인자를 string→그대로 / Error→`stack` / 객체→`json.stringify` 로 문자열화해 공백으로 join 하여 저장(Error 의 `stack` 보존).
|
|
75
79
|
- `writeFn` 미설정 시 외부 적재는 일어나지 않고 콘솔 출력만 수행됨. DB 적재가 필요한 앱에서만 배선.
|
|
76
80
|
|
|
77
81
|
## 자동으로 적재되는 로그
|
|
@@ -44,7 +44,7 @@ console.error("[X] 실패:", err);
|
|
|
44
44
|
|
|
45
45
|
## 환경별 셋업
|
|
46
46
|
|
|
47
|
-
- **Node 진입점(서버·CLI)**: 진입점에서 `setupConsola()` 를 1회 호출.
|
|
47
|
+
- **Node 진입점(서버·CLI)**: 진입점에서 `setupConsola()` 를 1회 호출.
|
|
48
48
|
- **Browser·Capacitor 진입점**: `setupConsola` 호출 금지 (Node 전용 API). consola 기본 reporter 가 브라우저 콘솔로 출력하며, tag·level·호출 방식의 일관성은 그대로 충족.
|
|
49
49
|
|
|
50
50
|
## 모듈-레벨 logger 주의
|
|
@@ -27,6 +27,20 @@ WHERE 와 SELECT 양쪽에서 동일 도출 산식을 쓰겠다고 `buildDerived
|
|
|
27
27
|
|
|
28
28
|
## 안티패턴
|
|
29
29
|
|
|
30
|
+
### execute 결과를 코드에서 후처리 금지
|
|
31
|
+
|
|
32
|
+
가져올 데이터는 DB단에서 최소화함. 중복 제거·필터·정렬·집계·페이징은 ORM 절로 처리하고, `execute()` 로 받은 배열을 코드에서 가공하지 않음. 전건을 메모리로 끌어온 뒤 코드에서 거르면 네트워크·직렬화·메모리 비용이 행 수에 비례해 커짐.
|
|
33
|
+
|
|
34
|
+
| 코드 후처리 (나쁜 예) | ORM 절 (좋은 예) |
|
|
35
|
+
| --------------------------------------------- | ----------------------------------------- |
|
|
36
|
+
| `(await q.execute())` 후 `.distinct()` | `.distinct().execute()` (count 시 `.distinct().wrap().count()`) |
|
|
37
|
+
| 받은 배열을 `.filter(...)` | `.where((r) => [...])` |
|
|
38
|
+
| 받은 배열을 `.sort(...)` | `.orderBy((r) => ..., "ASC")` |
|
|
39
|
+
| 받은 배열을 `.slice(page*size, ...)` | `.limit(page * size, size)` |
|
|
40
|
+
| 받은 배열로 `.reduce((sum, ...) => ...)` | `.select((r) => ({ sum: expr.sum(...) }))` (집계는 `joinSingle` 부착) |
|
|
41
|
+
|
|
42
|
+
이종 엔티티를 합쳐야 할 때도 코드 merge 대신 DB단 UNION — predicate pushdown 으로 각 소스에서 먼저 행을 줄임 ([orm-union.md](./orm-union.md)).
|
|
43
|
+
|
|
30
44
|
### SELECT 절 내부에 `expr.subquery` / `expr.exists` 사용 금지
|
|
31
45
|
|
|
32
46
|
도메인 boolean(`isCompleted`, `hasAny` 등)이나 집계(`SUM`, `COUNT`, `MAX`)가 필요하면 `joinSingle` 안에서 `from + where + select(aggregate)` 로 묶어 outer 행에 컬럼으로 부착함. SELECT 컬럼에 subquery / exists 를 넣으면 outer 행마다 inner 쿼리가 N 회 실행됨.
|
|
@@ -77,7 +91,7 @@ WHERE 와 SELECT 양쪽에서 동일 도출 산식을 쓰겠다고 `buildDerived
|
|
|
77
91
|
|
|
78
92
|
`expr.val` 은 `select` 콜백에서 리터럴 상수 컬럼을 만들 때처럼 `ExprUnit` 이 요구되는 자리에서만 사용.
|
|
79
93
|
|
|
80
|
-
##
|
|
94
|
+
## 컬럼 정책 (nullable / default)
|
|
81
95
|
|
|
82
96
|
컬럼은 `NOT NULL` 기본. `.nullable()` / `.default(...)` 는 도메인 근거가 있을 때만 사용.
|
|
83
97
|
|
|
@@ -62,6 +62,13 @@ API·함수가 단순 입력(리터럴·기본값·직접 인자)을 그대로
|
|
|
62
62
|
- 안티패턴: 문제된 항목만 skip 하고 나머지를 완료 처리 — 데이터가 부분 반영되어 정합성이 깨짐.
|
|
63
63
|
- 부분 성공을 의도적으로 허용하려면(예: 배치 중 실패분만 리포트) 사용자에게 보고 후 합의에 따름.
|
|
64
64
|
|
|
65
|
+
## 변수 명명 시
|
|
66
|
+
|
|
67
|
+
식별자(param·var·const·let) 전체가 `name` 인 것 금지. 무엇의 이름인지 드러내는 식별자로 대체. `name` 을 일부로 포함하는 식별자(`fileName`·`userName` 등)는 허용.
|
|
68
|
+
|
|
69
|
+
- 나쁜 예: `const name = ...`, `function f(name: string)`.
|
|
70
|
+
- 좋은 예: `const fileName = ...`, `function f(userName: string)`.
|
|
71
|
+
|
|
65
72
|
## 사용자에게 노출되는 알림 작성 시 심각도 분류
|
|
66
73
|
|
|
67
74
|
사용자에게 노출되는 알림(로그·토스트·다이얼로그 등)의 심각도 분류 기준:
|
|
@@ -66,8 +66,9 @@ Claude 에이전트가 반드시 지켜야 할 행동 지침.
|
|
|
66
66
|
- 결정 대상 처리 후 남은 결정 대상이 있으면 멈추지 말고 다음 결정 대상으로 진행.
|
|
67
67
|
- 질문 구조: 맥락 + 질문 + 선택지(번호) + 추천.
|
|
68
68
|
- 여러 제안이 있을 경우 모든 제안이 선택지에 포함.
|
|
69
|
-
- 질문당 결정 대상 1
|
|
70
|
-
-
|
|
69
|
+
- 질문당 결정 대상 1건 (사전 차단):
|
|
70
|
+
- 한 응답의 "옵션" 블록은 결정 대상 1건에 대해서만 출력. 결정 대상 2건 이상이면 첫 1건만 옵션 제시, 나머지는 이 응답에 적지 않음 (개수·이름 나열도 금지).
|
|
71
|
+
- 금지 표현: "확인할 결정 (N건)", "답을 한 번에", 여러 결정 대상의 번호 나열, "모두 확정", "큰 그림 채택 → 다항목 자동 진행".
|
|
71
72
|
- 답변 받은 뒤 다음 결정 대상으로 이동.
|
|
72
73
|
- `AskUserQuestion` 도구 사용 금지.
|
|
73
74
|
|
|
@@ -84,11 +85,6 @@ Claude 에이전트가 반드시 지켜야 할 행동 지침.
|
|
|
84
85
|
- 좋은 예: 묻지 않고 Grep·Read 수행 → 결과 기반 다음 행동 결정.
|
|
85
86
|
- 판정 기준: "사용자만 답할 수 있는가?" 가 아니라 "에이전트 도구로 답이 나오는가?" 를 먼저 확인. 도구로 나오면 묻지 않음.
|
|
86
87
|
|
|
87
|
-
**응답 전송 직전 자가 점검**:
|
|
88
|
-
|
|
89
|
-
- 마지막 문장에 우선순위·순서·그룹화·진행 트리거를 사용자에게 위임하는 표현이 있는가?
|
|
90
|
-
- Yes → 첫 결정 대상 1건만 옵션 제시 질문으로 재작성 후 전송.
|
|
91
|
-
|
|
92
88
|
**예시** (시나리오: 어떤 함수에 캐시 도입. 결정 대상 3건 — 라이브러리·TTL·무효화 전략):
|
|
93
89
|
|
|
94
90
|
❌ 나쁜 예 (한 번에 묶기 + 후보 누락 + 추천 없음 + 점검 생략):
|
|
@@ -170,6 +166,7 @@ X 함수에 캐시 도입 검토 중. 기존 의존성 확인 결과 lru-cache
|
|
|
170
166
|
|
|
171
167
|
- 가설1: <[결정 근거](#결정-근거) 인용> → <채택/기각>
|
|
172
168
|
- 가설2: ...
|
|
169
|
+
- 채택 가설 정합성 검증: 그 원인이 참이라 가정하면 보고된 증상이 반드시 도출되는가 + 이를 반박할 증거는 없는가 → <통과 / 실패 시 가설 재검토>
|
|
173
170
|
|
|
174
171
|
해결책:
|
|
175
172
|
|
|
@@ -222,7 +219,7 @@ X 함수에 캐시 도입 검토 중. 기존 의존성 확인 결과 lru-cache
|
|
|
222
219
|
|
|
223
220
|
### 어휘·태도
|
|
224
221
|
|
|
225
|
-
-
|
|
222
|
+
- **한국어** 원어민 수준으로 자연스럽게 응답.
|
|
226
223
|
- 통용 표현 우선. 단, 구어·속어·비속어는 통용되더라도 금지 (예: "퉁치다"→"대신하다"). LLM이 자체 조합한 신조어·합성어도 금지 — 글에서 흔히 쓰는 단어로.
|
|
227
224
|
- 직설적이고 솔직하게 응답. 형식어·완곡어·균형형 응답 금지.
|
|
228
225
|
- 결론·답·핵심 먼저, 근거·맥락·세부는 그 다음 (두괄식).
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sd-debug
|
|
3
|
+
description: 버그·실패·예외의 원인을 다관점으로 발굴하고 가설별 검증·해결책·적대검증을 거쳐 검증된 해결책을 제안하는 멀티에이전트 디버깅. Use when 버그·예외·실패의 근본 원인 분석과 해결책이 필요할 때.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# sd-debug
|
|
7
|
+
|
|
8
|
+
디버깅 요청 시 멀티에이전트 워크플로(`workflow.js`)에 원인 발굴·검증·적대검증을 위임하고, 그 결과를 메인 루프가 사용자에게 제시·결정 처리.
|
|
9
|
+
|
|
10
|
+
## 절차
|
|
11
|
+
|
|
12
|
+
1. **문제 확정** — 증상·기대동작·관찰결과를 확정.
|
|
13
|
+
- 대화 중 오류를 논의하다 진입했으면, 그때까지의 맥락(증상·에러·스택·시도·관찰)을 요약해 문제 설명으로 합성.
|
|
14
|
+
- 에러 메시지·스택·재현조건·관련 코드 경로·환경은 있으면 함께 모음(선택).
|
|
15
|
+
- 문제 설명조차 불명확하면 사용자에게 묻기.
|
|
16
|
+
|
|
17
|
+
2. **워크플로 실행** — Workflow 도구로 이 스킬의 `workflow.js` 실행:
|
|
18
|
+
- `Workflow({ scriptPath: ".claude/skills/sd-debug/workflow.js", args: <문제 설명> })`.
|
|
19
|
+
- `args` 는 1단계의 문제 설명(자연어 문자열 또는 `{ problem, error, repro, paths, env }` 객체).
|
|
20
|
+
- 관점 도출·가설 발굴·검증·해결책 탐색·적대검증·병합은 워크플로가 자율 수행.
|
|
21
|
+
|
|
22
|
+
3. **병합·우선순위화** — 반환값 `survived[]` 를 메인이 직접 정리:
|
|
23
|
+
- 같은 근본 원인의 가설이 중복되면 병합.
|
|
24
|
+
- 각 가설의 해결책 중 `passed: true` 인 것을 채택하되 `revisions`(교정)를 반영하고 `risks` 는 잔존 리스크로 보존.
|
|
25
|
+
- (검증 confidence: confirmed>uncertain) + (적대검증 통과 강도 `votes`) + (원인-증상 직접성)으로 우선순위 정렬.
|
|
26
|
+
|
|
27
|
+
4. **결과 렌더** — 행동 규칙 "문제 발생 시" 의 3블록으로 제시:
|
|
28
|
+
- 원인 가설: `survived[].hypothesis`·`cause` (+ `dropped[]` 로 기각된 가설과 사유).
|
|
29
|
+
- 검증: 각 항목의 `verdict`·`verifyReason` (uncertain 은 "근거 약함" 으로 표시).
|
|
30
|
+
- 해결책: 채택한 해결책(교정 반영) + 잔존 리스크.
|
|
31
|
+
|
|
32
|
+
5. **결정 진행** — 채택 해결책 후보가 1건 이상이면 행동 규칙 "사용자 질의 시" 의 결정 진행 모드로 전환(우선순위 순). 사용자가 고른 해결책만 실제 수정에 착수.
|
|
33
|
+
|
|
34
|
+
6. **미해결 보고** — `summary.noSolution` 이면(검증된 해결책 0건) `survived[]` 의 가설·탈락 사유와 `dropped[]` 를 제시해 다음 수동 디버깅의 출발점으로 삼게 함.
|
|
35
|
+
|
|
36
|
+
## 워크플로 반환 구조
|
|
37
|
+
|
|
38
|
+
- `survived[]`: `{ hypothesis, cause, perspective, verdict, verifyReason, solutions }` — 검증 통과 가설.
|
|
39
|
+
- `solutions[]`: `{ approach, mechanism, changeScope, passed, vetoed, votes, risks, revisions }` — `passed: true` 가 채택 후보.
|
|
40
|
+
- `dropped[]`: `{ hypothesis, cause, reason }` — 검증에서 기각된 가설과 사유.
|
|
41
|
+
- `summary`: 집계(가설 수·confirmed/uncertain·dropped·solutionsPassed·noSolution).
|
|
42
|
+
- `perspectives`: 사용한 의심 관점 목록.
|
|
43
|
+
- `problem`: 입력 문제 요약.
|