diff --git a/scripts/install.ps1 b/scripts/install.ps1 index 18eb065..729633e 100644 --- a/scripts/install.ps1 +++ b/scripts/install.ps1 @@ -1,11 +1,15 @@ # Install skills// into ~\.claude\skills\\ (or $env:CLAUDE_SKILLS_DIR) -# Usage: install.ps1 [-Names ,] (no args = all) +# Usage: install.ps1 [-Names ,] [-Prune] +# no args = install all skills/* into target +# -Prune = after install, remove target// dirs that are NOT in skills/* +# (prune always scans full target, ignores -Names filter — it's a global cleanup) # # PowerShell port of install.sh — same behavior, native cmdlets, no bash dependency. [CmdletBinding()] param( - [string[]]$Names = @() + [string[]]$Names = @(), + [switch]$Prune ) $ErrorActionPreference = 'Stop' @@ -44,3 +48,14 @@ foreach ($name in $Names) { Copy-Item -Recurse $srcDir $dstDir Write-Host "installed: $name -> $dstDir" } + +if ($Prune) { + $sourceNames = @(Get-ChildItem -Path $src -Directory | Select-Object -ExpandProperty Name) + $installedDirs = Get-ChildItem -Path $target -Directory -ErrorAction SilentlyContinue + foreach ($dir in $installedDirs) { + if ($sourceNames -notcontains $dir.Name) { + Write-Host "pruning: $($dir.Name) (not in skills/) -> $($dir.FullName)" + Remove-Item -Recurse -Force $dir.FullName + } + } +} diff --git a/scripts/install.sh b/scripts/install.sh index 4117b87..55b807c 100644 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -1,13 +1,25 @@ #!/usr/bin/env bash # Install skills// into ~/.claude/skills// (or $CLAUDE_SKILLS_DIR) -# Usage: install.sh [name...] (no args = all) +# Usage: install.sh [--prune] [name...] +# no args = install all skills/* into target +# --prune = after install, remove target// dirs that are NOT in skills/* +# (prune always scans full target, ignores name filter — global cleanup) set -euo pipefail ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" SRC="$ROOT/skills" TARGET="${CLAUDE_SKILLS_DIR:-$HOME/.claude/skills}" -if [ "$#" -eq 0 ]; then +prune=0 +positional=() +for arg in "$@"; do + case "$arg" in + --prune) prune=1 ;; + *) positional+=("$arg") ;; + esac +done + +if [ "${#positional[@]}" -eq 0 ]; then # Portable across bash 3.2 (stock macOS) and bash 4+ (Linux, git-bash): # avoid `mapfile` (bash 4+) and `find -printf` (GNU find only). names=() @@ -18,7 +30,7 @@ if [ "$#" -eq 0 ]; then IFS=$'\n' names=($(printf '%s\n' "${names[@]}" | sort)) unset IFS else - names=("$@") + names=("${positional[@]}") fi mkdir -p "$TARGET" @@ -38,3 +50,14 @@ for name in "${names[@]}"; do cp -R "$src_dir" "$dst_dir" echo "installed: $name → $dst_dir" done + +if [ "$prune" -eq 1 ]; then + for d in "$TARGET"/*/; do + [ -d "$d" ] || continue + name="$(basename "$d")" + if [ ! -d "$SRC/$name" ]; then + echo "pruning: $name (not in skills/) → $d" + rm -rf "$d" + fi + done +fi