issue-sticker 0.1.0

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/LICENSE ADDED
@@ -0,0 +1,51 @@
1
+ IssueSticker SDK Proprietary License
2
+
3
+ Copyright (c) 2026 maana. All rights reserved.
4
+
5
+ This software and associated documentation files (the "Software") are the
6
+ proprietary property of maana. The Software is licensed, not sold.
7
+
8
+ 1. GRANT OF LICENSE
9
+ Subject to the terms of this license, maana grants you a limited,
10
+ non-exclusive, non-transferable, revocable license to use the Software
11
+ solely in connection with a valid IssueSticker API key obtained through
12
+ an active subscription.
13
+
14
+ 2. RESTRICTIONS
15
+ You may NOT:
16
+ (a) Copy, modify, merge, or create derivative works of the Software;
17
+ (b) Reverse engineer, decompile, disassemble, or otherwise attempt to
18
+ derive the source code of the Software;
19
+ (c) Redistribute, sublicense, rent, lease, or lend the Software to
20
+ any third party;
21
+ (d) Remove or alter any proprietary notices, labels, or marks on the
22
+ Software;
23
+ (e) Use the Software without a valid API key or in violation of the
24
+ terms of service.
25
+
26
+ 3. INTELLECTUAL PROPERTY
27
+ The Software is protected by copyright laws and international treaties.
28
+ maana retains all right, title, and interest in and to the Software,
29
+ including all intellectual property rights therein.
30
+
31
+ 4. TERMINATION
32
+ This license is effective until terminated. It will terminate automatically
33
+ if you fail to comply with any term of this license. Upon termination,
34
+ you must destroy all copies of the Software in your possession.
35
+
36
+ 5. DISCLAIMER OF WARRANTIES
37
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
38
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
39
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
40
+
41
+ 6. LIMITATION OF LIABILITY
42
+ IN NO EVENT SHALL MAANA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
43
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
44
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
45
+ DEALINGS IN THE SOFTWARE.
46
+
47
+ 7. GOVERNING LAW
48
+ This license shall be governed by and construed in accordance with the
49
+ laws of the Republic of Korea.
50
+
51
+ For licensing inquiries, contact: support@issuesticker.com
package/README.md ADDED
@@ -0,0 +1,486 @@
1
+ # IssueSticker SDK
2
+
3
+ 웹 애플리케이션에 시각적 버그 트래킹 위젯을 삽입하는 SDK입니다.
4
+ 사용자가 페이지 위에서 직접 클릭하여 이슈를 생성하고, 스크린샷/네트워크 로그/콘솔 로그를 자동으로 수집합니다.
5
+
6
+ ---
7
+
8
+ ## 목차
9
+
10
+ - [주요 기능](#주요-기능)
11
+ - [설치](#설치)
12
+ - [빠른 시작](#빠른-시작)
13
+ - [동작 모드](#동작-모드)
14
+ - [API 레퍼런스](#api-레퍼런스)
15
+ - [설정 옵션](#설정-옵션)
16
+ - [이벤트](#이벤트)
17
+ - [키보드 단축키](#키보드-단축키)
18
+ - [위젯 기능](#위젯-기능)
19
+ - [브라우저 지원](#브라우저-지원)
20
+ - [FAQ](#faq)
21
+ - [라이선스](#라이선스)
22
+
23
+ ---
24
+
25
+ ## 주요 기능
26
+
27
+ - **클릭 기반 이슈 생성** — 페이지 위 원하는 위치를 클릭하여 마커 생성
28
+ - **자동 스크린샷 캡처** — 이슈 생성 시점의 화면을 자동으로 캡처
29
+ - **네트워크/콘솔 로그 수집** — 이슈 발생 전후의 네트워크 요청 및 콘솔 로그 자동 기록
30
+ - **화면 녹화** — 버그 재현 과정을 영상으로 기록
31
+ - **마커 표시** — 생성된 이슈를 페이지 위에 마커로 표시
32
+
33
+ ---
34
+
35
+ ## 설치
36
+
37
+ ### npm
38
+
39
+ ```bash
40
+ npm install issue-sticker
41
+ ```
42
+
43
+ ### yarn
44
+
45
+ ```bash
46
+ yarn add issue-sticker
47
+ ```
48
+
49
+ ### pnpm
50
+
51
+ ```bash
52
+ pnpm add issue-sticker
53
+ ```
54
+
55
+ ### React 어댑터 사용 시 peer dependency
56
+
57
+ `issue-sticker/react`를 사용할 경우 호스트 앱에 `react`, `react-dom`이 필요합니다.
58
+
59
+ ### CDN (script 태그)
60
+
61
+ ```html
62
+ <script src="https://cdn.issuesticker.com/sdk/issue-sticker.umd.js"></script>
63
+ <script>
64
+ IssueSticker.init({ apiKey: 'YOUR_API_KEY' });
65
+ </script>
66
+ ```
67
+
68
+ ---
69
+
70
+ ## 빠른 시작
71
+
72
+ ### 엔트리포인트
73
+
74
+ - `issue-sticker/runtime` — 프레임워크 비의존 코어 런타임 API (`IssueSticker`) (UI 마운트 없음)
75
+ - `issue-sticker/react` — React 어댑터 API (`IssueSticker`, `useIssueSticker`) (위젯 UI 마운트 포함)
76
+
77
+ 화면 위젯(FAB/이슈 폼/마커)을 사용하려면 `issue-sticker/react` 경로를 사용해야 합니다.
78
+
79
+ ### React / Next.js
80
+
81
+ `useIssueSticker` 훅을 사용하면 초기화와 정리를 자동으로 처리합니다.
82
+
83
+ ```tsx
84
+ import { useIssueSticker } from 'issue-sticker/react';
85
+
86
+ function App() {
87
+ useIssueSticker({ apiKey: 'YOUR_API_KEY' });
88
+
89
+ return <div>My Application</div>;
90
+ }
91
+ ```
92
+
93
+ ### Vanilla JavaScript
94
+
95
+ ```typescript
96
+ import { IssueSticker } from 'issue-sticker/runtime';
97
+
98
+ IssueSticker.init({ apiKey: 'YOUR_API_KEY' });
99
+ ```
100
+
101
+ `issue-sticker/runtime`은 코어 런타임 경로로, React UI 마운트 없이 SDK 엔진 라이프사이클/API 이벤트를 다룰 때 사용합니다.
102
+
103
+ ### HTML
104
+
105
+ ```html
106
+ <script src="https://cdn.issuesticker.com/sdk/issue-sticker.umd.js"></script>
107
+ <script>
108
+ IssueSticker.init({ apiKey: 'YOUR_API_KEY' });
109
+ </script>
110
+ ```
111
+
112
+ UMD(`issue-sticker.umd.js`)는 런타임 경로 기준입니다.
113
+ UMD 경로는 위젯 UI를 자동 마운트하지 않습니다.
114
+
115
+ ---
116
+
117
+ ## 동작 모드
118
+
119
+ SDK는 `user` 옵션 전달 여부에 따라 두 가지 모드로 동작합니다.
120
+ 아래 화면 동작(폼/마커/FAB)은 `issue-sticker/react` 경로로 위젯이 마운트된 상태를 기준으로 설명합니다.
121
+
122
+ ### 익명 모드 (기본)
123
+
124
+ `user` 옵션 없이 초기화합니다. 이슈는 익명으로 생성되며, 사용자별 이슈 조회는 불가능합니다.
125
+
126
+ ```tsx
127
+ useIssueSticker({ apiKey: 'YOUR_API_KEY' });
128
+ ```
129
+
130
+ | 항목 | 동작 |
131
+ | ----------- | ------------------ |
132
+ | 이슈 생성 | 익명으로 생성 |
133
+ | 이슈 조회 | 불가 (생성만 가능) |
134
+ | 보고자 표시 | 표시 안 됨 |
135
+
136
+ ### 사용자 식별 모드
137
+
138
+ 호스트 앱의 사용자 정보를 `user`에 전달합니다. 이슈에 보고자 정보가 기록되고, 해당 사용자가 생성한 이슈만 조회할 수 있습니다.
139
+
140
+ ```tsx
141
+ useIssueSticker({
142
+ apiKey: 'YOUR_API_KEY',
143
+ user: {
144
+ id: 'user-123',
145
+ name: 'Hong Gildong',
146
+ },
147
+ });
148
+ ```
149
+
150
+ | 항목 | 동작 |
151
+ | ----------- | -------------------------------- |
152
+ | 이슈 생성 | 사용자 정보와 함께 생성 |
153
+ | 이슈 조회 | 해당 사용자가 생성한 이슈만 표시 |
154
+ | 보고자 표시 | `user.name`으로 표시 |
155
+
156
+ ### 멤버 모드
157
+
158
+ 워크스페이스에 등록된 멤버 계정으로 로그인합니다. FAB 메뉴의 "멤버 로그인"을 통해 진입할 수 있습니다.
159
+ 멤버 모드에서는 프로젝트의 모든 이슈를 조회/관리할 수 있으며, 마커를 페이지 위에 표시합니다.
160
+
161
+ | 항목 | 동작 |
162
+ | --------- | ----------------------------------------- |
163
+ | 이슈 생성 | 멤버 계정으로 생성 |
164
+ | 이슈 조회 | 프로젝트의 모든 이슈 조회 가능 |
165
+ | 마커 | 현재 페이지의 이슈를 마커로 표시 |
166
+ | 이슈 관리 | 상태 변경, 심각도 변경, 댓글 등 전체 기능 |
167
+
168
+ ---
169
+
170
+ ## API 레퍼런스
171
+
172
+ ### `useIssueSticker(config)`
173
+
174
+ React 커스텀 훅. 컴포넌트 마운트 시 SDK를 초기화하고, 언마운트 시 자동으로 정리합니다.
175
+
176
+ ```tsx
177
+ import { useIssueSticker } from 'issue-sticker/react';
178
+
179
+ function App() {
180
+ useIssueSticker({
181
+ apiKey: 'YOUR_API_KEY',
182
+ user: { id: 'user-123', name: 'Hong Gildong' },
183
+ });
184
+
185
+ return <div>My App</div>;
186
+ }
187
+ ```
188
+
189
+ `config.apiKey`, `config.user`, `config.enabled`가 변경되면 SDK를 자동으로 재초기화합니다.
190
+
191
+ ---
192
+
193
+ ### `IssueSticker.init(config)`
194
+
195
+ SDK 코어 런타임을 초기화합니다.
196
+ 이 API(`issue-sticker/runtime`)는 위젯 UI를 자동 마운트하지 않습니다.
197
+ React 환경에서는 `useIssueSticker` 훅 사용을 권장합니다.
198
+
199
+ ```typescript
200
+ import { IssueSticker } from 'issue-sticker/runtime';
201
+ ```
202
+
203
+ ```typescript
204
+ IssueSticker.init(config: SDKConfig): void
205
+ ```
206
+
207
+ | 이름 | 타입 | 필수 | 설명 |
208
+ | -------- | ----------- | ---- | ------------- |
209
+ | `config` | `SDKConfig` | Yes | SDK 설정 객체 |
210
+
211
+ 이미 초기화된 상태에서 다시 호출하면, 기존 런타임 상태를 정리한 뒤 새로 초기화합니다.
212
+
213
+ ---
214
+
215
+ ### `IssueSticker.destroy()`
216
+
217
+ SDK 코어 런타임을 종료합니다.
218
+ `issue-sticker/runtime` 경로에서는 위젯 언마운트를 수행하지 않습니다.
219
+
220
+ ```typescript
221
+ IssueSticker.destroy(): void
222
+ ```
223
+
224
+ ---
225
+
226
+ ### `IssueSticker.on(event, callback)`
227
+
228
+ SDK 이벤트를 구독합니다.
229
+
230
+ ```typescript
231
+ IssueSticker.on(event: SDKEvent, callback: (...args: unknown[]) => void): void
232
+ ```
233
+
234
+ **예시:**
235
+
236
+ ```typescript
237
+ IssueSticker.on('issue:created', (issue) => {
238
+ console.log('새 이슈:', issue);
239
+ });
240
+
241
+ IssueSticker.on('error', (error) => {
242
+ console.error('SDK 오류:', error);
243
+ });
244
+ ```
245
+
246
+ ---
247
+
248
+ ### `IssueSticker.off(event, callback)`
249
+
250
+ 등록된 이벤트 구독을 해제합니다.
251
+
252
+ ```typescript
253
+ IssueSticker.off(event: SDKEvent, callback: (...args: unknown[]) => void): void
254
+ ```
255
+
256
+ **예시:**
257
+
258
+ ```typescript
259
+ const handler = (issue) => console.log(issue);
260
+ IssueSticker.on('issue:created', handler);
261
+
262
+ // 나중에 구독 해제
263
+ IssueSticker.off('issue:created', handler);
264
+ ```
265
+
266
+ ---
267
+
268
+ ## 설정 옵션
269
+
270
+ ### `SDKConfig`
271
+
272
+ | 속성 | 타입 | 필수 | 설명 |
273
+ | --------- | --------- | ---- | -------------------------------------------------------------- |
274
+ | `apiKey` | `string` | Yes | IssueSticker API 키. [대시보드](https://app.issuesticker.com)에서 발급 |
275
+ | `user` | `SDKUser` | No | 호스트 앱의 사용자 정보. 전달 시 사용자 식별 모드로 동작 |
276
+ | `enabled` | `boolean` | No | SDK 활성화 여부 (기본값: `true`). `useIssueSticker` 훅 전용 |
277
+
278
+ ### `SDKUser`
279
+
280
+ | 속성 | 타입 | 필수 | 설명 |
281
+ | ------ | -------- | ---- | ------------------ |
282
+ | `id` | `string` | Yes | 사용자 고유 식별자 |
283
+ | `name` | `string` | Yes | 사용자 표시 이름 |
284
+
285
+ ---
286
+
287
+ ## 이벤트
288
+
289
+ SDK는 다양한 이벤트를 발생시켜 위젯의 상태 변화를 알려줍니다.
290
+
291
+ | 이벤트 | 발생 시점 | 콜백 인자 |
292
+ | ------------------- | ------------------- | ------------------- |
293
+ | `ready` | SDK 초기화 완료 | — |
294
+ | `error` | 오류 발생 | `error: string` |
295
+ | `issue:created` | 이슈 생성 완료 | `issue: object` |
296
+ | `issue:updated` | 이슈 수정 완료 | `issue: object` |
297
+ | `issue:clicked` | 마커 클릭 | `issueId: string` |
298
+ | `mode:changed` | 이슈 생성 모드 변경 | `isActive: boolean` |
299
+ | `recording:started` | 화면 녹화 시작 | — |
300
+ | `recording:stopped` | 화면 녹화 종료 | — |
301
+ | `auth:login` | 멤버 로그인 성공 | — |
302
+ | `auth:logout` | 로그아웃 완료 | — |
303
+
304
+ ---
305
+
306
+ ## 키보드 단축키
307
+
308
+ | 단축키 | 기능 |
309
+ | -------------------- | ------------------- |
310
+ | `Ctrl/Cmd + Alt + 1` | 이슈 생성 모드 토글 |
311
+ | `Ctrl/Cmd + Alt + 2` | 화면 녹화 시작/중지 |
312
+ | `Esc` | 이슈 생성 모드 종료 |
313
+
314
+ ---
315
+
316
+ ## 위젯 기능
317
+
318
+ ### FAB (Floating Action Button)
319
+
320
+ `issue-sticker/react` 경로로 SDK를 초기화하면 우측 하단에 플로팅 버튼이 나타납니다.
321
+
322
+ | 메뉴 | 설명 | 조건 |
323
+ | ---------------- | ------------------------ | -------------- |
324
+ | 이슈 생성 | 이슈 생성 모드 진입/종료 | 항상 표시 |
325
+ | 화면 녹화 | 화면 녹화 시작/중지 | 항상 표시 |
326
+ | 마커 보기/숨기기 | 마커 표시 토글 | 멤버 로그인 시 |
327
+ | 멤버 로그인 | 워크스페이스 멤버 로그인 | 비로그인 시 |
328
+ | 로그아웃 | 멤버 로그아웃 | 로그인 시 |
329
+
330
+ ### 이슈 생성 모드
331
+
332
+ 이슈 생성은 **스크린샷 모드**와 **영상 녹화 모드** 두 가지 방식을 지원합니다.
333
+
334
+ #### 스크린샷 모드
335
+
336
+ 이슈 생성 시점의 화면을 정지 이미지로 캡처합니다.
337
+
338
+ 1. FAB 메뉴에서 "이슈 생성" 클릭 또는 `Ctrl/Cmd + Alt + 1`
339
+ 2. 커서가 십자 모양으로 변경되고, 마우스 오버 시 요소가 하이라이트됨
340
+ 3. 원하는 위치 클릭 → 이슈 생성 폼 표시 (스크린샷 자동 첨부)
341
+ 4. 폼 작성 후 제출
342
+
343
+ #### 영상 녹화 모드
344
+
345
+ 버그 재현 과정을 영상으로 기록한 후 이슈에 첨부합니다.
346
+
347
+ 1. FAB 메뉴에서 "화면 녹화" 클릭 또는 `Ctrl/Cmd + Alt + 2`
348
+ 2. 화면 녹화가 시작됨 (녹화 인디케이터 표시)
349
+ 3. 버그를 재현한 후, FAB 메뉴에서 "녹화 중지" 클릭 또는 `Ctrl/Cmd + Alt + 2`
350
+ 4. 녹화 종료 후 자동으로 이슈 생성 모드 진입
351
+ 5. 원하는 위치 클릭 → 이슈 생성 폼 표시 (녹화 영상 자동 첨부)
352
+ 6. 폼 작성 후 제출
353
+
354
+ > **참고**: SDK의 영상 녹화는 브라우저 `getDisplayMedia` API를 사용합니다. 녹화 중 페이지를 리로드하거나 다른 페이지로 이동하면 녹화가 중단되며 녹화 데이터가 유실됩니다. 페이지 이동에도 끊김 없는 녹화가 필요한 경우, [IssueSticker Chrome Extension](https://chrome.google.com/webstore)을 설치하면 백그라운드 녹화를 지원하여 페이지 리로드에도 녹화가 유지됩니다.
355
+
356
+ ### 자동 수집 데이터
357
+
358
+ | 데이터 | 설명 |
359
+ | ------------- | ---------------------------------------------- |
360
+ | 스크린샷 | 클릭 시점의 페이지 스크린샷 |
361
+ | 영상 | 화면 녹화 영상 (녹화 모드 사용 시) |
362
+ | 네트워크 로그 | 최근 50개 네트워크 요청 (URL, 상태, 소요 시간) |
363
+ | 콘솔 로그 | 최근 50개 콘솔 출력 (log, warn, error) |
364
+ | User Agent | 브라우저 및 OS 정보 |
365
+ | 클릭 위치 | 클릭한 요소의 CSS 선택자 및 XPath |
366
+
367
+ > **참고**: 출시 이후 SDK 위젯 내부에 1회성 제품 안내가 추가될 수 있습니다. 이 안내는 `SDKConfig` 옵션이나 public API로 제어하지 않고, IssueSticker Shadow DOM 내부 UI만 대상으로 하며 localStorage로 기본 1회 노출 여부를 관리합니다.
368
+
369
+ ---
370
+
371
+ ## 브라우저 지원
372
+
373
+ | 브라우저 | 최소 버전 |
374
+ | -------- | --------- |
375
+ | Chrome | 90+ |
376
+ | Firefox | 90+ |
377
+ | Safari | 15+ |
378
+ | Edge | 90+ |
379
+
380
+ ---
381
+
382
+ ## FAQ
383
+
384
+ ### API 키는 어디서 발급받나요?
385
+
386
+ [IssueSticker 대시보드](https://app.issuesticker.com)에서 프로젝트를 생성한 후 SDK 설정 페이지에서 API 키를 발급받을 수 있습니다.
387
+
388
+ ### 호스트 페이지의 CSS에 영향을 주나요?
389
+
390
+ `issue-sticker/react` 경로를 사용하는 경우, SDK 위젯은 호스트 페이지의 스타일과 격리되어 동작합니다. 단, 이슈 생성 모드에서 커서 변경과 요소 하이라이트를 위한 최소한의 스타일이 추가됩니다.
391
+
392
+ ### SPA(Single Page Application)에서 사용할 수 있나요?
393
+
394
+ 네. URL 변경을 자동으로 감지하여 새 페이지의 이슈를 로드합니다. 위젯 UI까지 사용하려면 `useIssueSticker`를 `issue-sticker/react`에서 import해 앱 최상위에서 사용하는 방식을 권장합니다.
395
+
396
+ ### `Invalid hook call` / `Cannot read properties of null (reading 'useRef')` 오류가 나요
397
+
398
+ 이 오류는 대부분 **호스트 앱에 React 인스턴스가 2개 이상 로드**될 때 발생합니다.
399
+
400
+ 1. 의존성 중복 확인
401
+
402
+ ```bash
403
+ npm ls react react-dom
404
+ ```
405
+
406
+ `react`, `react-dom`이 단일 버전으로 정리되어 있는지 확인하세요.
407
+
408
+ 2. Vite 사용 시 dedupe 설정
409
+
410
+ ```ts
411
+ // vite.config.ts
412
+ import { defineConfig } from 'vite';
413
+
414
+ export default defineConfig({
415
+ resolve: {
416
+ dedupe: ['react', 'react-dom'],
417
+ },
418
+ });
419
+ ```
420
+
421
+ Webpack/Next.js 사용 시에는 alias로 React 경로를 단일화하세요.
422
+
423
+ ```js
424
+ // next.config.js 또는 webpack config
425
+ const path = require('path');
426
+
427
+ module.exports = {
428
+ webpack: (config) => {
429
+ config.resolve.alias = {
430
+ ...(config.resolve.alias || {}),
431
+ react: path.resolve(__dirname, 'node_modules/react'),
432
+ 'react-dom': path.resolve(__dirname, 'node_modules/react-dom'),
433
+ };
434
+ return config;
435
+ },
436
+ };
437
+ ```
438
+
439
+ 3. import 경로 점검
440
+
441
+ - React 환경: `import { useIssueSticker } from 'issue-sticker/react'`
442
+ - 비 React 환경: `import { IssueSticker } from 'issue-sticker/runtime'`
443
+
444
+ 루트(`issue-sticker`)에서 React 훅을 import하지 않도록 주의하세요.
445
+ `issue-sticker/react`를 사용할 때는 호스트 앱에 `react`, `react-dom`이 반드시 설치되어 있어야 합니다.
446
+
447
+ `[plugin:vite:import-analysis] Missing "./react" specifier in "issue-sticker" package` 오류가 보이면,
448
+ 설치된 SDK tarball/lockfile이 오래된 상태일 가능성이 큽니다. `node_modules`와 lockfile을 갱신한 뒤 SDK를 재설치하세요.
449
+
450
+ ### 리액트 없이도 사용할 수 있나요?
451
+
452
+ 네. `issue-sticker/runtime`으로 코어 런타임 초기화/이벤트 연동은 가능합니다.
453
+ 다만 FAB/이슈 폼/마커 같은 위젯 UI 기능은 `issue-sticker/react` 경로(React 환경)에서만 동작합니다.
454
+
455
+ ### user 정보를 넣으면 어떤 효과가 있나요?
456
+
457
+ [동작 모드](#동작-모드) 섹션을 참조하세요. `user.id`를 전달하면 사용자 식별 모드로 동작하여 해당 사용자가 생성한 이슈만 조회할 수 있고, `user.name`이 보고자로 기록됩니다.
458
+
459
+ ### 이슈 데이터는 어디에 저장되나요?
460
+
461
+ IssueSticker 클라우드 서버에 안전하게 저장됩니다. API 키에 연결된 프로젝트에 이슈가 귀속됩니다.
462
+
463
+ ### 프로덕션 환경에서도 사용해도 되나요?
464
+
465
+ 네. 다만 일반 사용자에게 노출하지 않으려면 특정 조건(예: 관리자 모드, 스테이징 환경)에서만 SDK를 초기화하도록 분기 처리하는 것을 권장합니다.
466
+
467
+ ```tsx
468
+ import { useIssueSticker } from 'issue-sticker/react';
469
+
470
+ function App() {
471
+ useIssueSticker({
472
+ apiKey: 'YOUR_API_KEY',
473
+ enabled: isAdminMode || isStagingEnv,
474
+ });
475
+
476
+ return <div>My App</div>;
477
+ }
478
+ ```
479
+
480
+ ---
481
+
482
+ ## 라이선스
483
+
484
+ Copyright (c) 2026 maana. All rights reserved.
485
+
486
+ 이 소프트웨어는 maana의 독점 소유물입니다. 자세한 내용은 [LICENSE](./LICENSE) 파일을 참조하세요.