From ec5386cf57130a625cadf1d8e8bf2bff9eddcaf3 Mon Sep 17 00:00:00 2001 From: dan Date: Sun, 30 Nov 2025 15:00:46 -0800 Subject: [PATCH] refactor(use-skills): simplify execution flow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- bin/use-skills.sh | 45 +++++++++++++++------------------------------ 1 file changed, 15 insertions(+), 30 deletions(-) diff --git a/bin/use-skills.sh b/bin/use-skills.sh index 79b08e5..53b8e04 100755 --- a/bin/use-skills.sh +++ b/bin/use-skills.sh @@ -3,17 +3,16 @@ # Source this from your .envrc or copy the functions # # Usage in .envrc: -# source /path/to/skills/bin/use-skills.sh +# source ~/proj/skills/bin/use-skills.sh # use_skills worklog web-search # -# Or without sourcing (copy-paste into .envrc): -# SKILLS_REPO="git+ssh://git@forgejo.example/dan/skills.git" -# use_skill() { ... } -# use_skill worklog +# Or with manifest file: +# source ~/proj/skills/bin/use-skills.sh +# load_skills_from_manifest + +set -euo pipefail # 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}" # Install a single skill via nix build + symlink @@ -21,48 +20,34 @@ use_skill() { local skill="$1" local out - out=$(nix build --print-out-paths --no-link "${SKILLS_REPO}#${skill}" 2>/dev/null) - if [[ -z "$out" ]]; then + out=$(nix build --print-out-paths --no-link "${SKILLS_REPO}#${skill}" 2>&1) || { echo "use_skill: failed to build ${skill}" >&2 + echo "$out" >&2 return 1 - fi + } - # Claude Code - if [[ -d .claude ]] || [[ -n "${SKILLS_CLAUDE:-}" ]]; then - mkdir -p .claude/skills - ln -sfn "$out" ".claude/skills/${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}" + mkdir -p .claude/skills .opencode/skills + ln -sfn "$out" ".claude/skills/${skill}" + ln -sfn "$out" ".opencode/skills/${skill}" + echo "use_skill: ${skill}" } # Install multiple skills use_skills() { - # Ensure at least one target exists - mkdir -p .claude/skills .opencode/skills - for skill in "$@"; do - use_skill "$skill" + use_skill "$skill" || return 1 done } # Load skills from .skills manifest file load_skills_from_manifest() { [[ ! -f .skills ]] && return 0 - mkdir -p .claude/skills .opencode/skills - while IFS= read -r skill || [[ -n "$skill" ]]; do # Skip empty lines and comments [[ -z "$skill" || "$skill" =~ ^[[:space:]]*# ]] && continue # Strip inline comments and whitespace skill="${skill%%#*}" skill="${skill// /}" - [[ -n "$skill" ]] && use_skill "$skill" + [[ -n "$skill" ]] && { use_skill "$skill" || return 1; } done < .skills }