@lark-apaas/openclaw-scripts-diagnose-cli 0.1.10-beta.0 → 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.
Files changed (2) hide show
  1. package/dist/index.cjs +57 -18
  2. 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.10-beta.0";
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.10-beta.0`;
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
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lark-apaas/openclaw-scripts-diagnose-cli",
3
- "version": "0.1.10-beta.0",
3
+ "version": "0.1.11-alpha.0",
4
4
  "description": "CLI for OpenClaw config diagnose and repair with JSON5 support",
5
5
  "main": "dist/index.cjs",
6
6
  "bin": {