Files
pansy/Makefile
T
steveandClaude Opus 4.8 91da9ff945
Gadfly review (reusable) / review (pull_request) Successful in 10m8s
Adversarial Review (Gadfly) / review (pull_request) Successful in 10m9s
Phase 0: backend + frontend scaffold, single-binary build
Implements the Pansy v1 scaffold (epic #20, phase 0).

#1 Backend: Go module (pure-Go, builds with CGO_ENABLED=0), env config,
   gin server with slog + recovery + /api/v1/healthz, modernc SQLite store
   with WAL/busy_timeout/foreign_keys pragmas, embedded numbered-migration
   runner, full initial schema (users, sessions, gardens, garden_shares,
   garden_objects, plants, plantings), domain structs + sentinel errors,
   graceful shutdown.

#2 Frontend: Vite + React 19 + TS (strict) + Tailwind 4 + TanStack
   Router/Query, typed /api/v1 fetch wrapper (ApiError carries status +
   body so later issues can read 409 conflict rows), dev proxy /api -> :8080,
   responsive app shell with stub pages for all five routes.

#3 Single binary: //go:embed of the web build with a committed placeholder,
   SPA fallback (deep links, immutable asset caching, JSON 404 for unmatched
   /api and missing assets), Makefile (web/build/dev/test), README quickstart
   + env var table.

Verified: go build/vet/test clean (CGO off); binary migrates idempotently and
serves healthz; web tsc + build clean; integrated binary serves the SPA, deep
links, and correct cache headers; app mounts and navigates all five routes at
desktop and 375px widths.

Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Claude-Session: https://claude.ai/code/session_01JdQpdYYsTgtkJBxbcpAszi
2026-07-18 14:52:05 -04:00

52 lines
1.5 KiB
Makefile

# pansy — one static binary: Go API + embedded React build.
#
# make build # production binary ./pansy with the web build embedded
# make dev # Go API (:8080) + Vite dev (:5173) together, hot reload
# make test # go test + web tests
#
# pansy is a standalone module; GOWORK=off keeps the parent workspace out of the
# way, and CGO_ENABLED=0 keeps the binary static (pure-Go SQLite driver).
BINARY := pansy
WEBDIST := internal/webdist/dist
GO_ENV := CGO_ENABLED=0 GOWORK=off
.PHONY: all build web dev dev-api dev-web test clean
all: build
## build: bundle the frontend and compile the single static binary.
build: web
$(GO_ENV) go build -o $(BINARY) ./cmd/pansy
@echo "built ./$(BINARY)"
## web: produce the production web bundle and sync it into the embed directory.
web:
cd web && npm ci && npm run build
rm -rf $(WEBDIST)
cp -r web/dist $(WEBDIST)
## dev: run the API and Vite dev server together (Ctrl-C stops both).
## Prefer two terminals if you want independent restarts:
## term 1: make dev-api term 2: make dev-web
dev:
@echo "API on :8080, Vite on :5173 (proxies /api → :8080). Ctrl-C stops both."
@$(MAKE) -j2 dev-api dev-web
dev-api:
$(GO_ENV) go run ./cmd/pansy
dev-web:
cd web && npm run dev
## test: run backend and (if present) frontend tests.
test:
$(GO_ENV) go test ./...
cd web && npm test --if-present
## clean: remove the binary and the generated embed contents (restore placeholder).
clean:
rm -f $(BINARY)
rm -rf $(WEBDIST)
git checkout -- $(WEBDIST)/index.html 2>/dev/null || true