[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-81515":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":15,"subscribersCount":15,"size":15,"stars1d":15,"stars7d":16,"stars30d":16,"stars90d":15,"forks30d":15,"starsTrendScore":15,"compositeScore":17,"rankGlobal":10,"rankLanguage":10,"license":18,"archived":19,"fork":19,"defaultBranch":20,"hasWiki":21,"hasPages":19,"topics":22,"createdAt":10,"pushedAt":10,"updatedAt":23,"readmeContent":24,"aiSummary":25,"trendingCount":15,"starSnapshotCount":15,"syncStatus":26,"lastSyncTime":27,"discoverSource":28},81515,"app-test-control","dj931567261\u002Fapp-test-control","dj931567261","通过ai控制 app 以便自动化测试和修复\u002F复现 bug","",null,"TypeScript",30,4,27,0,3,43.9,"MIT License",false,"main",true,[],"2026-06-12 04:01:34","# app_test_ctrl\n\n[![License: MIT](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FLicense-MIT-yellow.svg)](.\u002FLICENSE)\n[![Node](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fnode-%E2%89%A520-brightgreen)](https:\u002F\u002Fnodejs.org\u002F)\n\nAI 驱动的移动 App 自动化测试平台（MCP-native）。\n\n让 **任意 MCP-aware AI 编程客户端**（Claude Code \u002F Cursor \u002F Claude Desktop \u002F Codex CLI \u002F opencode…）在你的 Android \u002F iOS Simulator\u002F真机 上：\n- **DevTest**：读 `git diff` → 推断改了哪个页面 → 跑一遍 → 出报告（\"我刚改的登录能用吗\"）\n- **QA**：自由探索 → 用状态图避免死循环 → 抓 crash → 出 bug 列表\n- **Minimize**：12 步触发的崩溃 → 用 delta-debug 压成 3 步并验证\n- **Smart-QA**：一句 \"帮我看下有没有 bug\" → 读 PRD \u002F 静态推断业务流 → 自动跑 + 比对预期\n\n通过 **5 个 MCP**（log + report + ui + analyzer + code-analyzer）+ **4 个 Skill**（devtest \u002F qa \u002F minimize \u002F smart-qa）+ 上游 mobile-mcp 组合实现。MCP 协议本身跨客户端通用，4 个 Skill 文件 ~95% 中立（核心是 MCP tool 调用 + 自然语言指令）。\n\n- **方案与决策**：[PLAN.md](.\u002FPLAN.md)\n- **实施进度**：[PROGRESS.md](.\u002FPROGRESS.md)\n- **🤖 让 AI 帮你装**：[docs\u002FINSTALL_FOR_AI.md](.\u002Fdocs\u002FINSTALL_FOR_AI.md)（整段粘进你的 AI 聊天框，AI 接力跑完安装）\n- **安装与接入**：[docs\u002FSETUP.md](.\u002Fdocs\u002FSETUP.md)\n- **跨客户端支持**：[docs\u002FCLIENTS.md](.\u002Fdocs\u002FCLIENTS.md)（Claude Code \u002F Cursor \u002F Claude Desktop \u002F Codex CLI \u002F opencode）\n- **架构总览**：[docs\u002FARCHITECTURE.md](.\u002Fdocs\u002FARCHITECTURE.md)\n\n## 组件\n\n| 路径 | 角色 | 状态 |\n|---|---|---|\n| `mcp-servers\u002Flog-mcp\u002F` | Android logcat \u002F ANR \u002F tombstone + iOS log stream \u002F .ips | 14 工具 |\n| `mcp-servers\u002Freport-mcp\u002F` | Session + Markdown\u002FHTML 报告 + QA 状态图 | 12 工具 |\n| `mcp-servers\u002Fui-mcp\u002F` | uiautomator 层级查询 + 智能点击（Android） | 7 工具 |\n| `mcp-servers\u002Fanalyzer-mcp\u002F` | crash signature \u002F dedup \u002F 路径精简 \u002F .ips 解析 | 6 工具 |\n| `mcp-servers\u002Fcode-analyzer-mcp\u002F` | 静态扫码：平台识别 + PRD 发现 + 页面\u002F路由\u002FAPI 抽取 | 4 工具 |\n| `skills\u002Fdevtest\u002F` | 开发自测 Agent（git diff → 验证） | Skill 源 |\n| `skills\u002Fqa\u002F` | QA 自动探索 Agent（状态图 + dedup） | Skill 源 |\n| `skills\u002Fminimize\u002F` | 复现路径精简（delta-debug + replay） | Skill 源 |\n| `skills\u002Fsmart-qa\u002F` | 一句话 → 自动跑业务流（PRD + 静态推断） | Skill 源 |\n\n`mobile-mcp` 直接使用上游 `@mobilenext\u002Fmobile-mcp`。\n\n### Agent Skills 介绍\n\n- **devtest (开发自测)**：\n  - **场景**：“我刚改的登录能跑通吗？”\n  - **流程**：读取 `git diff` 识别修改的文件 -> 静态分析受影响的 UI 页面 -> 自动生成 Happy Path 和 Edge Case 测试计划 -> 执行测试（截图+防崩溃监控） -> 生成测试报告。\n- **qa (自动探索测试)**：\n  - **场景**：“自由探索一下这个 app，看看有没有崩的地方。”\n  - **流程**：冷启动 App -> 自动获取页面元素并依据状态图策略（优先点击未探索元素）进行深度探索 -> 遇到崩溃自动记录、重启并继续探索 -> 探索结束后对 Crash 进行去重分析。\n- **minimize (复现路径精简)**：\n  - **场景**：“这个崩溃步骤有 12 步，帮我精简一下。”\n  - **流程**：基于 Delta-Debugging (ddmin) 二分算法，通过自动重启 App 并 Replay 部分步骤组合，找到复现该崩溃特征指纹的最短路径（例如将 12 步压缩至 3 步）。\n- **smart-qa (智能需求对齐测试)**：\n  - **场景**：“对照 PRD 帮我看看这个项目有没有 bug。”\n  - **流程**：通过 `code-analyzer` 静态推断业务流并读取 PRD -> 列出测试流供用户确认 -> 执行测试并比对实际 UI 表现与 PRD 预期是否一致（如邮箱格式未校验、功能未实现等）。\n- **测试报告与可视化看板**：\n  - **结果呈现**：每次自测或自动探索完成后，不仅会保存步骤截图与崩溃日志，还会自动生成单文件交互式的 HTML 报告。\n  - **本地看板网页**：通过在终端执行 `npm run sessions`，会启动一个本地网页服务（默认 `http:\u002F\u002Flocalhost:7321`），您可以在浏览器里极佳地查阅、过滤和对比所有历史测试 session 的执行结果和截图。\n\n## 快速开始\n\n**🤖 懒人路径**：直接把下面整段粘进你的 AI 聊天框（Claude Code \u002F Cursor \u002F Codex \u002F Claude Desktop 都可以），说\"按这个指引帮我装好 app-test-ctrl\"，AI 会一步步带你跑完。\n\n```\n帮我根据https:\u002F\u002Fgithub.com\u002Fdj931567261\u002Fapp-test-control\u002Fblob\u002Fmain\u002Fdocs\u002FINSTALL_FOR_AI.md 文档安装app-test-ctrl\n```\n\n**手动路径**：\n\n```bash\nnpm install\nnpm run build\nnpm run prewarm                                # 预拉 mobile-mcp 到 npx 缓存（避免首次启动卡）\n```\n\n然后按你的客户端选一条分支（详见 [docs\u002FCLIENTS.md](.\u002Fdocs\u002FCLIENTS.md)）：\n\n```bash\n# Claude Code（默认）\nnpm run setup                                  # 写 .mcp.json\n# .claude\u002Fskills\u002F 已随仓库分发，开箱即用\n\n# Cursor\nnpm run setup -- --client cursor               # 写 .cursor\u002Fmcp.json\nnpm run install:skills -- --client cursor      # 写 .cursor\u002Frules\u002F*.mdc\n\n# Codex CLI\nnpm run setup -- --client codex                # 打印 TOML 片段 → 粘到 ~\u002F.codex\u002Fconfig.toml\nnpm run install:skills -- --client codex       # 复制到 ~\u002F.codex\u002Fskills\u002F + 项目根 AGENTS.md\n\n# Claude Desktop\nnpm run setup -- --client claude-desktop       # 打印 JSON 片段 → 粘到全局 config\nnpm run install:skills -- --client claude-desktop  # 列出 skill 文件路径供手动粘贴\n\n# opencode\nnpm run setup -- --client opencode             # 合并配置到全局 ~\u002F.config\u002Fopencode\u002Fopencode.json\nnpm run install:skills -- --client opencode    # 安装技能（检测并复用项目内 .claude\u002Fskills\u002F，若缺失则自动写入全局）\n\n# 卸载清理（以 opencode 为例，支持各客户端）\nnpm run uninstall -- --client opencode         # 清除对应客户端的 MCP 节点和 Skill 文件\n\n# 最后统一自检\nnpm run doctor                                 # 检查 Node\u002Fadb\u002Fxcrun\u002F构建\u002F配置\u002Fskills\n\n# 查看历史 session（本地浏览面板）\nnpm run sessions                               # 默认 http:\u002F\u002Flocalhost:7321\u002F\nnpm run sessions -- --open                     # 启动后自动打开浏览器\nnpm run sessions -- --port 7400 --workspace .\u002Fother\u002Fsessions\n```\n\n冒烟测试和故障排查见 [docs\u002FSETUP.md](.\u002Fdocs\u002FSETUP.md)。\n\n## 怎么用（典型对话）\n\n```\n用户：测一下我刚改的登录功能\n   ↓\nClaude 触发 devtest skill：\n   1. 读 git diff → 看到 LoginActivity.kt 改了\n   2. 推断影响：登录页面\n   3. 列测试计划：手机号正常 \u002F 错误 \u002F 网络异常\n   4. 起 session → 抓 logcat → 启动 app\n   5. ui.tap_element(identifier=btn) → 走完每一步\n   6. 抓不到 crash → finalize(passed)\n   ↓\n✅ 登录功能测试 (8\u002F8, 23s, 0 crash)\n报告: workspace\u002Fsessions\u002F...\u002Freport.md  +  report.html\n```\n\n```\n用户：自动探索一下 jko.dns.qwn.dfgt\n   ↓\nClaude 触发 qa skill：\n   1. dump_hierarchy → page_fingerprint → graph_record_page\n   2. graph_pick_next_unseen → 挑没点过的元素\n   3. tap → 重抓 → graph_record_edge\n   4. 检测到 crash → record_crash + relaunch + 继续\n   5. analyzer.dedup → 7 次 crash → 3 个独立 bug\n   ↓\n🐛 #1 NullPointerException @ LoginActivity.onClick (触发 5 次)\n🐛 #2 ANR after rotation (1 次)\n🐛 #3 Crash on empty payment (1 次)\n报告: workspace\u002Fsessions\u002F...\u002Freport.md\n```\n\n```\n用户：帮我看下 lend_pal 有没有 bug\n   ↓\nClaude 触发 smart-qa skill：\n   1. code-analyzer.analyze_project → 识别 Flutter + 12 页 + 22 路由\n   2. 找到 requirements.md（PRD）→ 读\n   3. 综合 PRD + 代码 → 列出 5 个业务流，让用户回编号（如 \"1,3,5\" 或 \"all\"）\n   4. 用户选 3 条 → 走 devtest skill 逐条执行\n   5. 0 crash，但发现 6 个 PRD 不一致（邮箱无校验 \u002F Face mock \u002F 等）\n   ↓\n🔎 lend_pal: 0 crash, 6 UX\u002FPRD 不一致\n报告: workspace\u002Fsessions\u002F...\u002Freport.md\n```\n\n## 报告示例截图\n\n![smart-qa-lendpal 报告示例1](.\u002Fdocs\u002Fimages\u002Freport-main.png)\n\n![smart-qa-lendpal 报告示例](.\u002Fdocs\u002Fimages\u002Freport-example.png)\n\n> 来源：`workspace\u002Fsessions\u002F2026-05-15_181035_smart-qa-lendpal\u002Freport.html`（smart-qa 一句话探索 lend_pal Flutter app，4 flows × 0 crash × 34m55s）\n\n## 依赖\n\n- Node.js ≥ 20\n- npm ≥ 10\n- **Android**：SDK Platform Tools（提供 `adb`）\n- **iOS（Simulator）**：Xcode 命令行工具（提供 `xcrun simctl`）\n- 任一 MCP-aware AI 编程客户端：Claude Code \u002F Cursor \u002F Claude Desktop \u002F Codex CLI \u002F opencode 等\n\n## 仓库结构\n\n```\n.\n├── PLAN.md \u002F PROGRESS.md \u002F README.md\n├── .mcp.json.example         # MCP 注册样板（用 ${PROJECT_ROOT} 模板，被 setup 脚本展开）\n├── config.yaml               # 设备\u002F包名\u002F阈值\n├── docs\u002F                     # 详细文档（含 CLIENTS.md 跨客户端指南）\n├── mcp-servers\u002F              # 五个自研 MCP（TypeScript workspace）\n├── skills\u002F                   # Skill 源文件（canonical，跨客户端通用）\n├── scripts\u002F                  # setup-mcp \u002F install-skills \u002F prewarm \u002F doctor\n├── test-plans\u002F               # 用户测试用例 (markdown)\n└── workspace\u002Fsessions\u002F       # 运行时数据（每次跑一个目录）\n```\n\n## 致谢\n\n[![LINUXDO](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F%E7%A4%BE%E5%8C%BA-LINUXDO-0086c9?style=for-the-badge&labelColor=555555)](https:\u002F\u002Flinux.do)\n\n感谢 **`linux.do`** 社区的讨论、分享与支持。这个项目在方法论整理、实践思路和持续迭代上，都受益于社区氛围与成员交流。\n\n[mobile-mcp](https:\u002F\u002Fgithub.com\u002Fmobile-next\u002Fmobile-mcp)  — 感谢mobile-mcp，就是受到这个mcp的启发才开始做的，并提供了很多思路。\n\n## License\n\n[MIT](.\u002FLICENSE) — 自由使用、修改、分发；保留版权与免责声明即可。\n","app-test-control 是一个通过 AI 控制移动应用以实现自动化测试和修复\u002F复现 bug 的平台。其核心功能包括基于代码变更的自测、自由探索式的质量保证、崩溃路径精简以及智能需求对齐测试，能够自动识别修改后的页面并生成相应的测试计划，同时利用状态图避免死循环，并通过 delta-debugging 技术压缩崩溃复现步骤。该工具特别适合软件开发中的持续集成环境，可用于提高开发人员的自测效率及 QA 团队发现潜在问题的能力。项目采用 TypeScript 编写，支持跨客户端使用，确保了良好的扩展性和兼容性。",2,"2026-06-11 04:05:22","CREATED_QUERY"]