diff --git a/.github/workflows/make.yaml b/.github/workflows/make.yaml index 05ee5c3fd..e04350951 100644 --- a/.github/workflows/make.yaml +++ b/.github/workflows/make.yaml @@ -395,7 +395,7 @@ jobs: run: | make stack-up & STACK_PID=$! - SKIP_APPS=1 make bin/probod + make bin/probod wait $STACK_PID - run: "make stack-ps" - name: "Run e2e tests" diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 235619930..a07538e92 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -75,6 +75,7 @@ Signed-off-by: John Doe 4. Build the project: ```bash + make generate WITH_APPS=1 make build ``` @@ -105,7 +106,7 @@ Signed-off-by: John Doe npm -w @probo/console run dev ``` -The application should now be running at `http://localhost:3000` +The application should now be running at `http://localhost:5173` For detailed information about all Docker services in the development stack, see [Docker Services Documentation](docs/DOCKER_SERVICES.md). diff --git a/GNUmakefile b/GNUmakefile index 451035445..7a382d07e 100644 --- a/GNUmakefile +++ b/GNUmakefile @@ -44,7 +44,7 @@ E2E_COVER_DIR ?= $(CURDIR)/coverage/e2e DOCKER_IMAGE_NAME= ghcr.io/getprobo/probo DOCKER_TAG_NAME?= latest -PROBOD_BIN_DEPS= pkg/server/api/connect/v1/schema/schema.go \ +GENERATED= pkg/server/api/connect/v1/schema/schema.go \ pkg/server/api/connect/v1/types/types.go \ pkg/server/api/console/v1/schema/schema.go \ pkg/server/api/console/v1/types/types.go \ @@ -52,7 +52,8 @@ PROBOD_BIN_DEPS= pkg/server/api/connect/v1/schema/schema.go \ pkg/server/api/trust/v1/types/types.go \ pkg/server/api/mcp/v1/server/server.go \ pkg/server/api/mcp/v1/types/types.go \ - apps/console/dist/index.html \ + +EMBEDDED= apps/console/dist/index.html \ apps/trust/dist/index.html \ @probo/emails @@ -66,8 +67,9 @@ PRB_SRC= cmd/prb/main.go PROBOD_BOOTSTRAP_BIN= bin/probod-bootstrap PROBOD_BOOTSTRAP_SRC= cmd/probod-bootstrap/main.go -ifndef SKIP_APPS -PROBOD_BIN_EXTRA_DEPS += \ +ifdef WITH_APPS +GENERATED += relay +EMBEDDED += \ @probo/console \ @probo/trust endif @@ -85,7 +87,7 @@ lint-go: vet go-fmt go-fix go-lint lint-js: npm-lint .PHONY: vet -vet: generate apps/console/dist/index.html apps/trust/dist/index.html @probo/emails +vet: generate embed $(GO_VET) ./... .PHONY: npm-lint @@ -102,7 +104,7 @@ go-fmt: fi .PHONY: go-fix -go-fix: generate apps/console/dist/index.html apps/trust/dist/index.html @probo/emails +go-fix: generate embed @output="$$($(GO_BASE) fix -diff -omitzero=false ./apps/... ./cmd/... ./packages/... ./pkg/... ./e2e/...)"; \ if [ -n "$$output" ]; then \ echo "error: 'go fix' suggests changes; please apply them"; \ @@ -233,7 +235,7 @@ docker-build: $(DOCKER_BUILD) --tag $(DOCKER_IMAGE_NAME):$(DOCKER_TAG_NAME) --file Dockerfile . .PHONY: $(PROBOD_BIN) -$(PROBOD_BIN): $(PROBOD_BIN_DEPS) $(PROBOD_BIN_EXTRA_DEPS) +$(PROBOD_BIN): generate embed $(GO_BUILD) -o $(PROBOD_BIN) $(PROBOD_SRC) .PHONY: bin/prb @@ -285,15 +287,10 @@ pkg/server/api/trust/v1/schema.graphql: pkg/server/api/trust/v1/graphql $(TRUST_ $(NPM) --workspace $@ run build .PHONY: generate -generate: pkg/server/api/connect/v1/schema/schema.go \ - pkg/server/api/connect/v1/types/types.go \ - pkg/server/api/console/v1/schema/schema.go \ - pkg/server/api/console/v1/types/types.go \ - pkg/server/api/trust/v1/schema/schema.go \ - pkg/server/api/trust/v1/types/types.go \ - pkg/server/api/mcp/v1/server/server.go \ - pkg/server/api/mcp/v1/types/types.go \ - relay +generate: $(GENERATED) + +.PHONY: embed +embed: $(EMBEDDED) pkg/server/api/connect/v1/schema/schema.go \ pkg/server/api/connect/v1/types/types.go: pkg/server/api/connect/v1/gqlgen.yaml pkg/server/api/connect/v1/graphql $(CONNECT_GQL) diff --git a/README.md b/README.md index 7274a68a8..37ff29304 100644 --- a/README.md +++ b/README.md @@ -75,7 +75,7 @@ For detailed setup instructions, see our [Contributing Guide](CONTRIBUTING.md). ## 🏗️ Current Status Probo is in early development, focusing on building a solid foundation for -compliance management. +compliance management. ## 🛠️ Tech Stack diff --git a/contrib/claude/e2e.md b/contrib/claude/e2e.md index e9ce93167..ab079cedc 100644 --- a/contrib/claude/e2e.md +++ b/contrib/claude/e2e.md @@ -5,8 +5,8 @@ E2E tests live in `e2e/console/` (package `console_test`) and run against a live ## Running tests ```bash -SKIP_APPS=1 make build # Build the binary (backend only) -make test-e2e # Run all e2e tests +make build # Build the binary (backend only) +make test-e2e # Run all e2e tests ``` ## Client setup @@ -26,16 +26,16 @@ Each call creates a unique identity with a fresh email. Available roles: `RoleOw ## Client methods -| Method | API | Purpose | -|--------|-----|---------| -| `c.Execute(query, vars, &result)` | Console | Execute and unmarshal into result | -| `c.MustExecute(query, vars, &result)` | Console | Execute, fail test on error | -| `c.ExecuteShouldFail(query, vars)` | Console | Expect error, fail if succeeds | -| `c.Do(query, vars)` | Console | Low-level, returns raw response | -| `c.ExecuteConnect(query, vars, &result)` | Connect | For auth operations | -| `c.ExecuteWithFile(query, vars, path, file, &result)` | Console | Single file upload | -| `c.GetOrganizationID()` | — | Current org GID | -| `c.GetUserID()` | — | Current user GID | +| Method | API | Purpose | +| ----------------------------------------------------- | ------- | --------------------------------- | +| `c.Execute(query, vars, &result)` | Console | Execute and unmarshal into result | +| `c.MustExecute(query, vars, &result)` | Console | Execute, fail test on error | +| `c.ExecuteShouldFail(query, vars)` | Console | Expect error, fail if succeeds | +| `c.Do(query, vars)` | Console | Low-level, returns raw response | +| `c.ExecuteConnect(query, vars, &result)` | Connect | For auth operations | +| `c.ExecuteWithFile(query, vars, path, file, &result)` | Console | Single file upload | +| `c.GetOrganizationID()` | — | Current org GID | +| `c.GetUserID()` | — | Current user GID | ## Test data factories diff --git a/contrib/claude/make.md b/contrib/claude/make.md index 9b616cd02..660756102 100644 --- a/contrib/claude/make.md +++ b/contrib/claude/make.md @@ -4,33 +4,36 @@ The project uses a `GNUmakefile` at the root. Builds run with `--jobs=$(nproc)` ## Everyday targets -| Target | Purpose | -|---|---| -| `make build` | Build `bin/probod`, `bin/prb`, and `bin/probod-bootstrap` (includes frontend apps, codegen, and Relay) | -| `SKIP_APPS=1 make build` | Build without frontend apps (faster for backend-only work) | -| `make test` | Run tests with race detection and coverage | -| `make test MODULE=./pkg/foo` | Run tests for a single module | -| `make test-verbose` | Tests with verbose output | -| `make test-short` | Short tests only | -| `make test-bench` | Run benchmarks | -| `make test-e2e` | Run console end-to-end tests (requires `bin/probod`) | -| `make lint` | Run all linters: `vet` + `go-fmt` + `go-fix` + `go-lint` + `npm-lint` | -| `make fmt` | Format Go code (`go fmt ./...`) | -| `make clean` | Remove all build artifacts, `node_modules`, generated files, and coverage | -| `make help` | List targets with `##` doc comments | +| Target | Purpose | +| ---------------------------- | -------------------------------------------------------------------------------------------------------------- | +| `make build` | Build `bin/probod`, `bin/prb`, and `bin/probod-bootstrap` (does not include frontend apps, codegen, and Relay) | +| `make build WITH_APPS=1` | Build `bin/probod`, `bin/prb`, and `bin/probod-bootstrap` (includes frontend apps, codegen, and Relay) | +| `make test` | Run tests with race detection and coverage | +| `make test MODULE=./pkg/foo` | Run tests for a single module | +| `make test-verbose` | Tests with verbose output | +| `make test-short` | Short tests only | +| `make test-bench` | Run benchmarks | +| `make test-e2e` | Run console end-to-end tests (requires `bin/probod`) | +| `make lint` | Run all linters: `vet` + `go-fmt` + `go-fix` + `go-lint` + `npm-lint` | +| `make fmt` | Format Go code (`go fmt ./...`) | +| `make clean` | Remove all build artifacts, `node_modules`, generated files, and coverage | +| `make help` | List targets with `##` doc comments | ## Infrastructure -| Target | Purpose | -|---|---| -| `make stack-up` | Start Docker Compose infra (Postgres, Pebble, Keycloak, etc.) | -| `make stack-down` | Stop Docker Compose infra | -| `make stack-ps` | List running containers | -| `make psql` | Open a `psql` shell to the dev Postgres database | +| Target | Purpose | +| ----------------- | ------------------------------------------------------------- | +| `make stack-up` | Start Docker Compose infra (Postgres, Pebble, Keycloak, etc.) | +| `make stack-down` | Stop Docker Compose infra | +| `make stack-ps` | List running containers | +| `make psql` | Open a `psql` shell to the dev Postgres database | ## Codegen -`make generate` runs all code generation (GraphQL + MCP + Relay). Individual codegen is driven by `go generate`: +`make generate` runs go code generation (GraphQL + MCP without Relay). +`make generate WITH_APPS=1` runs all code generation (GraphQL + MCP + Relay). + +Individual codegen is driven by `go generate`: - `go generate ./pkg/server/api/console/v1` — Console GraphQL (gqlgen) - `go generate ./pkg/server/api/connect/v1` — Connect GraphQL (gqlgen) @@ -42,39 +45,39 @@ The project uses a `GNUmakefile` at the root. Builds run with `--jobs=$(nproc)` ## Coverage -| Target | Purpose | -|---|---| -| `make coverage-report` | Unit test HTML coverage report (`coverage.html`) | -| `make test-e2e-coverage` | E2E coverage report (`coverage-e2e.html`) | +| Target | Purpose | +| ------------------------ | ----------------------------------------------------- | +| `make coverage-report` | Unit test HTML coverage report (`coverage.html`) | +| `make test-e2e-coverage` | E2E coverage report (`coverage-e2e.html`) | | `make coverage-combined` | Combined unit + e2e report (`coverage-combined.html`) | ## Docker -| Target | Purpose | -|---|---| +| Target | Purpose | +| ------------------- | ------------------------------------------------- | | `make docker-build` | Build the Docker image (`ghcr.io/getprobo/probo`) | -| `make sbom` | Source SBOM (CycloneDX) | -| `make sbom-docker` | Docker image SBOM | -| `make scan` | Vulnerability scan (Grype) on source + Docker | -| `make scan-license` | License compliance scan (Trivy) | +| `make sbom` | Source SBOM (CycloneDX) | +| `make sbom-docker` | Docker image SBOM | +| `make scan` | Vulnerability scan (Grype) on source + Docker | +| `make scan-license` | License compliance scan (Trivy) | ## Sandbox (Lima) -| Target | Purpose | -|---|---| +| Target | Purpose | +| --------------------- | ------------------------------------------ | | `make sandbox-create` | Create a Lima sandbox VM for this worktree | -| `make sandbox-start` | Start the VM | -| `make sandbox-stop` | Stop (hibernate) the VM | -| `make sandbox-delete` | Delete the VM | -| `make sandbox-ssh` | Open a shell in the VM | -| `make sandbox-status` | Show VM status and IP | +| `make sandbox-start` | Start the VM | +| `make sandbox-stop` | Stop (hibernate) the VM | +| `make sandbox-delete` | Delete the VM | +| `make sandbox-ssh` | Open a shell in the VM | +| `make sandbox-status` | Show VM status and IP | ## Overridable variables -| Variable | Default | Purpose | -|---|---|---| -| `SKIP_APPS` | (unset) | Set to `1` to skip frontend app builds | -| `CGO_ENABLED` | `0` | Enable/disable CGO | -| `GOOS` | (host) | Cross-compile target OS | -| `TEST_FLAGS` | `-race -cover -coverprofile=coverage.out` | Extra flags passed to `go test` | -| `DOCKER_BUILD_FLAGS` | (empty) | Extra flags for `docker build` | +| Variable | Default | Purpose | +| -------------------- | ----------------------------------------- | ------------------------------------------ | +| `WITH_APPS` | (unset) | Set to `1` to generate/build frontend apps | +| `CGO_ENABLED` | `0` | Enable/disable CGO | +| `GOOS` | (host) | Cross-compile target OS | +| `TEST_FLAGS` | `-race -cover -coverprofile=coverage.out` | Extra flags passed to `go test` | +| `DOCKER_BUILD_FLAGS` | (empty) | Extra flags for `docker build` | diff --git a/contrib/claude/sandbox.md b/contrib/claude/sandbox.md index b0d406ce5..65da240a0 100644 --- a/contrib/claude/sandbox.md +++ b/contrib/claude/sandbox.md @@ -17,10 +17,6 @@ Use a sandbox when you need to: # Start an existing sandbox ./contrib/lima/sandbox.sh start -# Build and start the app (probo-stack starts automatically on boot) -./contrib/lima/sandbox.sh exec -- make build -./contrib/lima/sandbox.sh exec -- sudo systemctl start probod probo-console probo-trust - # Get the VM IP and service URLs ./contrib/lima/sandbox.sh status @@ -38,14 +34,14 @@ Use a sandbox when you need to: After `sandbox.sh status`, use the VM IP to access services from the host: -| Service | URL | -|---|---| -| Console | `http://:5173` | -| Trust | `http://:5174` | -| API | `http://:8080` | -| Grafana | `http://:3001` | -| Mailpit | `http://:8025` | -| Keycloak | `http://:8082` | +| Service | URL | +| ---------- | --------------------------- | +| Console | `http://:5173` | +| Trust | `http://:5174` | +| API | `http://:8080` | +| Grafana | `http://:3001` | +| Mailpit | `http://:8025` | +| Keycloak | `http://:8082` | | PostgreSQL | `psql -h -U probod` | ## Auto-generated configuration @@ -74,12 +70,12 @@ This file is sourced during provisioning before `probod-bootstrap` runs. Any var The sandbox provisions four systemd services: -| Service | Description | Starts on boot | -|---|---|---| -| `probo-stack` | Docker Compose stack (Postgres, SeaweedFS, Keycloak, etc.) | Yes | -| `probod` | Probo API server (depends on `probo-stack`) | No | -| `probo-console` | Console frontend dev server | No | -| `probo-trust` | Trust frontend dev server | No | +| Service | Description | Starts on boot | +| --------------- | ---------------------------------------------------------- | -------------- | +| `probo-stack` | Docker Compose stack (Postgres, SeaweedFS, Keycloak, etc.) | Yes | +| `probod` | Probo API server (depends on `probo-stack`) | No | +| `probo-console` | Console frontend dev server | No | +| `probo-trust` | Trust frontend dev server | No | `probo-stack` starts automatically when the VM boots. `probod`, `probo-console`, and `probo-trust` must be started manually after building. diff --git a/contrib/lima/provision.sh b/contrib/lima/provision.sh index 24b940bc6..7b07ea29d 100755 --- a/contrib/lima/provision.sh +++ b/contrib/lima/provision.sh @@ -145,8 +145,9 @@ if [ -z "$(ls -A /var/lib/probo/node_modules 2>/dev/null)" ]; then su - "${LIMA_USER}" -c "cd /workspace && npm ci" fi -# Build bin/probod to get dependencies, notably embedded files -make -C /workspace bin/probod SKIP_APPS=1 +# Generate go and ts files for probod and apps, and create embedded files for probod +make -C /workspace generate WITH_APPS=1 +make -C /workspace embed echo "VITE_API_URL=http://${VM_IP}:8080" > /workspace/apps/console/.env echo "VITE_API_URL=http://${VM_IP}:8080" > /workspace/apps/trust/.env