@lark-apaas/openclaw-scripts-diagnose-cli 0.1.6 → 0.1.7-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 +78 -2
  2. package/package.json +1 -1
package/dist/index.cjs CHANGED
@@ -50,7 +50,7 @@ node_assert = __toESM(node_assert);
50
50
  * it terse and parseable.
51
51
  */
52
52
  function getVersion() {
53
- return "0.1.6";
53
+ return "0.1.7-alpha.0";
54
54
  }
55
55
  //#endregion
56
56
  //#region src/rule-engine/base.ts
@@ -76,6 +76,19 @@ function Rule(meta) {
76
76
  function getAllRules() {
77
77
  return topoSort(ruleRegistry.map((Ctor) => new Ctor()));
78
78
  }
79
+ /** Return serialisable metadata for all registered rules (topo-sorted). */
80
+ function getRuleMetas(keys) {
81
+ const rules = getAllRules();
82
+ return (keys && keys.length > 0 ? rules.filter((r) => keys.includes(r.meta.key)) : rules).map((r) => ({
83
+ key: r.meta.key,
84
+ description: r.meta.description ?? "(no description)",
85
+ repairMode: r.meta.repairMode,
86
+ profile: r.meta.profile ?? "standard",
87
+ dependsOn: r.meta.dependsOn ?? [],
88
+ hasSkipWhen: r.meta.skipWhen !== void 0,
89
+ hasRepair: r.repair !== DiagnoseRule.prototype.repair
90
+ }));
91
+ }
79
92
  /**
80
93
  * 判断规则在当前 profile 下是否应执行。
81
94
  * experimental profile 运行所有规则;standard 只运行 standard(或未标注)规则。
@@ -1284,6 +1297,7 @@ let OpenclawRuntimeMissingRule = class OpenclawRuntimeMissingRule extends Diagno
1284
1297
  };
1285
1298
  OpenclawRuntimeMissingRule = __decorate([Rule({
1286
1299
  key: "openclaw_runtime_missing",
1300
+ description: "检查 openclaw 二进制是否在 PATH 中可用;缺失时提示重新安装",
1287
1301
  repairMode: "user-confirm"
1288
1302
  })], OpenclawRuntimeMissingRule);
1289
1303
  //#endregion
@@ -1307,6 +1321,7 @@ let ProcessStatusRule = class ProcessStatusRule extends DiagnoseRule {
1307
1321
  };
1308
1322
  ProcessStatusRule = __decorate([Rule({
1309
1323
  key: "multi_process_detect",
1324
+ description: "通过 pgrep 检测是否存在多个并发的 openclaw-gateway 进程;多进程通常表明上次会话未正常退出",
1310
1325
  repairMode: "standard"
1311
1326
  })], ProcessStatusRule);
1312
1327
  //#endregion
@@ -1372,6 +1387,7 @@ let ConfigFileBackupRule = class ConfigFileBackupRule extends DiagnoseRule {
1372
1387
  };
1373
1388
  ConfigFileBackupRule = __decorate([Rule({
1374
1389
  key: "config_file_recover",
1390
+ description: "扫描 .bak* 配置备份,当主配置 openclaw.json 缺失时恢复编号最高的备份",
1375
1391
  repairMode: "standard"
1376
1392
  })], ConfigFileBackupRule);
1377
1393
  //#endregion
@@ -1405,6 +1421,7 @@ let ConfigFileMissingRule = class ConfigFileMissingRule extends DiagnoseRule {
1405
1421
  };
1406
1422
  ConfigFileMissingRule = __decorate([Rule({
1407
1423
  key: "config_file_missing",
1424
+ description: "在执行恢复后检查 openclaw.json 是否存在;若仍缺失则触发全量重置",
1408
1425
  dependsOn: ["config_file_recover"],
1409
1426
  repairMode: "reset"
1410
1427
  })], ConfigFileMissingRule);
@@ -1427,6 +1444,7 @@ let ConfigSyntaxRule = class ConfigSyntaxRule extends DiagnoseRule {
1427
1444
  };
1428
1445
  ConfigSyntaxRule = __decorate([Rule({
1429
1446
  key: "config_syntax_check",
1447
+ description: "验证 openclaw.json 的 JSON5 语法;schema 校验失败或解析错误时需要 AI 辅助修复",
1430
1448
  dependsOn: ["config_file_recover", "config_file_missing"],
1431
1449
  repairMode: "ai"
1432
1450
  })], ConfigSyntaxRule);
@@ -1456,6 +1474,7 @@ let TemplateVarsUnreplacedRule = class TemplateVarsUnreplacedRule extends Diagno
1456
1474
  };
1457
1475
  TemplateVarsUnreplacedRule = __decorate([Rule({
1458
1476
  key: "template_vars_unreplaced",
1477
+ description: "检测 openclaw.json 中未替换的 $__XXX__ 占位符,并从注入的环境变量中填充",
1459
1478
  dependsOn: ["config_syntax_check"],
1460
1479
  repairMode: "standard",
1461
1480
  usesVars: ["templateVars"]
@@ -1604,6 +1623,7 @@ let ModelProviderRule = class ModelProviderRule extends DiagnoseRule {
1604
1623
  };
1605
1624
  ModelProviderRule = __decorate([Rule({
1606
1625
  key: "model_provider",
1626
+ description: "检查妙搭 model provider 配置项(baseUrl、apiKey、必要 headers)是否存在且格式正确;非妙搭沙箱时跳过",
1607
1627
  dependsOn: ["config_syntax_check"],
1608
1628
  repairMode: "standard",
1609
1629
  usesVars: ["innerAPIKey", "baseURL"],
@@ -1671,6 +1691,7 @@ let SecretProviderRule = class SecretProviderRule extends DiagnoseRule {
1671
1691
  };
1672
1692
  SecretProviderRule = _SecretProviderRule = __decorate([Rule({
1673
1693
  key: "secret_provider",
1694
+ description: "验证 miaoda-provider / miaoda-secret-provider 配置块是否存在且完整;未检测到妙搭 provider 时跳过",
1674
1695
  dependsOn: ["config_syntax_check"],
1675
1696
  repairMode: "standard",
1676
1697
  skipWhen: ({ hasMiaoda, deps }) => !hasMiaoda || !deps.usesMiaodaProvider && !deps.usesMiaodaSecretProvider
@@ -1735,6 +1756,7 @@ let FeishuChannelRule = class FeishuChannelRule extends DiagnoseRule {
1735
1756
  };
1736
1757
  FeishuChannelRule = __decorate([Rule({
1737
1758
  key: "feishu_channel",
1759
+ description: "确保 channels.feishu 已启用,且包含单 agent 所需的 appId 和 appSecret 字段",
1738
1760
  dependsOn: ["config_syntax_check", "feishu_default_account"],
1739
1761
  repairMode: "standard",
1740
1762
  usesVars: ["feishuAppID", "feishuAppSecret"]
@@ -1851,6 +1873,7 @@ let FeishuDefaultAccountRule = class FeishuDefaultAccountRule extends DiagnoseRu
1851
1873
  };
1852
1874
  FeishuDefaultAccountRule = __decorate([Rule({
1853
1875
  key: "feishu_default_account",
1876
+ description: "将旧版 v1/v2 飞书 channel 配置迁移为规范的 v3 bot-<appId> 账号结构",
1854
1877
  dependsOn: ["config_syntax_check"],
1855
1878
  repairMode: "standard",
1856
1879
  usesVars: ["feishuAppID", "teamChatID"]
@@ -1979,6 +2002,7 @@ let GatewayRule = class GatewayRule extends DiagnoseRule {
1979
2002
  };
1980
2003
  GatewayRule = __decorate([Rule({
1981
2004
  key: "gateway",
2005
+ description: "验证 gateway 必填字段(port、mode、bind、auth、trustedProxies)是否存在且有效;修复缺失或非法值",
1982
2006
  dependsOn: ["config_syntax_check"],
1983
2007
  repairMode: "standard",
1984
2008
  usesVars: ["gatewayToken"]
@@ -2024,6 +2048,7 @@ let AllowedOriginsRule = class AllowedOriginsRule extends DiagnoseRule {
2024
2048
  };
2025
2049
  AllowedOriginsRule = __decorate([Rule({
2026
2050
  key: "allowed_origins",
2051
+ description: "确保所有 expectedOrigins 条目都存在于 gateway.auth.allowedOrigins 中;自动追加缺失的条目",
2027
2052
  dependsOn: ["config_syntax_check"],
2028
2053
  repairMode: "standard",
2029
2054
  usesVars: ["expectedOrigins"]
@@ -2103,6 +2128,7 @@ let JwtTokenRule = class JwtTokenRule extends DiagnoseRule {
2103
2128
  };
2104
2129
  JwtTokenRule = __decorate([Rule({
2105
2130
  key: "jwt_token",
2131
+ description: "验证 miaoda provider 引用的 JWT token 文件存在且未过期;非妙搭沙箱时跳过",
2106
2132
  dependsOn: ["config_syntax_check"],
2107
2133
  repairMode: "standard",
2108
2134
  usesVars: ["providerFilePath"],
@@ -2159,6 +2185,7 @@ let SecretsFileRule = class SecretsFileRule extends DiagnoseRule {
2159
2185
  };
2160
2186
  SecretsFileRule = __decorate([Rule({
2161
2187
  key: "secrets_file",
2188
+ description: "验证 miaoda secret-provider 引用的 secrets.json 文件存在且可解析;非妙搭或非 secret-provider 沙箱时跳过",
2162
2189
  dependsOn: ["config_syntax_check"],
2163
2190
  repairMode: "standard",
2164
2191
  usesVars: [
@@ -2214,6 +2241,7 @@ let CleanupInstallBackupDirsRule = class CleanupInstallBackupDirsRule extends Di
2214
2241
  };
2215
2242
  CleanupInstallBackupDirsRule = __decorate([Rule({
2216
2243
  key: "cleanup_install_backup_dirs",
2244
+ description: "清理 extensions/ 目录中升级中断遗留的 .openclaw-install-stage-* 和 .openclaw-install-backups/ 脏目录",
2217
2245
  repairMode: "standard"
2218
2246
  })], CleanupInstallBackupDirsRule);
2219
2247
  //#endregion
@@ -2269,6 +2297,7 @@ let MiaodaOfficialPluginsInstallSpecUnlockRule = class MiaodaOfficialPluginsInst
2269
2297
  };
2270
2298
  MiaodaOfficialPluginsInstallSpecUnlockRule = __decorate([Rule({
2271
2299
  key: "miaoda_official_plugins_install_spec_unlock",
2300
+ description: "移除官方妙搭插件安装条目中的锁版本 npm spec,使其跟随最新 manifest 版本",
2272
2301
  dependsOn: ["config_syntax_check"],
2273
2302
  repairMode: "standard"
2274
2303
  })], MiaodaOfficialPluginsInstallSpecUnlockRule);
@@ -2335,6 +2364,7 @@ let OldMiaodaPluginsCleanupRule = class OldMiaodaPluginsCleanupRule extends Diag
2335
2364
  };
2336
2365
  OldMiaodaPluginsCleanupRule = __decorate([Rule({
2337
2366
  key: "old_miaoda_plugins_cleanup",
2367
+ description: "当新版 openclaw-extension-miaoda 已存在时,清理过时插件引用(openclaw-feishu-greeting、openclaw-miaoda-keepalive 等)",
2338
2368
  dependsOn: ["config_syntax_check"],
2339
2369
  repairMode: "standard"
2340
2370
  })], OldMiaodaPluginsCleanupRule);
@@ -2372,6 +2402,7 @@ let LarkPluginAllowRule = class LarkPluginAllowRule extends DiagnoseRule {
2372
2402
  };
2373
2403
  LarkPluginAllowRule = __decorate([Rule({
2374
2404
  key: "lark_plugin_allow",
2405
+ description: "当飞书插件(openclaw-lark 或旧版名)已在磁盘安装但未加入 plugins.allow 时,自动添加",
2375
2406
  dependsOn: ["config_syntax_check"],
2376
2407
  repairMode: "standard"
2377
2408
  })], LarkPluginAllowRule);
@@ -2427,6 +2458,7 @@ let MiaodaPluginAllowRule = class MiaodaPluginAllowRule extends DiagnoseRule {
2427
2458
  };
2428
2459
  MiaodaPluginAllowRule = __decorate([Rule({
2429
2460
  key: "miaoda_plugin_allow",
2461
+ description: "当 openclaw-extension-miaoda 已在磁盘安装但未在 allow 列表中时,将其添加到 plugins.allow(实验性)",
2430
2462
  dependsOn: ["config_syntax_check"],
2431
2463
  repairMode: "standard",
2432
2464
  profile: "experimental"
@@ -2468,6 +2500,7 @@ let BuiltinPluginMissingRule = class BuiltinPluginMissingRule extends DiagnoseRu
2468
2500
  };
2469
2501
  BuiltinPluginMissingRule = __decorate([Rule({
2470
2502
  key: "builtin_plugin_missing",
2503
+ description: "检查所有内置扩展插件(openclaw-lark、openclaw-extension-miaoda 等)是否已在磁盘安装;缺失时提示重新安装(实验性)",
2471
2504
  dependsOn: ["config_syntax_check"],
2472
2505
  repairMode: "user-confirm",
2473
2506
  profile: "experimental"
@@ -2510,6 +2543,7 @@ let BuiltinPluginInstallsCleanupRule = class BuiltinPluginInstallsCleanupRule ex
2510
2543
  };
2511
2544
  BuiltinPluginInstallsCleanupRule = __decorate([Rule({
2512
2545
  key: "builtin_plugin_installs_cleanup",
2546
+ description: "在 builtin_plugin_missing 通过后,清除 plugins.installs 中磁盘目录已不存在的条目(实验性)",
2513
2547
  dependsOn: ["builtin_plugin_missing"],
2514
2548
  repairMode: "standard",
2515
2549
  profile: "experimental"
@@ -2792,6 +2826,7 @@ let FeishuPluginStateNormalizeRule = class FeishuPluginStateNormalizeRule extend
2792
2826
  };
2793
2827
  FeishuPluginStateNormalizeRule = __decorate([Rule({
2794
2828
  key: "feishu_plugin_state_normalize",
2829
+ description: "规范化磁盘上的飞书插件状态:删除旧版插件目录、清理内置 feishu 目录,并将 openclaw.json 条目对齐到 openclaw-lark 插件",
2795
2830
  dependsOn: ["config_syntax_check"],
2796
2831
  repairMode: "standard"
2797
2832
  })], FeishuPluginStateNormalizeRule);
@@ -3025,6 +3060,7 @@ let FeishuPluginVersionCompatRule = class FeishuPluginVersionCompatRule extends
3025
3060
  };
3026
3061
  FeishuPluginVersionCompatRule = __decorate([Rule({
3027
3062
  key: "feishu_plugin_version_compat",
3063
+ description: "检查飞书插件与 openclaw 版本兼容性;不兼容时推荐 upgrade_openclaw 或 upgrade_lark 操作",
3028
3064
  dependsOn: ["config_syntax_check"],
3029
3065
  repairMode: "user-confirm",
3030
3066
  usesVars: ["recommendedOpenclawTag"]
@@ -3185,6 +3221,7 @@ let FeishuAccountsConsistencyRule = class FeishuAccountsConsistencyRule extends
3185
3221
  };
3186
3222
  FeishuAccountsConsistencyRule = __decorate([Rule({
3187
3223
  key: "feishu_accounts_consistency",
3224
+ description: "检测多 agent 配置中 channels.feishu.accounts、agents.list 与 feishu bindings 之间的数量/ID 不一致(实验性)",
3188
3225
  dependsOn: ["config_syntax_check"],
3189
3226
  repairMode: "check-only",
3190
3227
  usesVars: ["feishuAppID"],
@@ -8149,7 +8186,7 @@ async function reportCliRun(opts) {
8149
8186
  //#region src/help.ts
8150
8187
  const BIN = "mclaw-diagnose";
8151
8188
  function versionBanner() {
8152
- return `v0.1.6`;
8189
+ return `v0.1.7-alpha.0`;
8153
8190
  }
8154
8191
  const COMMANDS = [
8155
8192
  {
@@ -8416,6 +8453,39 @@ OPTIONS
8416
8453
  EXIT CODES
8417
8454
  0 Success or skipped (prerequisites not met).
8418
8455
  1 Secret/path unresolvable, lark-cli failed, or config unreadable.
8456
+ `
8457
+ },
8458
+ {
8459
+ name: "rules",
8460
+ hidden: true,
8461
+ summary: "List all registered rule metadata as JSON",
8462
+ help: `USAGE
8463
+ ${BIN} rules [--rule=<key>]...
8464
+
8465
+ DESCRIPTION
8466
+ Prints a JSON array of serialisable metadata for every registered rule,
8467
+ topologically sorted by dependsOn. Useful for tooling, dashboards, and
8468
+ analysis scripts that need a stable machine-readable view of the rule
8469
+ registry.
8470
+
8471
+ Each element has the shape:
8472
+ {
8473
+ "key": "gateway",
8474
+ "description": "...",
8475
+ "repairMode": "standard" | "user-confirm" | "ai" | "reset" | "check-only",
8476
+ "profile": "standard" | "experimental",
8477
+ "dependsOn": ["config_syntax_check"],
8478
+ "hasSkipWhen": false
8479
+ }
8480
+
8481
+ OPTIONS
8482
+ --rule=<key> Filter output to specific rule keys (repeatable). Returns
8483
+ all rules when omitted.
8484
+
8485
+ EXAMPLES
8486
+ ${BIN} rules # all rules
8487
+ ${BIN} rules --rule=gateway # single rule
8488
+ ${BIN} rules --rule=gateway --rule=feishu_channel # multiple rules
8419
8489
  `
8420
8490
  },
8421
8491
  {
@@ -10261,6 +10331,12 @@ async function main() {
10261
10331
  if (error) throw error;
10262
10332
  break;
10263
10333
  }
10334
+ case "rules": {
10335
+ const keys = getMultiFlag(args, "rule");
10336
+ const metas = getRuleMetas(keys.length > 0 ? keys : void 0);
10337
+ console.log(JSON.stringify(metas));
10338
+ break;
10339
+ }
10264
10340
  case "lark-cli-init": {
10265
10341
  const appId = getFlag(args, "app-id");
10266
10342
  if (!appId) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lark-apaas/openclaw-scripts-diagnose-cli",
3
- "version": "0.1.6",
3
+ "version": "0.1.7-alpha.0",
4
4
  "description": "CLI for OpenClaw config diagnose and repair with JSON5 support",
5
5
  "main": "dist/index.cjs",
6
6
  "bin": {