claude-skills/scripts/install.sh
Pallav46 c97da7e1ee feat(integrations): change Augment from flat rules to skill bundles
- Convert Augment integration from flat .augment/rules/*.md to directory-based .augment/skills/<name>/SKILL.md structure
- Align Augment format with Windsurf and OpenCode skill bundle pattern
- Copy supporting folders (scripts/, references/, templates/) to each Augment skill directory
- Update frontmatter from 'type: auto' to standard 'name' + 'description' fields
- Update README documentation for new directory-based installation path

This change is possible because Augment Code now supports skills in beta, allowing us to move from the flat rules format to full skill bundles. This gives Augment users access to the complete skill ecosystem including Python automation tools and reference documentation, not just the markdown content.
2026-04-25 04:48:41 +05:30

275 lines
5.7 KiB
Bash
Executable file

#!/usr/bin/env bash
# Usage:
# ./scripts/install.sh --tool <name> [--target <dir>] [--force] [--help]
#
# Installs converted skills into the appropriate location.
# --target overrides the default install path.
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
REPO_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)"
TOOL=""
TARGET=""
FORCE=false
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
NC='\033[0m'
ok() {
echo -e "${GREEN}[OK]${NC} $*"
}
warn() {
echo -e "${YELLOW}[!!]${NC} $*"
}
err() {
echo -e "${RED}[ERR]${NC} $*" >&2
}
usage() {
cat <<'USAGE'
Usage:
./scripts/install.sh --tool <name> [--target <dir>] [--force] [--help]
Tools:
antigravity, cursor, aider, kilocode, windsurf, opencode, augment
Examples:
./scripts/install.sh --tool cursor --target /path/to/project
./scripts/install.sh --tool antigravity
./scripts/install.sh --tool aider --force
USAGE
}
is_valid_tool() {
case "$1" in
antigravity|cursor|aider|kilocode|windsurf|opencode|augment) return 0 ;;
*) return 1 ;;
esac
}
confirm_overwrite() {
local prompt="$1"
if $FORCE; then
return 0
fi
printf "%s [y/N]: " "$prompt"
read -r reply
case "$reply" in
y|Y|yes|YES) return 0 ;;
*) return 1 ;;
esac
}
safe_copy_dir_contents() {
local src_dir="$1"
local dst_dir="$2"
mkdir -p "$dst_dir"
cp -R "${src_dir}/." "$dst_dir/"
}
install_antigravity() {
local src_root="${REPO_ROOT}/integrations/antigravity"
local dst_root
if [[ -n "$TARGET" ]]; then
dst_root="$TARGET"
else
dst_root="${HOME}/.gemini/antigravity/skills"
fi
if [[ ! -d "$src_root" ]]; then
err "Missing source directory: $src_root"
err "Run ./scripts/convert.sh --tool antigravity first."
exit 1
fi
mkdir -p "$dst_root"
local count=0
local skill_dir
for skill_dir in "$src_root"/*; do
if [[ ! -d "$skill_dir" ]]; then
continue
fi
if [[ "$(basename "$skill_dir")" == "README.md" ]]; then
continue
fi
local skill_name
skill_name="$(basename "$skill_dir")"
local dst_skill="${dst_root}/${skill_name}"
if [[ -e "$dst_skill" ]]; then
if ! confirm_overwrite "Overwrite existing ${dst_skill}?"; then
warn "Skipped ${dst_skill}"
continue
fi
rm -rf "$dst_skill"
fi
cp -R "$skill_dir" "$dst_skill"
count=$((count + 1))
done
ok "Installed ${count} skill directories to ${dst_root}"
}
install_flat_rules_tool() {
local tool="$1"
local subdir="$2"
local ext="$3"
local src_dir="${REPO_ROOT}/integrations/${tool}/rules"
local base_target="${TARGET:-$PWD}"
local dst_dir="${base_target}/${subdir}"
if [[ ! -d "$src_dir" ]]; then
err "Missing source directory: $src_dir"
err "Run ./scripts/convert.sh --tool ${tool} first."
exit 1
fi
if [[ -d "$dst_dir" ]] && [[ "$(find "$dst_dir" -maxdepth 1 -type f -name "*${ext}" | wc -l | tr -d ' ')" -gt 0 ]]; then
if ! confirm_overwrite "${dst_dir} already contains ${ext} files. Overwrite contents?"; then
warn "Install cancelled for ${tool}"
return
fi
rm -rf "$dst_dir"
fi
mkdir -p "$dst_dir"
cp -R "${src_dir}/." "$dst_dir/"
local count
count="$(find "$dst_dir" -maxdepth 1 -type f -name "*${ext}" | wc -l | tr -d ' ')"
ok "Installed ${count} files to ${dst_dir}"
}
install_aider() {
local src_file="${REPO_ROOT}/integrations/aider/CONVENTIONS.md"
local base_target="${TARGET:-$PWD}"
local dst_file="${base_target}/CONVENTIONS.md"
if [[ ! -f "$src_file" ]]; then
err "Missing source file: $src_file"
err "Run ./scripts/convert.sh --tool aider first."
exit 1
fi
mkdir -p "$base_target"
if [[ -f "$dst_file" ]]; then
if ! confirm_overwrite "Overwrite existing ${dst_file}?"; then
warn "Skipped ${dst_file}"
return
fi
fi
cp "$src_file" "$dst_file"
ok "Installed ${dst_file}"
}
install_skill_bundle_tool() {
local tool="$1"
local src_dir="${REPO_ROOT}/integrations/${tool}/skills"
local base_target="${TARGET:-$PWD}"
local dst_dir="${base_target}/.${tool}/skills"
if [[ ! -d "$src_dir" ]]; then
err "Missing source directory: $src_dir"
err "Run ./scripts/convert.sh --tool ${tool} first."
exit 1
fi
if [[ -d "$dst_dir" ]] && [[ "$(find "$dst_dir" -mindepth 1 -maxdepth 1 -type d | wc -l | tr -d ' ')" -gt 0 ]]; then
if ! confirm_overwrite "${dst_dir} already contains skills. Overwrite contents?"; then
warn "Install cancelled for ${tool}"
return
fi
rm -rf "$dst_dir"
fi
mkdir -p "$dst_dir"
cp -R "${src_dir}/." "$dst_dir/"
local count
count="$(find "$dst_dir" -mindepth 1 -maxdepth 1 -type d | wc -l | tr -d ' ')"
ok "Installed ${count} skill directories to ${dst_dir}"
}
while [[ $# -gt 0 ]]; do
case "$1" in
--tool)
TOOL="${2:-}"
shift 2
;;
--target)
TARGET="${2:-}"
shift 2
;;
--force)
FORCE=true
shift
;;
--help|-h)
usage
exit 0
;;
*)
err "Unknown argument: $1"
usage
exit 1
;;
esac
done
if [[ -z "$TOOL" ]]; then
err "--tool is required"
usage
exit 1
fi
if ! is_valid_tool "$TOOL"; then
err "Invalid --tool value: ${TOOL}"
usage
exit 1
fi
case "$TOOL" in
antigravity)
install_antigravity
;;
cursor)
install_flat_rules_tool "cursor" ".cursor/rules" ".mdc"
;;
aider)
install_aider
;;
kilocode)
install_flat_rules_tool "kilocode" ".kilocode/rules" ".md"
;;
windsurf)
install_skill_bundle_tool "windsurf"
;;
opencode)
install_skill_bundle_tool "opencode"
;;
augment)
install_skill_bundle_tool "augment"
;;
*)
err "Unhandled tool: ${TOOL}"
exit 1
;;
esac
ok "Installation complete for ${TOOL}"