Split context7 concerns into two skills: - using-context7 (policy, every-time): when to call, how to query well - setup-context7 (infrastructure, one-time): install plugin, inject API key, clean manual MCP entries, with confirmation gates setup-context7 reuses an existing CONTEXT7_API_KEY by searching, in order: ~/.claude/settings.json → ~/.claude.json (top-level + project-scoped) → ~/.claude/settings.local.json → env. Asks the user only if nothing found. Cross-platform (paths identical on Win/Linux/macOS; only JSON validator differs). Phase-2 confirmation gate before any write; per-edit JSON validation; rollback procedure documented. using-context7 gets a small Prerequisites section pointing at setup-context7 when MCP tools are missing. Bonus fix: scripts/build.sh PS multi-arg bug. Comma-joined -Names didn't split into [string[]] when build.ps1 was invoked via -File. Now the bash side loops one PS invocation per skill. Wiki: extended .wiki/concepts/context7-setup.md with the design rationale (why split policy from setup) — template for future "X plugin + how to use X" pairs. index.md and log.md updated. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
54 lines
1.8 KiB
Bash
54 lines
1.8 KiB
Bash
#!/usr/bin/env bash
|
|
# Build .skill archives from skills/<name>/ into dist/<name>.skill
|
|
# Usage: build.sh [name...] (no args = all)
|
|
#
|
|
# Uses `zip` if available; otherwise delegates to scripts/build.ps1
|
|
# (so the script works on Linux, macOS, and Windows-with-git-bash without
|
|
# requiring `zip` on Windows).
|
|
set -euo pipefail
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
|
SRC="$ROOT/skills"
|
|
DIST="$ROOT/dist"
|
|
|
|
if command -v zip >/dev/null 2>&1; then
|
|
mkdir -p "$DIST"
|
|
if [ "$#" -eq 0 ]; then
|
|
mapfile -t names < <(find "$SRC" -mindepth 1 -maxdepth 1 -type d -printf '%f\n' | sort)
|
|
else
|
|
names=("$@")
|
|
fi
|
|
for name in "${names[@]}"; do
|
|
src_dir="$SRC/$name"
|
|
if [ ! -d "$src_dir" ]; then
|
|
echo "skip: $name (not found in skills/)" >&2
|
|
continue
|
|
fi
|
|
if [ ! -f "$src_dir/SKILL.md" ]; then
|
|
echo "skip: $name (missing SKILL.md)" >&2
|
|
continue
|
|
fi
|
|
out="$DIST/$name.skill"
|
|
rm -f "$out"
|
|
( cd "$SRC" && zip -qr "$out" "$name" )
|
|
echo "built: dist/$name.skill"
|
|
done
|
|
elif command -v powershell.exe >/dev/null 2>&1; then
|
|
# Windows fallback: delegate to build.ps1 (proper ZIP via .NET API).
|
|
# PS array binding via -File is fragile (commas don't always split into [string[]]),
|
|
# so call build.ps1 once per skill and let the bash loop do the work.
|
|
ps1="$SCRIPT_DIR/build.ps1"
|
|
ps1_win="$(cygpath -w "$ps1" 2>/dev/null || echo "$ps1")"
|
|
if [ "$#" -eq 0 ]; then
|
|
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "$ps1_win"
|
|
else
|
|
for name in "$@"; do
|
|
powershell.exe -NoProfile -ExecutionPolicy Bypass -File "$ps1_win" -Names "$name"
|
|
done
|
|
fi
|
|
else
|
|
echo "error: need either 'zip' (Linux/macOS) or PowerShell (Windows) to build .skill archives" >&2
|
|
exit 1
|
|
fi
|