@mobileaidev/ai-app-bridge 0.2.6 → 0.2.8
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.md +85 -65
- package/bin/ai-app-bridge.js +561 -465
- package/bin/mcp-server.js +755 -741
- package/package.json +7 -6
- package/skills/ai-app-bridge-use/SKILL.md +183 -0
- package/skills/ai-app-bridge-use/agents/openai.yaml +4 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mobileaidev/ai-app-bridge",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.8",
|
|
4
4
|
"description": "Desktop CLI and MCP server for AI App Bridge.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -15,11 +15,12 @@
|
|
|
15
15
|
"ai-app-bridge": "bin/ai-app-bridge.js",
|
|
16
16
|
"ai-app-bridge-mcp": "bin/mcp-server.js"
|
|
17
17
|
},
|
|
18
|
-
"files": [
|
|
19
|
-
"bin/ai-app-bridge.js",
|
|
20
|
-
"bin/mcp-server.js",
|
|
21
|
-
"
|
|
22
|
-
|
|
18
|
+
"files": [
|
|
19
|
+
"bin/ai-app-bridge.js",
|
|
20
|
+
"bin/mcp-server.js",
|
|
21
|
+
"skills/ai-app-bridge-use",
|
|
22
|
+
"README.md"
|
|
23
|
+
],
|
|
23
24
|
"scripts": {
|
|
24
25
|
"check": "node -c bin/ai-app-bridge.js && node -c bin/mcp-server.js && node --test",
|
|
25
26
|
"test": "node --test"
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ai-app-bridge-use
|
|
3
|
+
description: 使用 AI App Bridge MCP 观察、操作、验证 Android 或 Flutter 应用。Codex 需要读取 app UI 内容、截图、View tree、Flutter widget、WebView DOM、日志、网络请求、状态,或通过 ai-app-bridge-mcp 执行 Android app 操作时触发;必须在模型思考和规划下一步期间冻结 app,只在读取内容或执行操作前短暂解冻,并在全部任务结束前解冻 app。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# AI App Bridge Use
|
|
7
|
+
|
|
8
|
+
## MCP 安装
|
|
9
|
+
|
|
10
|
+
使用前先确认 AI App Bridge MCP server 已安装并配置。如果当前会话里已经有 `ai-app-bridge` MCP 工具,直接进入“冻结节奏”。
|
|
11
|
+
|
|
12
|
+
安装桌面 MCP 包:
|
|
13
|
+
|
|
14
|
+
```bash
|
|
15
|
+
npm install -g @mobileaidev/ai-app-bridge
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
把 MCP server 加到用户的 agent 配置里。
|
|
19
|
+
|
|
20
|
+
macOS / Linux:
|
|
21
|
+
|
|
22
|
+
```json
|
|
23
|
+
{
|
|
24
|
+
"mcpServers": {
|
|
25
|
+
"ai-app-bridge": {
|
|
26
|
+
"command": "ai-app-bridge-mcp"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Windows:
|
|
33
|
+
|
|
34
|
+
```json
|
|
35
|
+
{
|
|
36
|
+
"mcpServers": {
|
|
37
|
+
"ai-app-bridge": {
|
|
38
|
+
"command": "cmd",
|
|
39
|
+
"args": ["/c", "ai-app-bridge-mcp"]
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
配置后重启或刷新 agent 的 MCP session。第一次使用时先调用 `capabilities`,确认 compact surface 里有 `run`、`freeze-app` 和 `thaw-app`。
|
|
46
|
+
|
|
47
|
+
## 冻结节奏
|
|
48
|
+
|
|
49
|
+
核心规则:**模型思考、分析证据、规划下一步期间,app 必须保持冻结;全部任务结束前,app 必须恢复解冻。**
|
|
50
|
+
|
|
51
|
+
每一轮都按这个循环执行:
|
|
52
|
+
|
|
53
|
+
1. 准备读取 app 内容或执行 app 操作前,调用 `thaw-app`。
|
|
54
|
+
2. 立即执行需要 app 运行的 MCP 命令,例如读取 `tree`、截图、等待文本、点击、输入、滚动、抓取 WebView 网络等。
|
|
55
|
+
3. 一旦拿到本轮需要的证据或动作结果,立即调用 `freeze-app`。
|
|
56
|
+
4. 在 app 已冻结的状态下,再分析证据、判断是否成功、规划下一步。
|
|
57
|
+
5. 下一轮真正要读内容或操作 app 时,再次 `thaw-app`。
|
|
58
|
+
6. 当确认整个用户任务已经完成、准备给用户最终回复前,最后调用一次 `thaw-app`,不要把 app 留在冻结状态。
|
|
59
|
+
|
|
60
|
+
换句话说,app 只在“采集证据/执行动作”的短窗口内运行;模型停下来思考时,app 应该已经被冻结;任务结束交还给用户前,app 应该已经解冻。
|
|
61
|
+
|
|
62
|
+
## 状态变化校验
|
|
63
|
+
|
|
64
|
+
对任何会改变可见界面的操作,例如打开/关闭面板、关闭弹窗、切换页面、点击 tab、进入详情页、展开抽屉、点击按钮后读取内容,不能只依赖 `uia-tree` 或 `tree` 判断成功。
|
|
65
|
+
|
|
66
|
+
操作后必须同时采集:
|
|
67
|
+
|
|
68
|
+
1. `screenshot`
|
|
69
|
+
2. `uia-tree` 或 `tree`
|
|
70
|
+
|
|
71
|
+
只有当截图中的可见画面与 UI tree 的关键节点一致时,才能认为操作成功。
|
|
72
|
+
|
|
73
|
+
如果两者冲突:
|
|
74
|
+
|
|
75
|
+
- 以截图作为当前真实可见界面的优先证据。
|
|
76
|
+
- 将 UI tree 视为可能存在缓存、残留节点、不可见层或过期节点。
|
|
77
|
+
- 重新点击、调整坐标、等待后再采集。
|
|
78
|
+
- 不得基于冲突证据向用户报告结论。
|
|
79
|
+
|
|
80
|
+
禁止仅凭 UI tree 中存在目标文本,就断言目标面板、弹窗、页面或 tab 已经打开;必须确认该文本在截图中对应的可见区域也存在,或截图中存在等价的可见状态标志。
|
|
81
|
+
|
|
82
|
+
例如打开评论面板后,必须确认:
|
|
83
|
+
|
|
84
|
+
- 截图中实际出现评论面板、评论标题或评论列表。
|
|
85
|
+
- UI tree 中也出现 `评论` 标题、评论列表节点或评论输入栏。
|
|
86
|
+
- 两者内容对应同一个界面。
|
|
87
|
+
|
|
88
|
+
## 推荐批处理
|
|
89
|
+
|
|
90
|
+
优先用 `batch` 把“解冻 -> 采集/操作 -> 冻结”放进同一个 MCP 调用,避免中间留下 app 继续播放或动画变化。
|
|
91
|
+
|
|
92
|
+
读取当前屏幕:
|
|
93
|
+
|
|
94
|
+
```json
|
|
95
|
+
{
|
|
96
|
+
"command": "batch",
|
|
97
|
+
"arguments": {
|
|
98
|
+
"defaults": {
|
|
99
|
+
"packageName": "com.example.app"
|
|
100
|
+
},
|
|
101
|
+
"steps": [
|
|
102
|
+
{ "id": "thaw", "command": "thaw-app" },
|
|
103
|
+
{ "id": "tree", "command": "tree", "arguments": { "compact": true, "visibleOnly": true } },
|
|
104
|
+
{ "id": "freeze", "command": "freeze-app" }
|
|
105
|
+
],
|
|
106
|
+
"stopOnError": true,
|
|
107
|
+
"includeRaw": true
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
执行点击并读取结果:
|
|
113
|
+
|
|
114
|
+
```json
|
|
115
|
+
{
|
|
116
|
+
"command": "batch",
|
|
117
|
+
"arguments": {
|
|
118
|
+
"defaults": {
|
|
119
|
+
"packageName": "com.example.app"
|
|
120
|
+
},
|
|
121
|
+
"steps": [
|
|
122
|
+
{ "id": "thaw", "command": "thaw-app" },
|
|
123
|
+
{ "id": "tap", "command": "tap-text", "arguments": { "targetText": "继续" } },
|
|
124
|
+
{ "id": "screenshot-after", "command": "screenshot" },
|
|
125
|
+
{ "id": "tree-after", "command": "tree", "arguments": { "compact": true, "visibleOnly": true } },
|
|
126
|
+
{ "id": "freeze", "command": "freeze-app" }
|
|
127
|
+
],
|
|
128
|
+
"stopOnError": true,
|
|
129
|
+
"includeRaw": true
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
任务结束前恢复 app:
|
|
135
|
+
|
|
136
|
+
```json
|
|
137
|
+
{
|
|
138
|
+
"command": "thaw-app",
|
|
139
|
+
"packageName": "com.example.app"
|
|
140
|
+
}
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## 单步命令模式
|
|
144
|
+
|
|
145
|
+
如果不能用 `batch`,也必须手动保持同样顺序:
|
|
146
|
+
|
|
147
|
+
```json
|
|
148
|
+
{ "command": "thaw-app", "packageName": "com.example.app" }
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
```json
|
|
152
|
+
{ "command": "tree", "packageName": "com.example.app", "arguments": { "compact": true, "visibleOnly": true } }
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
```json
|
|
156
|
+
{ "command": "freeze-app", "packageName": "com.example.app" }
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
之后再开始思考和规划下一步。全部任务完成后,再执行一次:
|
|
160
|
+
|
|
161
|
+
```json
|
|
162
|
+
{ "command": "thaw-app", "packageName": "com.example.app" }
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
## 什么时候不要提前冻结
|
|
166
|
+
|
|
167
|
+
不要在一个需要 app 持续运行的 MCP 命令还没完成前冻结,例如:
|
|
168
|
+
|
|
169
|
+
- `wait-text`
|
|
170
|
+
- 点击、输入、滚动、启动 Activity
|
|
171
|
+
- 带 `durationMs` 的 `webview-network` / `webview-console`
|
|
172
|
+
- `logcat --follow`
|
|
173
|
+
- 安装、授权、权限弹窗处理
|
|
174
|
+
|
|
175
|
+
这些命令执行前先解冻,命令返回并拿到结果后立刻冻结,然后再思考。等全部任务完成并准备结束时,再解冻 app。
|
|
176
|
+
|
|
177
|
+
## 失败处理
|
|
178
|
+
|
|
179
|
+
如果 `freeze-app` 失败,继续用 MCP 完成观察和操作,但在结果里说明限制。常见原因包括:app 不是 debuggable、目标进程不存在、`run-as` 不可用、系统已经杀掉进程。
|
|
180
|
+
|
|
181
|
+
如果 app 已经被冻结,而 MCP 读取内容超时或无法返回数据,先调用 `thaw-app`,再重试读取;不要在冻结状态下反复读取 bridge 数据。
|
|
182
|
+
|
|
183
|
+
如果最终 `thaw-app` 失败,也要在给用户的最终回复里说明 app 可能仍处于冻结状态,以及失败原因。
|