-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathinstall.sh
More file actions
executable file
·106 lines (92 loc) · 2.95 KB
/
install.sh
File metadata and controls
executable file
·106 lines (92 loc) · 2.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#!/usr/bin/env bash
# install.sh — Install Claude Code rules, agents, and skills.
#
# Usage:
# ./install.sh <language> [<language> ...]
# ./install.sh --all
#
# Examples:
# ./install.sh golang
# ./install.sh golang java terraform
# ./install.sh --all
#
# Installs to ~/.claude/:
# - rules/common/ (always)
# - rules/<lang>/ (per requested language, or all with --all)
# - agents/ (always)
# - skills/ (always, preserving subdirectory structure)
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
RULES_DIR="$SCRIPT_DIR/rules"
AGENTS_DIR="$SCRIPT_DIR/agents"
SKILLS_DIR="$SCRIPT_DIR/skills"
# Collect available languages (subdirs of rules/ excluding common)
available_languages=()
for dir in "$RULES_DIR"/*/; do
name="$(basename "$dir")"
[[ "$name" == "common" ]] && continue
available_languages+=("$name")
done
# --- Parse arguments ---
ALL=false
LANGUAGES=()
for arg in "$@"; do
if [[ "$arg" == "--all" ]]; then
ALL=true
else
LANGUAGES+=("$arg")
fi
done
if [[ "$ALL" == true ]]; then
LANGUAGES=("${available_languages[@]}")
fi
# --- Usage ---
if [[ ${#LANGUAGES[@]} -eq 0 ]]; then
echo "Usage: $0 <language> [<language> ...] [--all]"
echo ""
echo "Available languages:"
for lang in "${available_languages[@]}"; do
echo " - $lang"
done
exit 1
fi
DEST_DIR="$HOME/.claude/rules"
# Warn if destination already exists (user may have local customizations)
if [[ -d "$DEST_DIR" ]] && [[ "$(ls -A "$DEST_DIR" 2>/dev/null)" ]]; then
echo "Note: $DEST_DIR/ already exists. Existing files will be overwritten."
echo " Back up any local customizations before proceeding."
fi
# --- Install common rules ---
echo "Installing common rules -> $DEST_DIR/common/"
mkdir -p "$DEST_DIR/common"
cp -r "$RULES_DIR/common/." "$DEST_DIR/common/"
# --- Install each requested language ---
for lang in "${LANGUAGES[@]}"; do
# Validate language name to prevent path traversal
if [[ ! "$lang" =~ ^[a-zA-Z0-9_-]+$ ]]; then
echo "Error: invalid language name '$lang'. Only alphanumeric, dash, and underscore allowed." >&2
continue
fi
lang_dir="$RULES_DIR/$lang"
if [[ ! -d "$lang_dir" ]]; then
echo "Warning: rules/$lang/ does not exist, skipping." >&2
continue
fi
echo "Installing $lang rules -> $DEST_DIR/$lang/"
mkdir -p "$DEST_DIR/$lang"
cp -r "$lang_dir/." "$DEST_DIR/$lang/"
done
# --- Install agents ---
AGENTS_DEST="$HOME/.claude/agents"
echo "Installing agents -> $AGENTS_DEST/"
mkdir -p "$AGENTS_DEST"
cp "$AGENTS_DIR"/*.md "$AGENTS_DEST/"
# --- Install skills (preserve subdirectory structure) ---
SKILLS_DEST="$HOME/.claude/skills"
echo "Installing skills -> $SKILLS_DEST/"
for skill_dir in "$SKILLS_DIR"/*/; do
skill_name="$(basename "$skill_dir")"
mkdir -p "$SKILLS_DEST/$skill_name"
cp "$skill_dir"SKILL.md "$SKILLS_DEST/$skill_name/"
done
echo "Done. Installed to ~/.claude/ (rules, agents, skills)."