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.
Files changed (58) hide show
  1. package/README-KR.md +80 -34
  2. package/README.md +82 -36
  3. package/bundled/baepsae-native +0 -0
  4. package/dist/backend.d.ts +26 -0
  5. package/dist/backend.d.ts.map +1 -0
  6. package/dist/backend.js +79 -0
  7. package/dist/backend.js.map +1 -0
  8. package/dist/index.js +3 -1
  9. package/dist/index.js.map +1 -1
  10. package/dist/tool-manifest.d.ts +12 -0
  11. package/dist/tool-manifest.d.ts.map +1 -0
  12. package/dist/tool-manifest.js +79 -0
  13. package/dist/tool-manifest.js.map +1 -0
  14. package/dist/tools/info.d.ts.map +1 -1
  15. package/dist/tools/info.js +104 -5
  16. package/dist/tools/info.js.map +1 -1
  17. package/dist/tools/input.js +7 -6
  18. package/dist/tools/input.js.map +1 -1
  19. package/dist/tools/media.d.ts.map +1 -1
  20. package/dist/tools/media.js +37 -10
  21. package/dist/tools/media.js.map +1 -1
  22. package/dist/tools/simulator.js +7 -7
  23. package/dist/tools/simulator.js.map +1 -1
  24. package/dist/tools/system.d.ts.map +1 -1
  25. package/dist/tools/system.js +2 -2
  26. package/dist/tools/system.js.map +1 -1
  27. package/dist/tools/ui.d.ts.map +1 -1
  28. package/dist/tools/ui.js +126 -8
  29. package/dist/tools/ui.js.map +1 -1
  30. package/dist/tools/workflow.d.ts +3 -0
  31. package/dist/tools/workflow.d.ts.map +1 -0
  32. package/dist/tools/workflow.js +434 -0
  33. package/dist/tools/workflow.js.map +1 -0
  34. package/dist/types.d.ts +15 -0
  35. package/dist/types.d.ts.map +1 -1
  36. package/dist/utils.d.ts +19 -3
  37. package/dist/utils.d.ts.map +1 -1
  38. package/dist/utils.js +117 -5
  39. package/dist/utils.js.map +1 -1
  40. package/dist/version.d.ts +1 -1
  41. package/dist/version.js +1 -1
  42. package/native/Sources/Commands/InputCommands.swift +52 -33
  43. package/native/Sources/Commands/SystemCommands.swift +86 -0
  44. package/native/Sources/Commands/UICommands.swift +226 -19
  45. package/native/Sources/Commands/WindowCommands.swift +10 -3
  46. package/native/Sources/IndigoHID/IndigoHIDClient.swift +222 -0
  47. package/native/Sources/IndigoHID/IndigoHIDCoordinates.swift +74 -0
  48. package/native/Sources/IndigoHID/IndigoHIDEvents.swift +63 -0
  49. package/native/Sources/IndigoHID/IndigoHIDLoader.swift +102 -0
  50. package/native/Sources/IndigoHID/IndigoHIDTypes.swift +41 -0
  51. package/native/Sources/Types.swift +26 -0
  52. package/native/Sources/Utils.swift +396 -4
  53. package/native/Sources/Version.swift +1 -1
  54. package/native/Sources/main.swift +55 -8
  55. package/native/Tests/BaepsaeNativeTests/BinaryInvocationTests.swift +54 -6
  56. package/package.json +10 -4
  57. package/scripts/bundle-native.sh +35 -0
  58. 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 조회/입력 자동화 도구(`sim_*` / `mac_*` 스코프 도구, 예: `sim_describe_ui`, `mac_tap`, `sim_right_click`)를 사용할 때 필수입니다.
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. 사용 중인 터미널/실행기(Terminal, iTerm2, VSCode, `node`, `openclaw`)를 허용합니다.
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
- 시뮬레이터 타깃에서 선택자 기반 액션(`sim_tap`/`sim_right_click`의 `id`/`label`)은 기본적으로 **앱 내부 콘텐츠**를 탐색합니다. Simulator 크롬/시스템 UI까지 포함하려면 `all: true`를 사용하세요.
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
- 47개 도구가 end-to-end 구현 완료되었습니다.
241
+ 35개 도구가 end-to-end 구현 완료되었습니다.
207
242
 
208
- ### 타깃 분리 스코프 도구 (30개, 권장)
243
+ ### 공식 공개 MCP 표면: unified generic tools
209
244
 
210
- 시뮬레이터/맥 타깃 혼동을 줄이려면 아래 `sim_*` / `mac_*` 도구를 우선 사용하세요.
245
+ 공개 API 표면은 단일 스킴으로 정리되어 있으며, `sim_*` / `mac_*` 이름 대신 target 인자를 받는 unified generic tools 를 사용합니다.
211
246
 
212
- | 시뮬레이터 스코프 | macOS 스코프 |
247
+ | 분류 | 도구 |
213
248
  |---|---|
214
- | `sim_describe_ui` | `mac_describe_ui` |
215
- | `sim_search_ui` | `mac_search_ui` |
216
- | `sim_tap` | `mac_tap` |
217
- | `sim_type_text` | `mac_type_text` |
218
- | `sim_swipe` | `mac_swipe` |
219
- | `sim_key` | `mac_key` |
220
- | `sim_key_sequence` | `mac_key_sequence` |
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
- ### iOS 시뮬레이터 전용 (11개)
257
+ 대상 라우팅은 인자로 명시합니다: simulator 는 `udid`, macOS 는 `bundleId` / `appName`.
231
258
 
232
- `list_simulators`, `screenshot`, `record_video`, `stream_video`, `open_url`, `install_app`, `launch_app`, `terminate_app`, `uninstall_app`, `button`, `gesture`
259
+ ### `type_text` 정책
233
260
 
234
- ### macOS / 시스템 전용 (4개)
261
+ `type_text`는 다음 입력 소스 정확히 하나만 받습니다: `text`, `stdinText`, `file`.
235
262
 
236
- `list_apps`, `menu_action`, `get_focused_app`, `clipboard`
263
+ - `method: "auto"`는 다음처럼 해석됩니다.
264
+ - 시뮬레이터 대상: `paste`
265
+ - macOS 대상: `keyboard`
266
+ - `method: "paste"`는 시뮬레이터 대상에서는 simulator pasteboard를, macOS 대상에서는 host clipboard를 잠시 바꿨다가 복원하는 경로를 사용합니다.
267
+ - `method: "keyboard"`는 항상 문자 단위 타이핑을 사용합니다.
237
268
 
238
- ### 유틸리티 (2개)
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
- sim_describe_ui({ udid: "..." })
251
- sim_search_ui({ udid: "...", query: "로그인" })
279
+ analyze_ui({ udid: "..." })
280
+ query_ui({ udid: "...", query: "로그인" })
252
281
 
253
282
  // 3) 접근성 ID/라벨로 상호작용
254
- sim_tap({ udid: "...", id: "login-button" })
283
+ tap({ udid: "...", id: "login-button" })
255
284
 
256
285
  // 선택: Simulator 크롬/시스템 UI까지 탐색하려면
257
- sim_tap({ udid: "...", label: "Home", all: true })
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 `sim_*` / `mac_*` scoped tools such as `sim_describe_ui`, `mac_tap`, `sim_right_click`).
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 and terminal you actually use, and also the runtime process (`node`) if listed.
60
- 3. If the app is missing, click `+` and add it manually.
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 (`sim_tap` / `sim_right_click` with `id` or `label`) search **in-app content** by default. Set `all: true` to include Simulator chrome UI.
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
- 47 tools implemented end-to-end.
241
+ 35 tools implemented end-to-end.
207
242
 
208
- ### Explicit target-scoped tools (30, recommended)
243
+ ### Official public MCP surface: unified generic tools
209
244
 
210
- Use these first to avoid simulator/macOS target ambiguity.
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
- | Simulator-scoped | macOS-scoped |
247
+ | Category | Tools |
213
248
  |---|---|
214
- | `sim_describe_ui` | `mac_describe_ui` |
215
- | `sim_search_ui` | `mac_search_ui` |
216
- | `sim_tap` | `mac_tap` |
217
- | `sim_type_text` | `mac_type_text` |
218
- | `sim_swipe` | `mac_swipe` |
219
- | `sim_key` | `mac_key` |
220
- | `sim_key_sequence` | `mac_key_sequence` |
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
- ### iOS Simulator Only (11)
257
+ Target routing is explicit in the arguments: `udid` for simulator, `bundleId` / `appName` for macOS.
231
258
 
232
- `list_simulators`, `screenshot`, `record_video`, `stream_video`, `open_url`, `install_app`, `launch_app`, `terminate_app`, `uninstall_app`, `button`, `gesture`
259
+ ### `type_text` policy
233
260
 
234
- ### macOS / System Only (4)
261
+ `type_text` accepts exactly one input source: `text`, `stdinText`, or `file`.
235
262
 
236
- `list_apps`, `menu_action`, `get_focused_app`, `clipboard`
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
- ### Utility (2)
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
- **Simulator app accessibility quickstart (inside app UI):**
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
- sim_describe_ui({ udid: "..." })
251
- sim_search_ui({ udid: "...", query: "Login" })
279
+ analyze_ui({ udid: "..." })
280
+ query_ui({ udid: "...", query: "Login" })
252
281
 
253
282
  // 3) Interact by accessibility identifier/label
254
- sim_tap({ udid: "...", id: "login-button" })
283
+ tap({ udid: "...", id: "login-button" })
255
284
 
256
285
  // Optional: include Simulator chrome/system UI in selector lookup
257
- sim_tap({ udid: "...", label: "Home", all: true })
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
- mac_screenshot_app({ bundleId: "com.apple.Safari" })
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"}
@@ -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,GAC/N,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,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,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"}
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"}