@lark-apaas/openclaw-scripts-diagnose-cli 0.1.10 → 0.1.11-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +57 -18
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -52,7 +52,7 @@ node_assert = __toESM(node_assert);
|
|
|
52
52
|
* it terse and parseable.
|
|
53
53
|
*/
|
|
54
54
|
function getVersion() {
|
|
55
|
-
return "0.1.
|
|
55
|
+
return "0.1.11-alpha.0";
|
|
56
56
|
}
|
|
57
57
|
//#endregion
|
|
58
58
|
//#region src/rule-engine/base.ts
|
|
@@ -86,11 +86,16 @@ function getRuleMetas(keys) {
|
|
|
86
86
|
description: r.meta.description ?? "(no description)",
|
|
87
87
|
repairMode: r.meta.repairMode,
|
|
88
88
|
profile: r.meta.profile ?? "standard",
|
|
89
|
+
level: getRuleImpactLevel(r.meta),
|
|
89
90
|
dependsOn: r.meta.dependsOn ?? [],
|
|
90
91
|
hasSkipWhen: r.meta.skipWhen !== void 0,
|
|
91
92
|
hasRepair: r.repair !== DiagnoseRule.prototype.repair
|
|
92
93
|
}));
|
|
93
94
|
}
|
|
95
|
+
/** Default to critical for compatibility with tests/callers that build fake rules. */
|
|
96
|
+
function getRuleImpactLevel(meta) {
|
|
97
|
+
return meta.level ?? "critical";
|
|
98
|
+
}
|
|
94
99
|
/**
|
|
95
100
|
* 判断规则在当前 profile 下是否应执行。
|
|
96
101
|
* experimental profile 运行所有规则;standard 只运行 standard(或未标注)规则。
|
|
@@ -1314,7 +1319,8 @@ let OpenclawRuntimeMissingRule = class OpenclawRuntimeMissingRule extends Diagno
|
|
|
1314
1319
|
OpenclawRuntimeMissingRule = __decorate([Rule({
|
|
1315
1320
|
key: "openclaw_runtime_missing",
|
|
1316
1321
|
description: "检查 openclaw 二进制是否在 PATH 中可用;缺失时提示重新安装",
|
|
1317
|
-
repairMode: "user-confirm"
|
|
1322
|
+
repairMode: "user-confirm",
|
|
1323
|
+
level: "critical"
|
|
1318
1324
|
})], OpenclawRuntimeMissingRule);
|
|
1319
1325
|
//#endregion
|
|
1320
1326
|
//#region src/rules/multi-process-detect.ts
|
|
@@ -1338,7 +1344,8 @@ let ProcessStatusRule = class ProcessStatusRule extends DiagnoseRule {
|
|
|
1338
1344
|
ProcessStatusRule = __decorate([Rule({
|
|
1339
1345
|
key: "multi_process_detect",
|
|
1340
1346
|
description: "通过 pgrep 检测是否存在多个并发的 openclaw-gateway 进程;多进程通常表明上次会话未正常退出",
|
|
1341
|
-
repairMode: "standard"
|
|
1347
|
+
repairMode: "standard",
|
|
1348
|
+
level: "critical"
|
|
1342
1349
|
})], ProcessStatusRule);
|
|
1343
1350
|
//#endregion
|
|
1344
1351
|
//#region src/rules/config-file-recover.ts
|
|
@@ -1404,7 +1411,8 @@ let ConfigFileBackupRule = class ConfigFileBackupRule extends DiagnoseRule {
|
|
|
1404
1411
|
ConfigFileBackupRule = __decorate([Rule({
|
|
1405
1412
|
key: "config_file_recover",
|
|
1406
1413
|
description: "扫描 .bak* 配置备份,当主配置 openclaw.json 缺失时恢复编号最高的备份",
|
|
1407
|
-
repairMode: "standard"
|
|
1414
|
+
repairMode: "standard",
|
|
1415
|
+
level: "critical"
|
|
1408
1416
|
})], ConfigFileBackupRule);
|
|
1409
1417
|
//#endregion
|
|
1410
1418
|
//#region src/rules/config-file-missing.ts
|
|
@@ -1439,7 +1447,8 @@ ConfigFileMissingRule = __decorate([Rule({
|
|
|
1439
1447
|
key: "config_file_missing",
|
|
1440
1448
|
description: "在执行恢复后检查 openclaw.json 是否存在;若仍缺失则触发全量重置",
|
|
1441
1449
|
dependsOn: ["config_file_recover"],
|
|
1442
|
-
repairMode: "reset"
|
|
1450
|
+
repairMode: "reset",
|
|
1451
|
+
level: "critical"
|
|
1443
1452
|
})], ConfigFileMissingRule);
|
|
1444
1453
|
//#endregion
|
|
1445
1454
|
//#region src/rules/config-syntax.ts
|
|
@@ -1462,7 +1471,8 @@ ConfigSyntaxRule = __decorate([Rule({
|
|
|
1462
1471
|
key: "config_syntax_check",
|
|
1463
1472
|
description: "验证 openclaw.json 的 JSON5 语法;schema 校验失败或解析错误时需要 AI 辅助修复",
|
|
1464
1473
|
dependsOn: ["config_file_recover", "config_file_missing"],
|
|
1465
|
-
repairMode: "ai"
|
|
1474
|
+
repairMode: "ai",
|
|
1475
|
+
level: "critical"
|
|
1466
1476
|
})], ConfigSyntaxRule);
|
|
1467
1477
|
//#endregion
|
|
1468
1478
|
//#region src/rules/template-vars-unreplaced.ts
|
|
@@ -1493,6 +1503,7 @@ TemplateVarsUnreplacedRule = __decorate([Rule({
|
|
|
1493
1503
|
description: "检测 openclaw.json 中未替换的 $__XXX__ 占位符,并从注入的环境变量中填充",
|
|
1494
1504
|
dependsOn: ["config_syntax_check"],
|
|
1495
1505
|
repairMode: "standard",
|
|
1506
|
+
level: "critical",
|
|
1496
1507
|
usesVars: ["templateVars"]
|
|
1497
1508
|
})], TemplateVarsUnreplacedRule);
|
|
1498
1509
|
function collectPlaceholders(value, found) {
|
|
@@ -1564,7 +1575,8 @@ AgentsMdServiceCommandsRule = __decorate([Rule({
|
|
|
1564
1575
|
key: "agents_md_service_commands",
|
|
1565
1576
|
description: "检测各智能体 AGENTS.md 中旧版 OpenClaw 服务命令,并替换为 /opt/force/bin/openclaw_scripts 路径",
|
|
1566
1577
|
dependsOn: ["config_syntax_check"],
|
|
1567
|
-
repairMode: "standard"
|
|
1578
|
+
repairMode: "standard",
|
|
1579
|
+
level: "silent"
|
|
1568
1580
|
})], AgentsMdServiceCommandsRule);
|
|
1569
1581
|
function hasOldServiceCommands(content) {
|
|
1570
1582
|
return SERVICE_COMMAND_REPLACEMENTS.some(([oldCmd]) => content.includes(oldCmd));
|
|
@@ -1638,10 +1650,14 @@ AgentsMdResourceConstrainedToolsRule = __decorate([Rule({
|
|
|
1638
1650
|
key: "agents_md_resource_constrained_tools",
|
|
1639
1651
|
description: "检测各智能体 AGENTS.md 中 resource_constrained_tools 规则块,缺失时追加,存在时替换为当前内容",
|
|
1640
1652
|
dependsOn: ["config_syntax_check"],
|
|
1641
|
-
repairMode: "standard"
|
|
1653
|
+
repairMode: "standard",
|
|
1654
|
+
level: "silent"
|
|
1642
1655
|
})], AgentsMdResourceConstrainedToolsRule);
|
|
1643
1656
|
function hasCurrentResourceConstrainedToolsBlock(content) {
|
|
1644
|
-
return content.includes(RESOURCE_CONSTRAINED_TOOLS_BLOCK);
|
|
1657
|
+
return normalizeForTemplateMatch(content).includes(normalizeForTemplateMatch(RESOURCE_CONSTRAINED_TOOLS_BLOCK));
|
|
1658
|
+
}
|
|
1659
|
+
function normalizeForTemplateMatch(content) {
|
|
1660
|
+
return content.replace(/\r\n?/g, "\n").split("\n").map((line) => line.trimEnd()).filter((line) => line.length > 0).join("\n");
|
|
1645
1661
|
}
|
|
1646
1662
|
function upsertResourceConstrainedToolsBlock(content) {
|
|
1647
1663
|
const tagRe = new RegExp(`<${RESOURCE_CONSTRAINED_TOOLS_TAG}>[\\s\\S]*?</${RESOURCE_CONSTRAINED_TOOLS_TAG}>`);
|
|
@@ -1756,6 +1772,7 @@ ModelProviderRule = __decorate([Rule({
|
|
|
1756
1772
|
description: "检查妙搭 model provider 配置项(baseUrl、apiKey、必要 headers)是否存在且格式正确;非妙搭沙箱时跳过",
|
|
1757
1773
|
dependsOn: ["config_syntax_check"],
|
|
1758
1774
|
repairMode: "standard",
|
|
1775
|
+
level: "critical",
|
|
1759
1776
|
usesVars: ["innerAPIKey", "baseURL"],
|
|
1760
1777
|
skipWhen: ({ hasMiaoda }) => !hasMiaoda
|
|
1761
1778
|
})], ModelProviderRule);
|
|
@@ -1824,6 +1841,7 @@ SecretProviderRule = _SecretProviderRule = __decorate([Rule({
|
|
|
1824
1841
|
description: "验证 miaoda-provider / miaoda-secret-provider 配置块是否存在且完整;未检测到妙搭 provider 时跳过",
|
|
1825
1842
|
dependsOn: ["config_syntax_check"],
|
|
1826
1843
|
repairMode: "standard",
|
|
1844
|
+
level: "critical",
|
|
1827
1845
|
skipWhen: ({ hasMiaoda, deps }) => !hasMiaoda || !deps.usesMiaodaProvider && !deps.usesMiaodaSecretProvider
|
|
1828
1846
|
})], SecretProviderRule);
|
|
1829
1847
|
//#endregion
|
|
@@ -1889,6 +1907,7 @@ FeishuChannelRule = __decorate([Rule({
|
|
|
1889
1907
|
description: "确保 channels.feishu 已启用,且包含单 agent 所需的 appId 和 appSecret 字段",
|
|
1890
1908
|
dependsOn: ["config_syntax_check", "feishu_default_account"],
|
|
1891
1909
|
repairMode: "standard",
|
|
1910
|
+
level: "critical",
|
|
1892
1911
|
usesVars: ["feishuAppID", "feishuAppSecret"]
|
|
1893
1912
|
})], FeishuChannelRule);
|
|
1894
1913
|
//#endregion
|
|
@@ -2006,6 +2025,7 @@ FeishuDefaultAccountRule = __decorate([Rule({
|
|
|
2006
2025
|
description: "将旧版 v1/v2 飞书 channel 配置迁移为规范的 v3 bot-<appId> 账号结构",
|
|
2007
2026
|
dependsOn: ["config_syntax_check"],
|
|
2008
2027
|
repairMode: "standard",
|
|
2028
|
+
level: "critical",
|
|
2009
2029
|
usesVars: ["feishuAppID", "teamChatID"]
|
|
2010
2030
|
})], FeishuDefaultAccountRule);
|
|
2011
2031
|
/**
|
|
@@ -2049,7 +2069,8 @@ FeishuBotIdRule = __decorate([Rule({
|
|
|
2049
2069
|
key: "feishu_bot_id",
|
|
2050
2070
|
description: "确保多账号飞书配置中每个 bot-<appId> 账号 key 与 appId 一致",
|
|
2051
2071
|
dependsOn: ["config_syntax_check", "feishu_default_account"],
|
|
2052
|
-
repairMode: "standard"
|
|
2072
|
+
repairMode: "standard",
|
|
2073
|
+
level: "critical"
|
|
2053
2074
|
})], FeishuBotIdRule);
|
|
2054
2075
|
function getMismatchedAccounts(accounts) {
|
|
2055
2076
|
const mismatched = [];
|
|
@@ -2104,7 +2125,8 @@ SessionPersistenceRule = __decorate([Rule({
|
|
|
2104
2125
|
key: "session_persistence",
|
|
2105
2126
|
description: "补齐 session.resetByChannel 与 session.maintenance 持久化配置",
|
|
2106
2127
|
dependsOn: ["config_syntax_check"],
|
|
2107
|
-
repairMode: "standard"
|
|
2128
|
+
repairMode: "standard",
|
|
2129
|
+
level: "silent"
|
|
2108
2130
|
})], SessionPersistenceRule);
|
|
2109
2131
|
//#endregion
|
|
2110
2132
|
//#region src/rules/gateway.ts
|
|
@@ -2220,6 +2242,7 @@ GatewayRule = __decorate([Rule({
|
|
|
2220
2242
|
description: "验证 gateway 必填字段(port、mode、bind、auth、trustedProxies)是否存在且有效;修复缺失或非法值",
|
|
2221
2243
|
dependsOn: ["config_syntax_check"],
|
|
2222
2244
|
repairMode: "standard",
|
|
2245
|
+
level: "critical",
|
|
2223
2246
|
usesVars: ["gatewayToken"]
|
|
2224
2247
|
})], GatewayRule);
|
|
2225
2248
|
//#endregion
|
|
@@ -2266,6 +2289,7 @@ AllowedOriginsRule = __decorate([Rule({
|
|
|
2266
2289
|
description: "确保所有 expectedOrigins 条目都存在于 gateway.auth.allowedOrigins 中;自动追加缺失的条目",
|
|
2267
2290
|
dependsOn: ["config_syntax_check"],
|
|
2268
2291
|
repairMode: "standard",
|
|
2292
|
+
level: "critical",
|
|
2269
2293
|
usesVars: ["expectedOrigins"]
|
|
2270
2294
|
})], AllowedOriginsRule);
|
|
2271
2295
|
function getExpectedOrigins(vars) {
|
|
@@ -2346,6 +2370,7 @@ JwtTokenRule = __decorate([Rule({
|
|
|
2346
2370
|
description: "验证 miaoda provider 引用的 JWT token 文件存在且未过期;非妙搭沙箱时跳过",
|
|
2347
2371
|
dependsOn: ["config_syntax_check"],
|
|
2348
2372
|
repairMode: "standard",
|
|
2373
|
+
level: "critical",
|
|
2349
2374
|
usesVars: ["providerFilePath"],
|
|
2350
2375
|
skipWhen: ({ hasMiaoda, deps }) => !hasMiaoda || !deps.usesMiaodaProvider
|
|
2351
2376
|
})], JwtTokenRule);
|
|
@@ -2403,6 +2428,7 @@ SecretsFileRule = __decorate([Rule({
|
|
|
2403
2428
|
description: "验证 miaoda secret-provider 引用的 secrets.json 文件存在且可解析;非妙搭或非 secret-provider 沙箱时跳过",
|
|
2404
2429
|
dependsOn: ["config_syntax_check"],
|
|
2405
2430
|
repairMode: "standard",
|
|
2431
|
+
level: "critical",
|
|
2406
2432
|
usesVars: [
|
|
2407
2433
|
"secretsFilePath",
|
|
2408
2434
|
"feishuAppSecret",
|
|
@@ -2457,7 +2483,8 @@ let CleanupInstallBackupDirsRule = class CleanupInstallBackupDirsRule extends Di
|
|
|
2457
2483
|
CleanupInstallBackupDirsRule = __decorate([Rule({
|
|
2458
2484
|
key: "cleanup_install_backup_dirs",
|
|
2459
2485
|
description: "清理 extensions/ 目录中升级中断遗留的 .openclaw-install-stage-* 和 .openclaw-install-backups/ 脏目录",
|
|
2460
|
-
repairMode: "standard"
|
|
2486
|
+
repairMode: "standard",
|
|
2487
|
+
level: "critical"
|
|
2461
2488
|
})], CleanupInstallBackupDirsRule);
|
|
2462
2489
|
//#endregion
|
|
2463
2490
|
//#region src/rules/miaoda-official-plugins-install-spec-unlock.ts
|
|
@@ -2514,7 +2541,8 @@ MiaodaOfficialPluginsInstallSpecUnlockRule = __decorate([Rule({
|
|
|
2514
2541
|
key: "miaoda_official_plugins_install_spec_unlock",
|
|
2515
2542
|
description: "移除官方妙搭插件安装条目中的锁版本 npm spec,使其跟随最新 manifest 版本",
|
|
2516
2543
|
dependsOn: ["config_syntax_check"],
|
|
2517
|
-
repairMode: "standard"
|
|
2544
|
+
repairMode: "standard",
|
|
2545
|
+
level: "silent"
|
|
2518
2546
|
})], MiaodaOfficialPluginsInstallSpecUnlockRule);
|
|
2519
2547
|
//#endregion
|
|
2520
2548
|
//#region src/rules/old-miaoda-plugins-cleanup.ts
|
|
@@ -2581,7 +2609,8 @@ OldMiaodaPluginsCleanupRule = __decorate([Rule({
|
|
|
2581
2609
|
key: "old_miaoda_plugins_cleanup",
|
|
2582
2610
|
description: "当新版 openclaw-extension-miaoda 已存在时,清理过时插件引用(openclaw-feishu-greeting、openclaw-miaoda-keepalive 等)",
|
|
2583
2611
|
dependsOn: ["config_syntax_check"],
|
|
2584
|
-
repairMode: "standard"
|
|
2612
|
+
repairMode: "standard",
|
|
2613
|
+
level: "silent"
|
|
2585
2614
|
})], OldMiaodaPluginsCleanupRule);
|
|
2586
2615
|
//#endregion
|
|
2587
2616
|
//#region src/rules/lark-plugin-allow.ts
|
|
@@ -2619,7 +2648,8 @@ LarkPluginAllowRule = __decorate([Rule({
|
|
|
2619
2648
|
key: "lark_plugin_allow",
|
|
2620
2649
|
description: "当飞书插件(openclaw-lark 或旧版名)已在磁盘安装但未加入 plugins.allow 时,自动添加",
|
|
2621
2650
|
dependsOn: ["config_syntax_check"],
|
|
2622
|
-
repairMode: "standard"
|
|
2651
|
+
repairMode: "standard",
|
|
2652
|
+
level: "critical"
|
|
2623
2653
|
})], LarkPluginAllowRule);
|
|
2624
2654
|
function getAllow$1(config) {
|
|
2625
2655
|
const plugins = config.plugins;
|
|
@@ -2676,6 +2706,7 @@ MiaodaPluginAllowRule = __decorate([Rule({
|
|
|
2676
2706
|
description: "当 openclaw-extension-miaoda 已在磁盘安装但未在 allow 列表中时,将其添加到 plugins.allow(实验性)",
|
|
2677
2707
|
dependsOn: ["config_syntax_check"],
|
|
2678
2708
|
repairMode: "standard",
|
|
2709
|
+
level: "critical",
|
|
2679
2710
|
profile: "standard"
|
|
2680
2711
|
})], MiaodaPluginAllowRule);
|
|
2681
2712
|
function getAllow(config) {
|
|
@@ -2718,6 +2749,7 @@ BuiltinPluginMissingRule = __decorate([Rule({
|
|
|
2718
2749
|
description: "检查所有内置扩展插件(openclaw-lark、openclaw-extension-miaoda 等)是否已在磁盘安装;缺失时提示重新安装(实验性)",
|
|
2719
2750
|
dependsOn: ["config_syntax_check"],
|
|
2720
2751
|
repairMode: "user-confirm",
|
|
2752
|
+
level: "critical",
|
|
2721
2753
|
profile: "experimental"
|
|
2722
2754
|
})], BuiltinPluginMissingRule);
|
|
2723
2755
|
//#endregion
|
|
@@ -2761,6 +2793,7 @@ BuiltinPluginInstallsCleanupRule = __decorate([Rule({
|
|
|
2761
2793
|
description: "在 builtin_plugin_missing 通过后,清除 plugins.installs 中磁盘目录已不存在的条目(实验性)",
|
|
2762
2794
|
dependsOn: ["builtin_plugin_missing"],
|
|
2763
2795
|
repairMode: "standard",
|
|
2796
|
+
level: "silent",
|
|
2764
2797
|
profile: "experimental"
|
|
2765
2798
|
})], BuiltinPluginInstallsCleanupRule);
|
|
2766
2799
|
//#endregion
|
|
@@ -3043,7 +3076,8 @@ FeishuPluginStateNormalizeRule = __decorate([Rule({
|
|
|
3043
3076
|
key: "feishu_plugin_state_normalize",
|
|
3044
3077
|
description: "规范化磁盘上的飞书插件状态:删除旧版插件目录、清理内置 feishu 目录,并将 openclaw.json 条目对齐到 openclaw-lark 插件",
|
|
3045
3078
|
dependsOn: ["config_syntax_check"],
|
|
3046
|
-
repairMode: "standard"
|
|
3079
|
+
repairMode: "standard",
|
|
3080
|
+
level: "critical"
|
|
3047
3081
|
})], FeishuPluginStateNormalizeRule);
|
|
3048
3082
|
function isPluginInstalled(ctx) {
|
|
3049
3083
|
return node_fs.default.existsSync(node_path.default.join(getExtensionsDir(ctx.configPath), PLUGIN_NAME$1));
|
|
@@ -3316,6 +3350,7 @@ FeishuPluginOpenclawUpgradeRule = __decorate([Rule({
|
|
|
3316
3350
|
description: "检查飞书插件是否要求更高版本的 openclaw;是则提示升级 openclaw",
|
|
3317
3351
|
dependsOn: ["config_syntax_check"],
|
|
3318
3352
|
repairMode: "user-confirm",
|
|
3353
|
+
level: "critical",
|
|
3319
3354
|
usesVars: ["recommendedOpenclawTag"]
|
|
3320
3355
|
})], FeishuPluginOpenclawUpgradeRule);
|
|
3321
3356
|
/**
|
|
@@ -3342,6 +3377,7 @@ FeishuPluginLarkUpgradeRule = __decorate([Rule({
|
|
|
3342
3377
|
description: "检查飞书插件版本是否落后于当前 openclaw;是则提示升级飞书插件",
|
|
3343
3378
|
dependsOn: ["config_syntax_check", "feishu_plugin_version_compat_openclaw"],
|
|
3344
3379
|
repairMode: "user-confirm",
|
|
3380
|
+
level: "critical",
|
|
3345
3381
|
usesVars: ["recommendedOpenclawTag"]
|
|
3346
3382
|
})], FeishuPluginLarkUpgradeRule);
|
|
3347
3383
|
function isForkPlugin(p) {
|
|
@@ -3504,6 +3540,7 @@ FeishuAccountsConsistencyRule = __decorate([Rule({
|
|
|
3504
3540
|
description: "检测多 agent 配置中 channels.feishu.accounts、agents.list 与 feishu bindings 之间的数量/ID 不一致(实验性)",
|
|
3505
3541
|
dependsOn: ["config_syntax_check"],
|
|
3506
3542
|
repairMode: "check-only",
|
|
3543
|
+
level: "silent",
|
|
3507
3544
|
usesVars: ["feishuAppID"],
|
|
3508
3545
|
profile: "experimental"
|
|
3509
3546
|
})], FeishuAccountsConsistencyRule);
|
|
@@ -3637,7 +3674,7 @@ function runCheckImpl(input) {
|
|
|
3637
3674
|
action: r.action
|
|
3638
3675
|
});
|
|
3639
3676
|
failedKeys.add(meta.key);
|
|
3640
|
-
pushFailedRule(result, meta.repairMode, meta.key, r.message || "", r.action);
|
|
3677
|
+
if (getRuleImpactLevel(meta) === "critical") pushFailedRule(result, meta.repairMode, meta.key, r.message || "", r.action);
|
|
3641
3678
|
}
|
|
3642
3679
|
}
|
|
3643
3680
|
console.error(`runCheck: end totalMs=${Date.now() - tStart} failed={standard:${result.failedRules.standard.length},ai:${result.failedRules.ai.length},reset:${result.failedRules.reset.length}}`);
|
|
@@ -10001,7 +10038,7 @@ async function reportCliRun(opts) {
|
|
|
10001
10038
|
//#region src/help.ts
|
|
10002
10039
|
const BIN = "mclaw-diagnose";
|
|
10003
10040
|
function versionBanner() {
|
|
10004
|
-
return `v0.1.
|
|
10041
|
+
return `v0.1.11-alpha.0`;
|
|
10005
10042
|
}
|
|
10006
10043
|
const COMMANDS = [
|
|
10007
10044
|
{
|
|
@@ -10475,6 +10512,7 @@ function flushDiagnoseSlardar() {
|
|
|
10475
10512
|
}
|
|
10476
10513
|
function reportDoctorRunToSlardar(opts) {
|
|
10477
10514
|
const outcomes = opts.ruleOutcomes ?? [];
|
|
10515
|
+
const ruleLevels = new Map(getAllRules().map((rule) => [rule.meta.key, getRuleImpactLevel(rule.meta)]));
|
|
10478
10516
|
console.error(`[slardar] reportTask command=${opts.command} scene=${opts.scene ?? ""} profile=${opts.profile} fix=${opts.fix} events=${1 + outcomes.length}`);
|
|
10479
10517
|
reportTask({
|
|
10480
10518
|
eventName: "diagnose_cli_run",
|
|
@@ -10501,6 +10539,7 @@ function reportDoctorRunToSlardar(opts) {
|
|
|
10501
10539
|
fix: String(opts.fix),
|
|
10502
10540
|
rule_key: o.rule,
|
|
10503
10541
|
rule_status: o.status,
|
|
10542
|
+
rule_level: ruleLevels.get(o.rule) ?? "",
|
|
10504
10543
|
rule_message: o.message ?? ""
|
|
10505
10544
|
}
|
|
10506
10545
|
});
|