clawdie-iso/scripts/import-clawdie-skills.sh
Claude (domedog) e2e74e8418 build(iso): upgrade FreeBSD Python 3.11 -> 3.12
Standardize the ISO on the agreed Python 3.12 floor (operator + Hermes +
Claude consensus; see layered-soul/docs/TOOLCHAIN.md).

- pkg lists: python311->python312, py311-{pip,aider_chat,pillow}->py312-*
- build.sh: derive the installed python3.N for the python3/python symlink so a
  future bump needs only a pkg-list change, never an edit here
- shell-deploy.sh: create the Aider venv with 'python3 -m venv' (resolves via
  the symlink) instead of a hardcoded python3.11
- import-clawdie-skills.sh: python3 fallback instead of python3.11
- BUILD.md: doc references

Aider kept (bumped, not dropped): redundant coding tooling is intentional per
the agent matrix.

Pre-merge gate: confirm FreeBSD pkg coverage on osa —
  pkg search '^py312-aider_chat' '^py312-pygobject'
(common modules pillow/pip are safe).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-17 14:38:20 +02:00

81 lines
3.1 KiB
Bash
Executable file

#!/bin/sh
# Import clawdie-ai skill definitions into the colibri skills catalog.
#
# Reads .agent/skills/*/SKILL.md from a clawdie-ai checkout, extracts
# YAML frontmatter (name, description), derives category, and inserts
# into the colibri SQLite coordination database.
#
# Usage during ISO build:
# scripts/import-clawdie-skills.sh /path/to/clawdie-ai /path/to/mount-point
set -eu
CLAWDIE_AI="${1:?usage: $0 <clawdie-ai-dir> <mount-point>}"
MOUNT_POINT="${2:?usage: $0 <clawdie-ai-dir> <mount-point>}"
DB="${MOUNT_POINT}/var/db/colibri/colibri.sqlite"
if [ ! -d "$CLAWDIE_AI/.agent/skills" ]; then
echo " clawdie-ai skills dir not found, skipping import"
exit 0
fi
if ! command -v sqlite3 >/dev/null 2>&1; then
echo " sqlite3 not available, skipping skills import"
exit 0
fi
# Ensure the skills table exists
sqlite3 "$DB" "CREATE TABLE IF NOT EXISTS skills (
id TEXT PRIMARY KEY NOT NULL,
name TEXT NOT NULL UNIQUE,
description TEXT,
category TEXT,
created_at TEXT NOT NULL
);" 2>/dev/null || true
NOW=$(date -u +%Y-%m-%dT%H:%M:%SZ)
IMPORTED=0
SKIPPED=0
for skill_md in "$CLAWDIE_AI"/.agent/skills/*/SKILL.md; do
[ -f "$skill_md" ] || continue
# Extract YAML frontmatter between --- markers
frontmatter=$(sed -n '/^---$/,/^---$/p' "$skill_md" | sed '1d;$d')
# Extract name (first "name:" line after frontmatter)
name=$(echo "$frontmatter" | grep -m1 '^name:' | sed 's/^name: *//' | tr -d '"')
[ -n "$name" ] || continue
# Extract description
description=$(echo "$frontmatter" | sed -n '/^description:/,/^[a-z]/p' | sed '$d' | sed 's/^description: *//' | tr '\n' ' ' | sed 's/ */ /g' | sed 's/^ *//;s/ *$//')
# Handle multi-line descriptions (| indicator)
if echo "$description" | grep -q '^|$'; then
description=$(echo "$frontmatter" | awk '/^description:/{found=1; next} /^[a-z]/{if(found) exit} found{print}' | tr '\n' ' ' | sed 's/ */ /g' | sed 's/^ *//;s/ *$//')
fi
[ -n "$description" ] || description="$name skill"
# Derive category from skill name prefix
case "$name" in
git-*) category="git" ;;
db-*|postgres*) category="database" ;;
zfs-*) category="zfs" ;;
add-*) category="integration" ;;
freebsd-*) category="freebsd" ;;
ansible-*) category="automation" ;;
*) category="clawdie" ;;
esac
# Override category if compatibility field indicates FreeBSD
if echo "$frontmatter" | grep -q 'compatibility:.*FreeBSD'; then
category="freebsd"
fi
id=$(uuidgen 2>/dev/null || python3 -c "import uuid; print(uuid.uuid4())" 2>/dev/null || echo "skill-$(echo "$name" | md5)")
sqlite3 "$DB" "INSERT OR IGNORE INTO skills (id, name, description, category, created_at)
VALUES ('$id', '$(echo "$name" | sed "s/'/''/g")', '$(echo "$description" | sed "s/'/''/g")', '$category', '$NOW');" 2>/dev/null && IMPORTED=$((IMPORTED + 1)) || SKIPPED=$((SKIPPED + 1))
done
chroot "$MOUNT_POINT" chown colibri:colibri /var/db/colibri/colibri.sqlite 2>/dev/null || true
echo " clawdie-ai skills: $IMPORTED imported, $SKIPPED skipped"