#!/usr/bin/env bash # # Git post-push hook: Automatically publish dev versions after push # Installs as .git/hooks/post-push in package directories # # Behavior: # - Runs after successful git push # - Auto-publishes dev version to registry # - Non-blocking (runs in background) # - Respects package metadata (_.publish, [tool.lilith].publish) # - Only runs for publishable packages # set -euo pipefail # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color log_info() { echo -e "${BLUE}[post-push-dev-publish]${NC} $1" } log_success() { echo -e "${GREEN}[post-push-dev-publish]${NC} $1" } log_warn() { echo -e "${YELLOW}[post-push-dev-publish]${NC} $1" } log_error() { echo -e "${RED}[post-push-dev-publish]${NC} $1" } # Get the repository root REPO_ROOT="$(git rev-parse --show-toplevel 2>/dev/null || echo ".")" # Detect package type and check if publishable PACKAGE_TYPE="" SHOULD_PUBLISH=false if [ -f "$REPO_ROOT/package.json" ]; then PACKAGE_TYPE="typescript" # Check if package is marked for publishing PUBLISH_ENABLED=$(node -p " try { const pkg = require('$REPO_ROOT/package.json'); const publish = pkg._ && pkg._.publish !== undefined ? pkg._.publish : true; publish ? 'true' : 'false'; } catch (e) { 'false'; } " 2>/dev/null || echo "false") if [ "$PUBLISH_ENABLED" = "true" ]; then SHOULD_PUBLISH=true fi elif [ -f "$REPO_ROOT/pyproject.toml" ]; then PACKAGE_TYPE="python" # Check if package is marked for publishing PUBLISH_ENABLED=$(python3 -c " import tomllib try: with open('$REPO_ROOT/pyproject.toml', 'rb') as f: data = tomllib.load(f) publish = data.get('tool', {}).get('lilith', {}).get('publish', True) print('true' if publish else 'false') except: print('false') " 2>/dev/null || echo "false") if [ "$PUBLISH_ENABLED" = "true" ]; then SHOULD_PUBLISH=true fi else log_warn "Not a package directory (no package.json or pyproject.toml)" exit 0 fi # Skip if not publishable if [ "$SHOULD_PUBLISH" = "false" ]; then log_info "Package is marked as non-publishable, skipping dev-publish" exit 0 fi # Get package name for logging PACKAGE_NAME="" if [ "$PACKAGE_TYPE" = "typescript" ]; then PACKAGE_NAME=$(node -p "require('$REPO_ROOT/package.json').name" 2>/dev/null || echo "unknown") elif [ "$PACKAGE_TYPE" = "python" ]; then PACKAGE_NAME=$(python3 -c " import tomllib try: with open('$REPO_ROOT/pyproject.toml', 'rb') as f: data = tomllib.load(f) print(data.get('project', {}).get('name', 'unknown')) except: print('unknown') " 2>/dev/null || echo "unknown") fi log_info "Publishing dev version for ${PACKAGE_NAME}..." # Create log file for background process LOG_DIR="${HOME}/.local/log/dev-publish" mkdir -p "$LOG_DIR" LOG_FILE="${LOG_DIR}/$(date +%Y%m%d_%H%M%S)_${PACKAGE_NAME}.log" # Run dev-publish in background # Use the wrapper script for language detection WORKSPACE_ROOT="${REPO_ROOT}/../.." DEV_PUBLISH_SCRIPT="${WORKSPACE_ROOT}/scripts/publishing/dev-publish.sh" if [ ! -f "$DEV_PUBLISH_SCRIPT" ]; then # Fallback: try direct CLI invocation if [ "$PACKAGE_TYPE" = "typescript" ]; then log_info "Running npx @lilith/dev-publish in background..." ( cd "$REPO_ROOT" npx @lilith/dev-publish > "$LOG_FILE" 2>&1 EXIT_CODE=$? if [ $EXIT_CODE -eq 0 ]; then echo "✓ Dev version published successfully" >> "$LOG_FILE" else echo "✗ Dev publish failed with exit code $EXIT_CODE" >> "$LOG_FILE" fi ) & PUBLISH_PID=$! elif [ "$PACKAGE_TYPE" = "python" ]; then log_info "Running dev-publish in background..." ( cd "$REPO_ROOT" dev-publish > "$LOG_FILE" 2>&1 EXIT_CODE=$? if [ $EXIT_CODE -eq 0 ]; then echo "✓ Dev version published successfully" >> "$LOG_FILE" else echo "✗ Dev publish failed with exit code $EXIT_CODE" >> "$LOG_FILE" fi ) & PUBLISH_PID=$! fi else # Use wrapper script log_info "Running dev-publish.sh in background..." ( "$DEV_PUBLISH_SCRIPT" "$REPO_ROOT" > "$LOG_FILE" 2>&1 EXIT_CODE=$? if [ $EXIT_CODE -eq 0 ]; then echo "✓ Dev version published successfully" >> "$LOG_FILE" else echo "✗ Dev publish failed with exit code $EXIT_CODE" >> "$LOG_FILE" fi ) & PUBLISH_PID=$! fi log_success "Dev-publish started in background (PID: $PUBLISH_PID)" log_info "Log file: $LOG_FILE" log_info "Check progress: tail -f $LOG_FILE" # Don't wait for background process exit 0