Merge branch 'master' of ssh://git.joywaygames.cn:2222/joywaygamess/server-deploy
This commit is contained in:
@@ -24,4 +24,4 @@ rtk gain --history # Per-command savings history
|
|||||||
rtk discover # Find missed rtk opportunities
|
rtk discover # Find missed rtk opportunities
|
||||||
rtk proxy <cmd> # Run raw (no filtering) but track usage
|
rtk proxy <cmd> # Run raw (no filtering) but track usage
|
||||||
```
|
```
|
||||||
<!-- /rtk-instructions -->
|
<!-- /rtk-instructions -->
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
# =============================================================
|
||||||
|
# Claude Dev Stack 配置文件
|
||||||
|
# 复制为 .env 并按需填写
|
||||||
|
# =============================================================
|
||||||
|
|
||||||
|
# ── Claude / API 配置 ────────────────────────────────────────
|
||||||
|
# 推荐:灵眸 AI(国内直连,无需代理)https://docs.lmuai.com/docs/tools/claude-code
|
||||||
|
ANTHROPIC_AUTH_TOKEN=sk-ccaf8169bce7c735dfa1f021ec326b3904842dfd50e1ae817c3417017e0d8ee0
|
||||||
|
ANTHROPIC_BASE_URL=https://api.lmuai.com
|
||||||
|
|
||||||
|
# 备选:Anthropic 官方 API Key(海外直连)
|
||||||
|
# ANTHROPIC_API_KEY=
|
||||||
|
# ANTHROPIC_BASE_URL=https://api.anthropic.com
|
||||||
|
|
||||||
|
# 备选:DeepSeek 兼容接口
|
||||||
|
# ANTHROPIC_API_KEY=
|
||||||
|
# ANTHROPIC_BASE_URL=https://api.deepseek.com/anthropic
|
||||||
|
|
||||||
|
# 默认使用的模型
|
||||||
|
# 灵眸可选:claude-opus-4-7 | claude-sonnet-4-6 | claude-sonnet-4-5 | claude-haiku-4-5
|
||||||
|
# DeepSeek可选:deepseek-v4-pro
|
||||||
|
CLAUDE_MODEL=claude-sonnet-4-6
|
||||||
|
|
||||||
|
# ── WSL2 ────────────────────────────────────────────────────
|
||||||
|
# WSL2 发行版名称(wsl --list 查看已安装发行版)
|
||||||
|
WSL_DISTRO=Ubuntu
|
||||||
|
|
||||||
|
# 设为 true 可跳过 WSL2 安装步骤(已安装时使用)
|
||||||
|
SKIP_WSL_INSTALL=false
|
||||||
|
|
||||||
|
# ── Unity MCP ───────────────────────────────────────────────
|
||||||
|
# unity-mcp-server 自动克隆至 WSL2 ~/.mcp-servers/unity-mcp-server/
|
||||||
|
# Unity Plugin 需手动通过 Package Manager 安装:
|
||||||
|
# https://github.com/AnkleBreaker-Studio/unity-mcp-plugin.git
|
||||||
|
# (无需额外配置)
|
||||||
|
|
||||||
|
# ── Rust / Token Killer ──────────────────────────────────────
|
||||||
|
# (暂无需配置,预留扩展用)
|
||||||
|
# CARGO_REGISTRY_MIRROR=https://rsproxy.cn/
|
||||||
|
|
||||||
|
# ── Docker 镜像加速(可选)──────────────────────────────────
|
||||||
|
# 若 WSL2 内需要 Docker,可配置国内加速镜像(逗号分隔)
|
||||||
|
# DOCKER_REGISTRY_MIRRORS=https://docker.m.daocloud.io,https://hub-mirror.c.163.com
|
||||||
@@ -85,12 +85,12 @@ gh auth login
|
|||||||
|
|
||||||
`deploy.ps1` 自动写入以下客户端的 MCP 配置:
|
`deploy.ps1` 自动写入以下客户端的 MCP 配置:
|
||||||
|
|
||||||
| 客户端 | 配置文件 |
|
| 客户端 | 配置文件 / 方式 |
|
||||||
|--------|---------|
|
|--------|----------------|
|
||||||
| Claude Desktop | `%APPDATA%\Claude\claude_desktop_config.json` |
|
| Claude Desktop | `%APPDATA%\Claude\claude_desktop_config.json`(`mcpServers` 格式) |
|
||||||
| Cursor | `%USERPROFILE%\.cursor\mcp.json` |
|
| Cursor | `%USERPROFILE%\.cursor\mcp.json`(`mcpServers` 格式) |
|
||||||
| Windsurf | `%APPDATA%\Windsurf\mcp_config.json` |
|
| Windsurf | `%APPDATA%\Windsurf\mcp_config.json`(`mcpServers` 格式) |
|
||||||
| VS Code | `%APPDATA%\Code\User\mcp.json` |
|
| **VS Code Copilot Agent** | `%APPDATA%\Code\User\settings.json` → `mcp.servers`(VS Code 专用格式) |
|
||||||
| Claude Code CLI | `claude mcp add --scope user`(写入用户级 MCP) |
|
| Claude Code CLI | `claude mcp add --scope user`(写入用户级 MCP) |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
@@ -103,13 +103,18 @@ function Refresh-Path {
|
|||||||
# ──────────────────────────────────────────────────────────────
|
# ──────────────────────────────────────────────────────────────
|
||||||
function Install-Winget {
|
function Install-Winget {
|
||||||
param([string]$Id, [string]$DisplayName)
|
param([string]$Id, [string]$DisplayName)
|
||||||
$wg = Get-Command winget -ErrorAction SilentlyContinue
|
# pwsh (Core) 里 winget 不在 PATH,尝试固定路径
|
||||||
if (-not $wg) {
|
$wgPath = (Get-Command winget -ErrorAction SilentlyContinue)?.Source
|
||||||
|
if (-not $wgPath) {
|
||||||
|
$wgPath = "$env:LOCALAPPDATA\Microsoft\WindowsApps\winget.exe"
|
||||||
|
if (-not (Test-Path $wgPath)) { $wgPath = $null }
|
||||||
|
}
|
||||||
|
if (-not $wgPath) {
|
||||||
Write-Warn "未找到 winget,请手动安装 $DisplayName"
|
Write-Warn "未找到 winget,请手动安装 $DisplayName"
|
||||||
return $false
|
return $false
|
||||||
}
|
}
|
||||||
Write-Info "winget install $Id ..."
|
Write-Info "winget install $Id ..."
|
||||||
winget install --id $Id --silent --accept-source-agreements --accept-package-agreements 2>&1 | Out-Null
|
& $wgPath install --id $Id --silent --accept-source-agreements --accept-package-agreements 2>&1 | Out-Null
|
||||||
Refresh-Path
|
Refresh-Path
|
||||||
return $true
|
return $true
|
||||||
}
|
}
|
||||||
@@ -150,6 +155,50 @@ function Merge-McpConfig {
|
|||||||
Write-OK "$Label -> $ConfigFile"
|
Write-OK "$Label -> $ConfigFile"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# ──────────────────────────────────────────────────────────────
|
||||||
|
# 辅助:写入 VS Code settings.json 中的 mcp.servers(VS Code 专用格式)
|
||||||
|
# VS Code Copilot Agent 读取 settings.json -> "mcp" -> "servers"
|
||||||
|
# 而非 mcp.json 中的 "mcpServers"(那是 Claude Desktop / Cursor 格式)
|
||||||
|
# ──────────────────────────────────────────────────────────────
|
||||||
|
function Merge-VsCodeMcpSettings {
|
||||||
|
param(
|
||||||
|
[string] $ServerName,
|
||||||
|
[hashtable] $Entry,
|
||||||
|
[string] $Label
|
||||||
|
)
|
||||||
|
$settingsFile = "$env:APPDATA\Code\User\settings.json"
|
||||||
|
$dir = Split-Path $settingsFile
|
||||||
|
if (-not (Test-Path $dir)) { New-Item -ItemType Directory -Path $dir -Force | Out-Null }
|
||||||
|
|
||||||
|
function ConvertTo-OrderedHashtable($obj) {
|
||||||
|
if ($obj -is [System.Management.Automation.PSCustomObject]) {
|
||||||
|
$h = [ordered]@{}
|
||||||
|
foreach ($p in $obj.PSObject.Properties) { $h[$p.Name] = ConvertTo-OrderedHashtable $p.Value }
|
||||||
|
return $h
|
||||||
|
} elseif ($obj -is [System.Collections.IEnumerable] -and $obj -isnot [string]) {
|
||||||
|
return @($obj | ForEach-Object { ConvertTo-OrderedHashtable $_ })
|
||||||
|
}
|
||||||
|
return $obj
|
||||||
|
}
|
||||||
|
|
||||||
|
$cfg = [ordered]@{}
|
||||||
|
if (Test-Path $settingsFile) {
|
||||||
|
try {
|
||||||
|
$raw = Get-Content $settingsFile -Raw | ConvertFrom-Json
|
||||||
|
$cfg = ConvertTo-OrderedHashtable $raw
|
||||||
|
} catch {
|
||||||
|
Write-Warn "settings.json 解析失败,将新建 mcp 节点:$_"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-not $cfg.ContainsKey("mcp")) { $cfg["mcp"] = [ordered]@{} }
|
||||||
|
if (-not $cfg["mcp"].ContainsKey("servers")) { $cfg["mcp"]["servers"] = [ordered]@{} }
|
||||||
|
$cfg["mcp"]["servers"][$ServerName] = $Entry
|
||||||
|
|
||||||
|
$cfg | ConvertTo-Json -Depth 15 | Set-Content $settingsFile -Encoding UTF8
|
||||||
|
Write-OK "$Label -> $settingsFile [mcp.servers.$ServerName]"
|
||||||
|
}
|
||||||
|
|
||||||
# ══════════════════════════════════════════════════════════════
|
# ══════════════════════════════════════════════════════════════
|
||||||
# Step 1: Node.js LTS
|
# Step 1: Node.js LTS
|
||||||
# ══════════════════════════════════════════════════════════════
|
# ══════════════════════════════════════════════════════════════
|
||||||
@@ -445,7 +494,7 @@ if ($unityEntry) {
|
|||||||
Merge-McpConfig "$env:USERPROFILE\.cursor\mcp.json" $unityMcpEntry "Cursor"
|
Merge-McpConfig "$env:USERPROFILE\.cursor\mcp.json" $unityMcpEntry "Cursor"
|
||||||
$wsDirC = if (Test-Path "$env:APPDATA\Windsurf") { "$env:APPDATA\Windsurf" } else { "$env:USERPROFILE\.codeium\windsurf" }
|
$wsDirC = if (Test-Path "$env:APPDATA\Windsurf") { "$env:APPDATA\Windsurf" } else { "$env:USERPROFILE\.codeium\windsurf" }
|
||||||
Merge-McpConfig "$wsDirC\mcp_config.json" $unityMcpEntry "Windsurf"
|
Merge-McpConfig "$wsDirC\mcp_config.json" $unityMcpEntry "Windsurf"
|
||||||
Merge-McpConfig "$env:APPDATA\Code\User\mcp.json" $unityMcpEntry "VS Code"
|
Merge-VsCodeMcpSettings "unity-mcp" $unityMcpEntry "VS Code Copilot Agent (Unity MCP)"
|
||||||
# Claude Code CLI(Windows)
|
# Claude Code CLI(Windows)
|
||||||
if (Get-Command claude -ErrorAction SilentlyContinue) {
|
if (Get-Command claude -ErrorAction SilentlyContinue) {
|
||||||
& claude mcp remove unity-mcp --scope user 2>&1 | Out-Null
|
& claude mcp remove unity-mcp --scope user 2>&1 | Out-Null
|
||||||
@@ -493,7 +542,7 @@ if (-not (Test-Path $godotSrcDir)) {
|
|||||||
Merge-McpConfig "$env:USERPROFILE\.cursor\mcp.json" $godotMcpEntry "Cursor (Godot)" "godot-mcp-pro"
|
Merge-McpConfig "$env:USERPROFILE\.cursor\mcp.json" $godotMcpEntry "Cursor (Godot)" "godot-mcp-pro"
|
||||||
$wsDirG = if (Test-Path "$env:APPDATA\Windsurf") { "$env:APPDATA\Windsurf" } else { "$env:USERPROFILE\.codeium\windsurf" }
|
$wsDirG = if (Test-Path "$env:APPDATA\Windsurf") { "$env:APPDATA\Windsurf" } else { "$env:USERPROFILE\.codeium\windsurf" }
|
||||||
Merge-McpConfig "$wsDirG\mcp_config.json" $godotMcpEntry "Windsurf (Godot)" "godot-mcp-pro"
|
Merge-McpConfig "$wsDirG\mcp_config.json" $godotMcpEntry "Windsurf (Godot)" "godot-mcp-pro"
|
||||||
Merge-McpConfig "$env:APPDATA\Code\User\mcp.json" $godotMcpEntry "VS Code (Godot)" "godot-mcp-pro"
|
Merge-VsCodeMcpSettings "godot-mcp-pro" $godotMcpEntry "VS Code Copilot Agent (Godot MCP Pro)"
|
||||||
if (Get-Command claude -ErrorAction SilentlyContinue) {
|
if (Get-Command claude -ErrorAction SilentlyContinue) {
|
||||||
& claude mcp remove godot-mcp-pro --scope user 2>&1 | Out-Null
|
& claude mcp remove godot-mcp-pro --scope user 2>&1 | Out-Null
|
||||||
& claude mcp add --scope user godot-mcp-pro node $godotEntry 2>&1 | Out-Null
|
& claude mcp add --scope user godot-mcp-pro node $godotEntry 2>&1 | Out-Null
|
||||||
@@ -576,7 +625,12 @@ if ($cargoCmd) {
|
|||||||
Write-OK "Rust 已安装: $($rustcVer.Trim())"
|
Write-OK "Rust 已安装: $($rustcVer.Trim())"
|
||||||
} else {
|
} else {
|
||||||
# 检查 winget 是否已记录安装(避免重复安装时阻塞)
|
# 检查 winget 是否已记录安装(避免重复安装时阻塞)
|
||||||
$wgList = winget list --id Rustlang.Rustup --accept-source-agreements 2>&1 | Out-String
|
$wgPath = (Get-Command winget -ErrorAction SilentlyContinue)?.Source
|
||||||
|
if (-not $wgPath) {
|
||||||
|
$fallback = "$env:LOCALAPPDATA\Microsoft\WindowsApps\winget.exe"
|
||||||
|
if (Test-Path $fallback) { $wgPath = $fallback }
|
||||||
|
}
|
||||||
|
$wgList = if ($wgPath) { & $wgPath list --id Rustlang.Rustup --accept-source-agreements 2>&1 | Out-String } else { "" }
|
||||||
if ($wgList -match "Rustlang.Rustup") {
|
if ($wgList -match "Rustlang.Rustup") {
|
||||||
Write-Info "rustup 已安装,但当前会话 PATH 未更新。已将 $cargoBin 加入 PATH"
|
Write-Info "rustup 已安装,但当前会话 PATH 未更新。已将 $cargoBin 加入 PATH"
|
||||||
# rustup 首次运行会初始化 stable 工具链
|
# rustup 首次运行会初始化 stable 工具链
|
||||||
@@ -586,14 +640,16 @@ if ($cargoCmd) {
|
|||||||
} else {
|
} else {
|
||||||
Write-Info "通过 winget 安装 Rust (rustup)..."
|
Write-Info "通过 winget 安装 Rust (rustup)..."
|
||||||
$ok = Install-Winget "Rustlang.Rustup" "Rustup"
|
$ok = Install-Winget "Rustlang.Rustup" "Rustup"
|
||||||
if (Test-Path $cargoBin) { $env:Path = "$cargoBin;$env:Path" }
|
if ($ok) {
|
||||||
Refresh-Path
|
if (Test-Path $cargoBin) { $env:Path = "$cargoBin;$env:Path" }
|
||||||
$cargoCmd = Get-Command cargo -ErrorAction SilentlyContinue
|
Refresh-Path
|
||||||
if ($cargoCmd) {
|
$cargoCmd = Get-Command cargo -ErrorAction SilentlyContinue
|
||||||
Write-OK "Rust 安装完成: $(& rustc --version 2>&1)"
|
if ($cargoCmd) {
|
||||||
} else {
|
Write-OK "Rust 安装完成: $(& rustc --version 2>&1)"
|
||||||
Write-Warn "Rust 安装后未找到 cargo,请关闭并重开终端后继续"
|
} else {
|
||||||
Write-Warn " 或手动安装:https://rustup.rs"
|
Write-Warn "Rust 安装后未找到 cargo,请关闭并重开终端后继续"
|
||||||
|
Write-Warn " 或手动安装:https://rustup.rs"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user