Files
Francy Lisboa Charuto 3fc735eeae feat: Add brain-dead multi-tool install scripts (bootstrap, symlink installer, universal skill installer)
- scripts/bootstrap.sh: curl-pipe-sh one-liner that clones to ~/.agents/skills/ and symlinks to all detected global platforms
- install.sh: symlink self-installer for cloned repos with --dry-run and --uninstall
- scripts/install-skill.sh: universal installer for any skill (git URL or local path) to all detected platforms with format adapters
- SKILL.md: add silent git-based update check instruction
- README.md: document all new install options and update project structure
- .gitignore: add *.mdc for generated adapter files

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-04 10:08:20 -03:00

182 lines
6.0 KiB
Bash
Executable File

#!/bin/sh
# bootstrap.sh — One-liner bootstrap for agent-skill-creator
#
# Usage:
# curl -fsSL https://raw.githubusercontent.com/FrancyJGLisboa/agent-skill-creator/main/scripts/bootstrap.sh | sh
#
# Clones agent-skill-creator to ~/.agents/skills/ and symlinks to all detected
# global platforms. POSIX-compatible (works in bash, dash, zsh, ash).
set -eu
# ---------------------------------------------------------------------------
# Constants
# ---------------------------------------------------------------------------
REPO_URL="https://github.com/FrancyJGLisboa/agent-skill-creator.git"
SKILL_NAME="agent-skill-creator"
CANONICAL_DIR="$HOME/.agents/skills/$SKILL_NAME"
# ---------------------------------------------------------------------------
# Colors (disabled when stdout is not a terminal)
# ---------------------------------------------------------------------------
if [ -t 1 ]; then
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
BOLD='\033[1m'
NC='\033[0m'
else
GREEN='' YELLOW='' BLUE='' BOLD='' NC=''
fi
info() { printf "${BLUE}[INFO]${NC} %s\n" "$1"; }
success() { printf "${GREEN}[OK]${NC} %s\n" "$1"; }
warn() { printf "${YELLOW}[WARN]${NC} %s\n" "$1"; }
# ---------------------------------------------------------------------------
# Detect globally-installed platforms (user-level only, skip project-level)
# ---------------------------------------------------------------------------
detect_global_platforms() {
platforms=""
# Claude Code
if [ -d "$HOME/.claude" ]; then
platforms="$platforms claude-code"
fi
# Gemini CLI
if [ -d "$HOME/.gemini" ]; then
platforms="$platforms gemini"
fi
# Goose
if [ -d "$HOME/.config/goose" ]; then
platforms="$platforms goose"
fi
# OpenCode
if [ -d "$HOME/.config/opencode" ]; then
platforms="$platforms opencode"
fi
# GitHub Copilot
if [ -d "$HOME/.copilot" ]; then
platforms="$platforms copilot"
fi
echo "$platforms"
}
# ---------------------------------------------------------------------------
# Resolve user-level install path for a platform
# ---------------------------------------------------------------------------
platform_path() {
case "$1" in
claude-code) echo "$HOME/.claude/skills/$SKILL_NAME" ;;
gemini) echo "$HOME/.gemini/skills/$SKILL_NAME" ;;
goose) echo "$HOME/.config/goose/skills/$SKILL_NAME" ;;
opencode) echo "$HOME/.config/opencode/skills/$SKILL_NAME" ;;
copilot) echo "$HOME/.copilot/skills/$SKILL_NAME" ;;
esac
}
# ---------------------------------------------------------------------------
# Friendly display name for a platform
# ---------------------------------------------------------------------------
platform_display() {
case "$1" in
claude-code) echo "Claude Code" ;;
gemini) echo "Gemini CLI" ;;
goose) echo "Goose" ;;
opencode) echo "OpenCode" ;;
copilot) echo "GitHub Copilot" ;;
esac
}
# ---------------------------------------------------------------------------
# Create a symlink (with fallback to copy)
# ---------------------------------------------------------------------------
create_symlink() {
target="$1" # what the link points to
link_path="$2" # where the link lives
# Skip if target and link are the same path
if [ "$target" = "$link_path" ]; then
return 0
fi
mkdir -p "$(dirname "$link_path")"
# Remove existing (file, symlink, or directory)
if [ -e "$link_path" ] || [ -L "$link_path" ]; then
rm -rf "$link_path"
fi
if ln -s "$target" "$link_path" 2>/dev/null; then
return 0
else
warn "Symlink failed for $link_path — falling back to copy"
cp -R "$target" "$link_path"
fi
}
# ---------------------------------------------------------------------------
# Main
# ---------------------------------------------------------------------------
main() {
printf "\n${BOLD}Agent Skill Creator — Bootstrap Installer${NC}\n\n"
# Check for git
if ! command -v git >/dev/null 2>&1; then
warn "git is not installed. Please install git and try again."
exit 1
fi
# Clone or update the canonical location
if [ -d "$CANONICAL_DIR/.git" ]; then
info "Updating existing install at $CANONICAL_DIR"
cd "$CANONICAL_DIR" && git pull --ff-only 2>/dev/null || true
else
info "Cloning $SKILL_NAME to $CANONICAL_DIR"
mkdir -p "$(dirname "$CANONICAL_DIR")"
rm -rf "$CANONICAL_DIR"
git clone "$REPO_URL" "$CANONICAL_DIR"
fi
success "Installed at $CANONICAL_DIR"
# Detect global platforms and create symlinks
platforms="$(detect_global_platforms)"
installed=""
count=0
for platform in $platforms; do
dest="$(platform_path "$platform")"
create_symlink "$CANONICAL_DIR" "$dest"
name="$(platform_display "$platform")"
success "Symlinked for $name$dest"
installed="$installed $name,"
count=$((count + 1))
done
# ---------------------------------------------------------------------------
# Summary
# ---------------------------------------------------------------------------
printf "\n${BOLD}Done!${NC}\n\n"
printf " Canonical location: ${BOLD}%s${NC}\n" "$CANONICAL_DIR"
if [ $count -gt 0 ]; then
# Trim trailing comma
installed="$(echo "$installed" | sed 's/,$//')"
printf " Symlinked to %d platform(s):%s\n" "$count" "$installed"
fi
printf "\n${BOLD}How to use:${NC}\n"
printf " Open your AI agent and type:\n"
printf " /agent-skill-creator <describe your workflow>\n\n"
printf " To update later:\n"
printf " cd %s && git pull\n\n" "$CANONICAL_DIR"
if [ $count -eq 0 ]; then
warn "No global platforms detected. The skill is installed at the universal path."
printf " Tools like Codex CLI, Gemini CLI, Kiro, and Antigravity\n"
printf " read from ~/.agents/skills/ automatically.\n\n"
fi
}
main