@wecom/wecom-openclaw-cli 1.0.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 (44) hide show
  1. package/README.md +88 -0
  2. package/dist/commands/doctor.d.ts +7 -0
  3. package/dist/commands/doctor.d.ts.map +1 -0
  4. package/dist/commands/doctor.js +209 -0
  5. package/dist/commands/doctor.js.map +1 -0
  6. package/dist/commands/info.d.ts +7 -0
  7. package/dist/commands/info.d.ts.map +1 -0
  8. package/dist/commands/info.js +123 -0
  9. package/dist/commands/info.js.map +1 -0
  10. package/dist/commands/install.d.ts +7 -0
  11. package/dist/commands/install.d.ts.map +1 -0
  12. package/dist/commands/install.js +155 -0
  13. package/dist/commands/install.js.map +1 -0
  14. package/dist/commands/update.d.ts +7 -0
  15. package/dist/commands/update.d.ts.map +1 -0
  16. package/dist/commands/update.js +98 -0
  17. package/dist/commands/update.js.map +1 -0
  18. package/dist/index.d.ts +2 -0
  19. package/dist/index.d.ts.map +1 -0
  20. package/dist/index.js +53 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/package.json.js +79 -0
  23. package/dist/package.json.js.map +1 -0
  24. package/dist/utils/config.d.ts +24 -0
  25. package/dist/utils/config.d.ts.map +1 -0
  26. package/dist/utils/config.js +80 -0
  27. package/dist/utils/config.js.map +1 -0
  28. package/dist/utils/constants.d.ts +15 -0
  29. package/dist/utils/constants.d.ts.map +1 -0
  30. package/dist/utils/constants.js +50 -0
  31. package/dist/utils/constants.js.map +1 -0
  32. package/dist/utils/plugin.d.ts +20 -0
  33. package/dist/utils/plugin.d.ts.map +1 -0
  34. package/dist/utils/plugin.js +121 -0
  35. package/dist/utils/plugin.js.map +1 -0
  36. package/dist/utils/prompts.d.ts +20 -0
  37. package/dist/utils/prompts.d.ts.map +1 -0
  38. package/dist/utils/prompts.js +73 -0
  39. package/dist/utils/prompts.js.map +1 -0
  40. package/dist/utils/system.d.ts +30 -0
  41. package/dist/utils/system.d.ts.map +1 -0
  42. package/dist/utils/system.js +91 -0
  43. package/dist/utils/system.js.map +1 -0
  44. package/package.json +46 -0
@@ -0,0 +1,98 @@
1
+ 'use strict';
2
+
3
+ var fs = require('fs-extra');
4
+ var chalk = require('chalk');
5
+ var config = require('../utils/config.js');
6
+ var system = require('../utils/system.js');
7
+ var doctor = require('./doctor.js');
8
+ var constants = require('../utils/constants.js');
9
+ var plugin = require('../utils/plugin.js');
10
+
11
+ function _interopNamespaceDefault(e) {
12
+ var n = Object.create(null);
13
+ if (e) {
14
+ Object.keys(e).forEach(function (k) {
15
+ if (k !== 'default') {
16
+ var d = Object.getOwnPropertyDescriptor(e, k);
17
+ Object.defineProperty(n, k, d.get ? d : {
18
+ enumerable: true,
19
+ get: function () { return e[k]; }
20
+ });
21
+ }
22
+ });
23
+ }
24
+ n.default = e;
25
+ return Object.freeze(n);
26
+ }
27
+
28
+ var fs__namespace = /*#__PURE__*/_interopNamespaceDefault(fs);
29
+
30
+ /**
31
+ * update 命令
32
+ */
33
+ async function updateCommand(options, silent = false) {
34
+ console.log(chalk.blue('开始更新流程...'));
35
+ // 1. 校验版本号参数
36
+ if (options.version && !system.validateVersion(options.version)) {
37
+ console.error(chalk.red('错误: 版本号格式不合法,只允许数字、点、连字符和字母。'));
38
+ process.exit(1);
39
+ }
40
+ // 2. 备份配置,以便安装失败时回滚
41
+ console.log(chalk.blue('正在清理配置...'));
42
+ const config$1 = await config.readConfig();
43
+ const configBackup = JSON.parse(JSON.stringify(config$1));
44
+ // 移除 plugins.entries 中的插件配置
45
+ if (config$1.plugins?.entries?.[constants.PLUGIN_NAME]) {
46
+ delete config$1.plugins.entries[constants.PLUGIN_NAME];
47
+ }
48
+ // 从 plugins.allow 中移除当前插件和冲突插件
49
+ if (config$1.plugins?.allow) {
50
+ config$1.plugins.allow = config$1.plugins.allow.filter((name) => name !== constants.PLUGIN_NAME && !constants.CONFLICT_PLUGINS.includes(name));
51
+ }
52
+ await config.writeConfig(config$1);
53
+ // 3. 删除旧文件
54
+ console.log(chalk.blue('正在移除旧版插件文件...'));
55
+ if (await fs__namespace.pathExists(constants.PLUGIN_PATH)) {
56
+ await fs__namespace.remove(constants.PLUGIN_PATH);
57
+ }
58
+ // 4. 安装新版本
59
+ console.log(chalk.blue('正在安装新版本...'));
60
+ const installed = plugin.installPluginFromRegistry(options.version);
61
+ if (!installed) {
62
+ // 安装失败时回滚配置
63
+ console.log(chalk.yellow('正在回滚配置...'));
64
+ await config.writeConfig(configBackup);
65
+ process.exit(1);
66
+ }
67
+ // 5. 更新配置
68
+ console.log(chalk.blue('正在更新配置...'));
69
+ const newConfig = await config.readConfig();
70
+ if (!newConfig.plugins)
71
+ newConfig.plugins = {};
72
+ if (!newConfig.plugins.allow)
73
+ newConfig.plugins.allow = [];
74
+ if (!newConfig.plugins.allow.includes(constants.PLUGIN_NAME)) {
75
+ newConfig.plugins.allow.push(constants.PLUGIN_NAME);
76
+ }
77
+ // 禁用冲突插件并从 allow 列表移除
78
+ await plugin.disableConflictPlugins(newConfig);
79
+ await config.writeConfig(newConfig);
80
+ // 6. 运行 Doctor 检查
81
+ await doctor.doctorCommand();
82
+ // 7. 报告结果和版本
83
+ const version = await plugin.getPluginVersion();
84
+ if (version) {
85
+ if (!silent) {
86
+ console.log(chalk.green(`更新完成!新版本: ${version}`));
87
+ }
88
+ }
89
+ else {
90
+ if (!silent) {
91
+ console.warn(chalk.yellow('更新完成,但无法确定新版本(package.json 缺失或无法读取)。'));
92
+ }
93
+ }
94
+ return version;
95
+ }
96
+
97
+ exports.updateCommand = updateCommand;
98
+ //# sourceMappingURL=update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update.js","sources":["../../src/commands/update.ts"],"sourcesContent":[null],"names":["validateVersion","config","readConfig","PLUGIN_NAME","CONFLICT_PLUGINS","writeConfig","fs","PLUGIN_PATH","installPluginFromRegistry","disableConflictPlugins","doctorCommand","getPluginVersion"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA;;AAEG;AACI,eAAe,aAAa,CACjC,OAA6B,EAC7B,SAAkB,KAAK,EAAA;IAEvB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;;AAGpC,IAAA,IAAI,OAAO,CAAC,OAAO,IAAI,CAACA,sBAAe,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE;QACxD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;AACxD,QAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACjB;;IAGA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AACpC,IAAA,MAAMC,QAAM,GAAG,MAAMC,iBAAU,EAAE;AACjC,IAAA,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAACD,QAAM,CAAC,CAAC;;IAGvD,IAAIA,QAAM,CAAC,OAAO,EAAE,OAAO,GAAGE,qBAAW,CAAC,EAAE;QAC1C,OAAOF,QAAM,CAAC,OAAO,CAAC,OAAO,CAACE,qBAAW,CAAC;IAC5C;;AAGA,IAAA,IAAIF,QAAM,CAAC,OAAO,EAAE,KAAK,EAAE;AACzB,QAAAA,QAAM,CAAC,OAAO,CAAC,KAAK,GAAGA,QAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,CAChD,CAAC,IAAY,KAAK,IAAI,KAAKE,qBAAW,IAAI,CAACC,0BAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAC3E;IACH;AAEA,IAAA,MAAMC,kBAAW,CAACJ,QAAM,CAAC;;IAGzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACxC,IAAI,MAAMK,aAAE,CAAC,UAAU,CAACC,qBAAW,CAAC,EAAE;AACpC,QAAA,MAAMD,aAAE,CAAC,MAAM,CAACC,qBAAW,CAAC;IAC9B;;IAGA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACrC,MAAM,SAAS,GAAGC,gCAAyB,CAAC,OAAO,CAAC,OAAO,CAAC;IAC5D,IAAI,CAAC,SAAS,EAAE;;QAEd,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;AACtC,QAAA,MAAMH,kBAAW,CAAC,YAAY,CAAC;AAC/B,QAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACjB;;IAGA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;AACpC,IAAA,MAAM,SAAS,GAAG,MAAMH,iBAAU,EAAE;IACpC,IAAI,CAAC,SAAS,CAAC,OAAO;AAAE,QAAA,SAAS,CAAC,OAAO,GAAG,EAAE;AAC9C,IAAA,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK;AAAE,QAAA,SAAS,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE;AAC1D,IAAA,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAACC,qBAAW,CAAC,EAAE;QAClD,SAAS,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAACA,qBAAW,CAAC;IAC3C;;AAGA,IAAA,MAAMM,6BAAsB,CAAC,SAAS,CAAC;AACvC,IAAA,MAAMJ,kBAAW,CAAC,SAAS,CAAC;;IAG5B,MAAMK,oBAAa,EAAE;;AAGrB,IAAA,MAAM,OAAO,GAAG,MAAMC,uBAAgB,EAAE;IACxC,IAAI,OAAO,EAAE;QACX,IAAI,CAAC,MAAM,EAAE;AACX,YAAA,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA,UAAA,EAAa,OAAO,CAAA,CAAE,CAAC,CAAC;QAClD;IACF;SAAO;QACL,IAAI,CAAC,MAAM,EAAE;YACX,OAAO,CAAC,IAAI,CACV,KAAK,CAAC,MAAM,CACV,sCAAsC,CACvC,CACF;QACH;IACF;AAEA,IAAA,OAAO,OAAO;AAChB;;;;"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env node
2
+ 'use strict';
3
+
4
+ var commander = require('commander');
5
+ var install = require('./commands/install.js');
6
+ var info = require('./commands/info.js');
7
+ var doctor = require('./commands/doctor.js');
8
+ var update = require('./commands/update.js');
9
+ var _package = require('./package.json.js');
10
+
11
+ // 全局未捕获异常处理,避免静默失败
12
+ process.on('unhandledRejection', (err) => {
13
+ console.error('未处理的异常:', err);
14
+ process.exit(1);
15
+ });
16
+ const program = new commander.Command();
17
+ program
18
+ .name('wecom-openclaw-cli')
19
+ .description('企业微信 OpenClaw 插件管理工具')
20
+ .version(_package.default.version, '-V, --cli-version');
21
+ program
22
+ .command('install')
23
+ .description('安装并配置企业微信官方插件')
24
+ .option('--version <version>', '安装指定版本的插件')
25
+ .action(async (options) => {
26
+ await install.installCommand(options);
27
+ });
28
+ program
29
+ .command('info')
30
+ .description('显示配置信息')
31
+ .option('--all', '显示所有信息,包括配置内容')
32
+ .action(async (options) => {
33
+ await info.infoCommand(options);
34
+ });
35
+ program
36
+ .command('doctor')
37
+ .description('诊断安装问题')
38
+ .option('--fix', '尝试自动修复问题')
39
+ .action(async (options) => {
40
+ const passed = await doctor.doctorCommand(options);
41
+ if (!passed && !options.fix) {
42
+ process.exit(1);
43
+ }
44
+ });
45
+ program
46
+ .command('update')
47
+ .description('更新企业微信官方插件')
48
+ .option('--version <version>', '更新到指定版本的插件')
49
+ .action(async (options) => {
50
+ await update.updateCommand(options);
51
+ });
52
+ program.parse(process.argv);
53
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../src/index.ts"],"sourcesContent":[null],"names":["Command","pkg","installCommand","infoCommand","doctorCommand","updateCommand"],"mappings":";;;;;;;;;;AAOA;AACA,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,GAAG,KAAI;AACvC,IAAA,OAAO,CAAC,KAAK,CAAC,SAAS,EAAE,GAAG,CAAC;AAC7B,IAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;AACjB,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,IAAIA,iBAAO,EAAE;AAE7B;KACG,IAAI,CAAC,oBAAoB;KACzB,WAAW,CAAC,sBAAsB;AAClC,KAAA,OAAO,CAACC,gBAAG,CAAC,OAAO,EAAE,mBAAmB,CAAC;AAE5C;KACG,OAAO,CAAC,SAAS;KACjB,WAAW,CAAC,eAAe;AAC3B,KAAA,MAAM,CAAC,qBAAqB,EAAE,WAAW;AACzC,KAAA,MAAM,CAAC,OAAO,OAAO,KAAI;AACxB,IAAA,MAAMC,sBAAc,CAAC,OAAO,CAAC;AAC/B,CAAC,CAAC;AAEJ;KACG,OAAO,CAAC,MAAM;KACd,WAAW,CAAC,QAAQ;AACpB,KAAA,MAAM,CAAC,OAAO,EAAE,eAAe;AAC/B,KAAA,MAAM,CAAC,OAAO,OAAO,KAAI;AACxB,IAAA,MAAMC,gBAAW,CAAC,OAAO,CAAC;AAC5B,CAAC,CAAC;AAEJ;KACG,OAAO,CAAC,QAAQ;KAChB,WAAW,CAAC,QAAQ;AACpB,KAAA,MAAM,CAAC,OAAO,EAAE,UAAU;AAC1B,KAAA,MAAM,CAAC,OAAO,OAAO,KAAI;AACxB,IAAA,MAAM,MAAM,GAAG,MAAMC,oBAAa,CAAC,OAAO,CAAC;IAC3C,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;AAC3B,QAAA,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACjB;AACF,CAAC,CAAC;AAEJ;KACG,OAAO,CAAC,QAAQ;KAChB,WAAW,CAAC,YAAY;AACxB,KAAA,MAAM,CAAC,qBAAqB,EAAE,YAAY;AAC1C,KAAA,MAAM,CAAC,OAAO,OAAO,KAAI;AACxB,IAAA,MAAMC,oBAAa,CAAC,OAAO,CAAC;AAC9B,CAAC,CAAC;AAEJ,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC;;"}
@@ -0,0 +1,79 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var name = "@wecom/wecom-openclaw-cli";
6
+ var version = "1.0.0";
7
+ var description = "CLI for managing WeCom official plugin for OpenClaw";
8
+ var main = "dist/index.js";
9
+ var type = "commonjs";
10
+ var files = [
11
+ "dist"
12
+ ];
13
+ var bin = {
14
+ "wecom-openclaw-cli": "./dist/index.js"
15
+ };
16
+ var scripts = {
17
+ clean: "rimraf dist",
18
+ build: "npm run clean && rollup -c",
19
+ prepublishOnly: "npm run build",
20
+ test: "echo \"Error: no test specified\" && exit 1"
21
+ };
22
+ var keywords = [
23
+ "wecom",
24
+ "openclaw",
25
+ "cli",
26
+ "plugin"
27
+ ];
28
+ var author = "";
29
+ var license = "ISC";
30
+ var devDependencies = {
31
+ "@rollup/plugin-commonjs": "^28.0.0",
32
+ "@rollup/plugin-json": "^6.1.0",
33
+ "@rollup/plugin-node-resolve": "^16.0.0",
34
+ "@rollup/plugin-typescript": "^12.1.0",
35
+ "@types/fs-extra": "^11.0.4",
36
+ "@types/inquirer": "^9.0.9",
37
+ "@types/node": "^22.0.0",
38
+ rimraf: "^6.0.0",
39
+ rollup: "^4.28.0",
40
+ tslib: "^2.8.0",
41
+ typescript: "^5.7.0"
42
+ };
43
+ var dependencies = {
44
+ chalk: "^4.1.2",
45
+ commander: "^14.0.3",
46
+ "fs-extra": "^11.3.3",
47
+ inquirer: "^8.2.7"
48
+ };
49
+ var pkg = {
50
+ name: name,
51
+ version: version,
52
+ description: description,
53
+ main: main,
54
+ type: type,
55
+ files: files,
56
+ bin: bin,
57
+ scripts: scripts,
58
+ keywords: keywords,
59
+ author: author,
60
+ license: license,
61
+ devDependencies: devDependencies,
62
+ dependencies: dependencies
63
+ };
64
+
65
+ exports.author = author;
66
+ exports.bin = bin;
67
+ exports.default = pkg;
68
+ exports.dependencies = dependencies;
69
+ exports.description = description;
70
+ exports.devDependencies = devDependencies;
71
+ exports.files = files;
72
+ exports.keywords = keywords;
73
+ exports.license = license;
74
+ exports.main = main;
75
+ exports.name = name;
76
+ exports.scripts = scripts;
77
+ exports.type = type;
78
+ exports.version = version;
79
+ //# sourceMappingURL=package.json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * 获取 OpenClaw 数据目录
3
+ * - 优先使用环境变量 OPENCLAW_STATE_DIR
4
+ * - Windows 下默认使用 %APPDATA%/.openclaw
5
+ * - macOS/Linux 下默认使用 ~/.openclaw
6
+ */
7
+ export declare function getOpenClawDir(): string;
8
+ /**
9
+ * 获取 OpenClaw 配置文件路径
10
+ */
11
+ export declare function getConfigPath(): string;
12
+ /**
13
+ * 获取插件扩展目录
14
+ */
15
+ export declare function getExtensionsDir(): string;
16
+ /**
17
+ * 读取 OpenClaw 配置文件
18
+ */
19
+ export declare function readConfig(): Promise<any>;
20
+ /**
21
+ * 写入 OpenClaw 配置文件
22
+ */
23
+ export declare function writeConfig(config: any): Promise<void>;
24
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAIA;;;;;GAKG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAWvC;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAEtC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,CAM/C;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAI5D"}
@@ -0,0 +1,80 @@
1
+ 'use strict';
2
+
3
+ var path = require('path');
4
+ var fs = require('fs-extra');
5
+ var os = require('os');
6
+
7
+ function _interopNamespaceDefault(e) {
8
+ var n = Object.create(null);
9
+ if (e) {
10
+ Object.keys(e).forEach(function (k) {
11
+ if (k !== 'default') {
12
+ var d = Object.getOwnPropertyDescriptor(e, k);
13
+ Object.defineProperty(n, k, d.get ? d : {
14
+ enumerable: true,
15
+ get: function () { return e[k]; }
16
+ });
17
+ }
18
+ });
19
+ }
20
+ n.default = e;
21
+ return Object.freeze(n);
22
+ }
23
+
24
+ var path__namespace = /*#__PURE__*/_interopNamespaceDefault(path);
25
+ var fs__namespace = /*#__PURE__*/_interopNamespaceDefault(fs);
26
+ var os__namespace = /*#__PURE__*/_interopNamespaceDefault(os);
27
+
28
+ /**
29
+ * 获取 OpenClaw 数据目录
30
+ * - 优先使用环境变量 OPENCLAW_STATE_DIR
31
+ * - Windows 下默认使用 %APPDATA%/.openclaw
32
+ * - macOS/Linux 下默认使用 ~/.openclaw
33
+ */
34
+ function getOpenClawDir() {
35
+ if (process.env.OPENCLAW_STATE_DIR) {
36
+ return process.env.OPENCLAW_STATE_DIR;
37
+ }
38
+ // Windows 下优先使用 APPDATA 目录
39
+ if (os__namespace.platform() === 'win32' && process.env.APPDATA) {
40
+ return path__namespace.join(process.env.APPDATA, '.openclaw');
41
+ }
42
+ return path__namespace.join(os__namespace.homedir(), '.openclaw');
43
+ }
44
+ /**
45
+ * 获取 OpenClaw 配置文件路径
46
+ */
47
+ function getConfigPath() {
48
+ return path__namespace.join(getOpenClawDir(), 'openclaw.json');
49
+ }
50
+ /**
51
+ * 获取插件扩展目录
52
+ */
53
+ function getExtensionsDir() {
54
+ return path__namespace.join(getOpenClawDir(), 'extensions');
55
+ }
56
+ /**
57
+ * 读取 OpenClaw 配置文件
58
+ */
59
+ async function readConfig() {
60
+ const configPath = getConfigPath();
61
+ if (await fs__namespace.pathExists(configPath)) {
62
+ return fs__namespace.readJSON(configPath);
63
+ }
64
+ return {};
65
+ }
66
+ /**
67
+ * 写入 OpenClaw 配置文件
68
+ */
69
+ async function writeConfig(config) {
70
+ const configPath = getConfigPath();
71
+ await fs__namespace.ensureDir(path__namespace.dirname(configPath));
72
+ await fs__namespace.writeJSON(configPath, config, { spaces: 2 });
73
+ }
74
+
75
+ exports.getConfigPath = getConfigPath;
76
+ exports.getExtensionsDir = getExtensionsDir;
77
+ exports.getOpenClawDir = getOpenClawDir;
78
+ exports.readConfig = readConfig;
79
+ exports.writeConfig = writeConfig;
80
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sources":["../../src/utils/config.ts"],"sourcesContent":[null],"names":["os","path","fs"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA;;;;;AAKG;SACa,cAAc,GAAA;AAC5B,IAAA,IAAI,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE;AAClC,QAAA,OAAO,OAAO,CAAC,GAAG,CAAC,kBAAkB;IACvC;;AAGA,IAAA,IAAIA,aAAE,CAAC,QAAQ,EAAE,KAAK,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE;AACpD,QAAA,OAAOC,eAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,WAAW,CAAC;IACpD;IAEA,OAAOA,eAAI,CAAC,IAAI,CAACD,aAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC;AAC7C;AAEA;;AAEG;SACa,aAAa,GAAA;IAC3B,OAAOC,eAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,eAAe,CAAC;AACrD;AAEA;;AAEG;SACa,gBAAgB,GAAA;IAC9B,OAAOA,eAAI,CAAC,IAAI,CAAC,cAAc,EAAE,EAAE,YAAY,CAAC;AAClD;AAEA;;AAEG;AACI,eAAe,UAAU,GAAA;AAC9B,IAAA,MAAM,UAAU,GAAG,aAAa,EAAE;IAClC,IAAI,MAAMC,aAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;AACnC,QAAA,OAAOA,aAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;IAChC;AACA,IAAA,OAAO,EAAE;AACX;AAEA;;AAEG;AACI,eAAe,WAAW,CAAC,MAAW,EAAA;AAC3C,IAAA,MAAM,UAAU,GAAG,aAAa,EAAE;IAClC,MAAMA,aAAE,CAAC,SAAS,CAACD,eAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAC5C,IAAA,MAAMC,aAAE,CAAC,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AACvD;;;;;;;;"}
@@ -0,0 +1,15 @@
1
+ /** 插件扩展目录 */
2
+ export declare const EXTENSIONS_DIR: string;
3
+ /** 插件名称 */
4
+ export declare const PLUGIN_NAME = "wecom-openclaw-plugin";
5
+ /** 插件安装路径 */
6
+ export declare const PLUGIN_PATH: string;
7
+ /** npm 包名 */
8
+ export declare const PACKAGE_NAME = "@wecom/wecom-openclaw-plugin";
9
+ /** 冲突的插件名称列表 */
10
+ export declare const CONFLICT_PLUGINS: string[];
11
+ /** 冲突的插件路径列表 */
12
+ export declare const CONFLICT_PLUGIN_PATHS: string[];
13
+ /** npm 源列表(按优先级排序,第一个失败后依次尝试后续源) */
14
+ export declare const NPM_REGISTRIES: string[];
15
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/utils/constants.ts"],"names":[],"mappings":"AAGA,aAAa;AACb,eAAO,MAAM,cAAc,QAAqB,CAAC;AAEjD,WAAW;AACX,eAAO,MAAM,WAAW,0BAA0B,CAAC;AAEnD,aAAa;AACb,eAAO,MAAM,WAAW,QAAyC,CAAC;AAElE,aAAa;AACb,eAAO,MAAM,YAAY,iCAAiC,CAAC;AAE3D,gBAAgB;AAChB,eAAO,MAAM,gBAAgB,UAAgD,CAAC;AAE9E,gBAAgB;AAChB,eAAO,MAAM,qBAAqB,UAAgE,CAAC;AAEnG,oCAAoC;AACpC,eAAO,MAAM,cAAc,UAG1B,CAAC"}
@@ -0,0 +1,50 @@
1
+ 'use strict';
2
+
3
+ var path = require('path');
4
+ var config = require('./config.js');
5
+
6
+ function _interopNamespaceDefault(e) {
7
+ var n = Object.create(null);
8
+ if (e) {
9
+ Object.keys(e).forEach(function (k) {
10
+ if (k !== 'default') {
11
+ var d = Object.getOwnPropertyDescriptor(e, k);
12
+ Object.defineProperty(n, k, d.get ? d : {
13
+ enumerable: true,
14
+ get: function () { return e[k]; }
15
+ });
16
+ }
17
+ });
18
+ }
19
+ n.default = e;
20
+ return Object.freeze(n);
21
+ }
22
+
23
+ var path__namespace = /*#__PURE__*/_interopNamespaceDefault(path);
24
+
25
+ /** 插件扩展目录 */
26
+ const EXTENSIONS_DIR = config.getExtensionsDir();
27
+ /** 插件名称 */
28
+ const PLUGIN_NAME = 'wecom-openclaw-plugin';
29
+ /** 插件安装路径 */
30
+ const PLUGIN_PATH = path__namespace.join(EXTENSIONS_DIR, PLUGIN_NAME);
31
+ /** npm 包名 */
32
+ const PACKAGE_NAME = '@wecom/wecom-openclaw-plugin';
33
+ /** 冲突的插件名称列表 */
34
+ const CONFLICT_PLUGINS = ['wecom', 'openclaw-wecom', 'wecom-openclaw'];
35
+ /** 冲突的插件路径列表 */
36
+ const CONFLICT_PLUGIN_PATHS = CONFLICT_PLUGINS.map(name => path__namespace.join(EXTENSIONS_DIR, name));
37
+ /** npm 源列表(按优先级排序,第一个失败后依次尝试后续源) */
38
+ const NPM_REGISTRIES = [
39
+ 'http://mirrors.cloud.tencent.com/npm/',
40
+ 'https://registry.npmjs.org/',
41
+ ];
42
+
43
+ exports.CONFLICT_PLUGINS = CONFLICT_PLUGINS;
44
+ exports.CONFLICT_PLUGIN_PATHS = CONFLICT_PLUGIN_PATHS;
45
+ exports.EXTENSIONS_DIR = EXTENSIONS_DIR;
46
+ exports.NPM_REGISTRIES = NPM_REGISTRIES;
47
+ exports.PACKAGE_NAME = PACKAGE_NAME;
48
+ exports.PLUGIN_NAME = PLUGIN_NAME;
49
+ exports.PLUGIN_PATH = PLUGIN_PATH;
50
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sources":["../../src/utils/constants.ts"],"sourcesContent":[null],"names":["getExtensionsDir","path"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAGA;AACO,MAAM,cAAc,GAAGA,uBAAgB;AAE9C;AACO,MAAM,WAAW,GAAG;AAE3B;AACO,MAAM,WAAW,GAAGC,eAAI,CAAC,IAAI,CAAC,cAAc,EAAE,WAAW;AAEhE;AACO,MAAM,YAAY,GAAG;AAE5B;AACO,MAAM,gBAAgB,GAAG,CAAC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB;AAE5E;MACa,qBAAqB,GAAG,gBAAgB,CAAC,GAAG,CAAC,IAAI,IAAIA,eAAI,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC;AAEjG;AACO,MAAM,cAAc,GAAG;IAC5B,uCAAuC;IACvC,6BAA6B;;;;;;;;;;;"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * 版本比较
3
+ * @returns 1 表示 v1 > v2,-1 表示 v1 < v2,0 表示相等
4
+ */
5
+ export declare function compareVersions(v1: string, v2: string): number;
6
+ /**
7
+ * 从多个 npm 源尝试安装插件
8
+ * @returns 是否安装成功
9
+ */
10
+ export declare function installPluginFromRegistry(version?: string): boolean;
11
+ /**
12
+ * 获取已安装插件的版本号
13
+ * @returns 版本号字符串,未安装或读取失败时返回 undefined
14
+ */
15
+ export declare function getPluginVersion(): Promise<string | undefined>;
16
+ /**
17
+ * 禁用冲突插件配置
18
+ */
19
+ export declare function disableConflictPlugins(config?: any): Promise<any>;
20
+ //# sourceMappingURL=plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../../src/utils/plugin.ts"],"names":[],"mappings":"AAOA;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAU9D;AAED;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAsBnE;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAWpE;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAuBvE"}
@@ -0,0 +1,121 @@
1
+ 'use strict';
2
+
3
+ var path = require('path');
4
+ var fs = require('fs-extra');
5
+ var chalk = require('chalk');
6
+ var system = require('./system.js');
7
+ var config = require('./config.js');
8
+ var constants = require('./constants.js');
9
+
10
+ function _interopNamespaceDefault(e) {
11
+ var n = Object.create(null);
12
+ if (e) {
13
+ Object.keys(e).forEach(function (k) {
14
+ if (k !== 'default') {
15
+ var d = Object.getOwnPropertyDescriptor(e, k);
16
+ Object.defineProperty(n, k, d.get ? d : {
17
+ enumerable: true,
18
+ get: function () { return e[k]; }
19
+ });
20
+ }
21
+ });
22
+ }
23
+ n.default = e;
24
+ return Object.freeze(n);
25
+ }
26
+
27
+ var path__namespace = /*#__PURE__*/_interopNamespaceDefault(path);
28
+ var fs__namespace = /*#__PURE__*/_interopNamespaceDefault(fs);
29
+
30
+ /**
31
+ * 版本比较
32
+ * @returns 1 表示 v1 > v2,-1 表示 v1 < v2,0 表示相等
33
+ */
34
+ function compareVersions(v1, v2) {
35
+ const parts1 = v1.split('.').map(Number);
36
+ const parts2 = v2.split('.').map(Number);
37
+ for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
38
+ const p1 = parts1[i] || 0;
39
+ const p2 = parts2[i] || 0;
40
+ if (p1 > p2)
41
+ return 1;
42
+ if (p1 < p2)
43
+ return -1;
44
+ }
45
+ return 0;
46
+ }
47
+ /**
48
+ * 从多个 npm 源尝试安装插件
49
+ * @returns 是否安装成功
50
+ */
51
+ function installPluginFromRegistry(version) {
52
+ const packageIdentifier = version
53
+ ? `${constants.PACKAGE_NAME}@${version}`
54
+ : constants.PACKAGE_NAME;
55
+ const openclawCmd = system.getPlatformCommand('openclaw');
56
+ for (let i = 0; i < constants.NPM_REGISTRIES.length; i++) {
57
+ const registry = constants.NPM_REGISTRIES[i];
58
+ try {
59
+ console.log(chalk.blue(`正在从 ${registry} 安装插件 ${packageIdentifier}...`));
60
+ system.runCommand(`${openclawCmd} plugins install ${packageIdentifier} --registry ${registry}`);
61
+ return true;
62
+ }
63
+ catch (error) {
64
+ if (i < constants.NPM_REGISTRIES.length - 1) {
65
+ console.warn(chalk.yellow(`从 ${registry} 安装失败,正在切换到备用源重试...`));
66
+ }
67
+ else {
68
+ console.error(chalk.red('所有 npm 源均安装失败。'));
69
+ console.error(error);
70
+ }
71
+ }
72
+ }
73
+ return false;
74
+ }
75
+ /**
76
+ * 获取已安装插件的版本号
77
+ * @returns 版本号字符串,未安装或读取失败时返回 undefined
78
+ */
79
+ async function getPluginVersion() {
80
+ const packageJsonPath = path__namespace.join(constants.PLUGIN_PATH, 'package.json');
81
+ if (await fs__namespace.pathExists(packageJsonPath)) {
82
+ try {
83
+ const pkgJson = await fs__namespace.readJSON(packageJsonPath);
84
+ return pkgJson.version;
85
+ }
86
+ catch {
87
+ // 读取失败
88
+ }
89
+ }
90
+ return undefined;
91
+ }
92
+ /**
93
+ * 禁用冲突插件配置
94
+ */
95
+ async function disableConflictPlugins(config$1) {
96
+ const currentConfig = config$1 || await config.readConfig();
97
+ if (!currentConfig.plugins)
98
+ currentConfig.plugins = {};
99
+ if (!currentConfig.plugins.entries)
100
+ currentConfig.plugins.entries = {};
101
+ for (const conflictName of constants.CONFLICT_PLUGINS) {
102
+ if (!currentConfig.plugins.entries[conflictName]) {
103
+ currentConfig.plugins.entries[conflictName] = { enabled: false };
104
+ }
105
+ currentConfig.plugins.entries[conflictName].enabled = false;
106
+ }
107
+ // 从 allow 列表中移除冲突插件
108
+ if (currentConfig.plugins.allow) {
109
+ currentConfig.plugins.allow = currentConfig.plugins.allow.filter((name) => !constants.CONFLICT_PLUGINS.includes(name));
110
+ }
111
+ if (!config$1) {
112
+ await config.writeConfig(currentConfig);
113
+ }
114
+ return currentConfig;
115
+ }
116
+
117
+ exports.compareVersions = compareVersions;
118
+ exports.disableConflictPlugins = disableConflictPlugins;
119
+ exports.getPluginVersion = getPluginVersion;
120
+ exports.installPluginFromRegistry = installPluginFromRegistry;
121
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sources":["../../src/utils/plugin.ts"],"sourcesContent":[null],"names":["PACKAGE_NAME","getPlatformCommand","NPM_REGISTRIES","runCommand","path","PLUGIN_PATH","fs","config","readConfig","CONFLICT_PLUGINS","writeConfig"],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * 同时提示输入 botId 和 secret
3
+ */
4
+ export declare function promptBotIdSecret(): Promise<{
5
+ botId: string;
6
+ secret: string;
7
+ }>;
8
+ /**
9
+ * 确认是否使用已有的 botId
10
+ */
11
+ export declare function promptConfirmBotId(currentBotId: string): Promise<boolean>;
12
+ /**
13
+ * 单独提示输入 botId
14
+ */
15
+ export declare function promptBotId(): Promise<string>;
16
+ /**
17
+ * 单独提示输入 secret
18
+ */
19
+ export declare function promptSecret(): Promise<string>;
20
+ //# sourceMappingURL=prompts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../../src/utils/prompts.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAgBpF;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAU/E;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,CAAC,CAUnD;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC,CAWpD"}