@wwkit/opm 1.0.2 → 1.0.4
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/README.md +194 -11
- package/bin/index.js +23 -0
- package/docs/managers/git.md +103 -0
- package/docs/managers/proc.md +77 -0
- package/docs/managers/uv.md +9 -3
- package/docs/opm.html +154 -11
- package/docs/packages/opencode.md +46 -15
- package/docs/test/linux-environment-test-report.md +147 -0
- package/package.json +3 -2
- package/src/cli/groups/docker.js +10 -5
- package/src/cli/groups/homebrew.js +9 -5
- package/src/cli/groups/nvm.js +6 -2
- package/src/cli/groups/ping.js +461 -0
- package/src/cli/groups/proc.js +232 -0
- package/src/cli/groups/uv.js +9 -8
- package/src/cli/groups/version-manager.js +34 -8
- package/src/cli/index.js +10 -0
- package/src/config.json5 +84 -7
- package/src/harnesses/base.js +34 -0
- package/src/harnesses/opencode/index.js +56 -0
- package/src/index.js +6 -0
- package/src/managers/brew.js +6 -6
- package/src/managers/docker.js +10 -7
- package/src/managers/node.js +8 -2
- package/src/managers/proc.js +424 -0
- package/src/managers/python.js +7 -4
- package/src/presets.js +3 -0
- package/src/tools/ftp/index.js +151 -16
- package/src/tools/git/config.js +374 -0
- package/src/tools/git/index.js +378 -0
- package/src/tools/share/.htaccess +20 -0
- package/src/tools/share/client.js +172 -0
- package/src/tools/share/index.js +735 -0
- package/src/tools/share/server.js +430 -0
- package/src/tools/share/server.php +452 -0
- package/src/tools/webwork/index.js +558 -0
package/docs/opm.html
CHANGED
|
@@ -100,16 +100,20 @@
|
|
|
100
100
|
<a class="menu-item" href="#" onclick="show('managers_composer');return false;">composer</a>
|
|
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
|
+
<a class="menu-item" href="#" onclick="show('managers_git');return false;">git</a>
|
|
103
104
|
<a class="menu-item" href="#" onclick="show('managers_node');return false;">node</a>
|
|
104
105
|
<a class="menu-item" href="#" onclick="show('managers_npm');return false;">npm</a>
|
|
105
106
|
<a class="menu-item" href="#" onclick="show('managers_nvm');return false;">nvm</a>
|
|
106
107
|
<a class="menu-item" href="#" onclick="show('managers_php');return false;">php</a>
|
|
107
108
|
<a class="menu-item" href="#" onclick="show('managers_phpenv');return false;">phpenv</a>
|
|
108
109
|
<a class="menu-item" href="#" onclick="show('managers_pip');return false;">pip</a>
|
|
110
|
+
<a class="menu-item" href="#" onclick="show('managers_proc');return false;">proc</a>
|
|
109
111
|
<a class="menu-item" href="#" onclick="show('managers_python');return false;">python</a>
|
|
110
112
|
<a class="menu-item" href="#" onclick="show('managers_uv');return false;">uv</a>
|
|
111
113
|
<div class="menu-category">packages</div>
|
|
112
114
|
<a class="menu-item" href="#" onclick="show('packages_opencode');return false;">opencode</a>
|
|
115
|
+
<div class="menu-category">test</div>
|
|
116
|
+
<a class="menu-item" href="#" onclick="show('test_linux_environment_test_report');return false;">linux-environment-test-report</a>
|
|
113
117
|
</div>
|
|
114
118
|
<div id="content">
|
|
115
119
|
<div id="managers_apt" class="doc-content" style="display:block;"><h1>apt 命令对照表</h1>
|
|
@@ -318,6 +322,61 @@ opm dnf install htop
|
|
|
318
322
|
opm dnf uninstall htop
|
|
319
323
|
opm dnf upgrade htop
|
|
320
324
|
opm dnf cache clean</code></pre></div>
|
|
325
|
+
<div id="managers_git" class="doc-content" style="display:none;"><h1>git 命令对照</h1>
|
|
326
|
+
<p><code>@wwkit/opm</code> 统一命令管理 git 安装与配置、diff 导出/导入。</p>
|
|
327
|
+
<h2>命令对照</h2>
|
|
328
|
+
<table><thead><tr><th>统一命令</th><th>原始命令</th><th>说明</th></tr></thead><tbody><tr><td><code>opm git version</code></td><td><code>git --version</code></td><td>查看已安装版本和路径</td></tr><tr><td><code>opm git install</code></td><td><code>dnf install -y git</code> / <code>apt-get install -y git</code></td><td>通过系统包管理器安装 git</td></tr><tr><td><code>opm git uninstall</code></td><td><code>dnf remove -y git</code> / <code>apt-get remove -y git</code></td><td>通过系统包管理器卸载 git</td></tr><tr><td><code>opm git upgrade</code></td><td><code>dnf upgrade -y git</code> / <code>apt-get install --only-upgrade -y git</code></td><td>通过系统包管理器升级 git</td></tr><tr><td><code>opm git init</code></td><td><code>git config --global ...</code></td><td>从 opm 配置一键初始化全局 git 配置(user/ssl/pull.rebase)</td></tr><tr><td><code>opm git config</code></td><td><code>git config --global --list</code></td><td>列出全局配置</td></tr><tr><td><code>opm git config <key></code></td><td><code>git config --global --get <key></code></td><td>查询单个配置项</td></tr><tr><td><code>opm git config <key> <value></code></td><td><code>git config --global <key> <value></code></td><td>设置配置项</td></tr><tr><td><code>opm git config --unset <key></code></td><td><code>git config --global --unset <key></code></td><td>删除配置项</td></tr><tr><td><code>opm git user</code></td><td><code>git config --global user.name</code> / <code>user.email</code></td><td>查看 user.name 和 user.email</td></tr><tr><td><code>opm git user -n <name> -e <email></code></td><td><code>git config --global user.name <name></code></td><td>设置用户信息</td></tr><tr><td><code>opm git export mark</code></td><td><code>git rev-list -n 1 opm-diff-base</code></td><td>查看当前基准标记</td></tr><tr><td><code>opm git export mark 0</code> | <code>HEAD</code></td><td><code>git tag opm-diff-base HEAD</code></td><td>标记当前 HEAD 为 diff 基准</td></tr><tr><td><code>opm git export mark <commit></code></td><td><code>git tag opm-diff-base <commit></code></td><td>标记指定 commit 为 diff 基准</td></tr><tr><td><code>opm git export mark --unset</code></td><td><code>git tag -d opm-diff-base</code></td><td>删除基准标记</td></tr><tr><td><code>opm git export</code></td><td><code>git diff <mark> HEAD</code></td><td>导出基准到 HEAD 的 diff(auto-commit 未提交变更)</td></tr><tr><td><code>opm git export -f <n></code></td><td><code>git diff HEAD~n HEAD</code></td><td>覆盖基准为 HEAD~n</td></tr><tr><td><code>opm git export -f <ref></code></td><td><code>git diff <ref> HEAD</code></td><td>覆盖基准为任意 ref</td></tr><tr><td><code>opm git import <file></code></td><td><code>git apply --reject <file></code></td><td>导入 diff 文件到工作树</td></tr></tbody></table>
|
|
329
|
+
<h2>选项</h2>
|
|
330
|
+
<table><thead><tr><th>选项</th><th>说明</th></tr></thead><tbody><tr><td><code>-d, --dir <dir></code></td><td>git 仓库目录(默认 cwd)</td></tr><tr><td><code>-p, --proxy <url></code></td><td>install/upgrade 时代理</td></tr><tr><td><code>--scope <global|local|system></code></td><td>config 作用域(默认 global)</td></tr><tr><td><code>-n, --name <name></code></td><td>user: 用户名;export: diff 文件名</td></tr><tr><td><code>-e, --email <email></code></td><td>user: 用户邮箱</td></tr><tr><td><code>-o, --output <file></code></td><td>export: 输出文件路径</td></tr><tr><td><code>-f, --from <n>|<ref></code></td><td>export: 覆盖基准 ref(数字=HEAD~n,字符串=ref)</td></tr><tr><td><code>-f, --force</code></td><td>init: 强制覆盖已有配置</td></tr><tr><td><code>--unset <key></code></td><td>config: 删除配置项</td></tr><tr><td><code>-h, --help</code></td><td>显示帮助</td></tr></tbody></table>
|
|
331
|
+
<h2>配置预设</h2>
|
|
332
|
+
<p>opm 配置 <code>git</code> 段(<code>opm git init</code> 使用):</p>
|
|
333
|
+
<pre><code class="lang-json5">{
|
|
334
|
+
git: {
|
|
335
|
+
sslVerify: false, // http.sslVerify
|
|
336
|
+
user: { name: "", email: "" }, // user.name / user.email
|
|
337
|
+
pullRebase: false, // pull.rebase
|
|
338
|
+
},
|
|
339
|
+
}</code></pre>
|
|
340
|
+
<h2>diff 导出/导入流程</h2>
|
|
341
|
+
<p>1. <strong>修改前</strong>:<code>opm git export mark 0</code> — 标记当前 HEAD 为基准</p>
|
|
342
|
+
<p>2. <strong>修改后</strong>:<code>opm git export</code> — 自动 commit 未提交变更,导出基准到 HEAD 的 diff</p>
|
|
343
|
+
<p>3. <strong>传输</strong>:将 diff 文件传到目标机器</p>
|
|
344
|
+
<p>4. <strong>导入</strong>:<code>opm git import <file></code> — 在目标仓库应用 diff</p>
|
|
345
|
+
<p>默认输出文件:<code><workdir>/.webwork/git/changes-<from-short>-to-<to-short>.diff</code></p>
|
|
346
|
+
<h2>示例</h2>
|
|
347
|
+
<pre><code class="lang-bash"># 安装/升级 git
|
|
348
|
+
opm git version # 查看已安装版本
|
|
349
|
+
opm git install # 安装 git
|
|
350
|
+
opm git upgrade # 升级 git
|
|
351
|
+
|
|
352
|
+
# 初始化配置
|
|
353
|
+
opm git init # 从 opm 配置初始化全局 git 配置
|
|
354
|
+
opm git init -f # 强制覆盖已有配置
|
|
355
|
+
|
|
356
|
+
# 配置管理
|
|
357
|
+
opm git config # 列出全局配置
|
|
358
|
+
opm git config pull.rebase true # 设置 pull.rebase
|
|
359
|
+
opm git config --unset pull.rebase # 删除配置项
|
|
360
|
+
opm git config --scope local # 操作本地配置
|
|
361
|
+
|
|
362
|
+
# 用户信息
|
|
363
|
+
opm git user # 查看当前用户信息
|
|
364
|
+
opm git user -n "John" -e "john@example.com" # 设置用户信息
|
|
365
|
+
|
|
366
|
+
# diff 导出
|
|
367
|
+
opm git export mark # 查看当前基准
|
|
368
|
+
opm git export mark 0 # 标记当前 HEAD 为基准
|
|
369
|
+
opm git export mark HEAD # 标记当前 HEAD 为基准
|
|
370
|
+
opm git export mark 3af967b # 标记指定 commit 为基准
|
|
371
|
+
opm git export mark --unset # 删除基准
|
|
372
|
+
opm git export # 导出 diff(基准 -> HEAD)
|
|
373
|
+
opm git export -f 2 # 导出 diff(HEAD~2 -> HEAD)
|
|
374
|
+
opm git export -n feature # 导出为 feature.diff
|
|
375
|
+
opm git export -d /path/to/repo # 指定仓库目录
|
|
376
|
+
|
|
377
|
+
# diff 导入
|
|
378
|
+
opm git import changes-abc-to-def.diff # 导入 diff 文件
|
|
379
|
+
opm git import file.diff -d /repo # 导入到指定仓库</code></pre></div>
|
|
321
380
|
<div id="managers_node" class="doc-content" style="display:none;"><h1>node 命令对照表</h1>
|
|
322
381
|
<p><code>@wwkit/opm</code> 统一命令通过 nvm 管理 Node.js 版本。</p>
|
|
323
382
|
<h2>命令对照</h2>
|
|
@@ -502,6 +561,43 @@ opm pip cache clean
|
|
|
502
561
|
opm pip help</code></pre>
|
|
503
562
|
<h2>技术说明</h2>
|
|
504
563
|
<ul><li><strong>源查询</strong>:优先使用 PyPI JSON API(<code>/pypi/<name>/json</code>),当镜像不支持 JSON API 时自动回退到 simple index HTML 解析</li><li><strong>版本排序</strong>:simple index 方式提取的版本使用内置版本比较算法排序,自动排除 dev/rc/alpha/beta 等预发布版本作为 latest</li></ul></div>
|
|
564
|
+
<div id="managers_proc" class="doc-content" style="display:none;"><h1>proc 命令对照</h1>
|
|
565
|
+
<p><code>@wwkit/opm</code> 统一命令管理系统信息与进程管理。</p>
|
|
566
|
+
<h2>命令对照</h2>
|
|
567
|
+
<table><thead><tr><th>统一命令</th><th>原始命令</th><th>说明</th></tr></thead><tbody><tr><td><code>opm proc info</code></td><td>—</td><td>显示系统信息(OS/CPU/内存/磁盘/运行时间)</td></tr><tr><td><code>opm proc list</code></td><td><code>ps aux --sort=-%mem</code></td><td>列出按内存排序的 Top N 进程(默认 10)</td></tr><tr><td><code>opm proc list -b cpu</code></td><td><code>ps aux --sort=-%cpu</code></td><td>列出按 CPU 排序的进程</td></tr><tr><td><code>opm proc search -n <name></code></td><td><code>ps aux | grep <name></code></td><td>按名称模糊搜索进程</td></tr><tr><td><code>opm proc search -n <name> --exact</code></td><td>—</td><td>精确匹配进程名</td></tr><tr><td><code>opm proc search -n <name> -p <port></code></td><td>—</td><td>按名称 + 端口搜索</td></tr><tr><td><code>opm proc port</code></td><td><code>netstat -tlnp</code></td><td>列出所有监听端口及对应进程</td></tr><tr><td><code>opm proc port -p <port></code></td><td><code>netstat -tlnp | grep <port></code></td><td>查询指定端口</td></tr><tr><td><code>opm proc kill -i <pid></code></td><td><code>kill <pid></code></td><td>按 PID 终止进程(SIGTERM)</td></tr><tr><td><code>opm proc kill -p <port></code></td><td>—</td><td>按端口终止进程</td></tr><tr><td><code>opm proc kill -n <name></code></td><td><code>pkill <name></code></td><td>按名称终止进程</td></tr><tr><td><code>opm proc kill -i <pid> -f</code></td><td><code>kill -9 <pid></code></td><td>强制终止(SIGKILL)</td></tr><tr><td><code>opm proc tree</code></td><td><code>pstree</code></td><td>显示进程树(所有顶层进程)</td></tr><tr><td><code>opm proc tree <pid></code></td><td><code>pstree -p <pid></code></td><td>显示指定 PID 的进程树</td></tr><tr><td><code>opm proc detail <pid></code></td><td><code>ps -p <pid> -o ...</code></td><td>显示指定 PID 的详细信息</td></tr></tbody></table>
|
|
568
|
+
<h2>选项</h2>
|
|
569
|
+
<table><thead><tr><th>选项</th><th>说明</th></tr></thead><tbody><tr><td><code>-n, --count <n></code></td><td>list: 进程数量(默认 10)</td></tr><tr><td><code>-n, --name <name></code></td><td>search/kill: 进程名称模式(默认模糊匹配)</td></tr><tr><td><code>-b, --by <mem|cpu></code></td><td>list: 排序方式(默认 mem)</td></tr><tr><td><code>-p, --port <port></code></td><td>search/kill/port: 端口号</td></tr><tr><td><code>-i, --id <pid></code></td><td>kill: 进程 ID</td></tr><tr><td><code>--exact</code></td><td>search: 精确匹配(默认模糊)</td></tr><tr><td><code>-f, --force</code></td><td>kill: 使用 SIGKILL 替代 SIGTERM</td></tr><tr><td><code>-y, --yes</code></td><td>kill: 跳过确认提示</td></tr><tr><td><code>-h, --help</code></td><td>显示帮助</td></tr></tbody></table>
|
|
570
|
+
<h2>实现说明</h2>
|
|
571
|
+
<ul><li><code>src/managers/proc.js</code> — systeminformation 封装 + netstat 端口映射 + 进程操作</li><li><code>src/cli/groups/proc.js</code> — ProcGroup 命令组路由</li><li>端口映射优先使用 <code>systeminformation.networkConnections()</code>,回退 <code>netstat -tlnp</code></li><li>内存值从 KB 转换为 MB(<code>memRss / 1024</code>)</li></ul>
|
|
572
|
+
<h2>示例</h2>
|
|
573
|
+
<pre><code class="lang-bash"># 系统信息
|
|
574
|
+
opm proc info # OS/CPU/内存/磁盘/运行时间
|
|
575
|
+
|
|
576
|
+
# 进程列表
|
|
577
|
+
opm proc list # Top 10 进程(按内存)
|
|
578
|
+
opm proc list -n 20 # Top 20 进程
|
|
579
|
+
opm proc list -b cpu # 按 CPU 排序
|
|
580
|
+
|
|
581
|
+
# 搜索
|
|
582
|
+
opm proc search -n node # 模糊搜索 node 进程
|
|
583
|
+
opm proc search -n node --exact # 精确匹配
|
|
584
|
+
opm proc search -n node -p 3000 # 搜索 node 进程 + 端口 3000
|
|
585
|
+
|
|
586
|
+
# 端口
|
|
587
|
+
opm proc port # 所有监听端口
|
|
588
|
+
opm proc port -p 8080 # 查询 8080 端口
|
|
589
|
+
|
|
590
|
+
# 终止
|
|
591
|
+
opm proc kill -i 1234 # 终止 PID 1234
|
|
592
|
+
opm proc kill -p 8080 -f -y # 强制终止 8080 端口的进程
|
|
593
|
+
opm proc kill -n node -y # 终止所有 node 进程
|
|
594
|
+
|
|
595
|
+
# 进程树
|
|
596
|
+
opm proc tree # 所有顶层进程树
|
|
597
|
+
opm proc tree 1234 # PID 1234 的进程树
|
|
598
|
+
|
|
599
|
+
# 详情
|
|
600
|
+
opm proc detail 1234 # PID 1234 的详细信息</code></pre></div>
|
|
505
601
|
<div id="managers_python" class="doc-content" style="display:none;"><h1>python 命令对照表</h1>
|
|
506
602
|
<p><code>@wwkit/opm</code> 统一命令通过 uv 管理 Python 版本。</p>
|
|
507
603
|
<h2>命令对照</h2>
|
|
@@ -527,10 +623,13 @@ opm python upgrade</code></pre></div>
|
|
|
527
623
|
<p><code>@wwkit/opm</code> 统一命令管理 uv 自身(安装/升级/卸载)。</p>
|
|
528
624
|
<p>uv 是 Astral 出品的快速 Python 包/版本管理器(Rust 实现),替代 pyenv + pip。</p>
|
|
529
625
|
<h2>命令对照</h2>
|
|
530
|
-
<table><thead><tr><th>统一命令</th><th>原始命令</th><th>说明</th></tr></thead><tbody><tr><td><code>opm uv version</code></td><td><code>uv --version</code></td><td>查看 uv 版本</td></tr><tr><td><code>opm uv install</code></td><td><code>curl -LsSf
|
|
531
|
-
<blockquote>uv
|
|
626
|
+
<table><thead><tr><th>统一命令</th><th>原始命令</th><th>说明</th></tr></thead><tbody><tr><td><code>opm uv version</code></td><td><code>uv --version</code></td><td>查看 uv 版本</td></tr><tr><td><code>opm uv registry</code></td><td>读 <code>~/.config/opm/config.json5</code> 的 <code>uv.registry.active</code></td><td>查询激活的安装脚本 URL</td></tr><tr><td><code>opm uv registry set <url|preset></code></td><td>写 <code>~/.config/opm/config.json5</code> 的 <code>uv.registry.active</code></td><td>设置激活安装脚本 URL(支持预设名)</td></tr><tr><td><code>opm uv registry presets</code></td><td>—</td><td>列出可用镜像预设</td></tr><tr><td><code>opm uv install</code></td><td><code>curl -LsSf <active> | sh</code></td><td>安装 uv(脚本 URL 来自 <code>uv.registry.active</code>)</td></tr><tr><td><code>opm uv upgrade</code></td><td><code>uv self update</code></td><td>更新 uv</td></tr><tr><td><code>opm uv uninstall</code></td><td><code>rm ~/.local/bin/uv</code> + <code>rm -rf ~/.local/share/uv</code></td><td>卸载 uv</td></tr><tr><td><code>opm uv dir</code></td><td>返回 uv 安装目录</td></tr></tbody></table>
|
|
627
|
+
<blockquote>安装脚本 URL 通过 <code>uv.registry.active</code> 配置(<code>opm uv registry set <url></code>);Windows 仍使用官方 <code>install.ps1</code>。</blockquote>
|
|
532
628
|
<h2>示例</h2>
|
|
533
629
|
<pre><code class="lang-bash">opm uv version
|
|
630
|
+
opm uv registry
|
|
631
|
+
opm uv registry presets
|
|
632
|
+
opm uv registry set official
|
|
534
633
|
opm uv install
|
|
535
634
|
opm uv upgrade
|
|
536
635
|
opm uv dir
|
|
@@ -538,18 +637,62 @@ opm uv uninstall</code></pre></div>
|
|
|
538
637
|
<div id="packages_opencode" class="doc-content" style="display:none;"><h1>opencode 命令对照</h1>
|
|
539
638
|
<p><code>@wwkit/opm</code> 统一命令管理 opencode 运维操作。</p>
|
|
540
639
|
<h2>命令对照</h2>
|
|
541
|
-
<table><thead><tr><th>统一命令</th><th>原始命令</th><th>说明</th></tr></thead><tbody><tr><td><code>opm opencode
|
|
640
|
+
<table><thead><tr><th>统一命令</th><th>原始命令</th><th>说明</th></tr></thead><tbody><tr><td><code>opm opencode version</code></td><td><code>npm list -g opencode-ai</code></td><td>已安装版本</td></tr><tr><td><code>opm opencode installed</code></td><td>—</td><td>检查是否已安装</td></tr><tr><td><code>opm opencode install</code></td><td><code>npm install -g opencode-ai</code></td><td>安装(使用 opm npm 镜像 + proxy)</td></tr><tr><td><code>opm opencode uninstall</code></td><td><code>npm uninstall -g opencode-ai</code></td><td>卸载</td></tr><tr><td><code>opm opencode upgrade</code></td><td><code>npm install -g opencode-ai@latest</code></td><td>升级(使用 opm npm 镜像 + proxy)</td></tr><tr><td><code>opm opencode config</code></td><td>—</td><td>显示 opencode 配置文件内容</td></tr><tr><td><code>opm opencode dir</code></td><td>—</td><td>显示 data/db/log/config 路径</td></tr><tr><td><code>opm opencode env</code></td><td>—</td><td>显示 harness 环境变量(OPENCODE_CONFIG_DIR / OPENCODE_CONFIG_CONTENT)</td></tr><tr><td><code>opm opencode open [-d <dir>]</code></td><td><code>opencode</code></td><td>在指定目录启动 TUI(默认 cwd),自动注入环境变量</td></tr><tr><td><code>opm opencode clear</code></td><td>—</td><td>清理 opencode 会话并 VACUUM 压缩数据库</td></tr><tr><td><code>opm opencode clear -d, --days <n></code></td><td>—</td><td>保留最近 n 天(对齐本地零点,含今天;默认 <code>-d 1</code>)</td></tr><tr><td><code>opm opencode clear -h, --hours <n></code></td><td>—</td><td>保留最近 n 小时(滚动窗口)</td></tr><tr><td><code>opm opencode clear -n, --num <n></code></td><td>—</td><td>保留最新 n 个会话</td></tr><tr><td><code>opm opencode clear --dry-run</code></td><td>—</td><td>仅预览,不修改任何数据</td></tr><tr><td><code>opm opencode clear -y</code></td><td>—</td><td>跳过确认提示</td></tr><tr><td><code>opm opencode clear --backup</code></td><td>—</td><td>删除前备份数据库</td></tr><tr><td><code>opm opencode clear --db <path></code></td><td>—</td><td>覆盖 opencode 数据库路径</td></tr></tbody></table>
|
|
542
641
|
<blockquote><code>--days</code> / <code>--hours</code> / <code>--num</code> 三选一,互斥。</blockquote>
|
|
642
|
+
<h2>选项</h2>
|
|
643
|
+
<table><thead><tr><th>选项</th><th>说明</th></tr></thead><tbody><tr><td><code>-p, --proxy <url></code></td><td>install/upgrade 时代理(覆盖配置 <code>proxy.active</code>)</td></tr><tr><td><code>-d, --dir <dir></code></td><td>open 的工作目录(默认 cwd)</td></tr><tr><td><code>-h, --help</code></td><td>显示帮助</td></tr></tbody></table>
|
|
644
|
+
<h2>环境变量</h2>
|
|
645
|
+
<p><code>opm opencode env</code> 显示注入 opencode 的环境变量,来源为 opm 配置 <code>opencode.env</code> 段 + 系统环境变量(系统环境变量优先):</p>
|
|
646
|
+
<table><thead><tr><th>变量</th><th>默认值</th><th>说明</th></tr></thead><tbody><tr><td><code>OPENCODE_CONFIG_DIR</code></td><td><code>{pkg:@wwkit/harness}</code></td><td>opencode 配置目录(动态解析为已安装的 @wwkit/harness 包目录)</td></tr><tr><td><code>OPENCODE_CONFIG_CONTENT</code></td><td><code>""</code></td><td>opencode 配置内容注入(非空时覆盖配置文件)</td></tr></tbody></table>
|
|
543
647
|
<h2>实现说明</h2>
|
|
544
|
-
<ul><li><code>src/harnesses/opencode/db.js</code> — 数据目录 / DB / 日志路径</li><li><code>src/harnesses/opencode/sqlite.js</code> — 跨平台 SQLite 驱动(Node >= 22.5 内置 <code>node:sqlite</code>,否则回退 sqlite3 CLI)</li><li><code>src/harnesses/opencode/clear.js</code> — 清理流程(保留策略计算 + 删除 + VACUUM)</li><li><code>src/harnesses/base.js</code> — <code>HarnessGroup</code> 统一命令组基类(version/install/uninstall/upgrade/config/clear/dir)</li></ul>
|
|
648
|
+
<ul><li><code>src/harnesses/opencode/db.js</code> — 数据目录 / DB / 日志路径</li><li><code>src/harnesses/opencode/sqlite.js</code> — 跨平台 SQLite 驱动(Node >= 22.5 内置 <code>node:sqlite</code>,否则回退 sqlite3 CLI)</li><li><code>src/harnesses/opencode/clear.js</code> — 清理流程(保留策略计算 + 删除 + VACUUM)</li><li><code>src/harnesses/base.js</code> — <code>HarnessGroup</code> 统一命令组基类(version/installed/install/uninstall/upgrade/config/clear/dir/env/open)</li></ul>
|
|
545
649
|
<h2>示例</h2>
|
|
546
|
-
<pre><code class="lang-bash">opm opencode
|
|
547
|
-
opm opencode
|
|
548
|
-
opm opencode
|
|
549
|
-
opm opencode
|
|
550
|
-
opm opencode
|
|
551
|
-
opm opencode
|
|
552
|
-
opm opencode
|
|
650
|
+
<pre><code class="lang-bash">opm opencode version # 查看已安装版本
|
|
651
|
+
opm opencode installed # 检查是否已安装
|
|
652
|
+
opm opencode install # 安装 opencode
|
|
653
|
+
opm opencode upgrade # 升级到最新
|
|
654
|
+
opm opencode config # 显示配置文件内容
|
|
655
|
+
opm opencode dir # 查看数据/日志/DB路径
|
|
656
|
+
opm opencode env # 查看环境变量
|
|
657
|
+
opm opencode open # 在当前目录启动 TUI
|
|
658
|
+
opm opencode open -d /path/to/project # 在指定目录启动 TUI
|
|
659
|
+
opm opencode clear # 只保留今天创建的会话
|
|
660
|
+
opm opencode clear -d 7 # 保留最近 7 天会话
|
|
661
|
+
opm opencode clear -h 24 # 保留最近 24 小时会话
|
|
662
|
+
opm opencode clear -n 10 # 保留最新 10 个会话
|
|
663
|
+
opm opencode clear --dry-run # 仅预览
|
|
664
|
+
opm opencode clear -y # 跳过确认直接执行
|
|
665
|
+
opm opencode clear --backup # 删除前备份数据库</code></pre></div>
|
|
666
|
+
<div id="test_linux_environment_test_report" class="doc-content" style="display:none;"><h1>opm 真实环境测试报告</h1>
|
|
667
|
+
<ul><li><strong>日期</strong>: 2026-09-14</li><li><strong>环境</strong>: Linux (openEuler, x86_64)</li><li><strong>Node.js</strong>: v22.21.1 (恢复后)</li><li><strong>工具</strong>: curl 7.79.1, wget, git, dnf 4.10.0, pip 21.3.1</li><li><strong>代理</strong>: http://proxyhm-hk.security.huawei.com:8080 (认证: {env:PROXY_USER}:{env:PROXY_PASSWORD})</li><li><strong>网络</strong>: 需通过华为代理访问外网</li></ul>
|
|
668
|
+
<h2>一、单元测试</h2>
|
|
669
|
+
<pre><code class="lang-">node --test tests/
|
|
670
|
+
# tests 228, pass 225, fail 3</code></pre>
|
|
671
|
+
<ul><li><strong>通过</strong>: 225</li><li><strong>失败</strong>: 3(均为 pip 网络测试,依赖 pypi.org 直连,非本次改动引入)</li><li><strong>修复</strong>: cft.test.js 配置 active 不匹配(<code>npmmirror</code> → 动态断言)</li></ul>
|
|
672
|
+
<h2>二、真实环境命令测试</h2>
|
|
673
|
+
<h3>已安装命令(9 个)</h3>
|
|
674
|
+
<table><thead><tr><th>命令</th><th>动作</th><th>结果</th><th>备注</th></tr></thead><tbody><tr><td><code>opm npm</code></td><td>version</td><td>PASS</td><td>10.8.2</td></tr><tr><td>registry</td><td>PASS</td><td>npmmirror</td></tr><tr><td>installed</td><td>PASS</td></tr><tr><td>search</td><td>PASS</td><td>通过代理查询 axios</td></tr><tr><td>info</td><td>PASS</td></tr><tr><td>list</td><td>PASS</td></tr><tr><td>outdated -g</td><td>PASS</td></tr><tr><td>registry set</td><td>PASS</td><td>切换 huawei 后恢复</td></tr><tr><td><code>opm pip</code></td><td>version</td><td>PASS</td><td>21.3.1</td></tr><tr><td>registry</td><td>PASS</td><td>tsinghua</td></tr><tr><td>search</td><td>PASS</td><td>通过代理查询 requests</td></tr><tr><td>list</td><td>PASS</td></tr><tr><td>registry set</td><td>PASS</td></tr><tr><td><code>opm dnf</code></td><td>version</td><td>PASS</td><td>4.10.0</td></tr><tr><td>registry</td><td>PASS</td><td>hce</td></tr><tr><td>search</td><td>PASS</td><td>curl 返回 exists:false(HCE 源无此包,预期行为)</td></tr><tr><td><code>opm node</code></td><td>version</td><td>PASS</td><td>20.20.2</td></tr><tr><td>current</td><td>PASS</td><td>v20.20.2</td></tr><tr><td>list</td><td>PASS</td></tr><tr><td>versions</td><td>PASS</td><td>通过代理获取远程版本列表</td></tr><tr><td>use</td><td>PASS</td></tr><tr><td><code>opm nvm</code></td><td>version</td><td>PASS</td><td>0.40.4</td></tr><tr><td>installed</td><td>PASS</td></tr><tr><td>registry</td><td>PASS</td><td>huawei</td></tr><tr><td>dir</td><td>PASS</td><td>/root/.nvm</td></tr><tr><td>upgrade</td><td><strong>FAIL</strong></td><td><code>/root/.nvm</code> 非 git 仓库(git clone 安装的才支持 upgrade)</td></tr><tr><td>uninstall</td><td><strong>WARN</strong></td><td>实际执行了卸载,删除了 <code>/root/.nvm</code>,导致 node 不可用</td></tr><tr><td><code>opm config</code></td><td>(full)</td><td>PASS</td></tr><tr><td>proxy</td><td>PASS</td><td>显示 huawei 代理 + active</td></tr><tr><td><code>opm ping</code></td><td>host</td><td>PASS</td></tr><tr><td>proxy</td><td>PASS</td><td>通过代理访问 npm registry 验证可用性</td></tr><tr><td>registry</td><td>PASS</td><td>16/16 全部 reachable:true</td></tr><tr><td>source</td><td>PASS</td><td>打印 curl 示例命令</td></tr><tr><td><code>opm cft</code></td><td>version</td><td>PASS</td><td>未安装,输出空</td></tr><tr><td>dir</td><td>PASS</td></tr><tr><td>list</td><td>PASS</td></tr><tr><td>status</td><td>PASS</td></tr><tr><td>versions</td><td><strong>FAIL</strong></td><td>deepbluenet 镜像无 versions JSON 文件</td></tr><tr><td><code>opm ensure</code></td><td>node</td><td>PASS</td><td>已安装,satisfied:true</td></tr><tr><td>help</td><td>PASS</td></tr></tbody></table>
|
|
675
|
+
<h3>未安装命令(7 个)</h3>
|
|
676
|
+
<table><thead><tr><th>命令</th><th>动作</th><th>结果</th><th>备注</th></tr></thead><tbody><tr><td><code>opm uv</code></td><td>version</td><td>PASS</td><td>未安装,输出空</td></tr><tr><td>installed</td><td>PASS</td><td>false</td></tr><tr><td>registry</td><td>PASS</td><td>ghproxy</td></tr><tr><td>install</td><td><strong>FAIL</strong></td><td>超时——curl 未走代理,无法访问 ghproxy.com</td></tr><tr><td><code>opm python</code></td><td>version</td><td>PASS</td><td>3.9.9(系统 python)</td></tr><tr><td>current</td><td>PASS</td></tr><tr><td>versions</td><td><strong>FAIL</strong></td><td>uv 未安装,预期行为</td></tr><tr><td><code>opm phpenv</code></td><td>version</td><td>PASS</td><td>未安装,输出空</td></tr><tr><td>installed</td><td>PASS</td><td>false</td></tr><tr><td><code>opm php</code></td><td>version</td><td>PASS</td><td>未安装,输出空</td></tr><tr><td>versions</td><td><strong>FAIL</strong></td><td>phpenv 未安装,预期行为</td></tr><tr><td><code>opm composer</code></td><td>version</td><td>PASS</td><td>未安装,输出空</td></tr><tr><td>registry</td><td>PASS</td><td>aliyun</td></tr><tr><td><code>opm bun</code></td><td>version</td><td>PASS</td><td>未安装,输出空</td></tr><tr><td>registry</td><td>PASS</td><td>npmmirror</td></tr><tr><td><code>opm docker</code></td><td>version</td><td>PASS</td><td>未安装,输出空</td></tr><tr><td>installed</td><td>PASS</td><td>false</td></tr><tr><td>registry</td><td>PASS</td><td>huawei</td></tr><tr><td>status</td><td>PASS</td><td>installed:false</td></tr><tr><td>dir</td><td>PASS</td></tr><tr><td>install</td><td><strong>SKIP</strong></td><td>需要网络下载便捷脚本,未测(避免修改系统)</td></tr></tbody></table>
|
|
677
|
+
<h2>三、发现的问题</h2>
|
|
678
|
+
<h3>BUG-1: nvm uninstall 实际执行卸载(严重)</h3>
|
|
679
|
+
<ul><li><strong>现象</strong>: <code>opm nvm uninstall</code> 实际删除了 <code>/root/.nvm</code> 目录,导致 node 不可用</li><li><strong>原因</strong>: <code>ToolManagerGroup._uninstall()</code> 直接调用 <code>cfg.uninstall()</code>,无确认提示</li><li><strong>影响</strong>: 测试环境被破坏,node/nvm 需手动恢复</li><li><strong>建议</strong>: 危险操作(uninstall)应加确认提示,或至少 <code>--force</code> 标志</li></ul>
|
|
680
|
+
<h3>BUG-2: nvm upgrade 对非 git 安装失败</h3>
|
|
681
|
+
<ul><li><strong>现象</strong>: <code>fatal: not a git repository</code></li><li><strong>原因</strong>: nvm 通过非 git 方式安装时,<code>/root/.nvm</code> 不是 git 仓库,<code>git pull</code> 失败</li><li><strong>建议</strong>: 检测 <code>.git</code> 目录存在性,非 git 安装时提示重新 install</li></ul>
|
|
682
|
+
<h3>BUG-3: uv install 不走代理</h3>
|
|
683
|
+
<ul><li><strong>现象</strong>: <code>opm uv install</code> 超时</li><li><strong>原因</strong>: <code>installUv()</code> 中 <code>curl -LsSf "${installUrl}" | sh</code> 未传 <code>-x proxy</code></li><li><strong>影响</strong>: 所有 ToolManagerGroup 的 install 命令(uv/docker/homebrew)在需代理环境均不可用</li><li><strong>建议</strong>: <code>ToolManagerGroup._install()</code> 应将 proxy 传递给 <code>cfg.install(proxy)</code></li></ul>
|
|
684
|
+
<h3>BUG-4: cft versions 镜像不可用</h3>
|
|
685
|
+
<ul><li><strong>现象</strong>: 无法获取版本列表</li><li><strong>原因</strong>: deepbluenet 镜像无 <code>known-good-versions-with-downloads.json</code> 文件</li><li><strong>影响</strong>: <code>opm cft versions</code> 和 <code>opm cft install</code> 不可用</li><li><strong>建议</strong>: 切换回 npmmirror 或提供可用的 versions JSON 镜像</li></ul>
|
|
686
|
+
<h3>ISSUE-1: nvm 华为镜像 git clone 失败</h3>
|
|
687
|
+
<ul><li><strong>现象</strong>: <code>https://mirrors.huaweicloud.com/nvm.git</code> 返回 <code>could not determine hash algorithm</code></li><li><strong>原因</strong>: 华为镜像可能不提供 nvm 的 git 仓库</li><li><strong>影响</strong>: <code>opm nvm install</code> 使用此 URL 会失败</li><li><strong>建议</strong>: 改用 gitee 镜像或官方 GitHub URL</li></ul>
|
|
688
|
+
<h2>四、测试统计</h2>
|
|
689
|
+
<table><thead><tr><th>分类</th><th>数量</th></tr></thead><tbody><tr><td>总测试命令</td><td>16</td></tr><tr><td>PASS</td><td>12</td></tr><tr><td>FAIL(bug)</td><td>3(nvm upgrade, uv install, cft versions)</td></tr><tr><td>WARN</td><td>1(nvm uninstall 无确认)</td></tr><tr><td>SKIP</td><td>1(docker install)</td></tr><tr><td>预期 FAIL(依赖未安装)</td><td>2(python/php versions)</td></tr></tbody></table>
|
|
690
|
+
<h2>五、修复建议优先级</h2>
|
|
691
|
+
<p>1. <strong>P0</strong>: nvm uninstall 加确认提示(避免误删)</p>
|
|
692
|
+
<p>2. <strong>P0</strong>: ToolManagerGroup install 命令传 proxy</p>
|
|
693
|
+
<p>3. <strong>P1</strong>: nvm upgrade 检测 git 仓库</p>
|
|
694
|
+
<p>4. <strong>P1</strong>: nvm 华为镜像 URL 修正</p>
|
|
695
|
+
<p>5. <strong>P2</strong>: cft versions 镜像可用性</p></div>
|
|
553
696
|
</div>
|
|
554
697
|
</div>
|
|
555
698
|
<script>
|
|
@@ -6,36 +6,67 @@
|
|
|
6
6
|
|
|
7
7
|
| 统一命令 | 原始命令 | 说明 |
|
|
8
8
|
|---------|---------|------|
|
|
9
|
+
| `opm opencode version` | `npm list -g opencode-ai` | 已安装版本 |
|
|
10
|
+
| `opm opencode installed` | — | 检查是否已安装 |
|
|
11
|
+
| `opm opencode install` | `npm install -g opencode-ai` | 安装(使用 opm npm 镜像 + proxy) |
|
|
12
|
+
| `opm opencode uninstall` | `npm uninstall -g opencode-ai` | 卸载 |
|
|
13
|
+
| `opm opencode upgrade` | `npm install -g opencode-ai@latest` | 升级(使用 opm npm 镜像 + proxy) |
|
|
14
|
+
| `opm opencode config` | — | 显示 opencode 配置文件内容 |
|
|
15
|
+
| `opm opencode dir` | — | 显示 data/db/log/config 路径 |
|
|
16
|
+
| `opm opencode env` | — | 显示 harness 环境变量(OPENCODE_CONFIG_DIR / OPENCODE_CONFIG_CONTENT) |
|
|
17
|
+
| `opm opencode open [-d <dir>]` | `opencode` | 在指定目录启动 TUI(默认 cwd),自动注入环境变量 |
|
|
9
18
|
| `opm opencode clear` | — | 清理 opencode 会话并 VACUUM 压缩数据库 |
|
|
10
19
|
| `opm opencode clear -d, --days <n>` | — | 保留最近 n 天(对齐本地零点,含今天;默认 `-d 1`) |
|
|
11
20
|
| `opm opencode clear -h, --hours <n>` | — | 保留最近 n 小时(滚动窗口) |
|
|
12
21
|
| `opm opencode clear -n, --num <n>` | — | 保留最新 n 个会话 |
|
|
13
22
|
| `opm opencode clear --dry-run` | — | 仅预览,不修改任何数据 |
|
|
14
23
|
| `opm opencode clear -y` | — | 跳过确认提示 |
|
|
15
|
-
| `opm opencode
|
|
16
|
-
| `opm opencode
|
|
17
|
-
| `opm opencode install` | `npm install -g opencode-ai` | 安装(使用 opm npm 镜像 + proxy) |
|
|
18
|
-
| `opm opencode uninstall` | `npm uninstall -g opencode-ai` | 卸载 |
|
|
19
|
-
| `opm opencode upgrade` | `npm install -g opencode-ai@latest` | 升级(使用 opm npm 镜像 + proxy) |
|
|
20
|
-
| `opm opencode dir` | — | 显示 data/db/log/config 路径 |
|
|
24
|
+
| `opm opencode clear --backup` | — | 删除前备份数据库 |
|
|
25
|
+
| `opm opencode clear --db <path>` | — | 覆盖 opencode 数据库路径 |
|
|
21
26
|
|
|
22
27
|
> `--days` / `--hours` / `--num` 三选一,互斥。
|
|
23
28
|
|
|
29
|
+
## 选项
|
|
30
|
+
|
|
31
|
+
| 选项 | 说明 |
|
|
32
|
+
|------|------|
|
|
33
|
+
| `-p, --proxy <url>` | install/upgrade 时代理(覆盖配置 `proxy.active`) |
|
|
34
|
+
| `-d, --dir <dir>` | open 的工作目录(默认 cwd) |
|
|
35
|
+
| `-h, --help` | 显示帮助 |
|
|
36
|
+
|
|
37
|
+
## 环境变量
|
|
38
|
+
|
|
39
|
+
`opm opencode env` 显示注入 opencode 的环境变量,来源为 opm 配置 `opencode.env` 段 + 系统环境变量(系统环境变量优先):
|
|
40
|
+
|
|
41
|
+
| 变量 | 默认值 | 说明 |
|
|
42
|
+
|------|--------|------|
|
|
43
|
+
| `OPENCODE_CONFIG_DIR` | `{pkg:@wwkit/harness}` | opencode 配置目录(动态解析为已安装的 @wwkit/harness 包目录) |
|
|
44
|
+
| `OPENCODE_CONFIG_CONTENT` | `""` | opencode 配置内容注入(非空时覆盖配置文件) |
|
|
45
|
+
|
|
24
46
|
## 实现说明
|
|
25
47
|
|
|
26
48
|
- `src/harnesses/opencode/db.js` — 数据目录 / DB / 日志路径
|
|
27
49
|
- `src/harnesses/opencode/sqlite.js` — 跨平台 SQLite 驱动(Node >= 22.5 内置 `node:sqlite`,否则回退 sqlite3 CLI)
|
|
28
50
|
- `src/harnesses/opencode/clear.js` — 清理流程(保留策略计算 + 删除 + VACUUM)
|
|
29
|
-
- `src/harnesses/base.js` — `HarnessGroup` 统一命令组基类(version/install/uninstall/upgrade/config/clear/dir)
|
|
51
|
+
- `src/harnesses/base.js` — `HarnessGroup` 统一命令组基类(version/installed/install/uninstall/upgrade/config/clear/dir/env/open)
|
|
30
52
|
|
|
31
53
|
## 示例
|
|
32
54
|
|
|
33
55
|
```bash
|
|
34
|
-
opm opencode
|
|
35
|
-
opm opencode
|
|
36
|
-
opm opencode
|
|
37
|
-
opm opencode
|
|
38
|
-
opm opencode
|
|
39
|
-
opm opencode
|
|
40
|
-
opm opencode
|
|
41
|
-
|
|
56
|
+
opm opencode version # 查看已安装版本
|
|
57
|
+
opm opencode installed # 检查是否已安装
|
|
58
|
+
opm opencode install # 安装 opencode
|
|
59
|
+
opm opencode upgrade # 升级到最新
|
|
60
|
+
opm opencode config # 显示配置文件内容
|
|
61
|
+
opm opencode dir # 查看数据/日志/DB路径
|
|
62
|
+
opm opencode env # 查看环境变量
|
|
63
|
+
opm opencode open # 在当前目录启动 TUI
|
|
64
|
+
opm opencode open -d /path/to/project # 在指定目录启动 TUI
|
|
65
|
+
opm opencode clear # 只保留今天创建的会话
|
|
66
|
+
opm opencode clear -d 7 # 保留最近 7 天会话
|
|
67
|
+
opm opencode clear -h 24 # 保留最近 24 小时会话
|
|
68
|
+
opm opencode clear -n 10 # 保留最新 10 个会话
|
|
69
|
+
opm opencode clear --dry-run # 仅预览
|
|
70
|
+
opm opencode clear -y # 跳过确认直接执行
|
|
71
|
+
opm opencode clear --backup # 删除前备份数据库
|
|
72
|
+
```
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
# opm 真实环境测试报告
|
|
2
|
+
|
|
3
|
+
- **日期**: 2026-09-14
|
|
4
|
+
- **环境**: Linux (openEuler, x86_64)
|
|
5
|
+
- **Node.js**: v22.21.1 (恢复后)
|
|
6
|
+
- **工具**: curl 7.79.1, wget, git, dnf 4.10.0, pip 21.3.1
|
|
7
|
+
- **代理**: http://proxyhm-hk.security.huawei.com:8080 (认证: {env:PROXY_USER}:{env:PROXY_PASSWORD})
|
|
8
|
+
- **网络**: 需通过华为代理访问外网
|
|
9
|
+
|
|
10
|
+
## 一、单元测试
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
node --test tests/
|
|
14
|
+
# tests 228, pass 225, fail 3
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
- **通过**: 225
|
|
18
|
+
- **失败**: 3(均为 pip 网络测试,依赖 pypi.org 直连,非本次改动引入)
|
|
19
|
+
- **修复**: cft.test.js 配置 active 不匹配(`npmmirror` → 动态断言)
|
|
20
|
+
|
|
21
|
+
## 二、真实环境命令测试
|
|
22
|
+
|
|
23
|
+
### 已安装命令(9 个)
|
|
24
|
+
|
|
25
|
+
| 命令 | 动作 | 结果 | 备注 |
|
|
26
|
+
|------|------|------|------|
|
|
27
|
+
| `opm npm` | version | PASS | 10.8.2 |
|
|
28
|
+
| | registry | PASS | npmmirror |
|
|
29
|
+
| | installed | PASS | |
|
|
30
|
+
| | search | PASS | 通过代理查询 axios |
|
|
31
|
+
| | info | PASS | |
|
|
32
|
+
| | list | PASS | |
|
|
33
|
+
| | outdated -g | PASS | |
|
|
34
|
+
| | registry set | PASS | 切换 huawei 后恢复 |
|
|
35
|
+
| `opm pip` | version | PASS | 21.3.1 |
|
|
36
|
+
| | registry | PASS | tsinghua |
|
|
37
|
+
| | search | PASS | 通过代理查询 requests |
|
|
38
|
+
| | list | PASS | |
|
|
39
|
+
| | registry set | PASS | |
|
|
40
|
+
| `opm dnf` | version | PASS | 4.10.0 |
|
|
41
|
+
| | registry | PASS | hce |
|
|
42
|
+
| | search | PASS | curl 返回 exists:false(HCE 源无此包,预期行为) |
|
|
43
|
+
| `opm node` | version | PASS | 20.20.2 |
|
|
44
|
+
| | current | PASS | v20.20.2 |
|
|
45
|
+
| | list | PASS | |
|
|
46
|
+
| | versions | PASS | 通过代理获取远程版本列表 |
|
|
47
|
+
| | use | PASS | |
|
|
48
|
+
| `opm nvm` | version | PASS | 0.40.4 |
|
|
49
|
+
| | installed | PASS | |
|
|
50
|
+
| | registry | PASS | huawei |
|
|
51
|
+
| | dir | PASS | /root/.nvm |
|
|
52
|
+
| | upgrade | **FAIL** | `/root/.nvm` 非 git 仓库(git clone 安装的才支持 upgrade) |
|
|
53
|
+
| | uninstall | **WARN** | 实际执行了卸载,删除了 `/root/.nvm`,导致 node 不可用 |
|
|
54
|
+
| `opm config` | (full) | PASS | |
|
|
55
|
+
| | proxy | PASS | 显示 huawei 代理 + active |
|
|
56
|
+
| `opm ping` | host | PASS | |
|
|
57
|
+
| | proxy | PASS | 通过代理访问 npm registry 验证可用性 |
|
|
58
|
+
| | registry | PASS | 16/16 全部 reachable:true |
|
|
59
|
+
| | source | PASS | 打印 curl 示例命令 |
|
|
60
|
+
| `opm cft` | version | PASS | 未安装,输出空 |
|
|
61
|
+
| | dir | PASS | |
|
|
62
|
+
| | list | PASS | |
|
|
63
|
+
| | status | PASS | |
|
|
64
|
+
| | versions | **FAIL** | deepbluenet 镜像无 versions JSON 文件 |
|
|
65
|
+
| `opm ensure` | node | PASS | 已安装,satisfied:true |
|
|
66
|
+
| | help | PASS | |
|
|
67
|
+
|
|
68
|
+
### 未安装命令(7 个)
|
|
69
|
+
|
|
70
|
+
| 命令 | 动作 | 结果 | 备注 |
|
|
71
|
+
|------|------|------|------|
|
|
72
|
+
| `opm uv` | version | PASS | 未安装,输出空 |
|
|
73
|
+
| | installed | PASS | false |
|
|
74
|
+
| | registry | PASS | ghproxy |
|
|
75
|
+
| | install | **FAIL** | 超时——curl 未走代理,无法访问 ghproxy.com |
|
|
76
|
+
| `opm python` | version | PASS | 3.9.9(系统 python) |
|
|
77
|
+
| | current | PASS | |
|
|
78
|
+
| | versions | **FAIL** | uv 未安装,预期行为 |
|
|
79
|
+
| `opm phpenv` | version | PASS | 未安装,输出空 |
|
|
80
|
+
| | installed | PASS | false |
|
|
81
|
+
| `opm php` | version | PASS | 未安装,输出空 |
|
|
82
|
+
| | versions | **FAIL** | phpenv 未安装,预期行为 |
|
|
83
|
+
| `opm composer` | version | PASS | 未安装,输出空 |
|
|
84
|
+
| | registry | PASS | aliyun |
|
|
85
|
+
| `opm bun` | version | PASS | 未安装,输出空 |
|
|
86
|
+
| | registry | PASS | npmmirror |
|
|
87
|
+
| `opm docker` | version | PASS | 未安装,输出空 |
|
|
88
|
+
| | installed | PASS | false |
|
|
89
|
+
| | registry | PASS | huawei |
|
|
90
|
+
| | status | PASS | installed:false |
|
|
91
|
+
| | dir | PASS | |
|
|
92
|
+
| | install | **SKIP** | 需要网络下载便捷脚本,未测(避免修改系统) |
|
|
93
|
+
|
|
94
|
+
## 三、发现的问题
|
|
95
|
+
|
|
96
|
+
### BUG-1: nvm uninstall 实际执行卸载(严重)
|
|
97
|
+
|
|
98
|
+
- **现象**: `opm nvm uninstall` 实际删除了 `/root/.nvm` 目录,导致 node 不可用
|
|
99
|
+
- **原因**: `ToolManagerGroup._uninstall()` 直接调用 `cfg.uninstall()`,无确认提示
|
|
100
|
+
- **影响**: 测试环境被破坏,node/nvm 需手动恢复
|
|
101
|
+
- **建议**: 危险操作(uninstall)应加确认提示,或至少 `--force` 标志
|
|
102
|
+
|
|
103
|
+
### BUG-2: nvm upgrade 对非 git 安装失败
|
|
104
|
+
|
|
105
|
+
- **现象**: `fatal: not a git repository`
|
|
106
|
+
- **原因**: nvm 通过非 git 方式安装时,`/root/.nvm` 不是 git 仓库,`git pull` 失败
|
|
107
|
+
- **建议**: 检测 `.git` 目录存在性,非 git 安装时提示重新 install
|
|
108
|
+
|
|
109
|
+
### BUG-3: uv install 不走代理
|
|
110
|
+
|
|
111
|
+
- **现象**: `opm uv install` 超时
|
|
112
|
+
- **原因**: `installUv()` 中 `curl -LsSf "${installUrl}" | sh` 未传 `-x proxy`
|
|
113
|
+
- **影响**: 所有 ToolManagerGroup 的 install 命令(uv/docker/homebrew)在需代理环境均不可用
|
|
114
|
+
- **建议**: `ToolManagerGroup._install()` 应将 proxy 传递给 `cfg.install(proxy)`
|
|
115
|
+
|
|
116
|
+
### BUG-4: cft versions 镜像不可用
|
|
117
|
+
|
|
118
|
+
- **现象**: 无法获取版本列表
|
|
119
|
+
- **原因**: deepbluenet 镜像无 `known-good-versions-with-downloads.json` 文件
|
|
120
|
+
- **影响**: `opm cft versions` 和 `opm cft install` 不可用
|
|
121
|
+
- **建议**: 切换回 npmmirror 或提供可用的 versions JSON 镜像
|
|
122
|
+
|
|
123
|
+
### ISSUE-1: nvm 华为镜像 git clone 失败
|
|
124
|
+
|
|
125
|
+
- **现象**: `https://mirrors.huaweicloud.com/nvm.git` 返回 `could not determine hash algorithm`
|
|
126
|
+
- **原因**: 华为镜像可能不提供 nvm 的 git 仓库
|
|
127
|
+
- **影响**: `opm nvm install` 使用此 URL 会失败
|
|
128
|
+
- **建议**: 改用 gitee 镜像或官方 GitHub URL
|
|
129
|
+
|
|
130
|
+
## 四、测试统计
|
|
131
|
+
|
|
132
|
+
| 分类 | 数量 |
|
|
133
|
+
|------|------|
|
|
134
|
+
| 总测试命令 | 16 |
|
|
135
|
+
| PASS | 12 |
|
|
136
|
+
| FAIL(bug) | 3(nvm upgrade, uv install, cft versions) |
|
|
137
|
+
| WARN | 1(nvm uninstall 无确认) |
|
|
138
|
+
| SKIP | 1(docker install) |
|
|
139
|
+
| 预期 FAIL(依赖未安装) | 2(python/php versions) |
|
|
140
|
+
|
|
141
|
+
## 五、修复建议优先级
|
|
142
|
+
|
|
143
|
+
1. **P0**: nvm uninstall 加确认提示(避免误删)
|
|
144
|
+
2. **P0**: ToolManagerGroup install 命令传 proxy
|
|
145
|
+
3. **P1**: nvm upgrade 检测 git 仓库
|
|
146
|
+
4. **P1**: nvm 华为镜像 URL 修正
|
|
147
|
+
5. **P2**: cft versions 镜像可用性
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wwkit/opm",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.4",
|
|
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",
|
|
@@ -34,7 +34,8 @@
|
|
|
34
34
|
"dependencies": {
|
|
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.7"
|
|
38
39
|
},
|
|
39
40
|
"publishConfig": {
|
|
40
41
|
"registry": "https://registry.npmjs.org/",
|
package/src/cli/groups/docker.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* docker 命令组 — 管理 Docker 自身与 daemon
|
|
3
3
|
*
|
|
4
|
-
* 继承 ToolManagerGroup 复用 version/installed/install/upgrade/uninstall/dir,
|
|
4
|
+
* 继承 ToolManagerGroup 复用 version/installed/registry/install/upgrade/uninstall/dir,
|
|
5
5
|
* 额外增加 status/start/stop/restart/open。
|
|
6
|
-
* 跨平台:Linux
|
|
6
|
+
* 跨平台:Linux 用便捷脚本(URL 由 docker.registry.active 提供),macOS 用 brew cask,Windows 走 WSL2。
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import { ToolManagerGroup } from './version-manager.js'
|
|
@@ -28,7 +28,6 @@ export class DockerGroup extends ToolManagerGroup {
|
|
|
28
28
|
super({
|
|
29
29
|
name: 'docker',
|
|
30
30
|
desc: 'Docker manager (install/upgrade/start/stop/open)',
|
|
31
|
-
hasRegistry: false,
|
|
32
31
|
isInstalled: () => isDockerInstalled(),
|
|
33
32
|
getPath: () => getDockerDir(),
|
|
34
33
|
versionCmd: () => 'docker --version',
|
|
@@ -36,14 +35,17 @@ export class DockerGroup extends ToolManagerGroup {
|
|
|
36
35
|
const m = out.match(/Docker version\s+(\S+)/)
|
|
37
36
|
return m ? m[1] : out.trim()
|
|
38
37
|
},
|
|
39
|
-
install: () => installDocker(),
|
|
38
|
+
install: (proxy) => installDocker(proxy),
|
|
40
39
|
upgrade: () => upgradeDocker(),
|
|
41
40
|
uninstall: () => uninstallDocker(),
|
|
42
41
|
usage: 'opm docker <action> [options]',
|
|
43
42
|
actions: [
|
|
44
43
|
['version', 'Show Docker version'],
|
|
45
44
|
['installed', 'Check if Docker is installed'],
|
|
46
|
-
['
|
|
45
|
+
['registry', 'Show active Docker install script URL (from opm config)'],
|
|
46
|
+
['registry set <url|preset>', 'Set active Docker install script URL (writes opm config)'],
|
|
47
|
+
['registry presets', 'List available mirror presets'],
|
|
48
|
+
['install', 'Install Docker (Linux: script from active registry, macOS: brew cask, Windows: WSL2)'],
|
|
47
49
|
['upgrade', 'Upgrade Docker'],
|
|
48
50
|
['uninstall', 'Uninstall Docker'],
|
|
49
51
|
['dir', 'Show Docker data directory'],
|
|
@@ -57,6 +59,9 @@ export class DockerGroup extends ToolManagerGroup {
|
|
|
57
59
|
examples: [
|
|
58
60
|
'opm docker version',
|
|
59
61
|
'opm docker installed',
|
|
62
|
+
'opm docker registry',
|
|
63
|
+
'opm docker registry set official',
|
|
64
|
+
'opm docker registry presets',
|
|
60
65
|
'opm docker install',
|
|
61
66
|
'opm docker upgrade',
|
|
62
67
|
'opm docker status',
|