# Ai Resume - build entry points. # # `make validate` is the content gate: it is what CI and deploy.sh call. # It exits 0 only on a clean content tree. # # `make build` is the site gate: it generates the templ components, compiles the # two small binaries and writes the pre-rendered site into dist/. One binary # (bin/resume-server) serves the whole site; there is no bundler and no Node. PYTHON ?= python3 VALIDATOR := $(PYTHON) tools/validate_content.py GO ?= go TEMPL ?= templ # The runtime image is distroless/static (deploy/Dockerfile): no libc, no # dynamic loader. Everything the server needs is pure Go (modernc.org/sqlite), # so a static binary is buildable and is what the container can actually exec. # Without this the build host's cgo links the nix glibc loader and the container # fails with "exec /usr/bin/resume-server: no such file or directory". CGO_ENABLED ?= 0 BIN := bin DIST := dist .PHONY: build dist generate dev test validate validate-self-test fmt vet clean help \ corpus corpus-sync corpus-rebuild corpus-audit corpus-verify corpus-demo corpus-test help: @echo "make build templ generate, compile bin/, no dist" @echo "make dist build, then pre-render content into dist/" @echo "make dev pre-render into dist/ and serve it on 127.0.0.1:8096" @echo "make generate run templ generate (generated files are not committed)" @echo "make test go test ./... plus the validator self-test" @echo "make validate validate content/** front-matter against the frozen schema" @echo "make fmt vet gofmt / go vet over cmd and internal" @echo "make clean remove bin/ and dist/" @echo "" @echo "corpus (Phase 4, python3 -m corpus.cli):" @echo "make corpus rebuild the corpus from content/ (drops the collection)" @echo "make corpus-sync incremental update; only changed documents are re-embedded" @echo "make corpus-audit freshness + drift audit (exit 1 on findings)" @echo "make corpus-verify check the index against content/ and Qdrant" @echo "make corpus-demo same query with and without an area filter" @echo "make corpus-test corpus unit tests (no container, no network)" build: generate @mkdir -p $(BIN) CGO_ENABLED=$(CGO_ENABLED) $(GO) build -trimpath -buildvcs=false -o $(BIN)/resume-build ./cmd/build CGO_ENABLED=$(CGO_ENABLED) $(GO) build -trimpath -buildvcs=false -o $(BIN)/resume-server ./cmd/server dist: build @$(BIN)/resume-build --dist $(DIST) dev: dist @RESUME_DIST=$(DIST) $(BIN)/resume-server generate: @command -v $(TEMPL) >/dev/null || { echo "templ is not on PATH; run this inside 'nix develop'"; exit 1; } @$(TEMPL) generate test: generate validate-self-test @$(GO) test ./... validate: @$(VALIDATOR) validate-self-test: @$(VALIDATOR) --self-test fmt: @gofmt -l -w cmd internal vet: @$(GO) vet ./... # -- corpus (Phase 4, docs/phase-4-corpus.md) -------------------------------- # # The corpus is data, not a build artefact: it lives in data/corpus/ (gitignored) # and in Qdrant. RESUME_QDRANT_URL defaults to http://127.0.0.1:6333 and # RESUME_EMBED_PROVIDER defaults to local-hashing; production sets both in the # environment, never in this file. CORPUS := $(PYTHON) -m corpus.cli corpus: corpus-rebuild corpus-rebuild: @$(CORPUS) rebuild corpus-sync: @$(CORPUS) sync corpus-audit: @$(CORPUS) audit --fail-on-findings corpus-verify: @$(CORPUS) verify corpus-demo: @$(CORPUS) demo-filter --query "distributed audio endpoints" --area edge corpus-test: @$(PYTHON) -m unittest discover -s corpus/tests -t . clean: @rm -rf $(BIN) $(DIST)