@simplysm/sd-claude 14.0.47 → 14.0.49

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 (130) hide show
  1. package/{claude/references/sd-simplysm14/sd-claude/usage.md → README.md} +2 -2
  2. package/claude/rules/sd-claude-rules.md +25 -10
  3. package/claude/rules/sd-options.md +11 -6
  4. package/claude/sd-subagent-start.sh +6 -0
  5. package/claude/settings.json +1 -12
  6. package/claude/skills/sd-check/SKILL.md +43 -12
  7. package/claude/skills/sd-claude-docs/SKILL.md +30 -58
  8. package/claude/skills/sd-claude-docs/references/package-claudemd.md +12 -0
  9. package/claude/skills/sd-claude-docs/references/package-doc-gen.md +26 -13
  10. package/claude/skills/sd-commit/SKILL.md +1 -1
  11. package/claude/skills/sd-debug/SKILL.md +5 -3
  12. package/claude/skills/sd-deliverable/SKILL.md +1 -1
  13. package/claude/skills/sd-dev/SKILL.md +14 -9
  14. package/claude/skills/sd-doc-extract/SKILL.md +8 -10
  15. package/claude/skills/sd-doc-extract/_common.py +8 -1
  16. package/claude/skills/sd-doc-extract/_extract_docx.py +74 -34
  17. package/claude/skills/sd-doc-extract/_extract_pdf.py +12 -1
  18. package/claude/skills/sd-doc-extract/_extract_pptx.py +103 -23
  19. package/claude/skills/sd-doc-extract/_extract_xlsb.py +93 -4
  20. package/claude/skills/sd-doc-extract/_extract_xlsx.py +98 -36
  21. package/claude/skills/sd-doc-extract/extract.py +22 -3
  22. package/claude/skills/sd-inner-clarify/SKILL.md +78 -0
  23. package/claude/skills/sd-inner-debug/SKILL.md +1 -1
  24. package/claude/skills/sd-inner-review/SKILL.md +13 -0
  25. package/claude/skills/sd-issue/SKILL.md +1 -1
  26. package/claude/skills/sd-outlook/SKILL.md +1 -1
  27. package/claude/skills/sd-plan/SKILL.md +50 -17
  28. package/claude/skills/sd-prompt/SKILL.md +180 -178
  29. package/claude/skills/sd-prompt/references/eval-runner.md +5 -30
  30. package/claude/skills/sd-prompt/references/sd-eval-env-template.md +23 -0
  31. package/claude/skills/sd-refactor/SKILL.md +2 -2
  32. package/claude/skills/sd-tdd/SKILL.md +45 -16
  33. package/claude/skills/sd-use/SKILL.md +84 -80
  34. package/claude/skills/sd-wbs/SKILL.md +84 -27
  35. package/{claude/references/sd-simplysm14/sd-claude/docs → docs}/assets.md +2 -3
  36. package/{claude/references/sd-simplysm14/sd-claude/docs → docs}/hooks.md +7 -6
  37. package/{claude/references/sd-simplysm14/sd-claude/docs → docs}/scripts.md +1 -9
  38. package/package.json +3 -2
  39. package/scripts/sync.mjs +4 -2
  40. package/claude/references/sd-simplysm14/angular/docs/bootstrap.md +0 -48
  41. package/claude/references/sd-simplysm14/angular/docs/directives.md +0 -236
  42. package/claude/references/sd-simplysm14/angular/docs/features.md +0 -379
  43. package/claude/references/sd-simplysm14/angular/docs/pipes.md +0 -32
  44. package/claude/references/sd-simplysm14/angular/docs/plugins.md +0 -37
  45. package/claude/references/sd-simplysm14/angular/docs/provider-types.md +0 -283
  46. package/claude/references/sd-simplysm14/angular/docs/providers.md +0 -379
  47. package/claude/references/sd-simplysm14/angular/docs/styling.md +0 -222
  48. package/claude/references/sd-simplysm14/angular/docs/type-utilities.md +0 -250
  49. package/claude/references/sd-simplysm14/angular/docs/ui-data.md +0 -275
  50. package/claude/references/sd-simplysm14/angular/docs/ui-form.md +0 -490
  51. package/claude/references/sd-simplysm14/angular/docs/ui-layout.md +0 -140
  52. package/claude/references/sd-simplysm14/angular/docs/ui-navigation.md +0 -273
  53. package/claude/references/sd-simplysm14/angular/docs/ui-overlay.md +0 -157
  54. package/claude/references/sd-simplysm14/angular/docs/ui-visual.md +0 -127
  55. package/claude/references/sd-simplysm14/angular/docs/utils.md +0 -295
  56. package/claude/references/sd-simplysm14/angular/usage.md +0 -489
  57. package/claude/references/sd-simplysm14/capacitor-plugin-auto-update/usage.md +0 -182
  58. package/claude/references/sd-simplysm14/capacitor-plugin-file-system/docs/file-operations.md +0 -154
  59. package/claude/references/sd-simplysm14/capacitor-plugin-file-system/docs/permissions.md +0 -84
  60. package/claude/references/sd-simplysm14/capacitor-plugin-file-system/docs/storage-paths.md +0 -107
  61. package/claude/references/sd-simplysm14/capacitor-plugin-file-system/docs/types.md +0 -83
  62. package/claude/references/sd-simplysm14/capacitor-plugin-file-system/usage.md +0 -133
  63. package/claude/references/sd-simplysm14/capacitor-plugin-intent/usage.md +0 -203
  64. package/claude/references/sd-simplysm14/capacitor-plugin-usb-storage/usage.md +0 -258
  65. package/claude/references/sd-simplysm14/core-browser/usage.md +0 -306
  66. package/claude/references/sd-simplysm14/core-common/docs/errors.md +0 -82
  67. package/claude/references/sd-simplysm14/core-common/docs/extensions.md +0 -167
  68. package/claude/references/sd-simplysm14/core-common/docs/features.md +0 -136
  69. package/claude/references/sd-simplysm14/core-common/docs/types.md +0 -245
  70. package/claude/references/sd-simplysm14/core-common/docs/utils.md +0 -591
  71. package/claude/references/sd-simplysm14/core-common/usage.md +0 -255
  72. package/claude/references/sd-simplysm14/core-node/docs/child-process.md +0 -182
  73. package/claude/references/sd-simplysm14/core-node/docs/features.md +0 -214
  74. package/claude/references/sd-simplysm14/core-node/docs/file-system.md +0 -509
  75. package/claude/references/sd-simplysm14/core-node/docs/file-watching.md +0 -139
  76. package/claude/references/sd-simplysm14/core-node/docs/logging.md +0 -180
  77. package/claude/references/sd-simplysm14/core-node/docs/path.md +0 -176
  78. package/claude/references/sd-simplysm14/core-node/docs/utilities-cpx.md +0 -194
  79. package/claude/references/sd-simplysm14/core-node/docs/utilities-fsx.md +0 -469
  80. package/claude/references/sd-simplysm14/core-node/docs/utilities-pathx.md +0 -151
  81. package/claude/references/sd-simplysm14/core-node/docs/worker-threads.md +0 -334
  82. package/claude/references/sd-simplysm14/core-node/docs/worker.md +0 -205
  83. package/claude/references/sd-simplysm14/core-node/usage.md +0 -259
  84. package/claude/references/sd-simplysm14/excel/docs/core-classes.md +0 -453
  85. package/claude/references/sd-simplysm14/excel/docs/types.md +0 -459
  86. package/claude/references/sd-simplysm14/excel/docs/utilities.md +0 -194
  87. package/claude/references/sd-simplysm14/excel/docs/wrapper.md +0 -73
  88. package/claude/references/sd-simplysm14/excel/usage.md +0 -134
  89. package/claude/references/sd-simplysm14/lint/usage.md +0 -130
  90. package/claude/references/sd-simplysm14/orm-common/docs/core.md +0 -188
  91. package/claude/references/sd-simplysm14/orm-common/docs/expression.md +0 -190
  92. package/claude/references/sd-simplysm14/orm-common/docs/models.md +0 -17
  93. package/claude/references/sd-simplysm14/orm-common/docs/query-builder.md +0 -97
  94. package/claude/references/sd-simplysm14/orm-common/docs/queryable-executable.md +0 -250
  95. package/claude/references/sd-simplysm14/orm-common/docs/schema-builders.md +0 -364
  96. package/claude/references/sd-simplysm14/orm-common/docs/types.md +0 -522
  97. package/claude/references/sd-simplysm14/orm-common/usage.md +0 -229
  98. package/claude/references/sd-simplysm14/orm-node/docs/connections.md +0 -137
  99. package/claude/references/sd-simplysm14/orm-node/docs/core.md +0 -131
  100. package/claude/references/sd-simplysm14/orm-node/docs/types.md +0 -173
  101. package/claude/references/sd-simplysm14/orm-node/usage.md +0 -143
  102. package/claude/references/sd-simplysm14/sd-cli/usage.md +0 -782
  103. package/claude/references/sd-simplysm14/service-client/docs/features.md +0 -217
  104. package/claude/references/sd-simplysm14/service-client/docs/main.md +0 -148
  105. package/claude/references/sd-simplysm14/service-client/docs/protocol.md +0 -53
  106. package/claude/references/sd-simplysm14/service-client/docs/transport.md +0 -131
  107. package/claude/references/sd-simplysm14/service-client/docs/types.md +0 -129
  108. package/claude/references/sd-simplysm14/service-client/usage.md +0 -202
  109. package/claude/references/sd-simplysm14/service-common/docs/app-structure.md +0 -175
  110. package/claude/references/sd-simplysm14/service-common/docs/events.md +0 -64
  111. package/claude/references/sd-simplysm14/service-common/docs/protocol.md +0 -331
  112. package/claude/references/sd-simplysm14/service-common/docs/service-types.md +0 -90
  113. package/claude/references/sd-simplysm14/service-common/docs/types.md +0 -19
  114. package/claude/references/sd-simplysm14/service-common/usage.md +0 -154
  115. package/claude/references/sd-simplysm14/service-server/docs/auth.md +0 -64
  116. package/claude/references/sd-simplysm14/service-server/docs/core.md +0 -174
  117. package/claude/references/sd-simplysm14/service-server/docs/legacy.md +0 -25
  118. package/claude/references/sd-simplysm14/service-server/docs/main.md +0 -88
  119. package/claude/references/sd-simplysm14/service-server/docs/protocol.md +0 -33
  120. package/claude/references/sd-simplysm14/service-server/docs/services.md +0 -94
  121. package/claude/references/sd-simplysm14/service-server/docs/transport-http.md +0 -93
  122. package/claude/references/sd-simplysm14/service-server/docs/transport-socket.md +0 -119
  123. package/claude/references/sd-simplysm14/service-server/docs/types.md +0 -36
  124. package/claude/references/sd-simplysm14/service-server/docs/utils.md +0 -22
  125. package/claude/references/sd-simplysm14/service-server/usage.md +0 -171
  126. package/claude/references/sd-simplysm14/storage/usage.md +0 -301
  127. package/claude/references/sd-simplysm14.md +0 -35
  128. package/claude/rules/sd-clarify.md +0 -23
  129. package/claude/sd-session-start.sh +0 -10
  130. /package/{claude/references/sd-simplysm14/sd-claude/docs → docs}/cli.md +0 -0
@@ -1,331 +0,0 @@
1
- # Protocol
2
-
3
- ## `PROTOCOL_CONFIG`
4
-
5
- 서비스 프로토콜 설정 상수.
6
-
7
- ```typescript
8
- export const PROTOCOL_CONFIG = {
9
- MAX_TOTAL_SIZE: 100 * 1024 * 1024, // 최대 메시지 크기 (100MB)
10
- SPLIT_MESSAGE_SIZE: 3 * 1024 * 1024, // 청킹 임계값 (3MB)
11
- CHUNK_SIZE: 300 * 1024, // 청크 크기 (300KB)
12
- GC_INTERVAL: 10 * 1000, // GC 주기 (10초)
13
- EXPIRE_TIME: 60 * 1000, // 미완성 메시지 만료 시간 (60초)
14
- } as const;
15
- ```
16
-
17
- | Field | Type | Description |
18
- |-------|------|-------------|
19
- | `MAX_TOTAL_SIZE` | `number` | 단일 메시지의 최대 허용 크기. 초과 시 `ArgumentError` 발생 |
20
- | `SPLIT_MESSAGE_SIZE` | `number` | 이 크기를 초과하면 자동으로 청크 분할 |
21
- | `CHUNK_SIZE` | `number` | 분할된 각 청크의 크기 |
22
- | `GC_INTERVAL` | `number` | 내부 청크 누적기의 가비지 컬렉션 주기 (밀리초) |
23
- | `EXPIRE_TIME` | `number` | 미완성 청크 메시지의 만료 시간. 이 시간 내에 모든 청크가 도착하지 않으면 제거 |
24
-
25
- ## `ServiceMessage`
26
-
27
- 모든 서비스 메시지의 유니언 타입. 클라이언트·서버 양방향 메시지를 모두 포함한다.
28
-
29
- ```typescript
30
- export type ServiceMessage =
31
- | ServiceRequestMessage
32
- | ServiceAuthMessage
33
- | ServiceProgressMessage
34
- | ServiceResponseMessage
35
- | ServiceErrorMessage
36
- | ServiceAddEventListenerMessage
37
- | ServiceRemoveEventListenerMessage
38
- | ServiceGetEventListenerInfosMessage
39
- | ServiceEmitEventMessage
40
- | ServiceEventMessage;
41
- ```
42
-
43
- ## `ServiceServerMessage`
44
-
45
- 서버 → 클라이언트 메시지 유니언.
46
-
47
- ```typescript
48
- export type ServiceServerMessage =
49
- | ServiceResponseMessage
50
- | ServiceErrorMessage
51
- | ServiceEventMessage;
52
- ```
53
-
54
- ## `ServiceServerRawMessage`
55
-
56
- 서버가 보내는 모든 메시지 (진행 상태 포함).
57
-
58
- ```typescript
59
- export type ServiceServerRawMessage = ServiceProgressMessage | ServiceServerMessage;
60
- ```
61
-
62
- ## `ServiceClientMessage`
63
-
64
- 클라이언트 → 서버 메시지 유니언.
65
-
66
- ```typescript
67
- export type ServiceClientMessage =
68
- | ServiceRequestMessage
69
- | ServiceAuthMessage
70
- | ServiceAddEventListenerMessage
71
- | ServiceRemoveEventListenerMessage
72
- | ServiceGetEventListenerInfosMessage
73
- | ServiceEmitEventMessage;
74
- ```
75
-
76
- ## `ServiceProgressMessage`
77
-
78
- 서버가 보내는 청크 수신 진행 상태 알림 메시지.
79
-
80
- ```typescript
81
- export interface ServiceProgressMessage {
82
- name: "progress";
83
- body: {
84
- totalSize: number;
85
- completedSize: number;
86
- };
87
- }
88
- ```
89
-
90
- | Field | Type | Description |
91
- |-------|------|-------------|
92
- | `name` | `"progress"` | 고정 문자열 discriminant |
93
- | `body.totalSize` | `number` | 전체 메시지 크기 (바이트) |
94
- | `body.completedSize` | `number` | 현재까지 수신 완료된 크기 (바이트) |
95
-
96
- ## `ServiceErrorMessage`
97
-
98
- 서버가 보내는 에러 알림 메시지.
99
-
100
- ```typescript
101
- export interface ServiceErrorMessage {
102
- name: "error";
103
- body: {
104
- name: string;
105
- message: string;
106
- code: string;
107
- stack?: string;
108
- detail?: unknown;
109
- cause?: unknown;
110
- };
111
- }
112
- ```
113
-
114
- | Field | Type | Description |
115
- |-------|------|-------------|
116
- | `name` | `"error"` | 고정 문자열 discriminant |
117
- | `body.name` | `string` | 에러 이름 (클래스명) |
118
- | `body.message` | `string` | 에러 메시지 |
119
- | `body.code` | `string` | 에러 코드 |
120
- | `body.stack` | `string?` | 스택 트레이스 (선택) |
121
- | `body.detail` | `unknown?` | 추가 상세 정보 (선택) |
122
- | `body.cause` | `unknown?` | 원인 에러 (선택) |
123
-
124
- ## `ServiceAuthMessage`
125
-
126
- 클라이언트가 보내는 인증 메시지.
127
-
128
- ```typescript
129
- export interface ServiceAuthMessage {
130
- name: "auth";
131
- body: string;
132
- }
133
- ```
134
-
135
- | Field | Type | Description |
136
- |-------|------|-------------|
137
- | `name` | `"auth"` | 고정 문자열 discriminant |
138
- | `body` | `string` | 인증 토큰 |
139
-
140
- ## `ServiceRequestMessage`
141
-
142
- 클라이언트가 보내는 서비스 메서드 요청 메시지.
143
-
144
- ```typescript
145
- export interface ServiceRequestMessage {
146
- name: `${string}.${string}`;
147
- body: unknown[];
148
- }
149
- ```
150
-
151
- | Field | Type | Description |
152
- |-------|------|-------------|
153
- | `name` | `` `${string}.${string}` `` | 서비스명.메서드명 형식 (예: `"OrmService.connect"`) |
154
- | `body` | `unknown[]` | 메서드 매개변수 배열 |
155
-
156
- ## `ServiceResponseMessage`
157
-
158
- 서버가 보내는 서비스 메서드 응답 메시지.
159
-
160
- ```typescript
161
- export interface ServiceResponseMessage {
162
- name: "response";
163
- body?: unknown;
164
- }
165
- ```
166
-
167
- | Field | Type | Description |
168
- |-------|------|-------------|
169
- | `name` | `"response"` | 고정 문자열 discriminant |
170
- | `body` | `unknown?` | 메서드 실행 결과 (없으면 void) |
171
-
172
- ## `ServiceAddEventListenerMessage`
173
-
174
- 클라이언트가 보내는 이벤트 리스너 추가 메시지.
175
-
176
- ```typescript
177
- export interface ServiceAddEventListenerMessage {
178
- name: "evt:add";
179
- body: {
180
- key: string;
181
- name: string;
182
- info: unknown;
183
- };
184
- }
185
- ```
186
-
187
- | Field | Type | Description |
188
- |-------|------|-------------|
189
- | `name` | `"evt:add"` | 고정 문자열 discriminant |
190
- | `body.key` | `string` | 리스너 키 (UUID). removeEventListener에 사용 |
191
- | `body.name` | `string` | 이벤트 이름 (`ServiceEventDef.eventName`) |
192
- | `body.info` | `unknown` | 이벤트 발생 시 필터링을 위한 추가 리스너 정보 |
193
-
194
- ## `ServiceRemoveEventListenerMessage`
195
-
196
- 클라이언트가 보내는 이벤트 리스너 제거 메시지.
197
-
198
- ```typescript
199
- export interface ServiceRemoveEventListenerMessage {
200
- name: "evt:remove";
201
- body: {
202
- key: string;
203
- };
204
- }
205
- ```
206
-
207
- | Field | Type | Description |
208
- |-------|------|-------------|
209
- | `name` | `"evt:remove"` | 고정 문자열 discriminant |
210
- | `body.key` | `string` | 제거할 리스너 키 (UUID) |
211
-
212
- ## `ServiceGetEventListenerInfosMessage`
213
-
214
- 클라이언트가 보내는 이벤트 리스너 정보 목록 요청 메시지.
215
-
216
- ```typescript
217
- export interface ServiceGetEventListenerInfosMessage {
218
- name: "evt:gets";
219
- body: {
220
- name: string;
221
- };
222
- }
223
- ```
224
-
225
- | Field | Type | Description |
226
- |-------|------|-------------|
227
- | `name` | `"evt:gets"` | 고정 문자열 discriminant |
228
- | `body.name` | `string` | 조회할 이벤트 이름 |
229
-
230
- ## `ServiceEmitEventMessage`
231
-
232
- 클라이언트가 보내는 이벤트 발생 메시지.
233
-
234
- ```typescript
235
- export interface ServiceEmitEventMessage {
236
- name: "evt:emit";
237
- body: {
238
- keys: string[];
239
- data: unknown;
240
- };
241
- }
242
- ```
243
-
244
- | Field | Type | Description |
245
- |-------|------|-------------|
246
- | `name` | `"evt:emit"` | 고정 문자열 discriminant |
247
- | `body.keys` | `string[]` | 대상 리스너 키 목록 |
248
- | `body.data` | `unknown` | 이벤트 데이터 |
249
-
250
- ## `ServiceEventMessage`
251
-
252
- 서버가 보내는 이벤트 알림 메시지.
253
-
254
- ```typescript
255
- export interface ServiceEventMessage {
256
- name: "evt:on";
257
- body: {
258
- keys: string[];
259
- data: unknown;
260
- };
261
- }
262
- ```
263
-
264
- | Field | Type | Description |
265
- |-------|------|-------------|
266
- | `name` | `"evt:on"` | 고정 문자열 discriminant |
267
- | `body.keys` | `string[]` | 대상 리스너 키 목록 |
268
- | `body.data` | `unknown` | 이벤트 데이터 |
269
-
270
- ## `ServiceProtocol`
271
-
272
- 바이너리 프로토콜 V2 인코더/디코더 인터페이스. `createServiceProtocol()`로 생성한다.
273
-
274
- ```typescript
275
- export interface ServiceProtocol {
276
- encode(uuid: string, message: ServiceMessage): { chunks: Bytes[]; totalSize: number };
277
- decode<T extends ServiceMessage>(bytes: Bytes): ServiceMessageDecodeResult<T>;
278
- dispose(): void;
279
- }
280
- ```
281
-
282
- | Method | Parameters | Return | Description |
283
- |--------|-----------|--------|-------------|
284
- | `encode` | `uuid: string, message: ServiceMessage` | `{ chunks: Bytes[]; totalSize: number }` | 메시지를 인코딩한다. 3MB 초과 시 300KB 청크로 자동 분할 |
285
- | `decode` | `bytes: Bytes` | `ServiceMessageDecodeResult<T>` | 청크를 디코딩한다. 청크가 모두 도착하면 complete, 아니면 progress 반환 |
286
- | `dispose` | 없음 | `void` | 내부 GC 타이머와 청크 누적기를 해제한다. 사용 후 반드시 호출 |
287
-
288
- 헤더 구조 (28바이트, Big Endian):
289
-
290
- | Offset | Size | Field |
291
- |--------|------|-------|
292
- | 0 | 16 | UUID (바이너리) |
293
- | 16 | 8 | TotalSize (uint64, 상위 4바이트 = 0) |
294
- | 24 | 4 | Index (uint32) |
295
-
296
- ## `ServiceMessageDecodeResult`
297
-
298
- 메시지 디코딩 결과 유니언 타입. `type` 필드로 분기한다.
299
-
300
- ```typescript
301
- export type ServiceMessageDecodeResult<TMessage extends ServiceMessage> =
302
- | { type: "complete"; uuid: string; message: TMessage }
303
- | { type: "progress"; uuid: string; totalSize: number; completedSize: number };
304
- ```
305
-
306
- **Variant: `complete`** — 모든 청크가 도착하여 메시지 재조립이 완료된 상태.
307
-
308
- | Field | Type | Description |
309
- |-------|------|-------------|
310
- | `type` | `"complete"` | discriminant |
311
- | `uuid` | `string` | 메시지 UUID |
312
- | `message` | `TMessage` | 재조립된 메시지 |
313
-
314
- **Variant: `progress`** — 청크 메시지 수신 진행 중.
315
-
316
- | Field | Type | Description |
317
- |-------|------|-------------|
318
- | `type` | `"progress"` | discriminant |
319
- | `uuid` | `string` | 메시지 UUID |
320
- | `totalSize` | `number` | 전체 크기 (바이트) |
321
- | `completedSize` | `number` | 수신 완료된 크기 (바이트) |
322
-
323
- ## `createServiceProtocol`
324
-
325
- ServiceProtocol 인스턴스를 생성하는 팩토리 함수.
326
-
327
- ```typescript
328
- export function createServiceProtocol(): ServiceProtocol;
329
- ```
330
-
331
- 내부에 `LazyGcMap` 기반 청크 누적기를 캡슐화한다. 미완성 메시지는 60초 후 GC로 자동 정리된다. 사용 후 반드시 `dispose()`를 호출하여 GC 타이머를 해제해야 한다.
@@ -1,90 +0,0 @@
1
- # Service Types
2
-
3
- ## `OrmService`
4
-
5
- 데이터베이스 연결, 트랜잭션 관리, 쿼리 실행을 제공하는 서비스 인터페이스. MySQL, MSSQL, PostgreSQL을 지원한다. 이 패키지에는 구현체가 없으며, 서버(`service-server`)와 클라이언트(`service-client`)가 공유하는 타입 계약이다.
6
-
7
- ```typescript
8
- export interface OrmService {
9
- getInfo(opt: DbConnOptions & { configName: string }): Promise<{
10
- dialect: Dialect;
11
- database?: string;
12
- schema?: string;
13
- }>;
14
- connect(opt: DbConnOptions & { configName: string }): Promise<number>;
15
- close(connId: number): Promise<void>;
16
- beginTransaction(connId: number, isolationLevel?: IsolationLevel): Promise<void>;
17
- commitTransaction(connId: number): Promise<void>;
18
- rollbackTransaction(connId: number): Promise<void>;
19
- executeParametrized(connId: number, query: string, params?: unknown[]): Promise<unknown[][]>;
20
- executeDefs(
21
- connId: number,
22
- defs: QueryDef[],
23
- options?: (ResultMeta | undefined)[],
24
- ): Promise<unknown[][]>;
25
- bulkInsert(
26
- connId: number,
27
- tableName: string,
28
- columnDefs: Record<string, ColumnMeta>,
29
- records: Record<string, unknown>[],
30
- ): Promise<void>;
31
- }
32
- ```
33
-
34
- | Method | Parameters | Return | Description |
35
- |--------|-----------|--------|-------------|
36
- | `getInfo` | `opt: DbConnOptions & { configName: string }` | `Promise<{ dialect, database?, schema? }>` | DB 연결 정보 (dialect, database, schema) 조회 |
37
- | `connect` | `opt: DbConnOptions & { configName: string }` | `Promise<number>` | DB 연결을 생성하고 연결 ID 반환 |
38
- | `close` | `connId: number` | `Promise<void>` | 연결 종료 |
39
- | `beginTransaction` | `connId: number, isolationLevel?: IsolationLevel` | `Promise<void>` | 트랜잭션 시작 |
40
- | `commitTransaction` | `connId: number` | `Promise<void>` | 트랜잭션 커밋 |
41
- | `rollbackTransaction` | `connId: number` | `Promise<void>` | 트랜잭션 롤백 |
42
- | `executeParametrized` | `connId: number, query: string, params?: unknown[]` | `Promise<unknown[][]>` | 파라미터 바인딩 쿼리 실행 |
43
- | `executeDefs` | `connId: number, defs: QueryDef[], options?: (ResultMeta \| undefined)[]` | `Promise<unknown[][]>` | QueryDef 배열로 쿼리 실행 |
44
- | `bulkInsert` | `connId: number, tableName: string, columnDefs: Record<string, ColumnMeta>, records: Record<string, unknown>[]` | `Promise<void>` | 대량 삽입 |
45
-
46
- 사용 순서: `connect()` -> `beginTransaction()` -> `executeDefs()`/`executeParametrized()` -> `commitTransaction()`/`rollbackTransaction()` -> `close()`
47
-
48
- ## `DbConnOptions`
49
-
50
- 데이터베이스 연결 옵션.
51
-
52
- ```typescript
53
- export type DbConnOptions = { configName?: string; config?: Record<string, unknown> };
54
- ```
55
-
56
- | Field | Type | Description |
57
- |-------|------|-------------|
58
- | `configName` | `string?` | 서버에 등록된 DB 설정 이름 |
59
- | `config` | `Record<string, unknown>?` | 직접 지정하는 DB 연결 설정 |
60
-
61
- ## `AutoUpdateService`
62
-
63
- 클라이언트 애플리케이션의 최신 버전 정보를 조회하는 서비스 인터페이스.
64
-
65
- ```typescript
66
- export interface AutoUpdateService {
67
- getLastVersion(platform: string): Promise<
68
- | { version: string; downloadPath: string }
69
- | undefined
70
- >;
71
- }
72
- ```
73
-
74
- | Method | Parameters | Return | Description |
75
- |--------|-----------|--------|-------------|
76
- | `getLastVersion` | `platform: string` | `Promise<{ version, downloadPath } \| undefined>` | 지정된 플랫폼(예: "win32", "darwin", "linux")의 최신 버전 정보 조회. 버전이 없으면 undefined |
77
-
78
- ## `AppStructureService`
79
-
80
- 서버에 등록된 앱 구조 항목을 클라이언트명 기준 맵으로 조회하는 서비스 인터페이스.
81
-
82
- ```typescript
83
- export interface AppStructureService {
84
- getItems(): Record<string, AppStructureItem[]>;
85
- }
86
- ```
87
-
88
- | Method | Parameters | Return | Description |
89
- |--------|-----------|--------|-------------|
90
- | `getItems` | 없음 | `Record<string, AppStructureItem[]>` | 클라이언트명을 키로, 해당 클라이언트의 앱 구조 항목 배열을 값으로 하는 맵 반환 |
@@ -1,19 +0,0 @@
1
- # Types
2
-
3
- ## `ServiceUploadResult`
4
-
5
- 파일 업로드 결과. 서버에 업로드된 파일의 정보를 포함한다.
6
-
7
- ```typescript
8
- export interface ServiceUploadResult {
9
- path: string;
10
- filename: string;
11
- size: number;
12
- }
13
- ```
14
-
15
- | Field | Type | Description |
16
- |-------|------|-------------|
17
- | `path` | `string` | 서버 내 저장 경로 |
18
- | `filename` | `string` | 원본 파일명 |
19
- | `size` | `number` | 파일 크기 (바이트) |
@@ -1,154 +0,0 @@
1
- # @simplysm/service-common
2
-
3
- 서비스 클라이언트와 서버가 공유하는 바이너리 프로토콜, 메시지 타입, 서비스 인터페이스, 앱 구조 정의 패키지.
4
-
5
- ## Installation
6
-
7
- ```bash
8
- npm install @simplysm/service-common
9
- ```
10
-
11
- ## API Overview
12
-
13
- ### Protocol
14
-
15
- | API | Type | Description |
16
- |-----|------|-------------|
17
- | `PROTOCOL_CONFIG` | const | 프로토콜 설정 상수 (최대 크기, 청킹 임계값, 청크 크기, GC 주기, 만료 시간) |
18
- | `ServiceMessage` | type | 양방향 메시지의 유니언 타입 |
19
- | `ServiceClientMessage` | type | 클라이언트 → 서버 메시지 유니언 |
20
- | `ServiceServerMessage` | type | 서버 → 클라이언트 메시지 유니언 |
21
- | `ServiceServerRawMessage` | type | 진행 상태를 포함한 서버 메시지 유니언 |
22
- | `ServiceProgressMessage` | interface | 청크 수신 진행 상태 알림 |
23
- | `ServiceErrorMessage` | interface | 서버 에러 알림 |
24
- | `ServiceAuthMessage` | interface | 클라이언트 인증 메시지 (토큰) |
25
- | `ServiceRequestMessage` | interface | 서비스 메서드 요청 |
26
- | `ServiceResponseMessage` | interface | 서비스 메서드 응답 |
27
- | `ServiceAddEventListenerMessage` | interface | 이벤트 리스너 추가 요청 |
28
- | `ServiceRemoveEventListenerMessage` | interface | 이벤트 리스너 제거 요청 |
29
- | `ServiceGetEventListenerInfosMessage` | interface | 이벤트 리스너 정보 목록 요청 |
30
- | `ServiceEmitEventMessage` | interface | 이벤트 발생 요청 |
31
- | `ServiceEventMessage` | interface | 서버 이벤트 알림 |
32
- | `ServiceProtocol` | interface | 바이너리 프로토콜 인코더/디코더 |
33
- | `ServiceMessageDecodeResult` | type | 디코딩 결과 유니언 (complete \| progress) |
34
- | `createServiceProtocol` | function | ServiceProtocol 인스턴스 생성 팩토리 |
35
-
36
- → See [docs/protocol.md](./docs/protocol.md) for details.
37
-
38
- ### Service Types
39
-
40
- | API | Type | Description |
41
- |-----|------|-------------|
42
- | `OrmService` | interface | DB 연결, 트랜잭션, 쿼리 실행 서비스 인터페이스 |
43
- | `DbConnOptions` | type | DB 연결 옵션 타입 |
44
- | `AutoUpdateService` | interface | 클라이언트 최신 버전 조회 서비스 인터페이스 |
45
- | `AppStructureService` | interface | 앱 구조 항목 조회 서비스 인터페이스 |
46
-
47
- → See [docs/service-types.md](./docs/service-types.md) for details.
48
-
49
- ### Types
50
-
51
- | API | Type | Description |
52
- |-----|------|-------------|
53
- | `ServiceUploadResult` | interface | 파일 업로드 결과 |
54
-
55
- → See [docs/types.md](./docs/types.md) for details.
56
-
57
- ### App Structure
58
-
59
- | API | Type | Description |
60
- |-----|------|-------------|
61
- | `AppStructureItem` | type | 앱 구조 항목 (그룹 또는 리프) |
62
- | `AppStructureGroupItem` | interface | 자식을 가진 그룹 메뉴 항목 |
63
- | `AppStructureLeafItem` | interface | 말단 메뉴 항목 (권한, URL 포함) |
64
- | `AppStructureSubPermission` | interface | 리프 항목의 하위 권한 정의 |
65
- | `FlatPermission` | interface | 플래트닝된 권한 결과 |
66
- | `isUsableModules` | function | 개별 항목의 모듈 접근 가능 여부 판단 |
67
- | `isUsableModulesChain` | function | 모듈 체인 전체의 접근 가능 여부 판단 |
68
- | `getFlatPermissions` | function | 앱 구조 트리를 플래트닝하여 권한 배열 반환 |
69
-
70
- → See [docs/app-structure.md](./docs/app-structure.md) for details.
71
-
72
- ### Events
73
-
74
- | API | Type | Description |
75
- |-----|------|-------------|
76
- | `ServiceEventDef` | interface | 타입 안전 이벤트 정의 인터페이스 |
77
- | `defineEvent` | function | 타입 안전 이벤트를 정의하는 팩토리 함수 |
78
-
79
- → See [docs/events.md](./docs/events.md) for details.
80
-
81
- ## Usage Examples
82
-
83
- ### 프로토콜 인코딩/디코딩
84
-
85
- ```typescript
86
- import { createServiceProtocol } from "@simplysm/service-common";
87
-
88
- const protocol = createServiceProtocol();
89
-
90
- // 메시지 인코딩 (3MB 초과 시 자동 청킹)
91
- const { chunks, totalSize } = protocol.encode(uuid, {
92
- name: "OrmService.connect",
93
- body: [{ configName: "default" }],
94
- });
95
-
96
- // 메시지 디코딩 (청크 자동 재조립)
97
- for (const chunk of chunks) {
98
- const result = protocol.decode(chunk);
99
- if (result.type === "complete") {
100
- // result.message: 재조립된 메시지
101
- }
102
- }
103
-
104
- // 사용 후 반드시 해제
105
- protocol.dispose();
106
- ```
107
-
108
- ### 타입 안전 이벤트 정의
109
-
110
- ```typescript
111
- import { defineEvent } from "@simplysm/service-common";
112
-
113
- // 서버에서 이벤트 정의 + 타입 export
114
- export const OrderUpdated = defineEvent<{ orderId: number }, { status: string }>("OrderUpdated");
115
-
116
- // 서버에서 이벤트 발생 (제네릭 타입 파라미터 + 문자열 이름 패턴)
117
- await server.emitEvent<typeof OrderUpdated>("OrderUpdated", (info) => info.orderId === 123, { status: "shipped" });
118
-
119
- // 클라이언트에서 구독 (import type으로 타입만 가져옴)
120
- import type { OrderUpdated } from "@server-package";
121
- await client.addListener<typeof OrderUpdated>("OrderUpdated", { orderId: 123 }, async (data) => {
122
- // data.status는 string으로 타입 추론됨
123
- });
124
- ```
125
-
126
- ### 앱 구조 권한 플래트닝
127
-
128
- ```typescript
129
- import { getFlatPermissions, isUsableModules } from "@simplysm/service-common";
130
- import type { AppStructureItem } from "@simplysm/service-common";
131
-
132
- const items: AppStructureItem<string>[] = [
133
- {
134
- code: "admin",
135
- title: "관리",
136
- children: [
137
- { code: "user", title: "사용자", perms: ["use", "edit"] },
138
- ],
139
- },
140
- {
141
- code: "report",
142
- title: "리포트",
143
- modules: ["moduleA"],
144
- perms: ["use"],
145
- },
146
- ];
147
-
148
- // 활성 모듈 기준으로 권한 플래트닝
149
- const perms = getFlatPermissions(items, ["moduleA"]);
150
- // [{ codeChain: ["admin", "user", "use"], ... }, { codeChain: ["admin", "user", "edit"], ... }, ...]
151
-
152
- // 개별 모듈 접근 가능 여부 확인
153
- const canAccess = isUsableModules(["moduleA", "moduleB"], undefined, ["moduleA"]); // true (OR 조건)
154
- ```
@@ -1,64 +0,0 @@
1
- # Auth
2
-
3
- ## `AuthTokenPayload`
4
-
5
- JWT 페이로드 인터페이스. `jose` 라이브러리의 `JWTPayload`를 확장한다.
6
-
7
- ```typescript
8
- interface AuthTokenPayload<TAuthInfo = unknown> extends JWTPayload {
9
- roles: string[];
10
- data: TAuthInfo;
11
- }
12
- ```
13
-
14
- | Field | Type | Description |
15
- |-------|------|-------------|
16
- | `roles` | `string[]` | 사용자 역할 배열. `auth(["admin"], ...)` 등에서 역할 검사에 사용된다 |
17
- | `data` | `TAuthInfo` | 사용자 정의 인증 데이터. `ServiceContext.authInfo`로 접근 가능하다 |
18
- | (JWTPayload 상속) | — | `iss`, `sub`, `aud`, `exp`, `nbf`, `iat`, `jti` 등 표준 JWT 클레임 |
19
-
20
- ## `signJwt`
21
-
22
- HS256 알고리즘과 12시간 유효기간으로 JWT 토큰을 서명한다.
23
-
24
- ```typescript
25
- async function signJwt<TAuthInfo = unknown>(
26
- jwtSecret: string,
27
- payload: AuthTokenPayload<TAuthInfo>,
28
- ): Promise<string>;
29
- ```
30
-
31
- | Parameter | Type | Description |
32
- |-----------|------|-------------|
33
- | `jwtSecret` | `string` | HMAC 서명 시크릿 |
34
- | `payload` | `AuthTokenPayload<TAuthInfo>` | JWT 페이로드 |
35
-
36
- 반환값: 서명된 JWT 토큰 문자열.
37
-
38
- ## `verifyJwt`
39
-
40
- JWT 토큰을 검증하고 페이로드를 반환한다. 만료된 토큰은 "토큰이 만료되었습니다." 에러를, 그 외 유효하지 않은 토큰은 "유효하지 않은 토큰입니다." 에러를 던진다.
41
-
42
- ```typescript
43
- async function verifyJwt<TAuthInfo = unknown>(
44
- jwtSecret: string,
45
- token: string,
46
- ): Promise<AuthTokenPayload<TAuthInfo>>;
47
- ```
48
-
49
- | Parameter | Type | Description |
50
- |-----------|------|-------------|
51
- | `jwtSecret` | `string` | HMAC 서명 시크릿 |
52
- | `token` | `string` | 검증할 JWT 토큰 문자열 |
53
-
54
- ## `decodeJwt`
55
-
56
- JWT 토큰을 검증 없이 디코딩한다. 서명 검증이나 만료 확인을 수행하지 않는다.
57
-
58
- ```typescript
59
- function decodeJwt<TAuthInfo = unknown>(token: string): AuthTokenPayload<TAuthInfo>;
60
- ```
61
-
62
- | Parameter | Type | Description |
63
- |-----------|------|-------------|
64
- | `token` | `string` | 디코딩할 JWT 토큰 문자열 |