Remove bundled Artemis automation skill

This commit is contained in:
KeyInfo Bot committed 2026-10-27 16:13:45 +08:00
1 parent facfcea832
commit 360779e38d
21 files changed
-1074

No files matched your search

-12
View File
@@ -160,18 +160,6 @@
}, },
"category": "Productivity" "category": "Productivity"
}, },
{
"name": "artemis-automation",
"source": {
"source": "local",
"path": "./plugins/codex/plugins/artemis-automation"
},
"policy": {
"installation": "AVAILABLE",
"authentication": "ON_INSTALL"
},
"category": "Developer Tools"
},
{ {
"name": "artemis-case-prep", "name": "artemis-case-prep",
"source": { "source": {
-2
View File
@@ -43,8 +43,6 @@ Codex 插件页的大标题按 marketplace 来源分组,不是按插件 `categ
`embedded-app-pc-debug`、`firmware-app-development` 和 `firmware-lowlevel-development` 分别覆盖 Windows 电脑端设备调试、固件应用层开发及 BSP/PSP 等底层开发流程。使用前应确认项目工具链、目标设备和访问权限;构建、设备写入、刷机、升级、上传和发布等操作必须按插件门禁取得明确确认。 `embedded-app-pc-debug`、`firmware-app-development` 和 `firmware-lowlevel-development` 分别覆盖 Windows 电脑端设备调试、固件应用层开发及 BSP/PSP 等底层开发流程。使用前应确认项目工具链、目标设备和访问权限;构建、设备写入、刷机、升级、上传和发布等操作必须按插件门禁取得明确确认。
`artemis-automation` 提供 Android、电脑和跨端测试,以及探索、批量用例、失败诊断和报告交付流程。市场只分发 Skill;使用前需单独部署兼容的 ARTEMIS MCP 和模型网关,并按测试目标配置 Android 设备或授权的电脑插件。
`artemis-case-prep` 根据原始 Android 测试工作簿筛选可自动化用例,保留原表副本并生成七列 ARTEMIS 任务表;它只准备文档,不启动测试。导入前请检查表头与当前 ARTEMIS 版本是否匹配。 `artemis-case-prep` 根据原始 Android 测试工作簿筛选可自动化用例,保留原表副本并生成七列 ARTEMIS 任务表;它只准备文档,不启动测试。导入前请检查表头与当前 ARTEMIS 版本是否匹配。
部分插件依赖特定运行环境。`$updating-gitea-repositories` 面向 Gitea HTTPS、GCM 和 PAT 工作流;安装前应查看插件详情并确认运行前置条件。 部分插件依赖特定运行环境。`$updating-gitea-repositories` 面向 Gitea HTTPS、GCM 和 PAT 工作流;安装前应查看插件详情并确认运行前置条件。
-55
View File
@@ -1255,61 +1255,6 @@
} }
} }
}, },
{
"id": "artemis-automation",
"repo": "https://git.playones.com/chenmingxuan/Artemis-Eapil.git",
"releaseChannel": "latest-stable",
"releaseProvider": "gitea",
"adapter": "claude-skill",
"pluginName": "artemis-automation",
"category": "Developer Tools",
"skillPath": "skills/artemis-use",
"sparseCheckout": [
"skills/artemis-use",
"LICENSE"
],
"brandColor": "#2563EB",
"manifestOverrides": {
"description": "使用 ARTEMIS MCP 执行 Android、电脑和跨端测试,诊断任务并交付报告。",
"author": {
"name": "chenmingxuan",
"url": "https://git.playones.com/chenmingxuan"
},
"homepage": "https://git.playones.com/chenmingxuan/Artemis-Eapil/src/branch/main/skills/artemis-use",
"repository": "https://git.playones.com/chenmingxuan/Artemis-Eapil.git",
"license": "Apache-2.0",
"keywords": [
"artemis",
"android",
"automation",
"testing",
"mcp"
],
"interface": {
"displayName": "ARTEMIS 自动化",
"shortDescription": "通过 ARTEMIS MCP 执行 Android、电脑和跨端测试。",
"longDescription": "通过 ARTEMIS MCP 执行 Android、电脑和跨端测试,支持探索、批量执行、失败诊断及报告交付。插件只分发 Skill;使用前须单独部署兼容的 ARTEMIS MCP 和模型网关,按测试目标配置 Android 设备或授权的电脑插件。",
"developerName": "chenmingxuan",
"category": "Developer Tools",
"capabilities": [
"Interactive",
"Read",
"Write"
],
"defaultPrompt": [
"使用 ARTEMIS 自动化检查测试环境并执行这个用例。",
"使用 ARTEMIS 自动化批量执行这些用例并导出报告。"
],
"websiteURL": "https://git.playones.com/chenmingxuan/Artemis-Eapil",
"privacyPolicyURL": "https://git.playones.com/chenmingxuan/Artemis-Eapil",
"termsOfServiceURL": "https://git.playones.com/chenmingxuan/Artemis-Eapil/src/branch/main/LICENSE",
"brandColor": "#2563EB"
}
},
"includeRootFiles": [
"LICENSE"
]
},
{ {
"id": "embedded-app-pc-debug", "id": "embedded-app-pc-debug",
"repo": "https://git.playones.com/zoukai/embedded-app-pc-debug.git", "repo": "https://git.playones.com/zoukai/embedded-app-pc-debug.git",
-9
View File
@@ -225,15 +225,6 @@
"commit": "f0b9fc6efac82f825ffc27051a04d47f22ba5362", "commit": "f0b9fc6efac82f825ffc27051a04d47f22ba5362",
"syncedAt": "2026-10-21T06:48:34Z" "syncedAt": "2026-10-21T06:48:34Z"
}, },
{
"id": "artemis-automation",
"pluginName": "artemis-automation",
"repo": "https://git.playones.com/chenmingxuan/Artemis-Eapil.git",
"ref": "v2.2.0",
"adapter": "claude-skill",
"commit": "be6e8c2abddc0905c86feb4a78cbd2b7113c38f1",
"syncedAt": "2026-10-27T07:55:04Z"
},
{ {
"id": "embedded-app-pc-debug", "id": "embedded-app-pc-debug",
"pluginName": "embedded-app-pc-debug", "pluginName": "embedded-app-pc-debug",
@@ -160,18 +160,6 @@
}, },
"category": "Productivity" "category": "Productivity"
}, },
{
"name": "artemis-automation",
"source": {
"source": "local",
"path": "./plugins/artemis-automation"
},
"policy": {
"installation": "AVAILABLE",
"authentication": "ON_INSTALL"
},
"category": "Developer Tools"
},
{ {
"name": "artemis-case-prep", "name": "artemis-case-prep",
"source": { "source": {
@@ -1,41 +0,0 @@
{
"name": "artemis-automation",
"version": "2.2.0",
"description": "使用 ARTEMIS MCP 执行 Android、电脑和跨端测试,诊断任务并交付报告。",
"author": {
"name": "chenmingxuan",
"url": "https://git.playones.com/chenmingxuan"
},
"homepage": "https://git.playones.com/chenmingxuan/Artemis-Eapil/src/branch/main/skills/artemis-use",
"repository": "https://git.playones.com/chenmingxuan/Artemis-Eapil.git",
"license": "Apache-2.0",
"keywords": [
"artemis",
"android",
"automation",
"testing",
"mcp"
],
"skills": "./skills/",
"interface": {
"displayName": "ARTEMIS 自动化",
"shortDescription": "通过 ARTEMIS MCP 执行 Android、电脑和跨端测试。",
"longDescription": "通过 ARTEMIS MCP 执行 Android、电脑和跨端测试,支持探索、批量执行、失败诊断及报告交付。插件只分发 Skill;使用前须单独部署兼容的 ARTEMIS MCP 和模型网关,按测试目标配置 Android 设备或授权的电脑插件。",
"developerName": "chenmingxuan",
"category": "Developer Tools",
"capabilities": [
"Interactive",
"Read",
"Write"
],
"defaultPrompt": [
"使用 ARTEMIS 自动化检查测试环境并执行这个用例。",
"使用 ARTEMIS 自动化批量执行这些用例并导出报告。"
],
"websiteURL": "https://git.playones.com/chenmingxuan/Artemis-Eapil",
"privacyPolicyURL": "https://git.playones.com/chenmingxuan/Artemis-Eapil",
"termsOfServiceURL": "https://git.playones.com/chenmingxuan/Artemis-Eapil/src/branch/main/LICENSE",
"brandColor": "#2563EB",
"screenshots": []
}
}
@@ -1,202 +0,0 @@
Apache License
Version 2.0, January 2004
https://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright 2026 Google LLC.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
https://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
@@ -1,9 +0,0 @@
{
"sourceId": "artemis-automation",
"repo": "https://git.playones.com/chenmingxuan/Artemis-Eapil.git",
"ref": "v2.2.0",
"commit": "be6e8c2abddc0905c86feb4a78cbd2b7113c38f1",
"adapter": "claude-skill",
"sourcePath": "skills/artemis-use",
"syncedAt": "2026-10-27T07:55:04Z"
}
@@ -1,47 +0,0 @@
---
name: artemis-use
description: 使用 ARTEMIS 执行安卓、电脑和跨端测试,指导探索用例,排查或复盘任务,以及开发符合 ARTEMIS 规范的扩展插件。用户提到 ARTEMIS 任务编号、测试报告、缓存消耗或插件适配时使用。
---
# ARTEMIS 使用与插件开发
ARTEMIS 自己编排手机和已授权插件,共用网页的任务队列、历史与报告。主程序由用户启动;Codex 的 MCP 仅连接,不另起后台或独立执行器。主程序离线时告知用户先启动 ARTEMIS,不能反复重提任务。
## 按任务选择参考
| 用户要做什么 | 阅读什么 |
| --- | --- |
| 选择模式、执行或指导单任务 | [执行模式与操作流程](references/modes.md) |
| 边交流边探索、亲自示范、提炼复用用例 | [探索流程与 MCP 参数](references/exploration.md) |
| 批量、循环压测、选择导入项、交付资料 | [批次与报告](references/batches.md) |
| 给出任务编号,问失败原因、token、缓存、录像或最终结论 | [诊断与复盘](references/diagnostics.md) |
| 使用电脑、路由器、终端等已安装能力 | [插件任务参数](references/plugins.md) |
| 编写、适配、验证或发布 ARTEMIS 插件 | [插件开发规范](references/plugin-development.md),按需读取 [清单与市场协议](references/plugin-manifest.md) |
只读当前任务相关参考。普通执行不加载插件开发文档。
## 三种模式
- **Flash**:路径明确的快速执行,单个执行模型观察并操作;适合冒烟、稳定流程与探索后复跑。可以接受中途指导;最终 AI 判定与分析默认关闭,可在全局功能配置开启。关闭时显示“未做 AI 判定”,不能当作验收通过。任务长不自动等于需要 Pro。
- **Pro**:需要持久计划、多个分支、检查点、ADB/日志诊断或详细报告;按计划执行并验证。`explorer_mode` 是 Pro 的视觉定位深度,不是探索任务模式。
- **探索**:用户只有大概流程,需要与模型交流、纠正方向或人工示范;以 Pro 的执行能力推进,最终提炼一个可复用用例。超时保存并暂停,可继续。探索成功、生成用例和 Flash/Pro 复跑成功是三个不同结果。
以上是 ARTEMIS 执行模式,不是 API 模型名。每种模式的适用场景、能力差异、参数及跟踪方式见 [modes.md](references/modes.md)。沿用用户选定模式和模型;信息足够时直接执行,不反复要求批准。
## 共用规则
1. `mobile_workspace` 发现当前设备、队列、实际插件。沿用用户指定设备;多台设备而目标不明时先问。纯电脑任务用 `include_devices=false`,无需手机;普通安卓任务可按需使用已授权扩展。
2. 明确任务目标、前置条件和通过标准;用户没有要求时不擅自清数据、重装或重置环境。不假设启动时画面与旧任务相同。
3. 提交前保存唯一 `request_id`。同一次提交网络异常时保留原 ID 和内容,先反查,不用新 ID 自动重跑。模型请求重试不等于业务用例重跑。
4. 用 MCP 返回的任务编号跟踪;查看实际动作与证据,不把“已接收指导”当作“已经执行”。同一设备或桌面资源串行,其他资源可并行。
5. `completed` 只表示执行结束。读取 `test_result.status/reason/source`:passed、failed、inconclusive、blocked。人工复验优先,同时保留 AI 原判;Agent 自己的判断不能标成人工。
6. 失败或停滞先看当前任务诊断,再决定是否检查环境;不要靠连续重提测试排错。证据不足明确说明未验证,工具成功不能代替业务验收。
7. 用户明确要求删除时先查看 `deletion_preview` 的实际影响,再执行。已有明确授权不重复询问。人工复验只代录用户明确给出的通过/不通过及理由。
8. 密钥在网页或环境中配置,MCP 不接收;不读出或回显凭据。`mobile_config` 修改默认配置需要用户明确要求,临时任务用单任务配置。
9. 通过 `mobile_export_report` 交付真实路径或下载链接。手机和电脑证据按来源区分,未录到的画面不能推断。插件写操作结果不确定时先观察,不自动重复。
## 安装与版本
本目录是 ARTEMIS 管理的官方 `artemis-use`,服务启动时按内容检查并覆盖更新,不在这里定制个人规则。显式修复安装用 `artemis mcp --install codex`(源码环境前加 `uv run`)。Skill 与参考、模板一并更新;MCP 握手不安装、不启动主程序。
以当前连接服务和实际工具参数为准;旧版缺少动作时明确说明版本限制,不能假装执行成功或直接改数据库。升级 ARTEMIS 使用 `update.bat` / `update-cn.bat`,会停止该项目任务,只在用户要求升级时执行。
@@ -1,4 +0,0 @@
interface:
display_name: "ARTEMIS 使用与插件开发"
short_description: "通过 MCP 执行跨端测试、交流探索、诊断复盘并开发扩展插件"
default_prompt: "使用 $artemis-use,按我的目标选择 ARTEMIS 测试、任务复盘或插件开发流程,并依据实际证据交付结果。"
@@ -1,10 +0,0 @@
---
name: evidence-demo
description: 按任务要求保存文本到任务资料目录,返回文件校验结果。
---
调用 plugin_load 返回映射后的 write_note 工具。只在用户需要保存文本时使用;不是任意文件读写或命令执行接口。
输入 text 不超过 16 KiB,文件名由工具生成,不能覆盖已有文件。成功后检查回执中的文件名、SHA-256 和执行状态;文件会随单任务全部资料及批次资料导出。
保存成功不代表用例通过。结果不确定时先核对任务文件,不重复写入。不自动恢复或删除用户文件。
@@ -1,24 +0,0 @@
{
"schema_version": 2,
"id": "evidence-demo",
"name": "文件证据示例",
"version": "1.0.0",
"description": "开发模板:写入任务专属文本文件并返回校验回执。",
"artemis_version": ">=2.0.0,<3.0.0",
"platforms": ["win32", "linux", "darwin"],
"architectures": ["amd64", "arm64"],
"server": {"command": "${config.python}", "args": ["${plugin_dir}/server.py"]},
"config": {"python": {"label": "含 MCP 依赖的 Python", "default": "python"}},
"skill": "SKILL.md",
"targets": ["mixed", "computer"],
"resources": [],
"capabilities": {
"kind": "file",
"recording": "none",
"required_tools": ["write_note"],
"tools": {"write_note": {
"effect": "write", "observation": false, "idempotent": false,
"cancellation": "unknown", "evidence": ["text", "file"]
}}
}
}
@@ -1,64 +0,0 @@
"""Minimal task-owned attachment server. Run through ARTEMIS, not as a shell tool."""
import hashlib
import os
from pathlib import Path
import time
import uuid
from mcp.server.fastmcp import FastMCP
from mcp.types import CallToolResult, TextContent, ToolAnnotations
mcp = FastMCP("evidence-demo")
@mcp.tool(
annotations=ToolAnnotations(readOnlyHint=False, destructiveHint=False, idempotentHint=False)
)
def write_note(text: str) -> CallToolResult:
"""Save at most 16 KiB of user-requested text as a new task attachment."""
encoded = text.encode("utf-8")
root = os.environ.get("ARTEMIS_ARTIFACTS_DIR")
if not root or len(encoded) > 16384:
return CallToolResult(
isError=True,
content=[TextContent(type="text", text="任务目录缺失或内容超过 16 KiB;未写文件。")],
structuredContent={
"artemis": {
"version": 1,
"execution": "not_started",
"side_effect": "none",
"error_code": "invalid_input",
"retryable": False,
}
},
)
directory = Path(root)
directory.mkdir(parents=True, exist_ok=True)
name = f"note-{uuid.uuid4().hex}.txt"
path = directory / name
with path.open("xb") as handle:
handle.write(encoded)
digest = hashlib.sha256(path.read_bytes()).hexdigest()
return CallToolResult(
content=[TextContent(type="text", text=f"已保存并读回校验:{name}")],
structuredContent={
"artemis": {
"version": 1,
"execution": "completed",
"side_effect": "confirmed",
"retryable": False,
"source": {
"kind": "file",
"target_id": "task-artifacts",
"label": "任务文件",
"captured_at": time.time(),
},
"attachments": [{"name": name, "sha256": digest, "media_type": "text/plain"}],
}
},
)
if __name__ == "__main__":
mcp.run(transport="stdio")
@@ -1,84 +0,0 @@
# 批量任务与报告交付
## 直接提交用例
用户要求执行明确的测试集合时,将每个独立提示词转成一个 case。`goal` 是唯一发送给 ARTEMIS 的任务正文;`case_id`、`category`、`subcategory`、`name`、`preconditions` 只作元数据。`task_config` 可覆盖该项执行配置,不影响其他项。
先生成唯一 `request_id`(例如 UUID),保存在当前任务记录中,然后调用:
```json
{
"action": "create",
"request_id": "52c3e95d-7e31-4e41-b42d-27aa3774fb2d",
"batch": {
"name": "系统设置冒烟测试",
"device_serial": "用户已选择的设备编号",
"profile": "pro",
"formats": ["docx", "xlsx"],
"stop_on_failure": false,
"timeout_seconds": 1800,
"repeat_count": 1,
"cases": [
{
"case_id": "DEMO-001",
"category": "系统设置",
"subcategory": "首页",
"name": "设置首页可达",
"preconditions": "设备已解锁。",
"goal": "打开系统设置,确认设置首页可见,不修改任何设置;记录实际文字与截图证据。",
"task_config": {
"profile": "pro",
"model": "mimo-v2.6-flash",
"reasoning_effort": "high",
"locked_app_package": "com.android.settings",
"record_video": true,
"analyze_video": false,
"request_timeout_seconds": 300
}
}
]
}
}
```
`create` 只保存已校验的草稿。检查返回批次编号和范围,用户已经授权执行时接着 `mobile_batch(action="start", batch_id=...)`;用户只要求准备方案时留在草稿,不启动。保存 `batch_id`,用 `get` 跟踪各项状态。
用户要求压测时,在 `batch.repeat_count` 设置正整数循环次数(默认 1),只向 `batch.cases` 提交用户选择的用例。每轮按原顺序执行整批,再进入下一轮;各次执行独立保存编号和报告,`get` 中的 job 包含 `iteration`、`repeat_count`。总执行数为用例数乘以轮数,默认上限 10000,由服务的 `ARTEMIS_BATCH_MAX_EXECUTIONS` 控制。不要重复调用 `start` 来实现循环,也不要将循环次数写入每项 `task_config`。失败即停止会跳过后续全部轮次;复制失败项时各失败执行只重跑一次,新的批次循环次数为 1。
创建请求超时可能已经落库。先 `lookup(request_id=...)`;需要重发时保留**相同 request_id 和相同内容**。服务会返回原批次,内容不同会拒绝。不要通过换编号“修复超时”,否则会形成重复批次。
## Excel 导入
`mobile_task_file(action="template")` 返回空白模板的本地路径。“任务”页七列依次为:用例编号、检测项目、测试子项、测试用例、前置约束提取、Artemis提示词、任务配置(JSON)。仅提示词必填;说明页有一条示例,不会导入执行。JSON 支持 `profile`、`model`、`reasoning_effort`、`device_serial`、`verification_level`、`explorer_mode`、`locked_app_package`、`record_video`、`analyze_video`、`request_timeout_seconds`、`max_retries`、`retry_interval_seconds`、`timeout_seconds`。未知字段或密钥被拒绝。每行独立,不支持公式、宏、外部链接。
`preview` 返回 `valid/tasks/errors`,不会执行。网页默认全选,可取消用例;AI 也应按用户指定范围筛选 `tasks`。所有错误处理完后,将所选项的预览字段 `row` 去掉,作为 `batch.cases` 提交,并说明实际选中数量。不要跳过错误行却声称全部导入成功。
## 状态与异常
- 批次 `draft` 等待开始;`running` 调度中;`paused` 等待处理;`completed` 表示所有项进入终态,不代表全部通过。
- 单项 `pending/queued/running/pausing/task_paused/resuming/finalizing` 尚未结束,`completed/failed/cancelled/interrupted/skipped` 是终态。`pausing` 是请求已发出而设备仍被占用,`task_paused` 才表示设备已释放;`finalizing` 在生成报告,不能提前宣称报告已完成。
- 批次 `pause` 保留当前执行,只暂停后续派发;单项 `mobile_manage_task(pause)` 会在安全边界释放设备,Pro 的模型等待与只读诊断可中断。恢复后重新观察画面,并排到设备队尾,不阻塞后续项。`mobile_manage_task(guidance_history)` 可核对指导是否从 `pending` 变为 `consumed`,但仍需检查后续操作是否符合指导。设备断开、模型持续失败或任务达到批次时限会暂停后续派发;用诊断确认恢复后再响应用户的继续指令。
- `resume` 只继续未开始项;`retry_failed` 复制失败、取消和中断项为新草稿,不修改原结果。必须来自用户的明确重跑请求。该动作不提供创建去重,响应不确定时先 `list` 查找新批次,不自动重复调用。
- 用户明确要求删除批次记录时,先 `get` 核对批次编号与状态,再 `delete`;正在执行、排队或等待指导的批次不能删除。删除会同时移除该批次任务历史、报告和文件,无法撤销。
## 报告
`mobile_export_report(batch_id=...)` 下载批次 ZIP,包含汇总、各项报告和有序步骤截图;任务保存了录屏时,还包含对应录屏片段。报告格式由创建批次时的设置决定。单任务传 `session_id`(单任务 MCP 的 `trace_id`)以及可选 `formats=["docx"]`、`["screenshots"]`、`["video"]` 或 `["all"]`。默认格式通过 `mobile_config(section="reports")` 查看。录屏与 AI 视频分析独立,只有保存了录屏才可下载片段。
结果文件在 MCP 主机的 `artifacts/mcp_exports/`。不要把 Office 文件内容当作文本塞入上下文;先检查工具返回的结构化结论,需要进一步审阅时再用宿主具备的文档工具打开文件。失败和未验证项也必须交付,保持原始证据。
## 精选任务与收藏复跑
`mobile_favorites(action="list")` 读取与首页相同的收藏。`create` 指定 `source_kind`(task、batch、exploration、exploration_case)和 `source_id`,从服务端原记录保存独立模板及执行配置;不传任意 snapshot,也不接受密钥。删除原任务或清理历史不影响收藏。
- task 收藏普通 Flash/Pro 任务;探索执行记录默认收藏已确认用例,无用例时保存为重新探索。
- exploration 明确保存为新的探索对话,保留原探索模型与配置;不继续旧会话。
- exploration_case 保存固定用例版本,可传 version;默认使用该版本之前的复跑配置,首次复跑默认 Flash 并明确标示。后来新版本不会覆盖已有收藏。
- batch 保存一轮用例、原顺序、循环次数及执行策略;复跑不会把已展开的执行列表再循环。
`run` 必须提供稳定的 request_id,返回新 session_id、batch_id 或 exploration_id。连接异常时沿用相同 ID 和内容重试,不能新建 ID 自动重提。changes.task_config 仅覆盖本次;批次 changes.case_configs 使用从 0 开始的用例下标,changes.task_config 统一覆盖全批。`update` 才修改收藏默认配置,可改名称。`delete` 只取消收藏,不删除历史或执行结果。
不修改时使用收藏的原配置。旧任务未记录的字段会在 inherited_fields 标明采用收藏时的默认值,不能声称全部还原。原设备离线时先让用户选择设备,不自动换机。插件仍须通过当前安装、授权和资源校验。
单任务全部资料下载按任务合并并发请求,已结束且内容未变化时复用报告和 ZIP;人工复验、结果或附件变化会重新生成。批次复用成品,人工复验后重建,旧目录格式首次下载时更新。执行中导出为当前快照。录像位于 `任务录屏/安卓/`、`任务录屏/电脑/`、`任务录屏/人工示范/`,以文件清单和证据索引为准。
@@ -1,49 +0,0 @@
# 任务排查与复盘
用户给了任务编号就先针对该编号取证,不重跑业务,不停止其正在运行的任务,不把最新失败任务替换成用户指定任务。
## 定位顺序
1. `mobile_manage_task(action="status", trace_id=...)`,区分排队、执行、等待指导、暂停、收尾与终态。`current_step` 是动作步号,不等于模型请求数。
2. `mobile_inspect_trace(action="view_report", trace_id=..., offset=0, limit=20)` 读取统一结果与有限步骤。`test_result.source=human` 时同时展示 AI 原判,不能用旧 AI 结论覆盖人工复验。
3. 根据问题只读相应资料:
| 问题 | inspect action | 要核对的证据 |
| --- | --- | --- |
| 长时间没动、API 超时、499、no tool call | view_requests | 请求开始/结束、模型、阶段、请求/尝试/响应/链路编号、重试、取消来源与时限层级;HTTP 200 不表示输出结束,499 不能单独归因 |
| token 特别多、缓存是否生效 | view_usage,再按需 view_requests | prompt/completion/cached、调用数、角色/模型分组;未记录字段不能补猜 |
| Python、ADB、插件错误 | view_logs | 该任务 stdout/stderr 有限尾部;脱敏文本和实际错误链 |
| 点错、未验证、与结论矛盾 | search → view_step_details / view_step_screenshots | 动作前后画面、工具参数与实际回执、窗口和坐标尺寸 |
| PC 黑屏、录像空洞、文件没保存 | view_evidence | 来源、时间、录屏片段、调用回执及附件,不用手机画面代替电脑画面 |
`offset/limit` 分页,使用返回的 next_offset;view_logs 的 offset 从最新行向前计数,返回每页仍按时间正序,超过尾部读取窗口的旧字节会注明。text_truncated=true 时缩小范围或读取指定步骤,不把截断当成内容缺失。
`search` 使用 query 或 step_range,不会执行历史动作。`view_summary` 返回 summary Markdown 与 steps.items/total/offset/limit/next_offset,按 next_offset 翻页,不一次加载整条长任务。items 中 step_id 是存储编号,不能用模型口述步号替代。JSON 结果同时保留 structuredContent 与兼容文本;调用严格按工具 schema,MCP 的 task_desc 与 HTTP 的 goal 不能混用,未知参数在执行前报错。
## 缓存与耗时
- 缓存命中率 = cached_tokens / prompt_tokens,分母不是总 token,也不是缓存命中的请求数。
- 输入 token 包括缓存部分。报告输入总量、缓存量、未缓存输入、输出、调用数,保留缺少统计的限制。没有用量记录不等于零费用;没有价格信息不臆算账单。
- 按角色/模型分组判断消耗来源,不能把 Checker、视频分析和执行模型混为一个请求。旧数据未记录模型时注明 unknown。
- 请求阶段和重试用于解释等待,时间戳 Unix 秒及 UTC 转成用户当地时区;注明时区。无终止事件或 unknown 不能当成功。
- 区分模型生成耗时、设备/插件操作耗时、排队及用户等待。先找实际重复观测、工具参数膨胀、无进展循环,再建议优化。
- `mobile_manage_task(action="status")` 的 `lifecycle` 与网页进度、报告同源:`durations` 分开记录 total、queued、resource_wait、paused、execution、final_review、report_export,缺少记录为 null。execution 包含初始化与整理,不能当作模型生成速度;旧任务分项未知不能补成零。
- 指导回执的 accepted_at/timestamp 表示接收,consumed_at 表示执行器已读取;是否被实际应用仍需核对后续步骤。pending/reading 是等待或领取中,终态未消费为 unapplied,终态领取后未确认消费为 unconfirmed。接收成功不能表述为“已执行”或“模型已应用”。
- 最终验收读取 `view_requests` 返回的 `final_reviews`:核对 stage、total/elapsed/remaining_seconds、request_count、retry_count 和 status;用 review_id 关联请求的 final_review 字段。最终验收与中间检查点独立计时。budget_exhausted 是验收总预算耗尽,request_retries_exhausted 是模型请求重试耗尽;cancelled 的具体来源看 cancel_reason,没有该字段或为 unknown 时保留未知,不能混称为 API 超时。验收耗尽不自动重跑设备操作;流式半截 passed 和验收 completed 都不能代替正式 test_result。
- 取消记录核对 cancel_reason 与 cancel_phase:user_stop、guidance_replaced、task_paused、task_replaced、superseded 和 outer_timeout 分别表示已明确归因的中断。timeout_scope 的 request、transport、outer、final_review 区分单次请求、传输、外层等待和验收总预算。自动重试用 request_id 分组,以 attempt_id、previous_attempt_id 关联;可用的 client_request_id、server_request_id、response_id、server_trace_id 和 traceparent 用于对照服务端日志。HTTP 499 或裸取消不能证明来源,旧记录不补猜。
## 环境与插件
工具报连接/设备异常时用 `mobile_diagnose`。服务未启动时让用户先启动 ARTEMIS,不经 MCP 拉起另一个副本。一般检查先不启用付费凭据验证或真实设备探测;需要确认凭据或观测链路时再用 verify_credentials / probe_device。设备自愈用 attempt_fix,仅按返回的 next_steps 处理。
`mobile_workspace` 可见插件及 blocked_resources。只对相关已安装插件做 probe_plugin 连接检查;它会启动插件进程。结果不确定的写动作不能自动再点一次,资源保护解除由用户在网页确认。
## 结果与交付
给出具体结论、支持它的任务/步骤/请求编号、影响与缺失证据。执行失败不必然是被测产品缺陷;验收失败也不必然是工具故障。
报告与证据索引的 evidence_sources 区分实际执行界面与接口、文件、终端等辅助来源。业务后台名称或网址不决定执行平台,UI 截图不能单独证明后端持久状态。引用实际 step_id/call_id/source_id,保留未验证边界;来源清单不是新的验收结论,也不改写 AI 原判或人工复验。
用户只问复盘时不重新执行、不改验证结果。用户明确给出人工复验结论时,使用 mobile_manage_task(action="review", trace_id=..., review_status="passed"或"failed", review_reason=用户理由, user_confirmed=true)。AI 自己的分析不能使用这个入口冒充人工判定。
用户需要资料时再 mobile_export_report;已有 report/evidence 查看不会生成 ZIP。交付真实路径或链接,并说明未验证项。
@@ -1,90 +0,0 @@
# 探索模式:把粗略流程变成一个可复用用例
在「新任务 / 首页」选择 Flash、Pro 或「探索」,描述要验证的大概流程,再点击「开始探索」。ARTEMIS 使用 Pro 的计划、工具和验收机制推进任务;遇到关键预期不明或需要选择时,在任务主区域提问。底部输入框用于回答问题、补充信息和纠正方向;探索还提供人工示范、暂停与继续。
工作区底部始终指导当前选中的任务:Flash/Pro 不会因此创建新任务;探索消息与操作步骤按时间排列。同一次探索在任务队列/历史中保留一张卡,内部执行轮次可展开查看,当前步骤对应所选轮次。通过「任务范围 → 探索任务」筛选。Flash/Pro 复跑各自保留普通任务卡,可点击「查看来源探索」返回;不会自动切换成探索对话。
## 模型与超时
探索独立保存模型配置,默认 `gpt-6.1-sol / high`,预设也提供 `gpt-6-astra`,允许自定义模型。执行、人工示范分析、用例提炼和结束后的讨论使用这套配置。修改默认值仅影响新探索;已创建会话保留配置快照,Flash/Pro 默认值不变。
默认每段主动执行 1800 秒。模型调用、设备动作、录像分析计入;排队、等待回答和人工示范不计入。到时保存进度并暂停,可点击「继续探索」开启下一段;不会仅因超时把测试判成失败,累计主动耗时仍保留。
普通暂停/等待回答会释放执行资源;继续后重新排队并观察设备。服务或执行进程中断后,已保存对话、证据和用例仍可用;继续会新建关联运行,不能恢复已经丢失的内存状态。
执行过程中获取设备画面超时或连接中断时,探索会保留尚未执行的指导并暂停,释放设备。确认设备恢复响应后点击「继续探索」,重新观察成功后才交给模型执行;等待期间不自动重试、不调用模型。此类暂停不等于测试失败。若设备仍不可用,会再次明确提示并暂停。
队列和历史任务以等高徽标显示「探索 / Flash / Pro」。用例复跑显示实际执行模式并另标版本;尚可继续的探索只展示当前执行状态,具体轮次的阻塞原因可在执行记录查看,结束后再展示测试结论。旧任务未保存模式时显示「模式未记录」。
## 我来操作
1. 点击「我来操作」,选择安卓、电脑或双来源,再点击「开始示范」。电脑来源要求任务已启用支持录制的插件。
2. 等界面显示「录制中」后再操作。ARTEMIS 会先让当前动作安全结束、停止 AI 操作,保留相应设备与插件资源,避免其他任务抢占。
3. 操作完成后点击「操作完成,开始分析」。ARTEMIS 停止并保存录像,分析实际画面,再显示摘要。证据明确时重新观察并继续;关键步骤或预期不清楚时再提问。
即使普通录屏关闭,人工示范仍单独录制。默认 15 分钟,最后 60 秒提醒,可以延长;到时保存录像并暂停,释放资源,不能自动视为示范完成。取消或分析失败也保留已取得的媒体,可发送文字说明继续。
录像不录音,沿用留档尺寸、帧率和编码配置。安卓与电脑分别保存并按任务时间对齐;示范分析只使用指定的已保存片段,不用手机截图代替电脑证据。画面不可见的输入和动作不能推测,用户示范不等于模型独立复跑通过。
## 用例版本与复跑
探索验收通过后提炼一个用例,包含目标、前置条件、可验证路径、等待条件和预期结果。长任务会分段提炼完整路径,原始记录保留。提炼失败不改写实际测试结论,可单独重试;未通过的探索不能自动提炼成「已验证路径」,但可以手动保存草稿。
主区域的用例卡可复制提示词,点击「查看 / 编辑」展开编辑器并保存新版本,旧版本不可变。选择已保存版本和 Flash/Pro 模式,可以指定复跑模型,也可使用普通默认模型。复跑固定版本与配置,结果与探索验收分开显示。前置条件会纳入探索用例的复跑提示词。
「加入新批次草稿」只创建批次,在「报告与批量」确认后启动。结束后仍可在对话中讨论与修订;需要再次操作设备时点击「继续探索」,它会重新排队并观察。新指导不会改写旧任务报告。
单任务和批次「全部资料」包含对话、用例版本和关联运行索引、当前任务的示范录像及原有截图/附件。其他关联任务的媒体需从对应任务导出,索引不会假称包含它们。
## MCP 与 Python SDK
更新 MCP 配置并重载后,使用 `mobile_exploration`。它与网页共用接口、队列和存储;`list/get/case` 都是只读操作。
```python
mobile_exploration(
action="create",
request_id="case-search-create",
payload={
"goal": "探索设置搜索流程;关键预期不清楚时询问我",
"task_config": {"device_serial": "用户指定的设备编号"},
},
)
# 以下 exploration_id 使用 create 返回的 id。
mobile_exploration(action="start", exploration_id="会话编号", request_id="case-search-start")
mobile_exploration(action="get", exploration_id="会话编号", after=0)
mobile_exploration(
action="message",
exploration_id="会话编号",
request_id="guide-1",
payload={"text": "只验证能打开搜索页,不修改设置"},
)
```
写操作除 `pause/stop/delete` 外均需稳定的 `request_id`;传输失败时原样重试,不生成新编号。消息 `after` 为已读最大序号;读取返回下一页,不会启动执行。运行结束看 `runs[].test_result`,不能把 `completed` 当作测试通过。
| 操作 | 参数/行为 |
| --- | --- |
| `pause/continue/stop` | 暂停/继续/明确取消当前执行 |
| `demonstrate` | `payload={source:"android"/"computer"/"both"}`;等 `demonstrations[].status=recording` 再操作 |
| `demo_finish/demo_cancel` | 传 `demonstration_id`;结束分析/取消保留媒体 |
| `demo_extend` | 另传 `payload={seconds:900}`,同一请求不会重复延长 |
| `case` | 可传 `version` 获取旧版本 |
| `save_case` | `payload={expected_version,case:{name,goal,preconditions,evidence}}`;版本冲突返回 409 |
| `generate` | `payload={source_run_id,expected_version}`;返回生成任务,轮询 `get.generations` |
| `validate` | `payload={version,profile:"flash"/"pro",task_config:{...}}` |
| `batch` | 与 validate 相同,可加 `name`;只建草稿 |
`mobile_config(section="exploration")` 读取非敏感默认值;用户授权保存后才传 `changes` 与 `persist_defaults=true`。接口不接收 API Key,模型传输仍使用已配置的 Responses 网关。
远程 SDK 的 `await client.exploration(action, exploration_id=..., request_id=..., payload=...)` 使用同样动作及参数,不创建第二套执行器。遵循当前服务返回的参数与状态。
## 对话与结束行为
- 探索助手提问后会暂停,主区域和输入框显示“等待你回答”。回答前不进行最终验收,也不生成用例。
- 新指导优先于已完成的旧计划。最终检查期间收到指导会返回执行;例如“先回到主页,再结束”需要实际完成返回操作后再验收。
- 设备操作及最终验收结束后进入“正在提炼用例”,此时不再接收设备指导。未发送文字会保留,提炼完成后可点击“继续探索”。用例卡片只在探索结束时展示。
- 进入只读最终验收前停止保存录屏,模型等待、重试与用例提炼不录入视频;如需补做操作,再录制后续片段。
- 首页探索设置使用滑块调整思考强度与时限。复跑任务显示已保存的用例名称及版本,完整提示词仍保存在任务中。
## 删除探索
用户明确要求删除时,先 `mobile_exploration(action="deletion_preview", exploration_id=...)` 查看影响;再 `delete` 并传 `user_confirmed=true`。删除整段对话及探索运行,独立 Flash/Pro 复跑保留。删除不需要 request_id;运行中或示范/提炼中不能删除。
@@ -1,59 +0,0 @@
# 执行模式与单任务流程
## 怎样选模式
| 项目 | Flash | Pro | 探索 |
| --- | --- | --- | --- |
| 适合 | 目标清楚、路径明确、低分支流程;冒烟和已提炼用例复跑 | 复杂分支、持久计划、检查点、长程监控、ADB/日志、详细记录 | 流程尚未定型,用户参与纠正或示范的一个复杂用例 |
| 执行方式 | 单执行模型观察→动作;需要时使用定位等辅助工具 | Planner 制订计划;Operator 执行;Checker 验收;按需生成报告 | 复用 Pro 工具和计划,加持续对话、提问等待、示范分析和用例提炼 |
| 验收 | 最终 AI 判定与分析默认关闭,可在全局功能配置开启 | 默认结束验收,可配置检查点/strict | 先处理用户指导,再验收探索目标;不把示范当独立复跑通过 |
| 中途输入 | `inject_instruction` 指导当前任务 | 同 Flash,还能记录计划及诊断信息 | `message` 持续交流;结束后消息仅讨论,再操作需 `continue` |
| 入口 | `mobile_run_task(model="Flash")` | `mobile_run_task(model="Pro")` | `mobile_exploration(create/start/...)` |
| 产物 | 步骤、证据、测试结果,按需导出报告 | 以上加计划、笔记和可选详细报告 | 对话、各轮执行和示范证据、一个用例的不可变版本 |
| 时限 | 普通执行保护,按任务配置 | 同 Flash | 默认每段主动执行 1800 秒,达到后暂停而非判失败,可继续 |
不是按步数多少机械选模式。Flash 没有默认步数上限,但不具备 Pro 的持久计划、ADB shell、过程中检查点。复杂稳定路径可以在探索确认后用 Flash 复跑;需系统诊断或检查点时用 Pro。探索不是一种更高的思考强度,Pro 的 `explorer_mode` 也不表示创建探索会话。
## 模式、模型与配置
- `mobile_run_task.model` 取 `Flash` / `Pro`。API 模型名放 `runtime_overrides.model`;思考强度放 `runtime_overrides.reasoning_effort`。批次使用 `task_config.profile` 选择模式,`task_config.model` 选择 API 模型。
- 探索独立配置,默认 `gpt-6.1-sol/high`,支持 `gpt-6-astra` 及已配置网关支持的自定义模型。执行、示范分析、提炼共用该探索配置;不改变 Flash/Pro 默认值。
- 默认 high、单次模型请求时限 300 秒。`default` 表示不发送思考强度,`none` 是显式关闭,不能混为一谈;接口不支持参数时如实报告,不擅自降级。
- 请求时限与整任务主动执行时限不同。排队/用户暂停不计入任务主动执行;探索等待回答、人工示范也不计入。
- 录屏 `record_video` 和 AI 视频分析 `analyze_video` 独立,默认关闭。需要可下载录像时明确启用录屏。
- `mobile_config(section="model"/"capabilities"/"exploration"/"reports")` 可查看非敏感默认值。用户只要求运行本次任务时用临时覆盖;只有要求保存默认值才用 `changes` 和 `persist_defaults=true`。
## Flash / Pro 提交
```python
mobile_run_task(
request_id="由调用方为本次提交生成的唯一编号",
task_desc="打开目标应用设置页,确认深色主题状态,保留证据;不要修改设置。",
model="Flash",
device_serial="用户指定的设备编号",
runtime_overrides={"reasoning_effort": "high", "record_video": True},
)
```
- 任务提示词包含目标、必要前置条件和预期。不把业务约束仅写在批次元数据里。
- `locked_app_package` 限定应用;跨应用流程不应锁定单个包。
- Pro 的 `verification_level`:off 关闭检查、final 结束检查(默认)、checkpoints 检查点加结束检查、strict 更严格检查点。关闭检查后不能把执行完成视为有验收证据。
- Pro 的 `explorer_mode`:flash 单次定位、pro 多轮定位、ultra 深度像素分析。只有明确需要时增加感知深度,避免无必要开销。
- `expected_output_desc` 描述 Pro 需要生成的详细报告;Flash 仍可导出已有步骤/结果报告,不依赖这个参数。
- 纯电脑任务 `runtime_overrides.execution_target="computer"`,不传手机编号;安卓为主且偶尔控制电脑时,通常保留默认目标并让 ARTEMIS 自行选择已授权插件,见 [插件参数](plugins.md)。
返回后保存 `trace_id`。提交回复丢失时调用 `mobile_manage_task(action="lookup", request_id=原编号)`;得到 trace_id 后查状态。`submission_state=unknown/submitting` 不等于未执行,不能换编号自动重跑。
## 跟踪、指导与结束
- `mobile_manage_task(status, trace_id)` 查询当前状态。按工具建议或约 30–60 秒间隔查询,用户正在追问时可立即查看;不无休止紧密轮询,不承诺宿主未实现的后台通知。
- `pause` 返回 pausing 只代表已接收;直到 task_paused 才能认为暂停完成。`resume` 继续原任务,恢复后重新观察并进入资源队列。
- `inject_instruction` 传 `instruction` 指导现有任务;模型等待或只读诊断可取消,已经开始的设备动作先安全结束。暂停中发送指导会恢复,用户只希望暂存文字时不要误调用。
- `guidance_history` 区分 pending/consumed,已领取仍不保证动作成功,需读后续步骤。
- Pro 连续监控的 `[Loop:continuous]` 里程碑结束使用 `release_loop=true`;自然语言“结束”不能代替明确控制信号。`stop` 用于用户要求取消当前任务。
- `completed/failed/cancelled/interrupted/skipped` 为执行终态;检查 test_result 再说明通过、失败、未验证或阻塞。人工判定附来源和原 AI 判定,不改写原始证据。
- 实际耗时受模型、网络及设备影响,不能固定扣减 5/30 秒当作精确等待。最终外部测试脚本应使用明确等待条件。
## 安卓文件
任务内部支持 `android_file`,外层以任务目标交给 ARTEMIS,文件操作也走队列。截图原生 PNG 默认留存任务 trace;明确要求桌面时额外复制并校验,不需电脑插件。读写文本、列目录、pull/push 使用目标 Android 路径及任务文件边界,不能绕过应用私有目录权限。已有文件默认不覆盖。只有工具返回实际路径及校验结果才说明保存成功;「全部资料」导出包含任务文件。
@@ -1,99 +0,0 @@
# 插件开发与证据协议(2.0.0)
新插件必须适配本文规则,再通过实测进入市场。旧 `schema_version: 1` 仍可读取;新包使用版本 2,并声明 `capabilities`。模型执行、任务队列、资源锁、超时和报告由 ARTEMIS 管理,插件不另建任务调度器,也不替用户决定用例通过。
## 从可运行模板开始
模板见 [evidence-demo](../assets/evidence-demo/plugin.json)。先复制整个模板目录到用户指定开发目录;执行 `mobile_workspace(include_devices=false, include_development=true)` 获取当前 ARTEMIS 的 `development.python_executable`,将其作为 `<ARTEMIS_PYTHON>`(路径含空格时按 Shell 正确引用)。主程序未启动时也可使用用户指定 ARTEMIS 环境的 Python,先确认能 import artemis;不能假设当前工作目录是 ARTEMIS 仓库。运行:
```sh
<ARTEMIS_PYTHON> <本Skill目录>/scripts/check_plugin.py <插件目录>
<ARTEMIS_PYTHON> <本Skill目录>/scripts/check_plugin.py <插件目录> --live
```
`--live` 启动 MCP、检查真实工具定义后关闭,不执行写操作。模板默认使用 PATH 中的 Python;需要指定解释器时传 `--values '{"python":"解释器绝对路径"}'`。
网页「插件 → 高级接入」支持插件目录或 ZIP 文件的完整路径。开发时可直接填模板目录;分发时在用户指定输出目录执行以下命令,生成根层包含 `plugin.json` 的 `evidence-demo.zip`:
```sh
<ARTEMIS_PYTHON> -c "import shutil; shutil.make_archive('evidence-demo', 'zip', '用户的插件目录')"
```
模板只提供文件写入工具,没有视觉观察工具。空目录加 ARTEMIS Python 即可完成清单和握手检查;它不能独立承担纯电脑任务。完整任务验收还需已连接 Android 设备,或另一个已启用、已授权且提供观察能力的视觉插件。不要为通过检查伪造 observation 能力。
具备上述条件后,在插件设置中确认 `python` 指向已安装 MCP 依赖的解释器,再启用并提交“调用文件证据示例保存一段文本”。在任务步骤查看工具结果,下载「全部资料」查看 `任务文件/插件/evidence-demo/` 和 `证据索引.json`,回读文件并核对 SHA-256。没有设备或视觉插件时,明确交付已完成的检查和未执行的完整任务验收。
静态检查通过不等于市场准入,也不表示业务测试通过。需按下面清单提交实际验证记录。
## 清单与工具能力
`plugin.json` 的安装、版本约束、资源、权限设置沿用 [插件说明](plugin-manifest.md)。版本 2 增加:
| 字段 | 规则 |
| --- | --- |
| `capabilities.kind` | `visual`、`terminal`、`api`、`file`、`other` |
| `capabilities.recording` | `none` 或 `windows`;只有视觉插件可声明 Windows 屏幕录制 |
| `capabilities.tools` | 按真实 MCP 工具名定义;未声明和缺失工具均拒绝加载 |
| `effect` | `read` / `write`,必须如实声明 |
| `observation` | 自动观察必须只读;MCP 的 `readOnlyHint` 也必须为 true |
| `idempotent` | 重复调用是否产生额外效果,不授权自动重试未知结果的写操作 |
| `target_argument` | 指明资源目标的顶层参数名,必须存在于工具 JSON Schema |
| `cancellation` | `confirmed` / `unknown`,描述工具承诺;不能代替实际停止核对 |
| `evidence` | `text` / `image` / `file` / `state` 列表 |
| `required_tools` | Skill 依赖的工具名,加载时校验 |
MCP 参数必须有类型及合理范围;普通插件不能用不受约束的 shell 代替业务能力。终端插件若声明命令能力,应明确主机、工作目录、权限和命令边界。资源作用域用已有 `resources` 和配置约束声明;这些不是操作系统沙箱。
启动、调用、关闭分别受既有 30/60/15 秒默认预算约束,并服从任务总超时。每个写操作最多派发一次;超时、取消或部分执行后先观察真实结果。远端动作未确认停止时保持资源保护。
## 结果回执
MCP 保留标准 `content` 和 `isError`,在 `structuredContent.artemis` 返回版本 1 回执:
```json
{
"version": 1,
"execution": "completed",
"side_effect": "confirmed",
"retryable": false,
"source": {
"kind": "computer", "target_id": "真实窗口标识", "label": "控制台",
"captured_at": 1792000000.25, "width": 1280, "height": 720,
"window": {"left": 0, "top": 0, "width": 1280, "height": 720},
"screen": {"left": 0, "top": 0, "width": 1920, "height": 1080}
},
"attachments": []
}
```
- `execution`:`not_started`、`completed`、`partial`、`unknown`;`side_effect`:`none`、`possible`、`confirmed`。错误提供稳定的 `error_code` 和实际原因。只有明确未执行的请求才可声明 `retryable`,宿主仍受预算约束。
- 截图必须属于本次目标。尺寸和范围使用物理像素,时间为 Unix 秒;`target_id` 不能只是插件名。移动、缩放、换屏、换窗口后重新观察。平台结合目标和几何信息生成来源身份,避免拿旧图做动作前证据。
- 视觉工具通过标准 MCP image 返回图像;无法截图明确返回原因,不混入其他屏幕或猜坐标。终端返回退出码、输出和工作目录,API 返回状态/业务结果,文件返回校验信息,无须伪造图片。
- 平台生成 `call_id`、步骤关联、开始结束时间,并写入 trace。插件不能根据一次工具成功自行生成整条用例通过结论。
## 文件、录像与生命周期
stdio 宿主注入 `ARTEMIS_ARTIFACTS_DIR`,插件默认把生成文件写入该目录。附件回执包含普通 `name`、`media_type`、`sha256`,不接受任意宿主绝对路径;远端插件可附带 base64 `data`。单附件不超过 64 MiB,并同时受工具结果总大小限制。禁止路径穿越、符号链接和覆盖同名不同内容。
要求另存桌面时先产生并验证任务副本,再复制用户指定位置,分别报告实际结果。任一写入失败不声称全部成功。平台校验回读字节和 SHA-256,保存到任务索引;单任务和批次下载包含原生附件及插件证据。
录屏默认关闭。打开后,首次取得目标观察便启动已声明来源的录制,后续动作和等待持续录制;暂停收尾,恢复追加片段,任务结束关闭进程。电脑默认记录目标所在屏幕,可改为仅目标窗口。屏幕录像可能包含同屏其他可见内容;窗口截图仍只属于目标窗口,两者范围不同。
留档参数独立于模型截图:默认长边 1280、15 fps、H.265 目标 1000 kbps / H.264 1500 kbps。自动模式只有网页播放能力确认支持 HEVC 才尝试硬件 H.265,否则 H.264;编码不可用则有界回退并保留原因。网页使用真实任务时间轴,缺口不会被拼接抹去。H.265 的实际网页支持取决于浏览器/系统,手动优先 H.265 后无法播放应下载或为后续任务选择 H.264,不在下载时整段转码。
录制故障不能把成功动作改为失败,也不能把缺失证据推断为测试通过。录像文件只保留一套留档版本;磁盘不足停止采集并告警。不自动恢复路由器参数、电脑状态或用户文件;只有任务提示词提出恢复要求时才执行普通恢复步骤。连接关闭、进程回收和锁释放始终必要。
## 提交市场前的验证
- 公共:安装/升级兼容、真实工具与清单一致、参数限制、失败/部分执行、超时取消、版本固定、资源互斥、导出索引、卸载后历史可读、无凭据泄漏。
- 视觉:截图来源、遮挡、DPI、窗口切换、坐标一致、无图时拒绝盲点;录屏启动/结束/暂停恢复、编码回退、磁盘不足、时间缺口、关键节点、播放状态、中文可读性及长程体积。
- 文件:中文文件名、覆盖保护、校验失败;终端/API:退出码、业务结果和不确定副作用。
- Skill 必须只描述真实存在且已适配的能力,不绕过权限、调度和证据协议。保留来源和必要许可证,版本与实测范围明确;未测平台/场景不能写成已通过。
## 从第三方项目适配到市场
先核对许可证、运行平台、工具 Schema 和实际结果结构,再实现 ARTEMIS 适配;不能只复制上游 Skill 就宣称兼容。上游版本与 ARTEMIS 适配修订分别记录,例如 Cua `0.36.0+artemis.3`。
开发交付应包含 plugin.json、实现/依赖声明、插件自己的 Skill、许可证/来源、安装 ZIP 与 SHA-256、实际验证记录。静态检查和握手检查只验证对应层次,不能宣称实际操作、精度或录屏已通过。通过网页「插件 → 高级接入」导入,再经 ARTEMIS 正常任务验证时间线、暂停、证据与报告;不要绕过资源锁直接并行操作用户设备。
市场仓库为 https://git.playones.com/chenmingxuan/Artemis-Plugins 。只有用户明确要求发布/提交时才推送或发起市场提交;开发授权本身不代表发布授权。市场包使用固定版本、HTTPS 下载和 SHA-256,不覆盖同一版本的不同内容。未测平台和场景须明示。
@@ -1,127 +0,0 @@
# 插件与跨端任务(2.0.0 开发版)
插件开发请阅读 [能力、证据协议与验收规则](plugin-development.md),可运行模板位于 [Skill 内的 evidence-demo](../assets/evidence-demo/plugin.json)。新插件使用清单版本 2;版本 1 仍兼容。
步骤卡标明安卓、电脑等来源,可点击查看对应录像;同一步内保留实际工具调用。开启「保存录屏」后,已使用的安卓和电脑来源各自留档,通过播放器切换。电脑录屏需要插件提供版本 2 的来源回执和录像能力声明,当前市场使用 `cua-driver` 0.36.0;旧 `open-computer-use` 适配包从 1.1.0 起支持,但已从市场下架;仅更新 ARTEMIS 源码不会升级已安装插件。旧任务缺失的电脑录像无法补录,播放器会提示查看已有步骤截图。
真实时间轴保留暂停和录制中断的缺口;连续播放自动进入下一段,拖动进度到缺口时跳到下一段,并提示跳过的时间。播放器单独显示实际录制时长及蓝色录像覆盖区间;从步骤定位到未录制时间时仍明确显示缺失,不以其他时间或来源的画面替代。录像默认 1280 长边、15 fps,编码参数在功能设置的「录像留档设置」调整;不会降低模型观察截图的分辨率。
Windows x64 的窗口录像使用 Windows Graphics Capture,再交给现有 FFmpeg 编码,避免 GDI 抓取硬件加速浏览器窗口时只有黑屏。启动脚本同步 `windows-capture` 依赖;仍沿用 H.265 硬件编码与 H.264 兼容回退。窗口录制不会自动扩大为整个桌面。未取得可辨识首帧、窗口最小化/关闭或采集进程异常退出时明确记录失败原因,并保留已有片段;旧任务已经录成的黑帧无法恢复成真实视频,可查看原步骤截图。
单任务「全部资料」和批次资料包含插件截图、录像、调用回执和生成文件,`证据索引.json` 使用包内路径关联附件。电脑截图默认保存任务 trace,明确要求桌面时额外复制并校验。工具执行完成与测试通过仍分别呈现,不自动恢复业务环境。
ARTEMIS 可通过插件连接 stdio 或 Streamable HTTP MCP 服务,并按需加载插件内的 Skill。Flash、Pro、网页任务和批次复用同一套插件执行层。版本仍在开发验证中,市场只收录完成实际验证的安装包。
## 安装和配置
打开网页导航中的「插件」。可以从市场安装,或在「高级接入」导入包含 `plugin.json` 的目录/ZIP,也可以填写自定义 MCP 清单。安装不执行安装钩子,新装或升级后默认未启用。
普通使用只需「安装 → 启用」。电脑控制插件无需填写参数;首次启用时确认允许 ARTEMIS 操作电脑,授权保存在本机,以后无需重复确认。只有插件声明了必填参数时,才会打开设置表单,填写后勾选允许并「保存并启用」。
需要切换不同设备、账号或限制操作范围时,再展开「高级设置 · 多套参数与控制范围」,管理多套参数、默认设置、工具白名单、允许的参数值和共享资源。密码留空保留已保存的值;页面和 MCP 查询只返回已配置的密钥名称。不要把密钥写进清单、提示词或任务 JSON。
新装插件已有默认设置,无需创建或命名。安卓任务默认可使用支持手机扩展(targets 含 android 或 mixed)、已启用且默认设置已授权的插件。AI 先读取能力简介,需要外部操作时才加载对应工具和 Skill。任务中也可以明确选择插件;只有存在多套已授权设置时,才显示设置选择框。空列表表示不使用插件。
正在排队、暂停和执行中的任务会固定插件版本,并阻止修改配置、启停、升级或卸载。操作结束后再修改。卸载会移除插件安装文件与连接配置,历史证据仍保留。
## 执行任务
任务输入区和批次导入区保持安卓测试入口,无需选择“手机 + 电脑”。照常描述任务,例如“电脑修改路由器参数,再在手机验证并恢复”。默认收起的「扩展插件 · 自动」可展开指定插件,或取消自动选择且不勾选插件,以仅使用手机能力。
探索、Pro 和 Flash 都将插件的实际文字结果与截图交给执行模型,并保留对应调用编号;手机观察保持独立。电脑操作的步骤摘要和历史截图读取使用该次插件证据,不能用手机画面替代。若一个步骤包含多个来源的操作,查看各工具调用的截图,不把它们拼成同一屏幕的前后对比。插件没有返回图片或图片读取失败时,会明确保留证据缺失状态。
最终核验附带各来源最近两次记录的画面(最多预览八个来源,其余通过历史工具读取),标明步骤、目标和采集时间。相同前后截图保留两次观察记录并共用图片文件;画面不变只是证据,不能单凭它判定点击成功、已到页底或测试通过。核验结论按要求说明已确认、发现问题、待确认或受阻,缺证据时列出具体缺项。
Flash 和探索在电脑操作后的正时长 `wait_for_delay` 只等待,不刷新手机;等待后通过插件观察工具核对电脑状态。单独调用 `wait_for_delay(time_in_ms=0)` 才主动切回手机并读取新画面,旧手机控件编号不能继续使用。完全相同的前后截图直接生成事实摘要,避免重复请求视觉模型;其他视觉摘要将固定规则和任务目标放在稳定前缀中,实际缓存命中由模型服务返回值统计。
插件长文本默认向模型提供最多 12,000 字符的首尾节选,完整脱敏结果保存在当前任务的 `evidence/plugin-results/`。节选提示中的 `call_id` 可通过内部工具 `plugin_read_result(call_id, offset)` 分页读取,每页最多 12,000 字符;读取范围仅限本任务,不能传入任意文件路径。截图与错误状态独立保留,文本节选不代表证据缺失或验证通过。
电脑动作返回的稳定截图和控件树可直接用于下一步,切换窗口、用户接管、画面变化或证据不够时再观察。成功的只读插件步骤使用本地工具回执摘要,不再额外调用视觉模型;写操作和错误步骤仍按原流程整理证据。视觉摘要中的插件文字限为 2,000 字符,完整证据不受影响。纯观察不计入要求更新计划的连续动作数;笔记记录新结论、阻塞和关键进度,避免机械地重复读写。
Flash 在连续插件操作期间不再逐次抓取、发送无关的手机截图,电脑证据保留在对应工具返回中。切回安卓时先刷新手机画面,再由模型重新决定动作;同轮中根据旧手机编号或坐标发出的动作会暂缓执行。收到用户指导或从暂停恢复时也会重新观察,避免沿用人工操作前的画面。
高级 JSON、CLI 和 SDK 保留以下执行目标参数:
| 目标 | 含义 |
| --- | --- |
| `android` | 默认手机任务,AI 按需调用已授权扩展插件 |
| `computer` | 纯电脑任务,无需 Android;必须选择提供观察能力的插件 |
| `mixed` | 显式跨端任务;普通安卓任务无需设置此值 |
单任务 `runtime_overrides`、批次每项 `task_config` 都支持:
```json
{
"execution_target": "computer",
"plugins": [{"id": "cua-driver", "profile": "default"}],
"timeout_seconds": 1800
}
```
这只是配置引用示例,先安装并启用对应插件。不要从名字推断本机已安装它。`mobile_workspace` 返回实际插件状态和连接配置,纯电脑任务可传入 `include_devices=false` 跳过 ADB 查询;`mobile_run_task` 及 `mobile_batch` 使用现有队列。
CLI:`uv run artemis run "观察目标窗口并验证结果" --target computer --profile flash`。`--plugins-json` 可指定上面的插件引用数组。电脑和混合任务不会在队列服务失败后自动重复提交到另一执行器;`--standalone` 是显式选择本地 SDK 执行。
SDK:先 `await agent.init(execution_target="computer")`,然后 `agent.new_task(goal).with_plugins([...]).build()`。插件引用使用 `artemis.plugins.models.PluginSelection`。`for_target()` 可设置构造器目标,必须与 `Agent.init` 相符。
## 共享资源与中断
同一目标应使用同一个资源名,例如 `desktop:local` 或 `router:lab`。当前采用保守调度:任务启动时统一预留所有可用插件声明的共享资源,避免执行中跨端加锁死锁;工具与进程仍按需加载。需要独立并行的手机任务可设置 plugins: [],不占插件资源。资源名不区分大小写。不同插件操作同一路由器时也要使用相同资源名。无资源声明的 MCP 插件按插件与配置名称保守互斥。
暂停会先取消调用并关闭插件连接,再释放任务资源;恢复排队后重新观察。插件取消/超时的写操作可能已经生效,不能盲目重放。如果远程服务未确认动作停止,页面会显示资源保护及原因,用户核对后点击「已核对,解除保护」。这只解除 ARTEMIS 的保护,不会替用户终止远程操作。
工具返回成功表示调用完成,业务是否通过仍需实际证据。图片、工具文本、插件版本和动作结果进入任务记录;已有报告、截图下载和人工复验入口继续使用。Word 的「扩展插件操作」与 Excel 的「插件操作」保留来源及实际结果,资料包截图名称含插件 ID。同一截图被多个任务引用时,删除最后一个任务后才清理。插件画面与手机截图属于不同来源,不能相互替代。电脑录像从首次取得有效窗口画面开始,按实际来源留存;启动失败或中断会保留状态和原因。
## 插件清单
```json
{
"schema_version": 2,
"id": "lab-control",
"name": "实验室控制",
"version": "1.0.0",
"artemis_version": ">=2.0.0,<3.0.0",
"platforms": ["win32"],
"architectures": ["amd64"],
"targets": ["mixed"],
"server": {
"transport": "stdio",
"command": "${plugin_dir}/bin/server.exe",
"args": [],
"env": {"TOKEN": "${secret.token}"}
},
"skill": "SKILL.md",
"config": {"token": {"label": "连接密钥", "secret": true, "required": true}},
"resources": ["router:lab"],
"capabilities": {
"kind": "api", "recording": "none", "required_tools": ["read_status"],
"tools": {"read_status": {
"effect": "read", "observation": false, "idempotent": true,
"cancellation": "confirmed", "evidence": ["state", "text"]
}}
}
}
```
HTTP 服务使用 `{"transport":"streamable_http","url":"https://example.com/mcp","headers":{"Authorization":"Bearer ${secret.token}"}}`。配置引用支持 `${config.字段}`、`${secret.字段}` 和 `${plugin_dir}`;参数直接以 argv 启动,不经 shell。纯 Skill 可省略 `server`。Skill 的引用文件必须在包内,按需读取支持不超过 256 KiB 的 Markdown、文本和 JSON。
提供电脑画面观察的插件声明 `observation`,其中 `tool` 和 `arguments` 为初始观察调用,`refresh_tools` 为模型选择目标后可复用的只读观察工具名。例如初始列窗口,选择窗口后每步刷新该窗口。观察允许只返回文字;无图时不能伪造截图或推测像素坐标。
清单提供的工具和参数范围检查不是操作系统沙箱;第三方进程以当前用户权限运行。市场包使用 HTTPS、SHA-256、平台/版本检查及安全解压,包内应保留许可证和来源记录。
市场索引为 `{"schema_version":1,"plugins":[...]}`,每项包含 `manifest`、`archive_url`、`sha256`、`verification`,以及 release_stage(stable 或 preview,默认 stable)。开发预览在市场明确标注,并提供已验证范围和未覆盖场景。同一版本不可覆盖,先验证新包再使用新版本号。
## 环境参数
| 环境变量 | 默认值 |
| --- | --- |
| `ARTEMIS_PLUGIN_MARKETPLACE_URL` | Artemis-Plugins 仓库的 catalog.json |
| `ARTEMIS_PLUGIN_START_TIMEOUT_SECONDS` | 30 秒 |
| `ARTEMIS_PLUGIN_TOOL_TIMEOUT_SECONDS` | 60 秒 |
| `ARTEMIS_PLUGIN_SHUTDOWN_TIMEOUT_SECONDS` | 15 秒 |
| `ARTEMIS_PLUGIN_DOWNLOAD_TIMEOUT_SECONDS` | 300 秒 |
| `ARTEMIS_PLUGIN_DOWNLOAD_MAX_BYTES` | 128 MiB |
| `ARTEMIS_PLUGIN_EXTRACT_MAX_BYTES` | 512 MiB |
| `ARTEMIS_PLUGIN_RESULT_MAX_BYTES` | 16 MiB |
修改环境参数后重启开发版服务。任务总时限仍由现有执行保护控制,插件不会自行无限重试。
@@ -1,28 +0,0 @@
# 插件任务参数
先调用 `mobile_workspace`,只选实际存在、已启用且配置已授权的插件。纯电脑任务使用 `include_devices=false`,避免不必要的 ADB 查询。通过现有 `mobile_run_task` 发起电脑任务:
```json
{
"request_id": "本次提交的唯一编号",
"task_desc": "观察已打开的测试控制台,确认参数值符合用户预期,并保留证据。",
"model": "Flash",
"runtime_overrides": {
"execution_target": "computer",
"plugins": [{"id": "cua-driver", "profile": "default"}],
"timeout_seconds": 1800
}
}
```
示例中的插件必须已安装;不要为解决缺插件而调用宿主私有电脑工具代替 ARTEMIS 执行。`computer` 无需 `device_serial`,`mixed` 同时需要手机与插件资源。批次每个用例的 `task_config` 使用相同字段,可混合不同配置和执行目标。
网页首页的“仅 PC”勾选项与 `runtime_overrides.execution_target="computer"` 等价,Flash、Pro、探索均支持;Android 离线、锁屏或未安装 ADB 不阻止电脑任务。电脑任务仍需有效模型配置及至少一个已启用、已授权并提供画面观察的电脑插件。探索创建时使用 `task_config`,批量 Excel 的“任务配置(JSON)”可直接填写 `{"execution_target":"computer"}`。不要把 `pc_only` 或 `include_devices` 当作提交参数;后者只用于工作区发现。
未提供 `plugins` 表示使用该目标下已启用插件的授权默认配置;空数组明确不用插件。只提供插件 ID 和配置名称,版本由服务在入队时固定。安装、授权、连接凭据和资源保护解除由用户在插件页面处理。
插件超时/取消后先查任务状态和错误,不自动重放点击或配置写入。`mobile_workspace.blocked_resources` 非空时说明存在尚未确认停止的资源,不能声称暂停已安全完成。工具返回成功还需从后续画面或结构化读数验证业务结果。
普通安卓测试无需指定 execution_target 或 mixed:省略 plugins 时,AI 可以按需加载已启用、默认配置已授权且支持 android/mixed 的插件。仅需手机能力或不希望预留桌面资源时使用 plugins: []。网页、MCP 和批次采用相同规则。
连接失败可使用 `mobile_workspace(include_devices=false, plugin_id=实际插件ID, probe_plugin=true)`;它会启动已授权插件做连接和工具声明检查,不执行测试动作。读取清单不等于实测通过。
@@ -1,47 +0,0 @@
"""Validate a plugin package; --live checks MCP declarations without executing actions."""
import argparse
import asyncio
import json
from pathlib import Path
from artemis.plugins.evidence import validate_tools
from artemis.plugins.models import PluginManifest, PluginProfile
from artemis.plugins.session import PluginSession, resolve_server
from artemis.plugins.store import contained_path
async def check(directory: Path, live: bool, values: dict[str, str]) -> None:
manifest = PluginManifest.model_validate_json((directory / "plugin.json").read_text("utf-8"))
manifest.check_compatible()
if manifest.skill:
skill = contained_path(directory, manifest.skill)
if not skill.is_file() or not skill.read_text("utf-8").strip():
raise ValueError("缺少有效的 Skill")
if manifest.schema_version != 2:
raise ValueError("新市场插件必须适配 schema_version=2")
if live and manifest.server:
server = resolve_server(manifest, PluginProfile(values=values), directory)
session = await PluginSession(server, directory).start()
try:
validate_tools(manifest, session.tools)
finally:
await session.aclose()
print(
f"PASS {manifest.id} {manifest.version}: 清单/兼容性/Skill"
+ ("/MCP 工具声明" if live else "")
)
print("此检查不代替实际执行、超时取消、证据导出和视觉能力验收。")
def main() -> None:
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("directory", type=Path)
parser.add_argument("--live", action="store_true")
parser.add_argument("--values", default="{}", help="普通配置 JSON;不得包含密钥")
args = parser.parse_args()
asyncio.run(check(args.directory.resolve(), args.live, json.loads(args.values)))
if __name__ == "__main__":
main()