.PHONY: build run test clean migrate fmt lint \ docker-build docker-up docker-down docker-logs docker-ps \ docker-clean docker-rebuild # ============================================================================= # Local Development # ============================================================================= # Build all binaries build: go build -o silo ./cmd/silo go build -o silod ./cmd/silod # Run the API server locally run: go run ./cmd/silod -config config.yaml # Run the CLI cli: go run ./cmd/silo $(ARGS) # Run tests test: go test -v ./... # Clean build artifacts clean: rm -f silo silod rm -f *.out # Format code fmt: go fmt ./... goimports -w . # Lint code lint: golangci-lint run # Tidy dependencies tidy: go mod tidy # ============================================================================= # Database # ============================================================================= # Run database migrations (requires SILO_DB_* environment variables) migrate: ./scripts/init-db.sh # Connect to database (requires psql) db-shell: PGPASSWORD=$${SILO_DB_PASSWORD:-silodev} psql -h $${SILO_DB_HOST:-localhost} -U $${SILO_DB_USER:-silo} -d $${SILO_DB_NAME:-silo} # ============================================================================= # Docker # ============================================================================= # Build Docker image docker-build: docker build -t silo:latest -f build/package/Dockerfile . # Start the full stack (postgres + minio + silo) docker-up: docker compose -f deployments/docker-compose.yaml up -d # Start with rebuild docker-up-build: docker compose -f deployments/docker-compose.yaml up -d --build # Stop the stack docker-down: docker compose -f deployments/docker-compose.yaml down # Stop and remove volumes (WARNING: deletes data) docker-clean: docker compose -f deployments/docker-compose.yaml down -v # View logs docker-logs: docker compose -f deployments/docker-compose.yaml logs -f # View logs for specific service docker-logs-silo: docker compose -f deployments/docker-compose.yaml logs -f silo docker-logs-postgres: docker compose -f deployments/docker-compose.yaml logs -f postgres docker-logs-minio: docker compose -f deployments/docker-compose.yaml logs -f minio # Show running containers docker-ps: docker compose -f deployments/docker-compose.yaml ps # Rebuild and restart docker-rebuild: docker-down docker-build docker-up # Shell into silo container docker-shell: docker compose -f deployments/docker-compose.yaml exec silo /bin/sh # ============================================================================= # FreeCAD Integration # ============================================================================= # Detect FreeCAD Mod directory (Flatpak or native) # Flatpak app ID can be org.freecad.FreeCAD or org.freecadweb.FreeCAD FREECAD_MOD_DIR_FLATPAK := $(HOME)/.var/app/org.freecad.FreeCAD/data/FreeCAD/Mod FREECAD_MOD_DIR_NATIVE := $(HOME)/.local/share/FreeCAD/Mod FREECAD_MOD_DIR_LEGACY := $(HOME)/.FreeCAD/Mod # Install FreeCAD workbench (auto-detect Flatpak or native) install-freecad: @if [ -d "$(HOME)/.var/app/org.freecad.FreeCAD" ]; then \ echo "Detected Flatpak FreeCAD (org.freecad.FreeCAD)"; \ mkdir -p $(FREECAD_MOD_DIR_FLATPAK); \ rm -f $(FREECAD_MOD_DIR_FLATPAK)/Silo; \ ln -sf $(PWD)/pkg/freecad $(FREECAD_MOD_DIR_FLATPAK)/Silo; \ echo "Installed to $(FREECAD_MOD_DIR_FLATPAK)/Silo"; \ else \ echo "Using native FreeCAD installation"; \ mkdir -p $(FREECAD_MOD_DIR_NATIVE); \ mkdir -p $(FREECAD_MOD_DIR_LEGACY); \ rm -f $(FREECAD_MOD_DIR_NATIVE)/Silo; \ rm -f $(FREECAD_MOD_DIR_LEGACY)/Silo; \ ln -sf $(PWD)/pkg/freecad $(FREECAD_MOD_DIR_NATIVE)/Silo; \ ln -sf $(PWD)/pkg/freecad $(FREECAD_MOD_DIR_LEGACY)/Silo; \ echo "Installed to $(FREECAD_MOD_DIR_NATIVE)/Silo"; \ fi @echo "" @echo "Restart FreeCAD to load the Silo workbench" # Install for Flatpak FreeCAD explicitly install-freecad-flatpak: mkdir -p $(FREECAD_MOD_DIR_FLATPAK) rm -f $(FREECAD_MOD_DIR_FLATPAK)/Silo ln -sf $(PWD)/pkg/freecad $(FREECAD_MOD_DIR_FLATPAK)/Silo @echo "Installed to $(FREECAD_MOD_DIR_FLATPAK)/Silo" @echo "Restart FreeCAD to load the Silo workbench" # Install for native FreeCAD explicitly install-freecad-native: mkdir -p $(FREECAD_MOD_DIR_NATIVE) mkdir -p $(FREECAD_MOD_DIR_LEGACY) rm -f $(FREECAD_MOD_DIR_NATIVE)/Silo rm -f $(FREECAD_MOD_DIR_LEGACY)/Silo ln -sf $(PWD)/pkg/freecad $(FREECAD_MOD_DIR_NATIVE)/Silo ln -sf $(PWD)/pkg/freecad $(FREECAD_MOD_DIR_LEGACY)/Silo @echo "Installed to $(FREECAD_MOD_DIR_NATIVE)/Silo" # Uninstall FreeCAD workbench uninstall-freecad: rm -f $(FREECAD_MOD_DIR_FLATPAK)/Silo rm -f $(FREECAD_MOD_DIR_NATIVE)/Silo rm -f $(FREECAD_MOD_DIR_LEGACY)/Silo @echo "Uninstalled Silo workbench" # ============================================================================= # API Testing # ============================================================================= # Test health endpoint api-health: curl -s http://localhost:8080/health | jq . # Test ready endpoint api-ready: curl -s http://localhost:8080/ready | jq . # List schemas api-schemas: curl -s http://localhost:8080/api/schemas | jq . # List items api-items: curl -s http://localhost:8080/api/items | jq . # Create sample item api-create-item: curl -s -X POST http://localhost:8080/api/items \ -H "Content-Type: application/json" \ -d '{"schema":"kindred-rd","project":"CS100","category":"F01","material":"316","description":"Test screw"}' | jq . # ============================================================================= # Help # ============================================================================= help: @echo "Silo Makefile targets:" @echo "" @echo "Local Development:" @echo " build - Build CLI and server binaries" @echo " run - Run API server locally" @echo " cli ARGS=... - Run CLI with arguments" @echo " test - Run tests" @echo " fmt - Format code" @echo " lint - Run linter" @echo " tidy - Tidy go.mod" @echo "" @echo "Docker:" @echo " docker-build - Build Docker image" @echo " docker-up - Start full stack (postgres + minio + silo)" @echo " docker-down - Stop the stack" @echo " docker-clean - Stop and remove volumes (deletes data)" @echo " docker-logs - View all logs" @echo " docker-ps - Show running containers" @echo " docker-rebuild - Rebuild and restart" @echo "" @echo "Database:" @echo " migrate - Run database migrations" @echo " db-shell - Connect to database with psql" @echo "" @echo "FreeCAD:" @echo " install-freecad - Install workbench (auto-detect Flatpak/native)" @echo " install-freecad-flatpak - Install for Flatpak FreeCAD" @echo " install-freecad-native - Install for native FreeCAD" @echo " uninstall-freecad - Remove workbench symlinks" @echo "" @echo "API Testing:" @echo " api-health - Test health endpoint" @echo " api-schemas - List schemas" @echo " api-items - List items" @echo " api-create-item - Create a test item"