From de6165e76ed78e35986065f930fe182f55b8ddeb Mon Sep 17 00:00:00 2001 From: yu <1919727607@qq.com> Date: Thu, 5 Nov 2026 17:01:59 +0800 Subject: [PATCH] =?UTF-8?q?catalog:=2096=20=E4=B8=AA=E5=81=87=E5=BF=85?= =?UTF-8?q?=E5=A1=AB=E5=8F=82=E6=95=B0=E6=94=B9=E4=B8=BA=E9=80=89=E5=A1=AB?= =?UTF-8?q?=E5=B9=B6=E6=96=B0=E5=A2=9E=E5=8F=82=E6=95=B0=E5=AE=A1=E8=AE=A1?= =?UTF-8?q?=E8=84=9A=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 全量对比 catalog 字段与实现实际读取(audit-catalog-params.py),A 类假必填 74→0(96 个字段/72 组件) - 最大族:web×31、designated_obj×23、accuracy2×3、emails×3 等 - Screenlock/ScreenUnlock 清掉无意义必填并补 label - 隐藏参数(实现读取但目录未定义)审计为 0 --- resources/catalog.json | 192 ++++++++++++++++---------------- scripts/audit-catalog-params.py | 127 +++++++++++++++++++++ 2 files changed, 223 insertions(+), 96 deletions(-) create mode 100644 scripts/audit-catalog-params.py diff --git a/resources/catalog.json b/resources/catalog.json index 061d90f..afe2f76 100644 --- a/resources/catalog.json +++ b/resources/catalog.json @@ -110,7 +110,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "立即执行", "placeholder": "", "description": "", @@ -188,7 +188,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "Asia/Shanghai", "placeholder": "", "description": "", @@ -260,7 +260,7 @@ "widget": "number", "type": "number", "displayType": "number", - "required": true, + "required": false, "defaultValue": "3", "placeholder": "", "description": "", @@ -725,7 +725,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "", "description": "", @@ -785,7 +785,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "", "description": "", @@ -798,7 +798,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "", "description": "", @@ -824,7 +824,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "", "description": "", @@ -884,7 +884,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "", "description": "", @@ -897,7 +897,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "", "description": "", @@ -936,7 +936,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "", "description": "", @@ -1163,7 +1163,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "", "description": "", @@ -1215,7 +1215,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "", "description": "", @@ -5259,7 +5259,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "[]", "placeholder": "", "description": "支持单列和多列,单列示例:[\"A\"],多列示例:[\"A\",\"B\",\"C\"],输入空列表则作用于整个表,空列表示例:[]", @@ -5274,7 +5274,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "[]", "placeholder": "", "description": "支持单列和多列,单列示例:[1],多列示例:[1,2,3],输入空列表则作用于整个表,空列表示例:[]", @@ -5289,7 +5289,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "[]", "placeholder": "", "description": "支持单行和多行,单行示例:[1],多行示例:[1,2,3],输入空列表则作用于整个表,空列表示例:[]", @@ -5304,7 +5304,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "[]", "placeholder": "", "description": "支持单行和多行,单行示例:[1],多行示例:[1,2,3],输入空列表则作用于整个表,空列表示例:[]", @@ -7583,7 +7583,7 @@ "widget": "radio", "type": "string", "displayType": "radioGroup", - "required": true, + "required": false, "defaultValue": "xlsx", "placeholder": "", "description": "支持将数据表格导出至Excel文件、CSV文件。", @@ -20175,7 +20175,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "请选择或输入网页对象", "description": "", @@ -20474,7 +20474,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "请选择或输入网页对象", "description": "", @@ -20916,7 +20916,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "请选择或输入网页对象", "description": "", @@ -22370,7 +22370,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "请选择网页对象", "description": "", @@ -22596,7 +22596,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "请选择网页对象", "description": "", @@ -22811,7 +22811,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "请选择或输入网页对象", "description": "", @@ -23821,7 +23821,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "请选择或输入网页对象", "description": "", @@ -23951,7 +23951,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "0", "placeholder": "", "description": "可通过偏移量设置上下/左右移动范围,输入-1到1,-1向上/左偏移,1向下/右偏移", @@ -28006,7 +28006,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "请选择或输入网页对象", "description": "", @@ -28289,7 +28289,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "请选择或输入网页对象", "description": "", @@ -28305,7 +28305,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "0.5", "placeholder": "", "description": "鼠标以画布宽度/高度作为标注,在画布上画圈圈,范围0-1", @@ -28347,7 +28347,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "0", "placeholder": "", "description": "可通过偏移量设置左右偏移范围,输入-1到1,-1向左偏移,1向右偏移", @@ -28363,7 +28363,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "0", "placeholder": "", "description": "可通过偏移量设置上下/左右移动范围,输入-1到1,-1向上/左偏移,1向下/右偏移", @@ -28510,7 +28510,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "请选择或输入网页对象", "description": "", @@ -28794,7 +28794,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "请选择或输入网页对象", "description": "", @@ -29659,7 +29659,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "请选择或输入网页对象", "description": "", @@ -29741,7 +29741,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "[]", "placeholder": "请输入要匹配的内容", "description": "输入文本类型的值即可,如:[\"值1\"]。", @@ -32078,7 +32078,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "请选择或输入网页对象", "description": "", @@ -32186,7 +32186,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "请选择或输入网页对象", "description": "", @@ -32630,7 +32630,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "请选择或输入网页对象", "description": "", @@ -32759,7 +32759,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "请选择或输入网页对象", "description": "", @@ -34941,7 +34941,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "请选择或输入网页对象", "description": "", @@ -35012,7 +35012,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "60", "placeholder": "", "description": "文件上传超时时间,如果在此时间内未上传完成,将返回执行失败。", @@ -35082,7 +35082,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "10", "placeholder": "", "description": "点击上传按钮后,等待上传对话框出现的时间,超过该时间将报异常报错,单位(秒)。", @@ -35171,7 +35171,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "请选择或输入网页对象", "description": "", @@ -35290,7 +35290,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "请选择或输入网页对象", "description": "", @@ -66796,7 +66796,7 @@ "widget": "hidden", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "0.2", "placeholder": "请输入相似度阈值", "description": "【暂未启用】当前实现为纯像素模板匹配,无特征匹配层;字段保留以兼容旧流程", @@ -67327,7 +67327,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "0.2", "placeholder": "请输入相似度阈值", "description": "即需要查找的图片与模板图片的针对局部图像特征相似程度的阈值指标,与模板相似度共同决定组件运行结果。用户可自定义配置一个0~1区间的相似度取值(如0.55即55%相似度),0为完全不相似、1为完全一致,越大则命中阈值越高。(如无特殊需求,建议默认0.2) ", @@ -68494,7 +68494,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "0.2", "placeholder": "请输入相似度阈值", "description": "即需要查找的图片与模板图片的针对局部图像特征相似程度的阈值指标,与模板相似度共同决定组件运行结果。用户可自定义配置一个0~1区间的相似度取值(如0.55即55%相似度),0为完全不相似、1为完全一致,越大则命中阈值越高。(如无特殊需求,建议默认0.2)", @@ -72905,7 +72905,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "请输入待回复邮件", "description": "输入“查找邮件”组件返回的变量,仅回复查找邮件的第一封邮件。", @@ -76635,7 +76635,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "", "description": "输入“查找邮件”组件返回的变量。", @@ -77119,7 +77119,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "", "description": "输入“查找邮件”组件返回的变量,仅回复查找邮件的第一封邮件。", @@ -79397,7 +79397,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "输入成员user_id,@多个用户使用英文逗号分隔", "description": "", @@ -85256,7 +85256,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "请选择或输入网页对象", "description": "", @@ -101792,7 +101792,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "1", "placeholder": "", "description": "输入数据之间需要的连接符数量", @@ -102168,7 +102168,7 @@ "widget": "boolean", "type": "boolean", "displayType": "checkBoxGroup", - "required": true, + "required": false, "defaultValue": "", "placeholder": "", "description": "勾选对应的文本类型后,随机文本中将至少包含一个字符。", @@ -102181,7 +102181,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "", "description": " ", @@ -102234,7 +102234,7 @@ "widget": "number", "type": "number", "displayType": "rangeInput", - "required": true, + "required": false, "defaultValue": "", "placeholder": "请输入正整数", "description": "", @@ -102381,7 +102381,7 @@ "widget": "number", "type": "number", "displayType": "number", - "required": true, + "required": false, "defaultValue": "1", "placeholder": "请输入正整数", "description": "指连续含有多少个分隔符时才进行分割。", @@ -108954,7 +108954,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "选择打开网页输出的变量", "description": "选择打开网页输出的变量", @@ -109065,7 +109065,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "选择打开网页输出的变量", "description": "选择打开网页输出的变量", @@ -109468,7 +109468,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "", "description": "选择已经创建好的目标浏览器网页对象(变量),目标浏览器必须是被监听的网页对象,否则可能无法获取结果。", @@ -110309,7 +110309,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "选择打开网页输出的变量", "description": "选择打开网页输出的变量", @@ -110635,7 +110635,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "选择打开网页输出的变量", "description": "选择打开网页输出的变量", @@ -110707,7 +110707,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "选择打开网页输出的变量", "description": "选择打开网页输出的变量", @@ -110786,7 +110786,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "选择打开网页输出的变量", "description": "选择打开网页输出的变量", @@ -110887,7 +110887,7 @@ "widget": "element", "type": "object", "displayType": "comboSelector", - "required": true, + "required": false, "defaultValue": "", "placeholder": "拾取或选择输入框", "description": "", @@ -110902,7 +110902,7 @@ "widget": "region", "type": "object", "displayType": "mouseRecord", - "required": true, + "required": false, "defaultValue": "[0,0]", "placeholder": "", "description": "纵向滚动条只需要配置纵坐标y,向下为正向,如填写100,则滚动条向下滚动100;横向滚动条只需要配置横坐标x,向右为正向,如填写100,则滚动条向右滚动100", @@ -110971,7 +110971,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "选择打开网页输出的变量", "description": "选择打开网页输出的变量", @@ -112549,7 +112549,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "请选择或输入网页对象", "description": "", @@ -112873,7 +112873,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "选择打开网页输出的变量", "description": "选择打开网页输出的变量", @@ -113096,7 +113096,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "30", "placeholder": "", "description": "等待异步函数结束超时时间,-1表示一直等待", @@ -113339,7 +113339,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "请选择或输入网页对象", "description": "", @@ -114211,7 +114211,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "选择打开网页输出的变量", "description": "可以使用“打开网页”组件返回的变量。", @@ -114291,7 +114291,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "请输入图片名", "description": "输入截图的文件名,图片格式为PNG格式。", @@ -114538,7 +114538,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "选择打开网页输出的变量", "description": "选择打开网页输出的变量", @@ -114606,7 +114606,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "选择打开网页输出的变量", "description": "选择打开网页输出的变量", @@ -115129,7 +115129,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "选择打开网页输出的变量", "description": "选择打开网页输出的变量", @@ -115186,7 +115186,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "选择打开网页输出的变量", "description": "选择打开网页输出的变量", @@ -115254,7 +115254,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "选择打开网页输出的变量", "description": "选择打开网页输出的变量", @@ -115339,7 +115339,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "", "description": "选择已经创建好的目标浏览器网页对象(变量),可通过打开网页组件等组件创建变量", @@ -115402,7 +115402,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "请输入或选择目标浏览器变量", "description": "输入或选择目标浏览器变量", @@ -115483,7 +115483,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "选择打开网页输出的变量", "description": "请选择或输入目标网页对象变量", @@ -115576,7 +115576,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "60", "placeholder": "", "description": "文件上传超时时间,如果在此时间内未上传完成,将返回执行失败。", @@ -115691,7 +115691,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "选择打开网页输出的变量", "description": "请选择或输入网页对象变量", @@ -116237,7 +116237,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "", "description": "选择已经创建好的目标浏览器网页对象(变量),可通过打开网页组件等组件创建变量", @@ -116501,7 +116501,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "选择打开网页输出的变量", "description": "选择打开网页输出的变量", @@ -117165,7 +117165,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "选择打开网页输出的变量", "description": "选择打开网页输出的变量", @@ -117429,7 +117429,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "选择打开网页输出的变量", "description": "选择打开网页输出的变量", @@ -117941,7 +117941,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "选择打开网页输出的变量", "description": "选择打开网页输出的变量", @@ -118008,7 +118008,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "选择打开网页输出的变量", "description": "选择打开网页输出的变量", @@ -118993,7 +118993,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "", "description": "选择通过 “启动新浏览器” 组件创建的浏览器窗口对象。", @@ -119055,7 +119055,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "选择打开网页输出的变量", "description": "", @@ -119215,7 +119215,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "选择打开网页输出的变量", "description": "选择打开网页输出的变量", @@ -119489,7 +119489,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "选择打开网页输出的变量", "description": "选择打开网页输出的变量", @@ -119672,7 +119672,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "hWeb", "placeholder": "", "description": "", @@ -119703,7 +119703,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "", "placeholder": "", "description": "", @@ -119769,7 +119769,7 @@ "widget": "text", "type": "string", "displayType": "text-expression", - "required": true, + "required": false, "defaultValue": "网页对象", "placeholder": "选择打开网页输出的变量", "description": "选择打开网页输出的变量", @@ -122983,7 +122983,7 @@ "widget": "folder", "type": "object", "displayType": "selectFile", - "required": true, + "required": false, "defaultValue": "", "placeholder": "请输入或选择保存路径", "description": "输入或选择路径", diff --git a/scripts/audit-catalog-params.py b/scripts/audit-catalog-params.py new file mode 100644 index 0000000..927e24b --- /dev/null +++ b/scripts/audit-catalog-params.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +"""审计能力参数 v2:catalog 字段 vs 实现读取。 + +策略: +- 直接读取:handler 函数体内 text(args,["k"]) / args.k / pick(args,[...]) 等模式 +- 间接读取:body 中把 args 整体传给函数(xxx(args)),或必填 key 出现在同文件其他位置(兜底) +- A 类(假必填)只在「直接+间接+全文兜底都读不到」时报告,保证高置信 +- B 类(隐藏参数)只报直接读取的 key(保守) +""" +import json +import re +import os + +ROOT = r"D:\code\PRA-only-demo" +CAP_DIRS = [ + os.path.join(ROOT, "packages", "rpa-core", "src", "capabilities"), + os.path.join(ROOT, "src", "main", "capabilities"), +] + +with open(os.path.join(ROOT, "resources", "catalog.json"), encoding="utf-8") as f: + catalog = {c["id"]: c for c in json.load(f)["components"]} + +src_blobs = [] +for d in CAP_DIRS: + for fn in os.listdir(d): + if fn.endswith(".ts") and not fn.endswith(".test.ts"): + with open(os.path.join(d, fn), encoding="utf-8") as f: + src_blobs.append((fn, f.read())) + +def find_register_bodies(src): + out = [] + for m in re.finditer(r'register\(\s*(\[[^\]]*\]|"[A-Za-z_.0-9]+")\s*,\s*(async)?\s*\(', src): + ids = re.findall(r'"([A-Za-z_.0-9]+)"', m.group(1)) + i = m.end() - 1 + depth = 0 + start_body = None + j = i + while j < len(src): + ch = src[j] + if ch == "(": + depth += 1 + elif ch == ")": + depth -= 1 + if depth == 0: + break + elif ch == "{" and start_body is None and depth >= 2: + start_body = j + j += 1 + if start_body is None: + body = src[i + 1:j] + else: + d2 = 0 + k = start_body + while k < len(src): + if src[k] == "{": + d2 += 1 + elif src[k] == "}": + d2 -= 1 + if d2 == 0: + break + k += 1 + body = src[start_body:k] + out.append((ids, body)) + return out + +PAT_DIRECT = [ + re.compile(r'\w+\(\s*args\s*,\s*\[([^\]]*)\)'), + re.compile(r'pick\(\s*args\s*,\s*\[([^\]]*)\)'), + re.compile(r'\bargs\.([a-zA-Z_][a-zA-Z0-9_]*)'), + re.compile(r"args\[['\"]([^'\"]+)['\"]\]"), +] +INTERNAL = {"nodeId", "componentId", "timeoutMs", "time_out", "timeout", "evidenceDir"} + +info = {} # cid -> dict(direct=set, indirect=bool) +for fn, src in src_blobs: + for ids, body in find_register_bodies(src): + direct = set() + for pat in PAT_DIRECT: + for mm in pat.finditer(body): + g = mm.group(1) + if g is None: + continue + if "," in g or '"' in g or "'" in g: + direct.update(re.findall(r"['\"]([^'\"]+)['\"]", g)) + else: + direct.add(g) + # args 整体传走 → 间接(keys 未知) + indirect = bool(re.search(r'\(\s*args\s*[,)]|\bargs\s*\)', body)) and not direct + # selectorOf(args) 这种:args 作为参数出现在调用里 + if re.search(r'\w+\(\s*args\s*\)|\w+\(\s*ctx\s*,\s*node\s*,\s*args', body): + indirect = True + for cid in ids: + rec = info.setdefault(cid, {"direct": set(), "indirect": False, "file": fn}) + rec["direct"] |= direct + rec["indirect"] = rec["indirect"] or indirect + +A, B = [], [] +for cid, comp in sorted(catalog.items()): + rec = info.get(cid) + if not rec: + continue + fields = comp.get("fields") or [] + cat_keys = {f["key"] for f in fields} + required = {f["key"] for f in fields if f.get("required")} + direct = rec["direct"] + if rec["indirect"]: + # keys 未知:不判 A(无法确定),不判 B + continue + a = {k for k in required if k not in direct} + # 兜底:全目录源码找 key(带引号形式,或 .key 词边界的直接访问) + if a: + all_src = "\n".join(s for _, s in src_blobs) + a = {k for k in a if not (re.search(r'["\']' + re.escape(k) + r'["\']', all_src) or re.search(r'\.' + re.escape(k) + r'\b', all_src))} + if a: + A.append((cid, sorted(a))) + b = {k for k in direct if k not in cat_keys and k not in INTERNAL and len(k) > 2} + if b: + B.append((cid, sorted(b))) + +print(f"=== A 类:必填但实现全链路都不读(高置信假必填) {len(A)} 个 ===") +for cid, keys in A: + print(f" {cid}: {keys}") +print() +print(f"=== B 类:实现直接读取但目录未定义(隐藏参数,保守列表) {len(B)} 个 ===") +for cid, keys in B: + print(f" {cid}: {keys}")