mcp-baepsae 5.0.0 → 6.1.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/README-KR.md +80 -34
- package/README.md +82 -36
- package/bundled/baepsae-native +0 -0
- package/dist/backend.d.ts +26 -0
- package/dist/backend.d.ts.map +1 -0
- package/dist/backend.js +79 -0
- package/dist/backend.js.map +1 -0
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/tool-manifest.d.ts +12 -0
- package/dist/tool-manifest.d.ts.map +1 -0
- package/dist/tool-manifest.js +79 -0
- package/dist/tool-manifest.js.map +1 -0
- package/dist/tools/info.d.ts.map +1 -1
- package/dist/tools/info.js +104 -5
- package/dist/tools/info.js.map +1 -1
- package/dist/tools/input.js +7 -6
- package/dist/tools/input.js.map +1 -1
- package/dist/tools/media.d.ts.map +1 -1
- package/dist/tools/media.js +37 -10
- package/dist/tools/media.js.map +1 -1
- package/dist/tools/simulator.js +7 -7
- package/dist/tools/simulator.js.map +1 -1
- package/dist/tools/system.d.ts.map +1 -1
- package/dist/tools/system.js +2 -2
- package/dist/tools/system.js.map +1 -1
- package/dist/tools/ui.d.ts.map +1 -1
- package/dist/tools/ui.js +126 -8
- package/dist/tools/ui.js.map +1 -1
- package/dist/tools/workflow.d.ts +3 -0
- package/dist/tools/workflow.d.ts.map +1 -0
- package/dist/tools/workflow.js +434 -0
- package/dist/tools/workflow.js.map +1 -0
- package/dist/types.d.ts +15 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +19 -3
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +117 -5
- package/dist/utils.js.map +1 -1
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/native/Sources/Commands/InputCommands.swift +52 -33
- package/native/Sources/Commands/SystemCommands.swift +86 -0
- package/native/Sources/Commands/UICommands.swift +226 -19
- package/native/Sources/Commands/WindowCommands.swift +10 -3
- package/native/Sources/IndigoHID/IndigoHIDClient.swift +222 -0
- package/native/Sources/IndigoHID/IndigoHIDCoordinates.swift +74 -0
- package/native/Sources/IndigoHID/IndigoHIDEvents.swift +63 -0
- package/native/Sources/IndigoHID/IndigoHIDLoader.swift +102 -0
- package/native/Sources/IndigoHID/IndigoHIDTypes.swift +41 -0
- package/native/Sources/Types.swift +26 -0
- package/native/Sources/Utils.swift +396 -4
- package/native/Sources/Version.swift +1 -1
- package/native/Sources/main.swift +55 -8
- package/native/Tests/BaepsaeNativeTests/BinaryInvocationTests.swift +54 -6
- package/package.json +10 -4
- package/scripts/bundle-native.sh +35 -0
- package/scripts/generate-tool-manifest.mjs +75 -0
package/README-KR.md
CHANGED
|
@@ -53,13 +53,36 @@ Swift 네이티브 브리지(`baepsae-native`)는 iOS 시뮬레이터 및 macOS
|
|
|
53
53
|
|
|
54
54
|
## 권한
|
|
55
55
|
|
|
56
|
-
**접근성(Accessibility) 권한이 필요합니다.** UI 조회/입력 자동화 도구(
|
|
56
|
+
**접근성(Accessibility) 권한이 필요합니다.** UI 조회/입력 자동화 도구(예: `analyze_ui`, `tap`, `right_click`)를 사용할 때 필수입니다.
|
|
57
|
+
|
|
58
|
+
중요한 점은, 보통 권한 대상이 **자동화 대상 앱**이 아니라 **automation host / runtime process** 쪽이라는 것입니다.
|
|
59
|
+
|
|
60
|
+
### 보통 어떤 프로세스에 권한이 필요한가?
|
|
61
|
+
|
|
62
|
+
- **네이티브 바이너리를 직접 실행하는 경우**
|
|
63
|
+
- 예: `baepsae-native ...`
|
|
64
|
+
- 보통 `baepsae-native` 바이너리 자체와, 이를 실행한 터미널/셸 앱이 관련됩니다
|
|
65
|
+
- **Node / npx 런타임으로 실행하는 경우**
|
|
66
|
+
- 예: `node dist/index.js`, `npx -y mcp-baepsae@latest`
|
|
67
|
+
- 보통 런타임 프로세스(`node`)와, 이를 실행한 터미널 또는 MCP client 앱이 관련됩니다
|
|
68
|
+
- **Desktop / CLI MCP client를 통해 실행하는 경우**
|
|
69
|
+
- 예: Claude Code, Codex CLI/Desktop, Gemini CLI
|
|
70
|
+
- launch path 에 따라 MCP client 앱, 터미널 host, runtime process 중 여러 항목이 관련될 수 있습니다
|
|
71
|
+
|
|
72
|
+
### 권장 설정 순서
|
|
57
73
|
|
|
58
74
|
1. **시스템 설정** > **개인정보 보호 및 보안** > **손쉬운 사용(Accessibility)** 로 이동합니다.
|
|
59
|
-
2.
|
|
60
|
-
3. 목록에
|
|
75
|
+
2. 실제로 사용하는 터미널 또는 MCP client 앱을 허용합니다.
|
|
76
|
+
3. 목록에 보이면 런타임 프로세스(`node`, `bun` 등)도 허용합니다.
|
|
77
|
+
4. 네이티브 바이너리를 직접 실행하는 경우 `baepsae-native` 항목도 별도로 확인합니다.
|
|
78
|
+
5. 목록에 없으면 `+` 버튼으로 수동 추가합니다.
|
|
79
|
+
|
|
80
|
+
### 중요
|
|
81
|
+
|
|
82
|
+
권한을 켠 뒤에도 macOS가 즉시 반영하지 않는 경우가 있습니다.
|
|
83
|
+
오류가 계속되면 `mcp-baepsae` 를 시작한 터미널, MCP client, 또는 runtime process 를 종료 후 다시 실행하세요.
|
|
61
84
|
|
|
62
|
-
시뮬레이터 타깃에서 선택자 기반 액션(`
|
|
85
|
+
시뮬레이터 타깃에서 선택자 기반 액션(`tap`/`right_click`의 `id`/`label`)은 기본적으로 **앱 내부 콘텐츠**를 탐색합니다. Simulator 크롬/시스템 UI까지 포함하려면 `all: true`를 사용하세요.
|
|
63
86
|
|
|
64
87
|
## 설치
|
|
65
88
|
|
|
@@ -74,6 +97,8 @@ npm install -g mcp-baepsae
|
|
|
74
97
|
```
|
|
75
98
|
|
|
76
99
|
> macOS에서는 설치 시 Swift 네이티브 바이너리가 자동 빌드됩니다. Swift가 없어도 simctl 기반 기능은 정상 작동합니다.
|
|
100
|
+
>
|
|
101
|
+
> UI 조회/입력 자동화를 바로 사용할 계획이라면, 실제로 서버를 실행할 터미널 / MCP client / runtime process 에 먼저 접근성 권한을 부여해두는 것이 좋습니다.
|
|
77
102
|
|
|
78
103
|
### 옵션 B) 소스에서 빌드
|
|
79
104
|
|
|
@@ -109,6 +134,8 @@ bash scripts/install.sh --tool all
|
|
|
109
134
|
|
|
110
135
|
LLM 에이전트가 이 MCP 서버를 설정할 때 필요한 모든 정보입니다.
|
|
111
136
|
|
|
137
|
+
> UI 자동화 도구를 사용하기 전에, 접근성 권한은 보통 **자동화 대상 앱**이 아니라 **host/runtime process** (`node`, terminal, MCP client) 에 필요하다는 점을 먼저 확인하세요.
|
|
138
|
+
|
|
112
139
|
### 빠른 시작 (한 줄)
|
|
113
140
|
|
|
114
141
|
```bash
|
|
@@ -167,6 +194,8 @@ codex mcp add baepsae -- npx -y mcp-baepsae@latest
|
|
|
167
194
|
gemini mcp add --scope user --transport stdio baepsae npx -y mcp-baepsae@latest
|
|
168
195
|
```
|
|
169
196
|
|
|
197
|
+
`npx` 경로에서는 보통 spawn된 `node` 런타임과, 이를 실행한 터미널 / MCP client 가 관련 권한 대상입니다.
|
|
198
|
+
|
|
170
199
|
### 로컬 빌드 사용
|
|
171
200
|
|
|
172
201
|
```bash
|
|
@@ -180,6 +209,9 @@ codex mcp add baepsae --env BAEPSAE_NATIVE_PATH=/ABS/PATH/native/.build/release/
|
|
|
180
209
|
gemini mcp add --scope user --transport stdio -e BAEPSAE_NATIVE_PATH=/ABS/PATH/native/.build/release/baepsae-native baepsae node /ABS/PATH/dist/index.js
|
|
181
210
|
```
|
|
182
211
|
|
|
212
|
+
로컬 빌드를 사용할 때는 보통 런타임(`node`)과 이를 실행한 앱을 함께 확인해야 합니다.
|
|
213
|
+
디버깅 중 `baepsae-native` 를 직접 호출한다면 native binary 항목도 별도로 확인하세요.
|
|
214
|
+
|
|
183
215
|
## 프로젝트 구조
|
|
184
216
|
|
|
185
217
|
- MCP 서버 진입점: `src/index.ts`
|
|
@@ -197,47 +229,44 @@ gemini mcp add --scope user --transport stdio -e BAEPSAE_NATIVE_PATH=/ABS/PATH/n
|
|
|
197
229
|
npm run build # TypeScript + Swift 네이티브 빌드
|
|
198
230
|
npm test # 계약/통합 테스트
|
|
199
231
|
npm run test:real # 실제 시뮬레이터 스모크 테스트 (부팅된 시뮬레이터 필요)
|
|
232
|
+
npm run test:real:preflight # 환경 진단만 출력
|
|
233
|
+
npm run test:real:sim # iOS 시뮬레이터 단계만 실행 (Phase 4 제외)
|
|
234
|
+
npm run test:real:mac # macOS Safari 단계만 실행
|
|
200
235
|
npm run verify # test + test:real
|
|
201
236
|
npm run setup:mcp # scripts/install.sh 실행 alias
|
|
202
237
|
```
|
|
203
238
|
|
|
204
239
|
## MCP 도구 구현 상태
|
|
205
240
|
|
|
206
|
-
총
|
|
241
|
+
총 35개 도구가 end-to-end 구현 완료되었습니다.
|
|
207
242
|
|
|
208
|
-
###
|
|
243
|
+
### 공식 공개 MCP 표면: unified generic tools
|
|
209
244
|
|
|
210
|
-
|
|
245
|
+
공개 API 표면은 단일 스킴으로 정리되어 있으며, `sim_*` / `mac_*` 이름 대신 target 인자를 받는 unified generic tools 를 사용합니다.
|
|
211
246
|
|
|
212
|
-
|
|
|
247
|
+
| 분류 | 도구 |
|
|
213
248
|
|---|---|
|
|
214
|
-
| `
|
|
215
|
-
| `
|
|
216
|
-
|
|
|
217
|
-
| `
|
|
218
|
-
| `
|
|
219
|
-
| `
|
|
220
|
-
|
|
|
221
|
-
| `sim_key_combo` | `mac_key_combo` |
|
|
222
|
-
| `sim_touch` | `mac_touch` |
|
|
223
|
-
| `sim_right_click` | `mac_right_click` |
|
|
224
|
-
| `sim_scroll` | `mac_scroll` |
|
|
225
|
-
| `sim_drag_drop` | `mac_drag_drop` |
|
|
226
|
-
| `sim_list_windows` | `mac_list_windows` |
|
|
227
|
-
| `sim_activate_app` | `mac_activate_app` |
|
|
228
|
-
| `sim_screenshot_app` | `mac_screenshot_app` |
|
|
249
|
+
| UI | `analyze_ui`, `query_ui`, `tap`, `tap_tab`, `type_text`, `swipe`, `scroll`, `drag_drop` |
|
|
250
|
+
| Input | `key`, `key_sequence`, `key_combo`, `touch` |
|
|
251
|
+
| Workflow | `run_steps` |
|
|
252
|
+
| System | `list_windows`, `activate_app`, `screenshot_app`, `right_click` |
|
|
253
|
+
| iOS 시뮬레이터 전용 | `list_simulators`, `screenshot`, `record_video`, `stream_video`, `open_url`, `install_app`, `launch_app`, `terminate_app`, `uninstall_app`, `button`, `gesture` |
|
|
254
|
+
| macOS / 시스템 | `list_apps`, `menu_action`, `get_focused_app`, `clipboard` |
|
|
255
|
+
| 유틸리티 | `baepsae_help`, `baepsae_version`, `doctor` |
|
|
229
256
|
|
|
230
|
-
|
|
257
|
+
대상 라우팅은 인자로 명시합니다: simulator 는 `udid`, macOS 는 `bundleId` / `appName`.
|
|
231
258
|
|
|
232
|
-
|
|
259
|
+
### `type_text` 정책
|
|
233
260
|
|
|
234
|
-
|
|
261
|
+
`type_text`는 다음 입력 소스 중 정확히 하나만 받습니다: `text`, `stdinText`, `file`.
|
|
235
262
|
|
|
236
|
-
|
|
263
|
+
- `method: "auto"`는 다음처럼 해석됩니다.
|
|
264
|
+
- 시뮬레이터 대상: `paste`
|
|
265
|
+
- macOS 대상: `keyboard`
|
|
266
|
+
- `method: "paste"`는 시뮬레이터 대상에서는 simulator pasteboard를, macOS 대상에서는 host clipboard를 잠시 바꿨다가 복원하는 경로를 사용합니다.
|
|
267
|
+
- `method: "keyboard"`는 항상 문자 단위 타이핑을 사용합니다.
|
|
237
268
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
`baepsae_help`, `baepsae_version`
|
|
269
|
+
`paste`를 사용하면 시뮬레이터 대상은 host clipboard를 건드리지 않고 simulator pasteboard를 갱신하며, macOS 대상은 host clipboard를 잠시 덮어쓴 뒤 복원합니다. 성공 응답에는 입력 소스, 대상 종류, 요청한 method, 실제 사용한 method, paste transport, auto fallback이 함께 보고됩니다.
|
|
241
270
|
|
|
242
271
|
## 사용 예시
|
|
243
272
|
|
|
@@ -247,22 +276,39 @@ npm run setup:mcp # scripts/install.sh 실행 alias
|
|
|
247
276
|
launch_app({ udid: "...", bundleId: "com.example.app" })
|
|
248
277
|
|
|
249
278
|
// 2) 접근성 트리 조회/검색 (기본: 앱 내부 콘텐츠 스코프)
|
|
250
|
-
|
|
251
|
-
|
|
279
|
+
analyze_ui({ udid: "..." })
|
|
280
|
+
query_ui({ udid: "...", query: "로그인" })
|
|
252
281
|
|
|
253
282
|
// 3) 접근성 ID/라벨로 상호작용
|
|
254
|
-
|
|
283
|
+
tap({ udid: "...", id: "login-button" })
|
|
255
284
|
|
|
256
285
|
// 선택: Simulator 크롬/시스템 UI까지 탐색하려면
|
|
257
|
-
|
|
286
|
+
tap({ udid: "...", label: "Home", all: true })
|
|
258
287
|
```
|
|
259
288
|
|
|
260
289
|
## 트러블슈팅
|
|
261
290
|
|
|
291
|
+
### 접근성 권한 체크리스트
|
|
292
|
+
|
|
293
|
+
- 권한 대상은 보통 **target app** 이 아니라 **automation host/runtime process** 입니다.
|
|
294
|
+
- 먼저 `doctor` 를 실행해서 host process, parent process, native binary, booted simulator availability, accessibility readiness 를 한 번에 확인하세요.
|
|
295
|
+
- 오류 메시지에서 다음 항목을 먼저 확인하세요.
|
|
296
|
+
- **current host process**
|
|
297
|
+
- **parent process**
|
|
298
|
+
- **inferred launch mode**
|
|
299
|
+
- `npx` / `node` 경유 실행이라면 런타임과 이를 실행한 터미널 / MCP client 에 권한을 줍니다.
|
|
300
|
+
- `baepsae-native` 직접 실행이라면 native binary 항목과 이를 실행한 터미널 / 셸 앱을 확인합니다.
|
|
301
|
+
- 권한 변경 후에는 launching process 를 재시작한 뒤 다시 시도하세요.
|
|
302
|
+
|
|
262
303
|
- Claude 설정 중 `Invalid environment variable format` 오류:
|
|
263
304
|
- 최신 `scripts/install.sh`를 사용하거나 `--env="KEY=value"` 형식을 사용하세요.
|
|
264
305
|
- `Missing native binary` 오류:
|
|
265
306
|
- `npm run build` 실행 후 `native/.build/release/baepsae-native` 파일 존재 여부를 확인하세요.
|
|
307
|
+
- 접근성 권한 오류가 모호한 경우:
|
|
308
|
+
- 현재 버전은 오류 메시지에 host / parent process 진단 정보와 inferred launch mode 를 함께 보여주므로 어떤 실행 파일에 권한을 줘야 할지 추적할 수 있습니다.
|
|
309
|
+
- 실제 스모크 테스트 진단:
|
|
310
|
+
- `npm run test:real:preflight`로 전체 스위트를 돌리지 않고 환경/기능(capability) 진단만 출력할 수 있습니다.
|
|
311
|
+
- `npm run test:real:sim`으로 시뮬레이터 중심 범위만, `npm run test:real:mac`으로 macOS Safari 범위만 실행할 수 있습니다.
|
|
266
312
|
- OpenCode에서 `baepsae`가 보이지 않는 경우:
|
|
267
313
|
- `bash scripts/install.sh --tool opencode --skip-install --skip-build`를 다시 실행하고 `~/.config/opencode/opencode.json`을 확인하세요.
|
|
268
314
|
- Copilot 자동 등록이 안 되는 경우:
|
package/README.md
CHANGED
|
@@ -53,13 +53,36 @@ The Swift native bridge (`baepsae-native`) uses macOS-specific frameworks (AppKi
|
|
|
53
53
|
|
|
54
54
|
## Permissions
|
|
55
55
|
|
|
56
|
-
**Accessibility permission is required** for UI inspection and input automation features (use
|
|
56
|
+
**Accessibility permission is required** for UI inspection and input automation features (use unified generic tools such as `analyze_ui`, `tap`, `right_click`).
|
|
57
|
+
|
|
58
|
+
The important detail is that permission usually needs to be granted to the **automation host / runtime process**, not to the target app you are automating.
|
|
59
|
+
|
|
60
|
+
### Which process usually needs permission?
|
|
61
|
+
|
|
62
|
+
- **Direct native binary invocation**
|
|
63
|
+
- Example: `baepsae-native ...`
|
|
64
|
+
- Most relevant entry: the `baepsae-native` binary itself, plus the terminal/shell app that launched it
|
|
65
|
+
- **Node / npx MCP runtime**
|
|
66
|
+
- Example: `node dist/index.js`, `npx -y mcp-baepsae@latest`
|
|
67
|
+
- Most relevant entry: the runtime process (`node`), plus the terminal or MCP client app that launched it
|
|
68
|
+
- **Desktop / CLI MCP clients**
|
|
69
|
+
- Example: Claude Code, Codex CLI/Desktop, Gemini CLI
|
|
70
|
+
- Relevant entries can include the MCP client app, the terminal host, and the runtime process depending on launch path
|
|
71
|
+
|
|
72
|
+
### Recommended setup flow
|
|
57
73
|
|
|
58
74
|
1. Open **System Settings** > **Privacy & Security** > **Accessibility**.
|
|
59
|
-
2. Enable the MCP client app
|
|
60
|
-
3.
|
|
75
|
+
2. Enable the terminal or MCP client app you actually use.
|
|
76
|
+
3. Enable the runtime process if listed (`node`, `bun`, etc.).
|
|
77
|
+
4. For direct native invocation, also enable the `baepsae-native` binary entry if it appears separately.
|
|
78
|
+
5. If an entry is missing, click `+` and add it manually.
|
|
79
|
+
|
|
80
|
+
### Important note
|
|
81
|
+
|
|
82
|
+
After granting permission, the launching process may need to be restarted before macOS applies the change.
|
|
83
|
+
If the error persists, quit and relaunch the terminal, MCP client, or runtime process that started `mcp-baepsae`.
|
|
61
84
|
|
|
62
|
-
For simulator targets, selector-based actions (`
|
|
85
|
+
For simulator targets, selector-based actions (`tap` / `right_click` with `id` or `label`) search **in-app content** by default. Set `all: true` to include Simulator chrome UI.
|
|
63
86
|
|
|
64
87
|
## Install
|
|
65
88
|
|
|
@@ -74,6 +97,8 @@ npm install -g mcp-baepsae
|
|
|
74
97
|
```
|
|
75
98
|
|
|
76
99
|
> On macOS, the Swift native binary is built automatically during install. If Swift is not available, the server still works with simctl-based features.
|
|
100
|
+
>
|
|
101
|
+
> If you plan to use UI inspection or input automation right away, grant Accessibility permission to the terminal / MCP client / runtime process you will actually launch the server with.
|
|
77
102
|
|
|
78
103
|
### Option B) From source
|
|
79
104
|
|
|
@@ -109,6 +134,8 @@ bash scripts/install.sh --tool all
|
|
|
109
134
|
|
|
110
135
|
If you are an LLM agent setting up this MCP server, here is everything you need:
|
|
111
136
|
|
|
137
|
+
> Before trying UI automation tools, remember that Accessibility permission usually belongs to the **host/runtime process** (`node`, terminal, MCP client), not the target app under automation.
|
|
138
|
+
|
|
112
139
|
### Quick start (one command)
|
|
113
140
|
|
|
114
141
|
```bash
|
|
@@ -167,6 +194,8 @@ codex mcp add baepsae -- npx -y mcp-baepsae@latest
|
|
|
167
194
|
gemini mcp add --scope user --transport stdio baepsae npx -y mcp-baepsae@latest
|
|
168
195
|
```
|
|
169
196
|
|
|
197
|
+
When using `npx`, the relevant Accessibility entry is commonly the spawned `node` runtime plus the terminal / MCP client that launched it.
|
|
198
|
+
|
|
170
199
|
### Using local build
|
|
171
200
|
|
|
172
201
|
```bash
|
|
@@ -180,6 +209,9 @@ codex mcp add baepsae --env BAEPSAE_NATIVE_PATH=/ABS/PATH/native/.build/release/
|
|
|
180
209
|
gemini mcp add --scope user --transport stdio -e BAEPSAE_NATIVE_PATH=/ABS/PATH/native/.build/release/baepsae-native baepsae node /ABS/PATH/dist/index.js
|
|
181
210
|
```
|
|
182
211
|
|
|
212
|
+
When using a local build, check permission on both the runtime (`node`) and the app that launched it.
|
|
213
|
+
If you invoke `baepsae-native` directly for debugging, check permission on the native binary entry itself as well.
|
|
214
|
+
|
|
183
215
|
## Project Structure
|
|
184
216
|
|
|
185
217
|
- MCP server entry point: `src/index.ts`
|
|
@@ -197,64 +229,61 @@ gemini mcp add --scope user --transport stdio -e BAEPSAE_NATIVE_PATH=/ABS/PATH/n
|
|
|
197
229
|
npm run build # Build TypeScript + native Swift binary
|
|
198
230
|
npm test # Contract/integration tests
|
|
199
231
|
npm run test:real # Real simulator smoke test (requires booted simulator)
|
|
232
|
+
npm run test:real:preflight # Environment diagnostics only
|
|
233
|
+
npm run test:real:sim # iOS simulator phases only (skips Phase 4)
|
|
234
|
+
npm run test:real:mac # macOS Safari phase only
|
|
200
235
|
npm run verify # test + test:real
|
|
201
236
|
npm run setup:mcp # Alias for scripts/install.sh
|
|
202
237
|
```
|
|
203
238
|
|
|
204
239
|
## MCP Tool Status
|
|
205
240
|
|
|
206
|
-
|
|
241
|
+
35 tools implemented end-to-end.
|
|
207
242
|
|
|
208
|
-
###
|
|
243
|
+
### Official public MCP surface: unified generic tools
|
|
209
244
|
|
|
210
|
-
|
|
245
|
+
The public API surface is intentionally single-scheme: use unified generic tools with a target argument, rather than `sim_*` / `mac_*` names.
|
|
211
246
|
|
|
212
|
-
|
|
|
247
|
+
| Category | Tools |
|
|
213
248
|
|---|---|
|
|
214
|
-
| `
|
|
215
|
-
| `
|
|
216
|
-
|
|
|
217
|
-
| `
|
|
218
|
-
| `
|
|
219
|
-
| `
|
|
220
|
-
|
|
|
221
|
-
| `sim_key_combo` | `mac_key_combo` |
|
|
222
|
-
| `sim_touch` | `mac_touch` |
|
|
223
|
-
| `sim_right_click` | `mac_right_click` |
|
|
224
|
-
| `sim_scroll` | `mac_scroll` |
|
|
225
|
-
| `sim_drag_drop` | `mac_drag_drop` |
|
|
226
|
-
| `sim_list_windows` | `mac_list_windows` |
|
|
227
|
-
| `sim_activate_app` | `mac_activate_app` |
|
|
228
|
-
| `sim_screenshot_app` | `mac_screenshot_app` |
|
|
249
|
+
| UI | `analyze_ui`, `query_ui`, `tap`, `tap_tab`, `type_text`, `swipe`, `scroll`, `drag_drop` |
|
|
250
|
+
| Input | `key`, `key_sequence`, `key_combo`, `touch` |
|
|
251
|
+
| Workflow | `run_steps` |
|
|
252
|
+
| System | `list_windows`, `activate_app`, `screenshot_app`, `right_click` |
|
|
253
|
+
| Simulator-only | `list_simulators`, `screenshot`, `record_video`, `stream_video`, `open_url`, `install_app`, `launch_app`, `terminate_app`, `uninstall_app`, `button`, `gesture` |
|
|
254
|
+
| macOS/system | `list_apps`, `menu_action`, `get_focused_app`, `clipboard` |
|
|
255
|
+
| Utility | `baepsae_help`, `baepsae_version`, `doctor` |
|
|
229
256
|
|
|
230
|
-
|
|
257
|
+
Target routing is explicit in the arguments: `udid` for simulator, `bundleId` / `appName` for macOS.
|
|
231
258
|
|
|
232
|
-
|
|
259
|
+
### `type_text` policy
|
|
233
260
|
|
|
234
|
-
|
|
261
|
+
`type_text` accepts exactly one input source: `text`, `stdinText`, or `file`.
|
|
235
262
|
|
|
236
|
-
|
|
263
|
+
- `method: "auto"` resolves to:
|
|
264
|
+
- `paste` for simulator targets
|
|
265
|
+
- `keyboard` for macOS targets
|
|
266
|
+
- `method: "paste"` uses the simulator pasteboard for simulator targets and a temporary host clipboard replace/restore flow for macOS targets.
|
|
267
|
+
- `method: "keyboard"` always types character-by-character.
|
|
237
268
|
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
`baepsae_help`, `baepsae_version`
|
|
269
|
+
When `paste` is used, simulator targets update the simulator pasteboard without touching the host clipboard, while macOS targets temporarily overwrite the host clipboard and restore it after submission. Successful responses report the input source, target kind, requested method, used method, paste transport, and any auto fallback that was applied.
|
|
241
270
|
|
|
242
271
|
## Usage Examples
|
|
243
272
|
|
|
244
|
-
**
|
|
273
|
+
**Unified simulator app accessibility quickstart (inside app UI):**
|
|
245
274
|
```javascript
|
|
246
275
|
// 1) Launch your app in the target simulator
|
|
247
276
|
launch_app({ udid: "...", bundleId: "com.example.app" })
|
|
248
277
|
|
|
249
278
|
// 2) Inspect or search accessibility tree (in-app content scope by default)
|
|
250
|
-
|
|
251
|
-
|
|
279
|
+
analyze_ui({ udid: "..." })
|
|
280
|
+
query_ui({ udid: "...", query: "Login" })
|
|
252
281
|
|
|
253
282
|
// 3) Interact by accessibility identifier/label
|
|
254
|
-
|
|
283
|
+
tap({ udid: "...", id: "login-button" })
|
|
255
284
|
|
|
256
285
|
// Optional: include Simulator chrome/system UI in selector lookup
|
|
257
|
-
|
|
286
|
+
tap({ udid: "...", label: "Home", all: true })
|
|
258
287
|
```
|
|
259
288
|
|
|
260
289
|
**Open a URL (iOS Simulator):**
|
|
@@ -281,15 +310,32 @@ terminate_app({ udid: "...", bundleId: "com.apple.mobilesafari" })
|
|
|
281
310
|
list_apps({})
|
|
282
311
|
|
|
283
312
|
// Take screenshot of a macOS app
|
|
284
|
-
|
|
313
|
+
screenshot_app({ bundleId: "com.apple.Safari" })
|
|
285
314
|
```
|
|
286
315
|
|
|
287
316
|
## Troubleshooting
|
|
288
317
|
|
|
318
|
+
### Accessibility permission checklist
|
|
319
|
+
|
|
320
|
+
- The permission target is usually the **automation host/runtime process**, not the target app.
|
|
321
|
+
- Run `doctor` first to inspect host process, parent process, native binary, booted simulator availability, and accessibility readiness in one place.
|
|
322
|
+
- Check the error message for:
|
|
323
|
+
- **current host process**
|
|
324
|
+
- **parent process**
|
|
325
|
+
- **inferred launch mode**
|
|
326
|
+
- If you launched through `npx` / `node`, grant permission to the runtime and the launching terminal / MCP client.
|
|
327
|
+
- If you launched `baepsae-native` directly, grant permission to the native binary entry and the launching terminal / shell app.
|
|
328
|
+
- After changing permission, restart the launching process before retrying.
|
|
329
|
+
|
|
289
330
|
- `Invalid environment variable format` on Claude setup:
|
|
290
331
|
- Use current script (`scripts/install.sh`) or `claude mcp add --env="KEY=value" ...` format.
|
|
291
332
|
- `Missing native binary` error:
|
|
292
333
|
- Run `npm run build` and confirm `native/.build/release/baepsae-native` exists.
|
|
334
|
+
- Accessibility permission error is ambiguous:
|
|
335
|
+
- Current versions include host/parent process diagnostics and inferred launch mode in the error text so you can see which executable path likely needs permission.
|
|
336
|
+
- Real smoke test diagnostics:
|
|
337
|
+
- Run `npm run test:real:preflight` to print environment and capability diagnostics without executing the full suite.
|
|
338
|
+
- Run `npm run test:real:sim` to focus on simulator-capability coverage, or `npm run test:real:mac` for the macOS Safari subset.
|
|
293
339
|
- OpenCode does not show `baepsae`:
|
|
294
340
|
- Re-run `bash scripts/install.sh --tool opencode --skip-install --skip-build` and check `~/.config/opencode/opencode.json`.
|
|
295
341
|
- Copilot not auto-registered:
|
|
Binary file
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { CommandExecutionOptions, ResponseOptions, ToolTextResult } from "./types.js";
|
|
2
|
+
export declare const BACKEND_KINDS: {
|
|
3
|
+
readonly SIMCTL: "simctl";
|
|
4
|
+
readonly NATIVE_ACCESSIBILITY: "native_accessibility";
|
|
5
|
+
readonly SIMULATOR_INPUT: "simulator_input";
|
|
6
|
+
readonly UTILITY_RUNTIME: "utility/runtime";
|
|
7
|
+
};
|
|
8
|
+
export type BackendKind = typeof BACKEND_KINDS[keyof typeof BACKEND_KINDS];
|
|
9
|
+
export type BackendDomain = "simulator" | "accessibility" | "input" | "utility";
|
|
10
|
+
export type BackendExecutorKind = "native" | "simctl";
|
|
11
|
+
export interface BackendDescriptor {
|
|
12
|
+
kind: BackendKind;
|
|
13
|
+
domain: BackendDomain;
|
|
14
|
+
executorKind: BackendExecutorKind;
|
|
15
|
+
label: string;
|
|
16
|
+
summary: string;
|
|
17
|
+
}
|
|
18
|
+
type BackendExecutor = (args: string[], options?: CommandExecutionOptions, responseOptions?: ResponseOptions) => Promise<ToolTextResult>;
|
|
19
|
+
export declare const BACKEND_DOMAIN_TO_KIND: Record<BackendDomain, BackendKind>;
|
|
20
|
+
export declare const BACKENDS: Record<BackendKind, BackendDescriptor>;
|
|
21
|
+
export declare const BACKEND_EXECUTORS: Record<BackendExecutorKind, BackendExecutor>;
|
|
22
|
+
export declare function resolveBackendKind(domain: BackendDomain): BackendKind;
|
|
23
|
+
export declare function getBackendDescriptor(domain: BackendDomain): BackendDescriptor;
|
|
24
|
+
export declare function runBackend(domain: BackendDomain, args: string[], options?: CommandExecutionOptions, responseOptions?: ResponseOptions): Promise<ToolTextResult>;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=backend.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.d.ts","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,uBAAuB,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE3F,eAAO,MAAM,aAAa;;;;;CAKhB,CAAC;AAEX,MAAM,MAAM,WAAW,GAAG,OAAO,aAAa,CAAC,MAAM,OAAO,aAAa,CAAC,CAAC;AAC3E,MAAM,MAAM,aAAa,GAAG,WAAW,GAAG,eAAe,GAAG,OAAO,GAAG,SAAS,CAAC;AAChF,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEtD,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,WAAW,CAAC;IAClB,MAAM,EAAE,aAAa,CAAC;IACtB,YAAY,EAAE,mBAAmB,CAAC;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,KAAK,eAAe,GAAG,CACrB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE,uBAAuB,EACjC,eAAe,CAAC,EAAE,eAAe,KAC9B,OAAO,CAAC,cAAc,CAAC,CAAC;AAE7B,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,aAAa,EAAE,WAAW,CAKrE,CAAC;AAEF,eAAO,MAAM,QAAQ,EAAE,MAAM,CAAC,WAAW,EAAE,iBAAiB,CA6B3D,CAAC;AAEF,eAAO,MAAM,iBAAiB,EAAE,MAAM,CAAC,mBAAmB,EAAE,eAAe,CAG1E,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CAErE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,iBAAiB,CAE7E;AAWD,wBAAsB,UAAU,CAC9B,MAAM,EAAE,aAAa,EACrB,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,CAAC,EAAE,uBAAuB,EACjC,eAAe,CAAC,EAAE,eAAe,GAChC,OAAO,CAAC,cAAc,CAAC,CAUzB"}
|
package/dist/backend.js
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BACKEND_EXECUTORS = exports.BACKENDS = exports.BACKEND_DOMAIN_TO_KIND = exports.BACKEND_KINDS = void 0;
|
|
4
|
+
exports.resolveBackendKind = resolveBackendKind;
|
|
5
|
+
exports.getBackendDescriptor = getBackendDescriptor;
|
|
6
|
+
exports.runBackend = runBackend;
|
|
7
|
+
const utils_js_1 = require("./utils.js");
|
|
8
|
+
exports.BACKEND_KINDS = {
|
|
9
|
+
SIMCTL: "simctl",
|
|
10
|
+
NATIVE_ACCESSIBILITY: "native_accessibility",
|
|
11
|
+
SIMULATOR_INPUT: "simulator_input",
|
|
12
|
+
UTILITY_RUNTIME: "utility/runtime",
|
|
13
|
+
};
|
|
14
|
+
exports.BACKEND_DOMAIN_TO_KIND = {
|
|
15
|
+
simulator: exports.BACKEND_KINDS.SIMCTL,
|
|
16
|
+
accessibility: exports.BACKEND_KINDS.NATIVE_ACCESSIBILITY,
|
|
17
|
+
input: exports.BACKEND_KINDS.SIMULATOR_INPUT,
|
|
18
|
+
utility: exports.BACKEND_KINDS.UTILITY_RUNTIME,
|
|
19
|
+
};
|
|
20
|
+
exports.BACKENDS = {
|
|
21
|
+
[exports.BACKEND_KINDS.SIMCTL]: {
|
|
22
|
+
kind: exports.BACKEND_KINDS.SIMCTL,
|
|
23
|
+
domain: "simulator",
|
|
24
|
+
executorKind: "simctl",
|
|
25
|
+
label: "simctl",
|
|
26
|
+
summary: "Direct simulator control via xcrun simctl.",
|
|
27
|
+
},
|
|
28
|
+
[exports.BACKEND_KINDS.NATIVE_ACCESSIBILITY]: {
|
|
29
|
+
kind: exports.BACKEND_KINDS.NATIVE_ACCESSIBILITY,
|
|
30
|
+
domain: "accessibility",
|
|
31
|
+
executorKind: "native",
|
|
32
|
+
label: "native accessibility",
|
|
33
|
+
summary: "Native accessibility and UI inspection commands.",
|
|
34
|
+
},
|
|
35
|
+
[exports.BACKEND_KINDS.SIMULATOR_INPUT]: {
|
|
36
|
+
kind: exports.BACKEND_KINDS.SIMULATOR_INPUT,
|
|
37
|
+
domain: "input",
|
|
38
|
+
executorKind: "native",
|
|
39
|
+
label: "simulator input",
|
|
40
|
+
summary: "Native simulator input and HID-style interaction commands.",
|
|
41
|
+
},
|
|
42
|
+
[exports.BACKEND_KINDS.UTILITY_RUNTIME]: {
|
|
43
|
+
kind: exports.BACKEND_KINDS.UTILITY_RUNTIME,
|
|
44
|
+
domain: "utility",
|
|
45
|
+
executorKind: "native",
|
|
46
|
+
label: "utility/runtime",
|
|
47
|
+
summary: "Native utility and runtime shim commands.",
|
|
48
|
+
},
|
|
49
|
+
};
|
|
50
|
+
exports.BACKEND_EXECUTORS = {
|
|
51
|
+
native: utils_js_1.runNative,
|
|
52
|
+
simctl: utils_js_1.runSimctl,
|
|
53
|
+
};
|
|
54
|
+
function resolveBackendKind(domain) {
|
|
55
|
+
return exports.BACKEND_DOMAIN_TO_KIND[domain];
|
|
56
|
+
}
|
|
57
|
+
function getBackendDescriptor(domain) {
|
|
58
|
+
return exports.BACKENDS[resolveBackendKind(domain)];
|
|
59
|
+
}
|
|
60
|
+
function backendMetadata(descriptor) {
|
|
61
|
+
return {
|
|
62
|
+
backendDomain: descriptor.domain,
|
|
63
|
+
backendKind: descriptor.kind,
|
|
64
|
+
backendExecutor: descriptor.executorKind,
|
|
65
|
+
backendLabel: descriptor.label,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
async function runBackend(domain, args, options, responseOptions) {
|
|
69
|
+
const descriptor = getBackendDescriptor(domain);
|
|
70
|
+
const executor = exports.BACKEND_EXECUTORS[descriptor.executorKind];
|
|
71
|
+
return await executor(args, options, {
|
|
72
|
+
...responseOptions,
|
|
73
|
+
metadata: {
|
|
74
|
+
...(responseOptions?.metadata ?? {}),
|
|
75
|
+
...backendMetadata(descriptor),
|
|
76
|
+
},
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=backend.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backend.js","sourceRoot":"","sources":["../src/backend.ts"],"names":[],"mappings":";;;AAuEA,gDAEC;AAED,oDAEC;AAWD,gCAeC;AAvGD,yCAAkD;AAGrC,QAAA,aAAa,GAAG;IAC3B,MAAM,EAAE,QAAQ;IAChB,oBAAoB,EAAE,sBAAsB;IAC5C,eAAe,EAAE,iBAAiB;IAClC,eAAe,EAAE,iBAAiB;CAC1B,CAAC;AAoBE,QAAA,sBAAsB,GAAuC;IACxE,SAAS,EAAE,qBAAa,CAAC,MAAM;IAC/B,aAAa,EAAE,qBAAa,CAAC,oBAAoB;IACjD,KAAK,EAAE,qBAAa,CAAC,eAAe;IACpC,OAAO,EAAE,qBAAa,CAAC,eAAe;CACvC,CAAC;AAEW,QAAA,QAAQ,GAA2C;IAC9D,CAAC,qBAAa,CAAC,MAAM,CAAC,EAAE;QACtB,IAAI,EAAE,qBAAa,CAAC,MAAM;QAC1B,MAAM,EAAE,WAAW;QACnB,YAAY,EAAE,QAAQ;QACtB,KAAK,EAAE,QAAQ;QACf,OAAO,EAAE,4CAA4C;KACtD;IACD,CAAC,qBAAa,CAAC,oBAAoB,CAAC,EAAE;QACpC,IAAI,EAAE,qBAAa,CAAC,oBAAoB;QACxC,MAAM,EAAE,eAAe;QACvB,YAAY,EAAE,QAAQ;QACtB,KAAK,EAAE,sBAAsB;QAC7B,OAAO,EAAE,kDAAkD;KAC5D;IACD,CAAC,qBAAa,CAAC,eAAe,CAAC,EAAE;QAC/B,IAAI,EAAE,qBAAa,CAAC,eAAe;QACnC,MAAM,EAAE,OAAO;QACf,YAAY,EAAE,QAAQ;QACtB,KAAK,EAAE,iBAAiB;QACxB,OAAO,EAAE,4DAA4D;KACtE;IACD,CAAC,qBAAa,CAAC,eAAe,CAAC,EAAE;QAC/B,IAAI,EAAE,qBAAa,CAAC,eAAe;QACnC,MAAM,EAAE,SAAS;QACjB,YAAY,EAAE,QAAQ;QACtB,KAAK,EAAE,iBAAiB;QACxB,OAAO,EAAE,2CAA2C;KACrD;CACF,CAAC;AAEW,QAAA,iBAAiB,GAAiD;IAC7E,MAAM,EAAE,oBAAS;IACjB,MAAM,EAAE,oBAAS;CAClB,CAAC;AAEF,SAAgB,kBAAkB,CAAC,MAAqB;IACtD,OAAO,8BAAsB,CAAC,MAAM,CAAC,CAAC;AACxC,CAAC;AAED,SAAgB,oBAAoB,CAAC,MAAqB;IACxD,OAAO,gBAAQ,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,eAAe,CAAC,UAA6B;IACpD,OAAO;QACL,aAAa,EAAE,UAAU,CAAC,MAAM;QAChC,WAAW,EAAE,UAAU,CAAC,IAAI;QAC5B,eAAe,EAAE,UAAU,CAAC,YAAY;QACxC,YAAY,EAAE,UAAU,CAAC,KAAK;KAC/B,CAAC;AACJ,CAAC;AAEM,KAAK,UAAU,UAAU,CAC9B,MAAqB,EACrB,IAAc,EACd,OAAiC,EACjC,eAAiC;IAEjC,MAAM,UAAU,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,yBAAiB,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;IAC5D,OAAO,MAAM,QAAQ,CAAC,IAAI,EAAE,OAAO,EAAE;QACnC,GAAG,eAAe;QAClB,QAAQ,EAAE;YACR,GAAG,CAAC,eAAe,EAAE,QAAQ,IAAI,EAAE,CAAC;YACpC,GAAG,eAAe,CAAC,UAAU,CAAC;SAC/B;KACF,CAAC,CAAC;AACL,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -12,7 +12,7 @@ if (hasVersionFlag(process.argv)) {
|
|
|
12
12
|
process.exit(0);
|
|
13
13
|
}
|
|
14
14
|
async function main() {
|
|
15
|
-
const [{ McpServer }, { StdioServerTransport }, { SERVER_NAME, SERVER_VERSION }, { registerInfoTools }, { registerSimulatorTools }, { registerUITools }, { registerInputTools }, { registerMediaTools }, { registerSystemTools }] = await Promise.all([
|
|
15
|
+
const [{ McpServer }, { StdioServerTransport }, { SERVER_NAME, SERVER_VERSION }, { registerInfoTools }, { registerSimulatorTools }, { registerUITools }, { registerInputTools }, { registerWorkflowTools }, { registerMediaTools }, { registerSystemTools }] = await Promise.all([
|
|
16
16
|
import("@modelcontextprotocol/sdk/server/mcp.js"),
|
|
17
17
|
import("@modelcontextprotocol/sdk/server/stdio.js"),
|
|
18
18
|
import("./utils.js"),
|
|
@@ -20,6 +20,7 @@ async function main() {
|
|
|
20
20
|
import("./tools/simulator.js"),
|
|
21
21
|
import("./tools/ui.js"),
|
|
22
22
|
import("./tools/input.js"),
|
|
23
|
+
import("./tools/workflow.js"),
|
|
23
24
|
import("./tools/media.js"),
|
|
24
25
|
import("./tools/system.js"),
|
|
25
26
|
]);
|
|
@@ -31,6 +32,7 @@ async function main() {
|
|
|
31
32
|
registerSimulatorTools(server);
|
|
32
33
|
registerUITools(server);
|
|
33
34
|
registerInputTools(server);
|
|
35
|
+
registerWorkflowTools(server);
|
|
34
36
|
registerMediaTools(server);
|
|
35
37
|
registerSystemTools(server);
|
|
36
38
|
const transport = new StdioServerTransport();
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAIA,6CAA6D;AAE7D,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;AAEvD,SAAS,cAAc,CAAC,IAAc;IACpC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,oFAAoF;AACpF,IAAI,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,GAAG,yBAAY,IAAI,4BAAe,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,sBAAsB,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,mBAAmB,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAIA,6CAA6D;AAE7D,MAAM,iBAAiB,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC;AAEvD,SAAS,cAAc,CAAC,IAAc;IACpC,OAAO,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,iBAAiB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,oFAAoF;AACpF,IAAI,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,GAAG,yBAAY,IAAI,4BAAe,EAAE,CAAC,CAAC;IAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,oBAAoB,EAAE,EAAE,EAAE,WAAW,EAAE,cAAc,EAAE,EAAE,EAAE,iBAAiB,EAAE,EAAE,EAAE,sBAAsB,EAAE,EAAE,EAAE,eAAe,EAAE,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,qBAAqB,EAAE,EAAE,EAAE,kBAAkB,EAAE,EAAE,EAAE,mBAAmB,EAAE,CAAC,GAC1P,MAAM,OAAO,CAAC,GAAG,CAAC;QAChB,MAAM,CAAC,yCAAyC,CAAC;QACjD,MAAM,CAAC,2CAA2C,CAAC;QACnD,MAAM,CAAC,YAAY,CAAC;QACpB,MAAM,CAAC,iBAAiB,CAAC;QACzB,MAAM,CAAC,sBAAsB,CAAC;QAC9B,MAAM,CAAC,eAAe,CAAC;QACvB,MAAM,CAAC,kBAAkB,CAAC;QAC1B,MAAM,CAAC,qBAAqB,CAAC;QAC7B,MAAM,CAAC,kBAAkB,CAAC;QAC1B,MAAM,CAAC,mBAAmB,CAAC;KAC5B,CAAC,CAAC;IAEL,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC;QAC3B,IAAI,EAAE,WAAW;QACjB,OAAO,EAAE,cAAc;KACxB,CAA6B,CAAC;IAE/B,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,sBAAsB,CAAC,MAAM,CAAC,CAAC;IAC/B,eAAe,CAAC,MAAM,CAAC,CAAC;IACxB,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAE5B,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,qCAAqC,EAAE,KAAK,CAAC,CAAC;IAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type ToolCategory = "UI" | "Input" | "Workflow" | "System" | "Simulator-only" | "macOS/system" | "Utility";
|
|
2
|
+
export type ToolManifestEntry = {
|
|
3
|
+
name: string;
|
|
4
|
+
category: ToolCategory;
|
|
5
|
+
summary: string;
|
|
6
|
+
};
|
|
7
|
+
export declare const TOOL_MANIFEST: ToolManifestEntry[];
|
|
8
|
+
export declare const TOOL_CATEGORY_ORDER: ToolCategory[];
|
|
9
|
+
export declare const TOOL_CATEGORY_LABELS_KR: Record<ToolCategory, string>;
|
|
10
|
+
export declare function formatToolManifestMarkdown(): string;
|
|
11
|
+
export declare function formatToolManifestMarkdownKr(): string;
|
|
12
|
+
//# sourceMappingURL=tool-manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-manifest.d.ts","sourceRoot":"","sources":["../src/tool-manifest.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GACpB,IAAI,GACJ,OAAO,GACP,UAAU,GACV,QAAQ,GACR,gBAAgB,GAChB,cAAc,GACd,SAAS,CAAC;AAEd,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,YAAY,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,iBAAiB,EA0C5C,CAAC;AAEF,eAAO,MAAM,mBAAmB,EAAE,YAAY,EAQ7C,CAAC;AAEF,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,YAAY,EAAE,MAAM,CAQhE,CAAC;AAEF,wBAAgB,0BAA0B,IAAI,MAAM,CAQnD;AAED,wBAAgB,4BAA4B,IAAI,MAAM,CAQrD"}
|