# Pulse Makefile for development .PHONY: build run dev dev-status dev-logs dev-stop dev-restart dev-backend-restart dev-verify dev-foreground frontend backend all clean distclean dev-hot lint lint-backend lint-frontend format format-backend format-frontend build-agents control-plane handoff FRONTEND_DIR := frontend-modern FRONTEND_DIST := $(FRONTEND_DIR)/dist FRONTEND_EMBED_DIR := internal/api/frontend-modern # Build everything (including all agent binaries) all: frontend backend build-agents # Build frontend only frontend: npm --prefix $(FRONTEND_DIR) run build @echo "✓ Frontend build synced to $(FRONTEND_EMBED_DIR)" # Build backend only (includes embedded frontend) backend: go build -o pulse ./cmd/pulse # Build both and run build: frontend backend # Run the built binary run: build ./pulse # Development - managed local runtime dev: npm run dev dev-status: npm run dev:status dev-logs: npm run dev:logs dev-stop: npm run dev:stop dev-restart: npm run dev:restart dev-backend-restart: npm run dev:backend-restart dev-verify: npm run dev:verify dev-foreground: npm run dev:foreground dev-hot: npm run dev:foreground # Clean build artifacts clean: rm -f pulse rm -rf $(FRONTEND_DIST) $(FRONTEND_EMBED_DIR) distclean: clean ./scripts/cleanup.sh # Quick managed restart for development restart: dev-restart # Run linters for both backend and frontend lint: lint-backend lint-frontend lint-backend: golangci-lint run ./... lint-frontend: npm --prefix $(FRONTEND_DIR) run lint # Apply formatters format: format-backend format-frontend format-backend: gofmt -w cmd internal pkg format-frontend: npm --prefix $(FRONTEND_DIR) run format # Build control plane binary control-plane: @VERSION=$$(cat VERSION | tr -d '\n') && \ go build -ldflags="-s -w -X main.Version=v$$VERSION" -trimpath -o pulse-control-plane ./cmd/pulse-control-plane test: @./scripts/ensure_test_assets.sh @echo "Running backend tests (excluding tmp tooling)..." go test -race -timeout 10m $$(go list ./... | grep -v '/tmp$$') # Run integration tests (requires Ollama at OLLAMA_URL or 127.0.0.1:11434) test-integration: @echo "Running AI integration tests against Ollama..." @echo "Set OLLAMA_URL to override default (http://127.0.0.1:11434)" go test -tags=integration -v ./internal/ai/providers/... -run "TestIntegration" # Run both unit and integration tests test-all: test test-integration # Build all agent binaries for all platforms build-agents: @echo "Building agent binaries for all platforms..." @mkdir -p bin @VERSION=$$(cat VERSION | tr -d '\n') && \ echo "Building unified agent binaries..." && \ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags="-s -w -X main.Version=v$$VERSION" -trimpath -o bin/pulse-agent-linux-amd64 ./cmd/pulse-agent && \ CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags="-s -w -X main.Version=v$$VERSION" -trimpath -o bin/pulse-agent-linux-arm64 ./cmd/pulse-agent && \ CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags="-s -w -X main.Version=v$$VERSION" -trimpath -o bin/pulse-agent-darwin-amd64 ./cmd/pulse-agent && \ CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -ldflags="-s -w -X main.Version=v$$VERSION" -trimpath -o bin/pulse-agent-darwin-arm64 ./cmd/pulse-agent && \ CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags="-s -w -X main.Version=v$$VERSION" -trimpath -o bin/pulse-agent-windows-amd64.exe ./cmd/pulse-agent @echo "✓ All agent binaries built in bin/" # Session handoff — merge a Claude session's handoff entry into MEMORY.md (flock-safe) # Usage: make handoff SESSION_ID= # Expects handoff content at /tmp/handoff-$(SESSION_ID).md handoff: @if [ -z "$(SESSION_ID)" ]; then echo "Error: SESSION_ID required (make handoff SESSION_ID=xxx)" >&2; exit 1; fi @./scripts/session-handoff.sh "$(SESSION_ID)" "/tmp/handoff-$(SESSION_ID).md"