- 新增 install.ps1(与 install.sh 功能对等) - 着陆页 Step 1 加 macOS/Linux 和 Windows Tab 切换 - SVG 图标美化 Tab 按钮
171 lines
7.5 KiB
PowerShell
171 lines
7.5 KiB
PowerShell
# 黑手党提案 Agent — Windows 一键安装/更新脚本 (PowerShell)
|
||
# 用法: irm https://git.brainwork.club/lidf/chanpinhsd/archive/main.zip -OutFile $env:TEMP\mafia.zip; Expand-Archive $env:TEMP\mafia.zip $env:TEMP\mafia -Force; & $env:TEMP\mafia\chanpinhsd\agent\install.ps1
|
||
|
||
$ErrorActionPreference = "Stop"
|
||
|
||
function Write-Info($msg) { Write-Host "[mafia] $msg" -ForegroundColor Green }
|
||
function Write-Warn($msg) { Write-Host "[mafia] $msg" -ForegroundColor Yellow }
|
||
function Write-Err($msg) { Write-Host "[mafia] $msg" -ForegroundColor Red; exit 1 }
|
||
|
||
$COPAW_HOME = if ($env:COPAW_HOME) { $env:COPAW_HOME } else { Join-Path $env:USERPROFILE ".copaw" }
|
||
$AGENT_ID = "mafia-expert"
|
||
$WORKSPACE_DIR = Join-Path $COPAW_HOME "workspaces\$AGENT_ID"
|
||
$SCRIPT_DIR = Split-Path -Parent $MyInvocation.MyCommand.Path
|
||
|
||
# ── 检查 CoPaw ────────────────────────────────────────────────────────
|
||
if (-not (Test-Path (Join-Path $COPAW_HOME "config.json"))) {
|
||
Write-Err "CoPaw 未安装。请先安装 CoPaw 桌面客户端:https://copaw.agentscope.io"
|
||
}
|
||
Write-Info "CoPaw 已就绪"
|
||
|
||
# ── 创建工作区 ─────────────────────────────────────────────────────────
|
||
Write-Info "配置 $AGENT_ID 工作区..."
|
||
$dirs = @("skills", "cases", "iteration_reports", "memory")
|
||
foreach ($d in $dirs) {
|
||
$p = Join-Path $WORKSPACE_DIR $d
|
||
if (-not (Test-Path $p)) { New-Item -ItemType Directory -Path $p -Force | Out-Null }
|
||
}
|
||
|
||
# ── 核心配置 ───────────────────────────────────────────────────────────
|
||
$coreFiles = @("AGENTS.md", "SOUL.md", "PROFILE.md", "HEARTBEAT.md", "agent.json")
|
||
foreach ($f in $coreFiles) {
|
||
$src = Join-Path $SCRIPT_DIR $f
|
||
if (Test-Path $src) { Copy-Item $src (Join-Path $WORKSPACE_DIR $f) -Force }
|
||
}
|
||
|
||
# MEMORY.md 只在首次创建
|
||
$memPath = Join-Path $WORKSPACE_DIR "MEMORY.md"
|
||
if (-not (Test-Path $memPath)) {
|
||
$memSrc = Join-Path $SCRIPT_DIR "MEMORY.md"
|
||
if (Test-Path $memSrc) { Copy-Item $memSrc $memPath }
|
||
else { Set-Content $memPath "# 黑手党提案专家长期记忆" -Encoding UTF8 }
|
||
}
|
||
|
||
# ── Skills(每次全量覆盖) ─────────────────────────────────────────────
|
||
$skillsSrc = Join-Path $SCRIPT_DIR "skills"
|
||
if (Test-Path $skillsSrc) {
|
||
Get-ChildItem $skillsSrc -Directory | ForEach-Object {
|
||
if ($_.Name -eq "mafia_agent_installer") { return }
|
||
$target = Join-Path $WORKSPACE_DIR "skills\$($_.Name)"
|
||
if (-not (Test-Path $target)) { New-Item -ItemType Directory -Path $target -Force | Out-Null }
|
||
Copy-Item "$($_.FullName)\*" $target -Force -Recurse 2>$null
|
||
}
|
||
}
|
||
|
||
Write-Info "文件复制完成"
|
||
|
||
# ── 合并 skill.json ────────────────────────────────────────────────────
|
||
Write-Info "注册自定义 Skills..."
|
||
$wsSkillJson = Join-Path $WORKSPACE_DIR "skill.json"
|
||
$repoSkillJson = Join-Path $SCRIPT_DIR "skill.json"
|
||
|
||
$pyScript = @"
|
||
import json, os, time
|
||
|
||
ws_skill = r'$wsSkillJson'
|
||
repo_skill = r'$repoSkillJson'
|
||
|
||
if os.path.exists(ws_skill):
|
||
with open(ws_skill, encoding='utf-8') as f:
|
||
manifest = json.load(f)
|
||
else:
|
||
manifest = {'schema_version': 'workspace-skill-manifest.v1', 'version': 0, 'skills': {}}
|
||
|
||
if os.path.exists(repo_skill):
|
||
with open(repo_skill, encoding='utf-8') as f:
|
||
repo = json.load(f)
|
||
for name, skill_cfg in repo.get('skills', {}).items():
|
||
manifest['skills'][name] = skill_cfg
|
||
print(f' + {name}')
|
||
|
||
skills_dir = os.path.join(r'$WORKSPACE_DIR', 'skills')
|
||
if os.path.isdir(skills_dir):
|
||
for d in os.listdir(skills_dir):
|
||
if d.startswith('.'):
|
||
continue
|
||
skill_md = os.path.join(skills_dir, d, 'SKILL.md')
|
||
if os.path.exists(skill_md) and d not in manifest['skills']:
|
||
manifest['skills'][d] = {
|
||
'enabled': True,
|
||
'channels': ['all'],
|
||
'source': 'customized',
|
||
'metadata': {
|
||
'name': d,
|
||
'description': '',
|
||
'version_text': '1.0.0',
|
||
'source': 'customized',
|
||
'protected': False,
|
||
'requirements': {'require_bins': [], 'require_envs': []},
|
||
},
|
||
'requirements': {'require_bins': [], 'require_envs': []},
|
||
}
|
||
print(f' + {d} (from dir)')
|
||
|
||
manifest['version'] = int(time.time() * 1000)
|
||
with open(ws_skill, 'w', encoding='utf-8') as f:
|
||
json.dump(manifest, f, indent=2, ensure_ascii=False)
|
||
print(' skills done')
|
||
"@
|
||
|
||
python3 -c $pyScript 2>$null
|
||
if ($LASTEXITCODE -ne 0) { python -c $pyScript }
|
||
|
||
# ── 注册到 config.json ─────────────────────────────────────────────────
|
||
Write-Info "注册 Agent..."
|
||
$regScript = @"
|
||
import json, os
|
||
|
||
config_path = os.path.join(r'$COPAW_HOME', 'config.json')
|
||
with open(config_path, 'r', encoding='utf-8') as f:
|
||
cfg = json.load(f)
|
||
|
||
agent_id = '$AGENT_ID'
|
||
ws_dir = r'$WORKSPACE_DIR'
|
||
changed = False
|
||
|
||
if agent_id not in cfg['agents']['profiles']:
|
||
cfg['agents']['profiles'][agent_id] = {
|
||
'id': agent_id,
|
||
'workspace_dir': ws_dir,
|
||
'enabled': True
|
||
}
|
||
changed = True
|
||
|
||
if agent_id not in cfg['agents']['agent_order']:
|
||
cfg['agents']['agent_order'].append(agent_id)
|
||
changed = True
|
||
|
||
if changed:
|
||
with open(config_path, 'w', encoding='utf-8') as f:
|
||
json.dump(cfg, f, indent=2, ensure_ascii=False)
|
||
print(' registered')
|
||
else:
|
||
print(' already registered')
|
||
"@
|
||
|
||
python3 -c $regScript 2>$null
|
||
if ($LASTEXITCODE -ne 0) { python -c $regScript }
|
||
|
||
# ── 记录来源 ───────────────────────────────────────────────────────────
|
||
$repoDir = Split-Path -Parent $SCRIPT_DIR
|
||
Set-Content (Join-Path $WORKSPACE_DIR ".repo_path") $repoDir -Encoding UTF8
|
||
|
||
# ── 清理临时文件 ───────────────────────────────────────────────────────
|
||
if ($SCRIPT_DIR -like "$env:TEMP*") {
|
||
Write-Info "清理临时文件..."
|
||
Remove-Item $repoDir -Recurse -Force -ErrorAction SilentlyContinue
|
||
}
|
||
|
||
# ── 完成 ───────────────────────────────────────────────────────────────
|
||
Write-Host ""
|
||
Write-Info "════════════════════════════════════════════════"
|
||
Write-Info " ✅ 黑手党提案专家 安装/更新完成!"
|
||
Write-Info "════════════════════════════════════════════════"
|
||
Write-Host ""
|
||
Write-Info "下一步:"
|
||
Write-Info " 1. 打开 CoPaw 客户端"
|
||
Write-Info " 2. 刷新页面(Ctrl+R / F5)"
|
||
Write-Info " 3. 左上角切换到「黑手党提案专家」"
|
||
Write-Info " 4. 发送:我想为 XX 品牌做一个黑手党提案"
|
||
Write-Host ""
|