| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118 |
- # OpenClaw Skill Deploy Script v1.3.0
- # Flatten 41 skills into ~/.openclaw/skills/
- # 批量将voc技能部署在龙虾skills目录下脚本
- # 需要将.openclaw的路径更换后使用
- # Usage:
- # .\deploy-to-openclaw.ps1 -DryRun # Preview only
- # .\deploy-to-openclaw.ps1 # Actual deploy
- # .\deploy-to-openclaw.ps1 -SkillsRoot "D:\custom\skills"
- param(
- [string]$SkillsRoot = "$env:USERPROFILE\.openclaw\skills",
- [string]$SourceRoot = $PSScriptRoot,
- [switch]$DryRun
- )
- $ErrorActionPreference = "Stop"
- $categories = @(
- "voc",
- "social-media",
- "competitor-analysis",
- "review-analysis",
- "synthesis",
- "social-voc",
- "douyin"
- )
- Write-Host "========================================"
- Write-Host " OpenClaw Skill Deploy v1.3.0"
- Write-Host "========================================"
- Write-Host ""
- Write-Host "Source: $SourceRoot"
- Write-Host "Target: $SkillsRoot"
- if ($DryRun) { Write-Host "[DRY RUN] Preview only, no files copied" -ForegroundColor Yellow }
- Write-Host ""
- if (-not $DryRun) {
- if (-not (Test-Path $SkillsRoot)) {
- New-Item -ItemType Directory -Path $SkillsRoot -Force | Out-Null
- Write-Host "Created target dir: $SkillsRoot" -ForegroundColor Green
- }
- }
- $deployed = 0
- $skipped = 0
- $errors = 0
- foreach ($cat in $categories) {
- $catPath = Join-Path $SourceRoot $cat
- if (-not (Test-Path $catPath)) {
- Write-Host "SKIP category (not found): $cat" -ForegroundColor DarkGray
- continue
- }
- Write-Host "--- $cat ---" -ForegroundColor Cyan
- $skillDirs = Get-ChildItem -Directory -Path $catPath
- foreach ($skillDir in $skillDirs) {
- $skillName = $skillDir.Name
- $skillMd = Join-Path $skillDir.FullName "SKILL.md"
- $apiConfig = Join-Path $skillDir.FullName "api-config.json"
- if (-not (Test-Path $skillMd)) {
- Write-Host " [SKIP] $skillName - missing SKILL.md" -ForegroundColor DarkYellow
- $skipped++
- continue
- }
- if (-not (Test-Path $apiConfig)) {
- Write-Host " [SKIP] $skillName - missing api-config.json" -ForegroundColor DarkYellow
- $skipped++
- continue
- }
- $mdContent = Get-Content $skillMd -Raw -Encoding UTF8
- if ($mdContent -notmatch "^---\s*\r?\n") {
- Write-Host " [WARN] $skillName - SKILL.md missing YAML frontmatter" -ForegroundColor Yellow
- }
- try {
- $null = Get-Content $apiConfig -Raw -Encoding UTF8 | ConvertFrom-Json
- } catch {
- Write-Host " [ERROR] $skillName - invalid JSON in api-config.json" -ForegroundColor Red
- $errors++
- continue
- }
- $destDir = Join-Path $SkillsRoot $skillName
- if ($DryRun) {
- $tag = if (Test-Path $destDir) { "UPDATE" } else { "NEW" }
- Write-Host " [$tag] $skillName" -ForegroundColor White
- } else {
- if (Test-Path $destDir) {
- Remove-Item -Recurse -Force $destDir
- }
- New-Item -ItemType Directory -Path $destDir -Force | Out-Null
- Get-ChildItem -File -Path $skillDir.FullName | ForEach-Object {
- Copy-Item $_.FullName -Destination $destDir
- }
- Write-Host " [OK] $skillName" -ForegroundColor Green
- }
- $deployed++
- }
- }
- Write-Host ""
- Write-Host "========================================"
- Write-Host " Result: $deployed deployed, $skipped skipped, $errors errors"
- Write-Host "========================================"
- if ($DryRun) {
- Write-Host "Remove -DryRun to execute actual deployment." -ForegroundColor Yellow
- } else {
- Write-Host "Done! Refresh OpenClaw skill list to verify." -ForegroundColor Green
- Write-Host " openclaw skills list"
- }
|