# ============================================================================== # TOOLS: check, install deps, ports, doctor # ============================================================================== .PHONY: check-tools check-tools-incus install-tools install-deps check-ports openapi openapi-check doctor doctor: ## [HIGH] Verify all dependencies and environment (TASK-QA-008) @$(ECHO_CMD) "${BOLD}${PURPLE}πŸ”¬ VEZA Doctor β€” Environment Check${NC}" @$(ECHO_CMD) "" @$(ECHO_CMD) "${BOLD}Runtime versions:${NC}" @if [ -f $(ROOT)/.nvmrc ]; then \ expected=$$(cat $(ROOT)/.nvmrc); \ actual=$$(node -v 2>/dev/null || echo "not installed"); \ if command -v node >/dev/null 2>&1; then \ $(ECHO_CMD) " Node.js: $$actual (expected: v$$expected)"; \ else \ $(ECHO_CMD) " ${RED}Node.js: not installed${NC}"; \ fi; \ else \ $(ECHO_CMD) " Node.js: $$(node -v 2>/dev/null || echo 'not installed')"; \ fi @$(ECHO_CMD) " Go: $$(go version 2>/dev/null || echo 'not installed')" @$(ECHO_CMD) " Rust: $$(rustc --version 2>/dev/null || echo 'not installed')" @$(ECHO_CMD) " Docker: $$(docker --version 2>/dev/null || echo 'not installed')" @$(ECHO_CMD) " Compose: $$(docker compose version 2>/dev/null || echo 'not installed')" @$(ECHO_CMD) "" @$(ECHO_CMD) "${BOLD}Optional (hot reload):${NC}" @command -v air >/dev/null 2>&1 && $(ECHO_CMD) " air: $(GREEN)βœ“${NC}" || $(ECHO_CMD) " air: $(YELLOW)not installed (run make install-tools)${NC}" @command -v cargo-watch >/dev/null 2>&1 && $(ECHO_CMD) " cargo-watch: $(GREEN)βœ“${NC}" || $(ECHO_CMD) " cargo-watch: $(YELLOW)not installed (run make install-tools)${NC}" @$(ECHO_CMD) "" @$(ECHO_CMD) "${BOLD}Environment validation (scripts/validate-env.sh):${NC}" @(cd $(ROOT) && ./scripts/validate-env.sh development) || true @$(ECHO_CMD) "" @$(ECHO_CMD) "${BOLD}Env quick check:${NC}" @$(ECHO_CMD) " DATABASE_URL: $${DATABASE_URL:-(not set)}" @$(ECHO_CMD) " REDIS_URL: $${REDIS_URL:-(not set)}" @$(ECHO_CMD) "" @$(ECHO_CMD) "${BOLD}Infra connectivity (requires infra-up):${NC}" @if docker compose -f $(COMPOSE_FILE) exec -T postgres pg_isready -U $(DB_USER) 2>/dev/null; then \ $(ECHO_CMD) " Postgres: $(GREEN)βœ“ reachable${NC}"; \ else \ $(ECHO_CMD) " Postgres: $(YELLOW)not reachable (run make infra-up)${NC}"; \ fi @if docker compose -f $(COMPOSE_FILE) exec -T redis redis-cli ping 2>/dev/null | grep -q PONG; then \ $(ECHO_CMD) " Redis: $(GREEN)βœ“ reachable${NC}"; \ else \ $(ECHO_CMD) " Redis: $(YELLOW)not reachable (run make infra-up)${NC}"; \ fi @$(ECHO_CMD) "" @$(ECHO_CMD) "${GREEN}Run 'make install-deps' to install code dependencies.${NC}" check-tools: ## [LOW] Check required tools @$(ECHO_CMD) "${BLUE}Checking core requirements...${NC}" @for tool in docker go cargo npm; do \ command -v $$tool >/dev/null 2>&1 || { $(ECHO_CMD) "${RED}❌ $$tool is missing!${NC}"; exit 1; }; \ done @$(ECHO_CMD) "${GREEN}βœ… All tools present.${NC}" check-tools-incus: ## [LOW] Check required tools for Incus deployment @$(ECHO_CMD) "${BLUE}Checking Incus deployment requirements...${NC}" @command -v incus >/dev/null 2>&1 || { $(ECHO_CMD) "${RED}❌ incus is missing! Install with: sudo snap install incus${NC}"; exit 1; } @command -v go >/dev/null 2>&1 || { $(ECHO_CMD) "${RED}❌ go is missing!${NC}"; exit 1; } @command -v cargo >/dev/null 2>&1 || { $(ECHO_CMD) "${RED}❌ cargo is missing!${NC}"; exit 1; } @command -v npm >/dev/null 2>&1 || { $(ECHO_CMD) "${RED}❌ npm is missing!${NC}"; exit 1; } @$(ECHO_CMD) "${GREEN}βœ… All Incus tools present.${NC}" install-tools: ## [LOW] Install Power User tools (Hot Reload, Linters) @$(ECHO_CMD) "${BLUE}πŸ› οΈ Installing Dev Tools...${NC}" @command -v air >/dev/null 2>&1 || go install github.com/air-verse/air@latest @command -v cargo-watch >/dev/null 2>&1 || cargo install cargo-watch @command -v sqlx >/dev/null 2>&1 || cargo install sqlx-cli --no-default-features --features native-tls,postgres @$(ECHO_CMD) "${GREEN}βœ… Tools installed.${NC}" install-deps: ## [LOW] Install code dependencies (all backends + npm workspaces) @$(ECHO_CMD) "${BLUE}πŸ“¦ Installing dependencies...${NC}" @$(ECHO_CMD) " -> [Go] Downloading modules..." @(cd $(ROOT)/$(SERVICE_DIR_backend-api) && go mod download) @$(ECHO_CMD) " -> [Rust Stream] Fetching crates..." @(cd $(ROOT)/$(SERVICE_DIR_stream-server) && cargo fetch) @$(ECHO_CMD) " -> [Web] Installing npm packages..." @(cd $(ROOT)/$(SERVICE_DIR_web) && npm install --silent) @$(ECHO_CMD) "${GREEN}βœ… Dependencies installed.${NC}" check-ports: ## [LOW] Check if ports are available @$(ECHO_CMD) "${BLUE}πŸ” Checking ports...${NC}" @for port in $(PORT_backend-api) $(PORT_stream-server) $(PORT_web); do \ if lsof -i :$$port -t >/dev/null 2>&1; then \ $(ECHO_CMD) "${YELLOW}⚠️ Port $$port is busy${NC}"; \ else \ $(ECHO_CMD) "${GREEN}βœ… Port $$port is free${NC}"; \ fi; \ done openapi: ## [LOW] RΓ©gΓ©nΓ¨re openapi.yaml depuis les annotations Swagger (v0.923) @$(MAKE) -C $(ROOT)/$(SERVICE_DIR_backend-api) openapi openapi-check: ## [LOW] VΓ©rifie que apps/web/src/types/generated/ est en sync avec openapi.yaml (drift guard v1.0.8) @cd $(ROOT)/apps/web && bash scripts/check-types-sync.sh