Files
wehub-resource-sync 5dab37cb35
CI / Validate agent files (push) Has been cancelled
Sync to Gitee / sync (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:44:34 +08:00

467 lines
21 KiB
PowerShell
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# install.ps1 — 将智能体安装到本地 AI 工具中(Windows 版)
#
# 读取 integrations/ 中的转换文件,复制到各工具的配置目录。
# 请先运行 scripts\convert.ps1 生成集成文件。
#
# 用法:
# .\scripts\install.ps1 [-Tool <名称>] [-Help]
#
# 支持的工具:
# claude-code — 复制到 %USERPROFILE%\.claude\agents\
# copilot — 复制到 %USERPROFILE%\.github\agents\ 和 .copilot\agents\
# antigravity — 复制到 %USERPROFILE%\.gemini\antigravity\skills\
# gemini-cli — 安装到 %USERPROFILE%\.gemini\extensions\agency-agents\
# opencode — 复制到 .opencode\agents\(当前目录)
# cursor — 复制到 .cursor\rules\(当前目录)
# trae — 复制到 .trae\rules\(当前目录)
# aider — 复制 CONVENTIONS.md(当前目录)
# windsurf — 复制 .windsurfrules(当前目录)
# openclaw — 复制到 %USERPROFILE%\.openclaw\agency-agents\
# qwen — 复制到 .qwen\agents\(项目级)
# codex — 复制到 .codex\agents\(项目级)
# deerflow — 复制到 DeerFlow custom skills 目录(项目级)
# workbuddy — 复制到 %USERPROFILE%\.workbuddy\skills\(全局)
# hermes — 复制到 %USERPROFILE%\.hermes\skills\(全局)
# kiro — 复制到 %USERPROFILE%\.kiro\agents\(全局)
# all — 安装所有已检测到的工具(默认)
#
# Hermes 专属参数:
# -Category <名称[,名称...]> 只安装某一分类下的 skills,可传多个分类。
# Discord 模式下 Hermes 会把每个 skill 注册为斜杠命令,
# 总 JSON 超过 8000 字符会被 Discord API 拒绝 (error 50035)
# 若需要在 Discord 中使用建议按分类分批安装。
param(
[string]$Tool = "all",
[string[]]$Category = @(),
[switch]$Help
)
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
# --- 路径 ---
$ScriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$RepoRoot = Split-Path -Parent $ScriptDir
$Integrations = Join-Path $RepoRoot "integrations"
$Home_ = $env:USERPROFILE
$AllTools = @(
"claude-code","copilot","antigravity","gemini-cli","opencode","openclaw",
"cursor","trae","aider","windsurf","qwen","codex","deerflow","workbuddy","hermes","kiro"
)
# --- 颜色输出 ---
function Write-OK { param($msg) Write-Host "[OK] $msg" -ForegroundColor Green }
function Write-Warn { param($msg) Write-Host "[!!] $msg" -ForegroundColor Yellow }
function Write-Err { param($msg) Write-Host "[ERR] $msg" -ForegroundColor Red }
function Write-Header { param($msg) Write-Host "`n$msg" -ForegroundColor White }
function Write-Dim { param($msg) Write-Host " $msg" -ForegroundColor DarkGray }
# --- 用法 ---
if ($Help) {
Get-Content $MyInvocation.MyCommand.Path | Select-Object -Skip 2 -First 22 |
ForEach-Object { $_ -replace '^# ?','' }
exit 0
}
# --- 检测 integrations/ ---
function Check-Integrations {
if (-not (Test-Path $Integrations)) {
Write-Err "integrations\ 不存在。请先运行 .\scripts\convert.ps1"
exit 1
}
}
# --- 工具检测 ---
function Detect-Tool {
param([string]$ToolName)
switch ($ToolName) {
"claude-code" { Test-Path (Join-Path $Home_ ".claude") }
"copilot" { (Get-Command code -ErrorAction SilentlyContinue) -or
(Test-Path (Join-Path $Home_ ".github")) -or
(Test-Path (Join-Path $Home_ ".copilot")) }
"antigravity" { Test-Path (Join-Path $Home_ ".gemini\antigravity\skills") }
"gemini-cli" { (Get-Command gemini -ErrorAction SilentlyContinue) -or
(Test-Path (Join-Path $Home_ ".gemini")) }
"opencode" { (Get-Command opencode -ErrorAction SilentlyContinue) -or
(Test-Path (Join-Path $Home_ ".config\opencode")) }
"cursor" { (Get-Command cursor -ErrorAction SilentlyContinue) -or
(Test-Path (Join-Path $Home_ ".cursor")) }
"trae" { (Get-Command trae -ErrorAction SilentlyContinue) -or
(Test-Path (Join-Path $Home_ ".trae")) }
"aider" { Get-Command aider -ErrorAction SilentlyContinue }
"windsurf" { (Get-Command windsurf -ErrorAction SilentlyContinue) -or
(Test-Path (Join-Path $Home_ ".codeium")) }
"openclaw" { (Get-Command openclaw -ErrorAction SilentlyContinue) -or
(Test-Path (Join-Path $Home_ ".openclaw")) }
"qwen" { (Get-Command qwen -ErrorAction SilentlyContinue) -or
(Test-Path (Join-Path $Home_ ".qwen")) }
"codex" { Get-Command codex -ErrorAction SilentlyContinue }
"deerflow" { (Get-Command deerflow -ErrorAction SilentlyContinue) -or
(Test-Path (Join-Path $Home_ ".deerflow")) }
"workbuddy" { (Get-Command workbuddy -ErrorAction SilentlyContinue) -or
(Test-Path (Join-Path $Home_ ".workbuddy")) }
"hermes" { (Get-Command hermes -ErrorAction SilentlyContinue) -or
(Test-Path (Join-Path $Home_ ".hermes")) }
"kiro" { (Get-Command kiro -ErrorAction SilentlyContinue) -or
(Get-Command kiro-cli -ErrorAction SilentlyContinue) -or
(Test-Path (Join-Path $Home_ ".kiro")) }
default { $false }
}
}
function Get-ToolLabel {
param([string]$ToolName)
switch ($ToolName) {
"claude-code" { "Claude Code (%USERPROFILE%\.claude\agents)" }
"copilot" { "Copilot (%USERPROFILE%\.github + .copilot)" }
"antigravity" { "Antigravity (%USERPROFILE%\.gemini\antigravity)" }
"gemini-cli" { "Gemini CLI (gemini 扩展)" }
"opencode" { "OpenCode (.opencode\agents)" }
"openclaw" { "OpenClaw (%USERPROFILE%\.openclaw)" }
"cursor" { "Cursor (.cursor\rules)" }
"trae" { "Trae (.trae\rules)" }
"aider" { "Aider (CONVENTIONS.md)" }
"windsurf" { "Windsurf (.windsurfrules)" }
"qwen" { "Qwen Code (.qwen\agents)" }
"codex" { "Codex CLI (.codex\agents)" }
"deerflow" { "DeerFlow (skills\custom)" }
"workbuddy" { "WorkBuddy (%USERPROFILE%\.workbuddy\skills)" }
"hermes" { "Hermes Agent (%USERPROFILE%\.hermes\skills)" }
"kiro" { "Kiro (%USERPROFILE%\.kiro\agents)" }
default { $ToolName }
}
}
# --- 安装器 ---
function Install-ClaudeCode {
$dest = Join-Path $Home_ ".claude\agents"
New-Item -ItemType Directory -Force -Path $dest | Out-Null
$count = 0
foreach ($dir in @("academic","design","engineering","finance","game-development","hr","legal",
"marketing","paid-media","sales","product","project-management",
"supply-chain","testing","support","spatial-computing","specialized")) {
$dirPath = Join-Path $RepoRoot $dir
if (-not (Test-Path $dirPath)) { continue }
Get-ChildItem -Path $dirPath -Filter "*.md" -Recurse | ForEach-Object {
$firstLine = Get-Content $_.FullName -TotalCount 1
if ($firstLine -eq "---") { Copy-Item $_.FullName -Destination $dest; $count++ }
}
}
Write-OK "Claude Code: $count 个智能体 -> $dest"
}
function Install-Copilot {
$dest1 = Join-Path $Home_ ".github\agents"
$dest2 = Join-Path $Home_ ".copilot\agents"
New-Item -ItemType Directory -Force -Path $dest1 | Out-Null
New-Item -ItemType Directory -Force -Path $dest2 | Out-Null
$count = 0
foreach ($dir in @("academic","design","engineering","finance","game-development","hr","legal",
"marketing","paid-media","sales","product","project-management",
"supply-chain","testing","support","spatial-computing","specialized")) {
$dirPath = Join-Path $RepoRoot $dir
if (-not (Test-Path $dirPath)) { continue }
Get-ChildItem -Path $dirPath -Filter "*.md" -Recurse | ForEach-Object {
$firstLine = Get-Content $_.FullName -TotalCount 1
if ($firstLine -eq "---") {
Copy-Item $_.FullName -Destination $dest1
Copy-Item $_.FullName -Destination $dest2
$count++
}
}
}
Write-OK "Copilot: $count 个智能体 -> $dest1 + $dest2"
}
function Install-Antigravity {
$src = Join-Path $Integrations "antigravity"
$dest = Join-Path $Home_ ".gemini\antigravity\skills"
if (-not (Test-Path $src)) { Write-Err "integrations\antigravity 不存在,请先运行 convert.ps1"; return }
$count = 0
Get-ChildItem -Path $src -Directory | ForEach-Object {
$skillDest = Join-Path $dest $_.Name
New-Item -ItemType Directory -Force -Path $skillDest | Out-Null
Copy-Item (Join-Path $_.FullName "SKILL.md") -Destination $skillDest
$count++
}
Write-OK "Antigravity: $count 个 skills -> $dest"
}
function Install-GeminiCli {
$src = Join-Path $Integrations "gemini-cli"
$dest = Join-Path $Home_ ".gemini\extensions\agency-agents"
if (-not (Test-Path $src)) { Write-Err "integrations\gemini-cli 不存在,请先运行 convert.ps1"; return }
New-Item -ItemType Directory -Force -Path (Join-Path $dest "skills") | Out-Null
Copy-Item (Join-Path $src "gemini-extension.json") -Destination $dest
$count = 0
Get-ChildItem -Path (Join-Path $src "skills") -Directory | ForEach-Object {
$skillDest = Join-Path (Join-Path $dest "skills") $_.Name
New-Item -ItemType Directory -Force -Path $skillDest | Out-Null
Copy-Item (Join-Path $_.FullName "SKILL.md") -Destination $skillDest
$count++
}
Write-OK "Gemini CLI: $count 个 skills -> $dest"
}
function Install-OpenCode {
$src = Join-Path $Integrations "opencode\agents"
$dest = Join-Path (Get-Location) ".opencode\agents"
if (-not (Test-Path $src)) { Write-Err "integrations\opencode 不存在,请先运行 convert.ps1"; return }
New-Item -ItemType Directory -Force -Path $dest | Out-Null
$count = (Get-ChildItem -Path $src -Filter "*.md" | ForEach-Object { Copy-Item $_.FullName -Destination $dest; 1 } | Measure-Object -Sum).Sum
Write-OK "OpenCode: $count 个智能体 -> $dest"
Write-Warn "OpenCode: 项目级安装,请在项目根目录运行。"
}
function Install-OpenClaw {
$src = Join-Path $Integrations "openclaw"
$dest = Join-Path $Home_ ".openclaw\agency-agents"
if (-not (Test-Path $src)) { Write-Err "integrations\openclaw 不存在,请先运行 convert.ps1"; return }
$count = 0
Get-ChildItem -Path $src -Directory | ForEach-Object {
$wsDest = Join-Path $dest $_.Name
New-Item -ItemType Directory -Force -Path $wsDest | Out-Null
Copy-Item (Join-Path $_.FullName "SOUL.md") -Destination $wsDest
Copy-Item (Join-Path $_.FullName "AGENTS.md") -Destination $wsDest
Copy-Item (Join-Path $_.FullName "IDENTITY.md") -Destination $wsDest
# 注册到 openclaw(如果可用)
if (Get-Command openclaw -ErrorAction SilentlyContinue) {
$existing = & openclaw agents list 2>$null
if ($existing -notmatch $_.Name) {
& openclaw agents add $_.Name --workspace $wsDest --non-interactive 2>$null
} else {
Write-Dim "跳过已注册: $($_.Name)"
}
}
$count++
}
Write-OK "OpenClaw: $count 个工作空间 -> $dest"
if (Get-Command openclaw -ErrorAction SilentlyContinue) {
Write-Warn "OpenClaw: 运行 'openclaw gateway restart' 激活新智能体"
}
}
function Install-Cursor {
$src = Join-Path $Integrations "cursor\rules"
$dest = Join-Path (Get-Location) ".cursor\rules"
if (-not (Test-Path $src)) { Write-Err "integrations\cursor 不存在,请先运行 convert.ps1"; return }
New-Item -ItemType Directory -Force -Path $dest | Out-Null
$count = (Get-ChildItem -Path $src -Filter "*.mdc" | ForEach-Object { Copy-Item $_.FullName -Destination $dest; 1 } | Measure-Object -Sum).Sum
Write-OK "Cursor: $count 个规则 -> $dest"
Write-Warn "Cursor: 项目级安装,请在项目根目录运行。"
}
function Install-Trae {
$src = Join-Path $Integrations "trae\rules"
$dest = Join-Path (Get-Location) ".trae\rules"
if (-not (Test-Path $src)) { Write-Err "integrations\trae 不存在,请先运行 convert.ps1"; return }
New-Item -ItemType Directory -Force -Path $dest | Out-Null
$count = (Get-ChildItem -Path $src -Filter "*.md" | ForEach-Object { Copy-Item $_.FullName -Destination $dest; 1 } | Measure-Object -Sum).Sum
Write-OK "Trae: $count 个规则 -> $dest"
Write-Warn "Trae: 项目级安装,请在项目根目录运行。"
}
function Install-Aider {
$src = Join-Path $Integrations "aider\CONVENTIONS.md"
$dest = Join-Path (Get-Location) "CONVENTIONS.md"
if (-not (Test-Path $src)) { Write-Err "integrations\aider\CONVENTIONS.md 不存在,请先运行 convert.ps1"; return }
if (Test-Path $dest) { Write-Warn "Aider: CONVENTIONS.md 已存在,删除后重试。"; return }
Copy-Item $src -Destination $dest
Write-OK "Aider: 已安装 -> $dest"
Write-Warn "Aider: 项目级安装,请在项目根目录运行。"
}
function Install-Windsurf {
$src = Join-Path $Integrations "windsurf\.windsurfrules"
$dest = Join-Path (Get-Location) ".windsurfrules"
if (-not (Test-Path $src)) { Write-Err "integrations\windsurf\.windsurfrules 不存在,请先运行 convert.ps1"; return }
if (Test-Path $dest) { Write-Warn "Windsurf: .windsurfrules 已存在,删除后重试。"; return }
Copy-Item $src -Destination $dest
Write-OK "Windsurf: 已安装 -> $dest"
Write-Warn "Windsurf: 项目级安装,请在项目根目录运行。"
}
function Install-Qwen {
$src = Join-Path $Integrations "qwen\agents"
$dest = Join-Path (Get-Location) ".qwen\agents"
if (-not (Test-Path $src)) { Write-Err "integrations\qwen 不存在,请先运行 convert.ps1"; return }
New-Item -ItemType Directory -Force -Path $dest | Out-Null
$count = (Get-ChildItem -Path $src -Filter "*.md" | ForEach-Object { Copy-Item $_.FullName -Destination $dest; 1 } | Measure-Object -Sum).Sum
Write-OK "Qwen Code: $count 个智能体 -> $dest"
Write-Warn "Qwen Code: 项目级安装,请在项目根目录运行。"
}
function Install-Codex {
$src = Join-Path $Integrations "codex\agents"
$dest = Join-Path (Get-Location) ".codex\agents"
if (-not (Test-Path $src)) { Write-Err "integrations\codex 不存在,请先运行 convert.ps1"; return }
New-Item -ItemType Directory -Force -Path $dest | Out-Null
$count = (Get-ChildItem -Path $src -Filter "*.toml" | ForEach-Object { Copy-Item $_.FullName -Destination $dest; 1 } | Measure-Object -Sum).Sum
Write-OK "Codex CLI: $count 个智能体 -> $dest"
Write-Warn "Codex CLI: 项目级安装,请在项目根目录运行。"
}
function Install-DeerFlow {
$src = Join-Path $Integrations "deerflow"
$dest = if ($env:DEERFLOW_SKILLS_DIR) { $env:DEERFLOW_SKILLS_DIR } else { Join-Path (Get-Location) "skills\custom" }
if (-not (Test-Path $src)) { Write-Err "integrations\deerflow 不存在,请先运行 convert.ps1"; return }
$count = 0
Get-ChildItem -Path $src -Directory | ForEach-Object {
$skillFile = Join-Path $_.FullName "SKILL.md"
if (Test-Path $skillFile) {
$skillDest = Join-Path $dest $_.Name
New-Item -ItemType Directory -Force -Path $skillDest | Out-Null
Copy-Item $skillFile -Destination $skillDest
$count++
}
}
Write-OK "DeerFlow: $count 个 skills -> $dest"
Write-Warn "DeerFlow: 设置 `$env:DEERFLOW_SKILLS_DIR 可自定义路径。"
}
function Install-WorkBuddy {
$src = Join-Path $Integrations "workbuddy"
$dest = Join-Path $Home_ ".workbuddy\skills"
if (-not (Test-Path $src)) { Write-Err "integrations\workbuddy 不存在,请先运行 convert.ps1 -Tool workbuddy"; return }
$count = 0
Get-ChildItem -Path $src -Directory | ForEach-Object {
$skillFile = Join-Path $_.FullName "SKILL.md"
if (Test-Path $skillFile) {
$skillDest = Join-Path $dest $_.Name
New-Item -ItemType Directory -Force -Path $skillDest | Out-Null
Copy-Item $skillFile -Destination $skillDest
$count++
}
}
Write-OK "WorkBuddy: $count 个 skills -> $dest"
}
function Install-Hermes {
$src = Join-Path $Integrations "hermes"
$dest = Join-Path $Home_ ".hermes\skills"
if (-not (Test-Path $src)) { Write-Err "integrations\hermes 不存在,请先运行 convert.ps1 -Tool hermes"; return }
$filterNote = ""
if ($Category.Count -gt 0) {
foreach ($c in $Category) {
if (-not (Test-Path (Join-Path $src $c))) {
$avail = (Get-ChildItem -Path $src -Directory | ForEach-Object Name) -join ", "
Write-Err "hermes 分类不存在: $c(可选: $avail"
return
}
}
$filterNote = " [分类: $($Category -join ', ')]"
}
$count = 0
# 保留两级目录结构:category/skill-name/SKILL.md
Get-ChildItem -Path $src -Directory | ForEach-Object {
$catName = $_.Name
if ($Category.Count -gt 0 -and ($Category -notcontains $catName)) { return }
Get-ChildItem -Path $_.FullName -Directory | ForEach-Object {
$skillFile = Join-Path $_.FullName "SKILL.md"
if (Test-Path $skillFile) {
$skillDest = Join-Path $dest "$catName\$($_.Name)"
New-Item -ItemType Directory -Force -Path $skillDest | Out-Null
Copy-Item $skillFile -Destination $skillDest
$count++
}
}
}
Write-OK "Hermes Agent: $count 个 skills -> $dest$filterNote"
if ($Category.Count -eq 0 -and $count -gt 80) {
Write-Warn "Hermes Discord 模式对斜杠命令总长有 8000 字符上限(error 50035)。"
Write-Warn "若要在 Discord 中使用,建议用 -Category <名称> 按分类分批安装。"
}
}
function Install-Kiro {
$src = Join-Path $Integrations "kiro"
$dest = Join-Path $Home_ ".kiro\agents"
if (-not (Test-Path $src)) { Write-Err "integrations\kiro 不存在,请先运行 convert.ps1"; return }
New-Item -ItemType Directory -Force -Path $dest | Out-Null
# Kiro 自定义智能体格式:.md 文件(带 YAML frontmatter
# 参考:https://kiro.dev/docs/chat/subagents/
$count = (Get-ChildItem -Path $src -Filter "*.md" | ForEach-Object { Copy-Item $_.FullName -Destination $dest; 1 } | Measure-Object -Sum).Sum
Write-OK "Kiro: $count 个智能体 -> $dest"
Write-Warn "提示: Kiro 会自动识别 ~/.kiro/agents/ 下的 .md 文件作为自定义子智能体"
Write-Warn "提示: 在对话中使用 '/<agent-name>' 或让 Kiro 自动选择合适的子智能体"
}
function Install-Tool {
param([string]$ToolName)
switch ($ToolName) {
"claude-code" { Install-ClaudeCode }
"copilot" { Install-Copilot }
"antigravity" { Install-Antigravity }
"gemini-cli" { Install-GeminiCli }
"opencode" { Install-OpenCode }
"openclaw" { Install-OpenClaw }
"cursor" { Install-Cursor }
"trae" { Install-Trae }
"aider" { Install-Aider }
"windsurf" { Install-Windsurf }
"qwen" { Install-Qwen }
"codex" { Install-Codex }
"deerflow" { Install-DeerFlow }
"workbuddy" { Install-WorkBuddy }
"hermes" { Install-Hermes }
"kiro" { Install-Kiro }
}
}
# --- 入口 ---
Check-Integrations
if ($Category.Count -gt 0 -and $Tool -ne "hermes") {
Write-Warn "-Category 仅对 -Tool hermes 生效,已忽略。"
$Category = @()
}
$selectedTools = @()
if ($Tool -ne "all") {
if ($Tool -notin $AllTools) {
Write-Err "未知工具 '$Tool'。可选: $($AllTools -join ', ')"
exit 1
}
$selectedTools = @($Tool)
} else {
Write-Header "AI 智能体专家团队 -- 扫描已安装的工具..."
Write-Host ""
foreach ($t in $AllTools) {
if (Detect-Tool $t) {
$selectedTools += $t
Write-Host " [*] $(Get-ToolLabel $t) 已检测到" -ForegroundColor Green
} else {
Write-Host " [ ] $(Get-ToolLabel $t) 未找到" -ForegroundColor DarkGray
}
}
}
if ($selectedTools.Count -eq 0) {
Write-Warn "未选择或检测到任何工具。"
Write-Dim "提示: 使用 -Tool <名称> 强制安装指定工具。"
Write-Dim "可选: $($AllTools -join ', ')"
exit 0
}
Write-Host ""
Write-Header "AI 智能体专家团队 -- 安装智能体"
Write-Host " 仓库: $RepoRoot"
Write-Host " 安装到: $($selectedTools -join ', ')"
Write-Host ""
foreach ($t in $selectedTools) {
Install-Tool $t
}
Write-Host ""
Write-OK "完成!已安装 $($selectedTools.Count) 个工具。"
Write-Host ""
Write-Dim "运行 .\scripts\convert.ps1 重新生成集成文件。"
Write-Host ""