feat: add interactive skill selection to setup scripts and initialize default rules
This commit is contained in:
+166
@@ -0,0 +1,166 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Target directory defaults to .cursor/rules in the current working directory,
|
||||
# but can be overridden by passing an argument.
|
||||
TARGET_DIR="${1:-.cursor/rules}"
|
||||
|
||||
# Base URL for raw github files
|
||||
BASE_URL="https://raw.githubusercontent.com/addyosmani/agent-skills/main/skills"
|
||||
|
||||
# Array of all 24 skills in the repository
|
||||
SKILLS=(
|
||||
"api-and-interface-design"
|
||||
"browser-testing-with-devtools"
|
||||
"ci-cd-and-automation"
|
||||
"code-review-and-quality"
|
||||
"code-simplification"
|
||||
"context-engineering"
|
||||
"debugging-and-error-recovery"
|
||||
"deprecation-and-migration"
|
||||
"documentation-and-adrs"
|
||||
"doubt-driven-development"
|
||||
"frontend-ui-engineering"
|
||||
"git-workflow-and-versioning"
|
||||
"idea-refine"
|
||||
"incremental-implementation"
|
||||
"interview-me"
|
||||
"observability-and-instrumentation"
|
||||
"performance-optimization"
|
||||
"planning-and-task-breakdown"
|
||||
"security-and-hardening"
|
||||
"shipping-and-launch"
|
||||
"source-driven-development"
|
||||
"spec-driven-development"
|
||||
"test-driven-development"
|
||||
"using-agent-skills"
|
||||
)
|
||||
|
||||
# Helper function to download file
|
||||
download_file() {
|
||||
local url="$1"
|
||||
local dest="$2"
|
||||
|
||||
if command -v curl >/dev/null 2>&1; then
|
||||
curl -sSL -o "$dest" "$url"
|
||||
elif command -v wget >/dev/null 2>&1; then
|
||||
wget -q -O "$dest" "$url"
|
||||
else
|
||||
echo "Error: Neither curl nor wget is installed." >&2
|
||||
return 1
|
||||
fi
|
||||
}
|
||||
|
||||
# Initialize active status array
|
||||
ACTIVE=()
|
||||
for ((i=0; i<${#SKILLS[@]}; i++)); do
|
||||
ACTIVE[i]=0
|
||||
done
|
||||
|
||||
# Auto-detect existing skills in target directory
|
||||
any_exists=false
|
||||
if [ -d "$TARGET_DIR" ]; then
|
||||
for ((i=0; i<${#SKILLS[@]}; i++)); do
|
||||
if [ -f "$TARGET_DIR/${SKILLS[i]}.md" ]; then
|
||||
any_exists=true
|
||||
ACTIVE[i]=1
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# If no skills are currently present, enable the 3 default recommended skills
|
||||
if [ "$any_exists" = false ]; then
|
||||
for ((i=0; i<${#SKILLS[@]}; i++)); do
|
||||
slug="${SKILLS[i]}"
|
||||
if [ "$slug" = "test-driven-development" ] || [ "$slug" = "code-review-and-quality" ] || [ "$slug" = "incremental-implementation" ]; then
|
||||
ACTIVE[i]=1
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
# Interactive selection menu loop
|
||||
while true; do
|
||||
clear
|
||||
echo "===================================================="
|
||||
echo " Cursor Agent-Skills Setup "
|
||||
echo "===================================================="
|
||||
echo "Target Directory: $TARGET_DIR"
|
||||
echo ""
|
||||
echo "Select skills to activate (toggle with number):"
|
||||
echo ""
|
||||
|
||||
for ((i=0; i<${#SKILLS[@]}; i++)); do
|
||||
idx=$((i+1))
|
||||
status="[ ]"
|
||||
if [ "${ACTIVE[i]}" -eq 1 ]; then
|
||||
status="[x]"
|
||||
fi
|
||||
printf "%2d) %s %s\n" "$idx" "$status" "${SKILLS[i]}"
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "Commands:"
|
||||
echo " a - Select ALL skills"
|
||||
echo " n - Select NONE (clear all)"
|
||||
echo " d - Confirm and apply changes (or press Enter)"
|
||||
echo " q - Quit/Cancel without changes"
|
||||
echo ""
|
||||
read -p "Your choice: " choice
|
||||
|
||||
if [ -z "$choice" ] || [ "$choice" = "d" ] || [ "$choice" = "D" ]; then
|
||||
break
|
||||
elif [ "$choice" = "a" ] || [ "$choice" = "A" ]; then
|
||||
for ((i=0; i<${#SKILLS[@]}; i++)); do
|
||||
ACTIVE[i]=1
|
||||
done
|
||||
elif [ "$choice" = "n" ] || [ "$choice" = "N" ]; then
|
||||
for ((i=0; i<${#SKILLS[@]}; i++)); do
|
||||
ACTIVE[i]=0
|
||||
done
|
||||
elif [ "$choice" = "q" ] || [ "$choice" = "Q" ]; then
|
||||
echo "Cancelled. No changes made."
|
||||
exit 0
|
||||
elif [[ "$choice" =~ ^[0-9]+$ ]] && [ "$choice" -ge 1 ] && [ "$choice" -le "${#SKILLS[@]}" ]; then
|
||||
idx=$((choice-1))
|
||||
if [ "${ACTIVE[idx]}" -eq 1 ]; then
|
||||
ACTIVE[idx]=0
|
||||
else
|
||||
ACTIVE[idx]=1
|
||||
fi
|
||||
else
|
||||
echo "Invalid option. Redrawing..."
|
||||
sleep 1
|
||||
fi
|
||||
done
|
||||
|
||||
# Ensure directory exists if needed
|
||||
if [ ! -d "$TARGET_DIR" ]; then
|
||||
echo ""
|
||||
echo "Creating directory: $TARGET_DIR"
|
||||
mkdir -p "$TARGET_DIR"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "Applying changes..."
|
||||
|
||||
for ((i=0; i<${#SKILLS[@]}; i++)); do
|
||||
slug="${SKILLS[i]}"
|
||||
dest_path="$TARGET_DIR/$slug.md"
|
||||
|
||||
if [ "${ACTIVE[i]}" -eq 1 ]; then
|
||||
url="$BASE_URL/$slug/SKILL.md"
|
||||
echo "Downloading $slug..."
|
||||
if download_file "$url" "$dest_path"; then
|
||||
echo "Successfully activated/updated $slug.md"
|
||||
else
|
||||
echo "Failed to download $slug.md"
|
||||
fi
|
||||
else
|
||||
if [ -f "$dest_path" ]; then
|
||||
echo "Deactivating/removing $slug.md..."
|
||||
rm -f "$dest_path"
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
echo ""
|
||||
echo "Done!"
|
||||
Reference in New Issue
Block a user