Initial commit
This commit is contained in:
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
||||
.DS_Store
|
||||
8
skillshare/.skillshare-meta.json
Normal file
8
skillshare/.skillshare-meta.json
Normal file
@@ -0,0 +1,8 @@
|
||||
{
|
||||
"source": "github.com/runkids/skillshare/skills/skillshare",
|
||||
"type": "github-subdir",
|
||||
"installed_at": "2026-01-31T18:20:04.489840917-05:00",
|
||||
"repo_url": "https://github.com/runkids/skillshare.git",
|
||||
"subdir": "skills/skillshare",
|
||||
"version": "0355d36"
|
||||
}
|
||||
78
skillshare/SKILL.md
Normal file
78
skillshare/SKILL.md
Normal file
@@ -0,0 +1,78 @@
|
||||
---
|
||||
name: skillshare
|
||||
version: 0.8.1
|
||||
description: Syncs skills across AI CLI tools from a single source of truth. Use when asked to "sync skills", "collect skills", "pull from remote", "show status", "list skills", "install skill", "initialize skillshare", "search skills", or manage skill targets.
|
||||
argument-hint: "[command] [target] [--dry-run]"
|
||||
---
|
||||
|
||||
# Skillshare CLI
|
||||
|
||||
```
|
||||
Source: ~/.config/skillshare/skills ← Single source of truth
|
||||
↓ sync (symlinks)
|
||||
Targets: ~/.claude/skills, ~/.cursor/skills, ...
|
||||
```
|
||||
|
||||
## Quick Start
|
||||
|
||||
```bash
|
||||
skillshare status # Check state
|
||||
skillshare sync --dry-run # Preview
|
||||
skillshare sync # Execute
|
||||
```
|
||||
|
||||
## Commands
|
||||
|
||||
| Task | Command |
|
||||
|------|---------|
|
||||
| **Status** | `status`, `diff`, `list --verbose`, `doctor` |
|
||||
| **Sync** | `sync`, `sync --dry-run` |
|
||||
| **Create** | `new <name>` → `sync` |
|
||||
| **Search** | `search <query>`, `search --list`, `search --json` |
|
||||
| **Install** | `install <source>` → `sync` |
|
||||
| **Team repo** | `install <url> --track` → `sync` |
|
||||
| **Collect** | `collect <target>` → `sync` |
|
||||
| **Update** | `update <name>`, `update --all` → `sync` |
|
||||
| **Remove** | `uninstall <name>` → `sync` |
|
||||
| **Git sync** | `push -m "msg"`, `pull` |
|
||||
| **Targets** | `target add <n> <p>`, `target remove <n>`, `target <n> --mode merge\|symlink` |
|
||||
| **Upgrade** | `upgrade`, `upgrade --cli`, `upgrade --skill` |
|
||||
|
||||
## Init (Non-Interactive)
|
||||
|
||||
**AI must use flags** — cannot respond to CLI prompts.
|
||||
|
||||
```bash
|
||||
# Step 1: Check existing skills
|
||||
ls ~/.claude/skills ~/.cursor/skills 2>/dev/null | head -10
|
||||
|
||||
# Step 2: Run based on findings
|
||||
skillshare init --copy-from claude --all-targets --git # If skills exist
|
||||
skillshare init --no-copy --all-targets --git # Fresh start
|
||||
|
||||
# Step 3: Verify
|
||||
skillshare status
|
||||
```
|
||||
|
||||
**Add new agents later:**
|
||||
```bash
|
||||
skillshare init --discover --select "windsurf,kilocode"
|
||||
```
|
||||
|
||||
See [init.md](references/init.md) for all flags.
|
||||
|
||||
## Safety
|
||||
|
||||
**NEVER** `rm -rf` symlinked skills — deletes source. Use `skillshare uninstall`.
|
||||
|
||||
## References
|
||||
|
||||
| Topic | File |
|
||||
|-------|------|
|
||||
| Init flags | [init.md](references/init.md) |
|
||||
| Sync/pull/push | [sync.md](references/sync.md) |
|
||||
| Install/update | [install.md](references/install.md) |
|
||||
| Status/diff/list | [status.md](references/status.md) |
|
||||
| Target management | [targets.md](references/targets.md) |
|
||||
| Backup/restore | [backup.md](references/backup.md) |
|
||||
| Troubleshooting | [TROUBLESHOOTING.md](references/TROUBLESHOOTING.md) |
|
||||
61
skillshare/references/TROUBLESHOOTING.md
Normal file
61
skillshare/references/TROUBLESHOOTING.md
Normal file
@@ -0,0 +1,61 @@
|
||||
# Troubleshooting
|
||||
|
||||
## Quick Fixes
|
||||
|
||||
| Problem | Solution |
|
||||
|---------|----------|
|
||||
| "config not found" | `skillshare init` |
|
||||
| Target shows differences | `skillshare sync` |
|
||||
| Lost source files | `cd ~/.config/skillshare/skills && git checkout -- .` |
|
||||
| Skill not appearing | `skillshare sync` after install |
|
||||
| Git push fails | `git remote add origin <url>` in source |
|
||||
|
||||
## Recovery
|
||||
|
||||
```bash
|
||||
skillshare doctor # Diagnose
|
||||
skillshare backup # Safety backup
|
||||
skillshare sync --dry-run # Preview
|
||||
skillshare sync # Fix
|
||||
```
|
||||
|
||||
## Git Recovery
|
||||
|
||||
```bash
|
||||
cd ~/.config/skillshare/skills
|
||||
git checkout -- <skill>/ # Restore specific
|
||||
git checkout -- . # Restore all
|
||||
```
|
||||
|
||||
## AI Assistant Notes
|
||||
|
||||
### Symlink Safety
|
||||
|
||||
- **merge mode** (default): Per-skill symlinks. Edit anywhere = edit source.
|
||||
- **symlink mode**: Entire directory symlinked.
|
||||
|
||||
**Safe:** `skillshare uninstall`, `target remove`
|
||||
|
||||
**DANGEROUS:** `rm -rf` on symlinked skills deletes source!
|
||||
|
||||
### When to Use --dry-run
|
||||
|
||||
- First-time users
|
||||
- Before `sync`, `collect --all`, `restore`
|
||||
- Before `install` from unknown sources
|
||||
|
||||
### Init (Non-Interactive)
|
||||
|
||||
AI cannot respond to CLI prompts. Always use flags:
|
||||
|
||||
```bash
|
||||
skillshare init --copy-from claude --all-targets --git
|
||||
```
|
||||
|
||||
### Debug Sync
|
||||
|
||||
```bash
|
||||
skillshare status
|
||||
skillshare diff
|
||||
ls -la ~/.claude/skills # Check symlinks
|
||||
```
|
||||
13
skillshare/references/backup.md
Normal file
13
skillshare/references/backup.md
Normal file
@@ -0,0 +1,13 @@
|
||||
# Backup & Restore
|
||||
|
||||
```bash
|
||||
skillshare backup # All targets
|
||||
skillshare backup claude # Specific target
|
||||
skillshare backup --list # List backups
|
||||
skillshare backup --cleanup # Remove old
|
||||
|
||||
skillshare restore claude # Latest
|
||||
skillshare restore claude --from 2026-01-14_21-22 # Specific
|
||||
```
|
||||
|
||||
Backups: `~/.config/skillshare/backups/<timestamp>/`
|
||||
35
skillshare/references/init.md
Normal file
35
skillshare/references/init.md
Normal file
@@ -0,0 +1,35 @@
|
||||
# Init Command
|
||||
|
||||
**Source:** Always `~/.config/skillshare/skills` (use `--source` only if user explicitly requests).
|
||||
|
||||
## Flags
|
||||
|
||||
**Copy (mutually exclusive):**
|
||||
- `--copy-from <name|path>` — Import from target/path
|
||||
- `--no-copy` — Empty source
|
||||
|
||||
**Targets (mutually exclusive):**
|
||||
- `--targets "claude,cursor"` — Specific list
|
||||
- `--all-targets` — All detected
|
||||
- `--no-targets` — Skip
|
||||
|
||||
**Git (mutually exclusive):**
|
||||
- `--git` — Init git (recommended)
|
||||
- `--no-git` — Skip
|
||||
|
||||
**Discover (add new agents):**
|
||||
- `--discover --select "windsurf,kilocode"` — Non-interactive (AI use this)
|
||||
- `--discover` — Interactive only (NOT for AI)
|
||||
|
||||
**Other:**
|
||||
- `--source <path>` — Custom source (**only if user requests**)
|
||||
- `--remote <url>` — Set git remote
|
||||
- `--dry-run` — Preview
|
||||
|
||||
## Examples
|
||||
|
||||
```bash
|
||||
skillshare init --no-copy --all-targets --git # Fresh start
|
||||
skillshare init --copy-from claude --all-targets --git # Import from Claude
|
||||
skillshare init --discover --select "windsurf" # Add new agents
|
||||
```
|
||||
59
skillshare/references/install.md
Normal file
59
skillshare/references/install.md
Normal file
@@ -0,0 +1,59 @@
|
||||
# Install, Update & Uninstall
|
||||
|
||||
## install
|
||||
|
||||
```bash
|
||||
# GitHub
|
||||
skillshare install owner/repo # Browse repo for skills
|
||||
skillshare install owner/repo/path/to/skill # Direct path
|
||||
skillshare install git@github.com:user/repo.git # SSH
|
||||
|
||||
# Local
|
||||
skillshare install ~/Downloads/my-skill
|
||||
|
||||
# Team repo (tracked for updates)
|
||||
skillshare install github.com/team/skills --track
|
||||
```
|
||||
|
||||
| Flag | Description |
|
||||
|------|-------------|
|
||||
| `--name <n>` | Custom name |
|
||||
| `--force, -f` | Overwrite existing |
|
||||
| `--update, -u` | Update if exists |
|
||||
| `--track, -t` | Track for `update` |
|
||||
| `--dry-run, -n` | Preview |
|
||||
|
||||
**Tracked repos:** Prefix `_`, nested `__` (e.g., `_team__frontend__ui`).
|
||||
|
||||
After install: `skillshare sync`
|
||||
|
||||
## update
|
||||
|
||||
```bash
|
||||
skillshare update my-skill # From stored source
|
||||
skillshare update _team-repo # Git pull tracked repo
|
||||
skillshare update --all # All tracked repos
|
||||
skillshare update _repo --force # Discard local changes
|
||||
```
|
||||
|
||||
After update: `skillshare sync`
|
||||
|
||||
## uninstall
|
||||
|
||||
```bash
|
||||
skillshare uninstall my-skill # With confirmation
|
||||
skillshare uninstall my-skill --force # Skip confirmation
|
||||
```
|
||||
|
||||
After uninstall: `skillshare sync`
|
||||
|
||||
## new
|
||||
|
||||
Create a new skill template.
|
||||
|
||||
```bash
|
||||
skillshare new <name> # Create SKILL.md template
|
||||
skillshare new <name> --dry-run # Preview
|
||||
```
|
||||
|
||||
After create: Edit SKILL.md → `skillshare sync`
|
||||
62
skillshare/references/status.md
Normal file
62
skillshare/references/status.md
Normal file
@@ -0,0 +1,62 @@
|
||||
# Status & Inspection Commands
|
||||
|
||||
## status
|
||||
|
||||
Shows source location, targets, and sync state.
|
||||
|
||||
```bash
|
||||
skillshare status
|
||||
```
|
||||
|
||||
## diff
|
||||
|
||||
Shows differences between source and targets.
|
||||
|
||||
```bash
|
||||
skillshare diff # All targets
|
||||
skillshare diff claude # Specific target
|
||||
```
|
||||
|
||||
## list
|
||||
|
||||
Lists installed skills.
|
||||
|
||||
```bash
|
||||
skillshare list # Basic list
|
||||
skillshare list --verbose # With source and install info
|
||||
```
|
||||
|
||||
## search
|
||||
|
||||
Search GitHub for skills (repos with SKILL.md).
|
||||
|
||||
```bash
|
||||
skillshare search <query> # Interactive (select to install)
|
||||
skillshare search <query> --list # List only, no install prompt
|
||||
skillshare search <query> --json # JSON output for scripting
|
||||
skillshare search <query> -n 10 # Limit results (default: 20, max: 100)
|
||||
```
|
||||
|
||||
**Requires GitHub auth** (gh CLI or `GITHUB_TOKEN` env var).
|
||||
|
||||
## doctor
|
||||
|
||||
Checks configuration health and diagnoses issues.
|
||||
|
||||
```bash
|
||||
skillshare doctor
|
||||
```
|
||||
|
||||
## upgrade
|
||||
|
||||
Upgrades CLI binary and/or built-in skillshare skill.
|
||||
|
||||
```bash
|
||||
skillshare upgrade # Both CLI + skill
|
||||
skillshare upgrade --cli # CLI only
|
||||
skillshare upgrade --skill # Skill only
|
||||
skillshare upgrade --force # Skip confirmation
|
||||
skillshare upgrade --dry-run # Preview
|
||||
```
|
||||
|
||||
After upgrading skill: `skillshare sync`
|
||||
49
skillshare/references/sync.md
Normal file
49
skillshare/references/sync.md
Normal file
@@ -0,0 +1,49 @@
|
||||
# Sync, Collect, Pull & Push Commands
|
||||
|
||||
| Type | Command | Direction |
|
||||
|------|---------|-----------|
|
||||
| **Local** | `sync` / `collect` | Source ↔ Targets |
|
||||
| **Remote** | `push` / `pull` | Source ↔ Git Remote |
|
||||
|
||||
## sync
|
||||
|
||||
```bash
|
||||
skillshare sync # Execute
|
||||
skillshare sync --dry-run # Preview
|
||||
skillshare sync --force # Override conflicts
|
||||
```
|
||||
|
||||
## collect
|
||||
|
||||
Import skills from target(s) to source.
|
||||
|
||||
```bash
|
||||
skillshare collect claude # From specific target
|
||||
skillshare collect --all # From all targets
|
||||
skillshare collect --dry-run # Preview
|
||||
```
|
||||
|
||||
## pull
|
||||
|
||||
Git pull + sync to all targets.
|
||||
|
||||
```bash
|
||||
skillshare pull # Pull + sync
|
||||
skillshare pull --dry-run # Preview
|
||||
```
|
||||
|
||||
## push
|
||||
|
||||
Git commit + push source.
|
||||
|
||||
```bash
|
||||
skillshare push # Default message
|
||||
skillshare push -m "message" # Custom message
|
||||
skillshare push --dry-run # Preview
|
||||
```
|
||||
|
||||
## Workflows
|
||||
|
||||
**Local:** Edit anywhere → `collect` → `sync`
|
||||
|
||||
**Cross-machine:** Machine A: `push` → Machine B: `pull`
|
||||
22
skillshare/references/targets.md
Normal file
22
skillshare/references/targets.md
Normal file
@@ -0,0 +1,22 @@
|
||||
# Target Management
|
||||
|
||||
```bash
|
||||
skillshare target list # List targets
|
||||
skillshare target claude # Show info
|
||||
skillshare target add myapp ~/.myapp/skills # Add custom
|
||||
skillshare target remove myapp # Safe unlink
|
||||
```
|
||||
|
||||
## Sync Modes
|
||||
|
||||
```bash
|
||||
skillshare target claude --mode merge # Per-skill symlinks (default)
|
||||
skillshare target claude --mode symlink # Entire dir symlinked
|
||||
```
|
||||
|
||||
| Mode | Local Skills | Behavior |
|
||||
|------|--------------|----------|
|
||||
| `merge` | Preserved | Individual symlinks |
|
||||
| `symlink` | Not possible | Single symlink |
|
||||
|
||||
**Always use** `target remove` — never `rm -rf` on symlinked targets.
|
||||
135
skillshare/scripts/run.sh
Executable file
135
skillshare/scripts/run.sh
Executable file
@@ -0,0 +1,135 @@
|
||||
#!/bin/sh
|
||||
# skillshare runner - npx-style execution without installation
|
||||
# Usage: curl -fsSL https://raw.githubusercontent.com/runkids/skillshare/main/skills/skillshare/scripts/run.sh | sh -s -- [command] [args]
|
||||
# Or: sh run.sh [command] [args]
|
||||
set -e
|
||||
|
||||
REPO="runkids/skillshare"
|
||||
CACHE_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/skillshare"
|
||||
BIN_DIR="$CACHE_DIR/bin"
|
||||
BINARY="$BIN_DIR/skillshare"
|
||||
VERSION_FILE="$CACHE_DIR/.version"
|
||||
MAX_AGE=86400 # Check for updates every 24 hours
|
||||
|
||||
# Colors
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[0;33m'
|
||||
CYAN='\033[0;36m'
|
||||
NC='\033[0m'
|
||||
|
||||
info() { printf "${CYAN}[skillshare]${NC} %s\n" "$1" >&2; }
|
||||
success() { printf "${GREEN}[skillshare]${NC} %s\n" "$1" >&2; }
|
||||
warn() { printf "${YELLOW}[skillshare]${NC} %s\n" "$1" >&2; }
|
||||
error() { printf "${RED}[skillshare]${NC} %s\n" "$1" >&2; exit 1; }
|
||||
|
||||
# Detect OS
|
||||
detect_os() {
|
||||
OS=$(uname -s | tr '[:upper:]' '[:lower:]')
|
||||
case "$OS" in
|
||||
darwin) OS="darwin" ;;
|
||||
linux) OS="linux" ;;
|
||||
mingw*|msys*|cygwin*) error "Windows is not supported via this script. Please download from GitHub releases." ;;
|
||||
*) error "Unsupported OS: $OS" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Detect architecture
|
||||
detect_arch() {
|
||||
ARCH=$(uname -m)
|
||||
case "$ARCH" in
|
||||
x86_64|amd64) ARCH="amd64" ;;
|
||||
arm64|aarch64) ARCH="arm64" ;;
|
||||
*) error "Unsupported architecture: $ARCH" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
# Get file modification time in seconds since epoch (cross-platform)
|
||||
get_file_age() {
|
||||
if [ "$(uname -s)" = "Darwin" ]; then
|
||||
stat -f %m "$1" 2>/dev/null || echo 0
|
||||
else
|
||||
stat -c %Y "$1" 2>/dev/null || echo 0
|
||||
fi
|
||||
}
|
||||
|
||||
# Check if we need to update (version file older than MAX_AGE)
|
||||
needs_update() {
|
||||
[ ! -f "$VERSION_FILE" ] && return 0
|
||||
[ ! -x "$BINARY" ] && return 0
|
||||
|
||||
file_time=$(get_file_age "$VERSION_FILE")
|
||||
current_time=$(date +%s)
|
||||
age=$((current_time - file_time))
|
||||
|
||||
[ "$age" -ge "$MAX_AGE" ]
|
||||
}
|
||||
|
||||
# Get latest version from GitHub API
|
||||
get_latest_version() {
|
||||
LATEST=$(curl -sL "https://api.github.com/repos/${REPO}/releases/latest" | grep '"tag_name"' | cut -d'"' -f4)
|
||||
if [ -z "$LATEST" ]; then
|
||||
error "Failed to get latest version. Check your internet connection."
|
||||
fi
|
||||
VERSION=${LATEST#v}
|
||||
}
|
||||
|
||||
# Download and install to cache
|
||||
download_binary() {
|
||||
detect_os
|
||||
detect_arch
|
||||
get_latest_version
|
||||
|
||||
URL="https://github.com/${REPO}/releases/download/${LATEST}/skillshare_${VERSION}_${OS}_${ARCH}.tar.gz"
|
||||
|
||||
info "Downloading skillshare ${VERSION} for ${OS}/${ARCH}..."
|
||||
|
||||
mkdir -p "$BIN_DIR"
|
||||
|
||||
TMP_DIR=$(mktemp -d)
|
||||
trap "rm -rf $TMP_DIR" EXIT
|
||||
|
||||
if ! curl -sL "$URL" | tar xz -C "$TMP_DIR" 2>/dev/null; then
|
||||
error "Failed to download. URL: $URL"
|
||||
fi
|
||||
|
||||
if [ ! -f "$TMP_DIR/skillshare" ]; then
|
||||
error "Binary not found in archive"
|
||||
fi
|
||||
|
||||
mv "$TMP_DIR/skillshare" "$BINARY"
|
||||
chmod +x "$BINARY"
|
||||
echo "$VERSION" > "$VERSION_FILE"
|
||||
|
||||
success "Cached skillshare ${VERSION} at ${BIN_DIR}"
|
||||
}
|
||||
|
||||
# Main logic
|
||||
main() {
|
||||
# 1. Check if skillshare is already in PATH
|
||||
if command -v skillshare >/dev/null 2>&1; then
|
||||
exec skillshare "$@"
|
||||
fi
|
||||
|
||||
# 2. Check cached binary
|
||||
if [ -x "$BINARY" ]; then
|
||||
if ! needs_update; then
|
||||
exec "$BINARY" "$@"
|
||||
fi
|
||||
|
||||
# Try to update, but fall back to cached version on failure
|
||||
if download_binary 2>/dev/null; then
|
||||
exec "$BINARY" "$@"
|
||||
else
|
||||
warn "Update check failed, using cached version"
|
||||
touch "$VERSION_FILE" # Reset timer
|
||||
exec "$BINARY" "$@"
|
||||
fi
|
||||
fi
|
||||
|
||||
# 3. First run - download binary
|
||||
download_binary
|
||||
exec "$BINARY" "$@"
|
||||
}
|
||||
|
||||
main "$@"
|
||||
Reference in New Issue
Block a user