@wwkit/opm 1.0.21 → 1.0.23

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.
@@ -0,0 +1,38 @@
1
+ # mise 命令对照表
2
+
3
+ `@wwkit/opm` 统一命令管理 mise 自身(安装/升级/卸载)。
4
+
5
+ mise 通过官方 GitHub release 二进制安装(npm 分发的 preinstall 引用的 platform 包在 Windows 上不可用,故不采用)。下载源依次尝试 `active` → 其余预设 → `official`,自动回退到可用镜像(如 `ghproxy.net`)。
6
+
7
+ ## 命令对照
8
+
9
+ | 统一命令 | 原始命令 | 说明 |
10
+ |---------|---------|------|
11
+ | `opm mise version` | `mise --version` | 查看 mise 版本 |
12
+ | `opm mise install` | `mise use -g node@<version>` | 安装 mise(下载官方 release 二进制到 `~/.local/bin`) |
13
+ | `opm mise upgrade` | `mise self-update` | 更新 mise |
14
+ | `opm mise uninstall` | `npm uninstall -g mise` + 清理数据目录 | 卸载 mise |
15
+ | `opm mise dir` | 返回 `~/.local/bin/mise` | 显示二进制路径 |
16
+ | `opm mise list` | `mise ls --json` | 列出已安装的工具版本 |
17
+
18
+ ## 下载镜像预设
19
+
20
+ | 预设名 | 地址 |
21
+ |--------|------|
22
+ | `official` | `https://github.com/jdx/mise/releases/download` |
23
+ | `ghproxy` | `https://ghproxy.com/https://github.com/jdx/mise/releases/download` |
24
+ | `gh-proxy` | `https://ghproxy.net/https://github.com/jdx/mise/releases/download` |
25
+
26
+ > 安装时按 `<base>/v<version>/mise-v<version>-<platform>-<arch>[.exe]` 下载二进制;
27
+ > 依次尝试 `active` → 其余预设 → `official`,首个成功即停。
28
+
29
+ ## 示例
30
+
31
+ ```bash
32
+ opm mise version
33
+ opm mise install
34
+ opm mise upgrade
35
+ opm mise list
36
+ opm mise dir
37
+ opm mise uninstall
38
+ ```
@@ -1,25 +1,25 @@
1
1
  # node 命令对照表
2
2
 
3
- `@wwkit/opm` 统一命令通过 nvm 管理 Node.js 版本。
3
+ `@wwkit/opm` 统一命令通过 mise 管理 Node.js 版本(mise 是原生跨平台二进制,无需 bash)。
4
4
 
5
5
  ## 命令对照
6
6
 
7
7
  | 统一命令 | 原始命令 | 说明 |
8
8
  |---------|---------|------|
9
- | `opm node version` | `nvm current` | 当前激活的 Node.js 版本 |
9
+ | `opm node version` | `mise current node` | 当前激活的 Node.js 版本 |
10
10
  | `opm node registry` | 读 `~/.config/opm/config.json5` 的 `node.registry.active` | 查询 Node.js dist 镜像 |
11
- | `opm node registry set <url\|preset>` | 写 `~/.config/opm/config.json5` | 设置 Node.js dist 镜像(传给 `NVM_NODEJS_ORG_MIRROR`) |
11
+ | `opm node registry set <url\|preset>` | 写 `~/.config/opm/config.json5` | 设置 Node.js dist 镜像(传给 `MISE_NODE_MIRROR_URL`) |
12
12
  | `opm node registry presets` | — | 列出可用镜像预设 |
13
- | `opm node search <version>` | `nvm ls-remote` 过滤 | 查询版本是否可下载 |
14
- | `opm node view <version>` | `nvm ls` 过滤 | 查询版本是否已安装 |
15
- | `opm node versions` | `nvm ls-remote` | 列出所有可用版本 |
16
- | `opm node list` | `nvm ls` | 列出已安装版本 |
17
- | `opm node install <version>` | `nvm install <version>` | 安装 Node.js 版本 |
18
- | `opm node uninstall <version>` | `nvm uninstall <version>` | 卸载 Node.js 版本 |
19
- | `opm node upgrade` | `nvm install --lts` | 安装最新 LTS |
20
- | `opm node use <version>` | `nvm use <version>` | 切换当前版本 |
21
- | `opm node current` | `nvm current` | 显示当前版本 |
22
- | `opm node default <version>` | `nvm alias default <version>` | 设置默认版本 |
13
+ | `opm node search <version>` | `mise ls-remote node` 过滤 | 查询版本是否可下载 |
14
+ | `opm node view <version>` | `mise ls node --json` 过滤 | 查询版本是否已安装 |
15
+ | `opm node versions` | `mise ls-remote node` | 列出所有可用版本 |
16
+ | `opm node list` | `mise ls node --json` | 列出已安装版本 |
17
+ | `opm node install <version>` | `mise install node@<version>` | 安装 Node.js 版本 |
18
+ | `opm node uninstall <version>` | `mise uninstall node@<version>` | 卸载 Node.js 版本 |
19
+ | `opm node upgrade` | `mise install node@lts` | 安装最新 LTS |
20
+ | `opm node use <version>` | `mise use -g node@<version>` | 切换全局版本 |
21
+ | `opm node current` | `mise current node` | 显示当前版本 |
22
+ | `opm node default <version>` | `mise use -g node@<version>` | 设置全局默认版本 |
23
23
 
24
24
  ## 镜像预设
25
25
 
@@ -29,7 +29,7 @@
29
29
  | `taobao` | `https://npmmirror.com/mirrors/node` |
30
30
  | `tsinghua` | `https://mirrors.tuna.tsinghua.edu.cn/nodejs-release/` |
31
31
 
32
- > 镜像通过 `NVM_NODEJS_ORG_MIRROR` 环境变量传递给 nvm install。
32
+ > 镜像通过 `MISE_NODE_MIRROR_URL` 环境变量传递给 mise install。
33
33
 
34
34
  ## 示例
35
35
 
@@ -42,8 +42,8 @@ opm node install 20
42
42
  opm node install --lts
43
43
  opm node use 20
44
44
  opm node default 20
45
- opm node search v20.20.2
46
- opm node view v20.20.2
45
+ opm node search v24.21.0
46
+ opm node view v24.21.0
47
47
  opm node uninstall 18
48
48
  opm node upgrade
49
49
  ```
package/docs/opm.html CHANGED
@@ -101,9 +101,9 @@
101
101
  <a class="menu-item" href="#" onclick="show('managers_config');return false;">config</a>
102
102
  <a class="menu-item" href="#" onclick="show('managers_dnf');return false;">dnf</a>
103
103
  <a class="menu-item" href="#" onclick="show('managers_git');return false;">git</a>
104
+ <a class="menu-item" href="#" onclick="show('managers_mise');return false;">mise</a>
104
105
  <a class="menu-item" href="#" onclick="show('managers_node');return false;">node</a>
105
106
  <a class="menu-item" href="#" onclick="show('managers_npm');return false;">npm</a>
106
- <a class="menu-item" href="#" onclick="show('managers_nvm');return false;">nvm</a>
107
107
  <a class="menu-item" href="#" onclick="show('managers_php');return false;">php</a>
108
108
  <a class="menu-item" href="#" onclick="show('managers_phpenv');return false;">phpenv</a>
109
109
  <a class="menu-item" href="#" onclick="show('managers_pip');return false;">pip</a>
@@ -363,13 +363,28 @@ opm git export -d /path/to/repo # 指定仓库目录
363
363
  # diff 导入
364
364
  opm git import changes-abc-to-def.diff # 导入 diff 文件
365
365
  opm git import file.diff -d /repo # 导入到指定仓库</code></pre></div>
366
+ <div id="managers_mise" class="doc-content" style="display:none;"><h1>mise 命令对照表</h1>
367
+ <p><code>@wwkit/opm</code> 统一命令管理 mise 自身(安装/升级/卸载)。</p>
368
+ <p>mise 通过官方 GitHub release 二进制安装(npm 分发的 preinstall 引用的 platform 包在 Windows 上不可用,故不采用)。下载源依次尝试 <code>active</code> → 其余预设 → <code>official</code>,自动回退到可用镜像(如 <code>ghproxy.net</code>)。</p>
369
+ <h2>命令对照</h2>
370
+ <table><thead><tr><th>统一命令</th><th>原始命令</th><th>说明</th></tr></thead><tbody><tr><td><code>opm mise version</code></td><td><code>mise --version</code></td><td>查看 mise 版本</td></tr><tr><td><code>opm mise install</code></td><td><code>mise use -g node@&lt;version&gt;</code></td><td>安装 mise(下载官方 release 二进制到 <code>~/.local/bin</code>)</td></tr><tr><td><code>opm mise upgrade</code></td><td><code>mise self-update</code></td><td>更新 mise</td></tr><tr><td><code>opm mise uninstall</code></td><td><code>npm uninstall -g mise</code> + 清理数据目录</td><td>卸载 mise</td></tr><tr><td><code>opm mise dir</code></td><td>返回 <code>~/.local/bin/mise</code></td><td>显示二进制路径</td></tr><tr><td><code>opm mise list</code></td><td><code>mise ls --json</code></td><td>列出已安装的工具版本</td></tr></tbody></table>
371
+ <h2>下载镜像预设</h2>
372
+ <table><thead><tr><th>预设名</th><th>地址</th></tr></thead><tbody><tr><td><code>official</code></td><td><code>https://github.com/jdx/mise/releases/download</code></td></tr><tr><td><code>ghproxy</code></td><td><code>https://ghproxy.com/https://github.com/jdx/mise/releases/download</code></td></tr><tr><td><code>gh-proxy</code></td><td><code>https://ghproxy.net/https://github.com/jdx/mise/releases/download</code></td></tr></tbody></table>
373
+ <blockquote>安装时按 <code>&lt;base&gt;/v&lt;version&gt;/mise-v&lt;version&gt;-&lt;platform&gt;-&lt;arch&gt;[.exe]</code> 下载二进制;<br>依次尝试 <code>active</code> → 其余预设 → <code>official</code>,首个成功即停。</blockquote>
374
+ <h2>示例</h2>
375
+ <pre><code class="lang-bash">opm mise version
376
+ opm mise install
377
+ opm mise upgrade
378
+ opm mise list
379
+ opm mise dir
380
+ opm mise uninstall</code></pre></div>
366
381
  <div id="managers_node" class="doc-content" style="display:none;"><h1>node 命令对照表</h1>
367
- <p><code>@wwkit/opm</code> 统一命令通过 nvm 管理 Node.js 版本。</p>
382
+ <p><code>@wwkit/opm</code> 统一命令通过 mise 管理 Node.js 版本(mise 是原生跨平台二进制,无需 bash)。</p>
368
383
  <h2>命令对照</h2>
369
- <table><thead><tr><th>统一命令</th><th>原始命令</th><th>说明</th></tr></thead><tbody><tr><td><code>opm node version</code></td><td><code>nvm current</code></td><td>当前激活的 Node.js 版本</td></tr><tr><td><code>opm node registry</code></td><td>读 <code>~/.config/opm/config.json5</code> 的 <code>node.registry.active</code></td><td>查询 Node.js dist 镜像</td></tr><tr><td><code>opm node registry set &lt;url|preset&gt;</code></td><td>写 <code>~/.config/opm/config.json5</code></td><td>设置 Node.js dist 镜像(传给 <code>NVM_NODEJS_ORG_MIRROR</code>)</td></tr><tr><td><code>opm node registry presets</code></td><td>—</td><td>列出可用镜像预设</td></tr><tr><td><code>opm node search &lt;version&gt;</code></td><td><code>nvm ls-remote</code> 过滤</td><td>查询版本是否可下载</td></tr><tr><td><code>opm node view &lt;version&gt;</code></td><td><code>nvm ls</code> 过滤</td><td>查询版本是否已安装</td></tr><tr><td><code>opm node versions</code></td><td><code>nvm ls-remote</code></td><td>列出所有可用版本</td></tr><tr><td><code>opm node list</code></td><td><code>nvm ls</code></td><td>列出已安装版本</td></tr><tr><td><code>opm node install &lt;version&gt;</code></td><td><code>nvm install &lt;version&gt;</code></td><td>安装 Node.js 版本</td></tr><tr><td><code>opm node uninstall &lt;version&gt;</code></td><td><code>nvm uninstall &lt;version&gt;</code></td><td>卸载 Node.js 版本</td></tr><tr><td><code>opm node upgrade</code></td><td><code>nvm install --lts</code></td><td>安装最新 LTS</td></tr><tr><td><code>opm node use &lt;version&gt;</code></td><td><code>nvm use &lt;version&gt;</code></td><td>切换当前版本</td></tr><tr><td><code>opm node current</code></td><td><code>nvm current</code></td><td>显示当前版本</td></tr><tr><td><code>opm node default &lt;version&gt;</code></td><td><code>nvm alias default &lt;version&gt;</code></td><td>设置默认版本</td></tr></tbody></table>
384
+ <table><thead><tr><th>统一命令</th><th>原始命令</th><th>说明</th></tr></thead><tbody><tr><td><code>opm node version</code></td><td><code>mise current node</code></td><td>当前激活的 Node.js 版本</td></tr><tr><td><code>opm node registry</code></td><td>读 <code>~/.config/opm/config.json5</code> 的 <code>node.registry.active</code></td><td>查询 Node.js dist 镜像</td></tr><tr><td><code>opm node registry set &lt;url|preset&gt;</code></td><td>写 <code>~/.config/opm/config.json5</code></td><td>设置 Node.js dist 镜像(传给 <code>MISE_NODE_MIRROR_URL</code>)</td></tr><tr><td><code>opm node registry presets</code></td><td>—</td><td>列出可用镜像预设</td></tr><tr><td><code>opm node search &lt;version&gt;</code></td><td><code>mise ls-remote node</code> 过滤</td><td>查询版本是否可下载</td></tr><tr><td><code>opm node view &lt;version&gt;</code></td><td><code>mise ls node --json</code> 过滤</td><td>查询版本是否已安装</td></tr><tr><td><code>opm node versions</code></td><td><code>mise ls-remote node</code></td><td>列出所有可用版本</td></tr><tr><td><code>opm node list</code></td><td><code>mise ls node --json</code></td><td>列出已安装版本</td></tr><tr><td><code>opm node install &lt;version&gt;</code></td><td><code>mise install node@&lt;version&gt;</code></td><td>安装 Node.js 版本</td></tr><tr><td><code>opm node uninstall &lt;version&gt;</code></td><td><code>mise uninstall node@&lt;version&gt;</code></td><td>卸载 Node.js 版本</td></tr><tr><td><code>opm node upgrade</code></td><td><code>mise install node@lts</code></td><td>安装最新 LTS</td></tr><tr><td><code>opm node use &lt;version&gt;</code></td><td><code>mise use -g node@&lt;version&gt;</code></td><td>切换全局版本</td></tr><tr><td><code>opm node current</code></td><td><code>mise current node</code></td><td>显示当前版本</td></tr><tr><td><code>opm node default &lt;version&gt;</code></td><td><code>mise use -g node@&lt;version&gt;</code></td><td>设置全局默认版本</td></tr></tbody></table>
370
385
  <h2>镜像预设</h2>
371
386
  <table><thead><tr><th>预设名</th><th>地址</th></tr></thead><tbody><tr><td><code>official</code></td><td><code>https://nodejs.org/dist</code></td></tr><tr><td><code>taobao</code></td><td><code>https://npmmirror.com/mirrors/node</code></td></tr><tr><td><code>tsinghua</code></td><td><code>https://mirrors.tuna.tsinghua.edu.cn/nodejs-release/</code></td></tr></tbody></table>
372
- <blockquote>镜像通过 <code>NVM_NODEJS_ORG_MIRROR</code> 环境变量传递给 nvm install。</blockquote>
387
+ <blockquote>镜像通过 <code>MISE_NODE_MIRROR_URL</code> 环境变量传递给 mise install。</blockquote>
373
388
  <h2>示例</h2>
374
389
  <pre><code class="lang-bash">opm node current
375
390
  opm node version
@@ -379,8 +394,8 @@ opm node install 20
379
394
  opm node install --lts
380
395
  opm node use 20
381
396
  opm node default 20
382
- opm node search v20.20.2
383
- opm node view v20.20.2
397
+ opm node search v24.21.0
398
+ opm node view v24.21.0
384
399
  opm node uninstall 18
385
400
  opm node upgrade</code></pre></div>
386
401
  <div id="managers_npm" class="doc-content" style="display:none;"><h1>npm 命令对照表</h1>
@@ -437,20 +452,6 @@ opm npm cache clean
437
452
 
438
453
  # 显示帮助
439
454
  opm npm help</code></pre></div>
440
- <div id="managers_nvm" class="doc-content" style="display:none;"><h1>nvm 命令对照表</h1>
441
- <p><code>@wwkit/opm</code> 统一命令管理 nvm 自身(安装/升级/卸载)。</p>
442
- <h2>命令对照</h2>
443
- <table><thead><tr><th>统一命令</th><th>原始命令</th><th>说明</th></tr></thead><tbody><tr><td><code>opm nvm version</code></td><td><code>nvm --version</code></td><td>查看 nvm 版本</td></tr><tr><td><code>opm nvm registry</code></td><td>读 <code>~/.config/opm/config.json5</code> 的 <code>nvm.registry.active</code></td><td>查询 nvm git 镜像</td></tr><tr><td><code>opm nvm registry set &lt;url|preset&gt;</code></td><td>写 <code>~/.config/opm/config.json5</code></td><td>设置 nvm git 镜像</td></tr><tr><td><code>opm nvm registry presets</code></td><td>—</td><td>列出可用镜像预设</td></tr><tr><td><code>opm nvm install</code></td><td><code>git clone &lt;mirror&gt; ~/.nvm</code> + 写 shell profile</td><td>安装 nvm</td></tr><tr><td><code>opm nvm upgrade</code></td><td><code>cd ~/.nvm &amp;&amp; git pull --tags</code></td><td>更新 nvm</td></tr><tr><td><code>opm nvm uninstall</code></td><td><code>rm -rf ~/.nvm</code></td><td>卸载 nvm</td></tr><tr><td><code>opm nvm dir</code></td><td>返回 <code>~/.nvm</code> 安装目录</td></tr><tr><td><code>opm nvm list</code></td><td><code>nvm ls --no-colors</code></td><td>列出已安装 Node.js 版本</td></tr></tbody></table>
444
- <h2>镜像预设</h2>
445
- <table><thead><tr><th>预设名</th><th>地址</th></tr></thead><tbody><tr><td><code>official</code></td><td><code>https://github.com/nvm-sh/nvm.git</code></td></tr><tr><td><code>gitee</code></td><td><code>https://gitee.com/mirrors/nvm.git</code></td></tr></tbody></table>
446
- <h2>示例</h2>
447
- <pre><code class="lang-bash">opm nvm version
448
- opm nvm registry set gitee
449
- opm nvm install
450
- opm nvm upgrade
451
- opm nvm list
452
- opm nvm dir
453
- opm nvm uninstall</code></pre></div>
454
455
  <div id="managers_php" class="doc-content" style="display:none;"><h1>php 命令对照表</h1>
455
456
  <p><code>@wwkit/opm</code> 统一命令通过 phpenv 管理 PHP 版本。</p>
456
457
  <h2>命令对照</h2>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wwkit/opm",
3
- "version": "1.0.21",
3
+ "version": "1.0.23",
4
4
  "author": "bluesliu <langcai163@163.com>",
5
5
  "description": "Unified CLI — package management (npm/pip/dnf/apt) + config view + opencode maintenance",
6
6
  "type": "module",
@@ -35,7 +35,7 @@
35
35
  "basic-ftp": "^6.2.1",
36
36
  "extract-zip": "^2.0.1",
37
37
  "systeminformation": "^5.23.0",
38
- "@wwkit/shared": "1.0.26"
38
+ "@wwkit/shared": "1.0.28"
39
39
  },
40
40
  "devDependencies": {
41
41
  "jest": "^29.7.0"
@@ -54,8 +54,10 @@
54
54
  "postinstall": "node scripts/postinstall.js",
55
55
  "check": "node --check bin/index.js",
56
56
  "start": "node bin/index.js",
57
- "test": "node --experimental-vm-modules node_modules/jest/bin/jest.js --no-cache tests",
58
- "test:all": "node --experimental-vm-modules node_modules/jest/bin/jest.js --no-cache tests",
57
+ "ut": "node ../../scripts/run-tests.js unit",
58
+ "it": "node ../../scripts/run-tests.js integration",
59
+ "e2e": "node ../../scripts/run-tests.js e2e",
60
+ "test": "pnpm run ut",
59
61
  "doc": "node -e \"import('./src/cli/doc.js').then(m => m.generateDocHtml({ open: false }))\"",
60
62
  "release": "node ../../packages/shared/bin/release-pkg.js"
61
63
  }
@@ -0,0 +1,128 @@
1
+ /**
2
+ * mise 命令组 — 管理 mise 自身
3
+ *
4
+ * mise 是原生跨平台二进制(Rust),安装方式为下载官方 GitHub release 二进制
5
+ * (见 managers/node.js installMise);upgrade = mise self-update;
6
+ * uninstall = 删二进制 + 清理数据目录。
7
+ * 无 registry 概念(node 镜像在 opm node 组管理,传给 MISE_NODE_MIRROR_URL)。
8
+ */
9
+
10
+ import { execSync } from 'node:child_process'
11
+ import fs from 'node:fs'
12
+ import path from 'node:path'
13
+ import os from 'node:os'
14
+ import { ToolManagerGroup } from './version-manager.js'
15
+ import { getMiseBin, installMise } from '../../managers/node.js'
16
+
17
+ /**
18
+ * 获取 mise 数据目录(Unix ~/.local/share/mise,Windows %LOCALAPPDATA%\mise)
19
+ * @returns {string}
20
+ */
21
+ export function getMiseDataDir() {
22
+ if (process.platform === 'win32') {
23
+ return process.env.LOCALAPPDATA
24
+ ? path.join(process.env.LOCALAPPDATA, 'mise')
25
+ : path.join(os.homedir(), 'AppData', 'Local', 'mise')
26
+ }
27
+ return process.env.XDG_DATA_HOME
28
+ ? path.join(process.env.XDG_DATA_HOME, 'mise')
29
+ : path.join(os.homedir(), '.local', 'share', 'mise')
30
+ }
31
+
32
+ /**
33
+ * 获取 mise shims 目录(Windows %LOCALAPPDATA%\mise\shims,Unix ~/.local/share/mise/shims)
34
+ *
35
+ * mise 为激活的工具(如 node/npm)在 shims 目录创建 shim(Windows 下含 .cmd),
36
+ * 把该目录加入用户 PATH 后,任意新 shell 即可直接调用 mise 管理的命令。
37
+ * @returns {string}
38
+ */
39
+ export function getMiseShimsDir() {
40
+ return path.join(getMiseDataDir(), 'shims')
41
+ }
42
+
43
+ /**
44
+ * 解析 mise ls --json 输出为已安装工具版本列表
45
+ * 输出为对象 keyed by tool name,值是版本记录数组(含 installed/active)。
46
+ * @param {string} out
47
+ * @returns {{ name: string, version: string, current: boolean }[]}
48
+ */
49
+ export function parseMiseLsAll(out) {
50
+ let data
51
+ try {
52
+ data = JSON.parse(out)
53
+ } catch {
54
+ return []
55
+ }
56
+ if (!data || typeof data !== 'object' || Array.isArray(data)) return []
57
+ const items = []
58
+ for (const [tool, records] of Object.entries(data)) {
59
+ if (!Array.isArray(records)) continue
60
+ for (const rec of records) {
61
+ if (!rec || typeof rec.version !== 'string') continue
62
+ if (rec.installed === false) continue
63
+ const version = rec.version.replace(/^v/, '')
64
+ items.push({ name: `${tool} ${version}`, version, current: !!rec.active })
65
+ }
66
+ }
67
+ return items
68
+ }
69
+
70
+ export class MiseGroup extends ToolManagerGroup {
71
+ constructor() {
72
+ super({
73
+ name: 'mise',
74
+ desc: 'mise version manager (manage mise itself)',
75
+ hasRegistry: false,
76
+ isInstalled: () => {
77
+ try {
78
+ execSync(`${getMiseBin()} --version`, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] })
79
+ return true
80
+ } catch {
81
+ return false
82
+ }
83
+ },
84
+ getPath: () => getMiseBin(),
85
+ versionCmd: () => `${getMiseBin()} --version`,
86
+ parseVersion: (out) => out.trim(),
87
+ listCmd: () => `${getMiseBin()} ls --json`,
88
+ parseList: parseMiseLsAll,
89
+ install: (proxy) => installMise(proxy),
90
+ upgrade: () => {
91
+ execSync(`${getMiseBin()} self-update`, { stdio: 'inherit' })
92
+ return { action: 'upgraded' }
93
+ },
94
+ uninstall: () => {
95
+ // mise 由 installMise 下载 release 二进制到 ~/.local/bin,非 npm 全局安装
96
+ const binPath = getMiseBin()
97
+ if (binPath !== 'mise' && fs.existsSync(binPath)) {
98
+ fs.rmSync(binPath, { force: true })
99
+ }
100
+ const dataDir = getMiseDataDir()
101
+ if (fs.existsSync(dataDir)) {
102
+ fs.rmSync(dataDir, { recursive: true, force: true })
103
+ }
104
+ return { action: 'uninstalled', hint: 'mise removed (binary + data dir)' }
105
+ },
106
+ usage: 'opm mise <action> [options]',
107
+ actions: [
108
+ ['version', 'Show mise version'],
109
+ ['installed', 'Check if mise is installed'],
110
+ ['install', 'Install mise (download GitHub release binary)'],
111
+ ['upgrade', 'Update mise (mise self-update)'],
112
+ ['uninstall', 'Remove mise (binary + data dir)'],
113
+ ['dir', 'Show mise binary path'],
114
+ ['list', 'List installed tool versions (mise ls --json)'],
115
+ ['help', 'Show this help'],
116
+ ],
117
+ examples: [
118
+ 'opm mise version',
119
+ 'opm mise installed',
120
+ 'opm mise install',
121
+ 'opm mise upgrade',
122
+ 'opm mise dir',
123
+ 'opm mise list',
124
+ 'opm mise uninstall',
125
+ ],
126
+ })
127
+ }
128
+ }
@@ -5,6 +5,7 @@
5
5
  * 新增包管理器:实现 src/managers/base.js 接口后在此 MANAGERS 注册。
6
6
  */
7
7
 
8
+ import { spawnSync } from 'node:child_process'
8
9
  import { parseFlags } from '../helpers/args.js'
9
10
  import { NpmManager } from '../../managers/npm.js'
10
11
  import { PipManager } from '../../managers/pip.js'
@@ -14,7 +15,8 @@ import { BrewManager } from '../../managers/brew.js'
14
15
  import { ComposerManager } from '../../managers/composer.js'
15
16
  import { BunManager } from '../../managers/bun.js'
16
17
  import { WingetManager } from '../../managers/winget.js'
17
- import { NodeManager } from '../../managers/node.js'
18
+ import { NodeManager, getMiseInstallDir, isMiseInstalled, detectSystemNodeConflict, prependSystemPathDirs } from '../../managers/node.js'
19
+ import { getMiseShimsDir } from './mise.js'
18
20
  import { PhpManager } from '../../managers/php.js'
19
21
  import { PythonManager } from '../../managers/python.js'
20
22
  import { getPresets } from '../../presets.js'
@@ -65,7 +67,7 @@ const MANAGER_DESC = {
65
67
  composer: 'composer package manager (PHP)',
66
68
  bun: 'bun package manager (Bun runtime)',
67
69
  winget: 'winget package manager (Windows)',
68
- node: 'node version manager (via nvm)',
70
+ node: 'node version manager (via mise)',
69
71
  php: 'php version manager (via phpenv)',
70
72
  python: 'python version manager (via uv)',
71
73
  }
@@ -350,16 +352,16 @@ Examples:
350
352
  const RUNTIME_META = {
351
353
  node: {
352
354
  label: 'Node.js',
353
- tool: 'nvm',
354
- versionsHint: 'nvm ls-remote',
355
- listHint: 'nvm ls',
356
- useHint: 'nvm use',
357
- currentHint: 'nvm current',
358
- defaultHint: 'nvm alias default',
355
+ tool: 'mise',
356
+ versionsHint: 'mise ls-remote node',
357
+ listHint: 'mise ls node --json',
358
+ useHint: 'mise use node@<version>',
359
+ currentHint: 'mise current node',
360
+ defaultHint: 'mise use -g node@<version>',
359
361
  latest: 'LTS',
360
362
  installExample: '20',
361
363
  useExample: '20',
362
- searchExample: 'v20.20.2',
364
+ searchExample: 'v24.21.0',
363
365
  uninstallExample: '18',
364
366
  },
365
367
  php: {
@@ -411,7 +413,7 @@ export class RuntimeGroup extends PackageGroup {
411
413
  return
412
414
  }
413
415
 
414
- const runtimeActions = new Set(['use', 'current', 'default', 'installed', 'dir', 'install', 'upgrade', 'search', 'versions', 'version', 'view', 'list', 'info', 'cache'])
416
+ const runtimeActions = new Set(['use', 'current', 'default', 'installed', 'dir', 'install', 'upgrade', 'search', 'versions', 'version', 'view', 'list', 'info', 'cache', 'fix-path'])
415
417
  if (runtimeActions.has(action)) {
416
418
  const manager = MANAGERS[this.name]()
417
419
  const parsed = parseFlags(rest)
@@ -479,6 +481,26 @@ export class RuntimeGroup extends PackageGroup {
479
481
  break
480
482
  }
481
483
 
484
+ case 'fix-path': {
485
+ // 仅 node(mise 场景)有效:把 mise 目录前置到系统 PATH(HKLM),
486
+ // 让新终端优先用 mise 管理的 node,而非系统残留的旧版 node。
487
+ if (this.name !== 'node') {
488
+ console.error(`fix-path 仅对 node(mise 管理)有效`)
489
+ process.exit(1)
490
+ }
491
+ const r = this._fixPath()
492
+ if (r.status === 'mise-missing') {
493
+ console.error('mise 未安装,无需 fix-path')
494
+ process.exit(1)
495
+ }
496
+ if (r.status === 'needs-admin') {
497
+ console.error(`系统 PATH 修改需要管理员权限。请以管理员身份运行:\n opm ${this.name} fix-path\n或手动编辑系统环境变量,把以下目录前置到 Path:\n ${r.dirs.join('\n ')}`)
498
+ process.exit(1)
499
+ }
500
+ output({ name: this.name, action: 'fix-path', ...r })
501
+ break
502
+ }
503
+
482
504
  case 'install': {
483
505
  const version = positional[0] || (manager.getDefaultVersion ? manager.getDefaultVersion() : '')
484
506
  if (!version) {
@@ -555,6 +577,28 @@ export class RuntimeGroup extends PackageGroup {
555
577
  }
556
578
  }
557
579
 
580
+ /**
581
+ * 修复系统 PATH 冲突:把 mise 目录(安装目录 + shims)前置到系统 PATH(HKLM)。
582
+ *
583
+ * Windows 新终端 PATH = 系统 PATH + 用户 PATH,系统 PATH 优先。系统 PATH 若有
584
+ * 旧版 node 会抢先于 mise shims,导致用户终端 node 与 webwork install 使用的不一致。
585
+ * 写 HKLM 需管理员权限;失败返回 needs-admin 由调用方提示。
586
+ *
587
+ * @param {object} [deps] - 可注入依赖(测试用)
588
+ * @param {Function} [deps.spawnSyncImpl] - spawnSync 实现(reg 读写走数组参数,不经 cmd)
589
+ * @param {Function} [deps.isMiseOk] - mise 安装检测
590
+ * @param {string[]} [deps.dirs] - 需前置的目录
591
+ * @returns {{ status: 'mise-missing'|'no-conflict'|'fixed'|'needs-admin', systemNode?: string, prepended?: string[], dirs?: string[], message?: string }}
592
+ */
593
+ _fixPath({ spawnSyncImpl = spawnSync, isMiseOk = isMiseInstalled, dirs = [getMiseInstallDir(), getMiseShimsDir()] } = {}) {
594
+ if (!isMiseOk()) return { status: 'mise-missing' }
595
+ const sysNode = detectSystemNodeConflict(spawnSyncImpl)
596
+ if (!sysNode) return { status: 'no-conflict', message: '系统 PATH 无旧版 node,无需修复' }
597
+ const ok = prependSystemPathDirs(dirs, spawnSyncImpl)
598
+ if (!ok) return { status: 'needs-admin', systemNode: sysNode, dirs }
599
+ return { status: 'fixed', systemNode: sysNode, prepended: dirs, message: '已把 mise 目录前置到系统 PATH,新终端将优先用 mise 管理的 node(需重启终端生效)' }
600
+ }
601
+
558
602
  /**
559
603
  * 依据元数据生成一致的运行时帮助文本
560
604
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * 版本管理器自身命令组基类(nvm / phpenv / uv 共用)
2
+ * 版本管理器自身命令组基类(mise / phpenv / uv 共用)
3
3
  *
4
4
  * 三个版本管理器均提供 version / registry / install / upgrade / uninstall / view 动作,
5
5
  * 差异仅在底层命令与安装/升级/卸载方式,故抽象为数据驱动基类。
@@ -21,7 +21,7 @@ const shell = new Shell()
21
21
  * @property {string} desc - 顶层帮助描述
22
22
  * @property {boolean} [hasRegistry=true] - 是否支持 registry 动作(uv 为 false)
23
23
  * @property {() => boolean} isInstalled
24
- * @property {boolean} [needsBash=false] - versionCmd 是否需要 bash(nvm source / phpenv 脚本);uv 为 false
24
+ * @property {boolean} [needsBash=false] - versionCmd 是否需要 bash(phpenv 脚本);mise/uv 为 false
25
25
  * @property {() => string} getPath - view 展示的安装路径
26
26
  * @property {() => string} versionCmd - 返回查询版本的 shell 命令
27
27
  * @property {(out: string) => string} [parseVersion] - 解析版本输出
package/src/cli/index.js CHANGED
@@ -11,7 +11,7 @@ import { pathToFileURL } from 'node:url'
11
11
  import { realpathSync, readFileSync } from 'node:fs'
12
12
  import { PackageGroup, RuntimeGroup } from './groups/package.js'
13
13
  import { ConfigGroup } from './groups/config.js'
14
- import { NvmGroup } from './groups/nvm.js'
14
+ import { MiseGroup } from './groups/mise.js'
15
15
  import { PhpenvGroup } from './groups/phpenv.js'
16
16
  import { UvGroup } from './groups/uv.js'
17
17
  import { HomebrewGroup } from './groups/homebrew.js'
@@ -54,7 +54,7 @@ const GROUPS = {
54
54
  bun: new PackageGroup('bun'),
55
55
  winget: new PackageGroup('winget'),
56
56
  node: new RuntimeGroup('node'),
57
- nvm: new NvmGroup(),
57
+ mise: new MiseGroup(),
58
58
  php: new RuntimeGroup('php'),
59
59
  phpenv: new PhpenvGroup(),
60
60
  python: new RuntimeGroup('python'),
package/src/config.json5 CHANGED
@@ -95,17 +95,7 @@
95
95
  },
96
96
  },
97
97
 
98
- // nvm 自身镜像预设(git clone 地址)
99
- nvm: {
100
- registry: {
101
- official: "https://github.com/nvm-sh/nvm.git",
102
- gitee: "https://gitee.com/mirrors/nvm.git",
103
- huawei: "https://gitee.com/mirrors/nvm.git",
104
- active: "huawei",
105
- },
106
- },
107
-
108
- // node(Node.js)镜像预设(dist 下载地址,传给 NVM_NODEJS_ORG_MIRROR)
98
+ // node(Node.js)镜像预设(dist 下载地址,传给 MISE_NODE_MIRROR_URL)
109
99
  node: {
110
100
  defaultVersion: "24",
111
101
  registry: {
@@ -117,6 +107,20 @@
117
107
  },
118
108
  },
119
109
 
110
+ // mise 自身(版本管理器二进制)下载镜像预设(GitHub release 资产 base URL)
111
+ // install 时按 <base>/v<version>/mise-v<version>-<platform>-<arch>[.exe] 下载二进制,
112
+ // 依次尝试 active → 其余预设 → official,直到成功(自动回退到可用镜像)。
113
+ // 官方 npm 分发(npm install -g mise)的 preinstall 引用的 platform 包在 Windows 上不可用,
114
+ // 故默认直接下载官方 release 二进制;无法直连 GitHub 时会自动回退到 ghproxy.net 等镜像。
115
+ mise: {
116
+ registry: {
117
+ official: "https://github.com/jdx/mise/releases/download",
118
+ ghproxy: "https://ghproxy.com/https://github.com/jdx/mise/releases/download",
119
+ "gh-proxy": "https://ghproxy.net/https://github.com/jdx/mise/releases/download",
120
+ active: "gh-proxy",
121
+ },
122
+ },
123
+
120
124
  // phpenv 自身镜像预设(git clone 地址)
121
125
  phpenv: {
122
126
  registry: {
package/src/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  * @wwkit/opm 库入口
3
3
  *
4
4
  * 统一命令行工具(包管理 npm/pip/dnf/apt/brew/composer/bun + 运行时版本管理
5
- * node/php/python + 版本管理器 nvm/phpenv/uv + opencode 运维),
5
+ * node/php/python + 版本管理器 mise/phpenv/uv + opencode 运维),
6
6
  * CLI 与各组件的可复用 API 均从此导出。
7
7
  */
8
8
 
@@ -14,7 +14,7 @@ export { opencodeHarness } from './harnesses/opencode/index.js'
14
14
  export { harnessCfg } from './harnesses/harness/index.js'
15
15
  export { BinaryGroup } from './binaries/base.js'
16
16
  export { CftGroup } from './binaries/cft/index.js'
17
- export { NvmGroup } from './cli/groups/nvm.js'
17
+ export { MiseGroup } from './cli/groups/mise.js'
18
18
  export { PhpenvGroup } from './cli/groups/phpenv.js'
19
19
  export { UvGroup } from './cli/groups/uv.js'
20
20
  export { HomebrewGroup } from './cli/groups/homebrew.js'
@@ -40,7 +40,7 @@ export { AptManager } from './managers/apt.js'
40
40
  export { BrewManager } from './managers/brew.js'
41
41
  export { ComposerManager } from './managers/composer.js'
42
42
  export { BunManager } from './managers/bun.js'
43
- export { NodeManager, isNvmInstalled, getNvmSh } from './managers/node.js'
43
+ export { NodeManager, isMiseInstalled, getMiseBin } from './managers/node.js'
44
44
  export { PhpManager, isPhpenvInstalled, getPhpenvBin } from './managers/php.js'
45
45
  export { PythonManager, isUvInstalled, getUvBin } from './managers/python.js'
46
46
  export {
@@ -57,7 +57,7 @@ export {
57
57
 
58
58
  export {
59
59
  NPM_PRESETS, PIP_PRESETS, DNF_PRESETS, APT_PRESETS, BREW_PRESETS, COMPOSER_PRESETS,
60
- BUN_PRESETS, NVM_PRESETS, NODE_PRESETS, PHPENV_PRESETS, PHP_PRESETS, PYTHON_PRESETS,
60
+ BUN_PRESETS, NODE_PRESETS, PHPENV_PRESETS, PHP_PRESETS, PYTHON_PRESETS,
61
61
  UV_PRESETS, DOCKER_PRESETS, HOMEBREW_PRESETS,
62
62
  getPresets, resolveRegistryInput,
63
63
  } from './presets.js'