@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.
- package/dist/index.cjs +78 -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.
|
|
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.
|
|
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) {
|