learn.sh now installs skills in three layers: 1. mandatory (.mandatory) - all agents 2. role/position (role-skills.json) - based on ego-mgr fields 3. agent-specific (.skill-list) - optional per-agent extras Deduplicated across layers. ego-mgr unavailable = graceful skip. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
91 lines
2.3 KiB
Bash
Executable File
91 lines
2.3 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
if [[ -z "${AGENT_WORKSPACE:-}" ]]; then
|
|
echo "Error: script must be executed by pcexec"
|
|
exit 1
|
|
fi
|
|
|
|
TARGET_DIR="${AGENT_WORKSPACE}/skills"
|
|
CLAW_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
MANDATORY_FILE="${CLAW_DIR}/.mandatory"
|
|
ROLE_SKILLS_FILE="${CLAW_DIR}/role-skills.json"
|
|
SKILL_LIST="${AGENT_WORKSPACE}/.skill-list"
|
|
|
|
mkdir -p "$TARGET_DIR"
|
|
|
|
# Track installed skills to avoid duplicates
|
|
declare -A INSTALLED
|
|
|
|
install_skill() {
|
|
local skill_name="$1"
|
|
local source="$2"
|
|
|
|
[[ -z "$skill_name" || "$skill_name" == \#* ]] && return
|
|
|
|
if [[ -n "${INSTALLED[$skill_name]:-}" ]]; then
|
|
return
|
|
fi
|
|
|
|
local skill_dir="${CLAW_DIR}/${skill_name}"
|
|
if [[ -d "$skill_dir" ]]; then
|
|
echo "Installing ($source): $skill_name"
|
|
cp -r "$skill_dir" "${TARGET_DIR}/"
|
|
INSTALLED[$skill_name]=1
|
|
else
|
|
echo "Skipping (not found): $skill_name"
|
|
fi
|
|
}
|
|
|
|
# 1. Install mandatory skills
|
|
if [[ -f "$MANDATORY_FILE" ]]; then
|
|
while IFS= read -r skill_name || [[ -n "$skill_name" ]]; do
|
|
install_skill "$skill_name" "mandatory"
|
|
done < "$MANDATORY_FILE"
|
|
fi
|
|
|
|
# 2. Install role-based skills from role-skills.json
|
|
if [[ -f "$ROLE_SKILLS_FILE" ]]; then
|
|
ROLE=$(ego-mgr get role 2>/dev/null || true)
|
|
POSITION=$(ego-mgr get position 2>/dev/null || true)
|
|
|
|
if [[ -n "$ROLE" ]]; then
|
|
ROLE_SKILLS=$(python3 -c "
|
|
import json, sys
|
|
with open('$ROLE_SKILLS_FILE') as f:
|
|
data = json.load(f)
|
|
skills = data.get('roles', {}).get('$ROLE', [])
|
|
print('\n'.join(skills))
|
|
" 2>/dev/null || true)
|
|
|
|
while IFS= read -r skill_name; do
|
|
[[ -n "$skill_name" ]] && install_skill "$skill_name" "role:$ROLE"
|
|
done <<< "$ROLE_SKILLS"
|
|
fi
|
|
|
|
if [[ -n "$POSITION" ]]; then
|
|
POS_SKILLS=$(python3 -c "
|
|
import json, sys
|
|
with open('$ROLE_SKILLS_FILE') as f:
|
|
data = json.load(f)
|
|
skills = data.get('positions', {}).get('$POSITION', [])
|
|
print('\n'.join(skills))
|
|
" 2>/dev/null || true)
|
|
|
|
while IFS= read -r skill_name; do
|
|
[[ -n "$skill_name" ]] && install_skill "$skill_name" "position:$POSITION"
|
|
done <<< "$POS_SKILLS"
|
|
fi
|
|
else
|
|
echo "Warning: role-skills.json not found, skipping role-based skills"
|
|
fi
|
|
|
|
# 3. Install agent-specific skills from .skill-list (if exists)
|
|
if [[ -f "$SKILL_LIST" ]]; then
|
|
while IFS= read -r skill_name || [[ -n "$skill_name" ]]; do
|
|
install_skill "$skill_name" "skill-list"
|
|
done < "$SKILL_LIST"
|
|
fi
|
|
|
|
echo "Done."
|