issue-sticker 0.1.1 → 0.2.1
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/CHANGELOG.md +44 -0
- package/README.md +99 -370
- package/dist/createLucideIcon-B457EluY.js +27415 -0
- package/dist/externalUserPayload-C2hxbvaU.js +12282 -0
- package/dist/{index-DN49yZjv.js → index-D6SaRFm4.js} +98 -1
- package/dist/issue-sticker-headless-react.js +764 -0
- package/dist/issue-sticker-headless.js +1912 -0
- package/dist/issue-sticker-react.js +17535 -46760
- package/dist/tooltip-BkQcdrki.js +512 -0
- package/headless-react.d.ts +12 -0
- package/headless.d.ts +172 -0
- package/package.json +26 -26
- package/react.d.ts +29 -2
- package/dist/index.d.ts +0 -37
- package/dist/issue-sticker-runtime.js +0 -37
- package/dist/issue-sticker.js +0 -2105
- package/dist/issue-sticker.umd.js +0 -1
- package/dist/sdkEventListeners-B7idjnFi.js +0 -498
- package/runtime.d.ts +0 -11
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# 변경 이력
|
|
2
|
+
|
|
3
|
+
npm 패키지 `issue-sticker`의 변경 이력입니다. 설치·업그레이드에 영향을 주는 변경만 기록합니다.
|
|
4
|
+
|
|
5
|
+
## 0.2.0 - 2026-08-05
|
|
6
|
+
|
|
7
|
+
### 주의가 필요한 변경
|
|
8
|
+
|
|
9
|
+
- 패키지 루트(`issue-sticker`)와 `issue-sticker/runtime` 엔트리를 제거했습니다. 공개 엔트리는 `issue-sticker/react`, `issue-sticker/headless`, `issue-sticker/headless/react` 세 개입니다.
|
|
10
|
+
- UMD 산출물(`dist/issue-sticker.umd.js`) 배포를 중단했습니다. `<script>` 태그로 패키지 파일을 직접 불러오는 방식은 지원하지 않습니다.
|
|
11
|
+
|
|
12
|
+
마이그레이션:
|
|
13
|
+
|
|
14
|
+
```diff
|
|
15
|
+
-import { IssueSticker } from 'issue-sticker';
|
|
16
|
+
+import { IssueSticker } from 'issue-sticker/react';
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
`issue-sticker/runtime`을 직접 사용하던 코드는 `issue-sticker/react`의 `useIssueSticker()` 또는 `IssueSticker.init()`으로 옮기세요. 위젯 UI 없이 이슈 플로우를 직접 제어하려면 `issue-sticker/headless`를 사용하세요.
|
|
20
|
+
|
|
21
|
+
### 추가
|
|
22
|
+
|
|
23
|
+
- `issue-sticker/headless` — 위젯 UI 없이 이슈 플로우를 구독·제어하는 controller API. `subscribe()`로 snapshot을 구독하고 `startIssueCapture()`·`submitDraft()`로 이슈를 생성합니다. 제목·설명·동적 필드 입력은 호스트 앱이 소유하며 `submitDraft({ title, description, dynamicFields })`로 전달합니다.
|
|
24
|
+
- `issue-sticker/headless/react` — Headless UI를 직접 만들 때 사용하는 최소 React helper.
|
|
25
|
+
- 이슈 팝오버에서 코딩 에이전트에 붙여 넣을 LLM 프롬프트 복사.
|
|
26
|
+
- 이슈 상세에서 네트워크 요청의 메서드·상태·헤더·본문과 콘솔 로그 확인.
|
|
27
|
+
- `multi_select` 커스텀 필드를 이슈 필터에서 사용.
|
|
28
|
+
|
|
29
|
+
### 개선
|
|
30
|
+
|
|
31
|
+
- 이슈 생성 시 클릭 즉시 폼이 뜨고 스크린샷은 백그라운드에서 캡처됩니다. 캡처가 끝나기 전에 제출해도 완료를 기다린 뒤 업로드하며, 캡처가 실패하면 스크린샷 없이 제출을 계속합니다.
|
|
32
|
+
- FAB 트리거와 툴바를 브랜드 컬러 기반으로 정리하고 심볼을 인라인 SVG로 교체했습니다.
|
|
33
|
+
- 캡처 단축키 안내에 `⌘⌥`와 `⌃⌥`를 함께 표시합니다.
|
|
34
|
+
- 세션 리플레이 녹화에서 이슈스티커 위젯 자체가 남기던 노이즈를 제거했습니다.
|
|
35
|
+
- 마커 렌더링을 문서 좌표 기준으로 단일화해 스크롤·리사이즈 시 위치가 어긋나는 경로를 없앴습니다.
|
|
36
|
+
|
|
37
|
+
### 수정
|
|
38
|
+
|
|
39
|
+
- `issue-sticker/react`를 서버에서 평가하는 환경(Next.js client component의 SSR 패스 등)에서 import 즉시 `document is not defined`로 실패하던 문제를 수정했습니다. 번들에 포함되던 마크다운 의존성이 모듈 스코프에서 `document`를 사용하던 것이 원인입니다.
|
|
40
|
+
- 이슈 생성 모드와 화면 녹화가 동시에 켜질 수 있던 문제를 양방향으로 차단했습니다.
|
|
41
|
+
- 온보딩을 시작하면 이슈 생성 모드가 먼저 해제됩니다.
|
|
42
|
+
- 외부 연동 생성이 실패해도 아무 안내가 없던 문제를 toast 알림으로 수정했습니다.
|
|
43
|
+
- 성공 toast가 회색 표면으로 표시되던 문제를 수정했습니다.
|
|
44
|
+
- 이슈 목록·스티커, Jira 연동 필드 응답 처리를 서버 응답 형식에 맞게 정정했습니다.
|
package/README.md
CHANGED
|
@@ -1,486 +1,215 @@
|
|
|
1
|
-
|
|
1
|
+
## 개요
|
|
2
2
|
|
|
3
|
-
웹 애플리케이션에 시각적 버그 트래킹 위젯을 삽입하는 SDK입니다.
|
|
4
|
-
사용자가 페이지 위에서 직접 클릭하여 이슈를 생성하고, 스크린샷/네트워크 로그/콘솔 로그를 자동으로 수집합니다.
|
|
5
3
|
|
|
6
|
-
|
|
4
|
+
이 README는 `issue-sticker` SDK의 설치 방법과 공개 API 표면만 다룹니다.
|
|
7
5
|
|
|
8
|
-
## 목차
|
|
9
6
|
|
|
10
|
-
|
|
11
|
-
- [설치](#설치)
|
|
12
|
-
- [빠른 시작](#빠른-시작)
|
|
13
|
-
- [동작 모드](#동작-모드)
|
|
14
|
-
- [API 레퍼런스](#api-레퍼런스)
|
|
15
|
-
- [설정 옵션](#설정-옵션)
|
|
16
|
-
- [이벤트](#이벤트)
|
|
17
|
-
- [키보드 단축키](#키보드-단축키)
|
|
18
|
-
- [위젯 기능](#위젯-기능)
|
|
19
|
-
- [브라우저 지원](#브라우저-지원)
|
|
20
|
-
- [FAQ](#faq)
|
|
21
|
-
- [라이선스](#라이선스)
|
|
7
|
+
프로젝트 생성, 허용 도메인 등록, API key 발급, 제품별 운영 방식은 아래 가이드에서 확인하세요.
|
|
22
8
|
|
|
23
|
-
---
|
|
24
9
|
|
|
25
|
-
|
|
10
|
+
| 가이드 | 내용 |
|
|
11
|
+
| ---------------------------------------------------------------- | --------------------------------------------- |
|
|
12
|
+
| [시작 준비](https://issuesticker.com/guide/products/setup) | 프로젝트 생성, 허용 도메인 등록, API key 발급 |
|
|
13
|
+
| [SDK Widget](https://issuesticker.com/guide/products/sdk) | 위젯 설치, 초기화, 운영 환경에서 켜는 조건 |
|
|
14
|
+
| [SDK Headless](https://issuesticker.com/guide/products/headless) | Headless 클라이언트 전체 레퍼런스 |
|
|
15
|
+
| [외부 연동](https://issuesticker.com/guide/integrations) | Jira·Notion 연결과 필드 동기화 |
|
|
16
|
+
| [FAQ](https://issuesticker.com/guide/faq) | 권한, 도메인, key, 필드 동기화 문제 해결 |
|
|
26
17
|
|
|
27
|
-
- **클릭 기반 이슈 생성** — 페이지 위 원하는 위치를 클릭하여 마커 생성
|
|
28
|
-
- **자동 스크린샷 캡처** — 이슈 생성 시점의 화면을 자동으로 캡처
|
|
29
|
-
- **네트워크/콘솔 로그 수집** — 이슈 발생 전후의 네트워크 요청 및 콘솔 로그 자동 기록
|
|
30
|
-
- **화면 녹화** — 버그 재현 과정을 영상으로 기록
|
|
31
|
-
- **마커 표시** — 생성된 이슈를 페이지 위에 마커로 표시
|
|
32
|
-
|
|
33
|
-
---
|
|
34
18
|
|
|
35
19
|
## 설치
|
|
36
20
|
|
|
37
|
-
### npm
|
|
38
21
|
|
|
39
22
|
```bash
|
|
40
23
|
npm install issue-sticker
|
|
41
24
|
```
|
|
42
25
|
|
|
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
26
|
|
|
57
|
-
`issue-sticker/react`를
|
|
27
|
+
`issue-sticker/react`와 `issue-sticker/headless/react`를 사용하려면 연동하는 앱에 `react`, `react-dom` 18 또는 19가 설치되어 있어야 합니다.
|
|
58
28
|
|
|
59
|
-
### CDN (script 태그)
|
|
60
29
|
|
|
61
|
-
|
|
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
|
-
```
|
|
30
|
+
## 엔트리포인트
|
|
67
31
|
|
|
68
|
-
---
|
|
69
32
|
|
|
70
|
-
|
|
33
|
+
| 경로 | 용도 |
|
|
34
|
+
| ------------------------------ | ----------------------------------------------------- |
|
|
35
|
+
| `issue-sticker/react` | 위젯 UI(FAB, 이슈 폼, 마커)를 마운트하는 React 어댑터 |
|
|
36
|
+
| `issue-sticker/headless` | UI 없이 이슈 흐름을 구독하고 제어하는 컨트롤러 API |
|
|
37
|
+
| `issue-sticker/headless/react` | Headless UI를 직접 만들 때 사용하는 최소 React 헬퍼 |
|
|
71
38
|
|
|
72
|
-
### 엔트리포인트
|
|
73
39
|
|
|
74
|
-
- `issue-sticker/runtime
|
|
75
|
-
- `issue-sticker/react` — React 어댑터 API (`IssueSticker`, `useIssueSticker`) (위젯 UI 마운트 포함)
|
|
40
|
+
패키지 루트(`issue-sticker`)와 `issue-sticker/runtime`은 공개 엔트리포인트가 아닙니다.
|
|
76
41
|
|
|
77
|
-
화면 위젯(FAB/이슈 폼/마커)을 사용하려면 `issue-sticker/react` 경로를 사용해야 합니다.
|
|
78
42
|
|
|
79
|
-
|
|
43
|
+
## 빠른 시작 — 위젯
|
|
80
44
|
|
|
81
|
-
`useIssueSticker` 훅을 사용하면 초기화와 정리를 자동으로 처리합니다.
|
|
82
45
|
|
|
83
46
|
```tsx
|
|
47
|
+
'use client'; // Next.js App Router
|
|
48
|
+
|
|
84
49
|
import { useIssueSticker } from 'issue-sticker/react';
|
|
85
50
|
|
|
86
51
|
function App() {
|
|
87
|
-
useIssueSticker({
|
|
52
|
+
useIssueSticker({
|
|
53
|
+
apiKey: process.env.NEXT_PUBLIC_ISSUE_STICKER_SDK_KEY!,
|
|
54
|
+
user: { id: 'user-123', name: 'Hong Gildong' }, // 선택: 작성자 식별
|
|
55
|
+
enabled: isStaging || isAdmin, // 선택: 노출 조건 (기본 true)
|
|
56
|
+
});
|
|
88
57
|
|
|
89
58
|
return <div>My Application</div>;
|
|
90
59
|
}
|
|
91
60
|
```
|
|
92
61
|
|
|
93
|
-
### Vanilla JavaScript
|
|
94
62
|
|
|
95
|
-
|
|
96
|
-
|
|
63
|
+
앱 최상위에서 한 번만 호출하세요.
|
|
64
|
+
훅은 마운트 시 SDK를 초기화하고, 언마운트 시 정리합니다.
|
|
97
65
|
|
|
98
|
-
IssueSticker.init({ apiKey: 'YOUR_API_KEY' });
|
|
99
|
-
```
|
|
100
66
|
|
|
101
|
-
|
|
67
|
+
오른쪽 아래에 표시되는 FAB는 드래그로 위치를 옮길 수 있습니다.
|
|
68
|
+
FAB에서는 이슈 생성, 화면 녹화, 마커 표시 토글, 마커 기준 전환(생성 위치 기준 / 대상 요소 기준), 미표시 스티커 확인, 가이드 다시 보기, 멤버 로그인·로그아웃을 사용할 수 있습니다.
|
|
102
69
|
|
|
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
70
|
|
|
112
|
-
|
|
113
|
-
UMD 경로는 위젯 UI를 자동 마운트하지 않습니다.
|
|
71
|
+
이슈 생성 모드와 화면 녹화는 동시에 켤 수 없습니다.
|
|
114
72
|
|
|
115
|
-
---
|
|
116
73
|
|
|
117
|
-
##
|
|
74
|
+
## 빠른 시작 — Headless
|
|
118
75
|
|
|
119
|
-
SDK는 `user` 옵션 전달 여부에 따라 두 가지 모드로 동작합니다.
|
|
120
|
-
아래 화면 동작(폼/마커/FAB)은 `issue-sticker/react` 경로로 위젯이 마운트된 상태를 기준으로 설명합니다.
|
|
121
76
|
|
|
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`에 전달합니다. 이슈에 보고자 정보가 기록되고, 해당 사용자가 생성한 이슈만 조회할 수 있습니다.
|
|
77
|
+
```typescript
|
|
78
|
+
import { createIssueStickerHeadless } from 'issue-sticker/headless';
|
|
139
79
|
|
|
140
|
-
|
|
141
|
-
useIssueSticker({
|
|
80
|
+
const client = createIssueStickerHeadless({
|
|
142
81
|
apiKey: 'YOUR_API_KEY',
|
|
143
|
-
user: {
|
|
144
|
-
id: 'user-123',
|
|
145
|
-
name: 'Hong Gildong',
|
|
146
|
-
},
|
|
82
|
+
user: { id: 'user-123', name: 'Hong Gildong' },
|
|
147
83
|
});
|
|
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
84
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
React 커스텀 훅. 컴포넌트 마운트 시 SDK를 초기화하고, 언마운트 시 자동으로 정리합니다.
|
|
85
|
+
client.subscribe((snapshot) => renderIssueUI(snapshot));
|
|
175
86
|
|
|
176
|
-
|
|
177
|
-
|
|
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
|
-
}
|
|
87
|
+
await client.initialize();
|
|
88
|
+
await client.refreshIssues();
|
|
187
89
|
```
|
|
188
90
|
|
|
189
|
-
`config.apiKey`, `config.user`, `config.enabled`가 변경되면 SDK를 자동으로 재초기화합니다.
|
|
190
91
|
|
|
191
|
-
|
|
92
|
+
현재 상태는 읽기 전용 snapshot으로 제공되며, 이슈 생성은 `startIssueCapture()`로 시작합니다.
|
|
192
93
|
|
|
193
|
-
### `IssueSticker.init(config)`
|
|
194
94
|
|
|
195
|
-
|
|
196
|
-
이 API(`issue-sticker/runtime`)는 위젯 UI를 자동 마운트하지 않습니다.
|
|
197
|
-
React 환경에서는 `useIssueSticker` 훅 사용을 권장합니다.
|
|
95
|
+
전체 메서드, snapshot 타입, 동적 필드 descriptor, 에러 코드는 [Headless 가이드](https://issuesticker.com/guide/products/headless)를 참고하세요.
|
|
198
96
|
|
|
199
|
-
```typescript
|
|
200
|
-
import { IssueSticker } from 'issue-sticker/runtime';
|
|
201
|
-
```
|
|
202
97
|
|
|
203
|
-
|
|
204
|
-
IssueSticker.init(config: SDKConfig): void
|
|
205
|
-
```
|
|
98
|
+
## API — `issue-sticker/react`
|
|
206
99
|
|
|
207
|
-
| 이름 | 타입 | 필수 | 설명 |
|
|
208
|
-
| -------- | ----------- | ---- | ------------- |
|
|
209
|
-
| `config` | `SDKConfig` | Yes | SDK 설정 객체 |
|
|
210
100
|
|
|
211
|
-
|
|
101
|
+
### `useIssueSticker(config)`
|
|
212
102
|
|
|
213
|
-
---
|
|
214
103
|
|
|
215
|
-
|
|
104
|
+
React 훅입니다.
|
|
105
|
+
`apiKey` 또는 `enabled`가 바뀌면 위젯을 다시 초기화하고, `user`가 바뀌면 위젯은 유지한 채 설정만 갱신합니다.
|
|
216
106
|
|
|
217
|
-
SDK 코어 런타임을 종료합니다.
|
|
218
|
-
`issue-sticker/runtime` 경로에서는 위젯 언마운트를 수행하지 않습니다.
|
|
219
107
|
|
|
220
|
-
|
|
221
|
-
IssueSticker.destroy(): void
|
|
222
|
-
```
|
|
108
|
+
### `IssueSticker`
|
|
223
109
|
|
|
224
|
-
---
|
|
225
110
|
|
|
226
|
-
|
|
111
|
+
훅을 사용할 수 없는 환경에서 직접 제어할 때 사용합니다.
|
|
227
112
|
|
|
228
|
-
SDK 이벤트를 구독합니다.
|
|
229
113
|
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
114
|
+
| 메서드 | 설명 |
|
|
115
|
+
| --------------------------------- | ----------------------------------------------------------------------------------------------------- |
|
|
116
|
+
| `init(config: SDKConfig)` | SDK를 초기화하고 위젯을 마운트합니다. 이미 초기화된 상태라면 설정을 갱신하고 위젯을 다시 마운트합니다 |
|
|
117
|
+
| `updateConfig(config: SDKConfig)` | 위젯을 유지한 채 설정만 교체합니다. 초기화 전이면 `init`과 동일하게 동작합니다 |
|
|
118
|
+
| `destroy()` | 위젯을 언마운트하고 SDK를 종료합니다 |
|
|
233
119
|
|
|
234
|
-
**예시:**
|
|
235
120
|
|
|
236
121
|
```typescript
|
|
237
|
-
IssueSticker
|
|
238
|
-
console.log('새 이슈:', issue);
|
|
239
|
-
});
|
|
122
|
+
import { IssueSticker } from 'issue-sticker/react';
|
|
240
123
|
|
|
241
|
-
IssueSticker.
|
|
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
|
|
124
|
+
IssueSticker.init({ apiKey: 'YOUR_API_KEY' });
|
|
254
125
|
```
|
|
255
126
|
|
|
256
|
-
**예시:**
|
|
257
127
|
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
IssueSticker.on('issue:created', handler);
|
|
128
|
+
이슈 생성·제출 흐름을 연동하는 앱에서 직접 구독하거나 제어해야 한다면 Headless 클라이언트를 사용하세요.
|
|
129
|
+
상태는 `subscribe()`로 구독하고, 캡처와 제출은 메서드로 제어할 수 있습니다.
|
|
261
130
|
|
|
262
|
-
// 나중에 구독 해제
|
|
263
|
-
IssueSticker.off('issue:created', handler);
|
|
264
|
-
```
|
|
265
131
|
|
|
266
|
-
|
|
132
|
+
자세한 내용은 [Headless 가이드](https://issuesticker.com/guide/products/headless)를 참고하세요.
|
|
267
133
|
|
|
268
|
-
## 설정 옵션
|
|
269
134
|
|
|
270
135
|
### `SDKConfig`
|
|
271
136
|
|
|
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
137
|
|
|
336
|
-
|
|
138
|
+
| 속성 | 타입 | 필수 | 설명 |
|
|
139
|
+
| ----------------------- | ------------------------------------ | ---- | ------------------------------------------------------------------------------------------- |
|
|
140
|
+
| `apiKey` | `string` | Yes | [관리자 콘솔](https://app.issuesticker.com)에서 발급한 SDK API key |
|
|
141
|
+
| `user` | `SDKUser` | No | 연동하는 앱의 사용자 정보. 전달하면 작성자가 기록되고 자신이 만든 이슈를 조회할 수 있습니다 |
|
|
142
|
+
| `onboarding` | `'off' \| 'onMount' \| 'onFABClick'` | No | 온보딩 가이드 트리거 (기본 `'onMount'`). `'off'`면 "가이드 다시 보기"도 숨깁니다 |
|
|
143
|
+
| `screenshotCompression` | `{ useWebWorker?: boolean }` | No | 스크린샷 압축을 Web Worker에서 수행할지 여부 |
|
|
144
|
+
| `enabled` | `boolean` | No | 위젯 활성화 여부 (기본 `true`). `useIssueSticker` 전용 옵션 |
|
|
337
145
|
|
|
338
|
-
1. FAB 메뉴에서 "이슈 생성" 클릭 또는 `Ctrl/Cmd + Alt + 1`
|
|
339
|
-
2. 커서가 십자 모양으로 변경되고, 마우스 오버 시 요소가 하이라이트됨
|
|
340
|
-
3. 원하는 위치 클릭 → 이슈 생성 폼 표시 (스크린샷 자동 첨부)
|
|
341
|
-
4. 폼 작성 후 제출
|
|
342
146
|
|
|
343
|
-
|
|
147
|
+
`SDKUser`는 `id`, `name` 두 필드가 모두 필요합니다.
|
|
344
148
|
|
|
345
|
-
버그 재현 과정을 영상으로 기록한 후 이슈에 첨부합니다.
|
|
346
149
|
|
|
347
|
-
|
|
348
|
-
2. 화면 녹화가 시작됨 (녹화 인디케이터 표시)
|
|
349
|
-
3. 버그를 재현한 후, FAB 메뉴에서 "녹화 중지" 클릭 또는 `Ctrl/Cmd + Alt + 2`
|
|
350
|
-
4. 녹화 종료 후 자동으로 이슈 생성 모드 진입
|
|
351
|
-
5. 원하는 위치 클릭 → 이슈 생성 폼 표시 (녹화 영상 자동 첨부)
|
|
352
|
-
6. 폼 작성 후 제출
|
|
150
|
+
### 키보드 단축키
|
|
353
151
|
|
|
354
|
-
> **참고**: SDK의 영상 녹화는 브라우저 `getDisplayMedia` API를 사용합니다. 녹화 중 페이지를 리로드하거나 다른 페이지로 이동하면 녹화가 중단되며 녹화 데이터가 유실됩니다. 페이지 이동에도 끊김 없는 녹화가 필요한 경우, [IssueSticker Chrome Extension](https://chrome.google.com/webstore)을 설치하면 백그라운드 녹화를 지원하여 페이지 리로드에도 녹화가 유지됩니다.
|
|
355
152
|
|
|
356
|
-
|
|
153
|
+
| 기능 | macOS | Windows·Linux |
|
|
154
|
+
| ------------------- | ----------- | ------------- |
|
|
155
|
+
| 이슈 생성 모드 토글 | `⌘⌥1` `⌃⌥1` | `Ctrl+Alt+1` |
|
|
156
|
+
| 화면 녹화 시작/중지 | `⌘⌥2` `⌃⌥2` | `Ctrl+Alt+2` |
|
|
157
|
+
| 이슈 생성 모드 종료 | `Esc` | `Esc` |
|
|
357
158
|
|
|
358
|
-
| 데이터 | 설명 |
|
|
359
|
-
| ------------- | ---------------------------------------------- |
|
|
360
|
-
| 스크린샷 | 클릭 시점의 페이지 스크린샷 |
|
|
361
|
-
| 영상 | 화면 녹화 영상 (녹화 모드 사용 시) |
|
|
362
|
-
| 네트워크 로그 | 최근 50개 네트워크 요청 (URL, 상태, 소요 시간) |
|
|
363
|
-
| 콘솔 로그 | 최근 50개 콘솔 출력 (log, warn, error) |
|
|
364
|
-
| User Agent | 브라우저 및 OS 정보 |
|
|
365
|
-
| 클릭 위치 | 클릭한 요소의 CSS 선택자 및 XPath |
|
|
366
159
|
|
|
367
|
-
|
|
160
|
+
## 이슈에 담기는 정보
|
|
368
161
|
|
|
369
|
-
---
|
|
370
162
|
|
|
371
|
-
|
|
163
|
+
- 스크린샷 — 화면 전체와 클릭한 요소 영역 (클릭 직후 백그라운드에서 캡처)
|
|
164
|
+
- 화면 녹화 영상 — 녹화 모드로 생성한 경우
|
|
165
|
+
- 네트워크·콘솔 로그 — 각각 최근 50개, IssueSticker 자체 트래픽은 제외
|
|
166
|
+
- 브라우저·OS 정보, 발생 URL, 클릭한 요소의 CSS 선택자와 XPath
|
|
167
|
+
- 세션 리플레이 — 워크스페이스에서 사용할 수 있는 경우, 이슈 폼에서 첨부 여부 선택
|
|
372
168
|
|
|
373
|
-
| 브라우저 | 최소 버전 |
|
|
374
|
-
| -------- | --------- |
|
|
375
|
-
| Chrome | 90+ |
|
|
376
|
-
| Firefox | 90+ |
|
|
377
|
-
| Safari | 15+ |
|
|
378
|
-
| Edge | 90+ |
|
|
379
169
|
|
|
380
|
-
|
|
170
|
+
화면의 마커를 클릭하면 이슈 팝오버에서 제목과 설명을 수정하고, 이슈를 삭제하고, 코딩 에이전트에 붙여 넣을 LLM 프롬프트를 복사할 수 있습니다.
|
|
171
|
+
연동된 Jira·Notion 정보는 멤버로 로그인했을 때 함께 표시됩니다.
|
|
381
172
|
|
|
382
|
-
## FAQ
|
|
383
173
|
|
|
384
|
-
|
|
174
|
+
화면 녹화는 브라우저 `getDisplayMedia` API를 사용합니다.
|
|
175
|
+
녹화 중 페이지를 새로고침하거나 다른 페이지로 이동하면 녹화가 중단되고 데이터가 유실됩니다.
|
|
385
176
|
|
|
386
|
-
[IssueSticker 대시보드](https://app.issuesticker.com)에서 프로젝트를 생성한 후 SDK 설정 페이지에서 API 키를 발급받을 수 있습니다.
|
|
387
177
|
|
|
388
|
-
|
|
178
|
+
페이지 이동 중에도 끊기지 않는 녹화가 필요하면 [Chrome Extension](https://issuesticker.com/guide/products/extension)을 사용하세요.
|
|
389
179
|
|
|
390
|
-
`issue-sticker/react` 경로를 사용하는 경우, SDK 위젯은 호스트 페이지의 스타일과 격리되어 동작합니다. 단, 이슈 생성 모드에서 커서 변경과 요소 하이라이트를 위한 최소한의 스타일이 추가됩니다.
|
|
391
180
|
|
|
392
|
-
|
|
181
|
+
## 사용자 식별
|
|
393
182
|
|
|
394
|
-
네. URL 변경을 자동으로 감지하여 새 페이지의 이슈를 로드합니다. 위젯 UI까지 사용하려면 `useIssueSticker`를 `issue-sticker/react`에서 import해 앱 최상위에서 사용하는 방식을 권장합니다.
|
|
395
183
|
|
|
396
|
-
|
|
184
|
+
| 모드 | 설정 | 이슈 조회 범위 |
|
|
185
|
+
| ----------- | ------------------- | ----------------------------------------------------- |
|
|
186
|
+
| 익명 | `user` 없이 초기화 | 조회 없음 (이번 세션에서 생성한 이슈만 화면에 표시됨) |
|
|
187
|
+
| 사용자 식별 | `user` 전달 | 해당 사용자가 생성한 이슈 |
|
|
188
|
+
| 멤버 | FAB의 "멤버 로그인" | 프로젝트의 모든 이슈 |
|
|
397
189
|
|
|
398
|
-
이 오류는 대부분 **호스트 앱에 React 인스턴스가 2개 이상 로드**될 때 발생합니다.
|
|
399
190
|
|
|
400
|
-
|
|
191
|
+
## 문제 해결
|
|
401
192
|
|
|
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
193
|
|
|
450
|
-
|
|
194
|
+
`Invalid hook call` 또는 `Cannot read properties of null (reading 'useRef')` 오류는 대부분 React 인스턴스가 중복으로 로드될 때 발생합니다.
|
|
451
195
|
|
|
452
|
-
네. `issue-sticker/runtime`으로 코어 런타임 초기화/이벤트 연동은 가능합니다.
|
|
453
|
-
다만 FAB/이슈 폼/마커 같은 위젯 UI 기능은 `issue-sticker/react` 경로(React 환경)에서만 동작합니다.
|
|
454
196
|
|
|
455
|
-
|
|
197
|
+
`npm ls react react-dom`으로 중복 설치 여부를 확인하세요.
|
|
198
|
+
Vite는 `resolve.dedupe: ['react', 'react-dom']`을 설정하고, Webpack·Next.js는 alias로 React 경로를 하나로 맞추면 됩니다.
|
|
456
199
|
|
|
457
|
-
[동작 모드](#동작-모드) 섹션을 참조하세요. `user.id`를 전달하면 사용자 식별 모드로 동작하여 해당 사용자가 생성한 이슈만 조회할 수 있고, `user.name`이 보고자로 기록됩니다.
|
|
458
200
|
|
|
459
|
-
|
|
201
|
+
`Missing "./react" specifier in "issue-sticker" package` 오류는 설치된 패키지가 오래된 경우에 발생합니다.
|
|
202
|
+
`node_modules`와 lockfile을 갱신한 뒤 다시 설치하세요.
|
|
460
203
|
|
|
461
|
-
IssueSticker 클라우드 서버에 안전하게 저장됩니다. API 키에 연결된 프로젝트에 이슈가 귀속됩니다.
|
|
462
204
|
|
|
463
|
-
|
|
205
|
+
그 밖의 문제는 [FAQ](https://issuesticker.com/guide/faq)를 참고하세요.
|
|
464
206
|
|
|
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
207
|
|
|
482
208
|
## 라이선스
|
|
483
209
|
|
|
210
|
+
|
|
484
211
|
Copyright (c) 2026 maana. All rights reserved.
|
|
485
212
|
|
|
486
|
-
|
|
213
|
+
|
|
214
|
+
이 소프트웨어는 maana의 독점 소유물입니다.
|
|
215
|
+
자세한 내용은 [LICENSE](./LICENSE) 파일을 참조하세요.
|