refactor(use-skills): simplify execution flow

- Add set -euo pipefail for safer defaults
- Remove conditional directory logic - always create both
- Remove undocumented SKILLS_CLAUDE/SKILLS_OPENCODE env vars
- Add fail-fast error handling throughout
- Capture nix build stderr for better error messages

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
dan 2025-11-30 15:00:46 -08:00
parent e921fd96df
commit ec5386cf57

View file

@ -3,17 +3,16 @@
# Source this from your .envrc or copy the functions # Source this from your .envrc or copy the functions
# #
# Usage in .envrc: # Usage in .envrc:
# source /path/to/skills/bin/use-skills.sh # source ~/proj/skills/bin/use-skills.sh
# use_skills worklog web-search # use_skills worklog web-search
# #
# Or without sourcing (copy-paste into .envrc): # Or with manifest file:
# SKILLS_REPO="git+ssh://git@forgejo.example/dan/skills.git" # source ~/proj/skills/bin/use-skills.sh
# use_skill() { ... } # load_skills_from_manifest
# use_skill worklog
set -euo pipefail
# Default repo - uses local git, override with SKILLS_REPO for remote # Default repo - uses local git, override with SKILLS_REPO for remote
# Local: git+file:///home/dan/proj/skills (default, works offline)
# Network: git+http://192.168.1.108:3000/dan/skills.git
SKILLS_REPO="${SKILLS_REPO:-git+file://$HOME/proj/skills}" SKILLS_REPO="${SKILLS_REPO:-git+file://$HOME/proj/skills}"
# Install a single skill via nix build + symlink # Install a single skill via nix build + symlink
@ -21,48 +20,34 @@ use_skill() {
local skill="$1" local skill="$1"
local out local out
out=$(nix build --print-out-paths --no-link "${SKILLS_REPO}#${skill}" 2>/dev/null) out=$(nix build --print-out-paths --no-link "${SKILLS_REPO}#${skill}" 2>&1) || {
if [[ -z "$out" ]]; then
echo "use_skill: failed to build ${skill}" >&2 echo "use_skill: failed to build ${skill}" >&2
echo "$out" >&2
return 1 return 1
fi }
# Claude Code mkdir -p .claude/skills .opencode/skills
if [[ -d .claude ]] || [[ -n "${SKILLS_CLAUDE:-}" ]]; then ln -sfn "$out" ".claude/skills/${skill}"
mkdir -p .claude/skills ln -sfn "$out" ".opencode/skills/${skill}"
ln -sfn "$out" ".claude/skills/${skill}" echo "use_skill: ${skill}"
fi
# OpenCode
if [[ -d .opencode ]] || [[ -n "${SKILLS_OPENCODE:-}" ]]; then
mkdir -p .opencode/skills
ln -sfn "$out" ".opencode/skills/${skill}"
fi
echo "use_skill: ${skill} -> ${out}"
} }
# Install multiple skills # Install multiple skills
use_skills() { use_skills() {
# Ensure at least one target exists
mkdir -p .claude/skills .opencode/skills
for skill in "$@"; do for skill in "$@"; do
use_skill "$skill" use_skill "$skill" || return 1
done done
} }
# Load skills from .skills manifest file # Load skills from .skills manifest file
load_skills_from_manifest() { load_skills_from_manifest() {
[[ ! -f .skills ]] && return 0 [[ ! -f .skills ]] && return 0
mkdir -p .claude/skills .opencode/skills
while IFS= read -r skill || [[ -n "$skill" ]]; do while IFS= read -r skill || [[ -n "$skill" ]]; do
# Skip empty lines and comments # Skip empty lines and comments
[[ -z "$skill" || "$skill" =~ ^[[:space:]]*# ]] && continue [[ -z "$skill" || "$skill" =~ ^[[:space:]]*# ]] && continue
# Strip inline comments and whitespace # Strip inline comments and whitespace
skill="${skill%%#*}" skill="${skill%%#*}"
skill="${skill// /}" skill="${skill// /}"
[[ -n "$skill" ]] && use_skill "$skill" [[ -n "$skill" ]] && { use_skill "$skill" || return 1; }
done < .skills done < .skills
} }