.PHONY: install run run-server run-dashboard run-widget build build-all build-assets build-dashboard build-widget \ package-current package-platform build-server-linux-amd64 clean-dist clean-temp test tidy generator enums migration testdata DIST_DIR ?= dist TMP_DIR := $(DIST_DIR)/.tmp APP_NAME ?= cs-agent ARCHIVE_NAME ?= cs-ai-agent PACKAGE_ROOT_DIR ?= $(ARCHIVE_NAME) APP_ENTRY ?= ./cmd/server PLATFORMS := linux-amd64 linux-arm64 darwin-amd64 darwin-arm64 windows-amd64 CURRENT_GOOS := $(shell go env GOOS) CURRENT_GOARCH := $(shell go env GOARCH) CURRENT_PLATFORM := $(CURRENT_GOOS)-$(CURRENT_GOARCH) PLATFORM ?= $(CURRENT_PLATFORM) install: go mod download cd dashboard && pnpm install cd widget && pnpm install @echo "[install] done" run: @server_pid=0; \ dashboard_pid=0; \ widget_pid=0; \ trap 'kill $$server_pid $$dashboard_pid $$widget_pid 2>/dev/null || true' INT TERM EXIT; \ $(MAKE) run-server & \ server_pid=$$!; \ $(MAKE) run-dashboard & \ dashboard_pid=$$!; \ $(MAKE) run-widget & \ widget_pid=$$!; \ while kill -0 $$server_pid 2>/dev/null && kill -0 $$dashboard_pid 2>/dev/null && kill -0 $$widget_pid 2>/dev/null; do \ sleep 1; \ done; \ status=0; \ wait $$server_pid || status=$$?; \ wait $$dashboard_pid || status=$$?; \ wait $$widget_pid || status=$$?; \ kill $$server_pid $$dashboard_pid $$widget_pid 2>/dev/null || true; \ exit $$status run-server: go run ./cmd/server run-dashboard: cd dashboard && pnpm dev run-widget: cd widget && pnpm dev build: clean-dist build-assets package-current clean-temp @echo "[build] done" build-all: clean-dist build-assets @echo "[build-all] packaging platforms: $(PLATFORMS)" @for platform in $(PLATFORMS); do \ echo "[build-all] packaging $$platform"; \ $(MAKE) package-platform PLATFORM=$$platform; \ done @$(MAKE) clean-temp @echo "[build-all] done" build-assets: build-dashboard build-widget @echo "[build-assets] done" build-dashboard: @echo "[build-dashboard] building dashboard app" cd dashboard && pnpm build @echo "[build-dashboard] done" build-widget: @echo "[build-widget] building widget sdk" cd widget && pnpm build:sdk && pnpm build @echo "[build-widget] done" package-current: @$(MAKE) package-platform PLATFORM=$(CURRENT_PLATFORM) build-server-linux-amd64: @dist_dir="$(CURDIR)/$(DIST_DIR)"; \ output="$$dist_dir/$(APP_NAME)-linux-amd64"; \ echo "[build-server] start linux-amd64"; \ mkdir -p "$$dist_dir"; \ echo "[build-server] go build -> $$output"; \ GOOS=linux GOARCH=amd64 go build -o "$$output" $(APP_ENTRY); \ echo "[build-server] done -> $$output" package-platform: @platform="$(PLATFORM)"; \ goos=$${platform%-*}; \ goarch=$${platform#*-}; \ stage_dir="$(TMP_DIR)/$$platform"; \ package_dir="$$stage_dir/$(PACKAGE_ROOT_DIR)"; \ dist_dir="$(CURDIR)/$(DIST_DIR)"; \ archive_base="$$dist_dir/$(ARCHIVE_NAME)-$$platform"; \ binary_name="$(APP_NAME)"; \ if [ "$$goos" = "windows" ]; then binary_name="$(APP_NAME).exe"; fi; \ echo "[package] start $$platform"; \ rm -rf "$$stage_dir"; \ mkdir -p "$$package_dir/dashboard" "$$package_dir/widget" "$$package_dir/config" "$$dist_dir"; \ echo "[package] go build $$platform"; \ GOOS=$$goos GOARCH=$$goarch go build -o "$$package_dir/$$binary_name" $(APP_ENTRY); \ echo "[package] copy assets $$platform"; \ cp -R dashboard/out "$$package_dir/dashboard/out"; \ cp -R widget/out "$$package_dir/widget/out"; \ echo "[package] include example config only"; \ cp config/config.example.yaml "$$package_dir/config/config.example.yaml"; \ rm -f "$$archive_base.zip"; \ echo "[package] archive $$archive_base.zip"; \ cd "$$stage_dir" && zip -rXq "$$archive_base.zip" "$(PACKAGE_ROOT_DIR)" -x "*.DS_Store" "__MACOSX/*"; \ rm -rf "$$stage_dir"; \ echo "[package] done $$platform -> $$archive_base.zip" clean-dist: rm -rf $(DIST_DIR) clean-temp: rm -rf $(TMP_DIR) test: go test ./... tidy: go mod tidy generator: go run ./cmd/generator/generator.go enums: go run ./cmd/enums/generator.go migration: go run ./cmd/migration testdata: go run ./cmd/testdata