毫米- 强度
用于操作MetaMask扩展、移动和核心并生产的一个CLI 可审查的食谱证据。 在一次检查中运行; 产品,插槽,端口, 和运行时路径自动检测.
- 行动: 一个打字操作.
- 食谱 : 可重复使用、参数化的行动图和所谓的食谱.
通用图形引擎和证据计划 农场 软件包.
mm-harness 拥有MetaMask运行时控制和域能.
项目任务助手
注册的项目可以使用 farmslot task init, (中文(简体) ), mark, (中文(简体) ), verify 财务报告和审定财务报表 closeout, (中文(简体) ),
farmslot review checklist 财务报告和审定财务报表 domain,以及 farmslot recipe quality。 。 。 .
MetaMask 供应商提供 diff 检查门、 学习目的地、 审查
规则、均等运行时间和选入建议。 选择任务中注册的项目
初始化;其工具和政策随任务而保留。 见
农场地命令参考。 。 。 .
每日发布
同样的食谱可以验证昨天的域名更改 或发布
后面那个 main编辑 mms-recipe-qa 技能冻结变化范围
标准; 团队库提供烟雾和可重复使用的旅行; 此 CLI 运行
并保留断言、追踪和捕捉.
使用安装的技能 references/domain-qa.md 用于窗口/范围输入和
报告政策。 范围选择和时间安排在控制之外。 发现
食谱通过 run --list 财务报告和审定财务报表 run <recipe> --describe,然后跟随
锁定版本 help --json 组成和漂移诊断。 调整a
试验释放的秘方,不改变释放或削弱释放
标准。 需要发展手段的内部行动不能
证明在未修改的释放文物上的行为.
从零开始
没有退房了吗? mm-harness setup-base 复制MetaMask产品重置为一
标准布局和运行每个 repo 的 依赖性安装 — 不安装此功能
启动所需的软件包 :
npx -p @deeeed/metamask-harness mm-harness setup-base
它产生,在 ~/dev/metamask 默认:
metamask-extension-1..N metamask-mobile-1..N core-1..N
在终端中不带旗帜运行, 它会询问您想要哪些工程以及有多少 副本。 传出全部跳过提示的旗帜——这就是脚本, CI,母工具应引用:
mm-harness setup-base --only core --counts core=1
mm-harness setup-base --dir ~/work/metamask --counts extension=3,mobile=1,core=2
mm-harness setup-base --only mobile --dry-run # plan only, changes nothing
基准目录按优先级解决 : --dir,则 $MM_HARNESS_BASE_DIR, (中文(简体) ),
然后保存首选项,然后 ~/dev/metamask。成功运行会保存基础
使用目录和计数,所以以后通过它们——检查
--show-config,清除 --reset-config。重运行是安全的:已存在
克隆被取出,从不重置,也从不删除.
范围围栏. 它克隆并安装依赖性. 没有别的——没有平台
工具链,没有模拟器,没有 .env 文件,没有构建。 工作流程上载是一个
快速; 环境准备 mm-harness doctor,这正是它的位置
下个点数.
setup-base 是单曲上的普通命令 mm-harness 进入点。 其工作
留在一可读贝壳叶中 npx -p 提供同样的命令
在全局安装之前.
安装
npm install -g @deeeed/metamask-harness@latest
mm-harness --version
mm-harness doctor
doctor 只读. doctor --fix 修理自带运行时状态,但
不启动应用程序、创建证书或选择钱包固定.
mm-harness doctor --fix
mm-harness fixtures init --from /secure/path/wallet-fixture.json
# Disposable public testing only; never fund this wallet. It writes account
# hardhat0 (public key), which cannot trade on Hyperliquid testnet:
mm-harness fixtures init --dev
# For Perps orders, replace it with a funded fixture:
mm-harness fixtures init --from <funded-fixture> --force
使用 mm-harness update 用于更新已公布的安装。 新任务使用 farmslot task init 在写入任务标记之前保留其CLI、提供者和库输入。 运行 farmslot task verify <task-dir> 在恢复前检查这些投入。 全球升级保留了现有任务记录的工具和标记.
运行
# Extension
mm-harness launch
mm-harness launch --sidepanel
# Mobile
mm-harness launch ios
mm-harness launch android
# Any checkout
mm-harness status
mm-harness stop
mm-harness logs
mm-harness debug
mm-harness reload # Mobile Metro reload / Extension CDP refresh
mm-harness fixtures set
# Delete the current wallet, then reapply the canonical fixture from clean state.
mm-harness fixtures reset
延长 launch 保持它的增量监视器运行。 刷新活动
成功重建后的页面; 使用 launch --build 只为明确
类似生产型的LavaMoat重建.
macOS 在登录会话锁定时停止绘制可见窗口 。 在锁定的Mac上:
- 标题扩展或网络应用( 结束)
run编号 :call拒绝使用SESSION_LOCKED在其运行时间检查中,在启动或驱动浏览器之前,而不是在截图和UI动作上拖延; - a headful web-dapp 启动,包括重用运行的浏览器,拒绝同样的方式.
扩展版没有无头模式,因此解锁Mac. 对于网页应用程序,解锁或重新启动其无头浏览器(mm-harness launch --adapter terminal --headless,或设置 TERMINAL_HEADLESS=1 发射前: TERMINAL_HEADLESS=1 当一个有头槽的浏览器仍在运行时,单靠自己是无用的. 咖啡因使Mac保持清醒,但没有解锁.
扩展浏览器
RECIPE_HARNESS_BROWSER 选择未打开的扩展主机浏览器 :
| 数值 | 浏览器 |
|---|---|
auto (默认) | 退机的 Playwright Chrome 用于测试 当它开始和油漆在这个机器上, 否则谷歌 Chrome |
cft | 测试颜色, 从未被探测过 : 汽车存在前的行为 |
chrome | 谷歌颜色 |
/abs/path | 那个可执行文件 |
RECIPE_HARNESS_CHROME_BIN=/path 仍然覆盖一切并用作
给出。 谷歌克罗姆忽略 --load-extension,所以绳子加载的建筑
超过Extensions.loadUnpacked,与 --enable-unsafe-extension-debugging(中文(简体) )
输入插槽 并检查ID与显示的密钥。 其它
该配置文件中的用户扩展已禁用, 因为 --disable-extensions-except
用于测试的 Chrome; 扩展不能是企业政策指针
被禁用,所以发射会发出警告,并用运行证据记录它们.
单位 auto,带有新剖面探测器的发射
发射机的启动方式(头,通过macOS上的发射服务). 这个
判决在 ~/.cache/farmslot/browser-probe.json: 保存崩溃
直到 OS 构建或浏览器更改; 仅超时的探测器被重试
30分钟后 同时发射等待每个浏览器构建一个探测器
联合国 <cache>.<key>.locks/ 缓存旁边编号的门票目录; a
超过3分钟的持有者算不上已经走了 所以一个比它活得更久的探测器
与下一个重叠,在从一个使用一个 .lock
文件重复探测器是可能的。 车票从未被取出
绑:每个探测器增加两个小文件,一个坠毁的持有者未释放
罚单暂住(一旦其过程消失,票就不再被挡住). 为了收回
空格,在没有启动或医生运行时删除锁目录 :
rm -r ~/.cache/farmslot/browser-probe.json.*.locks。 。 。 .
在冷藏地上 探测器可长达80秒
显示一个小型(约480x360)浏览器窗口; doctor --adapter extension
运行同样的探测器.
在Google Chrome由政策管理的Mac上, auto 使用克罗梅
未读取这些政策的测试, 因此无法打开强制扩展
窗口。 只读 MDM 管理的首选项
(单位:千美元)/Library/Managed Preferences/com.google.Chrome.plist 及其每个用户
抄录于 /Library/Managed Preferences/<user>/(没有) defaults 用户集
本身; 已安装的外延(ExtensionInstallForcelist, (中文(简体) ),
ExtensionSettings)或被强制签入(BrowserSignin: 2, (中文(简体) ),
ForceBrowserSignin计数为管理; 将策略存储为数据或日期
价值被视为不存在。 如果测试的克罗姆没有开始
在那里画画,发射结束 BROWSER_UNLAUNCHABLE 而不是说
回到管理中的克罗姆;出路是
RECIPE_HARNESS_BROWSER=chrome (接受强制延长可能开放)
,或者装入量较少的机器。 医生列出强制
扩展名 ids,其中包含可以读取的名称(最大努力,只读:
槽记录,或操作员自己的Chrome配置文件夹). 插槽配置文件
在管理的 Chrome 上创建它,并带有重设配置的警告.
然后保留浏览器类型,其配置是用它创建的,直到
重新设置配置文件( e)mm-harness fixtures set 或者说 fixtures reset:
- 在 Chrome 测试上创建: 当前测试的测试选择 (Playwright的升级被跟踪并重新被复制);它移动到Google Chrome 只有那座建筑被证明会崩溃,就永远不回来;
- 在 Google Chrome 或一个明确的路径上创建: 二进制; 如果删除, 发射失败,并说如何恢复而不是切换浏览器;
- 创建于
RECIPE_HARNESS_CHROME_BIN,输入路径RECIPE_HARNESS_BROWSER, (中文(简体) ), 或发射装置--chrome-bin直接 : 每晚都会有二进制auto发射,即使它是一个克罗姆 测试建设.
保留在Chrome上用于测试的插槽,该插槽是“不交出帧”(a)
即时判决, 保留在 Chrome 测试上) 移动到 Google Chrome
不重设配置文件 : 使用 RECIPE_HARNESS_BROWSER=chrome。 。 。 .
这个简介是Google Chrome的简介,后来是 auto 继续发射
谷歌克罗姆. 换个方式打开一个旧浏览器的配置,所以
重设配置文件 .
在此浏览器记录存在之前创建的配置文件没有记录, 因此
第一个 auto 发射探测器像一个新的剖面图,可能移动到Google Chrome.
mm-harness doctor --adapter extension 显示当前选择; 每次发射
写给 temp/recipe/runtime/browser-resolution.json 使用浏览器
程序身份,并运行证据(product-provenance.json名称
浏览所驱动的运行在检查该精确进程后仍然服务于
CDP 移植已执行的运行 。 CDP 端口的拥有者是命名为
简介 SingletonLock,并且只有锁名这个主机
程序在锁被写入之前开始(一个再利用的pid没有),它
在配置文件中保存打开的文件 。 那个证据是有用的 lsof什么样的macOS船;
没有它,发射停止 并有一个解释。 启动时间被精确比较为
ps -o lstart 在协调世界时打印它们,所以用较早的带来记录
建设( 当地时间) 无约束boundTo: none直到插槽重新启动.
在macOS上,插槽浏览器从背景开始,没有启动窗口,
它的第一个窗口打开 CDP 作为背景窗口。 发射后
解析后有一个焦点检查: 只有槽浏览器自己的进程
最前面的是以前专注的应用程序 一次是前端
(单位:千美元)FARMSLOT_FOCUS_HOLD=0 关掉这个). 在槽窗口右侧单击
因此,在发射后可以取消一次. FARMSLOT_FOCUS_HOLD 财务报告和审定财务报表
FARMSLOT_FOCUS_BROWSER 属于 @farmslot/adapter-web; 结算延迟
在检查之前, MM_HARNESS_FOCUS_SETTLE_MS属于这个绳子
发射器.
# Roll back to Chrome for Testing with a fresh slot profile (a profile Google
# Chrome has opened is not reopened in the older Chrome for Testing). Keep
# RECIPE_HARNESS_BROWSER=cft set for later launches too: on a plain auto launch
# the profile follows Chrome for Testing only until a probe proves it dies.
RECIPE_HARNESS_BROWSER=cft mm-harness fixtures set
rm ~/.cache/farmslot/browser-probe.json # forget probe verdicts
远程特性旗
--remote-flag KEY=VALUE[,KEY=VALUE] 为发射打上远程特性旗,
这就是A/B变体后面的屏门如何可以到达:
mm-harness launch --remote-flag perpsTAT3938AbtestScreenVsBottomSheet=treatment
mm-harness launch ios --remote-flag perpsEnabled=true,perpsConfig='{"tier":2}'
光字是已命名的变种(treatment 变成 { "name": "treatment" }, (中文(简体) ),
true编号 :false 是一个布尔,和一个值打开 { 或者说 [ 解析为
贾森。 语法被解析一次 每片叶子都得到解析图 所以
布尔保持布尔而不是成为字符串 "true"。 。 。 .
每一次发布都会让应用程序的超能力 精确地设定钱包的固定
remoteFeatureFlags 对象(基线每个运行的股份)与
--remote-flag 两种客户端的地图(一次发射的覆盖). 一个平地 launch
因此放弃了先前的运行 --remote-flag 变种和保持固定的.
移动清空并重新应用运行中的设定
RemoteFeatureFlagController 如果发射未读取,则发射失败。 这个
扩展将其写入每个运行的不快的快照显示并重新读取
拥有的磁带记录_harness.remoteFeatureFlags,每页
),所以发射报告它所证明的指针;重用运行的浏览器
只允许在记录已等于请求时重装
将记录带过重建的快照 --watch (哪个)
永远不要重新创建快照)拒绝 --remote-flag食谱本身的恢复
重启时携带活针,而不是在中跑时放下. 经核实
文物从不重写 所以发射必须把它钉上
(单位:千美元)--remote-flag 或悬挂旗帜的固定装置)拒绝试验
手臂不对.
随动作一起读取或更改运行中的应用程序上的标记 . fixtures set 如下
与发射相同的规则: 固定块是基线和
fixtures set --remote-flag KEY=VALUE 层上有一个单运行的覆盖,即
怎么样 prepare --remote-flag 把它的指针通过固定步骤.
mm-harness call metamask.feature_flags.read
mm-harness call metamask.feature_flags.set 'flags={"perpsEnabled":true}' # mobile
mm-harness call metamask.feature_flags.clear # mobile
doctor 财务报告和审定财务报表 status 打印 a feature flags: 指定每个活动的行
覆盖,所以一个插槽从不运行一个无名变体下的证明. 线条
区分 (no runtime) 和无法读取的真象
0 override(s)。 。 。 .
日志来源分开 :
mm-harness logs --source extension # Extension page
mm-harness logs --source dapp # active dapp
mm-harness logs --source webpack # compiler
mm-harness logs --source watcher # watcher lifecycle
mm-harness logs --source rebuild # incremental rebuilds
mm-harness logs --source app # Mobile app
mm-harness logs --source metro # Mobile bundler
Live Mobile 和扩展配方自动索引一个有界限、有编辑功能的
network/run-summary.json 带有请求时间和食谱节点界限。 使用
明确 app.network_capture 财务报告和审定财务报表 app.network_assert 过滤的节点
窗口和机器检查请求预期值。 见
辅助扫描网络捕获。 。 。 .
移动和扩展配方可以将清晰的UI-smoothess 窗口与
app.performance_capture 并核实他们的证据
app.performance_assert捕捉从来不是自动的 见
UI 平滑捕捉。 。 。 .
工作任务
# Pick a checklist from the shared catalog.
mm-harness execution-template list --package-templates <catalog> --json
# Write the task directory the agent works from.
farmslot task init temp/tasks/fix/TAT-1 --project <project> \
--flow fix-bug --template fix-bug/mobile \
--package-templates <catalog> --title "Wrong total on the receipt" --ticket TAT-1
# Bring the checkout to a proven-ready state before the first step.
mm-harness prepare --artifacts-dir temp/tasks/fix/TAT-1/artifacts --json
# Use the generated marker, which verifies the task's retained tooling.
temp/tasks/fix/TAT-1/mark start
temp/tasks/fix/TAT-1/mark 1
temp/tasks/fix/TAT-1/mark complete --mark-last
farmslot task init 写入 TASK.md, (中文(简体) ), CHECKLIST.md,则 mark 嘘,和 inputs/。 。 。 .
它保留了选定的CLI、提供者和图书馆。 使用 farmslot task verify <task-dir> --json
检查他们的身份。 现有任务保留原有的标记和收发.
CHECKLIST.md 是唯一一个将框算作阶梯的文件。 没有
checklist-target.json; 缺席手段 CHECKLIST.md + 键 SIGNAL.json。 。 。 .
prepare 运行 doctor --fix, (中文(简体) ), status, (中文(简体) ), launch --verify, (中文(简体) ), fixtures set,以及
verify 在第一次失败时停止 记录一个准备状态记录
时间 <artifacts-dir>/sandbox.json核心跳过发射和固定装置;移动取用
ios编号 :android 从检查对象,然后从设备
status 报告,并问何时是含糊不清的。 退出 0 表示
准备 见 任务目录。 。 。 .
发现和证明
mm-harness actions positions
mm-harness actions --action metamask.wallet.ensure_unlocked
mm-harness call metamask.wallet.ensure_unlocked
mm-harness run --list
mm-harness run perps.smoke --describe
mm-harness run wallet.smoke --describe
mm-harness run wallet.import method=auto
# When a visible Terms of Use gate follows import and acceptance is authorized:
mm-harness run wallet.accept-terms accept=true
# Use visible client UI to delete and import the wallet again.
mm-harness run wallet.reset-import
mm-harness run path/to/recipe.json market=ETH --plan
mm-harness run path/to/recipe.json
run 选择一个检出- 本地文物目录, 除非
--artifacts-dir <dir> 超过它。 人类产出印出诊断和
绝对路径的报告,追踪,执行的食谱, 和文物清单.
使用 mm-harness last --json 在不重复上次行动的情况下恢复.
关于自动化, --json 发出一个稳定的文档. run --json-stream 发射
线性缓冲 JSONL 进度和终端事件。 它的状态符合食谱
pass, (中文(简体) ), fail,或 unknown 判决; unknown 仍然离开非零.
团队图书馆
export RECIPE_LIBRARY_PATH="team=$HOME/shared-library/team-recipes"
mm-harness run --list
共享的图书馆有持久的行动和可调和的食谱。 任务接受 标准仍然是任务所在地。 见 食谱。 。 。 .
关于将接受标准与图书馆流动相匹配和评估的可选模式咨询
草案或证据,见 可选食谱顾问。 。 。 .
选择一个提供者 --advisor typesafe 或保存 advisor.enabled 财务报告和审定财务报表
advisor.provider 结束 mm-harness config检查有效的政策
farmslot recipe quality advisor-status --project <project> --json; 使用 --advisor off 每个任务.
普通食谱执行不需要顾问或API密钥.
不需要导出: 在 mm-harness config set libraries.<name> <path>,或者在产品检出旁检查,到达
run, (中文(简体) ), actions和模板的发现. mm-harness status 列出这个
机器解决,每个地点的修改和食谱计数.
一个库可以在知识文件中声明命名的测试账户
recipe-library.json 清单"knowledge": ["knowledge/test-accounts.json"], (中文(简体) ),
每个 { "name", "secret", "index", "address", "purpose" }: 该账户是 HD
指数 index 名称 secret,所以定着
只保守他们的秘密 图书馆注册(--library, (中文(简体) ),
RECIPE_LIBRARY_PATH 即你们所设定的,或你们所设定的,不是结对的,
mm-harness help 列出它们( 名称、 地址、 目的), 每个钱包, 命令
启动时可以使用它们(Web-dapp,扩展和移动固定导入,Core),以及
食谱, metamask.app.launch 财务报告和审定财务报表 metamask.wallet.select_account 选择一个
名称或地址.
团队维持他们的图书馆取出。 任务开始前更新; 记录本地修改和食谱摘要,但不获取或 检查上游更新。 运行时保持所选库不变 .
公布更改
# Write artifacts/pr-description.md in the repository PR template shape (prose
# only), then render the publishable body.
mm-harness pr-body render temp/tasks/dev/TAT-1 --command 'mm-harness run artifacts/recipe.json'
pr-body render 写入 artifacts/pr-body.md:带有"变相"的描述
食谱"和"Validation Logs"两节 artifacts/recipe.json 财务报告和审定财务报表
artifacts/recipe-run/report.md (和"收工"从 artifacts/workflow.mmd
当它存在时,用手替换任何粘贴。 工人从来不贴文物
因此栅栏无法断裂。 当通过运行记录了任务
选中的尝试, 两节都来自该尝试的验证软件包; 一个软件包
无法验证的,将被拒绝,任何文字都不写.
审查更改
# Which team library owns the change (declared --domain wins, else owned-paths.json).
farmslot review domain --project <project>
# The review guide: base review + the library's anti-pattern families and parity rule.
farmslot review checklist --project <project> --domain perps
# A checklist the mark shim can track: Setup, Base review, Domain patterns, Parity, Verdict.
farmslot review checklist --project <project> --domain perps --out temp/tasks/review/TAT-1/CHECKLIST.md
farmslot review checklist --project <project> --domain perps --since <last-reviewed-sha> # incremental re-review
# Where this machine keeps libraries and the other platform's checkout (outside any repo).
mm-harness config set references.extension ~/dev/metamask-extension
团队图书馆用品 review/antipatterns.md (一个) ## (a) 每个家庭,
选项 review/antipatterns.<adapter>.md 仅配有适配器的家庭,
review/parity.md,以及 owned-paths.json{\fn黑体\fs22\bord1\shad0\3ahbe\4ah00\fscx67\fscy66\2chffffff\3ch808080}绳子会编织而来 永远不会
复制它们。 位置解析嵌入( E)RECIPE_LIBRARY_PATH, (中文(简体) ), MM_HARNESS_REF_<ADAPTER>(中文(简体) )
→ mm-harness config - 结账前或下方的兄弟目录
~/shared-library ~ 浅取入 <checkout>/.skills-cache/<name>。 。 。 .
MM_HARNESS_SIBLING_LIBRARIES=0 关闭兄弟的台阶,用于图书馆和
参考检查相同(测试沙盒设置). 缺少参考文献
取出后, 将等价步骤降低为“ 不检查 ” .
回收
mm-harness doctor
mm-harness doctor --fix
mm-harness verify
mm-harness cleanup
失败就是下一个行动 核心是无头;浏览器,设备,日志,
和调试器的能力报告为没有,而不是捏造.
稳定退出代码为 1 运行时间/ 动作失败, 2 无效的 CLI 使用 , 3
基础设施故障, 4 有限度地拒绝追回,以及 5 审定/信任
失败.
参考文献
对于开发,请直接引用源检出:
/path/to/metamask-harness/bin/mm-harness --version
农场选择相同的软件包通过 recipe.provider.root.env,配置为 MM_HARNESS_PACKAGE_ROOT二进制环境不会改变公众进入点的方向.
工作流程进入点和完成点
明确援引 mms-recipe-dev, (中文(简体) ), mms-recipe-fix-bug, (中文(简体) ), mms-recipe-qa 或团队的静态审查技巧. mms-recipe-cook 选择或恢复其共享的Markdown清单。 匹配描述或已改变的路径永远不会激活这些工作流程.
主机任务选择执行节点上的核对表,而不是网关. 核心、移动和扩展包将他们的食谱烹饪清单根植于 CONSENSYS_RECIPE_COOK_ROOT 及其行凶者核对表 PERPS_RECIPE_LIBRARY_ROOT设置在每个节点的池中 env不只是网关 缺少选定清单的根的节点拒绝此任务为无法使用源 .
静态Perps审查使用生成的源清单,而不安装或启动应用套接字. recipe-qa 冻结 PR、 范围或每日更改窗口, 并需要运行时的烟雾和选定的食谱证明。 官方发布验证使用其命名的发布剖面和证明道.
TASK.md持有请求;CHECKLIST.md是唯一的一步列表. 被冻结的终端合同和任务当地标记验证完成。 出版,保留会话和工作空间清理属于呼叫者. 农场通过控制平面处理它们;直接援引将结果交还给工程师。 见 任务指南 财务报告和审定财务报表 QA 辅导。 。 。 .
便携式运行时间证明
validateRuntimeProof(bundle, smokeTarget) 从 @farmslot/recipe-cli/harness 验证一个保留了的Recipe v1 文物包,要求对其宣布的目标执行行为断言. 仅通过命令或结束节点是不够的。 QA 技能从中导入 @farmslot/recipe-cli 其锁定的绑带安装取决于;不需要网关、农场简介或运行的ID.