fix(install): npm-cli.js path + CONTRIBUTING/PR template

install.sh: bundled Node 的 INSTALL_NPM 之前指向 bin/npm shell wrapper,
通过 \"node npm\" 调用会失败。改为 lib/node_modules/npm/bin/npm-cli.js,
并加 run_npm() 帮助函数区分系统 Node(用 npm 可执行)和 bundled Node。

install.ps1: 系统 Node 场景下 npm-cli.js 路径推导脆弱。改为按候选路径
依次试探,找不到则直接退到 npm.cmd。

新增 CONTRIBUTING.md + .github/PULL_REQUEST_TEMPLATE.md,规范 PR 流程,
减少空白/无说明 PR(对应 issue PR #36)。

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
hfshfg
2026-05-01 15:41:42 +08:00
parent b6ba958b79
commit b0a9cb3f58
4 changed files with 241 additions and 10 deletions

View File

@@ -93,12 +93,18 @@ if ($sysNode) {
if ($major -ge 20) {
Write-Green " [OK] System Node.js $sysVer found, reusing"
$INSTALL_NODE = "node"
$npmCmd = (Get-Command npm -ErrorAction SilentlyContinue).Source
$npmRoot = Split-Path (Split-Path $npmCmd)
$NPM_CLI = "$npmRoot\node_modules\npm\bin\npm-cli.js"
if (-not (Test-Path $NPM_CLI)) {
$npmPrefix = & node -e "console.log(process.execPath.replace(/[\\\/]node\.exe$/i,''))" 2>$null
$NPM_CLI = "$npmPrefix\node_modules\npm\bin\npm-cli.js"
# Resolve npm-cli.js next to node.exe; fall back to npm.cmd as a launcher.
$nodeExeDir = Split-Path $sysNode.Source -Parent
$candidates = @(
"$nodeExeDir\node_modules\npm\bin\npm-cli.js",
"$env:APPDATA\npm\node_modules\npm\bin\npm-cli.js",
"$env:ProgramFiles\nodejs\node_modules\npm\bin\npm-cli.js"
)
$NPM_CLI = $null
foreach ($p in $candidates) { if (Test-Path $p) { $NPM_CLI = $p; break } }
if (-not $NPM_CLI) {
# Last resort: use npm.cmd directly (don't pass through node.exe)
$NPM_CLI = (Get-Command npm -ErrorAction SilentlyContinue).Source
}
$USE_SYSTEM_NODE = $true
}

View File

@@ -121,7 +121,7 @@ if [ "$USE_SYSTEM_NODE" = "false" ]; then
if [ -f "$NODE_INSTALL_DIR/bin/node" ]; then
echo -e " ${GREEN}${NC} Node.js 已存在,跳过下载"
INSTALL_NODE="$NODE_INSTALL_DIR/bin/node"
INSTALL_NPM="$NODE_INSTALL_DIR/bin/npm"
INSTALL_NPM="$NODE_INSTALL_DIR/bin/npm-cli.js"
else
echo -e " ${CYAN}${NC} 从国内镜像下载 Node.js $NODE_VERSION ($PLATFORM)..."
TARBALL="node-${NODE_VERSION}-${PLATFORM}.tar.gz"
@@ -144,7 +144,7 @@ if [ "$USE_SYSTEM_NODE" = "false" ]; then
if [ -f "$NODE_INSTALL_DIR/bin/node" ]; then
echo -e " ${GREEN}${NC} Node.js 安装完成"
INSTALL_NODE="$NODE_INSTALL_DIR/bin/node"
INSTALL_NPM="$NODE_INSTALL_DIR/bin/npm"
INSTALL_NPM="$NODE_INSTALL_DIR/lib/node_modules/npm/bin/npm-cli.js"
else
echo -e " ${RED}✗ Node.js 下载失败${NC}"
exit 1
@@ -152,6 +152,16 @@ if [ "$USE_SYSTEM_NODE" = "false" ]; then
fi
fi
# Helper: invoke npm. For bundled Node we have npm-cli.js (run via node).
# For system Node, INSTALL_NPM is the npm shell wrapper (executable).
run_npm() {
if [ "$USE_SYSTEM_NODE" = "true" ]; then
"$INSTALL_NPM" "$@"
else
"$INSTALL_NODE" "$INSTALL_NPM" "$@"
fi
}
echo ""
# ============================================================
@@ -176,7 +186,7 @@ PKGJSON
fi
echo -e " ${CYAN}${NC} 从国内镜像安装..."
"$INSTALL_NODE" "$INSTALL_NPM" install --prefix "$CORE_DIR" --registry="$MIRROR" 2>&1 | tail -5
run_npm install --prefix "$CORE_DIR" --registry="$MIRROR" 2>&1 | tail -5
echo -e " ${GREEN}${NC} OpenClaw 安装完成"
fi
@@ -191,7 +201,7 @@ if [ -d "$CORE_DIR/node_modules/@sliverp/qqbot" ]; then
echo -e " ${GREEN}${NC} QQ 插件已安装,跳过"
else
echo -e " ${CYAN}${NC} 安装 QQ 插件..."
"$INSTALL_NODE" "$INSTALL_NPM" install @sliverp/qqbot@latest --prefix "$CORE_DIR" --registry="$MIRROR" 2>/dev/null || {
run_npm install @sliverp/qqbot@latest --prefix "$CORE_DIR" --registry="$MIRROR" 2>/dev/null || {
echo -e " ${YELLOW}${NC} QQ 插件安装失败(不影响主功能)"
}
if [ -d "$CORE_DIR/node_modules/@sliverp/qqbot" ]; then