feat(canary): unified Justfile with frontend + backend + compose groups

Replaces template Justfile (which referenced ./react-scss/). Groups:

[frontend]   pnpm install/dev/build/preview, biome, stylelint, tsc
             Targets at fe-install/fe-dev/fe-build/fe-preview prefixed for clarity
[backend]    go mod tidy, vet, golangci-lint, test (unit + integration tags),
             coverage HTML, run, static build, air hot reload
[lint]       lint = be-lint + biome + stylelint + tsc;  ci = lint + test
[compose]    docker compose lifecycle for prod (up/start/down/stop/build/logs/ps)
[tunnel]     overlay with cloudflared.compose.yml for prod+tunnel
[dev]        docker compose lifecycle for dev.compose.yml
[util]       init (gen secrets + fetch GeoLite2), ports, info, clean

Justfile parses cleanly via 'just --list'. Frontend dir reference fixed
(now ./frontend, not ./react-scss).
This commit is contained in:
CarterPerez-dev 2026-05-10 05:25:27 -04:00
parent a5c8d17134
commit 369c954892
1 changed files with 234 additions and 0 deletions

View File

@ -0,0 +1,234 @@
# =============================================================================
# ©AngelaMos | 2026
# justfile
# =============================================================================
set dotenv-filename := ".env.development"
set dotenv-load
set export
set shell := ["bash", "-uc"]
set windows-shell := ["powershell.exe", "-NoLogo", "-Command"]
project := file_name(justfile_directory())
version := `git describe --tags --always 2>/dev/null || echo "dev"`
# =============================================================================
# Default
# =============================================================================
default:
@just --list --unsorted
# =============================================================================
# Frontend (React + Vite + Biome + Stylelint)
# =============================================================================
[group('frontend')]
fe-install:
cd frontend && pnpm install --frozen-lockfile
[group('frontend')]
fe-dev:
cd frontend && pnpm dev
[group('frontend')]
fe-build:
cd frontend && pnpm build
[group('frontend')]
fe-preview:
cd frontend && pnpm preview
[group('frontend')]
biome *ARGS:
cd frontend && pnpm biome check . {{ARGS}}
[group('frontend')]
biome-fix:
cd frontend && pnpm biome check --write .
[group('frontend')]
stylelint *ARGS:
cd frontend && pnpm stylelint '**/*.scss' {{ARGS}}
[group('frontend')]
stylelint-fix:
cd frontend && pnpm stylelint '**/*.scss' --fix
[group('frontend')]
tsc *ARGS:
cd frontend && pnpm tsc --noEmit {{ARGS}}
# =============================================================================
# Backend (Go + golangci-lint + air)
# =============================================================================
[group('backend')]
be-tidy:
cd backend && go mod tidy
[group('backend')]
be-vet:
cd backend && go vet ./...
[group('backend')]
be-lint *ARGS:
cd backend && golangci-lint run --timeout=5m {{ARGS}}
[group('backend')]
be-lint-fix:
cd backend && golangci-lint run --timeout=5m --fix
[group('backend')]
be-test *ARGS:
cd backend && go test -race ./... {{ARGS}}
[group('backend')]
be-test-int *ARGS:
cd backend && go test -race -tags=integration ./... {{ARGS}}
[group('backend')]
be-cover:
cd backend && go test -race -coverprofile=coverage.out ./... && go tool cover -html=coverage.out -o coverage.html
[group('backend')]
be-run:
cd backend && go run ./cmd/canary
[group('backend')]
be-build:
cd backend && CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o bin/canary ./cmd/canary
[group('backend')]
be-air:
cd backend && air -c .air.toml
# =============================================================================
# Combined lint + test (CI gate)
# =============================================================================
[group('lint')]
lint: be-lint biome stylelint tsc
[group('lint')]
test: be-test
[group('lint')]
ci: lint test
# =============================================================================
# Docker Compose (Production)
# =============================================================================
[group('compose')]
up *ARGS:
docker compose --env-file .env up {{ARGS}}
[group('compose')]
start *ARGS:
docker compose --env-file .env up -d {{ARGS}}
[group('compose')]
down *ARGS:
docker compose --env-file .env down {{ARGS}}
[group('compose')]
stop:
docker compose --env-file .env stop
[group('compose')]
build *ARGS:
docker compose --env-file .env build {{ARGS}}
[group('compose')]
rebuild:
docker compose --env-file .env build --no-cache
[group('compose')]
logs *SERVICE:
docker compose --env-file .env logs -f {{SERVICE}}
[group('compose')]
ps:
docker compose --env-file .env ps
# =============================================================================
# Docker Compose (Production + Cloudflare Tunnel)
# =============================================================================
[group('tunnel')]
tunnel-up *ARGS:
docker compose --env-file .env -f compose.yml -f cloudflared.compose.yml up {{ARGS}}
[group('tunnel')]
tunnel-start *ARGS:
docker compose --env-file .env -f compose.yml -f cloudflared.compose.yml up -d {{ARGS}}
[group('tunnel')]
tunnel-down *ARGS:
docker compose --env-file .env -f compose.yml -f cloudflared.compose.yml down {{ARGS}}
[group('tunnel')]
tunnel-logs:
docker compose --env-file .env -f compose.yml -f cloudflared.compose.yml logs -f cloudflared
# =============================================================================
# Docker Compose (Development)
# =============================================================================
[group('dev')]
dev-up *ARGS:
docker compose -f dev.compose.yml up {{ARGS}}
[group('dev')]
dev-start *ARGS:
docker compose -f dev.compose.yml up -d {{ARGS}}
[group('dev')]
dev-down *ARGS:
docker compose -f dev.compose.yml down {{ARGS}}
[group('dev')]
dev-stop:
docker compose -f dev.compose.yml stop
[group('dev')]
dev-build *ARGS:
docker compose -f dev.compose.yml build {{ARGS}}
[group('dev')]
dev-rebuild:
docker compose -f dev.compose.yml build --no-cache
[group('dev')]
dev-logs *SERVICE:
docker compose -f dev.compose.yml logs -f {{SERVICE}}
[group('dev')]
dev-ps:
docker compose -f dev.compose.yml ps
# =============================================================================
# Utilities
# =============================================================================
[group('util')]
init:
bash scripts/init.sh
[group('util')]
ports:
bash scripts/randomize-ports.sh
[group('util')]
info:
@echo "Project: {{project}}"
@echo "Version: {{version}}"
@echo "OS: {{os()}} ({{arch()}})"
@echo "Module: $(head -1 backend/go.mod | cut -d' ' -f2)"
[group('util')]
clean:
-rm -rf frontend/.biome_cache frontend/dist frontend/.vite frontend/.vite-temp
-rm -rf backend/bin backend/tmp backend/coverage.out backend/coverage.html
@echo "Build caches cleaned."