@workclaw/cli 1.0.312 → 1.0.313

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.
@@ -10,6 +10,7 @@ export declare const ERROR_CODES: {
10
10
  readonly NPM_INSTALL_FAILED: "NPM_INSTALL_FAILED";
11
11
  readonly CONFIG_WRITE_FAILED: "CONFIG_WRITE_FAILED";
12
12
  readonly PLUGIN_EXTRACT_FAILED: "PLUGIN_EXTRACT_FAILED";
13
+ readonly INVALID_OPENCLAW_PATH: "INVALID_OPENCLAW_PATH";
13
14
  };
14
15
  export type ErrorCode = keyof typeof ERROR_CODES;
15
16
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/box/error/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;;;;;CASd,CAAA;AAEV,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,WAAW,CAAA;AAEhD;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CASpD,CAAA;AAED;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;IAExB,IAAI,EAAE,SAAS;gBAAf,IAAI,EAAE,SAAS,EACtB,OAAO,EAAE,MAAM;CAKlB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAUlD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/box/error/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;CAUd,CAAA;AAEV,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,WAAW,CAAA;AAEhD;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAUpD,CAAA;AAED;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;IAExB,IAAI,EAAE,SAAS;gBAAf,IAAI,EAAE,SAAS,EACtB,OAAO,EAAE,MAAM;CAKlB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAUlD"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/box/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGxC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CASvD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/box/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAGxC,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAUvD"}
@@ -5,6 +5,7 @@ export declare class BoxInstaller {
5
5
  private prefixText;
6
6
  constructor(config: BoxInstallerConfig);
7
7
  validateConfig(): void;
8
+ private validateOpenclawPath;
8
9
  private getPaths;
9
10
  private updateSpinner;
10
11
  getPrefixText(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../../src/box/installer/installer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAgB,MAAM,UAAU,CAAA;AAqDhE,qBAAa,YAAY;IAIX,OAAO,CAAC,MAAM;IAH1B,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,UAAU,CAAa;gBAEX,MAAM,EAAE,kBAAkB;IAI9C,cAAc,IAAI,IAAI;IAatB,OAAO,CAAC,QAAQ;IAmBhB,OAAO,CAAC,aAAa;IAMrB,aAAa,IAAI,MAAM;IAIvB,OAAO,CAAC,cAAc;IAOhB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YA0BhB,eAAe;YA0Bf,iBAAiB;YAoHjB,cAAc;CAiR7B"}
1
+ {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../../src/box/installer/installer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,kBAAkB,EAAgB,MAAM,UAAU,CAAA;AAqDhE,qBAAa,YAAY;IAIX,OAAO,CAAC,MAAM;IAH1B,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,UAAU,CAAa;gBAEX,MAAM,EAAE,kBAAkB;IAI9C,cAAc,IAAI,IAAI;IAatB,OAAO,CAAC,oBAAoB;IAyB5B,OAAO,CAAC,QAAQ;IA2BhB,OAAO,CAAC,aAAa;IAMrB,aAAa,IAAI,MAAM;IAIvB,OAAO,CAAC,cAAc;IAOhB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YA0BhB,eAAe;YA0Bf,iBAAiB;YAoHjB,cAAc;CAiR7B"}
@@ -1 +1 @@
1
- {"version":3,"file":"box.d.ts","sourceRoot":"","sources":["../../../src/box/src/box.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAgC1C,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAqHzE"}
1
+ {"version":3,"file":"box.d.ts","sourceRoot":"","sources":["../../../src/box/src/box.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AAgC1C,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAuHzE"}
@@ -4,6 +4,7 @@ export interface BoxOptions {
4
4
  appKey?: string;
5
5
  appSecret?: string;
6
6
  pluginVersion?: string;
7
+ openclawPath?: string;
7
8
  debug?: boolean;
8
9
  }
9
10
  export interface BoxInstallerConfig {
@@ -13,6 +14,7 @@ export interface BoxInstallerConfig {
13
14
  appKey: string;
14
15
  appSecret: string;
15
16
  pluginVersion?: string;
17
+ openclawPath?: string;
16
18
  }
17
19
  export interface InstallResult {
18
20
  success: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/box/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAElD,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,WAAW,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;CACb"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/box/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAElD,MAAM,WAAW,UAAU;IACzB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,WAAW,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;CACb"}
@@ -12,7 +12,6 @@ import fs from "node:fs/promises";
12
12
  import tar from "tar";
13
13
  import ora from "ora";
14
14
  import axios from "axios";
15
- import "node:os";
16
15
  let isDebug = false;
17
16
  function setDebug(debug) {
18
17
  isDebug = debug;
@@ -27,7 +26,8 @@ const ERROR_CODES$1 = {
27
26
  APP_SECRET_REQUIRED: "APP_SECRET_REQUIRED",
28
27
  NODE_VERSION_LOW: "NODE_VERSION_LOW",
29
28
  NPM_NOT_FOUND: "NPM_NOT_FOUND",
30
- NPM_INSTALL_FAILED: "NPM_INSTALL_FAILED"
29
+ NPM_INSTALL_FAILED: "NPM_INSTALL_FAILED",
30
+ INVALID_OPENCLAW_PATH: "INVALID_OPENCLAW_PATH"
31
31
  };
32
32
  let AppError$1 = class AppError extends Error {
33
33
  constructor(code, message) {
@@ -44,6 +44,7 @@ const CONFIG = {
44
44
  DIRS: {
45
45
  OPENCLAW: ".openclaw",
46
46
  EXTENSIONS: "extensions",
47
+ PLUGINS: "plugins",
47
48
  CONFIG_FILE: "openclaw.json",
48
49
  WORKSPACE: "workspace",
49
50
  TEMP: ".temp"
@@ -63,6 +64,7 @@ const TEST_CONFIG = {
63
64
  DIRS: {
64
65
  OPENCLAW: ".openclaw",
65
66
  EXTENSIONS: "extensions",
67
+ PLUGINS: "plugins",
66
68
  CONFIG_FILE: "openclaw.json",
67
69
  WORKSPACE: "workspace",
68
70
  TEMP: ".temp"
@@ -122,16 +124,43 @@ class BoxInstaller {
122
124
  }
123
125
  debugLog("[验证配置] 配置检查通过");
124
126
  }
127
+ validateOpenclawPath(openclawPath) {
128
+ debugLog(`[路径验证] 开始验证路径: ${openclawPath}`);
129
+ if (!path.isAbsolute(openclawPath)) {
130
+ debugLog("[路径验证] 失败: 不是绝对路径");
131
+ throw new AppError$1(
132
+ ERROR_CODES$1.INVALID_OPENCLAW_PATH,
133
+ `路径必须是绝对路径,当前输入: ${openclawPath}`
134
+ );
135
+ }
136
+ const invalidChars = /[<>:"|?*]/.test(openclawPath);
137
+ if (invalidChars) {
138
+ debugLog("[路径验证] 失败: 包含非法字符");
139
+ throw new AppError$1(
140
+ ERROR_CODES$1.INVALID_OPENCLAW_PATH,
141
+ '路径不能包含特殊字符: < > : " | ? *'
142
+ );
143
+ }
144
+ debugLog("[路径验证] 通过");
145
+ }
125
146
  getPaths() {
126
- const home = getHomeDir$1();
127
- const openclawDir = path.join(home, ".openclaw");
128
- const extensionsDir = path.join(openclawDir, "extensions");
129
- const targetDir = path.join(extensionsDir, "openclaw-workclaw");
130
- const configFile = path.join(openclawDir, "openclaw.json");
131
- const workspaceDir = path.join(openclawDir, "workspace");
132
- const tempDir = path.join(openclawDir, ".temp");
147
+ const config = getConfig(this.config.env);
148
+ let baseDir;
149
+ if (this.config.openclawPath) {
150
+ debugLog(`[路径验证] 验证自定义路径: ${this.config.openclawPath}`);
151
+ this.validateOpenclawPath(this.config.openclawPath);
152
+ baseDir = this.config.openclawPath;
153
+ } else {
154
+ const home = getHomeDir$1();
155
+ baseDir = path.join(home, config.DIRS.OPENCLAW);
156
+ }
157
+ const extensionsDir = path.join(baseDir, config.DIRS.EXTENSIONS);
158
+ const targetDir = path.join(extensionsDir, config.PLUGIN_NAME);
159
+ const configFile = path.join(baseDir, config.DIRS.CONFIG_FILE);
160
+ const workspaceDir = path.join(baseDir, config.DIRS.WORKSPACE);
161
+ const tempDir = path.join(baseDir, config.DIRS.TEMP);
133
162
  return {
134
- home,
163
+ home: baseDir,
135
164
  extensions: extensionsDir,
136
165
  target: targetDir,
137
166
  config: configFile,
@@ -629,12 +658,14 @@ async function createBoxCommand(options) {
629
658
  appKey = appKey || answers.appKey;
630
659
  appSecret = appSecret || answers.appSecret;
631
660
  }
632
- debugLog(`[盒子安装] 最终参数: env=${env}`);
661
+ debugLog(`[盒子安装] 最终参数: env=${env}, openclawPath=${options.openclawPath}`);
633
662
  debugLog("[盒子安装] 创建 BoxInstaller 实例...");
634
663
  const installer = new BoxInstaller({
635
664
  appKey,
636
665
  appSecret,
637
- env
666
+ env,
667
+ pluginVersion: options.pluginVersion,
668
+ openclawPath: options.openclawPath
638
669
  });
639
670
  debugLog("[盒子安装] 开始安装...");
640
671
  await installer.install();
@@ -669,7 +700,7 @@ async function createBoxCommand(options) {
669
700
  }
670
701
  }
671
702
  function registerCommands$1(program2) {
672
- program2.command("box").description("盒子设备安装(无需登录)").option("-e, --env <env>", "环境 (test/prod)").option("--app-key <appKey>", "App Key").option("--app-secret <appSecret>", "App Secret").option("--plugin-version <plugin-version>", "插件版本号(默认最新版)").option("--debug", "开启调试日志").action(createBoxCommand);
703
+ program2.command("box").description("盒子设备安装(无需登录)").option("-e, --env <env>", "环境 (test/prod)").option("--app-key <appKey>", "App Key").option("--app-secret <appSecret>", "App Secret").option("--plugin-version <plugin-version>", "插件版本号(默认最新版)").option("--openclaw-path <path>", "OpenClaw 安装目录路径(默认 ~/.openclaw)").option("--debug", "开启调试日志").action(createBoxCommand);
673
704
  }
674
705
  const ERROR_CODES = {
675
706
  PHONE_REQUIRED: "PHONE_REQUIRED",
@@ -682,7 +713,8 @@ const ERROR_CODES = {
682
713
  NPM_INSTALL_FAILED: "NPM_INSTALL_FAILED",
683
714
  CONFIG_WRITE_FAILED: "CONFIG_WRITE_FAILED",
684
715
  HTTP_ERROR: "HTTP_ERROR",
685
- NETWORK_ERROR: "NETWORK_ERROR"
716
+ NETWORK_ERROR: "NETWORK_ERROR",
717
+ INVALID_OPENCLAW_PATH: "INVALID_OPENCLAW_PATH"
686
718
  };
687
719
  class AppError2 extends Error {
688
720
  constructor(code, message) {
@@ -4749,20 +4781,47 @@ class LocalInstaller {
4749
4781
  }
4750
4782
  debugLog("[验证配置] 配置验证通过");
4751
4783
  }
4784
+ validateOpenclawPath(openclawPath) {
4785
+ debugLog(`[路径验证] 开始验证路径: ${openclawPath}`);
4786
+ if (!path.isAbsolute(openclawPath)) {
4787
+ debugLog("[路径验证] 失败: 不是绝对路径");
4788
+ throw new AppError2(
4789
+ ERROR_CODES.INVALID_OPENCLAW_PATH,
4790
+ `路径必须是绝对路径,当前输入: ${openclawPath}`
4791
+ );
4792
+ }
4793
+ const invalidChars = /[<>:"|?*]/.test(openclawPath);
4794
+ if (invalidChars) {
4795
+ debugLog("[路径验证] 失败: 包含非法字符");
4796
+ throw new AppError2(
4797
+ ERROR_CODES.INVALID_OPENCLAW_PATH,
4798
+ '路径不能包含特殊字符: < > : " | ? *'
4799
+ );
4800
+ }
4801
+ debugLog("[路径验证] 通过");
4802
+ }
4752
4803
  async install() {
4753
4804
  try {
4754
4805
  debugLog("[安装开始]");
4755
4806
  this.validateConfig();
4756
4807
  const env = this.config.env || "test";
4757
4808
  const config = getConfig(env);
4758
- const homeDir = getHomeDir();
4809
+ let baseDir;
4810
+ if (this.config.openclawPath) {
4811
+ debugLog(`[路径验证] 验证自定义路径: ${this.config.openclawPath}`);
4812
+ this.validateOpenclawPath(this.config.openclawPath);
4813
+ baseDir = this.config.openclawPath;
4814
+ } else {
4815
+ const homeDir = getHomeDir();
4816
+ baseDir = path.join(homeDir, config.DIRS.OPENCLAW);
4817
+ }
4759
4818
  const paths = {
4760
- home: path.join(homeDir, config.DIRS.OPENCLAW),
4761
- extensions: path.join(homeDir, config.DIRS.OPENCLAW, config.DIRS.EXTENSIONS),
4762
- target: path.join(homeDir, config.DIRS.OPENCLAW, config.DIRS.EXTENSIONS, config.PLUGIN_NAME),
4763
- config: path.join(homeDir, config.DIRS.OPENCLAW, config.DIRS.CONFIG_FILE),
4764
- workspace: path.join(homeDir, config.DIRS.OPENCLAW, config.DIRS.WORKSPACE),
4765
- temp: path.join(homeDir, config.DIRS.OPENCLAW, config.DIRS.TEMP)
4819
+ home: baseDir,
4820
+ extensions: path.join(baseDir, config.DIRS.EXTENSIONS),
4821
+ target: path.join(baseDir, config.DIRS.EXTENSIONS, config.PLUGIN_NAME),
4822
+ config: path.join(baseDir, config.DIRS.CONFIG_FILE),
4823
+ workspace: path.join(baseDir, config.DIRS.WORKSPACE),
4824
+ temp: path.join(baseDir, config.DIRS.TEMP)
4766
4825
  };
4767
4826
  debugLog(`[路径配置] home=${paths.home}`);
4768
4827
  debugLog(`[路径配置] extensions=${paths.extensions}`);
@@ -5136,31 +5195,14 @@ function checkEnv() {
5136
5195
  async function createLocalCommand(options) {
5137
5196
  setDebug(!!options.debug);
5138
5197
  debugLog("[初始化] 开始处理...");
5139
- debugLog(`[初始化] 参数: scenario=${options.scenario}, env=${options.env}, phone=${options.phone}, debug=${options.debug}`);
5198
+ debugLog(`[初始化] 参数: env=${options.env}, phone=${options.phone}, debug=${options.debug}`);
5140
5199
  checkEnv();
5141
5200
  debugLog("[初始化] 环境检查通过");
5142
5201
  try {
5143
- let scenario = options.scenario;
5144
5202
  let env = options.env;
5145
5203
  let phone = options.phone;
5146
5204
  let userPass = options.userPass;
5147
5205
  const questions = [];
5148
- if (!scenario) {
5149
- debugLog("[初始化] 需要选择安装场景");
5150
- questions.push({
5151
- type: "list",
5152
- name: "scenario",
5153
- message: chalk.cyan("请选择安装场景:"),
5154
- default: "windows-local",
5155
- choices: [
5156
- { name: `${chalk.green("Windows")} ${chalk.dim("本地安装")}`, value: "windows-local" },
5157
- { name: `${chalk.green("macOS")} ${chalk.dim("本地安装")}`, value: "mac-local" },
5158
- { name: `${chalk.green("Linux")} ${chalk.dim("本地安装")}`, value: "linux-local" }
5159
- ]
5160
- });
5161
- } else {
5162
- debugLog(`[初始化] 使用命令行参数: scenario=${scenario}`);
5163
- }
5164
5206
  if (!env) {
5165
5207
  debugLog("[初始化] 需要选择环境");
5166
5208
  questions.push({
@@ -5215,19 +5257,18 @@ async function createLocalCommand(options) {
5215
5257
  debugLog(`[初始化] 开始交互式问答,共 ${questions.length} 个问题`);
5216
5258
  const answers = await inquirer.prompt(questions);
5217
5259
  debugLog("[初始化] 交互式问答完成");
5218
- scenario = scenario || answers.scenario;
5219
5260
  env = env || answers.env || "test";
5220
5261
  phone = phone || answers.phone;
5221
5262
  userPass = userPass || answers.userPass;
5222
5263
  }
5223
- debugLog(`[初始化] 最终参数: scenario=${scenario}, env=${env}, phone=${phone}, pluginVersion=${options.pluginVersion}`);
5264
+ debugLog(`[初始化] 最终参数: env=${env}, phone=${phone}, pluginVersion=${options.pluginVersion}, openclawPath=${options.openclawPath}`);
5224
5265
  debugLog("[初始化] 创建 LocalInstaller 实例...");
5225
5266
  const installer = new LocalInstaller({
5226
5267
  phone,
5227
5268
  userPass,
5228
- scenario,
5229
5269
  env,
5230
- pluginVersion: options.pluginVersion
5270
+ pluginVersion: options.pluginVersion,
5271
+ openclawPath: options.openclawPath
5231
5272
  });
5232
5273
  debugLog("[初始化] 开始安装...");
5233
5274
  await installer.install();
@@ -5262,7 +5303,7 @@ async function createLocalCommand(options) {
5262
5303
  }
5263
5304
  }
5264
5305
  function registerCommands(program2) {
5265
- program2.command("local").description("本地账户安装(需要登录)").option("-s, --scenario <scenario>", "安装场景").option("-e, --env <env>", "环境 (test/prod)").option("--phone <phone>", "手机号码").option("--user-pass <userPass>", "用户密码").option("--plugin-version <plugin-version>", "插件版本号(默认最新版)").option("--debug", "开启调试日志").action(createLocalCommand);
5306
+ program2.command("local").description("本地账户安装(需要登录)").option("-e, --env <env>", "环境 (test/prod)").option("--phone <phone>", "手机号码").option("--user-pass <userPass>", "用户密码").option("--plugin-version <plugin-version>", "插件版本号(默认最新版)").option("--openclaw-path <path>", "OpenClaw 安装目录路径(默认 ~/.openclaw)").option("--debug", "开启调试日志").action(createLocalCommand);
5266
5307
  }
5267
5308
  const __filename$1 = fileURLToPath(import.meta.url);
5268
5309
  const __dirname$1 = dirname(__filename$1);
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
1
  #!/usr/bin/env node
2
- import("./index-CVmebGfl.js").then((cli) => {
2
+ import("./index-BZh3SXHn.js").then((cli) => {
3
3
  cli.default();
4
4
  });
@@ -13,6 +13,7 @@ export declare const ERROR_CODES: {
13
13
  readonly CONFIG_WRITE_FAILED: "CONFIG_WRITE_FAILED";
14
14
  readonly HTTP_ERROR: "HTTP_ERROR";
15
15
  readonly NETWORK_ERROR: "NETWORK_ERROR";
16
+ readonly INVALID_OPENCLAW_PATH: "INVALID_OPENCLAW_PATH";
16
17
  };
17
18
  export type ErrorCode = keyof typeof ERROR_CODES;
18
19
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/local/error/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;CAYd,CAAA;AAEV,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,WAAW,CAAA;AAEhD;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAYpD,CAAA;AAED;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;IAExB,IAAI,EAAE,SAAS;gBAAf,IAAI,EAAE,SAAS,EACtB,OAAO,EAAE,MAAM;CAKlB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAUlD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/local/error/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,WAAW;;;;;;;;;;;;;CAad,CAAA;AAEV,MAAM,MAAM,SAAS,GAAG,MAAM,OAAO,WAAW,CAAA;AAEhD;;GAEG;AACH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAapD,CAAA;AAED;;GAEG;AACH,qBAAa,QAAS,SAAQ,KAAK;IAExB,IAAI,EAAE,SAAS;gBAAf,IAAI,EAAE,SAAS,EACtB,OAAO,EAAE,MAAM;CAKlB;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAUlD"}
@@ -5,6 +5,7 @@ export declare class LocalInstaller {
5
5
  private prefixText;
6
6
  constructor(config: LocalInstallerConfig);
7
7
  validateConfig(): void;
8
+ private validateOpenclawPath;
8
9
  install(): Promise<void>;
9
10
  getPrefixText(): string;
10
11
  private getPackageName;
@@ -1 +1 @@
1
- {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../../src/local/installer/installer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA6B,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAuD/E,qBAAa,cAAc;IAIb,OAAO,CAAC,MAAM;IAH1B,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,UAAU,CAAa;gBAEX,MAAM,EAAE,oBAAoB;IAIhD,cAAc,IAAI,IAAI;IAYhB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAoC9B,aAAa,IAAI,MAAM;IAIvB,OAAO,CAAC,cAAc;YAOR,OAAO;YAoBP,kBAAkB;YAalB,eAAe;YAmBf,iBAAiB;YAmHjB,cAAc;CA+M7B"}
1
+ {"version":3,"file":"installer.d.ts","sourceRoot":"","sources":["../../../src/local/installer/installer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAA6B,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAuD/E,qBAAa,cAAc;IAIb,OAAO,CAAC,MAAM;IAH1B,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,UAAU,CAAa;gBAEX,MAAM,EAAE,oBAAoB;IAIhD,cAAc,IAAI,IAAI;IAYtB,OAAO,CAAC,oBAAoB;IAyBtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IA4C9B,aAAa,IAAI,MAAM;IAIvB,OAAO,CAAC,cAAc;YAOR,OAAO;YAoBP,kBAAkB;YAalB,eAAe;YAmBf,iBAAiB;YAmHjB,cAAc;CA+M7B"}
@@ -1 +1 @@
1
- {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../../src/local/src/local.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAgC5C,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA8I7E"}
1
+ {"version":3,"file":"local.d.ts","sourceRoot":"","sources":["../../../src/local/src/local.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAA;AAgC5C,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAuH7E"}
@@ -1,21 +1,20 @@
1
- import { Scenario } from '../utils';
2
1
  import { Environment } from '../../shared/config';
3
2
  export interface LocalOptions {
4
- scenario?: string;
5
3
  env?: string;
6
4
  phone?: string;
7
5
  userPass?: string;
8
6
  pluginVersion?: string;
7
+ openclawPath?: string;
9
8
  debug?: boolean;
10
9
  }
11
10
  export interface LocalInstallerConfig {
12
- scenario?: Scenario;
13
11
  env?: Environment;
14
12
  baseUrl?: string;
15
13
  wsUrl?: string;
16
14
  phone: string;
17
15
  userPass: string;
18
16
  pluginVersion?: string;
17
+ openclawPath?: string;
19
18
  }
20
19
  export interface BoundConfig {
21
20
  appKey: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/local/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAA;AACxC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAElD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,EAAE,QAAQ,CAAA;IACnB,GAAG,CAAC,EAAE,WAAW,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;CACb"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/local/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAElD,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB;AAED,MAAM,WAAW,oBAAoB;IACnC,GAAG,CAAC,EAAE,WAAW,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,eAAe,CAAC,EAAE,MAAM,CAAA;CACzB;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;CACb"}
@@ -1,4 +1,3 @@
1
1
  export { rsaEncrypt } from './crypto';
2
- export { detectOS, getHomeDir, getPathByScenario } from './path';
3
- export type { Scenario } from './path';
2
+ export { getHomeDir, getPathByScenario } from './path';
4
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/local/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA;AAChE,YAAY,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/local/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAA;AACrC,OAAO,EAAE,UAAU,EAAE,iBAAiB,EAAE,MAAM,QAAQ,CAAA"}
@@ -1,7 +1,6 @@
1
- export type Scenario = 'windows-local' | 'mac-local' | 'linux-local';
1
+ import { Environment } from '../../shared/config';
2
2
  export declare function getHomeDir(): string;
3
- export declare function detectOS(): Scenario;
4
- export declare function getPathByScenario(): {
3
+ export declare function getPathByScenario(env: Environment, openclawPath?: string): {
5
4
  configDir: string;
6
5
  configFile: string;
7
6
  pluginDir: string;
@@ -1 +1 @@
1
- {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../../src/local/utils/path.ts"],"names":[],"mappings":"AAIA,MAAM,MAAM,QAAQ,GAAG,eAAe,GAAG,WAAW,GAAG,aAAa,CAAA;AAEpE,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,QAAQ,IAAI,QAAQ,CAanC;AAED,wBAAgB,iBAAiB,IAAI;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAShG"}
1
+ {"version":3,"file":"path.d.ts","sourceRoot":"","sources":["../../../src/local/utils/path.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAGlD,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,WAAW,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAevI"}
@@ -18,6 +18,7 @@ export interface ConfigInterface {
18
18
  DIRS: {
19
19
  OPENCLAW: string;
20
20
  EXTENSIONS: string;
21
+ PLUGINS: string;
21
22
  CONFIG_FILE: string;
22
23
  WORKSPACE: string;
23
24
  TEMP: string;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/config/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,CAAA;AAEzC;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW;IACX,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe;IACf,gBAAgB,EAAE,MAAM,CAAA;IACxB,oBAAoB;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe;IACf,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW;IACX,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAA;QAChB,UAAU,EAAE,MAAM,CAAA;QAClB,WAAW,EAAE,MAAM,CAAA;QACnB,SAAS,EAAE,MAAM,CAAA;QACjB,IAAI,EAAE,MAAM,CAAA;KACb,CAAA;IACD,WAAW;IACX,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,aAAa;IACb,GAAG,EAAE;QACH,cAAc,EAAE,MAAM,CAAA;QACtB,QAAQ,EAAE,MAAM,CAAA;QAChB,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;CACF;AAED;;;GAGG;AACH,eAAO,MAAM,MAAM,EAAE,eAkBpB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,eAkBzB,CAAA;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,WAAW,GAAG,eAAe,CAE3D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/shared/config/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,MAAM,CAAA;AAEzC;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW;IACX,WAAW,EAAE,MAAM,CAAA;IACnB,eAAe;IACf,gBAAgB,EAAE,MAAM,CAAA;IACxB,oBAAoB;IACpB,cAAc,EAAE,MAAM,CAAA;IACtB,eAAe;IACf,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW;IACX,IAAI,EAAE;QACJ,QAAQ,EAAE,MAAM,CAAA;QAChB,UAAU,EAAE,MAAM,CAAA;QAClB,OAAO,EAAE,MAAM,CAAA;QACf,WAAW,EAAE,MAAM,CAAA;QACnB,SAAS,EAAE,MAAM,CAAA;QACjB,IAAI,EAAE,MAAM,CAAA;KACb,CAAA;IACD,WAAW;IACX,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,aAAa;IACb,GAAG,EAAE;QACH,cAAc,EAAE,MAAM,CAAA;QACtB,QAAQ,EAAE,MAAM,CAAA;QAChB,OAAO,EAAE,MAAM,CAAA;KAChB,CAAA;CACF;AAED;;;GAGG;AACH,eAAO,MAAM,MAAM,EAAE,eAmBpB,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,EAAE,eAmBzB,CAAA;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,GAAG,EAAE,WAAW,GAAG,eAAe,CAE3D"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@workclaw/cli",
3
3
  "type": "module",
4
- "version": "1.0.312",
4
+ "version": "1.0.313",
5
5
  "description": "WorkClaw CLI 工具 - 用于初始化和配置 WorkClaw 插件",
6
6
  "license": "MIT",
7
7
  "keywords": [