@aiyiran/myclaw 1.0.7 → 1.0.9
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/index.js +4 -0
- package/package.json +1 -1
- package/wsl2.js +70 -132
package/index.js
CHANGED
|
@@ -25,7 +25,9 @@
|
|
|
25
25
|
|
|
26
26
|
const { execSync } = require('child_process');
|
|
27
27
|
const os = require('os');
|
|
28
|
+
const path = require('path');
|
|
28
29
|
const { createAgent } = require('./create_agent');
|
|
30
|
+
const { version } = require(path.join(__dirname, 'package.json'));
|
|
29
31
|
|
|
30
32
|
const args = process.argv.slice(2);
|
|
31
33
|
const command = args[0];
|
|
@@ -276,6 +278,8 @@ function showHelp() {
|
|
|
276
278
|
// 主逻辑
|
|
277
279
|
// ============================================================================
|
|
278
280
|
|
|
281
|
+
console.log(colors.blue + 'MyClaw v' + version + colors.nc);
|
|
282
|
+
|
|
279
283
|
if (!command || command === 'help' || command === '--help' || command === '-h') {
|
|
280
284
|
showHelp();
|
|
281
285
|
} else if (command === 'install') {
|
package/package.json
CHANGED
package/wsl2.js
CHANGED
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* ============================================================================
|
|
5
|
-
* MyClaw WSL2 一键安装器
|
|
5
|
+
* MyClaw WSL2 一键安装器
|
|
6
6
|
* ============================================================================
|
|
7
7
|
*
|
|
8
8
|
* 使用方式: myclaw wsl2
|
|
9
9
|
*
|
|
10
10
|
* 自动检测当前 WSL2 安装状态,分两个阶段完成安装:
|
|
11
|
-
* Phase 1: 启用底层 Windows 功能 +
|
|
12
|
-
* Phase 2:
|
|
11
|
+
* Phase 1: 启用底层 Windows 功能 + 安装 WSL 完整包 → 需要重启
|
|
12
|
+
* Phase 2: 导入预制 Linux 环境(tar 包) → 完成
|
|
13
13
|
*
|
|
14
14
|
* 用户只需反复运行 myclaw wsl2,脚本会自动接续上次的进度。
|
|
15
15
|
* ============================================================================
|
|
@@ -19,23 +19,17 @@ const { execSync } = require('child_process');
|
|
|
19
19
|
const os = require('os');
|
|
20
20
|
|
|
21
21
|
// ============================================================================
|
|
22
|
-
// 配置
|
|
22
|
+
// 配置 - 所有下载地址集中在这里,方便统一替换
|
|
23
23
|
// ============================================================================
|
|
24
24
|
|
|
25
|
-
// 下载源(可替换为你自己的 CDN 地址加速国内下载)
|
|
26
25
|
const WSL_CDN = {
|
|
27
|
-
|
|
26
|
+
// ★ 新版 WSL 完整安装包(243MB,含内核,替代老的 wsl_update_x64.msi 和 wsl --update)
|
|
27
|
+
wsl: 'https://cdn.yiranlaoshi.com/software/myclaw/wsl.2.7.1.0.x64.msi',
|
|
28
28
|
// ★ 预制 rootfs tar 包(内含 Node.js + OpenClaw,用户开箱即用)
|
|
29
29
|
// TODO: 替换为你自己的 CDN 地址,制作方法见 README
|
|
30
30
|
rootfs: 'https://openclaw.ai/wsl/openclaw-rootfs.tar',
|
|
31
|
-
// 降级备选:微软官方 Ubuntu Appx 包
|
|
32
|
-
ubuntu: 'https://aka.ms/wslubuntu2204',
|
|
33
31
|
};
|
|
34
32
|
|
|
35
|
-
// ★ 是否启用降级方案(方法 B: wsl --install / 方法 C: Appx 离线包)
|
|
36
|
-
// 如果你的 CDN 稳定可靠,设为 false 只用方法 A(tar 导入)
|
|
37
|
-
const ENABLE_FALLBACK = false;
|
|
38
|
-
|
|
39
33
|
const isWindows = os.platform() === 'win32';
|
|
40
34
|
|
|
41
35
|
// 颜色(Windows 下禁用避免乱码)
|
|
@@ -92,16 +86,16 @@ function detectState() {
|
|
|
92
86
|
}
|
|
93
87
|
|
|
94
88
|
// ============================================================================
|
|
95
|
-
// Phase 1:
|
|
89
|
+
// Phase 1: 启用功能 + 安装 WSL 完整包
|
|
96
90
|
// ============================================================================
|
|
97
91
|
|
|
98
92
|
function runPhase1() {
|
|
99
93
|
console.log('');
|
|
100
94
|
console.log('[当前进度] WSL 功能 ' + C.r + '[未启用]' + C.nc);
|
|
101
|
-
console.log('
|
|
102
|
-
console.log('
|
|
95
|
+
console.log(' WSL 组件 ' + C.r + '[未安装]' + C.nc);
|
|
96
|
+
console.log(' Linux ' + C.r + '[未安装]' + C.nc);
|
|
103
97
|
console.log('');
|
|
104
|
-
console.log('本次执行 阶段 1/2: 启用底层功能 +
|
|
98
|
+
console.log('本次执行 阶段 1/2: 启用底层功能 + 安装 WSL 完整包');
|
|
105
99
|
console.log(' 完成后需要 ' + C.y + '重启电脑' + C.nc);
|
|
106
100
|
console.log(' 重启后再运行 ' + C.y + 'myclaw wsl2' + C.nc + ' 自动进入阶段 2');
|
|
107
101
|
console.log('');
|
|
@@ -114,10 +108,13 @@ $Host.UI.RawUI.WindowTitle = 'MyClaw WSL2 Installer - Phase 1'
|
|
|
114
108
|
Write-Host ''
|
|
115
109
|
Write-Host '========================================'
|
|
116
110
|
Write-Host ' MyClaw WSL2 安装 - 阶段 1/2'
|
|
117
|
-
Write-Host ' 启用底层功能 +
|
|
111
|
+
Write-Host ' 启用底层功能 + 安装 WSL 完整包'
|
|
118
112
|
Write-Host '========================================'
|
|
119
113
|
Write-Host ''
|
|
120
114
|
|
|
115
|
+
$dir = "$env:LOCALAPPDATA\\myclaw"
|
|
116
|
+
New-Item -ItemType Directory -Force -Path $dir | Out-Null
|
|
117
|
+
|
|
121
118
|
Write-Host '[1/4] 启用 Windows Subsystem for Linux...'
|
|
122
119
|
try {
|
|
123
120
|
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart | Out-Null
|
|
@@ -136,29 +133,33 @@ try {
|
|
|
136
133
|
}
|
|
137
134
|
Write-Host ''
|
|
138
135
|
|
|
139
|
-
Write-Host '[3/4]
|
|
140
|
-
$
|
|
141
|
-
|
|
142
|
-
New-Item -ItemType Directory -Force -Path $dir | Out-Null
|
|
143
|
-
try {
|
|
144
|
-
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
|
145
|
-
Invoke-WebRequest -Uri '${WSL_CDN.kernel}' -OutFile $msi -UseBasicParsing
|
|
146
|
-
Write-Host ' [OK] 已缓存'
|
|
147
|
-
} catch {
|
|
148
|
-
Write-Host ' [跳过] 下载失败, 重启后将重试'
|
|
149
|
-
}
|
|
150
|
-
Write-Host ''
|
|
151
|
-
|
|
152
|
-
Write-Host '[4/4] 尝试提前安装内核更新...'
|
|
153
|
-
if (Test-Path $msi) {
|
|
136
|
+
Write-Host '[3/4] 下载 WSL 完整安装包 (约 243MB)...'
|
|
137
|
+
$msi = "$dir\\wsl_full.msi"
|
|
138
|
+
if (-Not (Test-Path $msi)) {
|
|
154
139
|
try {
|
|
155
|
-
|
|
156
|
-
|
|
140
|
+
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
|
141
|
+
Invoke-WebRequest -Uri '${WSL_CDN.wsl}' -OutFile $msi -UseBasicParsing
|
|
142
|
+
Write-Host ' [OK] 下载完成'
|
|
157
143
|
} catch {
|
|
158
|
-
Write-Host ' [
|
|
144
|
+
Write-Host ' [失败] 下载失败,请检查网络后重试 myclaw wsl2'
|
|
145
|
+
Write-Host ''; Write-Host '按任意键关闭...'
|
|
146
|
+
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
|
|
147
|
+
exit 1
|
|
159
148
|
}
|
|
160
149
|
} else {
|
|
161
|
-
Write-Host '
|
|
150
|
+
Write-Host ' 使用上次缓存的文件'
|
|
151
|
+
}
|
|
152
|
+
Write-Host ''
|
|
153
|
+
|
|
154
|
+
Write-Host '[4/4] 安装 WSL 完整包...'
|
|
155
|
+
try {
|
|
156
|
+
Start-Process msiexec.exe -ArgumentList "/i \`"$msi\`" /quiet /norestart" -Wait -NoNewWindow
|
|
157
|
+
Write-Host ' [OK] 安装成功!'
|
|
158
|
+
} catch {
|
|
159
|
+
Write-Host ' [失败] 安装出错'
|
|
160
|
+
Write-Host ''; Write-Host '按任意键关闭...'
|
|
161
|
+
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
|
|
162
|
+
exit 1
|
|
162
163
|
}
|
|
163
164
|
|
|
164
165
|
Write-Host ''
|
|
@@ -184,15 +185,16 @@ $null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
|
|
|
184
185
|
}
|
|
185
186
|
|
|
186
187
|
// ============================================================================
|
|
187
|
-
// Phase 2:
|
|
188
|
+
// Phase 2: 导入预制 Linux 环境
|
|
188
189
|
// ============================================================================
|
|
189
190
|
|
|
190
191
|
function runPhase2() {
|
|
191
192
|
console.log('');
|
|
192
|
-
console.log('[当前进度] WSL
|
|
193
|
-
console.log('
|
|
193
|
+
console.log('[当前进度] WSL 功能 ' + C.g + '[OK]' + C.nc);
|
|
194
|
+
console.log(' WSL 组件 ' + C.g + '[OK]' + C.nc);
|
|
195
|
+
console.log(' Linux ' + C.y + '[待安装]' + C.nc);
|
|
194
196
|
console.log('');
|
|
195
|
-
console.log('
|
|
197
|
+
console.log('即将导入预制 Linux 环境(需要管理员权限)...');
|
|
196
198
|
console.log('[' + C.y + '注意' + C.nc + '] 请在 UAC 弹窗中点击【是】');
|
|
197
199
|
console.log('');
|
|
198
200
|
|
|
@@ -202,120 +204,56 @@ $Host.UI.RawUI.WindowTitle = 'MyClaw WSL2 Installer - Phase 2'
|
|
|
202
204
|
Write-Host ''
|
|
203
205
|
Write-Host '========================================'
|
|
204
206
|
Write-Host ' MyClaw WSL2 安装 - 阶段 2/2'
|
|
205
|
-
Write-Host '
|
|
207
|
+
Write-Host ' 导入预制 Linux 环境'
|
|
206
208
|
Write-Host '========================================'
|
|
207
209
|
Write-Host ''
|
|
208
210
|
|
|
209
|
-
Write-Host '[1/5] 设置 WSL2 为默认版本...'
|
|
210
|
-
try { wsl --set-default-version 2 2>$null } catch {}
|
|
211
|
-
Write-Host ' [OK]'
|
|
212
|
-
Write-Host ''
|
|
213
|
-
|
|
214
|
-
Write-Host '[2/5] 安装 WSL2 内核更新包...'
|
|
215
211
|
$dir = "$env:LOCALAPPDATA\\myclaw"
|
|
216
|
-
$msi = "$dir\\wsl_update_x64.msi"
|
|
217
212
|
New-Item -ItemType Directory -Force -Path $dir | Out-Null
|
|
218
213
|
|
|
219
|
-
|
|
220
|
-
Write-Host ' 正在从微软服务器下载...'
|
|
221
|
-
try {
|
|
222
|
-
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
|
223
|
-
Invoke-WebRequest -Uri '${WSL_CDN.kernel}' -OutFile $msi -UseBasicParsing
|
|
224
|
-
Write-Host ' 下载完成!'
|
|
225
|
-
} catch {
|
|
226
|
-
Write-Host ' [失败] 下载失败,请检查网络'
|
|
227
|
-
Write-Host ' 手动下载: https://aka.ms/wsl2kernel'
|
|
228
|
-
Write-Host ''; Write-Host '按任意键退出...'
|
|
229
|
-
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
|
|
230
|
-
exit 1
|
|
231
|
-
}
|
|
232
|
-
} else {
|
|
233
|
-
Write-Host ' 使用上次预下载的缓存文件'
|
|
234
|
-
}
|
|
235
|
-
try {
|
|
236
|
-
Start-Process msiexec.exe -ArgumentList "/i \`"$msi\`" /quiet /norestart" -Wait -NoNewWindow
|
|
237
|
-
Write-Host ' [OK] 内核更新安装成功!'
|
|
238
|
-
} catch {
|
|
239
|
-
Write-Host ' 可能已安装,继续...'
|
|
240
|
-
}
|
|
241
|
-
Write-Host ''
|
|
242
|
-
|
|
243
|
-
Write-Host '[3/5] 确认 WSL2 为默认版本...'
|
|
214
|
+
Write-Host '[1/3] 设置 WSL2 为默认版本...'
|
|
244
215
|
try { wsl --set-default-version 2 2>$null } catch {}
|
|
245
216
|
Write-Host ' [OK]'
|
|
246
217
|
Write-Host ''
|
|
247
218
|
|
|
248
|
-
Write-Host '[
|
|
249
|
-
$
|
|
219
|
+
Write-Host '[2/3] 下载并导入预制 Linux 环境...'
|
|
220
|
+
$tarPath = "$dir\\openclaw-rootfs.tar"
|
|
250
221
|
$distroName = 'OpenClaw'
|
|
251
222
|
$installDir = "$dir\\OpenClaw"
|
|
223
|
+
$installed = $false
|
|
252
224
|
|
|
253
|
-
# ---- 方法 A (最强): 预制 rootfs tar 包,wsl --import ----
|
|
254
|
-
Write-Host ' 方法 A: 导入 OpenClaw 预制 Linux 环境...'
|
|
255
|
-
$tarPath = "$dir\\openclaw-rootfs.tar"
|
|
256
225
|
if (-Not (Test-Path $tarPath)) {
|
|
257
226
|
Write-Host ' 正在下载预制环境包...'
|
|
258
227
|
try {
|
|
259
228
|
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
|
260
|
-
Invoke-WebRequest -Uri '
|
|
229
|
+
Invoke-WebRequest -Uri '${WSL_CDN.rootfs}' -OutFile $tarPath -UseBasicParsing
|
|
261
230
|
Write-Host ' 下载完成!'
|
|
262
231
|
} catch {
|
|
263
|
-
Write-Host '
|
|
232
|
+
Write-Host ' [失败] 下载失败,请检查网络后重试 myclaw wsl2'
|
|
233
|
+
Write-Host ''; Write-Host '按任意键关闭...'
|
|
234
|
+
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
|
|
235
|
+
exit 1
|
|
264
236
|
}
|
|
265
|
-
}
|
|
266
|
-
|
|
267
|
-
try {
|
|
268
|
-
New-Item -ItemType Directory -Force -Path $installDir | Out-Null
|
|
269
|
-
wsl --import $distroName $installDir $tarPath 2>$null
|
|
270
|
-
if ($LASTEXITCODE -eq 0) {
|
|
271
|
-
$installed = $true
|
|
272
|
-
Write-Host ' [OK] 方法 A 成功! (预制环境已导入)'
|
|
273
|
-
}
|
|
274
|
-
} catch {}
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
# ---- 方法 B / C (降级备选,由 ENABLE_FALLBACK 控制) ----
|
|
278
|
-
` + (ENABLE_FALLBACK ? `
|
|
279
|
-
if (-Not $installed) {
|
|
280
|
-
Write-Host ' 方法 B: wsl --install ...'
|
|
281
|
-
try {
|
|
282
|
-
$output = wsl --install -d Ubuntu --no-launch 2>&1
|
|
283
|
-
if ($LASTEXITCODE -eq 0) {
|
|
284
|
-
$installed = $true
|
|
285
|
-
Write-Host ' [OK] 方法 B 成功!'
|
|
286
|
-
}
|
|
287
|
-
} catch {}
|
|
237
|
+
} else {
|
|
238
|
+
Write-Host ' 使用上次缓存的文件'
|
|
288
239
|
}
|
|
289
240
|
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
$
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
Write-Host ' [失败] 下载失败'
|
|
300
|
-
}
|
|
301
|
-
}
|
|
302
|
-
if (Test-Path $appx) {
|
|
303
|
-
try {
|
|
304
|
-
Add-AppxPackage -Path $appx
|
|
305
|
-
$installed = $true
|
|
306
|
-
Write-Host ' [OK] 方法 C 成功!'
|
|
307
|
-
} catch {}
|
|
241
|
+
Write-Host ' 正在导入 (可能需要几分钟)...'
|
|
242
|
+
try {
|
|
243
|
+
New-Item -ItemType Directory -Force -Path $installDir | Out-Null
|
|
244
|
+
wsl --import $distroName $installDir $tarPath 2>$null
|
|
245
|
+
if ($LASTEXITCODE -eq 0) {
|
|
246
|
+
$installed = $true
|
|
247
|
+
Write-Host ' [OK] 导入成功!'
|
|
248
|
+
} else {
|
|
249
|
+
Write-Host ' [失败] 导入失败'
|
|
308
250
|
}
|
|
251
|
+
} catch {
|
|
252
|
+
Write-Host ' [失败] 导入失败'
|
|
309
253
|
}
|
|
310
|
-
` : `
|
|
311
|
-
if (-Not $installed) {
|
|
312
|
-
Write-Host ' [失败] 预制环境包安装失败'
|
|
313
|
-
Write-Host ' 请检查网络后重试: myclaw wsl2'
|
|
314
|
-
}
|
|
315
|
-
`) + `
|
|
316
254
|
Write-Host ''
|
|
317
255
|
|
|
318
|
-
Write-Host '[
|
|
256
|
+
Write-Host '[3/3] 验证安装结果...'
|
|
319
257
|
try {
|
|
320
258
|
$result = wsl -l -v 2>&1 | Out-String
|
|
321
259
|
Write-Host $result
|
|
@@ -326,13 +264,13 @@ try {
|
|
|
326
264
|
Write-Host ''
|
|
327
265
|
Write-Host '========================================'
|
|
328
266
|
if ($installed) {
|
|
329
|
-
Write-Host ' [OK] WSL2 + Linux
|
|
267
|
+
Write-Host ' [OK] WSL2 + OpenClaw Linux 安装完成!'
|
|
330
268
|
Write-Host ''
|
|
331
269
|
Write-Host ' 输入 wsl 即可进入 Linux 环境'
|
|
332
|
-
Write-Host '
|
|
270
|
+
Write-Host ' OpenClaw 已预装就绪'
|
|
333
271
|
} else {
|
|
334
|
-
Write-Host ' [
|
|
335
|
-
Write-Host '
|
|
272
|
+
Write-Host ' [失败] 导入未成功,请检查网络后重试'
|
|
273
|
+
Write-Host ' 运行: myclaw wsl2'
|
|
336
274
|
}
|
|
337
275
|
Write-Host '========================================'
|
|
338
276
|
Write-Host ''
|