@modootoday/datalab-extension-mcp 1.8.11 → 1.8.12
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/README.en.md +31 -28
- package/README.md +26 -24
- package/dist/{browsers-EMS5V4M4.js → browsers-4L3WAODH.js} +2 -2
- package/dist/{chunk-S6D7YVBB.js → chunk-CQRDBJXM.js} +3 -3
- package/dist/{chunk-Q6SOGGKF.js → chunk-YBNNWQMB.js} +76 -3
- package/dist/{chunk-65FDP6LF.js → chunk-YBQ7ZLSQ.js} +1 -1
- package/dist/cli.js +6 -6
- package/dist/{dist-63JYX33Z.js → dist-R3VRQN24.js} +1 -1
- package/dist/index.js +2 -2
- package/package.json +1 -1
package/README.en.md
CHANGED
|
@@ -24,11 +24,11 @@ Set this up once per computer.
|
|
|
24
24
|
|
|
25
25
|
## Three steps
|
|
26
26
|
|
|
27
|
-
| Step | What
|
|
28
|
-
| ----------------- |
|
|
29
|
-
| **1. Turn it on** | Flip a switch
|
|
30
|
-
| **2. Install** | Run one command and paste the token
|
|
31
|
-
| **3. Verify** | Ask a test question in your AI app
|
|
27
|
+
| Step | What | Where |
|
|
28
|
+
| ----------------- | ------------------------------------------------ | ------------------------ |
|
|
29
|
+
| **1. Turn it on** | Flip a switch and note the host management token | DataLab Tools side panel |
|
|
30
|
+
| **2. Install** | Run one command and paste the token | Terminal |
|
|
31
|
+
| **3. Verify** | Ask a test question in your AI app | Your AI app |
|
|
32
32
|
|
|
33
33
|
Feel free to read [Safety](#safety) first if you'd like reassurance before starting.
|
|
34
34
|
|
|
@@ -42,32 +42,32 @@ Feel free to read [Safety](#safety) first if you'd like reassurance before start
|
|
|
42
42
|
>
|
|
43
43
|
> _(When a connected AI app asks, your Naver data is sent to that app and its AI provider's servers.)_
|
|
44
44
|
|
|
45
|
-
4. When the **"MCP 연결" (MCP connection) card** shows in the panel, you're set. You'll use the **
|
|
45
|
+
4. When the **"MCP 연결" (MCP connection) card** shows in the panel, you're set. You'll use the **MCP host management token** on it in the next step — press **[복사]** (copy) to put it on the clipboard now. ([보기] reveals it if you want to see it.)
|
|
46
46
|
|
|
47
47
|
> "이 코드는 이 컴퓨터 전용 비밀번호예요. 다른 사람에게 보내지 마세요."
|
|
48
48
|
>
|
|
49
49
|
> _(This code is a password for this computer only. Don't send it to anyone.)_
|
|
50
50
|
|
|
51
|
-
Avoid sharing a screenshot or the copied setup.
|
|
51
|
+
Avoid sharing a screenshot or the copied setup. This token belongs only in AI host configuration and workbench management. Browser registration uses separate one-time codes which are never shown again by the panel.
|
|
52
52
|
|
|
53
53
|
## Step 2 — Install
|
|
54
54
|
|
|
55
55
|
One command finds **every** AI app on your computer and connects them automatically. Nothing to do per app.
|
|
56
56
|
|
|
57
57
|
1. **Open a terminal** — on Windows type `cmd` in the search box → "Command Prompt"; on Mac press `⌘+Space` and type `Terminal`; on Linux open your terminal app (often `Ctrl+Alt+T`).
|
|
58
|
-
2. **Paste this command and press Enter.**
|
|
58
|
+
2. **Paste this command and press Enter.** The saved command names an exact bootstrap version. At startup and while idle, the connector checks the canonical release and promotes itself to the current secure, compatible version. Diagnostic environments can opt out with `--no-self-update`.
|
|
59
59
|
|
|
60
60
|
```
|
|
61
|
-
npx -y @modootoday/datalab-extension-mcp@1.8.
|
|
61
|
+
npx -y @modootoday/datalab-extension-mcp@1.8.12 install
|
|
62
62
|
```
|
|
63
63
|
|
|
64
64
|
Lines of English scrolling by is normal. This only downloads and runs the connector — it touches nothing else.
|
|
65
65
|
|
|
66
|
-
3. **Paste the
|
|
66
|
+
3. **Paste the management token.** The helper asks:
|
|
67
67
|
|
|
68
|
-
> "복사한
|
|
68
|
+
> "복사한 관리 토큰을 여기에 붙여넣어 주세요:"
|
|
69
69
|
>
|
|
70
|
-
> _(Paste the
|
|
70
|
+
> _(Paste the management token you copied here:)_
|
|
71
71
|
|
|
72
72
|
Paste the token from the Step 1 card and press Enter.
|
|
73
73
|
|
|
@@ -105,7 +105,7 @@ If the command errors with `'npx' is not recognized`, Node.js isn't installed. T
|
|
|
105
105
|
curl -fsSL https://app.datalab.tools/install/mcp.sh | sh
|
|
106
106
|
```
|
|
107
107
|
|
|
108
|
-
When it asks for the
|
|
108
|
+
When it asks for the management token, paste the one from the Step 1 card. If you have no AI app yet, you can also pick one to install right there (choosing is optional).
|
|
109
109
|
|
|
110
110
|
> Want to see what it does before running it? Open that URL in a browser — it serves the script itself, in plain text.
|
|
111
111
|
|
|
@@ -130,10 +130,10 @@ Apps it **only prints instructions for** (follow the on-screen guide): VS Code,
|
|
|
130
130
|
Installing also places the bundled **writing skills**. An AI app reads the name and description of every installed skill on every start, so the more are installed the less room the conversation has. The default therefore places only the ones that work right away.
|
|
131
131
|
|
|
132
132
|
```
|
|
133
|
-
npx -y @modootoday/datalab-extension-mcp@1.8.
|
|
134
|
-
npx -y @modootoday/datalab-extension-mcp@1.8.
|
|
135
|
-
npx -y @modootoday/datalab-extension-mcp@1.8.
|
|
136
|
-
npx -y @modootoday/datalab-extension-mcp@1.8.
|
|
133
|
+
npx -y @modootoday/datalab-extension-mcp@1.8.12 skills list
|
|
134
|
+
npx -y @modootoday/datalab-extension-mcp@1.8.12 skills status
|
|
135
|
+
npx -y @modootoday/datalab-extension-mcp@1.8.12 skills attach <name>
|
|
136
|
+
npx -y @modootoday/datalab-extension-mcp@1.8.12 skills detach <name>
|
|
137
137
|
```
|
|
138
138
|
|
|
139
139
|
- `list` shows everything in this version, name and description.
|
|
@@ -152,12 +152,13 @@ The **workbench** is this computer, where the connector runs. If you use more th
|
|
|
152
152
|
Make the code from the panel with [등록 코드 만들기], or from the terminal.
|
|
153
153
|
|
|
154
154
|
```
|
|
155
|
-
npx -y @modootoday/datalab-extension-mcp@1.8.
|
|
156
|
-
npx -y @modootoday/datalab-extension-mcp@1.8.
|
|
157
|
-
npx -y @modootoday/datalab-extension-mcp@1.8.
|
|
155
|
+
npx -y @modootoday/datalab-extension-mcp@1.8.12 browsers add "Work Chrome"
|
|
156
|
+
npx -y @modootoday/datalab-extension-mcp@1.8.12 browsers list
|
|
157
|
+
npx -y @modootoday/datalab-extension-mcp@1.8.12 browsers revoke <handle>
|
|
158
|
+
npx -y @modootoday/datalab-extension-mcp@1.8.12 browsers repair
|
|
158
159
|
```
|
|
159
160
|
|
|
160
|
-
`add` **asks you to paste the
|
|
161
|
+
`add` **asks you to paste the management token** — the same value you used to
|
|
161
162
|
install, copied from the panel. It then prints a code **once**. The connector
|
|
162
163
|
keeps only a fingerprint of it, so it cannot show it to you again.
|
|
163
164
|
|
|
@@ -168,6 +169,8 @@ Paste that code into the other browser's side panel, under **이 크롬을 워
|
|
|
168
169
|
`connected`.
|
|
169
170
|
- After `revoke`, that browser cannot rejoin. To let it back in, **revoke and
|
|
170
171
|
then `add` again** — handing the same browser a new code alone is refused.
|
|
172
|
+
- If `list` asks for registry repair, run `repair`, then issue a fresh registration
|
|
173
|
+
code only for the affected browser. Healthy browser rows remain in place.
|
|
171
174
|
- With the connector stopped, these commands do nothing and say so. Opening the
|
|
172
175
|
AI app you paired brings it back.
|
|
173
176
|
|
|
@@ -205,7 +208,7 @@ The connector is running with the code its AI app handed it at startup. **[다
|
|
|
205
208
|
2. Paste it into the AI app's settings
|
|
206
209
|
3. **Fully quit that AI app and start it again** — not just close the window (Windows: tray icon → quit; Mac: `⌘+Q`; Linux: Quit from the app menu)
|
|
207
210
|
|
|
208
|
-
Step 3
|
|
211
|
+
Step 3 brings the connector back with the management token stored in the AI app. Browser registration codes are not changed by this procedure.
|
|
209
212
|
|
|
210
213
|
### "연결 통로(포트)를 다른 프로그램이 쓰고 있어요."
|
|
211
214
|
|
|
@@ -252,7 +255,7 @@ Start it again after a full quit and it picks the tools up. If they still aren't
|
|
|
252
255
|
- **When the connection disappears** — run the very command you used at the start once more; it safely re-registers. (Some AI apps clean up their settings file and drop the connection.)
|
|
253
256
|
|
|
254
257
|
```
|
|
255
|
-
npx -y @modootoday/datalab-extension-mcp@1.8.
|
|
258
|
+
npx -y @modootoday/datalab-extension-mcp@1.8.12 install
|
|
256
259
|
```
|
|
257
260
|
|
|
258
261
|
- **`'npx' is not recognized...`** — Node.js isn't installed. The "No Node.js?" one-liner in Step 2 is the simplest fix.
|
|
@@ -272,9 +275,9 @@ Start it again after a full quit and it picks the tools up. If they still aren't
|
|
|
272
275
|
- **Lookups just work; editing is asked for.** Looking data up is immediate. Changing your **Naver draft** or a photo/video editor needs **AI editing** allowed, in the side panel or in settings, and you pick how long that lasts: allow it for this connection and closing the panel turns it back off, or save **always allow** so you don't switch it on again (turned off in the same place). In the draft, that covers setting the title, inserting text, and undo. Replacing the whole body, inserting a photo, closing an editor window, and deleting anything are **not covered by "always allow"** — that setting does not open them. Anything that costs money is opened by no setting at all and is asked about **every single time**.
|
|
273
276
|
- **It never publishes.** Posting or making a draft public is not connected — edits stay in the draft window, and publishing is yours to do.
|
|
274
277
|
- **The connector stores no logins, passwords, or cookies.** It never contacts Naver directly. Every lookup happens inside your own logged-in browser.
|
|
275
|
-
- **It works only inside your computer.** Nothing outside can connect, and
|
|
278
|
+
- **It works only inside your computer.** Nothing outside can connect, and browser sessions use separate registered credentials plus extension identity checks.
|
|
276
279
|
- **How data moves** — "연결된 AI 앱이 요청하면 네이버 데이터가 해당 앱과 그 AI 제공사 서버로 전달돼요." When the AI app asks, the result goes to that AI provider (e.g. Anthropic) — exactly what you agreed to when turning this on. Retention and training are governed by each provider's policy, so check the privacy policy of the AI app you use.
|
|
277
|
-
- **The
|
|
280
|
+
- **The saved command names an exact bootstrap version.** At startup and while idle, the connector checks the canonical release and promotes itself to the current secure, compatible version. Diagnostic environments can opt out with `--no-self-update`.
|
|
278
281
|
- **The full source is open.** That said, it can't stop malware already running under your own account — this connector's locks control remote and cross-origin access, not an already-compromised host.
|
|
279
282
|
|
|
280
283
|
## Removing it
|
|
@@ -282,7 +285,7 @@ Start it again after a full quit and it picks the tools up. If they still aren't
|
|
|
282
285
|
1. Run this in a terminal (it removes the entries registered in your AI apps).
|
|
283
286
|
|
|
284
287
|
```
|
|
285
|
-
npx -y @modootoday/datalab-extension-mcp@1.8.
|
|
288
|
+
npx -y @modootoday/datalab-extension-mcp@1.8.12 uninstall
|
|
286
289
|
```
|
|
287
290
|
|
|
288
291
|
2. Turn **MCP 연결** off in the extension settings. The panel is the bridge, so with it off a leftover config line can look nothing up.
|
|
@@ -298,7 +301,7 @@ Deleting the extension also renders any leftover connector inert. A leftover lin
|
|
|
298
301
|
- **Does the ChatGPT website work?** No. Only the installed desktop app connects.
|
|
299
302
|
- **Do I keep it always on?** No. It connects only while the panel is open.
|
|
300
303
|
- **What data does it read?** Blog stats, keywords, ads — what DataLab Tools shows. Scoped to the Naver account you're logged into in Chrome.
|
|
301
|
-
- **Other computers?** Yes, but set it up once per computer; the
|
|
304
|
+
- **Other computers?** Yes, but set it up once per computer; the management token is per-computer too.
|
|
302
305
|
</details>
|
|
303
306
|
|
|
304
307
|
## Developer appendix
|
|
@@ -324,7 +327,7 @@ Deleting the extension also renders any leftover connector inert. A leftover lin
|
|
|
324
327
|
|
|
325
328
|
**Architecture** — the connector is a relay with no credentials and no egress. The tool list is served by the extension; the canonical catalog is the store-reviewed extension code. Transport is loopback HTTP+SSE with dual auth (Origin check + token check), and the allowlist — both the read-only half and the tier table that gates every write — is enforced by the extension. Canonical allowlist (with per-item exclusion reasons): <https://github.com/modootoday/datalab-extension-mcp/blob/main/mcp-core/src/allowlist.ts>
|
|
326
329
|
|
|
327
|
-
**Supply chain** — the public repo is the entire source. npm publishing uses OIDC trusted publishing + provenance, with no long-lived token (`npm audit signatures` verifies).
|
|
330
|
+
**Supply chain** — the public repo is the entire source. npm publishing uses OIDC trusted publishing + provenance, with no long-lived token (`npm audit signatures` verifies). Install configuration records an exact bootstrap version, and canonical promotion uses the same attested npm package path.
|
|
328
331
|
|
|
329
332
|
**License** — MIT ([LICENSE](./LICENSE)).
|
|
330
333
|
|
package/README.md
CHANGED
|
@@ -24,7 +24,7 @@ Claude 같은 AI 앱을 데이터랩툴즈에 연결해 주는 작은 무료 프
|
|
|
24
24
|
|
|
25
25
|
| 단계 | 하는 일 | 어디서 |
|
|
26
26
|
| ----------- | ------------------------------------------------ | ------------------------ |
|
|
27
|
-
| **1. 켜기** | 확장 패널에서 스위치를 켜고
|
|
27
|
+
| **1. 켜기** | 확장 패널에서 스위치를 켜고 관리 토큰을 확인해요 | 데이터랩툴즈 사이드 패널 |
|
|
28
28
|
| **2. 설치** | 명령 한 줄을 실행하고 토큰을 붙여넣어요 | 터미널 |
|
|
29
29
|
| **3. 확인** | AI 앱에서 시험 질문을 해 봐요 | AI 앱 |
|
|
30
30
|
|
|
@@ -38,28 +38,28 @@ Claude 같은 AI 앱을 데이터랩툴즈에 연결해 주는 작은 무료 프
|
|
|
38
38
|
|
|
39
39
|
> "연결된 AI 앱이 요청하면 네이버 데이터가 해당 앱과 그 AI 제공사 서버로 전달돼요."
|
|
40
40
|
|
|
41
|
-
4. 패널에 **"MCP 연결" 카드**가 보이면 성공이에요. 다음 단계에서 여기 있는
|
|
41
|
+
4. 패널에 **"MCP 연결" 카드**가 보이면 성공이에요. 다음 단계에서 여기 있는 **MCP 호스트 관리 토큰**을 씁니다. **[복사]** 버튼을 눌러 복사해 두세요(눈으로 확인하고 싶으면 [보기]).
|
|
42
42
|
|
|
43
43
|
> "이 코드는 이 컴퓨터 전용 비밀번호예요. 다른 사람에게 보내지 마세요."
|
|
44
44
|
|
|
45
|
-
캡처 공유·채팅 전송은 피해 주세요.
|
|
45
|
+
캡처 공유·채팅 전송은 피해 주세요. 이 토큰은 AI 앱 설정과 워크벤치 관리에만 사용하며, 브라우저 등록 칸에는 붙여넣지 마세요. 브라우저마다 별도 등록 코드가 발급되고 그 코드는 패널에 다시 표시되지 않습니다.
|
|
46
46
|
|
|
47
47
|
## 2단계 — 설치
|
|
48
48
|
|
|
49
49
|
명령 한 줄이면 컴퓨터에 있는 AI 앱을 **모두 자동으로** 찾아 연결해 줘요. 앱마다 따로 할 일은 없어요.
|
|
50
50
|
|
|
51
51
|
1. **터미널을 열어요** — Windows는 검색창에 `cmd` → "명령 프롬프트", Mac은 `⌘+스페이스`로 `터미널`, Linux는 터미널 앱(보통 `Ctrl+Alt+T`)이에요.
|
|
52
|
-
2. **아래 명령을 붙여넣고 Enter를 눌러요.**
|
|
52
|
+
2. **아래 명령을 붙여넣고 Enter를 눌러요.** 저장되는 명령은 정확한 시작 버전을 적습니다. 커넥터는 시작할 때와 유휴 상태에서 정본 릴리스를 확인해 현재의 안전하고 호환되는 버전으로 승격합니다. 진단 환경에서는 `--no-self-update`로 승격을 끌 수 있어요.
|
|
53
53
|
|
|
54
54
|
```
|
|
55
|
-
npx -y @modootoday/datalab-extension-mcp@1.8.
|
|
55
|
+
npx -y @modootoday/datalab-extension-mcp@1.8.12 install
|
|
56
56
|
```
|
|
57
57
|
|
|
58
58
|
영어 글자가 여러 줄 올라오는 건 정상이에요. 이 명령은 커넥터를 내려받아 실행할 뿐, 다른 건 건드리지 않아요.
|
|
59
59
|
|
|
60
|
-
3.
|
|
60
|
+
3. **관리 토큰을 붙여넣어요.** 도우미가 이렇게 물어봐요.
|
|
61
61
|
|
|
62
|
-
> "복사한
|
|
62
|
+
> "복사한 관리 토큰을 여기에 붙여넣어 주세요:"
|
|
63
63
|
|
|
64
64
|
1단계 카드에서 복사한 토큰을 붙여넣고 Enter를 눌러요.
|
|
65
65
|
|
|
@@ -93,7 +93,7 @@ Claude 같은 AI 앱을 데이터랩툴즈에 연결해 주는 작은 무료 프
|
|
|
93
93
|
curl -fsSL https://app.datalab.tools/install/mcp.sh | sh
|
|
94
94
|
```
|
|
95
95
|
|
|
96
|
-
중간에
|
|
96
|
+
중간에 관리 토큰을 물어보면 1단계 카드에서 복사한 토큰을 붙여넣어요. 아직 AI 앱이 하나도 없으면, 원하는 AI 프로그램을 그 자리에서 골라 설치할 수도 있어요(고르는 건 자유예요).
|
|
97
97
|
|
|
98
98
|
> 실행 전에 내용을 확인하고 싶으면 위 주소를 브라우저에 그대로 열어 보세요 — 받아서 실행할 스크립트 원문이 그대로 보여요.
|
|
99
99
|
|
|
@@ -118,10 +118,10 @@ Claude 같은 AI 앱을 데이터랩툴즈에 연결해 주는 작은 무료 프
|
|
|
118
118
|
설치할 때 **글쓰기 도움말(스킬)** 도 함께 놓입니다. AI 앱은 켜질 때마다 설치된 도움말의 이름과 설명을 전부 읽기 때문에, 많이 깔수록 대화에 쓸 자리가 줄어들어요. 그래서 기본은 **바로 쓸 수 있는 것만** 놓습니다.
|
|
119
119
|
|
|
120
120
|
```
|
|
121
|
-
npx -y @modootoday/datalab-extension-mcp@1.8.
|
|
122
|
-
npx -y @modootoday/datalab-extension-mcp@1.8.
|
|
123
|
-
npx -y @modootoday/datalab-extension-mcp@1.8.
|
|
124
|
-
npx -y @modootoday/datalab-extension-mcp@1.8.
|
|
121
|
+
npx -y @modootoday/datalab-extension-mcp@1.8.12 skills list
|
|
122
|
+
npx -y @modootoday/datalab-extension-mcp@1.8.12 skills status
|
|
123
|
+
npx -y @modootoday/datalab-extension-mcp@1.8.12 skills attach <이름>
|
|
124
|
+
npx -y @modootoday/datalab-extension-mcp@1.8.12 skills detach <이름>
|
|
125
125
|
```
|
|
126
126
|
|
|
127
127
|
- `list` 는 이 버전에 들어 있는 전부를 이름과 설명으로 보여 줘요.
|
|
@@ -140,17 +140,19 @@ npx -y @modootoday/datalab-extension-mcp@1.8.11 skills detach <이름>
|
|
|
140
140
|
패널에서 [등록 코드 만들기]를 눌러도 되고, 터미널을 쓰셔도 돼요.
|
|
141
141
|
|
|
142
142
|
```
|
|
143
|
-
npx -y @modootoday/datalab-extension-mcp@1.8.
|
|
144
|
-
npx -y @modootoday/datalab-extension-mcp@1.8.
|
|
145
|
-
npx -y @modootoday/datalab-extension-mcp@1.8.
|
|
143
|
+
npx -y @modootoday/datalab-extension-mcp@1.8.12 browsers add "회사 크롬"
|
|
144
|
+
npx -y @modootoday/datalab-extension-mcp@1.8.12 browsers list
|
|
145
|
+
npx -y @modootoday/datalab-extension-mcp@1.8.12 browsers revoke <handle>
|
|
146
|
+
npx -y @modootoday/datalab-extension-mcp@1.8.12 browsers repair
|
|
146
147
|
```
|
|
147
148
|
|
|
148
|
-
`add` 를 실행하면
|
|
149
|
+
`add` 를 실행하면 **관리 토큰을 붙여넣으라고 물어봐요** — 설치할 때와 같은 값이고, 패널의 `복사` 버튼으로 얻습니다. 그러면 브라우저 등록 코드가 **한 번만** 출력돼요. 커넥터는 그 코드를 저장하지 않고 지문만 남기므로 다시 보여 줄 수 없어요.
|
|
149
150
|
|
|
150
151
|
만든 코드는 올릴 크롬의 사이드 패널 → **이 크롬을 워크벤치에 올리기** 에 붙여넣습니다. 그 브라우저는 자기 코드를 따로 만들지 않아요.
|
|
151
152
|
|
|
152
153
|
- `list` 는 `waiting`(코드는 만들었지만 아직 아무도 안 붙음)과 `connected` 를 구분해서 보여 줘요.
|
|
153
154
|
- `revoke` 뒤에는 그 브라우저가 다시 붙지 못해요. 다시 넣으려면 **`revoke` 한 뒤 새로 `add`** 하세요 — 같은 브라우저에 코드만 새로 줘도 거절돼요.
|
|
155
|
+
- `list` 가 등록부 복구를 안내하면 `repair`를 실행한 뒤, 영향받은 브라우저에 등록 코드를 새로 발급해 붙여넣으세요. 정상 등록은 유지됩니다.
|
|
154
156
|
- 커넥터가 꺼져 있으면 이 명령은 아무것도 하지 않고 그렇게 말해요. 연결해 둔 AI 앱을 켜면 커넥터가 함께 살아납니다.
|
|
155
157
|
|
|
156
158
|
## 문제해결
|
|
@@ -179,7 +181,7 @@ AI 앱이 켜질 때 받은 옛 코드로 커넥터가 돌고 있어서 그래
|
|
|
179
181
|
2. 그 내용을 AI 앱 설정에 붙여넣은 뒤
|
|
180
182
|
3. **그 AI 앱을 완전히 종료했다가 다시 켜요** (창 닫기 말고 — Windows 트레이 종료 / Mac `⌘+Q` / Linux 앱 메뉴 Quit)
|
|
181
183
|
|
|
182
|
-
3번까지 해야 커넥터가
|
|
184
|
+
3번까지 해야 커넥터가 AI 앱 설정에 저장된 관리 토큰으로 다시 떠요. 브라우저 등록 코드는 이 과정에서 바꾸지 않습니다.
|
|
183
185
|
|
|
184
186
|
### "연결 통로(포트)를 다른 프로그램이 쓰고 있어요."
|
|
185
187
|
|
|
@@ -220,7 +222,7 @@ AI가 "그런 기능은 없다" 고 답하면, **"도구 목록을 확인해 보
|
|
|
220
222
|
- **연결이 사라졌을 때** — 처음 실행했던 그 명령을 한 번 더 실행하면 안전하게 다시 등록돼요. (일부 AI 앱이 설정 파일을 정리하며 연결을 지우기도 해요.)
|
|
221
223
|
|
|
222
224
|
```
|
|
223
|
-
npx -y @modootoday/datalab-extension-mcp@1.8.
|
|
225
|
+
npx -y @modootoday/datalab-extension-mcp@1.8.12 install
|
|
224
226
|
```
|
|
225
227
|
|
|
226
228
|
- **`'npx'을(는) 내부 또는 외부 명령...`** — Node.js가 없는 거예요. 위 2단계의 "Node.js가 없다면" 한 줄 설치가 가장 간단해요.
|
|
@@ -240,9 +242,9 @@ AI가 "그런 기능은 없다" 고 답하면, **"도구 목록을 확인해 보
|
|
|
240
242
|
- **조회는 그냥 되고, 고치는 건 허락받아요.** 데이터 조회는 바로 돼요. **네이버 글쓰기 창**과 사진·영상 편집기의 내용을 고치려면 사이드패널이나 설정에서 **AI 편집 허용**을 켜야 해요. 두 가지 중에 고르면 됩니다 — 이번 연결에만 켜면 패널을 닫을 때 다시 꺼지고, **항상 허용**으로 저장하면 매번 켜지 않아도 돼요(끄는 것도 같은 자리에서 합니다). 글쓰기 창에서는 제목·본문 넣기와 되돌리기가 열려요. 본문을 통째로 바꾸거나 사진을 넣는 것, 편집기 창을 닫는 것, 지우기는 **항상 허용에 포함되지 않아요** — 그 설정으로는 열리지 않습니다. 요금이 드는 기능은 어떤 설정으로도 열리지 않고, 실행 전에 **매번** 물어봐요.
|
|
241
243
|
- **발행은 하지 않아요.** 글을 올리거나 공개하는 기능은 연결되지 않습니다 — 고친 내용은 글쓰기 창에 남고, 올릴지는 사용자가 직접 정해요.
|
|
242
244
|
- **아이디·비밀번호·쿠키를 저장하지 않아요.** 네이버에 직접 접속하지도 않아요. 모든 조회는 내가 로그인해 둔 내 브라우저 안에서 일어나요.
|
|
243
|
-
- **내 컴퓨터 안에서만 동작해요.** 밖에서는 접속할 수 없고,
|
|
245
|
+
- **내 컴퓨터 안에서만 동작해요.** 밖에서는 접속할 수 없고, 관리 토큰과 확장 확인이라는 이중 잠금이 걸려 있어요.
|
|
244
246
|
- **데이터가 나가는 방식** — "연결된 AI 앱이 요청하면 네이버 데이터가 해당 앱과 그 AI 제공사 서버로 전달돼요." 이게 AI가 답하는 방식이라 처음 켤 때 미리 동의를 받아요. 전달된 데이터를 얼마나 보관·학습하는지는 각 AI 제공사 정책을 따르니, 쓰시는 AI 앱의 개인정보 정책을 확인해 주세요.
|
|
245
|
-
-
|
|
247
|
+
- **설정에는 정확한 버전이 기록되고, 실행 시 안전한 최신 버전을 확인해요.** 커넥터는 시작할 때와 유휴 상태에서 정본 버전을 확인해 최신 보안·호환 버전으로 승격합니다. 특정 버전을 유지해야 하는 진단 환경은 `--no-self-update`를 사용할 수 있어요.
|
|
246
248
|
- **소스가 전부 공개된 오픈소스예요.** 다만 이미 같은 권한으로 실행 중인 악성코드까지 막아 주지는 못해요 — 이 커넥터의 잠금은 원격·타 출처 접근을 막는 장치예요.
|
|
247
249
|
|
|
248
250
|
## 해지
|
|
@@ -250,7 +252,7 @@ AI가 "그런 기능은 없다" 고 답하면, **"도구 목록을 확인해 보
|
|
|
250
252
|
1. 터미널에서 아래 명령을 실행해요(AI 앱에 등록된 설정을 지워 줘요).
|
|
251
253
|
|
|
252
254
|
```
|
|
253
|
-
npx -y @modootoday/datalab-extension-mcp@1.8.
|
|
255
|
+
npx -y @modootoday/datalab-extension-mcp@1.8.12 uninstall
|
|
254
256
|
```
|
|
255
257
|
|
|
256
258
|
2. 확장 설정에서 **MCP 연결을 꺼요.** 패널이 브릿지라, 꺼 두면 어딘가 설정 줄이 남아 있어도 AI 앱이 아무것도 조회할 수 없어요.
|
|
@@ -266,7 +268,7 @@ AI가 "그런 기능은 없다" 고 답하면, **"도구 목록을 확인해 보
|
|
|
266
268
|
- **ChatGPT 웹사이트에서도 되나요?** 아니요. 컴퓨터에 설치한 데스크톱 앱만 연결돼요.
|
|
267
269
|
- **항상 켜 둬야 하나요?** 아니요. 패널이 열려 있을 때만 연결돼요.
|
|
268
270
|
- **어떤 데이터를 읽나요?** 블로그 통계·키워드·광고 등 데이터랩툴즈가 보여 주는 것들이에요. 기준은 지금 Chrome에 로그인해 둔 네이버 계정이에요.
|
|
269
|
-
- **다른 컴퓨터에서도 되나요?** 네. 컴퓨터마다 한 번씩 설치하고,
|
|
271
|
+
- **다른 컴퓨터에서도 되나요?** 네. 컴퓨터마다 한 번씩 설치하고, 관리 토큰도 컴퓨터마다 따로예요.
|
|
270
272
|
</details>
|
|
271
273
|
|
|
272
274
|
## 개발자 부록
|
|
@@ -290,9 +292,9 @@ AI가 "그런 기능은 없다" 고 답하면, **"도구 목록을 확인해 보
|
|
|
290
292
|
|
|
291
293
|
**실패 응답** — 도구 호출 실패는 프로토콜 오류가 아니라 `isError` 결과로 오고, 본문은 성공과 같은 JSON입니다(`ok` / `reason` / `message` / `retryable`, 기다리면 풀리는 경우 `retryAfterMs`). 실패 코드 전체 목록과 각각의 재시도 여부 정본: <https://github.com/modootoday/datalab-extension-mcp/blob/main/mcp-core/src/errors.ts>
|
|
292
294
|
|
|
293
|
-
**아키텍처** — 커넥터는 자격증명도 egress도 없는 릴레이입니다. 도구 목록은 확장이 서빙하며 카탈로그 정본은 스토어 심사를 받는 확장 코드입니다. 전송은 루프백 HTTP+SSE이며 Origin 검증과
|
|
295
|
+
**아키텍처** — 커넥터는 자격증명도 egress도 없는 릴레이입니다. 도구 목록은 확장이 서빙하며 카탈로그 정본은 스토어 심사를 받는 확장 코드입니다. 전송은 루프백 HTTP+SSE이며 Origin 검증과 브라우저별 세션 검증을 거치고, 도구 등급 표(조회 / 편집 / 파괴적 / 유료 / 미개방)는 확장 쪽에서 집행됩니다 — 목록에 없는 이름은 거부되고, 파괴적·유료는 세션 허용으로 건너뛸 수 없습니다. allowlist 전문(제외 사유 포함)의 정본: <https://github.com/modootoday/datalab-extension-mcp/blob/main/mcp-core/src/allowlist.ts>
|
|
294
296
|
|
|
295
|
-
**공급망** — 공개 저장소가 전체 소스입니다. npm 발행은 OIDC trusted publishing + provenance로 이루어지고 장기 발행 토큰은 쓰지 않습니다(`npm audit signatures`로 검증 가능).
|
|
297
|
+
**공급망** — 공개 저장소가 전체 소스입니다. npm 발행은 OIDC trusted publishing + provenance로 이루어지고 장기 발행 토큰은 쓰지 않습니다(`npm audit signatures`로 검증 가능). 설치 설정은 정확한 bootstrap 버전을 기록하고, 커넥터는 정본 릴리스로 승격할 때도 같은 검증된 npm 패키지 경로를 사용합니다.
|
|
296
298
|
|
|
297
299
|
**라이선스** — MIT ([LICENSE](./LICENSE)).
|
|
298
300
|
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import {
|
|
2
2
|
DEFAULT_HOST,
|
|
3
3
|
DEFAULT_PORT
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-YBNNWQMB.js";
|
|
5
5
|
import {
|
|
6
6
|
TOKEN_PROMPT_GUIDE,
|
|
7
7
|
TOKEN_PROMPT_QUESTION,
|
|
8
8
|
TOKEN_REQUIRED_NON_INTERACTIVE
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-CQRDBJXM.js";
|
|
10
10
|
import "./chunk-MLKGABMK.js";
|
|
11
11
|
|
|
12
12
|
// src/browsers.ts
|
|
@@ -1115,10 +1115,10 @@ var NO_HOSTS_DETECTED = "\uC5F0\uACB0\uD560 \uC218 \uC788\uB294 AI \uD504\uB85C\
|
|
|
1115
1115
|
var SUPPORTED_APPS_HEADER = "\uC9C0\uC6D0\uD558\uB294 \uD504\uB85C\uADF8\uB7A8\uACFC \uB2E4\uC6B4\uB85C\uB4DC \uC8FC\uC18C\uC608\uC694:";
|
|
1116
1116
|
var AFTER_INSTALL_RETRY = "\uD504\uB85C\uADF8\uB7A8\uC744 \uC124\uCE58\uD55C \uB4A4 \uAC19\uC740 \uBA85\uB839\uC5B4\uB97C \uB2E4\uC2DC \uC2E4\uD589\uD574 \uC8FC\uC138\uC694.";
|
|
1117
1117
|
var ALREADY_INSTALLED_HINT = "\uC774\uBBF8 \uC124\uCE58\uD588\uB294\uB370 \uBAA9\uB85D\uC5D0 \uC5C6\uB2E4\uBA74, \uC124\uC815 \uD30C\uC77C\uC774 \uC544\uC9C1 \uB9CC\uB4E4\uC5B4\uC9C0\uC9C0 \uC54A\uC558\uC744 \uC218 \uC788\uC5B4\uC694. \uC124\uC815 \uD30C\uC77C\uC740 \uD504\uB85C\uADF8\uB7A8\uC744 \uC124\uCE58\uD560 \uB54C\uAC00 \uC544\uB2C8\uB77C \uCC98\uC74C \uC4F8 \uB54C \uB9CC\uB4E4\uC5B4\uC838\uC694:\n - ChatGPT \uB370\uC2A4\uD06C\uD1B1: \uC124\uC815 \u2192 MCP \uC11C\uBC84 \u2192 \uC11C\uBC84 \uCD94\uAC00\uB97C \uD55C \uBC88 \uC2E4\uD589\n - VS Code: \uBA85\uB839 \uD314\uB808\uD2B8(Ctrl+Shift+P) \u2192 'MCP: Open User Configuration' \uC2E4\uD589\n\uADF8 \uB4A4 \uAC19\uC740 \uBA85\uB839\uC5B4\uB97C \uB2E4\uC2DC \uC2E4\uD589\uD558\uBA74 \uCC3E\uC744 \uC218 \uC788\uC5B4\uC694.";
|
|
1118
|
-
var TOKEN_PROMPT_GUIDE = "\uD06C\uB86C\uC5D0\uC11C \uB370\uC774\uD130\uB7A9\uD234\uC988 \uC0AC\uC774\uB4DC \uD328\uB110\uC744 \uC5F4\uACE0 'MCP \uC5F0\uACB0' \
|
|
1119
|
-
var TOKEN_PROMPT_QUESTION = "\uBCF5\uC0AC\uD55C \
|
|
1118
|
+
var TOKEN_PROMPT_GUIDE = "\uD06C\uB86C\uC5D0\uC11C \uB370\uC774\uD130\uB7A9\uD234\uC988 \uC0AC\uC774\uB4DC \uD328\uB110\uC744 \uC5F4\uACE0 'MCP \uC5F0\uACB0'\uC758 MCP \uD638\uC2A4\uD2B8 \uAD00\uB9AC \uD1A0\uD070\uC744 \uBCF5\uC0AC\uD574 \uC8FC\uC138\uC694.";
|
|
1119
|
+
var TOKEN_PROMPT_QUESTION = "\uBCF5\uC0AC\uD55C \uAD00\uB9AC \uD1A0\uD070\uC744 \uC5EC\uAE30\uC5D0 \uBD99\uC5EC\uB123\uC5B4 \uC8FC\uC138\uC694:";
|
|
1120
1120
|
var TOKEN_PROMPT_RETRY = "\uD1A0\uD070 \uD615\uC2DD\uC774 \uC62C\uBC14\uB974\uC9C0 \uC54A\uC544\uC694. \uCE74\uB4DC\uC758 \uD1A0\uD070\uC744 \uB2E4\uC2DC \uBCF5\uC0AC\uD574\uC11C \uBD99\uC5EC\uB123\uC5B4 \uC8FC\uC138\uC694.";
|
|
1121
|
-
var TOKEN_REQUIRED_NON_INTERACTIVE = "\
|
|
1121
|
+
var TOKEN_REQUIRED_NON_INTERACTIVE = "\uAD00\uB9AC \uD1A0\uD070\uC774 \uD544\uC694\uD574\uC694. \uD06C\uB86C\uC5D0\uC11C \uB370\uC774\uD130\uB7A9\uD234\uC988 \uC0AC\uC774\uB4DC \uD328\uB110\uC744 \uC5F4\uACE0 'MCP \uC5F0\uACB0'\uC758 [\uC124\uCE58 \uBA85\uB839 \uBCF5\uC0AC] \uBC84\uD2BC\uC744 \uB20C\uB7EC, \uBCF5\uC0AC\uB41C \uBA85\uB839\uC744 \uADF8\uB300\uB85C \uBD99\uC5EC\uB123\uC5B4 \uC2E4\uD589\uD574 \uC8FC\uC138\uC694.";
|
|
1122
1122
|
var CLI_OFFER_INTRO = "\uC6D0\uD558\uC2DC\uBA74 \uC544\uB798 AI \uD504\uB85C\uADF8\uB7A8 \uC911 \uD558\uB098\uB97C \uC9C0\uAE08 \uBC14\uB85C \uC124\uCE58\uD560 \uC218 \uC788\uC5B4\uC694. Node.js \uAE30\uBC18\uC774\uB77C \uC774 \uC790\uB9AC\uC5D0\uC11C \uC124\uCE58\uB3FC\uC694 \u2014 \uC548 \uD558\uC154\uB3C4 \uAD1C\uCC2E\uC544\uC694.";
|
|
1123
1123
|
var CLI_OFFER_SKIP_LABEL = "0. \uC9C0\uAE08\uC740 \uC124\uCE58\uD558\uC9C0 \uC54A\uAE30";
|
|
1124
1124
|
var CLI_OFFER_QUESTION = "\uC124\uCE58\uD560 \uD504\uB85C\uADF8\uB7A8\uC758 \uBC88\uD638\uB97C \uC785\uB825\uD574 \uC8FC\uC138\uC694";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
// ../mcp-server/dist/chunk-
|
|
1
|
+
// ../mcp-server/dist/chunk-XKX4SOFG.js
|
|
2
2
|
import { createHash } from "crypto";
|
|
3
3
|
import { createHash as createHash2, randomUUID } from "crypto";
|
|
4
4
|
import { mkdir, readFile, readdir, rm, writeFile } from "fs/promises";
|
|
@@ -16838,7 +16838,15 @@ async function handleMcpRequest(bridge, body, accept, stage) {
|
|
|
16838
16838
|
}
|
|
16839
16839
|
if (params.name === BROWSERS_TOOL) {
|
|
16840
16840
|
const registryStatus = bridge.browserRegistryStatus();
|
|
16841
|
-
const { state: registryState
|
|
16841
|
+
const { state: registryState } = registryStatus;
|
|
16842
|
+
const registryDetail = registryStatus.state === "degraded" ? {
|
|
16843
|
+
error: registryStatus.error,
|
|
16844
|
+
quarantinedHandles: registryStatus.quarantinedHandles,
|
|
16845
|
+
recovery: registryStatus.recovery
|
|
16846
|
+
} : registryStatus.state === "disabled" ? {
|
|
16847
|
+
error: registryStatus.error,
|
|
16848
|
+
detail: registryStatus.detail
|
|
16849
|
+
} : {};
|
|
16842
16850
|
const payload = {
|
|
16843
16851
|
browsers: bridge.connectedBrowsers(),
|
|
16844
16852
|
registryStatus: registryState,
|
|
@@ -17284,6 +17292,7 @@ function createHttpBridge(opts) {
|
|
|
17284
17292
|
json2(res, 404, { error: "not found" });
|
|
17285
17293
|
return;
|
|
17286
17294
|
}
|
|
17295
|
+
res.setHeader("cache-control", "no-store");
|
|
17287
17296
|
void readJson(req, MAX_BODY_BYTES).then(async (body) => {
|
|
17288
17297
|
const b = body;
|
|
17289
17298
|
if (!opts.bridge.verifyRootToken(
|
|
@@ -17325,6 +17334,20 @@ function createHttpBridge(opts) {
|
|
|
17325
17334
|
json2(res, 200, { ok: true, ...await registry2.repair() });
|
|
17326
17335
|
return;
|
|
17327
17336
|
}
|
|
17337
|
+
if (action === "repair_registration") {
|
|
17338
|
+
const browserId = typeof b?.["browserId"] === "string" ? b["browserId"] : "";
|
|
17339
|
+
const label = typeof b?.["label"] === "string" ? b["label"] : void 0;
|
|
17340
|
+
const repaired = await registry2.repairRegistration(
|
|
17341
|
+
browserId,
|
|
17342
|
+
label
|
|
17343
|
+
);
|
|
17344
|
+
json2(res, 200, {
|
|
17345
|
+
ok: true,
|
|
17346
|
+
...repaired,
|
|
17347
|
+
registryStatus: registry2.status()
|
|
17348
|
+
});
|
|
17349
|
+
return;
|
|
17350
|
+
}
|
|
17328
17351
|
json2(res, 400, { error: "unknown action" });
|
|
17329
17352
|
}).catch((err) => {
|
|
17330
17353
|
const why = err instanceof Error ? err.message : String(err);
|
|
@@ -18011,6 +18034,48 @@ function createBrowserRegistry(opts) {
|
|
|
18011
18034
|
};
|
|
18012
18035
|
});
|
|
18013
18036
|
},
|
|
18037
|
+
async repairRegistration(browserId, requestedLabel) {
|
|
18038
|
+
if (browserId.length === 0) throw new Error("browser id is required");
|
|
18039
|
+
const token = mintToken();
|
|
18040
|
+
const tokenHash = digestToken(token);
|
|
18041
|
+
return transact((snapshot) => {
|
|
18042
|
+
const currentView = view(snapshot);
|
|
18043
|
+
if (currentView.rows.some((row) => row.browserId === browserId)) {
|
|
18044
|
+
throw new Error("registration_already_valid");
|
|
18045
|
+
}
|
|
18046
|
+
const quarantined = currentView.quarantined.filter(
|
|
18047
|
+
(row) => row.browserId === browserId
|
|
18048
|
+
);
|
|
18049
|
+
const label = requestedLabel?.trim() || quarantined[0]?.label || "\uC774 \uBE0C\uB77C\uC6B0\uC800";
|
|
18050
|
+
const removedHashes = new Set(quarantined.map((row) => row.tokenHash));
|
|
18051
|
+
const next = {
|
|
18052
|
+
browserId: null,
|
|
18053
|
+
tokenHash,
|
|
18054
|
+
label,
|
|
18055
|
+
createdAt: now().toISOString()
|
|
18056
|
+
};
|
|
18057
|
+
return {
|
|
18058
|
+
next: [
|
|
18059
|
+
...snapshot.filter((row) => !removedHashes.has(row.tokenHash)),
|
|
18060
|
+
next
|
|
18061
|
+
],
|
|
18062
|
+
result: {
|
|
18063
|
+
outcome: quarantined.length > 0 ? "repaired" : "created",
|
|
18064
|
+
removed: quarantined.map(handleOf),
|
|
18065
|
+
registration: { handle: handleOf(next), label, token }
|
|
18066
|
+
},
|
|
18067
|
+
commit: () => {
|
|
18068
|
+
for (const row of quarantined) {
|
|
18069
|
+
revoked.add(row.tokenHash);
|
|
18070
|
+
if (row.browserId !== null && opts.claimed.get(row.browserId) === row.tokenHash) {
|
|
18071
|
+
opts.claimed.delete(row.browserId);
|
|
18072
|
+
opts.onRevoke?.(row.browserId);
|
|
18073
|
+
}
|
|
18074
|
+
}
|
|
18075
|
+
}
|
|
18076
|
+
};
|
|
18077
|
+
});
|
|
18078
|
+
},
|
|
18014
18079
|
status() {
|
|
18015
18080
|
if (unreadable !== null) {
|
|
18016
18081
|
return {
|
|
@@ -18026,7 +18091,15 @@ function createBrowserRegistry(opts) {
|
|
|
18026
18091
|
quarantinedHandles: rows.filter(
|
|
18027
18092
|
(row) => timingSafeEqual(row.tokenHash, opts.forbiddenTokenHash)
|
|
18028
18093
|
).map(handleOf),
|
|
18029
|
-
|
|
18094
|
+
quarantined: rows.filter(
|
|
18095
|
+
(row) => timingSafeEqual(row.tokenHash, opts.forbiddenTokenHash)
|
|
18096
|
+
).map((row) => ({
|
|
18097
|
+
handle: handleOf(row),
|
|
18098
|
+
label: row.label,
|
|
18099
|
+
browserId: row.browserId,
|
|
18100
|
+
createdAt: row.createdAt
|
|
18101
|
+
})),
|
|
18102
|
+
recovery: "repair_registration"
|
|
18030
18103
|
};
|
|
18031
18104
|
}
|
|
18032
18105
|
return { state: "ready" };
|
package/dist/cli.js
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
import {
|
|
3
3
|
dispatchCli,
|
|
4
4
|
runAdapter
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-YBQ7ZLSQ.js";
|
|
6
6
|
import {
|
|
7
7
|
runDaemon
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-YBNNWQMB.js";
|
|
9
9
|
import "./chunk-MLKGABMK.js";
|
|
10
10
|
|
|
11
11
|
// src/cli.ts
|
|
@@ -17,7 +17,7 @@ function log(message) {
|
|
|
17
17
|
`);
|
|
18
18
|
}
|
|
19
19
|
async function runInstaller(sub, argv) {
|
|
20
|
-
const { createNodeIo, runInstall, runUninstall } = await import("./dist-
|
|
20
|
+
const { createNodeIo, runInstall, runUninstall } = await import("./dist-R3VRQN24.js");
|
|
21
21
|
const opts = { version: VERSION };
|
|
22
22
|
for (let i = 0; i < argv.length; i += 1) {
|
|
23
23
|
const flag = argv[i];
|
|
@@ -62,8 +62,8 @@ async function main() {
|
|
|
62
62
|
// Loaded lazily, like the installer: the adapter path is what an MCP host
|
|
63
63
|
// spawns and must not pay for a command only an operator types.
|
|
64
64
|
browsers: async (argv) => {
|
|
65
|
-
const { runBrowsers } = await import("./browsers-
|
|
66
|
-
const { createNodeIo } = await import("./dist-
|
|
65
|
+
const { runBrowsers } = await import("./browsers-4L3WAODH.js");
|
|
66
|
+
const { createNodeIo } = await import("./dist-R3VRQN24.js");
|
|
67
67
|
const io = createNodeIo();
|
|
68
68
|
const code = await runBrowsers(argv, {
|
|
69
69
|
env: process.env,
|
|
@@ -88,7 +88,7 @@ async function main() {
|
|
|
88
88
|
attachSkill,
|
|
89
89
|
detachSkill,
|
|
90
90
|
skillsPayloadRoot
|
|
91
|
-
} = await import("./dist-
|
|
91
|
+
} = await import("./dist-R3VRQN24.js");
|
|
92
92
|
const io = createNodeIo();
|
|
93
93
|
const root = skillsPayloadRoot();
|
|
94
94
|
const code = await runSkills(argv, {
|
package/dist/index.js
CHANGED