New react app for seahaven
Find a file
Adam Moussa b71c0ad87b
docs: document the dev Terraform adoption runbook and gates
Two-phase runbook, ownership boundary, workspace invariants, rollback
per phase, and operational rules in terraform/README.md; CDK adoption
mode and the retired cd-cdk path in infra/cdk/README.md; gate matrix and
deployment section updates.
2026-09-10 19:15:14 -04:00
.cursor/rules Feat/vite typescript migration (#16) 2026-06-18 14:41:17 -03:00
.github ci(governance): wire Terraform and CDK gates and isolate Terraform PRs 2026-09-10 19:15:13 -04:00
.husky Feat/vite typescript migration (#16) 2026-06-18 14:41:17 -03:00
config feat(observability): identify and scrub Sentry transactions 2026-09-03 17:12:49 -03:00
docs feat(observability): identify and scrub Sentry transactions 2026-09-03 17:12:49 -03:00
e2e test(work-orders): refresh New WO Linux visual baseline after merge 2026-08-31 15:21:24 -03:00
eslint-rules fix(lint): enforce error typography composition 2026-07-24 11:36:30 -03:00
infra/cdk feat(cdk): add Terraform adoption retain mode 2026-09-10 19:15:11 -04:00
public Merge pull request #35 from Sea-Haven-Industries/feature/wo-shared-ui 2026-07-21 14:03:58 -03:00
scripts ci(governance): wire Terraform and CDK gates and isolate Terraform PRs 2026-09-10 19:15:13 -04:00
src Merge branch 'dev' into feat/sh-298-sentry 2026-09-10 14:44:12 -03:00
terraform feat(terraform): add dev root and import guard for HCP adoption 2026-09-10 19:15:09 -04:00
tmp/pr-descriptions Merge remote-tracking branch 'origin/dev' into feature/wo-uplift-pending-close-gate 2026-08-17 13:50:22 -03:00
.env Feat/vite typescript migration (#16) 2026-06-18 14:41:17 -03:00
.env.development Feat/vite typescript migration (#16) 2026-06-18 14:41:17 -03:00
.env.example feat: activate Sentry deployment environments 2026-09-03 15:10:01 -03:00
.env.production feat: activate Sentry deployment environments 2026-09-03 15:10:01 -03:00
.gitignore feat(terraform): add dev root and import guard for HCP adoption 2026-09-10 19:15:09 -04:00
.prettierignore fix(vendors): complete shell and visual parity gates 2026-08-10 12:11:38 -03:00
.prettierrc Feat/vite typescript migration (#16) 2026-06-18 14:41:17 -03:00
AGENTS.md chore(governance): enforce frontend quality system (#53) 2026-07-24 16:47:34 -03:00
ARCHITECTURE_AND_CODE_QUALITY.md chore(governance): enforce frontend quality system (#53) 2026-07-24 16:47:34 -03:00
commitlint.config.js Feat/vite typescript migration (#16) 2026-06-18 14:41:17 -03:00
eslint.config.js fix(lint): enforce error typography composition 2026-07-24 11:36:30 -03:00
index.html chore: correct Sea Haven branding and rewrite README (#25) 2026-07-17 13:17:21 -04:00
package-lock.json feat(observability): identify and scrub Sentry transactions 2026-09-03 17:12:49 -03:00
package.json ci(governance): wire Terraform and CDK gates and isolate Terraform PRs 2026-09-10 19:15:13 -04:00
playwright.config.ts fix(vendors): complete shell and visual parity gates 2026-08-10 12:11:38 -03:00
playwright.visual.config.ts fix(vendors): complete shell and visual parity gates 2026-08-10 12:11:38 -03:00
QUALITY_GATES.md docs: document the dev Terraform adoption runbook and gates 2026-09-10 19:15:14 -04:00
README.md docs: document the dev Terraform adoption runbook and gates 2026-09-10 19:15:14 -04:00
REVIEW_AND_PR_FRAMEWORK.md fix(work-orders): treat vendor save as a live company assignment 2026-08-20 14:17:20 -03:00
tsconfig.json chore: upgrade frontend dependencies (#24) 2026-07-14 21:35:59 -03:00
tsconfig.node.json feat(observability): identify and scrub Sentry transactions 2026-09-03 17:12:49 -03:00
vite.config.ts feat(observability): identify and scrub Sentry transactions 2026-09-03 17:12:49 -03:00
vitest.config.ts Feat/vite typescript migration (#16) 2026-06-18 14:41:17 -03:00

SHOC Frontend (shoc-frontend-new)

CI Deploy TypeScript React Vite AWS CDK

Vite + React SPA for Sea Haven facility management (SHOC): work orders, vendor portal, uplifts, and related admin features. This is the selective rebuild of the legacy SHOC frontend — new code follows the IrisLoan.Admin conventions documented in docs/ARCHITECTURE_PLAN.md.

  • GitHub: Sea-Haven-Industries/shoc-frontend-new
  • Hosted at: https://dev.seahaven.com (dev environment; the only environment today)
  • Backend API: https://api.dev.seahaven.com/api (called directly, cross-origin) — source: Sea-Haven-Industries/shoc-backend

Architecture

Static SPA hosting on AWS, provisioned by a CDK app local to this repo (infra/cdk/). CloudFront serves the built dist/ from a private S3 bucket; the SPA calls the backend directly over HTTPS at VITE_API_URL (no /api proxy at the CDN — the backend allows CORS).

graph LR
    U[Browser] -->|HTTPS dev.seahaven.com| CF[CloudFront]
    CF -->|OAC| S3[S3 seahaven-shoc-frontend-dev]
    CF -.->|viewer-request fn| FN[SPA rewrite → /index.html]
    U -->|HTTPS api.dev.seahaven.com/api CORS| API[SHOC backend API]
    GH[GitHub Actions: Deploy dev content] -->|OIDC| ROLE[githubdeploy-shoc-frontend-new-dev]
    ROLE -->|s3 sync + invalidation| S3
    TF[HCP Terraform shoc-frontend-new-dev] -.->|adopting: bucket, CloudFront, DNS, role| S3

Dev hosting is being adopted from CDK into HCP Terraform (SH-300); see terraform/README.md for the phase runbook and the current ownership state.

Frontend stack: React 19, TypeScript, Vite, Tailwind CSS 4 + MUI, TanStack Query, React Router (via @generouted/react-router), React Hook Form + Zod, Ky HTTP client. Source layout: src/api/, src/domain/, src/app/ (see the architecture plan for the keep/discard migration matrix).

AWS Resources

Stack shoc-frontend-dev — CDK, account 396287094661, region us-east-1. Defined in infra/cdk/lib/frontend-stack.ts.

Resource Name Purpose
S3 bucket seahaven-shoc-frontend-dev Private origin (BLOCK_ALL, SSE, versioned; OAC-only reads)
CloudFront distribution (stack output DistributionId) HTTPS static hosting on dev.seahaven.com, ACM *.seahaven.com
CloudFront Function SpaRewrite Viewer-request rewrite of extensionless paths to /index.html (deep links)
IAM role githubdeploy-shoc-frontend-new-dev GitHub Actions OIDC deploy role, trust scoped to repo:Sea-Haven-Industries/shoc-frontend-new:ref:refs/heads/dev
Route 53 records A/AAAA apex alias in zone dev.seahaven.com (Z07671212N75U4YLPWZR8) Points the custom domain at CloudFront

No Lambdas, queues, or databases — this stack is static hosting only.

Configuration

Secrets

No Secrets Manager or SSM parameters. AWS access is OIDC only; the deploy role ARNs are deterministic and pinned in the workflows. The one GitHub Actions repo secret is:

Secret Purpose
SENTRY_AUTH_TOKEN Source-map upload by scripts/upload-sourcemaps.sh after a deploy

Environment variables (build-time, VITE_*)

Variable Description Dev value
VITE_API_URL Ky API base prefix, baked into the build at vite build /api (dev server) / https://api.dev.seahaven.com/api (production build)
VITE_API_TARGET Dev-proxy target for /api (Vite dev server only) http://localhost:5141

VITE_API_URL supplies the full API prefix — route paths in API_PATHS do not include /api. Absolute values must end with /api; vite.config.ts enforces this via config/api-url-contract.ts and fails the build otherwise. See .env.example, .env.development, and .env.production.

CDK context (domain, certificate ARN, hosted zone) lives in infra/cdk/cdk.json so an administrator runs cdk deploy with no flags.

Local Development

Requirements: Node.js ≥ 22.22.1 (CI/CD run Node 24), npm 11.16.0 (pinned via packageManager).

npm ci
cp .env.example .env   # then set VITE_API_URL=/api for local dev
npm run dev            # Vite dev server on port 3000, proxies /api → VITE_API_TARGET

The dev proxy expects the shoc-backend API at http://localhost:5141; override with VITE_API_TARGET (e.g. https://api.dev.seahaven.com to use the deployed dev API).

Command Description
npm run dev Start Vite dev server on port 3000
npm run build Type-check (tsc -b) and production build to dist/
npm run preview Preview the production build locally
npm test / npm run test:watch Vitest unit tests (once / watch)
npm run test:e2e / npm run test:e2e:ui Playwright e2e tests (headless / UI mode)
npm run lint / npm run lint:fix ESLint (check / auto-fix)
npm run format / npm run format:check Prettier (write / check)
npm run governance Governance checks (godfile, maintainability, Terraform, CDK)
npm run verify All gates: format + lint + build + test + governance

npm run governance needs terraform and python3 on PATH for the Terraform gates (npm run test:terraform, npm run test:terraform-import-plan, npm run test:terraform-isolation) and installs infra/cdk for npm run test:infra.

Husky + lint-staged run ESLint and Prettier on staged files at commit; commitlint enforces conventional commit messages. Run npx tsc --noEmit (or npm run build) before pushing to catch type errors early.

Contributing

  • Branch from dev with a kebab-case description and a prefix matching the work: feature/, bug/, hotfix/, chore/, docs/, or refactor/ (e.g. feature/vendor-portal-filters, chore/sea-haven-branding).
  • Commit messages follow Conventional Commits — commitlint rejects anything else at commit time.
  • Open PRs against dev. Both dev and main are protected: every PR needs a green CI run and an approving review from a code owner (@Sea-Haven-Industries/internal-dev); new pushes dismiss stale approvals. Merged branches are deleted automatically.
  • A PR that changes terraform/** may not also change application code (.github/workflows/terraform-isolation.yaml); ship Terraform in its own PR.
  • Promotion flow: feature/* → dev (deployed to dev.seahaven.com through the Deploy dev content workflow while the Terraform adoption is in progress) → main (production promotion — no prod environment exists yet).

Deployment

No stored AWS keys — OIDC only. Infrastructure and content deploy separately:

  • CI (.github/workflows/ci.yaml) — on push and PRs to main/dev/staging, calls Sea-Haven-Industries/.github → ci-typescript-frontend.yaml (Node 24): format check, lint, build, tests; and runs a repo-owned governance job that calls npm run verify so every gate (including the maintainability ratchets in scripts/governance-check.mjs, the Terraform gates, and the CDK template tests) is guaranteed from this repository. Conventions and gates are documented under AGENTS.md, QUALITY_GATES.md, ARCHITECTURE_AND_CODE_QUALITY.md, and REVIEW_AND_PR_FRAMEWORK.md.
  • Terraform isolation (.github/workflows/terraform-isolation.yaml) — fails a PR that mixes terraform/** with application code, so a Terraform merge never races a content release for the HCP workspace.
  • Dev content (.github/workflows/deploy.yml) — workflow_dispatch on dev only while the Terraform adoption is in progress. Runs npm run verify, assumes githubdeploy-shoc-frontend-new-dev, and runs scripts/deploy-web.sh: npm run build, aws s3 sync dist/ (hashed assets immutable, index.html never cached), CloudFront invalidation, then uploads source maps and checks the served index.html matches the build. Push-to-dev releases return with the Terraform content-CD change.
  • Staging content (.github/workflows/deploy-staging.yml) — on push to staging, unchanged.
  • Infrastructure — administrator-run. Dev: the CDK retain/transfer sequence and the HCP Terraform workspace shoc-frontend-new-dev (terraform/README.md). Staging: cdk deploy (infra/cdk/README.md).

Manual content deploy (emergency/reference only — needs credentials for the external-dev AWS account):

SITE_BUCKET=seahaven-shoc-frontend-dev CLOUDFRONT_DISTRIBUTION_ID=E2CWLM1AFB964P \
  AWS_REGION=us-east-1 bash scripts/deploy-web.sh

Operations

  • Verify: open https://dev.seahaven.com after a green Deploy dev content run in the Actions tab; confirm a deep link (e.g. a work-orders route) loads directly and API calls succeed.
  • Logs: deploy logs live in GitHub Actions (CI + Deploy workflows). There are no CloudWatch application logs — the stack is static hosting; runtime errors surface in the browser and on the backend API's side.
  • Common failure modes:
    • Stale content after deploy — the CloudFront invalidation step failed or is still propagating; re-run the Deploy workflow or invalidate /* manually.
    • OIDC AssumeRole errors — the trust policy is scoped to the dev ref on this repo; dispatching the workflow from another branch is rejected by design.
    • Broken API requests after a build — VITE_API_URL missing the /api suffix or carrying the wrong environment's host (it is baked in at build time).
    • CORS errors — the backend must allow the frontend origin; CloudFront does not proxy /api.
  • Dev has no push-triggered deploy during the adoption. Merging to dev runs CI only; publish through the Deploy dev content workflow. Merging a terraform/** change also queues an HCP Terraform run that a human confirms or discards (see the operational rules in terraform/README.md).

Documentation