@aiyiran/myclaw 1.0.154 → 1.0.156

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 (3) hide show
  1. package/index.js +1 -1
  2. package/package.json +3 -7
  3. package/wsl2.js +107 -1
package/index.js CHANGED
@@ -1126,7 +1126,7 @@ function showHelp() {
1126
1126
  console.log(' up 升级 + 刷新桌面快捷方式 (= update + bat)');
1127
1127
  console.log(' open 打开浏览器控制台(自动带 token)');
1128
1128
  console.log(' fix 兜底修复(自动补装 WSL + Chrome,仅限 Windows)');
1129
- console.log(' wsl2 WSL2 一键安装/修复 (仅限 Windows)');
1129
+ console.log(' wsl2 WSL2 一键安装/修复 (仅限 Windows, 可选: --cli)');
1130
1130
  console.log(' bat 在桌面生成一键启动脚本 (仅限 Windows)');
1131
1131
  console.log(' list 查看注入资源管理列表(智能体/技能/配置)');
1132
1132
  console.log(' pull 从 ~/.openclaw 拉取最新资源到源目录(开发用)');
package/package.json CHANGED
@@ -1,22 +1,18 @@
1
1
  {
2
2
  "name": "@aiyiran/myclaw",
3
- "version": "1.0.154",
3
+ "version": "1.0.156",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "bin": {
7
- "myclaw": "index.js",
8
- "mc": "index.js"
7
+ "mc": "index.js",
8
+ "myclaw": "index.js"
9
9
  },
10
10
  "scripts": {
11
11
  "test": "echo \"Error: no test specified\" && exit 1"
12
12
  },
13
- "keywords": [],
14
13
  "author": "",
15
14
  "license": "ISC",
16
15
  "dependencies": {
17
16
  "chalk": "^4.1.2"
18
- },
19
- "engines": {
20
- "node": ">=16"
21
17
  }
22
18
  }
package/wsl2.js CHANGED
@@ -36,6 +36,8 @@ const C = isWindows
36
36
  const STATE_FILE = path.join(os.homedir(), '.myclaw_wsl_state');
37
37
  const MARKER_PATH_PS = STATE_FILE.replace(/\\/g, '\\\\');
38
38
 
39
+ const CONFIG_FILE = path.join(os.homedir(), '.myclaw_config');
40
+
39
41
  const WORK_DIR = path.join(os.homedir(), '.myclaw_tmp');
40
42
  try { fs.mkdirSync(WORK_DIR, { recursive: true }); } catch {}
41
43
  const WORK_DIR_PS = WORK_DIR.replace(/\\/g, '\\\\');
@@ -55,6 +57,22 @@ function setState(state) {
55
57
  fs.writeFileSync(STATE_FILE, state, 'utf8');
56
58
  }
57
59
 
60
+ function getConfig() {
61
+ try {
62
+ if (fs.existsSync(CONFIG_FILE)) {
63
+ const content = fs.readFileSync(CONFIG_FILE, 'utf8');
64
+ return JSON.parse(content);
65
+ }
66
+ } catch {}
67
+ return {};
68
+ }
69
+
70
+ function setConfig(key, value) {
71
+ const config = getConfig();
72
+ config[key] = value;
73
+ fs.writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), 'utf8');
74
+ }
75
+
58
76
  function launchElevatedPS(script) {
59
77
  const tmpDir = process.env.LOCALAPPDATA
60
78
  ? path.join(process.env.LOCALAPPDATA, 'myclaw')
@@ -80,7 +98,8 @@ function launchElevatedPS(script) {
80
98
  }
81
99
 
82
100
  function makeAskLocalOrCDN(prompt, destVar, cdnUrl, desc, fileName) {
83
- const callerDir = process.cwd().replace(/\\/g, '\\\\');
101
+ const config = getConfig();
102
+ const callerDir = (config.installerDir || process.env.MYCLAW_INSTALLER_DIR || process.cwd()).replace(/\\/g, '\\\\');
84
103
  const cdnFilename = cdnUrl.split('/').pop();
85
104
  return `
86
105
  $callerDir = "${callerDir}"
@@ -436,6 +455,87 @@ if ($installed) {
436
455
  }
437
456
  }
438
457
 
458
+ // ============================================================================
459
+ // ============================================================================
460
+ // CLI 模式
461
+ // ============================================================================
462
+
463
+ function runCliMode() {
464
+ const readline = require('readline');
465
+ const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
466
+
467
+ const question = (prompt) => new Promise(resolve => rl.question(prompt, resolve));
468
+
469
+ async function showMenu() {
470
+ console.log('');
471
+ console.log('========================================');
472
+ console.log(' MyClaw WSL2 CLI 控制面板');
473
+ console.log('========================================');
474
+ console.log('');
475
+
476
+ const config = getConfig();
477
+ const currentPath = config.installerDir || '(未设置)';
478
+
479
+ console.log('当前安装包路径: ' + C.y + currentPath + C.nc);
480
+ console.log('');
481
+ console.log('请选择操作:');
482
+ console.log(' 1. 重新安装 Phase 1 (启用功能 + 下载)');
483
+ console.log(' 2. 重新安装 Phase 2 (导入 Linux 环境)');
484
+ console.log(' 3. 重新设置安装包路径');
485
+ console.log(' 0. 退出');
486
+ console.log('');
487
+
488
+ const choice = await question('请输入选项 (0-3): ');
489
+
490
+ switch (choice.trim()) {
491
+ case '1':
492
+ console.log('');
493
+ console.log('[' + C.y + '执行' + C.nc + '] 开始 Phase 1 安装...');
494
+ setState('needs-features');
495
+ rl.close();
496
+ runPhase1();
497
+ break;
498
+
499
+ case '2':
500
+ console.log('');
501
+ console.log('[' + C.y + '执行' + C.nc + '] 开始 Phase 2 安装...');
502
+ setState('phase1-done');
503
+ rl.close();
504
+ runPhase2();
505
+ break;
506
+
507
+ case '3':
508
+ console.log('');
509
+ const newPath = await question('请输入安装包存放路径: ');
510
+ if (newPath.trim()) {
511
+ setConfig('installerDir', newPath.trim());
512
+ console.log('');
513
+ console.log('[' + C.g + 'OK' + C.nc + '] 路径已保存: ' + C.y + newPath.trim() + C.nc);
514
+ console.log('');
515
+ console.log('再次运行 ' + C.y + 'myclaw wsl2' + C.nc + ' 时将使用此路径。');
516
+ } else {
517
+ console.log('[' + C.r + '取消' + C.nc + '] 路径为空,未保存。');
518
+ }
519
+ rl.close();
520
+ break;
521
+
522
+ case '0':
523
+ console.log('');
524
+ console.log('已退出。');
525
+ rl.close();
526
+ break;
527
+
528
+ default:
529
+ console.log('');
530
+ console.log('[' + C.r + '错误' + C.nc + '] 无效选项,请重试。');
531
+ await showMenu();
532
+ break;
533
+ }
534
+ }
535
+
536
+ showMenu();
537
+ }
538
+
439
539
  // ============================================================================
440
540
  // 主入口
441
541
  // ============================================================================
@@ -446,6 +546,12 @@ function run() {
446
546
  process.exit(0);
447
547
  }
448
548
 
549
+ // CLI 模式
550
+ if (process.argv.includes('--cli')) {
551
+ runCliMode();
552
+ return;
553
+ }
554
+
449
555
  // 隐藏的高级玩家后门
450
556
  if (process.argv.includes('--force-phase1')) {
451
557
  setState('needs-features');