@aiyiran/myclaw 1.0.8 → 1.0.11
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/package.json +1 -1
- package/wsl2.js +80 -130
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,45 @@ try {
|
|
|
136
133
|
}
|
|
137
134
|
Write-Host ''
|
|
138
135
|
|
|
139
|
-
Write-Host '[3/4]
|
|
140
|
-
$
|
|
141
|
-
$msi = "$dir\\wsl_update_x64.msi"
|
|
142
|
-
New-Item -ItemType Directory -Force -Path $dir | Out-Null
|
|
136
|
+
Write-Host '[3/4] 检查并安装 WSL 完整包...'
|
|
137
|
+
$wslInstalled = $false
|
|
143
138
|
try {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
} catch {
|
|
148
|
-
Write-Host ' [跳过] 下载失败, 重启后将重试'
|
|
149
|
-
}
|
|
150
|
-
Write-Host ''
|
|
139
|
+
$ver = wsl --version 2>&1 | Out-String
|
|
140
|
+
if ($ver -match 'WSL') { $wslInstalled = $true }
|
|
141
|
+
} catch {}
|
|
151
142
|
|
|
152
|
-
|
|
153
|
-
|
|
143
|
+
if ($wslInstalled) {
|
|
144
|
+
Write-Host ' WSL 组件已安装,跳过下载 (节省 243MB)'
|
|
145
|
+
Write-Host ' [OK]'
|
|
146
|
+
} else {
|
|
147
|
+
Write-Host ' WSL 未安装,正在下载完整安装包 (约 243MB)...'
|
|
148
|
+
$msi = "$dir\\wsl_full.msi"
|
|
149
|
+
if (-Not (Test-Path $msi)) {
|
|
150
|
+
try {
|
|
151
|
+
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
|
152
|
+
Invoke-WebRequest -Uri '${WSL_CDN.wsl}' -OutFile $msi -UseBasicParsing
|
|
153
|
+
Write-Host ' 下载完成!'
|
|
154
|
+
} catch {
|
|
155
|
+
Write-Host ' [失败] 下载失败,请检查网络后重试 myclaw wsl2'
|
|
156
|
+
Write-Host ''; Write-Host '按任意键关闭...'
|
|
157
|
+
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
|
|
158
|
+
exit 1
|
|
159
|
+
}
|
|
160
|
+
} else {
|
|
161
|
+
Write-Host ' 使用上次缓存的文件'
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
Write-Host ''
|
|
165
|
+
Write-Host '[4/4] 安装 WSL 完整包...'
|
|
154
166
|
try {
|
|
155
167
|
Start-Process msiexec.exe -ArgumentList "/i \`"$msi\`" /quiet /norestart" -Wait -NoNewWindow
|
|
156
|
-
Write-Host ' [OK]'
|
|
168
|
+
Write-Host ' [OK] 安装成功!'
|
|
157
169
|
} catch {
|
|
158
|
-
Write-Host ' [
|
|
170
|
+
Write-Host ' [失败] 安装出错'
|
|
171
|
+
Write-Host ''; Write-Host '按任意键关闭...'
|
|
172
|
+
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
|
|
173
|
+
exit 1
|
|
159
174
|
}
|
|
160
|
-
} else {
|
|
161
|
-
Write-Host ' [跳过] 文件未就绪'
|
|
162
175
|
}
|
|
163
176
|
|
|
164
177
|
Write-Host ''
|
|
@@ -184,15 +197,16 @@ $null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
|
|
|
184
197
|
}
|
|
185
198
|
|
|
186
199
|
// ============================================================================
|
|
187
|
-
// Phase 2:
|
|
200
|
+
// Phase 2: 导入预制 Linux 环境
|
|
188
201
|
// ============================================================================
|
|
189
202
|
|
|
190
203
|
function runPhase2() {
|
|
191
204
|
console.log('');
|
|
192
|
-
console.log('[当前进度] WSL
|
|
193
|
-
console.log('
|
|
205
|
+
console.log('[当前进度] WSL 功能 ' + C.g + '[OK]' + C.nc);
|
|
206
|
+
console.log(' WSL 组件 ' + C.g + '[OK]' + C.nc);
|
|
207
|
+
console.log(' Linux ' + C.y + '[待安装]' + C.nc);
|
|
194
208
|
console.log('');
|
|
195
|
-
console.log('
|
|
209
|
+
console.log('即将导入预制 Linux 环境(需要管理员权限)...');
|
|
196
210
|
console.log('[' + C.y + '注意' + C.nc + '] 请在 UAC 弹窗中点击【是】');
|
|
197
211
|
console.log('');
|
|
198
212
|
|
|
@@ -202,120 +216,56 @@ $Host.UI.RawUI.WindowTitle = 'MyClaw WSL2 Installer - Phase 2'
|
|
|
202
216
|
Write-Host ''
|
|
203
217
|
Write-Host '========================================'
|
|
204
218
|
Write-Host ' MyClaw WSL2 安装 - 阶段 2/2'
|
|
205
|
-
Write-Host '
|
|
219
|
+
Write-Host ' 导入预制 Linux 环境'
|
|
206
220
|
Write-Host '========================================'
|
|
207
221
|
Write-Host ''
|
|
208
222
|
|
|
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
223
|
$dir = "$env:LOCALAPPDATA\\myclaw"
|
|
216
|
-
$msi = "$dir\\wsl_update_x64.msi"
|
|
217
224
|
New-Item -ItemType Directory -Force -Path $dir | Out-Null
|
|
218
225
|
|
|
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 为默认版本...'
|
|
226
|
+
Write-Host '[1/3] 设置 WSL2 为默认版本...'
|
|
244
227
|
try { wsl --set-default-version 2 2>$null } catch {}
|
|
245
228
|
Write-Host ' [OK]'
|
|
246
229
|
Write-Host ''
|
|
247
230
|
|
|
248
|
-
Write-Host '[
|
|
249
|
-
$
|
|
231
|
+
Write-Host '[2/3] 下载并导入预制 Linux 环境...'
|
|
232
|
+
$tarPath = "$dir\\openclaw-rootfs.tar"
|
|
250
233
|
$distroName = 'OpenClaw'
|
|
251
234
|
$installDir = "$dir\\OpenClaw"
|
|
235
|
+
$installed = $false
|
|
252
236
|
|
|
253
|
-
# ---- 方法 A (最强): 预制 rootfs tar 包,wsl --import ----
|
|
254
|
-
Write-Host ' 方法 A: 导入 OpenClaw 预制 Linux 环境...'
|
|
255
|
-
$tarPath = "$dir\\openclaw-rootfs.tar"
|
|
256
237
|
if (-Not (Test-Path $tarPath)) {
|
|
257
238
|
Write-Host ' 正在下载预制环境包...'
|
|
258
239
|
try {
|
|
259
240
|
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
|
|
260
|
-
Invoke-WebRequest -Uri '
|
|
241
|
+
Invoke-WebRequest -Uri '${WSL_CDN.rootfs}' -OutFile $tarPath -UseBasicParsing
|
|
261
242
|
Write-Host ' 下载完成!'
|
|
262
243
|
} catch {
|
|
263
|
-
Write-Host '
|
|
244
|
+
Write-Host ' [失败] 下载失败,请检查网络后重试 myclaw wsl2'
|
|
245
|
+
Write-Host ''; Write-Host '按任意键关闭...'
|
|
246
|
+
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown')
|
|
247
|
+
exit 1
|
|
264
248
|
}
|
|
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 {}
|
|
249
|
+
} else {
|
|
250
|
+
Write-Host ' 使用上次缓存的文件'
|
|
288
251
|
}
|
|
289
252
|
|
|
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 {}
|
|
253
|
+
Write-Host ' 正在导入 (可能需要几分钟)...'
|
|
254
|
+
try {
|
|
255
|
+
New-Item -ItemType Directory -Force -Path $installDir | Out-Null
|
|
256
|
+
wsl --import $distroName $installDir $tarPath 2>$null
|
|
257
|
+
if ($LASTEXITCODE -eq 0) {
|
|
258
|
+
$installed = $true
|
|
259
|
+
Write-Host ' [OK] 导入成功!'
|
|
260
|
+
} else {
|
|
261
|
+
Write-Host ' [失败] 导入失败'
|
|
308
262
|
}
|
|
263
|
+
} catch {
|
|
264
|
+
Write-Host ' [失败] 导入失败'
|
|
309
265
|
}
|
|
310
|
-
` : `
|
|
311
|
-
if (-Not $installed) {
|
|
312
|
-
Write-Host ' [失败] 预制环境包安装失败'
|
|
313
|
-
Write-Host ' 请检查网络后重试: myclaw wsl2'
|
|
314
|
-
}
|
|
315
|
-
`) + `
|
|
316
266
|
Write-Host ''
|
|
317
267
|
|
|
318
|
-
Write-Host '[
|
|
268
|
+
Write-Host '[3/3] 验证安装结果...'
|
|
319
269
|
try {
|
|
320
270
|
$result = wsl -l -v 2>&1 | Out-String
|
|
321
271
|
Write-Host $result
|
|
@@ -326,13 +276,13 @@ try {
|
|
|
326
276
|
Write-Host ''
|
|
327
277
|
Write-Host '========================================'
|
|
328
278
|
if ($installed) {
|
|
329
|
-
Write-Host ' [OK] WSL2 + Linux
|
|
279
|
+
Write-Host ' [OK] WSL2 + OpenClaw Linux 安装完成!'
|
|
330
280
|
Write-Host ''
|
|
331
281
|
Write-Host ' 输入 wsl 即可进入 Linux 环境'
|
|
332
|
-
Write-Host '
|
|
282
|
+
Write-Host ' OpenClaw 已预装就绪'
|
|
333
283
|
} else {
|
|
334
|
-
Write-Host ' [
|
|
335
|
-
Write-Host '
|
|
284
|
+
Write-Host ' [失败] 导入未成功,请检查网络后重试'
|
|
285
|
+
Write-Host ' 运行: myclaw wsl2'
|
|
336
286
|
}
|
|
337
287
|
Write-Host '========================================'
|
|
338
288
|
Write-Host ''
|