$npx -y skills add Soul-Brews-Studio/arra-oracle-skills-cli --skill oracle-soul-sync-updateSync Oracle instruments with the family. Check and update skills to latest version. Use when user says "soul-sync", "sync", "calibrate", "update", or before /awaken.
| 1 | # /oracle-soul-sync-update |
| 2 | |
| 3 | > "Sync your soul with the family." |
| 4 | |
| 5 | All-in-one skill: `/soul-sync` + `/calibrate` + `/update` combined. |
| 6 | |
| 7 | ## Usage |
| 8 | |
| 9 | ``` |
| 10 | /oracle-soul-sync-update # Check + update to latest STABLE |
| 11 | /oracle-soul-sync-update --alpha # Check + update to latest alpha (dev track) |
| 12 | /oracle-soul-sync-update --check # Only check, don't update |
| 13 | /oracle-soul-sync-update --cleanup # Uninstall first, then reinstall |
| 14 | ``` |
| 15 | |
| 16 | ## Step 0: Timestamp + Check Current Version |
| 17 | |
| 18 | Read the installed version from `~/.claude/skills/VERSION.md` (the installer writes this on every install). Fall back to `arra-oracle-skills --version` if the file is missing. |
| 19 | |
| 20 | ```bash |
| 21 | date "+🕐 %H:%M %Z (%A %d %B %Y)" |
| 22 | CURRENT=$(grep -oE 'v[0-9]+\.[0-9]+\.[0-9]+(-alpha\.[0-9]+)?' ~/.claude/skills/VERSION.md 2>/dev/null | head -1) |
| 23 | if [ -z "$CURRENT" ]; then |
| 24 | CURRENT=$(arra-oracle-skills --version 2>/dev/null | grep -oE 'v?[0-9]+\.[0-9]+\.[0-9]+(-alpha\.[0-9]+)?' | head -1) |
| 25 | [ -n "$CURRENT" ] && [ "${CURRENT:0:1}" != "v" ] && CURRENT="v$CURRENT" |
| 26 | fi |
| 27 | echo "Current installed: ${CURRENT:-unknown}" |
| 28 | ``` |
| 29 | |
| 30 | --- |
| 31 | |
| 32 | ## Step 2: Check Latest Version (stable vs alpha) |
| 33 | |
| 34 | Tag format moved to CalVer (`v{YY}.{M}.{D}`, first number ≥ 25) in April 2026. Older tags are SemVer (`v3.x.x`). The latest-check picks CalVer first and treats SemVer as legacy. |
| 35 | |
| 36 | ```bash |
| 37 | # Get ALL tags via jq, separate stable from alpha |
| 38 | TAGS=$(curl -s https://api.github.com/repos/Soul-Brews-Studio/arra-oracle-skills-cli/tags | jq -r '.[].name') |
| 39 | LATEST_STABLE=$(echo "$TAGS" | grep -v 'alpha\|beta\|rc' | head -1) |
| 40 | LATEST_ALPHA=$(echo "$TAGS" | grep 'alpha' | head -1) |
| 41 | echo "Latest stable: $LATEST_STABLE" |
| 42 | echo "Latest alpha: $LATEST_ALPHA" |
| 43 | ``` |
| 44 | |
| 45 | **Default = stable.** Only `--alpha` flag switches to alpha track. Newcomers always get stable. |
| 46 | |
| 47 | ```bash |
| 48 | # Default: stable track. --alpha opts into dev track. |
| 49 | TRACK="stable" |
| 50 | LATEST="$LATEST_STABLE" |
| 51 | |
| 52 | # Override with --alpha flag |
| 53 | # (check ARGUMENTS for --alpha) |
| 54 | if [ "$1" = "--alpha" ] || echo "$ARGUMENTS" | grep -q '\-\-alpha'; then |
| 55 | TRACK="alpha" |
| 56 | LATEST="$LATEST_ALPHA" |
| 57 | fi |
| 58 | echo "Track: $TRACK → comparing against $LATEST" |
| 59 | ``` |
| 60 | |
| 61 | --- |
| 62 | |
| 63 | ## Step 3: Compare Versions — date-drift, not semver-drift (#265, #276) |
| 64 | |
| 65 | CalVer tags encode the release date directly (`v26.4.18` = 2026-04-18). Staleness is more useful as "N days behind" than as a semver gap. Legacy SemVer tags (`v3.x.x`) are flagged for migration. |
| 66 | |
| 67 | For same-day comparisons, we compare GitHub release **publish timestamps** instead of version strings (#276). This is because semver orders `v26.4.18-alpha.22` BEFORE `v26.4.18` (pre-release < stable), but the alpha was actually cut LATER on the same day. Timestamp comparison fixes the false "alpha is stale, downgrade to stable" suggestion. |
| 68 | |
| 69 | ```bash |
| 70 | # Helpers — parse tag → YYYY-MM-DD, diff in days |
| 71 | tag_era() { # "calver" | "semver" | "unknown" |
| 72 | local first=$(echo "$1" | sed 's/^v//; s/-.*$//' | cut -d. -f1) |
| 73 | [ -z "$first" ] && { echo unknown; return; } |
| 74 | [ "$first" -ge 25 ] 2>/dev/null && echo calver || echo semver |
| 75 | } |
| 76 | tag_to_date() { # v26.4.18 → 2026-04-18 |
| 77 | local core=$(echo "$1" | sed 's/^v//; s/-(alpha|beta).*$//' -E) |
| 78 | local yy=$(echo "$core" | cut -d. -f1) |
| 79 | local m=$(echo "$core" | cut -d. -f2) |
| 80 | local d=$(echo "$core" | cut -d. -f3) |
| 81 | printf "%04d-%02d-%02d" "$((2000 + yy))" "$m" "$d" |
| 82 | } |
| 83 | # Get GitHub release publish timestamp as epoch seconds (#276) |
| 84 | tag_publish_epoch() { |
| 85 | local tag=$1 |
| 86 | [ "${tag:0:1}" != "v" ] && tag="v$tag" |
| 87 | local iso=$(gh release view "$tag" --repo Soul-Brews-Studio/arra-oracle-skills-cli --json publishedAt --jq '.publishedAt' 2>/dev/null) |
| 88 | [ -z "$iso" ] && return 1 |
| 89 | # macOS + GNU date compatibility |
| 90 | date -u -d "$iso" +%s 2>/dev/null || date -juf "%Y-%m-%dT%H:%M:%SZ" "$iso" +%s 2>/dev/null |
| 91 | } |
| 92 | |
| 93 | CUR_ERA=$(tag_era "$CURRENT") |
| 94 | LAT_ERA=$(tag_era "$LATEST") |
| 95 | |
| 96 | if [ "$CURRENT" = "$LATEST" ]; then |
| 97 | echo "✅ Soul synced! ($CURRENT) [$TRACK track]" |
| 98 | elif [ "$CUR_ERA" = "semver" ] && [ "$LAT_ERA" = "calver" ]; then |
| 99 | echo "⚠️ Legacy version — migrate $CURRENT → $LATEST (CalVer cut-over)" |
| 100 | else |
| 101 | CUR_DATE=$(tag_to_date "$CURRENT") |
| 102 | LAT_DATE=$(tag_to_date "$LATEST") |
| 103 | DAYS=$(( ( $(date -d "$LAT_DATE" +%s 2>/dev/null || date -juf "%Y-%m-%d" "$LAT_DATE" +%s) - \ |
| 104 | $(date -d "$CUR_DATE" +%s 2>/dev/null || date -juf "%Y-%m-%d" "$CUR_DATE" +%s) ) / 86400 )) |
| 105 | if [ "$DAYS" -eq 0 ]; then |
| 106 | # Same calendar day — use release publish timestamps (#276 fix) |
| 107 | # Semver says alpha < stable, but on the same day alpha may be cut LATER. |
| 108 | # Always trust the GitHub publish_at timestamp as ground truth. |
| 109 | CUR_TS=$(tag_publish_epoch "$CURRENT") |
| 110 | LAT_TS=$(tag_publish_epoch "$LATEST") |
| 111 | if [ -n "$CUR_TS" ] && [ -n "$LAT_TS" ]; then |
| 112 | if [ "$CUR_TS" -ge "$LAT_TS" ]; then |
| 113 | echo "✅ L |