diff --git a/scripts/check-token-drift.sh b/scripts/check-token-drift.sh new file mode 100755 index 00000000..adb6b9ab --- /dev/null +++ b/scripts/check-token-drift.sh @@ -0,0 +1,79 @@ +#!/usr/bin/env bash +# check-token-drift.sh — Verify generated design token files are up to date. +# +# Regenerates all token outputs from the canonical bytelyst.tokens.json +# and diffs them against the committed files. Non-zero exit if any drift. +# +# Usage: +# bash scripts/check-token-drift.sh # check for drift +# bash scripts/check-token-drift.sh --fix # regenerate and stage changes + +set -euo pipefail + +REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" +TOKENS_DIR="$REPO_ROOT/packages/design-tokens" +GENERATED_DIR="$TOKENS_DIR/generated" + +FIX=false +if [[ "${1:-}" == "--fix" ]]; then + FIX=true +fi + +echo "🔍 Checking design token drift..." + +# 1. Snapshot current generated files +TMPDIR=$(mktemp -d) +trap 'rm -rf "$TMPDIR"' EXIT + +if [ -d "$GENERATED_DIR" ]; then + cp -r "$GENERATED_DIR" "$TMPDIR/before" +else + mkdir -p "$TMPDIR/before" +fi + +# 2. Regenerate tokens +echo " Regenerating tokens from bytelyst.tokens.json..." +cd "$TOKENS_DIR" +if [ -f "package.json" ] && grep -q '"generate"' package.json; then + npx tsx scripts/generate.ts 2>/dev/null || { + echo "⚠️ Token generation script failed — skipping drift check" + exit 0 + } +else + echo "⚠️ No generate script found in packages/design-tokens — skipping" + exit 0 +fi + +# 3. Snapshot regenerated output +cp -r "$GENERATED_DIR" "$TMPDIR/after" + +# 4. Diff +DIFF_OUTPUT=$(diff -rq "$TMPDIR/before" "$TMPDIR/after" 2>/dev/null || true) + +if [ -z "$DIFF_OUTPUT" ]; then + echo "✅ No token drift detected — generated files are up to date." + exit 0 +fi + +echo "" +echo "❌ Token drift detected! The following files are out of date:" +echo "" +echo "$DIFF_OUTPUT" | while IFS= read -r line; do + # Extract just the relative path + file=$(echo "$line" | sed "s|.*$TMPDIR/before/||; s|.*$TMPDIR/after/||; s| differ||; s| and .*||") + echo " - generated/$file" +done + +if $FIX; then + echo "" + echo "🔧 --fix mode: staging regenerated token files..." + cd "$REPO_ROOT" + git add "$GENERATED_DIR" + echo "✅ Regenerated files staged. Commit and push to fix drift." + exit 0 +else + echo "" + echo "Run 'bash scripts/check-token-drift.sh --fix' to regenerate and stage." + echo "Or: cd packages/design-tokens && npx tsx scripts/generate.ts" + exit 1 +fi