eagle-skills 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +240 -0
- package/bin/eagle-skills +361 -0
- package/docs/ad-review-methodology.md +133 -0
- package/docs/product-diagnostics-methodology.md +243 -0
- package/docs/ux-review-methodology.md +180 -0
- package/eagle-ad-review/SKILL.md +205 -0
- package/eagle-ad-review/assets/report-template.html +311 -0
- package/eagle-ad-review/references/ad-formats.md +274 -0
- package/eagle-ad-review/references/ad-platforms.md +251 -0
- package/eagle-ad-review/references/methodology.md +398 -0
- package/eagle-ad-review/scripts/catalog-ads.sh +200 -0
- package/eagle-product-diagnostics/SKILL.md +162 -0
- package/eagle-product-diagnostics/assets/input-templates/db-schema.md +98 -0
- package/eagle-product-diagnostics/assets/input-templates/event-taxonomy.md +91 -0
- package/eagle-product-diagnostics/assets/input-templates/goal-definition.md +51 -0
- package/eagle-product-diagnostics/assets/report-template.html +223 -0
- package/eagle-product-diagnostics/references/analytics-platforms.md +527 -0
- package/eagle-product-diagnostics/references/methodology.md +354 -0
- package/eagle-ux-review/SKILL.md +170 -0
- package/eagle-ux-review/assets/report-template.html +209 -0
- package/eagle-ux-review/references/methodology.md +301 -0
- package/eagle-ux-review/references/ux-laws.md +491 -0
- package/eagle-ux-review/scripts/extract-frames.sh +75 -0
- package/install.sh +32 -0
- package/package.json +24 -0
package/README.md
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
# Eagle Skills
|
|
2
|
+
|
|
3
|
+
Custom skills for [Claude Code](https://docs.anthropic.com/en/docs/claude-code), Anthropic's agentic coding tool. Each skill extends Claude with domain-specific expertise, structured workflows, and production-quality deliverables.
|
|
4
|
+
|
|
5
|
+
This repo contains three skills that work together as a complete product evaluation pipeline:
|
|
6
|
+
|
|
7
|
+
1. **Eagle UX Review** — looks at your screens and tells you what's broken and why
|
|
8
|
+
2. **Eagle Product Diagnostics** — takes your real data and proves whether those problems actually cost you users and revenue
|
|
9
|
+
3. **Eagle Ad Review** — audits your ad creatives against marketing strategy, platform specs, and creative effectiveness research
|
|
10
|
+
|
|
11
|
+
Use them independently or combine them: review your product, validate with data, then audit the ads that drive users to it.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Table of Contents
|
|
16
|
+
|
|
17
|
+
- [Eagle UX Review](#eagle-ux-review)
|
|
18
|
+
- [Eagle Product Diagnostics](#eagle-product-diagnostics)
|
|
19
|
+
- [Eagle Ad Review](#eagle-ad-review)
|
|
20
|
+
- [The Three-Skill Pipeline](#the-three-skill-pipeline)
|
|
21
|
+
- [Installation](#installation)
|
|
22
|
+
- [Prerequisites](#prerequisites)
|
|
23
|
+
- [Usage](#usage)
|
|
24
|
+
- [Built With](#built-with)
|
|
25
|
+
- [Contributing](#contributing)
|
|
26
|
+
- [License](#license)
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
|
|
30
|
+
# Eagle UX Review
|
|
31
|
+
|
|
32
|
+
**Expert-level UX audits grounded in 65+ UX laws and principles across 12 categories.**
|
|
33
|
+
|
|
34
|
+
Most UX feedback is vague: "the onboarding feels clunky," "the colors seem off," "maybe simplify it?" This skill produces the opposite — structured, evidence-based findings where every issue is tied to a specific UX law, a specific screen, a specific element, and a specific impact on the metric you care about most.
|
|
35
|
+
|
|
36
|
+
Point Claude at a screen recording, a set of screenshots, or a PRD, and receive a complete HTML report: severity-rated findings with embedded evidence, visual before/after design mockups built in CSS, a priority matrix ranked by business impact, and three-level recommendations (quick fix, proper fix, ideal state) for every issue found.
|
|
37
|
+
|
|
38
|
+
The review is deliberately brutal. Its value comes from surfacing problems the team may not want to hear — not from validating existing decisions.
|
|
39
|
+
|
|
40
|
+
**What you provide:** North star metric, target user profile, 2-3 reference apps, app identity — plus optional PRD, personas, analytics data, and competitive screenshots.
|
|
41
|
+
|
|
42
|
+
**What you get:** A self-contained HTML report with central thesis, severity-rated findings (each with evidence screenshots, UX law citations, north star impact, and fix recommendations), priority matrix, visual design mockups, time-to-first-value analysis, and UX laws summary.
|
|
43
|
+
|
|
44
|
+
**How it works:** 5-phase process — context gathering, frame extraction (1fps from video), systematic analysis against 65+ UX laws (6 per-screen checks + 6 per-flow checks), HTML report generation, and quality verification.
|
|
45
|
+
|
|
46
|
+
[Read the full methodology →](docs/ux-review-methodology.md)
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
# Eagle Product Diagnostics
|
|
51
|
+
|
|
52
|
+
**Data-validated product analysis using three-layer triangulation: design intent, instrumented behavior, and outcome truth.**
|
|
53
|
+
|
|
54
|
+
A UX review tells you: "This screen probably causes drop-off because the primary action is buried." But *probably* isn't proof. Product Diagnostics takes your actual data — analytics events and database outcomes — and validates each UX finding against reality. The result is not "we think this is broken" but "this IS broken, here's the funnel that proves it, and here's how much it costs."
|
|
55
|
+
|
|
56
|
+
**What you provide:** Goal definitions (success metrics per feature), event taxonomy (analytics events mapped to screens + funnels), and database outcomes (actual vs. target metrics). Optionally, a UX review report for per-finding validation.
|
|
57
|
+
|
|
58
|
+
**What you get:** An HTML report with goal scorecard (PASS/FAIL/PARTIAL per layer), funnel visualizations with drop-off analysis, per-feature three-layer diagnosis, disagreement analysis, business impact estimates, and prioritized actions.
|
|
59
|
+
|
|
60
|
+
**How it works:** The skill triangulates three independent evidence sources — design intent (UX review predictions), instrumented behavior (analytics events), and outcome truth (database metrics). Eight verdict patterns diagnose whether issues are UX problems, measurement gaps, value proposition failures, or something else entirely.
|
|
61
|
+
|
|
62
|
+
[Read the full methodology →](docs/product-diagnostics-methodology.md)
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
# Eagle Ad Review
|
|
67
|
+
|
|
68
|
+
**Strategy-first advertising creative review grounded in Meta ABCD, Kantar, System1, and Nielsen frameworks. Works across any medium.**
|
|
69
|
+
|
|
70
|
+
Most ad feedback is subjective: "I don't like the colors," "make the logo bigger," "this doesn't feel right." This skill produces the opposite — a structured evaluation where every creative is scored against the marketing strategy it's supposed to serve, the medium it runs in, and the research on what actually drives ad performance.
|
|
71
|
+
|
|
72
|
+
Point Claude at a folder of ad files — images, videos, audio, PDFs, scripts — across **any advertising medium**: social, display, video, radio, podcast, billboard, transit, print, TV, or experiential. Provide your campaign context and receive a complete HTML report.
|
|
73
|
+
|
|
74
|
+
The review evaluates creatives against their **marketing job**, not just visual aesthetics. An ugly ad that stops the scroll and converts is better than a beautiful ad nobody notices. A simple billboard that communicates in 3 seconds beats an elaborate one nobody can read at 60mph.
|
|
75
|
+
|
|
76
|
+
**What you provide:** Campaign strategy (objective, funnel stage, audience, medium/channels, KPI), brand context (value proposition, positioning, competitive landscape), and the creative files themselves.
|
|
77
|
+
|
|
78
|
+
**What you get:** An HTML report with 10-dimension scoring (weighted by campaign type and medium), per-market breakdowns, best/worst performer galleries, cross-cutting findings with evidence, platform compliance audit, creative system assessment, and a creative brief for the next production round.
|
|
79
|
+
|
|
80
|
+
**How it works:** Strategy-first 4-step process — gather marketing context, catalog and process all creative files, three-level analysis (strategic fit → execution quality → creative system health), then score and compile the report. Weights adjust dynamically by campaign type (awareness, DR, brand, multi-market) and medium (digital, radio, OOH, print, TV).
|
|
81
|
+
|
|
82
|
+
[Read the full methodology →](docs/ad-review-methodology.md)
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## The Three-Skill Pipeline
|
|
87
|
+
|
|
88
|
+
Each skill is powerful alone. Together, they cover the full product lifecycle: the experience inside the product, the data proving what works, and the ads driving users to it.
|
|
89
|
+
|
|
90
|
+
```
|
|
91
|
+
Step 1: UX Review Step 2: Product Diagnostics Step 3: Ad Review
|
|
92
|
+
────────────────── ───────────────────────────── ─────────────────────
|
|
93
|
+
Input: Screen recording Input: UX report + events + DB Input: Ad folder + strategy
|
|
94
|
+
Output: "Here's what's Output: "Here's proof it IS Output: "Here's what's wrong
|
|
95
|
+
broken in the UX" broken, and the cost" with your ads"
|
|
96
|
+
|
|
97
|
+
Predictive Validated Acquisition
|
|
98
|
+
"This will hurt retention" "This DID hurt retention by 14pp" "Ads aren't doing their job"
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
**Why all three matter:**
|
|
102
|
+
- UX Review alone gives you well-reasoned predictions without proof.
|
|
103
|
+
- Product Diagnostics alone gives you data without actionable design recommendations.
|
|
104
|
+
- Ad Review alone tells you what's wrong with creatives without knowing if the product delivers.
|
|
105
|
+
- Together, you validate the entire user journey: ads bring users in, the product retains them, the data proves it works.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Installation
|
|
110
|
+
|
|
111
|
+
### Quick install (recommended)
|
|
112
|
+
|
|
113
|
+
Interactive installer — choose which skills to install:
|
|
114
|
+
|
|
115
|
+
```bash
|
|
116
|
+
npx eagle-skills install
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Or without npm:
|
|
120
|
+
|
|
121
|
+
```bash
|
|
122
|
+
curl -fsSL https://raw.githubusercontent.com/eagleisbatman/eagle-skills/main/install.sh | bash
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
The installer clones the repo to `~/.eagle-skills` and symlinks your selected skills into `~/.claude/skills/`. Symlinked skills update in place when you run `npx eagle-skills update`.
|
|
126
|
+
|
|
127
|
+
### Managing your installation
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
npx eagle-skills update # Pull latest changes
|
|
131
|
+
npx eagle-skills status # Show installed skills, check for updates
|
|
132
|
+
npx eagle-skills uninstall # Remove skills and optionally the repo
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
### Manual install
|
|
136
|
+
|
|
137
|
+
If you prefer to manage it yourself:
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
git clone https://github.com/eagleisbatman/eagle-skills.git
|
|
141
|
+
cd eagle-skills
|
|
142
|
+
ln -sf "$(pwd)/eagle-ux-review" ~/.claude/skills/eagle-ux-review
|
|
143
|
+
ln -sf "$(pwd)/eagle-product-diagnostics" ~/.claude/skills/eagle-product-diagnostics
|
|
144
|
+
ln -sf "$(pwd)/eagle-ad-review" ~/.claude/skills/eagle-ad-review
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Update with `git pull`. Symlinks mean installed skills update automatically.
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Prerequisites
|
|
152
|
+
|
|
153
|
+
- [Claude Code](https://docs.anthropic.com/en/docs/claude-code) installed and configured
|
|
154
|
+
- `ffmpeg` and `ffprobe` — required for video input in UX Review and Ad Review
|
|
155
|
+
```bash
|
|
156
|
+
# macOS
|
|
157
|
+
brew install ffmpeg
|
|
158
|
+
|
|
159
|
+
# Ubuntu/Debian
|
|
160
|
+
sudo apt install ffmpeg
|
|
161
|
+
```
|
|
162
|
+
- `imagemagick` — optional, used by Ad Review's catalog script for thumbnail generation and image dimension detection
|
|
163
|
+
```bash
|
|
164
|
+
# macOS
|
|
165
|
+
brew install imagemagick
|
|
166
|
+
|
|
167
|
+
# Ubuntu/Debian
|
|
168
|
+
sudo apt install imagemagick
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
---
|
|
172
|
+
|
|
173
|
+
## Usage
|
|
174
|
+
|
|
175
|
+
Trigger skills with natural language in Claude Code:
|
|
176
|
+
|
|
177
|
+
**UX Review:**
|
|
178
|
+
```
|
|
179
|
+
ux review this screen recording
|
|
180
|
+
```
|
|
181
|
+
```
|
|
182
|
+
UX audit — I'll provide a PRD and video walkthrough
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
**Product Diagnostics:**
|
|
186
|
+
```
|
|
187
|
+
validate these UX findings against our Firebase events
|
|
188
|
+
```
|
|
189
|
+
```
|
|
190
|
+
why isn't our retention metric moving? here's the event data and DB export
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
**Ad Review:**
|
|
194
|
+
```
|
|
195
|
+
review these ad creatives — here's the folder
|
|
196
|
+
```
|
|
197
|
+
```
|
|
198
|
+
critique our radio spots and billboard designs
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
Skills activate automatically when Claude detects matching intent.
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## Built With
|
|
206
|
+
|
|
207
|
+
- **[Claude Code Skills](https://docs.anthropic.com/en/docs/claude-code)** — Anthropic's skill system for extending Claude with domain expertise
|
|
208
|
+
- **ffmpeg** — video frame extraction at configurable intervals
|
|
209
|
+
- **65+ UX laws** curated from established HCI research: Medhi et al. (2011), Nielsen (1994), Gestalt psychology, Fitts (1954), GSMA Mobile for Development, and more
|
|
210
|
+
- **Three-layer triangulation framework** combining UX analysis, behavioral analytics, and outcome data
|
|
211
|
+
- **Ad creative effectiveness research** from Meta ABCD, Kantar (200K+ ad database), System1, Nielsen, IPA Databank (1,400+ case studies)
|
|
212
|
+
- **Platform-specific ad specs** for Meta, Google, TikTok, LinkedIn, X, and Pinterest
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## Contributing
|
|
217
|
+
|
|
218
|
+
Contributions are welcome. Areas where help is especially valuable:
|
|
219
|
+
|
|
220
|
+
- **New UX law categories** — additional principles with audit checklists
|
|
221
|
+
- **Analytics platform integrations** — better export guides for niche platforms
|
|
222
|
+
- **Report template improvements** — accessibility, print styles, dark mode
|
|
223
|
+
- **New skills** — other review types (accessibility audit, content strategy review, competitor teardown) following the same pattern
|
|
224
|
+
- **Ad platform updates** — specs change frequently; keep ad-platforms.md current
|
|
225
|
+
- **Language/localization** — report templates and UX law references in other languages
|
|
226
|
+
- **Real-world case studies** — anonymized examples showing the pipeline in action
|
|
227
|
+
|
|
228
|
+
To contribute:
|
|
229
|
+
|
|
230
|
+
1. Fork this repository
|
|
231
|
+
2. Create a feature branch (`git checkout -b feature/your-feature`)
|
|
232
|
+
3. Make your changes
|
|
233
|
+
4. Test by installing the skill locally and running a review
|
|
234
|
+
5. Submit a pull request with a clear description of what changed and why
|
|
235
|
+
|
|
236
|
+
---
|
|
237
|
+
|
|
238
|
+
## License
|
|
239
|
+
|
|
240
|
+
MIT
|
package/bin/eagle-skills
ADDED
|
@@ -0,0 +1,361 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
set -euo pipefail
|
|
3
|
+
|
|
4
|
+
# ─────────────────────────────────────────────────────────────
|
|
5
|
+
# Eagle Skills — CLI installer, updater, and manager
|
|
6
|
+
# https://github.com/eagleisbatman/eagle-skills
|
|
7
|
+
# ─────────────────────────────────────────────────────────────
|
|
8
|
+
|
|
9
|
+
VERSION="1.0.0"
|
|
10
|
+
REPO_URL="https://github.com/eagleisbatman/eagle-skills.git"
|
|
11
|
+
INSTALL_DIR="${EAGLE_SKILLS_DIR:-$HOME/.eagle-skills}"
|
|
12
|
+
SKILLS_DIR="$HOME/.claude/skills"
|
|
13
|
+
|
|
14
|
+
# Available skills (directory name → display name)
|
|
15
|
+
declare -a SKILL_DIRS=("eagle-ux-review" "eagle-product-diagnostics" "eagle-ad-review")
|
|
16
|
+
declare -a SKILL_NAMES=("Eagle UX Review" "Eagle Product Diagnostics" "Eagle Ad Review")
|
|
17
|
+
declare -a SKILL_DESCS=(
|
|
18
|
+
"Expert-level UX audits grounded in 65+ UX laws"
|
|
19
|
+
"Three-layer data validation: design intent + behavior + outcomes"
|
|
20
|
+
"Strategy-first ad creative review across any medium"
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
# ─── Colors ──────────────────────────────────────────────────
|
|
24
|
+
RED='\033[0;31m'
|
|
25
|
+
GREEN='\033[0;32m'
|
|
26
|
+
YELLOW='\033[0;33m'
|
|
27
|
+
BLUE='\033[0;34m'
|
|
28
|
+
MAGENTA='\033[0;35m'
|
|
29
|
+
CYAN='\033[0;36m'
|
|
30
|
+
BOLD='\033[1m'
|
|
31
|
+
DIM='\033[2m'
|
|
32
|
+
RESET='\033[0m'
|
|
33
|
+
|
|
34
|
+
# ─── Helpers ─────────────────────────────────────────────────
|
|
35
|
+
info() { echo -e "${BLUE}info${RESET} $1"; }
|
|
36
|
+
ok() { echo -e "${GREEN} ok${RESET} $1"; }
|
|
37
|
+
warn() { echo -e "${YELLOW}warn${RESET} $1"; }
|
|
38
|
+
err() { echo -e "${RED} err${RESET} $1"; }
|
|
39
|
+
header() { echo -e "\n${BOLD}${MAGENTA}$1${RESET}\n"; }
|
|
40
|
+
|
|
41
|
+
check_git() {
|
|
42
|
+
if ! command -v git &>/dev/null; then
|
|
43
|
+
err "git is required but not installed."
|
|
44
|
+
exit 1
|
|
45
|
+
fi
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
check_claude_code() {
|
|
49
|
+
if [ ! -d "$HOME/.claude" ]; then
|
|
50
|
+
warn "~/.claude directory not found. Is Claude Code installed?"
|
|
51
|
+
echo -e " ${DIM}Install: https://docs.anthropic.com/en/docs/claude-code${RESET}"
|
|
52
|
+
read -rp " Continue anyway? [y/N] " answer
|
|
53
|
+
[[ "$answer" =~ ^[Yy]$ ]] || exit 0
|
|
54
|
+
fi
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
ensure_skills_dir() {
|
|
58
|
+
mkdir -p "$SKILLS_DIR"
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
# ─── Skill selection menu ────────────────────────────────────
|
|
62
|
+
select_skills() {
|
|
63
|
+
local -a selected=()
|
|
64
|
+
|
|
65
|
+
header "Eagle Skills"
|
|
66
|
+
echo -e " ${DIM}Custom skills for Claude Code${RESET}"
|
|
67
|
+
echo ""
|
|
68
|
+
|
|
69
|
+
echo -e " ${BOLD}Available skills:${RESET}"
|
|
70
|
+
echo ""
|
|
71
|
+
for i in "${!SKILL_DIRS[@]}"; do
|
|
72
|
+
local num=$((i + 1))
|
|
73
|
+
echo -e " ${CYAN}${num}${RESET} ${BOLD}${SKILL_NAMES[$i]}${RESET}"
|
|
74
|
+
echo -e " ${DIM}${SKILL_DESCS[$i]}${RESET}"
|
|
75
|
+
echo ""
|
|
76
|
+
done
|
|
77
|
+
|
|
78
|
+
echo -e " ${CYAN}a${RESET} ${BOLD}All skills${RESET}"
|
|
79
|
+
echo ""
|
|
80
|
+
|
|
81
|
+
read -rp " Select skills to install (e.g. 1,3 or a for all): " choice
|
|
82
|
+
|
|
83
|
+
if [[ "$choice" =~ ^[Aa]$ ]]; then
|
|
84
|
+
selected=("${SKILL_DIRS[@]}")
|
|
85
|
+
else
|
|
86
|
+
IFS=',' read -ra nums <<< "$choice"
|
|
87
|
+
for num in "${nums[@]}"; do
|
|
88
|
+
num=$(echo "$num" | tr -d ' ')
|
|
89
|
+
if [[ "$num" =~ ^[0-9]+$ ]] && [ "$num" -ge 1 ] && [ "$num" -le "${#SKILL_DIRS[@]}" ]; then
|
|
90
|
+
selected+=("${SKILL_DIRS[$((num - 1))]}")
|
|
91
|
+
else
|
|
92
|
+
warn "Skipping invalid selection: $num"
|
|
93
|
+
fi
|
|
94
|
+
done
|
|
95
|
+
fi
|
|
96
|
+
|
|
97
|
+
if [ ${#selected[@]} -eq 0 ]; then
|
|
98
|
+
err "No skills selected."
|
|
99
|
+
exit 1
|
|
100
|
+
fi
|
|
101
|
+
|
|
102
|
+
SELECTED_SKILLS=("${selected[@]}")
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
# ─── Commands ────────────────────────────────────────────────
|
|
106
|
+
|
|
107
|
+
cmd_install() {
|
|
108
|
+
check_git
|
|
109
|
+
check_claude_code
|
|
110
|
+
ensure_skills_dir
|
|
111
|
+
|
|
112
|
+
select_skills
|
|
113
|
+
|
|
114
|
+
echo ""
|
|
115
|
+
|
|
116
|
+
# Clone or update the repo
|
|
117
|
+
if [ -d "$INSTALL_DIR/.git" ]; then
|
|
118
|
+
info "Updating existing clone at $INSTALL_DIR"
|
|
119
|
+
git -C "$INSTALL_DIR" pull --quiet
|
|
120
|
+
ok "Repository updated"
|
|
121
|
+
else
|
|
122
|
+
info "Cloning eagle-skills to $INSTALL_DIR"
|
|
123
|
+
git clone --quiet "$REPO_URL" "$INSTALL_DIR"
|
|
124
|
+
ok "Repository cloned"
|
|
125
|
+
fi
|
|
126
|
+
|
|
127
|
+
# Symlink selected skills
|
|
128
|
+
local count=0
|
|
129
|
+
for skill in "${SELECTED_SKILLS[@]}"; do
|
|
130
|
+
local src="$INSTALL_DIR/$skill"
|
|
131
|
+
local dst="$SKILLS_DIR/$skill"
|
|
132
|
+
|
|
133
|
+
if [ ! -d "$src" ]; then
|
|
134
|
+
warn "Skill directory not found: $src (skipping)"
|
|
135
|
+
continue
|
|
136
|
+
fi
|
|
137
|
+
|
|
138
|
+
# Remove existing (symlink or directory)
|
|
139
|
+
if [ -L "$dst" ]; then
|
|
140
|
+
rm "$dst"
|
|
141
|
+
elif [ -d "$dst" ]; then
|
|
142
|
+
warn "$dst exists and is not a symlink. Overwrite? [y/N]"
|
|
143
|
+
read -rp " " answer
|
|
144
|
+
if [[ "$answer" =~ ^[Yy]$ ]]; then
|
|
145
|
+
rm -rf "$dst"
|
|
146
|
+
else
|
|
147
|
+
warn "Skipping $skill"
|
|
148
|
+
continue
|
|
149
|
+
fi
|
|
150
|
+
fi
|
|
151
|
+
|
|
152
|
+
ln -sf "$src" "$dst"
|
|
153
|
+
ok "Installed ${BOLD}$(skill_display_name "$skill")${RESET}"
|
|
154
|
+
count=$((count + 1))
|
|
155
|
+
done
|
|
156
|
+
|
|
157
|
+
echo ""
|
|
158
|
+
if [ "$count" -gt 0 ]; then
|
|
159
|
+
echo -e " ${GREEN}${BOLD}$count skill(s) installed.${RESET}"
|
|
160
|
+
echo -e " ${DIM}Skills are symlinked — run ${RESET}eagle-skills update${DIM} to get the latest.${RESET}"
|
|
161
|
+
else
|
|
162
|
+
warn "No skills were installed."
|
|
163
|
+
fi
|
|
164
|
+
echo ""
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
cmd_update() {
|
|
168
|
+
if [ ! -d "$INSTALL_DIR/.git" ]; then
|
|
169
|
+
err "Eagle Skills not found at $INSTALL_DIR"
|
|
170
|
+
echo -e " ${DIM}Run ${RESET}eagle-skills install${DIM} first.${RESET}"
|
|
171
|
+
exit 1
|
|
172
|
+
fi
|
|
173
|
+
|
|
174
|
+
header "Updating Eagle Skills"
|
|
175
|
+
|
|
176
|
+
local before
|
|
177
|
+
before=$(git -C "$INSTALL_DIR" rev-parse HEAD)
|
|
178
|
+
git -C "$INSTALL_DIR" pull --quiet
|
|
179
|
+
local after
|
|
180
|
+
after=$(git -C "$INSTALL_DIR" rev-parse HEAD)
|
|
181
|
+
|
|
182
|
+
if [ "$before" = "$after" ]; then
|
|
183
|
+
ok "Already up to date."
|
|
184
|
+
else
|
|
185
|
+
local changes
|
|
186
|
+
changes=$(git -C "$INSTALL_DIR" log --oneline "$before..$after" | wc -l | tr -d ' ')
|
|
187
|
+
ok "Updated ($changes new commit(s))"
|
|
188
|
+
echo ""
|
|
189
|
+
echo -e " ${DIM}Recent changes:${RESET}"
|
|
190
|
+
git -C "$INSTALL_DIR" log --oneline "$before..$after" | head -10 | while read -r line; do
|
|
191
|
+
echo -e " ${DIM}$line${RESET}"
|
|
192
|
+
done
|
|
193
|
+
fi
|
|
194
|
+
|
|
195
|
+
# Verify symlinks still work
|
|
196
|
+
echo ""
|
|
197
|
+
local broken=0
|
|
198
|
+
for skill in "${SKILL_DIRS[@]}"; do
|
|
199
|
+
local dst="$SKILLS_DIR/$skill"
|
|
200
|
+
if [ -L "$dst" ]; then
|
|
201
|
+
if [ -d "$dst" ]; then
|
|
202
|
+
ok "$skill"
|
|
203
|
+
else
|
|
204
|
+
err "$skill — broken symlink"
|
|
205
|
+
broken=$((broken + 1))
|
|
206
|
+
fi
|
|
207
|
+
fi
|
|
208
|
+
done
|
|
209
|
+
|
|
210
|
+
if [ "$broken" -gt 0 ]; then
|
|
211
|
+
warn "$broken broken symlink(s). Run ${RESET}eagle-skills install${DIM} to fix.${RESET}"
|
|
212
|
+
fi
|
|
213
|
+
echo ""
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
cmd_status() {
|
|
217
|
+
header "Eagle Skills — Status"
|
|
218
|
+
|
|
219
|
+
# Check install directory
|
|
220
|
+
if [ -d "$INSTALL_DIR/.git" ]; then
|
|
221
|
+
local commit
|
|
222
|
+
commit=$(git -C "$INSTALL_DIR" log --oneline -1)
|
|
223
|
+
ok "Repo: $INSTALL_DIR"
|
|
224
|
+
echo -e " ${DIM}$commit${RESET}"
|
|
225
|
+
|
|
226
|
+
# Check for updates
|
|
227
|
+
git -C "$INSTALL_DIR" fetch --quiet 2>/dev/null || true
|
|
228
|
+
local local_rev remote_rev
|
|
229
|
+
local_rev=$(git -C "$INSTALL_DIR" rev-parse HEAD)
|
|
230
|
+
remote_rev=$(git -C "$INSTALL_DIR" rev-parse '@{u}' 2>/dev/null || echo "$local_rev")
|
|
231
|
+
if [ "$local_rev" != "$remote_rev" ]; then
|
|
232
|
+
local behind
|
|
233
|
+
behind=$(git -C "$INSTALL_DIR" rev-list --count HEAD..'@{u}' 2>/dev/null || echo "?")
|
|
234
|
+
warn "Update available ($behind commit(s) behind)"
|
|
235
|
+
fi
|
|
236
|
+
else
|
|
237
|
+
warn "Not installed. Run: eagle-skills install"
|
|
238
|
+
return
|
|
239
|
+
fi
|
|
240
|
+
|
|
241
|
+
echo ""
|
|
242
|
+
|
|
243
|
+
# Check each skill
|
|
244
|
+
echo -e " ${BOLD}Installed skills:${RESET}"
|
|
245
|
+
echo ""
|
|
246
|
+
local installed=0
|
|
247
|
+
for i in "${!SKILL_DIRS[@]}"; do
|
|
248
|
+
local skill="${SKILL_DIRS[$i]}"
|
|
249
|
+
local dst="$SKILLS_DIR/$skill"
|
|
250
|
+
if [ -L "$dst" ] && [ -d "$dst" ]; then
|
|
251
|
+
echo -e " ${GREEN}*${RESET} ${BOLD}${SKILL_NAMES[$i]}${RESET}"
|
|
252
|
+
echo -e " ${DIM}$dst -> $(readlink "$dst")${RESET}"
|
|
253
|
+
installed=$((installed + 1))
|
|
254
|
+
elif [ -L "$dst" ]; then
|
|
255
|
+
echo -e " ${RED}!${RESET} ${BOLD}${SKILL_NAMES[$i]}${RESET} ${RED}(broken symlink)${RESET}"
|
|
256
|
+
elif [ -d "$dst" ]; then
|
|
257
|
+
echo -e " ${YELLOW}~${RESET} ${BOLD}${SKILL_NAMES[$i]}${RESET} ${YELLOW}(copied, not symlinked)${RESET}"
|
|
258
|
+
installed=$((installed + 1))
|
|
259
|
+
else
|
|
260
|
+
echo -e " ${DIM}-${RESET} ${DIM}${SKILL_NAMES[$i]}${RESET} ${DIM}(not installed)${RESET}"
|
|
261
|
+
fi
|
|
262
|
+
done
|
|
263
|
+
echo ""
|
|
264
|
+
echo -e " ${DIM}$installed of ${#SKILL_DIRS[@]} skills installed${RESET}"
|
|
265
|
+
echo ""
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
cmd_uninstall() {
|
|
269
|
+
header "Uninstall Eagle Skills"
|
|
270
|
+
|
|
271
|
+
local removed=0
|
|
272
|
+
|
|
273
|
+
for i in "${!SKILL_DIRS[@]}"; do
|
|
274
|
+
local skill="${SKILL_DIRS[$i]}"
|
|
275
|
+
local dst="$SKILLS_DIR/$skill"
|
|
276
|
+
if [ -L "$dst" ]; then
|
|
277
|
+
rm "$dst"
|
|
278
|
+
ok "Removed ${SKILL_NAMES[$i]}"
|
|
279
|
+
removed=$((removed + 1))
|
|
280
|
+
elif [ -d "$dst" ]; then
|
|
281
|
+
read -rp " Remove ${SKILL_NAMES[$i]} (not a symlink — will delete)? [y/N] " answer
|
|
282
|
+
if [[ "$answer" =~ ^[Yy]$ ]]; then
|
|
283
|
+
rm -rf "$dst"
|
|
284
|
+
ok "Removed ${SKILL_NAMES[$i]}"
|
|
285
|
+
removed=$((removed + 1))
|
|
286
|
+
fi
|
|
287
|
+
fi
|
|
288
|
+
done
|
|
289
|
+
|
|
290
|
+
if [ "$removed" -eq 0 ]; then
|
|
291
|
+
info "No skills were installed."
|
|
292
|
+
else
|
|
293
|
+
ok "$removed skill(s) removed."
|
|
294
|
+
fi
|
|
295
|
+
|
|
296
|
+
# Optionally remove the clone
|
|
297
|
+
if [ -d "$INSTALL_DIR" ]; then
|
|
298
|
+
echo ""
|
|
299
|
+
read -rp " Also remove the cloned repo at $INSTALL_DIR? [y/N] " answer
|
|
300
|
+
if [[ "$answer" =~ ^[Yy]$ ]]; then
|
|
301
|
+
rm -rf "$INSTALL_DIR"
|
|
302
|
+
ok "Repo removed."
|
|
303
|
+
fi
|
|
304
|
+
fi
|
|
305
|
+
echo ""
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
skill_display_name() {
|
|
309
|
+
local dir="$1"
|
|
310
|
+
for i in "${!SKILL_DIRS[@]}"; do
|
|
311
|
+
if [ "${SKILL_DIRS[$i]}" = "$dir" ]; then
|
|
312
|
+
echo "${SKILL_NAMES[$i]}"
|
|
313
|
+
return
|
|
314
|
+
fi
|
|
315
|
+
done
|
|
316
|
+
echo "$dir"
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
cmd_help() {
|
|
320
|
+
echo ""
|
|
321
|
+
echo -e "${BOLD}Eagle Skills${RESET} v${VERSION}"
|
|
322
|
+
echo -e "${DIM}Custom skills for Claude Code${RESET}"
|
|
323
|
+
echo ""
|
|
324
|
+
echo -e "${BOLD}Usage:${RESET}"
|
|
325
|
+
echo " eagle-skills <command>"
|
|
326
|
+
echo ""
|
|
327
|
+
echo -e "${BOLD}Commands:${RESET}"
|
|
328
|
+
echo " install Select and install skills for Claude Code"
|
|
329
|
+
echo " update Pull latest changes (symlinked skills update automatically)"
|
|
330
|
+
echo " status Show installed skills and check for updates"
|
|
331
|
+
echo " uninstall Remove installed skills"
|
|
332
|
+
echo " help Show this help message"
|
|
333
|
+
echo ""
|
|
334
|
+
echo -e "${BOLD}Quick start:${RESET}"
|
|
335
|
+
echo " npx eagle-skills install"
|
|
336
|
+
echo ""
|
|
337
|
+
echo -e "${BOLD}Alternative (without npm):${RESET}"
|
|
338
|
+
echo " curl -fsSL https://raw.githubusercontent.com/eagleisbatman/eagle-skills/main/install.sh | bash"
|
|
339
|
+
echo ""
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
# ─── Main ────────────────────────────────────────────────────
|
|
343
|
+
main() {
|
|
344
|
+
local cmd="${1:-help}"
|
|
345
|
+
|
|
346
|
+
case "$cmd" in
|
|
347
|
+
install) cmd_install ;;
|
|
348
|
+
update) cmd_update ;;
|
|
349
|
+
status) cmd_status ;;
|
|
350
|
+
uninstall) cmd_uninstall ;;
|
|
351
|
+
help|--help|-h) cmd_help ;;
|
|
352
|
+
version|--version|-v) echo "eagle-skills v${VERSION}" ;;
|
|
353
|
+
*)
|
|
354
|
+
err "Unknown command: $cmd"
|
|
355
|
+
cmd_help
|
|
356
|
+
exit 1
|
|
357
|
+
;;
|
|
358
|
+
esac
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
main "$@"
|