feat: release 2.3.0 with workspace plugin extensions
This commit is contained in:
1 parent
8380057548
commit
bb873ec0e0
44 files changed
+1497
-48
No files matched your search
@@ -17,6 +17,7 @@ ARTEMIS 自己编排手机和已授权插件,共用网页的任务队列、历
|
||||
| 给出任务编号,问失败原因、token、缓存、录像或最终结论 | [诊断与复盘](references/diagnostics.md) |
|
||||
| 使用电脑、路由器、终端等已安装能力 | [插件任务参数](references/plugins.md) |
|
||||
| 编写、适配、验证或发布 ARTEMIS 插件 | [插件开发规范](references/plugin-development.md),按需读取 [清单与市场协议](references/plugin-manifest.md) |
|
||||
| 开发回放侧栏、人工表单或扩展报告字段 | [工作区插件接口(ARTEMIS 2.3.0+)](references/workspace-plugins.md) |
|
||||
|
||||
只读当前任务相关参考。普通执行不加载插件开发文档。
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# 插件开发与证据协议(2.0.0)
|
||||
# 插件开发 SDK 与证据协议(ARTEMIS 2.3.0)
|
||||
|
||||
新插件必须适配本文规则,再通过实测进入市场。旧 `schema_version: 1` 仍可读取;新包使用版本 2,并声明 `capabilities`。模型执行、任务队列、资源锁、超时和报告由 ARTEMIS 管理,插件不另建任务调度器,也不替用户决定用例通过。
|
||||
新插件必须适配本文规则,再通过实测进入市场。旧 `schema_version: 1` 仍可读取;执行插件使用版本 2,并声明 `capabilities`。工作区面板和人工表单使用版本 3,详见[工作区插件接口](workspace-plugins.md)。纯工作区插件不加入任务执行选择,不向模型开放人工评审写入工具。模型执行、任务队列、资源锁、超时和报告由 ARTEMIS 管理,插件不另建任务调度器,也不替用户决定用例通过。
|
||||
|
||||
## 从可运行模板开始
|
||||
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
# 插件与跨端任务(2.0.0 开发版)
|
||||
|
||||
ARTEMIS 2.3.0 支持 schema_version=3 工作区扩展:左右回放面板、人工选填表单与报告字段,见[开发接口](workspace-plugins.md)。纯工作区插件不加入执行插件选择。
|
||||
|
||||
插件开发请阅读 [能力、证据协议与验收规则](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 源码不会升级已安装插件。旧任务缺失的电脑录像无法补录,播放器会提示查看已有步骤截图。
|
||||
|
||||
@@ -0,0 +1,78 @@
|
||||
# 工作区插件:侧栏、人工字段与报告
|
||||
|
||||
工作区扩展使用 `plugin.json` 的 `schema_version: 3` 和 `workspace` 声明。旧版 1/2 执行插件继续兼容。纯工作区插件无需 MCP、Skill、模型、设备或任务资源,不出现在任务执行插件选择器中;安装后手动启用即可在历史任务上使用。此接口从 ARTEMIS 2.3.0 起提供;插件必须声明 `artemis_version: ">=2.3.0,<3.0.0"`,2.2.x 不支持。
|
||||
|
||||
## 声明接口
|
||||
|
||||
清单仍要求 `capabilities`。纯界面插件填写 `{"kind":"other","tools":{}}`,可将 `targets` 设为空数组。工作区声明完全由宿主渲染,不加载任意 JavaScript、HTML 或后端执行钩子。
|
||||
|
||||
以下是可直接保存为 `plugin.json` 的完整最小清单:
|
||||
|
||||
```json
|
||||
{
|
||||
"schema_version": 3,
|
||||
"id": "review-example",
|
||||
"name": "评审扩展示例",
|
||||
"version": "1.0.0",
|
||||
"artemis_version": ">=2.3.0,<3.0.0",
|
||||
"platforms": ["win32", "linux", "darwin"],
|
||||
"targets": [],
|
||||
"capabilities": {"kind": "other", "tools": {}},
|
||||
"workspace": {
|
||||
"panels": [
|
||||
{"id":"requirements","title":"任务需求","side":"left","kind":"initial_prompt","width":{"preferred":340,"minimum":240,"maximum":480}},
|
||||
{"id":"review","title":"人工评审","side":"right","kind":"form","width":{"preferred":360,"minimum":260,"maximum":520}}
|
||||
],
|
||||
"fields": [
|
||||
{"id":"execution_accuracy","label":"AI执行准确性","kind":"choice","options":["通过","失败"]},
|
||||
{"id":"execution_note","label":"AI执行准确性备注","kind":"text","max_length":2000}
|
||||
]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
- `panels`:最多两个,`id` 和 `kind` 各自唯一;`side` 为 left/right。`initial_prompt` 展示该次运行最初收到的任务需求提示词,复用宿主 Markdown 渲染及 HTML 清理;不展示模型拆解步骤或后续指导。`form` 渲染本插件声明的字段。
|
||||
- `width`:CSS 像素,满足 minimum ≤ preferred ≤ maximum。minimum 范围 160–800,preferred 200–1000,maximum 200–1200。宿主优先采用首选宽度,并根据播放器、窗口空间调整;窄屏可低于 minimum 防止溢出。开关位于回放标题栏,以左右方向表示展开与收起。普通浮窗、影院均支持,默认收起;宽屏左右独立展开,窄屏一次展开一侧;单侧也始终位于回放左侧或右侧,不切换为上下排列。
|
||||
- `fields`:最多 20 个,`id` 唯一;`kind` 为 choice/text。choice 声明非空、不重复的 options,显示为互斥分段按钮,再次点击已选项可清空;text 使用多行输入。description 可选。max_length 默认 2000、最高 10000;report 默认 true。所有字段均选填,空字符串表示未填写,用户可清空。
|
||||
- 两项人工评审的标签和说明由插件提供;宿主不推断结果、不调用模型、不覆盖执行状态、AI 原判或既有人工复验。
|
||||
|
||||
## 任务数据接口
|
||||
|
||||
`GET /api/task-extensions/{session_id}` 返回 `session_id`、`initial_prompt`、`editable` 和已安装且启用的插件贡献列表。每项包含 plugin_id/name/version/workspace/revision/values/history。无插件时列表为空。
|
||||
|
||||
`PUT /api/task-extensions/{session_id}/{plugin_id}` 接收:
|
||||
|
||||
```json
|
||||
{"values":{"execution_accuracy":"通过","execution_note":"人工核对"},"expected_revision":0,"request_id":"00000000-0000-4000-8000-000000000001"}
|
||||
```
|
||||
|
||||
values 是本次提交的字段;未提交的字段保持原值。保存仅允许终态任务(完成、失败、取消、中断、跳过),运行中只读。宿主校验声明、长度和选项;expected_revision 防止多个页面互相覆盖。网络重试复用 request_id 和相同内容,不追加重复历史;修改内容使用新 request_id。保存冲突返回 409,并保留页面输入。
|
||||
|
||||
数据复用宿主 automation_records,以 task_extensions/session_id 保存各插件独立记录;历史包含字段声明、插件版本、保存时间、revision 和当时值。按单次运行绑定,复跑不继承评审。禁用/卸载隐藏界面与新导出的字段,但保留历史;重新安装启用同一插件 ID 后恢复。删除任务/批次时同步清理对应评审。
|
||||
|
||||
## 导出
|
||||
|
||||
已安装且启用的插件声明 report=true 的字段,进入单任务 Word/Excel、批次 Word/Excel 汇总和 ZIP 内报告。未填字段留空,不阻止导出。未安装、禁用或卸载时无对应报告区块;已下载文件保持原内容。
|
||||
|
||||
单任务导出指纹包含扩展快照,批次缓存包含插件安装/启用声明与任务扩展修订。保存使用既有导出锁并使批次报告失效,防止下载旧评审。导出不需要运行插件进程或调用模型。
|
||||
|
||||
## 独立人工评审插件
|
||||
|
||||
插件源代码位于独立 Artemis-Plugins 仓库的 `plugins/task-review/`,包名 task-review,版本 1.0.0,可从内置插件市场安装。它声明需求提示词面板,以及「AI执行准确性」「测试结果正确性」两个 通过/失败 字段和各自可选备注。
|
||||
|
||||
在已更新宿主的环境,用 `<ARTEMIS_PYTHON> <本Skill目录>/scripts/check_plugin.py <插件目录>` 检查清单,再在「插件 → 高级接入」导入目录或 ZIP。安装、启用、填写、清空、导出、禁用、卸载和重新安装均应通过确定性测试;只检查清单不代表界面和导出已验证。
|
||||
|
||||
|
||||
## 开发与兼容边界
|
||||
|
||||
这里的 SDK 是声明式清单协议与宿主 HTTP 接口,不要求编写插件运行进程。当前不支持自定义 JavaScript、HTML、上传控件、跨任务统计或任意报告模板钩子。执行插件可以在版本 3 清单中同时保留 MCP/Skill 和 workspace;原有工具、资源和证据约束仍适用。
|
||||
|
||||
面板及字段 id 使用小写字母开头的字母、数字、下划线,最长 48 字符;稳定 id 是历史数据的键,不应为了改显示名称而更换。更改选项或删除字段不会迁移历史;当前导出按当前声明取值,发行不兼容字段变更前须验证旧数据。字段没有必填模式,不能以校验拦截用户的空项。
|
||||
|
||||
GET 成功返回完整贡献快照;PUT 成功返回同样结构和新 revision。404 表示任务不存在,422 表示请求结构、UUID 或参数格式无效;409 包含运行中只读、插件未启用、报告正在打包、修订冲突、无效字段值或幂等请求冲突。冲突时保留本地输入,刷新并由用户决定如何合并,不能自动覆盖。
|
||||
|
||||
人工结果只能由用户填写;AI 不自行调用 PUT 生成或推断评审。此接口未加入模型 MCP 工具或远程 Python SDK 的人工写入方法。插件没有设备目标时,无需为安装验证提交安卓/PC 测试任务;用隔离终态示例验证保存、清空、重装、导出与旧缓存失效即可。
|
||||
|
||||
市场发布时保持清单、ZIP、版本标签与 catalog-v3.json 内嵌清单一致;先上传不可变 ZIP 与 SHA256SUMS.txt 并回读验证,再更新索引。仅静态清单校验通过不能宣称全部平台已实测。
|
||||
|
||||
官方市场为 2.3.0+ 提供 catalog-v3.json,catalog.json 保留给 2.2.x。宿主读取原官方地址时自动选择新版索引,不改写用户配置;自定义市场地址不会被替换。
|
||||
@@ -18,8 +18,8 @@ async def check(directory: Path, live: bool, values: dict[str, str]) -> None:
|
||||
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 manifest.schema_version not in {2, 3}:
|
||||
raise ValueError("新市场插件必须适配 schema_version=2 或 3")
|
||||
if live and manifest.server:
|
||||
server = resolve_server(manifest, PluginProfile(values=values), directory)
|
||||
session = await PluginSession(server, directory).start()
|
||||
@@ -29,7 +29,7 @@ async def check(directory: Path, live: bool, values: dict[str, str]) -> None:
|
||||
await session.aclose()
|
||||
print(
|
||||
f"PASS {manifest.id} {manifest.version}: 清单/兼容性/Skill"
|
||||
+ ("/MCP 工具声明" if live else "")
|
||||
+ ("/MCP 工具声明" if live and manifest.server else "")
|
||||
)
|
||||
print("此检查不代替实际执行、超时取消、证据导出和视觉能力验收。")
|
||||
|
||||
|
||||
Reference in new issue
Block a user