From 76b3060a164825604581a08fb08847149fad0701 Mon Sep 17 00:00:00 2001 From: KeyInfo Bot Date: Thu, 24 Sep 2026 17:42:55 +0800 Subject: [PATCH] Sync third-party and MCP marketplace plugins Constraint: Public skills are published only by explicit administrator action unless they are tracked third-party market sources. Confidence: high Scope-risk: narrow Directive: Keep private/internal skills out of the public marketplace and preserve normal incremental market Git history. Tested: Marketplace validation passed. --- .agents/plugins/marketplace.json | 12 +++++ README.md | 2 + config/assets/artemis-case-prep.svg | 11 ++++ config/external-sources.json | 47 ++++++++++++++++++ config/external-sources.lock.json | 19 +++++-- .../codex/.agents/plugins/marketplace.json | 12 +++++ .../.codex-plugin/plugin.json | 2 +- .../THIRD_PARTY_SOURCE.json | 6 +-- .../.codex-plugin/plugin.json | 43 ++++++++++++++++ .../artemis-case-prep/THIRD_PARTY_SOURCE.json | 9 ++++ .../plugins/artemis-case-prep/assets/icon.svg | 11 ++++ .../skills/artemis-case-prep/SKILL.md | 37 ++++++++++++++ .../artemis-case-prep/agents/openai.yaml | 3 ++ .../assets/artemis-tasks.xlsx | Bin 0 -> 10791 bytes .../references/workbook-contract.md | 46 +++++++++++++++++ .../plugins/mcp-playwright/MCP_SOURCE.json | 2 +- .../next-skills/THIRD_PARTY_SOURCE.json | 4 +- scripts/sync_external_plugins.ps1 | 14 ++++++ 18 files changed, 268 insertions(+), 12 deletions(-) create mode 100644 config/assets/artemis-case-prep.svg create mode 100644 plugins/codex/plugins/artemis-case-prep/.codex-plugin/plugin.json create mode 100644 plugins/codex/plugins/artemis-case-prep/THIRD_PARTY_SOURCE.json create mode 100644 plugins/codex/plugins/artemis-case-prep/assets/icon.svg create mode 100644 plugins/codex/plugins/artemis-case-prep/skills/artemis-case-prep/SKILL.md create mode 100644 plugins/codex/plugins/artemis-case-prep/skills/artemis-case-prep/agents/openai.yaml create mode 100644 plugins/codex/plugins/artemis-case-prep/skills/artemis-case-prep/assets/artemis-tasks.xlsx create mode 100644 plugins/codex/plugins/artemis-case-prep/skills/artemis-case-prep/references/workbook-contract.md diff --git a/.agents/plugins/marketplace.json b/.agents/plugins/marketplace.json index b648de7a..2fc3d668 100644 --- a/.agents/plugins/marketplace.json +++ b/.agents/plugins/marketplace.json @@ -172,6 +172,18 @@ }, "category": "Developer Tools" }, + { + "name": "artemis-case-prep", + "source": { + "source": "local", + "path": "./plugins/codex/plugins/artemis-case-prep" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "Developer Tools" + }, { "name": "caveman", "source": { diff --git a/README.md b/README.md index dc8d6ca7..d9b275fc 100644 --- a/README.md +++ b/README.md @@ -35,6 +35,8 @@ Codex 插件页的大标题按 marketplace 来源分组,不是按插件 `categ `artemis-automation` 提供 Android 真机或模拟器的自然语言测试、批量用例、失败诊断、历史检索和报告交付流程。市场只分发 Skill;使用前需单独部署并配置兼容的 ARTEMIS MCP、Android 设备和模型网关。 +`artemis-case-prep` 根据原始 Android 测试工作簿筛选可自动化用例,保留原表副本并生成六列 ARTEMIS 任务表;它只准备文档,不启动测试。附带的六列模板尚不兼容 ARTEMIS 1.0.1 的七列原生导入器。 + 部分插件依赖特定运行环境。`$updating-gitea-repositories` 面向 Gitea HTTPS、GCM 和 PAT 工作流;`$etunel-role-collaboration` 仅在 Etunel 提供角色、成员、Hook 和任务上下文时使用。安装前应查看插件详情并确认运行前置条件。 `etunel-role-collaboration` 的插件版本对应上游正式 release 的版本号。更新插件不会自动修改 Etunel 的 Hook 配置或迁移在途项目;实际项目仍需按已确认的流程基线使用。 diff --git a/config/assets/artemis-case-prep.svg b/config/assets/artemis-case-prep.svg new file mode 100644 index 00000000..8c57c33e --- /dev/null +++ b/config/assets/artemis-case-prep.svg @@ -0,0 +1,11 @@ + + ARTEMIS case prep + + + + + + + + + diff --git a/config/external-sources.json b/config/external-sources.json index 27867b45..724e31c1 100644 --- a/config/external-sources.json +++ b/config/external-sources.json @@ -747,6 +747,53 @@ "hardware-development": "用于以 KiCad 为主的电子硬件开发,包括 Cadence/OrCAD 原理图转换、封装与网表核对、PCB 功能布局、布线验收、DRC 和 Gerber 制造交付。适用于已有电路的实施与审查,不用于纯软件或说明性框图。" } }, + { + "id": "artemis-case-prep", + "repo": "https://git.playones.com/hejunxian/artemis-case-prep.git", + "releaseChannel": "latest-stable", + "releaseProvider": "gitea", + "adapter": "claude-skill", + "pluginName": "artemis-case-prep", + "category": "Developer Tools", + "skillPath": ".", + "sparseCheckout": ["SKILL.md", "agents", "references", "assets/artemis-tasks.xlsx"], + "marketAssets": [ + { + "source": "config/assets/artemis-case-prep.svg", + "destination": "assets/icon.svg" + } + ], + "brandColor": "#177C80", + "manifestOverrides": { + "description": "从 Android 原始测试工作簿筛选可由 ARTEMIS 自动化的用例,标记原表副本并生成六列任务表。", + "author": { + "name": "hejunxian", + "url": "https://git.playones.com/hejunxian" + }, + "homepage": "https://git.playones.com/hejunxian/artemis-case-prep", + "repository": "https://git.playones.com/hejunxian/artemis-case-prep.git", + "license": "UNKNOWN", + "keywords": ["artemis", "android", "test-case", "workbook", "excel"], + "interface": { + "displayName": "artemis-case-prep", + "shortDescription": "筛选 Android 用例,生成可追溯的六列 ARTEMIS 任务表。", + "longDescription": "识别多工作表 Android 原始用例的适用性与自动化边界,保留原表并标记选择结果,按附带 Excel 模板生成六列 ARTEMIS 任务文档。只准备文档,不运行批次;六列模板目前不兼容 ARTEMIS 1.0.1 的七列原生导入器。", + "developerName": "hejunxian", + "category": "Developer Tools", + "capabilities": ["Interactive", "Read", "Write"], + "defaultPrompt": [ + "使用 artemis-case-prep 检查这份测试用例是否具备转换条件。", + "使用 artemis-case-prep 从原始工作簿准备六列任务表。" + ], + "websiteURL": "https://git.playones.com/hejunxian/artemis-case-prep", + "privacyPolicyURL": "https://git.playones.com/hejunxian/artemis-case-prep", + "termsOfServiceURL": "https://git.playones.com/hejunxian/artemis-case-prep", + "brandColor": "#177C80", + "logo": "./assets/icon.svg", + "composerIcon": "./assets/icon.svg" + } + } + }, { "id": "artemis-automation", "repo": "https://git.playones.com/chenmingxuan/Artemis-Eapil.git", diff --git a/config/external-sources.lock.json b/config/external-sources.lock.json index 02bc9f9c..bbd199c7 100644 --- a/config/external-sources.lock.json +++ b/config/external-sources.lock.json @@ -117,14 +117,23 @@ "commit": "fcbde2e9cfa14f3fd2e154d7bef6bd264da61fcd", "syncedAt": "2026-09-17T16:00:00Z" }, + { + "id": "artemis-case-prep", + "pluginName": "artemis-case-prep", + "repo": "https://git.playones.com/hejunxian/artemis-case-prep.git", + "ref": "v1.0.0", + "adapter": "claude-skill", + "commit": "94200db05a6b4d046222879b87672d45d791e756", + "syncedAt": "2026-09-24T09:40:56Z" + }, { "id": "artemis-automation", "pluginName": "artemis-automation", "repo": "https://git.playones.com/chenmingxuan/Artemis-Eapil.git", - "ref": "v1.1.1", + "ref": "v1.1.2", "adapter": "claude-skill", - "commit": "8522fa3ca3e341034325bf4844624d0893217e79", - "syncedAt": "2026-09-24T03:13:04Z" + "commit": "0e13bb5c2927bb9e858ace4f43ab9f479ba55c61", + "syncedAt": "2026-09-24T09:40:56Z" }, { "id": "embedded-app-pc-debug", @@ -159,8 +168,8 @@ "repo": "https://github.com/vercel/next.js.git", "ref": "canary", "adapter": "skill-collection", - "commit": "e71848173cf199bb56e88c1c04aa977cdb0a84df", - "syncedAt": "2026-09-24T03:13:04Z" + "commit": "76117ccd71fdfaf4d5377b7ed08d238de845321b", + "syncedAt": "2026-09-24T09:40:56Z" }, { "id": "shuorenhua", diff --git a/plugins/codex/.agents/plugins/marketplace.json b/plugins/codex/.agents/plugins/marketplace.json index 48dda127..6b873919 100644 --- a/plugins/codex/.agents/plugins/marketplace.json +++ b/plugins/codex/.agents/plugins/marketplace.json @@ -172,6 +172,18 @@ }, "category": "Developer Tools" }, + { + "name": "artemis-case-prep", + "source": { + "source": "local", + "path": "./plugins/artemis-case-prep" + }, + "policy": { + "installation": "AVAILABLE", + "authentication": "ON_INSTALL" + }, + "category": "Developer Tools" + }, { "name": "caveman", "source": { diff --git a/plugins/codex/plugins/artemis-automation/.codex-plugin/plugin.json b/plugins/codex/plugins/artemis-automation/.codex-plugin/plugin.json index 496d5635..3937a3cf 100644 --- a/plugins/codex/plugins/artemis-automation/.codex-plugin/plugin.json +++ b/plugins/codex/plugins/artemis-automation/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "artemis-automation", - "version": "1.1.1", + "version": "1.1.2", "description": "使用 ARTEMIS MCP 完成 Android 自动化测试、批量执行、失败诊断、历史检索和报告交付。", "author": { "name": "chenmingxuan", diff --git a/plugins/codex/plugins/artemis-automation/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/artemis-automation/THIRD_PARTY_SOURCE.json index a3540c05..31348232 100644 --- a/plugins/codex/plugins/artemis-automation/THIRD_PARTY_SOURCE.json +++ b/plugins/codex/plugins/artemis-automation/THIRD_PARTY_SOURCE.json @@ -1,9 +1,9 @@ { "sourceId": "artemis-automation", "repo": "https://git.playones.com/chenmingxuan/Artemis-Eapil.git", - "ref": "v1.1.1", - "commit": "8522fa3ca3e341034325bf4844624d0893217e79", + "ref": "v1.1.2", + "commit": "0e13bb5c2927bb9e858ace4f43ab9f479ba55c61", "adapter": "claude-skill", "sourcePath": "skills/artemis-automation", - "syncedAt": "2026-09-24T03:13:04Z" + "syncedAt": "2026-09-24T09:40:56Z" } diff --git a/plugins/codex/plugins/artemis-case-prep/.codex-plugin/plugin.json b/plugins/codex/plugins/artemis-case-prep/.codex-plugin/plugin.json new file mode 100644 index 00000000..0517d248 --- /dev/null +++ b/plugins/codex/plugins/artemis-case-prep/.codex-plugin/plugin.json @@ -0,0 +1,43 @@ +{ + "name": "artemis-case-prep", + "version": "1.0.0", + "description": "从 Android 原始测试工作簿筛选可由 ARTEMIS 自动化的用例,标记原表副本并生成六列任务表。", + "author": { + "name": "hejunxian", + "url": "https://git.playones.com/hejunxian" + }, + "homepage": "https://git.playones.com/hejunxian/artemis-case-prep", + "repository": "https://git.playones.com/hejunxian/artemis-case-prep.git", + "license": "UNKNOWN", + "keywords": [ + "artemis", + "android", + "test-case", + "workbook", + "excel" + ], + "skills": "./skills/", + "interface": { + "displayName": "artemis-case-prep", + "shortDescription": "筛选 Android 用例,生成可追溯的六列 ARTEMIS 任务表。", + "longDescription": "识别多工作表 Android 原始用例的适用性与自动化边界,保留原表并标记选择结果,按附带 Excel 模板生成六列 ARTEMIS 任务文档。只准备文档,不运行批次;六列模板目前不兼容 ARTEMIS 1.0.1 的七列原生导入器。", + "developerName": "hejunxian", + "category": "Developer Tools", + "capabilities": [ + "Interactive", + "Read", + "Write" + ], + "defaultPrompt": [ + "使用 artemis-case-prep 检查这份测试用例是否具备转换条件。", + "使用 artemis-case-prep 从原始工作簿准备六列任务表。" + ], + "websiteURL": "https://git.playones.com/hejunxian/artemis-case-prep", + "privacyPolicyURL": "https://git.playones.com/hejunxian/artemis-case-prep", + "termsOfServiceURL": "https://git.playones.com/hejunxian/artemis-case-prep", + "brandColor": "#177C80", + "screenshots": [], + "logo": "./assets/icon.svg", + "composerIcon": "./assets/icon.svg" + } +} diff --git a/plugins/codex/plugins/artemis-case-prep/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/artemis-case-prep/THIRD_PARTY_SOURCE.json new file mode 100644 index 00000000..6c698373 --- /dev/null +++ b/plugins/codex/plugins/artemis-case-prep/THIRD_PARTY_SOURCE.json @@ -0,0 +1,9 @@ +{ + "sourceId": "artemis-case-prep", + "repo": "https://git.playones.com/hejunxian/artemis-case-prep.git", + "ref": "v1.0.0", + "commit": "94200db05a6b4d046222879b87672d45d791e756", + "adapter": "claude-skill", + "sourcePath": ".", + "syncedAt": "2026-09-24T09:40:56Z" +} diff --git a/plugins/codex/plugins/artemis-case-prep/assets/icon.svg b/plugins/codex/plugins/artemis-case-prep/assets/icon.svg new file mode 100644 index 00000000..8c57c33e --- /dev/null +++ b/plugins/codex/plugins/artemis-case-prep/assets/icon.svg @@ -0,0 +1,11 @@ + + ARTEMIS case prep + + + + + + + + + diff --git a/plugins/codex/plugins/artemis-case-prep/skills/artemis-case-prep/SKILL.md b/plugins/codex/plugins/artemis-case-prep/skills/artemis-case-prep/SKILL.md new file mode 100644 index 00000000..cbc2593b --- /dev/null +++ b/plugins/codex/plugins/artemis-case-prep/skills/artemis-case-prep/SKILL.md @@ -0,0 +1,37 @@ +--- +name: artemis-case-prep +description: 从多工作表原始 Android 测试用例中筛选适用于目标设备且可由 ARTEMIS 自动执行的用例,标记原表副本并填写六列批量任务模板的 Artemis 提示词。用于准备任务文档,不用于直接运行批次或改造导入器。 +--- + +# ARTEMIS 用例准备 + +把原始测试用例工作簿转成两份可追溯的文件:保留原有内容并新增“是否选中作为自动化执行”(`是`/`否`)列的原表副本,以及只包含选中用例的六列任务表。优先使用用户提供的模板;未提供时使用 [六列模板](assets/artemis-tasks.xlsx)。不要覆盖输入文件。 + +## 先确认适用性,再判断自动化 + +1. 逐页识别真正的用例表、表头、续行、合并单元格及行级适用性;不要以固定列号、`max_row` 或单独的用例编号推断用例。行政清单、报告页和空白格式行不算用例。遇到本项目附件的异构页时,读 [字段与边界](references/workbook-contract.md)。其他原始文档仍须按其实际结构重新识别。 +2. 适用性由用户在**原始用例**中完成:核对目标设备及每条用例的“是否适用”标记、标题限定或明确的适用说明;不强制另建设备能力清单。若有空白、缺少行级判定而无法由原文明确判定,或目标设备信息与原文范围无法对应,列出缺失的工作表与行号(可压缩连续行段),提醒用户补齐并**暂停正式转换**。不得把空白当作“不适用”,也不得从型号臆测设备能力。适用性明确为“否”的用例在自动化列标“否”。 +3. 对适用用例逐条判断能否由 ARTEMIS 的 Android UI 操作及其可用 ADB/日志观察建立前置条件、完成动作并取得可核验结果。依赖人工观察、实物遮挡/断电、外部设备或 PC 操作、主观音画质量评价,或者前置条件无法建立的用例标“否”,不交给 ARTEMIS 试跑。不能因为有步骤文字就判“是”。“是”表示适合自动化执行,不表示测试已经通过。 + 原始步骤若有不清晰之处,尤其操作对象、顺序、入口、触发条件或结果判定不明确时,列出来源工作表、行号、原文及具体疑问,向使用者确认后再判定该条用例并定稿 Artemis 提示词。确认前不猜测步骤或界面路径,也不把“否”作为替代澄清的标记;可继续整理其他明确用例,但受影响条目保持待确认,正式任务表待澄清后再交付。 +4. **确认测试任务之前**,明确目标测试 App 的版本(以用户提供或设备上核实的版本标识为准,不用文档日期或设备固件版本代替);版本缺失时只可准备草稿,不称为已确认的任务。**测试开始之前**另须确认设备 SN、秘钥、设备名称、设备型号。用户已明确这四项设备信息在该工作流中可正常流转;相关用例可直接使用已提供的值,不凭空编造。设备信息缺失时明确待补内容,不称为可执行,也不启动测试;不要把 ARTEMIS 的模型 API Key 与设备秘钥混同。 +5. 涉及“与某信息一致/匹配/同步”等断言的用例,**测试前**逐项补齐要比较的字段、可信的预期值或独立参照来源,以及适用设备/账号/版本范围。原文没有给足但可补充时,保留其自动化候选判断,在草稿中列出具体待补项;未补齐不得启动该用例。若确实无法取得独立参照,才判为无法自动核验。不能从被测页面自身反推预期,或把“显示正常”当作一致。 + +## 生成与核验 + +- 在原表**副本**的用例表增加且只增加所要求的自动化标记列(若已有此列则更新,不重复新增);每条用例填 `是` 或 `否`。先核对目标位置不会覆盖既有数据,保留原工作表、原文、图片、合并、格式及非用例页。若所选表格工具不能保真,停止交付并说明损失,不输出貌似完整的副本。遵循可用的 spreadsheet 工作流进行编辑、渲染与导出检查。 +- 任务表严格沿用 `任务` 页的六列顺序:`用例编号 / 检测项目 / 测试子项 / 测试用例 / 前置约束提取 / Artemis提示词`。只写入适用且自动化列为“是”的用例;其他工作表保持模板原样。编号在任务表内保留原值并附 `〔来源页!行号〕`,以区分重号;原表编号不改。 +- “前置约束提取”写确认的测试 App 版本及原文实际要求的设备、账号、网络和状态;一致性用例还写明比较字段与独立预期值/来源,草稿中可明确标出待补项,但不把未确认条件写成已满足。“Artemis提示词”**必须以 `【原表显示的用例编号】` 紧接原“测试用例”文本开头**,随后接完整执行说明;例如 `【1.1】【声波配网】手动长按重置恢复出厂后首次绑定完成配网流程` 后另起执行说明。这里的连接是文本拼接,不写字面 `+`;提示词前缀不附来源页/行号。执行说明写明在确认的 App 版本上操作、起点、操作意图、必要等待/状态转移、可观察的预期及证据要求;一致性断言须明确实际值与哪个预期值比较。直播页的分辨率切换、全屏、声音开启/关闭等目标控件初次未显示时,可先观察画面、轻点直播画面一次并重新观察可能浮现的控件或二级菜单;声音开关仅以可观察的 UI 状态核验,不把需要人工听音的结果判为自动化可核验。卡回看和云回看可将有颜色区域作为有数据的选时线索、空白区域作为无数据线索;选有数据片段时先选择过去且有颜色的区域,再用回放结果核验,不仅凭颜色判通过,也不设计拖动到未来。**仅移动爱家 App** 的卡回放用例可在点击“云回看”后观察是否出现切换入口。以上均是适用场景的条件性提示,不发明 UI 定位器、页面路径、精确坐标或功能。条件不满足、参照信息缺失或实际安装版本不一致时如实报告阻塞,不声称通过。无可用原编号或测试用例文本时列出来源行请用户补齐,不造编号或标题。更多写法见 [字段与边界](references/workbook-contract.md)。 +- 设置页功能项较多;相关用例在首屏未找到目标时,提示词应允许向上滑动更长距离以查看下方内容,并在每次滑动后重新观察和定位。不要把首屏未见当作功能缺失,也不要规定未经核实的固定坐标、距离或盲滑次数;见 [设置页查找边界](references/workbook-contract.md#提示词与决策)。 +- 核对原表每条真实用例的标记均为 `是`/`否`,任务表数据行数恰等于“是”的数量;逐行检查提示词的编号和用例文本前缀、App 版本是否与本次确认值一致,并抽查一致性用例有独立参照且比较字段明确;再抽查不同表头布局、重复编号、合并/续行和排除项。确认输入文件未改、两份输出的非目标内容未意外变化,且六列表头、提示词与来源可回溯。 + +当前所附 ARTEMIS 1.0.1 的原生 Excel 导入器要求另一套固定七列,**不能声称本六列文件已通过导入**。用户明确要保留六列,后续会改 ARTEMIS 实现;本 skill 不擅自生成第七列、改源码、调用 `mobile_batch` 或启动设备。将来用户要求执行时,先按当时服务版本预览校验并取得执行授权;编写外部可执行测试代码则先用 ARTEMIS 探索实际应用。 + +## 执行状态显示取消但之后完成 + +ARTEMIS 执行期间,网页或列表可能显示“取消”/“正在取消”,而之后的持久批次或任务记录又显示已完成。不要依据单次界面快照判最终状态,也不要把“已完成”直接等同于测试通过。执行方应按稳定的批次 ID、session/trace ID 重新读取 ARTEMIS 持久状态,确认取消是否只是请求/过渡状态、任务最终状态,以及报告是否已就绪;检查应遵从工具建议并保持低频,避免连续轮询。 + +- 最终持久记录为 `completed` 且报告已就绪时,核对 trace/报告中的实际步骤、证据和业务判定,再分别记录通过、失败或未验证。 +- 最终持久记录为 `cancelled` 时,它是终态;保留取消记录及已产生的部分证据,不得改写成完成,也不要因界面状态不一致而自动重提同一用例。重跑须有明确授权,并作为新的执行记录。 +- 若批次、session 与网页显示互相矛盾,或报告尚未就绪,记录各自 ID、状态和检查时间,做必要的低频只读核验;矛盾未消除前标记“状态待核实”,不得统计为通过或已完成。 + +此规则只用于解释执行记录,不改变本 skill 的职责范围:本 skill 负责准备与核验用例文档,不负责启动、取消、恢复或重跑 ARTEMIS 任务。 diff --git a/plugins/codex/plugins/artemis-case-prep/skills/artemis-case-prep/agents/openai.yaml b/plugins/codex/plugins/artemis-case-prep/skills/artemis-case-prep/agents/openai.yaml new file mode 100644 index 00000000..6aa2a51a --- /dev/null +++ b/plugins/codex/plugins/artemis-case-prep/skills/artemis-case-prep/agents/openai.yaml @@ -0,0 +1,3 @@ +interface: + display_name: "ARTEMIS 用例准备" + short_description: "筛选设备适用且可自动化的用例,填写六列任务表" diff --git a/plugins/codex/plugins/artemis-case-prep/skills/artemis-case-prep/assets/artemis-tasks.xlsx b/plugins/codex/plugins/artemis-case-prep/skills/artemis-case-prep/assets/artemis-tasks.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..d1e313e116cc8a8ba27802cac39e559c1a50911b GIT binary patch literal 10791 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 literal 0 HcmV?d00001 diff --git a/plugins/codex/plugins/artemis-case-prep/skills/artemis-case-prep/references/workbook-contract.md b/plugins/codex/plugins/artemis-case-prep/skills/artemis-case-prep/references/workbook-contract.md new file mode 100644 index 00000000..11f85c8e --- /dev/null +++ b/plugins/codex/plugins/artemis-case-prep/skills/artemis-case-prep/references/workbook-contract.md @@ -0,0 +1,46 @@ +# 六列任务表与判定边界 + +本参考记录用户所附模板与原始用例的非显然结构,供处理这类工作簿时使用。新输入须重新核对表头和适用性,不要把示例页当作通用列号映射。 + +## 模板 + +`assets/artemis-tasks.xlsx` 来自用户的 `artemis-tasks.xlsx`。`任务!A1:F1` 才是本次约定的输出结构,依次为: + +| 列 | 内容 | +| --- | --- | +| 用例编号 | 原编号加 `〔来源页!行号〕`;编号本身不可用作唯一键。 | +| 检测项目 | 对应原文项目,保留其语义。 | +| 测试子项 | 对应原文子项;没有独立子项时不杜撰。 | +| 测试用例 | 保留原用例目的与关键动作,必要时压缩冗余但不改变判据。 | +| 前置约束提取 | 本次确认的测试 App 版本、设备适用范围、账号/网络/状态、SN/秘钥等前置;一致性用例还需比较字段及独立预期值/来源;区分已知与待建立。 | +| Artemis提示词 | 以 `【原表显示的用例编号】` + 原“测试用例”文本开头,再接完整、自包含的执行请求,见下方。 | + +模板的 `填写说明` 页混用了“任务名称、任务目标、预期结果”等七列导入术语,和实际六列表头不一致;它是附件内容,不覆盖用户已确认的六列要求。保留该页,不拿它修改 `任务` 页的列数。 + +## 原始用例 + +所附“家庭安防多形态终端软件测试用例(移动看家2.0)”有 33 个可见页,不是一个统一表:典型页用 A:G 记录编号、项目、子项、用例、预置条件、步骤、预期;`8告警事件` 表头在第 2 行;`13安全` 的 D:H 才是名称、摘要、前置、步骤、结果;`16 云化AI专项测试-基础包` 用 E:I 记录子项到结果并有重复编号列。页标题还限定白盒、无卡槽、带屏等范围。右侧“新设备/固件变更”之类提测情形不是设备支持声明。`1设备绑定` 的“是否适用”用例行尚为空;设备功能集也未完成真实设备支持信息。因此当前原始文件不满足正式全量转换前置条件。 + +识别时从标题、表头和有实际步骤/期望的行建立用例记录;保留原始 `sheet + row + 编号` 键。合并单元格或续行可承接同一用例,但不要把每个格式行计成独立用例。对无法对应到一条用例的条目报告歧义,不悄悄丢弃。将适用性缺失的行集中列出,先请用户完成原始文档,再生成正式输出。 + +## 提示词与决策 + +对每条“是”,首字符起按 `【原表显示的用例编号】` + 原“测试用例”文本(仅去首尾多余空白)拼接。保留原文已有的 `【】`,不要再给整段用例标题套一层方括号;不要把任务表编号列中的 `〔来源页!行号〕` 带入前缀,也不要写字面 `+`。例如 `1设备绑定!3` 的前缀是 `【1.1】【声波配网】手动长按重置恢复出厂后首次绑定完成配网流程`。这只是格式示例,该行还需人工复位,不能因此标成自动化“是”。若 Excel 数值编号的显示格式与底层数值不同(如 `1.10`),采用原表显示的编号。 + +前缀之后另起完整说明,至少明确:本次确认的测试 App 版本,并在执行时核对实际安装版本;在目标 Android 设备与应用的实际当前状态开始;需要建立的前置条件;依据原文进行的操作;等待**可观察的界面状态**而不是依赖模型思考时间;原文的预期结果及截图/页面文字/日志等可取得的证据;失败、未验证、版本不一致或条件不满足时如实报告。必要的 SN、秘钥、名称、型号可直接写入对应任务,但不能给无关用例灌入这些值。不要把缺失的原文判据补成看似确定的断言。 + +直播画面中的分辨率切换、全屏、声音开启/关闭等控件可能在点击画面后才显示,也可能藏在随之出现的二级菜单。仅当用例操作确实位于直播页且初次观察未找到目标元素时,提示 ARTEMIS 先截取/查看当前页面,轻点不覆盖明显按钮的直播画面区域一次,再观察新的控件或菜单并尝试定位目标。菜单若短暂显示,应在其可见时完成后续操作;若仍不存在,记录观察和截图,报告未找到,不反复盲点或编造菜单位置。声音开关可核对界面呈现的开/关状态、图标或可观察反馈;若预期要求确认实际声音质量或是否听得到,不能以图标变化冒充听音验证。此提示不是对当前 App 实际界面的预先验证,不能套用于设置页等其他场景。 + +App 设置页往往较长,目标功能可能在首屏下方。整理设置页用例时,如初次观察未见目标,提示 ARTEMIS 在设置列表中向上滑动较长距离(让下方内容出现),每次滑动后重新查看页面并查找目标;若仍未见,可根据页面变化继续滑动,直到可确认已到列表底部,再记录未找到。不要在未查看新页面时连续盲滑,也不要把用户的“多滑一点”写成未验证的固定像素、次数或坐标。 + +卡回看和云回看的日期/时间轴上,有颜色的区域通常表示有数据,空白区域通常表示无数据。整理有录像片段的回放用例提示词时,先识别当前选中的回看类型及其有颜色区域,再在已经过去的时间中选取该区域并尝试回放,以实际播放/页面结果验证;不要假设卡与云的有数据区相同,也不要仅凭颜色判定回放成功。若用例本身要检验无数据区域,则按原文选择空白的过去时间并核对无数据反馈,不能拿它作为有录像回放失败的证据。选取回放片段前核对当前设备/App 时间和所选时间的时区及先后,不要求拖到未来时间;不能把未来片段不存在判成回放失败。若原用例专门检验时间轴上界,则观察是否无法选取或播放未来时间,记录界面证据,不假定具体控件反馈。颜色含义是用户提供的一般操作线索,具体 App 界面仍须在执行时观察确认。 + +**仅移动爱家 App**:卡回放目标入口未见时,可先点击“云回看”,重新观察是否出现云回看/卡回放切换,再选择卡回放。其他 App 不沿用这条入口提示;切换未出现时记录当前页面并报告未找到,不编造固定按钮位置。此路径是用户提供的操作线索,真正编写可执行测试代码前仍须用 ARTEMIS 在目标 App 验证。 + +凡要求信息一致、匹配或同步,执行前核对具体比较字段、独立的预期值或可信来源,以及对应设备、账号、App 版本等范围。比如原用例要求“设备型号和厂商提供的一致”,须先取得厂商提供的目标型号,再将 App 中读到的型号与它比较;不能把 App 显示值同时当成预期和实际。缺少参照信息时列明待补项,该用例不可启动,也不可报告通过。 + +例:原文若要求“进入系统设置,修改一个可见开关并确认状态”,提示词应说明识别目标开关、记录初始状态、执行切换、等界面显示目标状态并记录证据;若原文还要求回退,则依原文回退。示例只说明写法,不证明附件中的某条用例具有这些步骤。 + +排除边界:PC 管理端、外接 console、实物遮挡/断电、需要人工听音/看画质、无法自主建立的网络或硬件状态,不标“是”。长时或重复的 Android 操作不是单凭次数就排除,但需有可测的时间/次数、可恢复前置状态和明确结果;缺任一关键条件则标“否”。ARTEMIS Pro 可观察 ADB/日志,不代表能代替外部硬件、PC 或人的感官。 + +截至附带的 ARTEMIS 1.0.1 源码,`task_import.py` 只接受工作表 `任务` 首行严格七列(任务名称、任务目标、预期结果、目标应用、前置条件、输入参数(JSON)、标签)。本六列任务表是供未来导入改造使用的业务模板,不宣称兼容 1.0.1,也不转换成七列。后续执行前核实服务的真实导入契约。 diff --git a/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json b/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json index f091dd53..cadbb733 100644 --- a/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json +++ b/plugins/codex/plugins/mcp-playwright/MCP_SOURCE.json @@ -3,5 +3,5 @@ "name": "playwright浏览器自动化操作", "version": "20260605", "keySource": "none", - "syncedAt": "2026-09-24T03:15:08Z" + "syncedAt": "2026-09-24T09:42:55Z" } diff --git a/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json b/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json index a4363eae..a7dca5c4 100644 --- a/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json +++ b/plugins/codex/plugins/next-skills/THIRD_PARTY_SOURCE.json @@ -2,8 +2,8 @@ "sourceId": "next-skills", "repo": "https://github.com/vercel/next.js.git", "ref": "canary", - "commit": "e71848173cf199bb56e88c1c04aa977cdb0a84df", + "commit": "76117ccd71fdfaf4d5377b7ed08d238de845321b", "adapter": "skill-collection", "sourcePath": "skills", - "syncedAt": "2026-09-24T03:13:04Z" + "syncedAt": "2026-09-24T09:40:56Z" } diff --git a/scripts/sync_external_plugins.ps1 b/scripts/sync_external_plugins.ps1 index 24c02931..46fa3abf 100644 --- a/scripts/sync_external_plugins.ps1 +++ b/scripts/sync_external_plugins.ps1 @@ -990,6 +990,20 @@ function Sync-ClaudeSkill { Remove-ReadmeLines -Root $pluginDir -LineExcludes $Source.readmeLineExcludes Compress-ImagesToWebp -Root $skillDest -CompressPaths $Source.webpCompressPaths + if ($Source.PSObject.Properties.Name -contains "marketAssets" -and $Source.marketAssets) { + foreach ($asset in @($Source.marketAssets)) { + Assert-RelativePathValue -Path ([string]$asset.source) + Assert-RelativePathValue -Path ([string]$asset.destination) + $assetSource = Join-Path $RepoRoot ([string]$asset.source) + if (-not (Test-Path -LiteralPath $assetSource -PathType Leaf)) { + throw "marketAssets file does not exist: $assetSource" + } + $assetDestination = Join-Path $pluginDir ([string]$asset.destination) + New-Item -ItemType Directory -Force -Path (Split-Path -Path $assetDestination -Parent) | Out-Null + Copy-Item -LiteralPath $assetSource -Destination $assetDestination -Force + } + } + $description = $metadata.description if (-not $description) { $description = $frontmatter["description"]