.PHONY: lint test build clean # Lint all shell scripts with shellcheck lint: @echo "Running shellcheck..." shellcheck -x lib/*.sh bin/josh-sync @echo "All checks passed." # Run bats-core unit tests test: @echo "Running tests..." bats tests/unit/ @echo "All tests passed." # Bundle into a single self-contained script build: dist/josh-sync dist/josh-sync: bin/josh-sync lib/*.sh VERSION @mkdir -p dist @echo "Bundling josh-sync..." @echo '#!/usr/bin/env bash' > dist/josh-sync @echo "# josh-sync $(cat VERSION) — bundled distribution" >> dist/josh-sync @echo '# Generated by: make build' >> dist/josh-sync @echo '' >> dist/josh-sync @# Inline all library modules (strip shebangs and source directives) @for f in lib/core.sh lib/config.sh lib/auth.sh lib/state.sh lib/sync.sh lib/onboard.sh; do \ echo "# --- $$f ---" >> dist/josh-sync; \ grep -v '^#!/' "$$f" | grep -v '^# shellcheck source=' >> dist/josh-sync; \ echo '' >> dist/josh-sync; \ done @# Append CLI (strip shebangs, source directives, and source commands) @echo '# --- bin/josh-sync ---' >> dist/josh-sync @grep -v '^#!/' bin/josh-sync \ | grep -v '^# shellcheck source=' \ | grep -v '^source "\$${JOSH_LIB_DIR}/' \ | sed '/^JOSH_LIB_DIR=/,/^source/d' \ >> dist/josh-sync @chmod +x dist/josh-sync @echo "Built: dist/josh-sync ($(wc -l < dist/josh-sync) lines)" clean: rm -rf dist/