Web

Status: Implemented Source: src/Web/ Owner: UI Guild

Note: This folder documents triage-specific frontend features. For the comprehensive Web UI architecture, see ../ui/architecture.md.

Purpose

Web provides the Angular 21 single-page application (SPA) frontend for StellaOps. Delivers the user interface for vulnerability exploration, policy management, scan results, SBOM visualization, release control, evidence/assurance, and administrative functions. The SPA is served by the router gateway as static assets and talks to backend services through gateway-routed APIs.

Components

Application:

Technology stack (from src/Web/StellaOps.Web/package.json and AGENTS.md):

Top-level navigation pillars (from src/app/core/navigation/navigation.config.ts; five-pillar IA per SPRINT_20260707_006, UIF-5 first-level limits per SPRINT_20260711_002):

Each first-level nav item renders a short inline sublabel plus a full-sentence hover tooltip (SidebarTooltipDirective); demoted routes (/evidence/exports, /evidence/bundles, /evidence/transparency, /setup/security-data, /setup/tenant-branding, /setup/integrations/runtime-hosts) stay resolvable for deep links but have no duplicate sidebar entry.

Key Features:

Configuration

The SPA is configured at runtime (not build-time), so a single bundle can serve any deployment. AppConfigService (src/app/core/config/app-config.service.ts) resolves configuration through this chain:

  1. ?envSettings=<url> query param (stored in the stellaops_env_settings_url cookie)
  2. /platform/envsettings.json (primary; served by the Platform service through the gateway)
  3. /config.json (legacy fallback; a stub ships under src/config/config.json)

There is no STELLAOPS_BACKEND_URL environment variable — backend endpoints come from the resolved config document. The config shape is defined by the AppConfig interface in src/app/core/config/app-config.model.ts:

Module/feature visibility is scope-gated by route guards (requireScopesGuard / requireAnyScopeGuard in src/app/app.routes.ts), not by config feature flags. Scopes are the canonical OAuth scopes from StellaOps.Auth.Abstractions/StellaOpsScopes.cs (e.g. ui.read, release:read, scanner:read, vuln:view, ui.admin).

angular.json and tsconfig*.json hold the build-time Angular/TypeScript configuration.

Build and Development

Working directory: src/Web/StellaOps.Web/. Exact script wiring is in package.json.

# Install dependencies (deterministic / offline-friendly)
npm run ci:install          # npm ci --prefer-offline --no-audit --no-fund

# Development server (runs node scripts/serve.js, not `ng serve` directly)
npm start

# Production build (ng build → dist/stellaops-web/)
npm run build

# Run unit tests (Vitest, batched via scripts/run-unit-test-batches.mjs)
npm test                    # CI variant: npm run test:ci (adds the bundle-mutation guard)

# Run E2E tests (Playwright, auto-starts the test dev server on 127.0.0.1:4400)
npm run test:e2e

Notes:

Dependencies

Triage Experience

Module Dependencies

Implementation Sprints (archived)

These sprints have shipped and been archived; links point to docs-archive/implplan/.

Current Status

Angular 21 SPA implemented with lazy-loaded routing, OIDC/DPoP authentication, runtime configuration, and scope-gated route guards. Supports vulnerability exploration/triage, scan results, SBOM visualization, policy management, release control, evidence/assurance, and console administration. Unit tests run on Vitest (@angular/build:unit-test); Playwright E2E and Storybook are configured.