# ============================================================================= # Image identity # ============================================================================= IMAGE_NAME := pmocrazycoder IMAGE_TAG := latest # ============================================================================= # Registry # ============================================================================= REGISTRY := niepce.petite-maison-orange.fr/public # ============================================================================= # Build platforms # ============================================================================= PLATFORMS := linux/amd64,linux/arm64 # ============================================================================= # Derived image identifiers # ============================================================================= FULL_IMAGE := $(REGISTRY)/$(IMAGE_NAME):$(IMAGE_TAG) OCI_ARCHIVE := $(IMAGE_NAME)-$(IMAGE_TAG).oci.tar # ============================================================================= # Docker buildx builder # ============================================================================= BUILDER := $(IMAGE_NAME)-builder # ============================================================================= # OCI image annotations (injected via --build-arg) # ============================================================================= OCI_VERSION := $(IMAGE_TAG) OCI_CREATED := $(shell date -u +%Y-%m-%dT%H:%M:%SZ) OCI_REVISION := $(shell git rev-parse --short HEAD 2>/dev/null || echo unknown) # ============================================================================= # Build context # ============================================================================= PROJECT_DIR := $(shell pwd) BUILD_CONTEXT := . DOCKERFILE := Dockerfile BUILD_ARGS := \ --build-arg OCI_VERSION=$(OCI_VERSION) \ --build-arg OCI_CREATED=$(OCI_CREATED) \ --build-arg OCI_REVISION=$(OCI_REVISION) # ============================================================================= # Dev container # ============================================================================= WORKSPACE := /workspace CONTAINER_NAME := ai-dev-container MCP_LOG := $(WORKSPACE)/.ai_index/mcp.log # ============================================================================= # Targets # ============================================================================= .PHONY: all build build-multiplatform push run run-mcp \ init-index mcp-list embeddings update-graph \ restart-mcp bootstrap clean clean-builder help ## all : Build multi-platform image, push to registry all: build-multiplatform push ## build : Build for the native platform and load into the local Docker daemon build: docker build $(BUILD_ARGS) \ --tag $(FULL_IMAGE) \ --file $(DOCKERFILE) \ $(BUILD_CONTEXT) ## build-multiplatform : Build for $(PLATFORMS) and export as a local OCI archive build-multiplatform: .builder-ready docker buildx build $(BUILD_ARGS) \ --builder $(BUILDER) \ --platform $(PLATFORMS) \ --tag $(FULL_IMAGE) \ --file $(DOCKERFILE) \ --provenance=false \ --output type=oci,dest=$(OCI_ARCHIVE) \ $(BUILD_CONTEXT) # Create the buildx builder with docker-container driver (once) .builder-ready: docker buildx inspect $(BUILDER) > /dev/null 2>&1 \ || docker buildx create --name $(BUILDER) --driver docker-container --bootstrap touch .builder-ready ## push : Push the OCI archive to the registry using skopeo, then pull locally push: $(OCI_ARCHIVE) skopeo copy \ --dest-tls-verify=true \ --multi-arch all \ oci-archive:$(OCI_ARCHIVE) \ docker://$(FULL_IMAGE) docker pull $(FULL_IMAGE) # Ensure the OCI archive exists before pushing $(OCI_ARCHIVE): $(MAKE) build-multiplatform ## run : Run interactive container with mounted project run: docker run -v $(PROJECT_DIR):$(WORKSPACE) -it --rm $(FULL_IMAGE) ## run-mcp : Run container with MCP server in background run-mcp: docker run -v $(PROJECT_DIR):$(WORKSPACE) -it --rm $(FULL_IMAGE) bash ## init-index : Initialize .ai_index directory structure init-index: @echo "[MAKE] Initializing .ai_index..." mkdir -p $(PROJECT_DIR)/.ai_index/ast mkdir -p $(PROJECT_DIR)/.ai_index/embeddings @if [ ! -f $(PROJECT_DIR)/.ai_index/graph.db ]; then \ sqlite3 $(PROJECT_DIR)/.ai_index/graph.db "VACUUM;"; \ fi ## mcp-list : Run MCP list_imports tool mcp-list: @echo "[MAKE] Running MCP list_imports.py..." python3 $(PROJECT_DIR)/opt/dev-tools/list_imports.py --project $(WORKSPACE) ## embeddings : Generate embeddings embeddings: @echo "[MAKE] Generating embeddings..." python3 $(PROJECT_DIR)/opt/dev-tools/generate_embeddings.py --project $(WORKSPACE) ## update-graph : Update dependency graph update-graph: @echo "[MAKE] Updating dependency graph..." python3 $(PROJECT_DIR)/opt/dev-tools/update_graph.py --project $(WORKSPACE) ## restart-mcp : Restart MCP server inside running container restart-mcp: docker exec -it $(CONTAINER_NAME) bash -c "\ pkill -f mcp-server; \ /opt/bin/mcp-server --project $(WORKSPACE) > $(MCP_LOG) 2>&1 & \ " ## bootstrap : Build container and init index bootstrap: build init-index @echo "[MAKE] Bootstrap complete. Run 'make run' to start the container." ## clean : Remove OCI archive, local image and generated files clean: clean-builder docker rmi --force $(FULL_IMAGE) 2>/dev/null || true rm -f $(OCI_ARCHIVE) rm -f $(PROJECT_DIR)/.ai_index/*.log rm -rf $(PROJECT_DIR)/.ai_index/ast/* rm -rf $(PROJECT_DIR)/.ai_index/embeddings/* ## clean-builder : Remove the buildx builder clean-builder: docker buildx rm $(BUILDER) 2>/dev/null || true rm -f .builder-ready ## help : Show this help help: @grep -E '^## ' $(MAKEFILE_LIST) | sed 's/^## //'