cd ../../
+# Ensure node_modules are installed
+if [ ! -d "tools/ui/node_modules" ]; then
+ echo "📦 Installing npm dependencies..."
+ cd tools/ui && npm install && cd ../../
+fi
+
# Check and install git hooks if missing
check_and_install_hooks() {
local hooks_missing=false
# Check for required hooks
- if [ ! -f ".git/hooks/pre-commit" ] || [ ! -f ".git/hooks/pre-push" ] || [ ! -f ".git/hooks/post-push" ]; then
+ if [ ! -f ".git/hooks/pre-commit" ] || [ ! -f ".git/hooks/pre-push" ]; then
hooks_missing=true
fi
if [ "$hooks_missing" = true ]; then
echo "🔧 Git hooks missing, installing them..."
- cd tools/ui
- if bash scripts/install-git-hooks.sh; then
+ if bash "$(dirname "$0")/git-hooks/install.sh"; then
echo "✅ Git hooks installed successfully"
else
echo "⚠️ Failed to install git hooks, continuing anyway..."
fi
- cd ../../
else
echo "✅ Git hooks already installed"
fi
--- /dev/null
+#!/usr/bin/env bash
+#
+# Install git hooks for llama-ui
+# Copies pre-commit and pre-push hooks into the repo's .git/hooks directory.
+
+SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
+REPO_ROOT="$(cd "$SCRIPT_DIR/../../../.." && pwd)"
+HOOKS_DIR="$REPO_ROOT/$(cd "$REPO_ROOT" && git rev-parse --git-path hooks)"
+
+# Verify package.json exists
+if [ ! -f "$REPO_ROOT/tools/ui/package.json" ]; then
+ echo "❌ package.json not found in tools/ui"
+ exit 1
+fi
+
+echo "Installing git hooks for llama-ui..."
+
+for hook in pre-commit pre-push; do
+ src="$SCRIPT_DIR/${hook}.sh"
+ dst="$HOOKS_DIR/$hook"
+
+ if cp "$src" "$dst" && chmod +x "$dst"; then
+ echo " ✅ $hook"
+ else
+ echo " ❌ Failed to install $hook"
+ exit 1
+ fi
+done
+
+echo ""
+echo "Pre-commit: format (staged) + type-check"
+echo "Pre-push: lint + test"
+echo ""
+echo "Hooks stash unstaged changes temporarily and restore them after."
+echo "Skip with: git commit --no-verify / git push --no-verify"
--- /dev/null
+#!/usr/bin/env bash
+#
+# Pre-commit hook for llama-ui
+# Runs: format (staged files only) + type-check
+# Stashes unstaged changes temporarily and restores them after.
+
+# Only run when there are staged changes in tools/ui/
+if ! git diff --cached --name-only | grep -q "^tools/ui/"; then
+ exit 0
+fi
+
+REPO_ROOT=$(git rev-parse --show-toplevel)
+cd "$REPO_ROOT/tools/ui"
+
+# Check that node_modules exists
+if [ ! -d "node_modules" ]; then
+ echo "❌ node_modules not found. Run 'npm install' first."
+ exit 1
+fi
+
+# Stash unstaged changes in tools/ui/ so they don't interfere
+stash_name="pi-ui-precommit"
+git stash push --keep-index -u -m "$stash_name" -- tools/ui/ 2>/dev/null || true
+
+echo "Running pre-commit checks for llama-ui..."
+
+# Format only staged files
+staged_ui=$(git diff --cached --name-only -- tools/ui/)
+if [ -n "$staged_ui" ]; then
+ echo "$staged_ui" | xargs npx --no-install prettier --write
+ format_ok=$?
+ # Re-stage formatted files
+ git add tools/ui/
+else
+ format_ok=0
+fi
+
+# Type-check the clean tree
+npm run check
+check_ok=$?
+
+# Restore stashed changes
+if git stash list | grep -q "$stash_name"; then
+ git stash pop 2>/dev/null || true
+fi
+
+if [ $format_ok -ne 0 ]; then
+ echo "❌ Format failed"
+ exit 1
+fi
+if [ $check_ok -ne 0 ]; then
+ echo "❌ Type check failed"
+ exit 1
+fi
+
+echo "✅ Pre-commit checks passed"
+exit 0
--- /dev/null
+#!/usr/bin/env bash
+#
+# Pre-push hook for llama-ui
+# Runs: lint + test
+# Ignores unstaged changes (stashes them temporarily and restores after).
+
+needs_check=false
+
+# Read refs from stdin: local_ref local_sha remote_ref remote_sha
+while read local_ref local_sha remote_ref remote_sha; do
+ # New branch or force-push — always check
+ if [ "$local_sha" = "0000000000000000000000000000000000000000" ] || \
+ [ "$remote_sha" = "0000000000000000000000000000000000000000" ]; then
+ needs_check=true
+ continue
+ fi
+
+ # Check for changes in tools/ui/ between remote and local
+ if git diff --name-only "$remote_sha...$local_sha" -- tools/ui/ | grep -q .; then
+ needs_check=true
+ fi
+done
+
+if [ "$needs_check" = false ]; then
+ exit 0
+fi
+
+REPO_ROOT=$(git rev-parse --show-toplevel)
+cd "$REPO_ROOT/tools/ui"
+
+# Check that node_modules exists
+if [ ! -d "node_modules" ]; then
+ echo "❌ node_modules not found. Run 'npm install' first."
+ exit 1
+fi
+
+# Stash unstaged changes so they don't interfere with checks
+stash_name="pi-ui-prepush"
+git stash push -u -m "$stash_name" -- tools/ui/ 2>/dev/null || true
+
+echo "Running pre-push checks for llama-ui..."
+
+# Lint
+npm run lint
+lint_ok=$?
+
+# Test
+npm test
+test_ok=$?
+
+# Restore stashed changes
+if git stash list | grep -q "$stash_name"; then
+ git stash pop 2>/dev/null || true
+fi
+
+if [ $lint_ok -ne 0 ]; then
+ echo "❌ Lint failed"
+ exit 1
+fi
+if [ $test_ok -ne 0 ]; then
+ echo "❌ Tests failed"
+ exit 1
+fi
+
+echo "✅ Pre-push checks passed"
+exit 0
+++ /dev/null
-#!/bin/bash
-
-# Script to install pre-commit hook for llama-ui
-# Pre-commit: formats, checks, and builds the UI app
-
-REPO_ROOT=$(git rev-parse --show-toplevel)
-PRE_COMMIT_HOOK="$REPO_ROOT/.git/hooks/pre-commit"
-
-echo "Installing pre-commit hook for llama-ui..."
-
-# Create the pre-commit hook
-cat > "$PRE_COMMIT_HOOK" << 'EOF'
-#!/bin/bash
-
-# Check if there are any changes in the tools/ui directory
-if git diff --cached --name-only | grep -q "^tools/ui/"; then
- REPO_ROOT=$(git rev-parse --show-toplevel)
- cd "$REPO_ROOT/tools/ui"
-
- # Check if package.json exists
- if [ ! -f "package.json" ]; then
- echo "Error: package.json not found in tools/ui"
- exit 1
- fi
-
- echo "Formatting and checking llama-ui code..."
-
- # Run the format command
- npm run format
- if [ $? -ne 0 ]; then
- echo "Error: npm run format failed"
- exit 1
- fi
-
- # Run the lint command
- npm run lint
- if [ $? -ne 0 ]; then
- echo "Error: npm run lint failed"
- exit 1
- fi
-
- # Run the check command
- npm run check
- if [ $? -ne 0 ]; then
- echo "Error: npm run check failed"
- exit 1
- fi
-
- echo "✅ llama-ui code formatted and checked successfully"
-
- # Build the llama-ui
- echo "Building llama-ui..."
- npm run build
- if [ $? -ne 0 ]; then
- echo "❌ npm run build failed"
- exit 1
- fi
-
- echo "✅ llama-ui built successfully"
-fi
-
-exit 0
-EOF
-
-# Make hook executable
-chmod +x "$PRE_COMMIT_HOOK"
-
-if [ $? -eq 0 ]; then
- echo "✅ Git hook installed successfully!"
- echo " Pre-commit: $PRE_COMMIT_HOOK"
- echo ""
- echo "The hook will automatically:"
- echo " • Format, lint and check llama-ui code before commits"
- echo " • Build llama-ui"
-else
- echo "❌ Failed to make hook executable"
- exit 1
-fi