mcpField
T
tapp

tapp

本地服务
github.com/aarwitz开发工具24 天前更新

关于 tapp

Tapp 面向编码 Agent 和团队,用于检查并测试自有的 iOS、Android 和 Web 应用,再将审阅过的用户流程转为确定性的 CI 检查。它结合屏幕证据、探索测试、可重放流程以及通过、失败或无法判定的门禁。

主要功能

  1. 01检查屏幕并捕获截图
  2. 02探索应用以发现技术故障
  3. 03记录用户流程并重放测试
  4. 04运行确定性 CI 门禁
  5. 05支持 iOS、Android、Web 和 Windows UI

适用场景

  1. 01在模拟器或浏览器中验证 UI 改动
  2. 02探索自有应用并审阅证据
  3. 03在 CI 中重放关键流程

MCP 相关

可选的 stdio MCP 服务向 MCP 客户端提供交互式应用会话和内嵌截图。Agent 可在应用保持打开时点击、检查无障碍树、输入内容并记录用户流程。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

mcp.json · 通用配置
{
"mcpServers": {
"aarwitz-tapp": {
"command": "npx",
"args": [
"-y",
"@aarwitz/tapp"
]
}
}
}
启动命令npx -y @aarwitz/tapp

本地服务需要在你的电脑上安装运行环境(如 Node.js 18+)。各客户端的配置文件位置不同,请参考客户端文档。

安装包
npm@aarwitz/tapp0.33.0

工具

31

收录的工具列表 · 更新于 4 天前

参数类型必填说明
bodystring否发生了什么、你预期发生什么,以及确切的命令或工具调用。请勿提供机密信息或私人源代码。
typeenum否默认:错误bug | idea | question
titlestring是简短、具体的标题
submitboolean否立即使用 gh 提交 issue(需要用户同意)。默认值 false = 仅创建草稿。
capturestring否用于引用的捕获 ID,'latest'(默认)或 'none'

详细介绍

Tapp

CI npm npm 下载量 许可证 Agent 技能 VS Code 扩展 在 Cursor 中安装 VS Code MCP

**Tapp 让编码 Agent 能在真实的 iOS、Android 和 Web 界面上验证 UI 更改,再将经过审核的证据转化为确定性的 CI 检查。**它可以检查并操作屏幕、探索技术故障,并将重要操作流程保存为可重放的测试。

探索过程会报告发现、覆盖范围、证据和局限。只有连接到代码仓库的门禁才会返回 pass、fail 或 inconclusive。Tapp 不会将自主爬取结果转化为主观的“可以发布”评分。

一次真实的 Tapp 定向运行从源代码出发,经观察到的路由抵达 Update Profile

**真实证据,而非模拟:**这次公开的 DemoApp 运行通过三个观察到的路由操作,抵达了指定的 iOS 界面。观看 45 秒的自主探索,或查看完整的脱敏 Web 证据报告。

支持的目标:

目标应用运行环境
iOS在 macOS 上使用 Xcode 的模拟器;通过 XCUITest 和辅助功能进行操作
Android已连接的模拟器或设备,需使用 adb;通过 UIAutomator 进行操作
Web在 Playwright Chromium 中运行的自有浏览器应用
Windows 桌面通过 Windows UI Automation 测试 WPF、WinForms 和 WinUI 应用——早期运行需通过试点项目进行设置

安装好前置条件后,Windows 可承载 Android 和 Web 测试,也是 Windows 桌面目标的运行平台。

将 Tapp 交给编码 Agent

完成设置后,完整的用户提示词是:

使用 Tapp 测试此应用。

官方 Skill 会教 Agent 选择最小且有用的操作、处理包含多个应用目标的代码库、检查视觉证据,并将探索观察结果与门禁判定分开。

Claude Code、Codex、Cursor、Copilot 和其他 Agent Skills 客户端(推荐):

npx -y skills add aarwitz/tapp --skill tapp

这会将开源 Agent Skills 工作流安装到当前项目,并允许 Agent 直接运行 npm CLI。检查、针对性取证、自主探索、确定性回放和门禁都不需要 MCP 服务、插件、账号、API 密钥、全局 Tapp 安装或粘贴提示词代码块。添加 -g 可为当前用户安装,添加 --agent claude-code、--agent codex 等选择器可限定客户端。从应用代码库启动或重启 Agent,然后使用上面的简短提示词。

Claude Code — 可选的增强 Skill 和 MCP 工具:

claude plugin marketplace add aarwitz/tapp
claude plugin install tapp@tapp

该插件捆绑了相同的 tapp Agent Skill,以及与之匹配、由 npm 提供支持的 MCP 服务。当你需要内嵌截图结果,或需要 Agent 在一个持久会话中交互式点击、输入并记录任意多步流程时,可添加此插件。核心 Skill 到 CLI 的工作流并不需要它。

**实时网站、生产环境或非你所有的网站:**Agent 会使用 tapp explore --read-only / tapp_explore {readOnly:true},渲染并读取页面,但绝不点击、输入或提交。探索仅适用于你拥有的应用和环境。

**不使用 Agent 集成:**在应用代码库中用一行命令直接运行 npm 包:

npx -y @aarwitz/tapp@latest init . --explore

**VS Code:**从 Marketplace 安装 Tapp。它会为 Copilot 提供相同的跨平台 Agent Skill,以及专用的 iOS 模拟器工具和自动刷新的截图预览。该预览不是嵌入式模拟器,也不是视频流。Android 和 Web 仍可通过 Skill 的 CLI/MCP 工作流使用。

**团队:**Tapp 核心部分采用 MIT 许可。现开放小规模付费创始试点,提供代码库实操入门、重要流程设置,以及在你控制的基础设施中集成 CI。 申请时无需分享私密数据。

you:    "Add a logout button to the settings screen"
agent:  *writes the Swift*
agent:  *tapp: finds Settings in source, follows its previously observed route, screenshots it*
agent:  "Done — and here it is working on the simulator: [screenshot]"

npm CLI 快速入门

要求:Node ≥ 18。iOS 需要 macOS + Xcode;Android 需要 adb 和已连接的模拟器/设备(若 Tapp 构建源代码而非安装现有 APK,还需要 JDK 17);Web 需要 Playwright + Chromium。tapp doctor 会分别报告这些要求。

在应用代码库中,先让 Tapp 建立一次基准,然后在后续检查中使用最小操作:

npx -y @aarwitz/tapp@latest init . --explore # first run: detect/build, explore, and ground .tapp/ui-map.json
npx -y @aarwitz/tapp@latest look            # one current screen + screenshot
npx -y @aarwitz/tapp@latest explore --goal "Save storefront settings visible above keyboard" # source + observed-route fast path
npx -y @aarwitz/tapp@latest explore         # later broad exploration (observation, not a gate)

explore --goal 中的 Source 会告知请求的 UI 可能位于何处;只有 .tapp/ui-map.json 中已经观察到的路由才允许导航。如果全新代码库中还没有此类路由,Tapp 会返回 Source 证据,而不是在应用中猜测探索路径。

Claude Code 可以使用文件读取工具读取已保存的图像;Codex 可以使用 view_image 打开它。Agent 应说明截图能够证明什么,原样转达探索结果(这是观察结果,而非合并决策——tapp ci 才负责门禁),并附上 HTML 证据报告链接。此工作流不需要 Tapp 服务、账号、全局安装、API 密钥或 bundle id。仍需安装平台运行时;代码库入门流程可能会在 .tapp/ 下写入经过审核的配置。

产品、可执行文件和包名末级部分都叫 Tapp:npm 以 @aarwitz/tapp 发布,而安装后的命令仍为 tapp。

若要启动受维护的发布基础设施,请先预览代码库模型和基于实际情况制定的计划,再让 Tapp 写入任何内容:

npx -y @aarwitz/tapp@latest init . --dry-run --json-out /tmp/tapp-init.json
# Build/start the detected web target, ground the first UI Map, then stop it.
npx -y @aarwitz/tapp@latest init . --explore --platform web
# Or build/install the detected Xcode target, ground the map, and persist the validated scheme.
npx -y @aarwitz/tapp@latest init . --explore --platform ios --target .
# Or connect to an already-running owned URL:
npx -y @aarwitz/tapp@latest init . --explore --platform web --url http://127.0.0.1:4173
# If the app has roles/accounts, bind names once; values stay in local/CI secrets.
npx -y @aarwitz/tapp@latest plan actor set alice . --role member --session isolated \
  --credential email=ALICE_EMAIL --credential password=ALICE_PASSWORD
# Review-only path: tapp init . → tapp plan show → tapp plan review --approve ...

# After approved drafts replay and are promoted, establish the selected target's baseline
# through the ordinary full gate, then generate the reviewable GitHub workflow.
npx -y @aarwitz/tapp@latest ci baseline . --platform web
npx -y @aarwitz/tapp@latest ci install .

Actor 设置不会覆盖现有 Actor。只有在打算替换该 Actor 已审核的角色、会话、配置或凭据绑定时,才使用 --replace 重复运行 actor set。 在包含多个应用的仓库中(例如 iOS 加 Web),如果没有明确指定目标,tapp init . --explore 不会按照检测顺序猜测目标,即使已记录过先前的选择也是如此。在终端中交互时,会显示编号选择器;非交互式 CLI 会打印准确的目标选择命令,而 MCP 还会返回结构化选项。在作出选择之前,两者都不会构建或写入文件。选择目标后,模型会保留所有检测到的目标,并将该选择记录为下次直接运行 tapp explore 时的默认目标;显式运行 init --explore 仍会询问,因为它用于引导设置或刷新。仅属于未选目标的设置缺失会作为信息显示,不会被视为本次选中目标运行失败。

基线命令只有在探索完成且所有选定的确定性测试套件均明确通过后才会写入文件。它会将基线存储在 .tapp/baselines/<platform>/<target-id>.json;生成的工作流会使用该精确目标标识,因此同一平台上的两个应用绝不会共用基线。ci install 会写入 .github/workflows/tapp.yml 和 .tapp/ci.json,遇到未解决的构建配置或现有文件冲突时会拒绝操作,并且绝不会提交、推送、启用分支保护或创建 GitHub 资源。投入生产前,请检查生成的 Tapp 发布版本引用,并将其固定到不可变的提交 SHA。

look 和 explore 接受仓库目录、path/to/App.app、bundle id,或不指定目标(自动检测仓库或已安装应用):

npx -y @aarwitz/tapp@latest look [target]         # launch the app → screen summary + screenshot file
npx -y @aarwitz/tapp@latest look [target] --tree  # + the accessibility tree of the current screen
npx -y @aarwitz/tapp@latest look                  # no target on iOS: the booted simulator as it is right now

在 iOS 上,look --tree 会检查已安装的应用,绝不会构建、卸载或替换它。如果未指定目标,它会使用仓库中记录的 iOS 目标,或唯一已安装的应用。如果目标不明确,它会列出已安装的应用供你选择。传入 bundle id 可检查特定的沙盒构建;如果你打算替换它,请运行 tapp_build(MCP)或 init . --explore。

iOS Flow 证据在通过和失败的回放中都会包含 flow-final.png,并在失败步骤处附带 flow-failure-N.png,以及日志、JSON 报告和 XCTest 结果包。

Web:npx -y @aarwitz/tapp@latest explore http://localhost:3000 (一次性设置: npm i -g playwright && npx playwright install chromium)。添加 --watch 可打开 Tapp 控制的隔离 Chromium 窗口,并通过页面上的指针/操作标签跟随点击。Tapp 会从保存的证据截图中隐藏该监视界面,也不会自动化你个人或默认的浏览器配置文件。

针对 Web 的聚焦检查会短暂等待加载状态稳定。如果同意或位置模态框阻挡屏幕,请关闭它,并在同一次仅使用程序包的调用中等待你关心的内容:

npx -y @aarwitz/tapp@latest look https://example.com --tap "Not now" --wait-for "Dashboard"
npx -y @aarwitz/tapp@latest look https://example.com --tree --tap "Not now" --wait-for "Dashboard" --json

Android:

npx -y @aarwitz/tapp@latest explore path/to/app-debug.apk --platform android --app-id com.acme.app
npx -y @aarwitz/tapp@latest look com.acme.app --platform android

将已执行的操作流程转为确定性测试,或者在手动编写测试之前打印完整的 Flow 格式:

npx -y @aarwitz/tapp@latest validate --example           # a complete starter Flow, with the step vocabulary
npx -y @aarwitz/tapp@latest validate .tapp/flows/smoke.yml
npx -y @aarwitz/tapp@latest run .tapp/flows/smoke.yml     # Flows, Tasks, contracts, and Scenarios all replay with `run`

Flow 支持使用 $TEST_EMAIL / $TEST_PASSWORD 的原子 login 步骤;Tapp 的会话录制器会创建该步骤,但不会将凭据值写入仓库。

可选但建议(预先构建测试框架,让首次运行更快):

npx -y @aarwitz/tapp@latest doctor --install   # ~2 min, one time
npx -y @aarwitz/tapp@latest doctor             # verify Xcode / simulators / toolchain
MCP 连接(可选)

MCP 服务增加了 CLI 无法提供的两项功能:截图会直接显示在 Agent 的上下文中(模型能直接看到屏幕),以及交互式会话循环(点击 → 读取树 → 输入,应用在操作之间保持打开)。

Claude Code:

claude mcp add tapp -- npx -y @aarwitz/tapp@latest mcp

Cursor / VS Code(Copilot)——添加到 ~/.cursor/mcp.json(Cursor)或 .vscode/mcp.json(VS Code):

{
  "servers": {
    "tapp": { "type": "stdio", "command": "npx", "args": ["-y", "@aarwitz/tapp@latest", "mcp"] }
  }
}

Codex CLI——添加到 ~/.codex/config.toml:

[mcp_servers.tapp]
command = "npx"
args = ["-y", "@aarwitz/tapp@latest", "mcp"]

**其他任何 MCP 客户端:**stdio 命令 npx -y @aarwitz/tapp@latest mcp。

然后向你的 Agent 提问:

“探索我的应用,告诉我哪里会出问题。” “在模拟器上打开 com.mycompany.app,并截取主屏幕。” “使用 [email protected] 登录,操作到结账页面,并将其录制为可回放测试。”

Agent 获取的内容

工具功能
👁tapp_look查看屏幕 — 当前真实界面:屏幕摘要 + 内嵌截图;tree:true 会添加无障碍树(ID、标签、可交互性)。耗时数秒。
🕹tapp_session交互操作 — 先执行 action:"start",然后执行 tap/type/swipe/back/wait/login(每一步都会返回最新的树),最后执行 "end"。save_flow 会将操作过程保存为可重放的 Flow;draft_flow 会根据目标提出一个 Flow。
🔭tapp_explore自主探索 — 不使用编写好的测试进行探索,返回观察结果 {kind, headline, inconclusive, findingCounts, findings[]}(不提供判定/评分——由确定性门禁进行判定)。readOnly:true 不会点击(适用于生产环境或非你所有的网站);goal:"…" 会通过源码定位指定屏幕,并采用已观察到的最短路径。接受 appBundleId(iOS)、androidAppId(Android)或 url(Web)。
🧭tapp_init导入仓库 — 检测目标;可选地探索真实界面;保存共享 UI Map;构建按证据分类的模型和有依据的发布计划。
✅tapp_plan发布计划生命周期 — show、review(批准/拒绝/延期)、generate、针对真实目标的 validate、显式 promote、支持 PR 的 pr/adopt,以及 actor 设置(角色和环境变量名称,不包含凭据值)。不会静默修改测试。
🔁tapp_run / tapp_validate确定性重放 — 运行或验证已提交的 Flow、可复用 Task、业务级契约或多参与者 Scenario;类型由文件决定。重放时不使用 AI。
🚦tapp_ci基线和 CI 设置 — 保存目标范围内的基线,或生成/安装与 CLI 相同、可供审阅且支持目标识别的工作流。
🗺️tapp_map持久化 UI Map — 构建、检查、合并和比较已观察到的状态、控件、转换、来源信息和覆盖率。
📱tapp_build构建和模拟器管理 — build、install、list_simulators、boot;无需事先知道 iOS 应用的 bundle ID,即可构建该应用。
🩺tapp_doctor / tapp_report / tapp_feedback工具链检查、本项目的录制历史和证据,以及关于 Tapp 本身的问题。

规范的可安装技能:skills/tapp/SKILL.md。完整的底层工具 参考文档:AGENTS.md。两者都包含在 npm 包中;安装 Claude 插件 或 Agent Skill 后,即可发现工作流,无需粘贴说明。 应用模型和导入契约:docs/application-model.md。 桌面端 Coverage 视图读取相同的 .tapp/application-model.json、 .tapp/release-plan.json 和 .tapp/ui-map.json,包括明确的提案审核;它 不会维护单独的产品模型。地图节点会同时标识真实启动入口,以及用于有界变更界面重放的、 按平台区分的确定性导航根节点。

观察可读,判断可信

探索负责观察;门禁负责判断。 探索是自适应的——两次运行可能遍历不同路径——它产生的是观察结果,绝不会给出是否可发布的结论:发现项 + 覆盖范围 + 证据。门禁则是确定性的:相同的证据轨迹、契约和基线始终产生相同的结果——pass、fail 或 inconclusive——决策流程中不包含 LLM。PR 门禁以回归差异(与基线相比的稳定发现签名)为依据,因此它关注的是发生了什么变化,而不是每次运行的路径差异。对于关键用户旅程,已提交的任务和流程可提供稳定的 CI 测试套件:可复用的语义操作、精确断言、基于条件的等待、全新的启动状态、有界超时,以及失败时的证据。我们称之为抗波动,而不是神奇地绝无波动——后端故障、不稳定的测试数据和标识不佳的控件仍可能导致任何 E2E 测试失败。

没有分数,没有模糊的结论。 探索报告确定性的发现项、带有建议性质且有预算上限的控件探测,以及具体的覆盖范围——绝不会给出 0–100 的分数,也不会贴上浅层爬取无法诚实得出的“已就绪/可发布”标签。合并决策只能由门禁作出:依据经审核的契约、已提交的流程/场景以及基线回归。

tapp_explore 像用户一样进行探索——在 iOS/Android 上探索无障碍界面,在 Web 上使用真实浏览器——并检测崩溃、登录失败、无响应的按钮、卡住的加载界面、错误界面、导航循环和死胡同(此外,在 Web 上还会检测未捕获的 JS 异常、失败/5xx 请求、失效链接和资源,以及没有目标地址的可见占位链接)。观察结果会如实说明自身局限:

  • 它会呈现发现项;不会宣布“已就绪”。浅层运行永远不算通过——如果应用在启动时崩溃,或登录墙阻止了探索,你会得到 inconclusive: true,而不是错误的绿灯。没有发现项不代表通过。
  • 门禁会结合发现项 + 覆盖范围 + 你审核过的契约 + 基线,得出 pass / fail / inconclusive(inconclusive 会按失败处理)。结果是确定性的——运行循环中不包含 LLM。
  • 探索式爬取明确不涵盖内容/声明准确性、隐私和 API 数据最小化、品牌/SEO 一致性,以及主观视觉可信度。这些需要经过审核的契约、隐私审核或人工/视觉判断;爬取不得暗示这些事项已得到验证。

对于“每位教练都已投保”这类业务保证,请使用由应用提供的确定性验证端点;只有在该不变量成立时,该端点才返回成功,然后在发布契约中要求该状态和面向客户的声明同时成立。目前的 DSL 尚不能读取任意 JSON 响应正文,也不能将跨源 API 负载直接与页面文案进行比较;请使用验证器或明确的 CI 预检,而不要假定探索已推断出该保证。

应用需要登录?请传入 testEmail/testPassword(会自动输入登录表单)、appLaunchArgs(例如,如果你的应用支持绕过登录,可传入 ["--uitesting"]),或为自定义登录界面提供明确的 loginSteps。

CI 门禁

同一引擎也可作为合并门禁运行——在每个 PR 上执行探索,重放已提交的发布契约、 Flows 和多参与者 Scenarios,将检查结果与默认分支上最近一次结论明确的运行进行比较, 发现回归时失败,发布置顶 PR 评论,并上传截图、录屏和机器可读的 JSON:

# .github/workflows/tapp.yml
name: Tapp release gate
on:
  pull_request:
  push:
    branches: [main] # refreshes the automatic baseline after merges

permissions:
  actions: read
  contents: read
  pull-requests: write

concurrency:
  group: tapp-${{ github.ref }}
  cancel-in-progress: true

jobs:
  tapp:
    runs-on: macos-15
    timeout-minutes: 45
    steps:
      - uses: actions/checkout@v4
      - uses: aarwitz/[email protected] # or pin the reviewed release commit SHA
        with:
          project: MyApp.xcodeproj # or MyApp.xcworkspace
          scheme: MyApp

对于拉取请求,Action 会自动从 GitHub 读取完整的变更文件集,并保留重命名文件的旧路径和新路径。它始终运行关键契约和 policy.always 契约,并添加通过经审核的源代码所有权、UI Map 和传递式 Task 组合关联的契约,同时将跳过的契约和覆盖缺口记录到 tapp-pr-plan.json 中。选定的契约未执行时会阻止合并。仅当你有意运行完整契约集时,才设置 pr-selection: "false"。

覆盖较弱的变更界面并不限于直接的 Web URL。经审核的 Task 源代码所有权可以通过观测到的 UI Map 边编译一个有界的原生目标(或最多五个 Web 目标),并使用条件等待和稳定的目标证据。目标缺失或失败会使运行无法得出结论;Tapp 不会根据屏幕名称猜测路径。

在 main 上首次成功且结论明确的运行会初始化仓库范围的 Actions 缓存和一个有效期为 90 天的基线工件。两者均按平台和稳定的应用模型目标 ID 标记。拉取请求会自动还原该基线,且仅在出现新的 高危/严重发现或 Flows 中断时失败——不会因已有债务而失败。无需基线提交或 PAT。 如果你更倾向于使用经过审核且持久的基线,请运行 tapp ci baseline 并提交生成的 .tapp/baselines/<platform>/<target-id>.json;tapp ci install 会将其显式路径写入 相应的作业。仍可识别旧版 .tapp/baseline.json。如上所示,自动还原基线和 PR 评论需要 actions: read 和 pull-requests: write 权限。来自 fork 的工作流无法使用 Secrets,因此需要身份验证的应用应使用非机密的 UI 测试启动参数,或跳过对不受信任 fork 的门禁。

已在其他作业中构建好模拟器应用,或使用其他 CI 提供商?此可移植命令接受该 .app, 检测其 bundle id,写入报告工件,并在门禁失败时以非零状态退出:

npx -y @aarwitz/tapp@latest ci --app path/to/MyApp.app \
  --project-dir . --pr-base origin/main --pr-head HEAD \
  --target-key target_ios_myapp \
  --pr-plan-out tapp-pr-plan.json \
  --baseline path/to/last-main-report.json \
  --json-out tapp-report.json --md-out tapp-report.md

如需了解 Flows、身份验证输入和其他控件,请参阅 .github/workflows/tapp-gate-example.yml 中的 自测。GitHub 托管的 iOS 运行需要 macOS runner;首次运行还会构建 XCUITest 测试框架,因此请根据应用大小预留约 5–10 分钟。

Android CI 在已连接模拟器/设备的 Linux 上运行。Action 可以构建 APK,也可以接受预先构建好的 APK:

- uses: aarwitz/[email protected] # or pin the reviewed release commit SHA
  with:
    platform: android
    android-app-id: com.acme.app
    android-project: android
    android-task: :app:assembleDebug
    flows: android/.tapp/flows/*.yml

对于 Web,请传入 platform: web 和 web-target:;Tapp 会使用应用模型运行基于锁文件的安装/构建,启动检测到的包脚本或只读静态服务器,等待就绪,执行门禁,并在失败时也将其停止。对于已运行且由你管理的环境,请改为传入 url:。添加 scenarios: .tapp/scenarios/*.yml,以对隔离的跨账户旅程执行门禁;请参阅 docs/scenarios.md。自动基线按平台和目标隔离,因此两个相同平台的应用绝不会相互比较。

让 Agent 验证你的仓库

将以下内容放入仓库的 AGENTS.md(Codex、Cursor、Copilot、Devin、Zed 等会读取此文件),让你的 Agent 证明其 UI 工作有效,而不是仅口头声称:

## Verifying UI changes
This repo uses tapp (https://github.com/aarwitz/tapp) to verify UI work on a real app surface
(iOS simulator, Android emulator/device, or a browser for web). After any UI change, run `npx -y @aarwitz/tapp@latest look` from the
repo root (it finds and builds the Xcode project itself) and look at the screenshot it saves as
proof. Before declaring a feature done, run `npx -y @aarwitz/tapp@latest explore` (or `explore <url>` for web)
and report the findings + evidence. A change is not "done" until it has been seen working.
(If the tapp MCP server is connected, the tapp_* tools do the same with inline screenshots —
tapp_build builds + installs the app and returns the bundle id for tapp_explore.)

工作原理

每个驱动程序都使用一种协议:结构化的 OCQA_* 标记(状态、操作、问题、转换),引擎会将其解析为树、屏幕截图、发现项、覆盖率和门禁结果。 在 iOS 上,通用的 XCUITest 测试框架通过 bundle id 连接任意应用,无需 SDK 或修改应用代码,并通过无障碍树执行操作。在 Android 上,ADB + UIAutomator 提供相同的黑盒驱动程序契约。在 web 上,确定性的 Playwright 爬虫会在真实浏览器中执行相同操作。检测器的理念相同,去重方式相同,回归门禁相同,结果也同样如实地为 pass/fail/inconclusive。核心探索、证据收集和门禁评估完全在本地运行,不收集遥测,也不会向外发送数据。AI 功能为可选功能,且需明确启用:发现项增强需要设置 TAPP_ENABLE_REMOTE_AI=1(仅有环境中的 API 密钥绝不会改变数据处理方式);AI 流程生成和 assert_ai 仅在你调用时运行;这些功能会向你配置的模型提供商发送所选元数据(屏幕名称、发现项标题)。运行时配置使用 TAPP_* 环境变量。仓库产物存放在 .tapp/ 下,桌面运行配置使用 .tapp.yml。Tapp 只读取这些名称:重命名前使用的 .autotap/、.autotap.yml 和 AUTOTAP_* 输入已不再受支持。如果你仍有旧目录或配置,请在经过审核的变更中将其重命名为 .tapp 对应名称——无需重写机密信息或证据格式。

已提交的 Flow 回放、录制驱动会话、自主探索、精确断言、回归比较和 CI 门禁,运行时均无需 API 密钥,也无需编码 Agent。AI 仅作为可选的编写/增强层(tapp_session {action:"draft_flow"}、assert_ai、发现项增强)。

首次调用工具时会构建测试框架(约 2 分钟,并缓存在 ~/.tapp 中;切换模拟器时会自动重新构建)。所有捕获文件都存放在 ~/.tapp/captures/。

反馈

Tapp 通过 GitHub issue 接收反馈,这是 Agent 已熟悉的工作方式:aarwitz/tapp。tapp feedback "short title" --body "…"(或 tapp_feedback MCP 工具)会起草 issue,并自动填入版本、平台可用性和最新捕获 ID,同时对主目录路径和令牌进行脱敏;--submit 则会使用已通过身份验证的 gh 提交 issue。默认只起草,因为 issue 是公开的——Agent 应先向你展示草稿。不会自动上传任何内容;捕获文件会留在你的设备上。

许可证

MIT

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。