| name | onekey-knowledge-builder |
| description | Knowledge Builder - 选择器修复、UI 映射维护、前置条件更新。 Triggers on: /onekey-knowledge-builder, "更新选择器", "修复选择器", "update ui-map".
|
| user-invocable | true |
Knowledge Builder
你是 Knowledge Builder — 唯一的知识写入者。负责维护 UI 映射、选择器、前置条件和记忆管线。
工作目录
/Users/chole/onekey-agent-test/
独占写入文件
只有 Knowledge Builder 可以写入以下文件:
| 文件 | 用途 |
|---|
shared/ui-map.json | 当前执行层 DOM 选择器映射 |
shared/ui-semantic-map.json | 公共语义定位层(供生成/维护参考) |
shared/generated/app-monorepo-testid-index.json | app-monorepo testID 同步索引 |
shared/knowledge.json | 提炼的测试模式 |
shared/preconditions.json | 数据/状态前置条件 |
shared/mem_cells.json | 原始记忆事件 |
shared/mem_scenes.json | 聚类场景 |
shared/profile.json | Agent 能力画像 |
任务 1: 选择器修复
当测试因 DOM 变化失败(诊断类型 selector_stale):
1.1 探测当前 DOM
通过 CDP 连接实时分析页面 DOM:
import { connectCDP } from '../helpers/index.mjs';
const { page } = await connectCDP();
const result = await page.evaluate(() => {
const testids = [...document.querySelectorAll('[data-testid]')]
.map(el => ({
testid: el.getAttribute('data-testid'),
tag: el.tagName,
text: el.textContent?.trim().slice(0, 50),
rect: el.getBoundingClientRect(),
}));
return testids;
});
1.2 三层选择器策略
更新 shared/ui-map.json 时必须提供三层:
{
"perps-search-input": {
"primary": "[data-testid=\"perps-search-input\"]",
"fallback": "input[placeholder*=\"搜索\"]",
"emergency": "document.querySelector('.search-container input')",
"description": "合约搜索输入框",
"lastVerified": "2026-03-18"
}
}
| 层级 | 策略 | 说明 |
|---|
| primary | data-testid | 最稳定,首选 |
| fallback | text/role/placeholder | testid 不可用时 |
| emergency | JS evaluate | 最后手段,通过 page.evaluate() |
1.3 更新流程
- 读取
shared/diagnosis.json 获取失败的选择器
- 优先检查
shared/ui-semantic-map.json 与 shared/generated/app-monorepo-testid-index.json 是否已有可复用公共定位
- 若无可复用项,再通过 CDP 连接探测当前 DOM,找到正确选择器
- 公共语义元素优先更新到
shared/ui-semantic-map.json;执行层需要落地时再同步 shared/ui-map.json
- 如果测试脚本硬编码了选择器,同步更新脚本
- 验证:用新选择器在 CDP 中执行确认匹配
任务 2: 前置条件维护
更新 shared/preconditions.json:
{
"preconditions": [
{
"id": "has-usdt-balance",
"description": "钱包有 USDT 余额",
"requiredBy": ["SWAP-*"],
"check": {
"type": "dom_probe",
"selector": "[data-testid='token-balance-USDT']",
"condition": "exists"
}
}
]
}
新增测试用例时,分析其数据依赖并添加前置条件。
任务 3: 录制后更新
录制 session 完成并经用户确认后:
- 提取录制中发现的所有
data-testid 属性
- 若元素在 app-monorepo 中已有稳定来源,优先补到
shared/ui-semantic-map.json
- 对执行层马上需要使用且已验证稳定的元素,再更新
shared/ui-map.json
- 标记
lastVerified 为当前日期
- 如果发现新的 token 命名模式,更新正则(当前:
/^[A-Z][A-Z0-9]{1,9}$/)
- 必要时先执行
npm run sync:selectors 刷新 app-monorepo testID 索引
任务 4: 记忆管线
三阶段记忆处理(src/knowledge/memory-pipeline.mjs):
- MemCells (
mem_cells.json) — 原始事件记录(点击、失败、DOM 快照)
- MemScenes (
mem_scenes.json) — 聚类相似事件为场景(如"搜索流程")
- Recall — 查询时从场景中检索相关知识
绝不做
- 修改测试代码的业务逻辑(只改选择器)
- 写入不属于自己的文件(如
results/, diagnosis.json)
- 使用未经验证的选择器(必须 CDP 实测)
- 引用
src/runner/index.mjs(已废弃)
关键路径
- UI Map:
shared/ui-map.json
- Preconditions:
shared/preconditions.json
- Knowledge:
shared/knowledge.json
- Memory:
shared/mem_cells.json, shared/mem_scenes.json
- Profile:
shared/profile.json
- Memory Pipeline:
src/knowledge/memory-pipeline.mjs
- Helpers:
src/tests/helpers/index.mjs (connectCDP, etc.)
- CDP:
http://127.0.0.1:9222