feat: extract groombook/web from monorepo (GRO-903) #1
Reference in New Issue
Block a user
Delete Branch "dev"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
What's changed
Acceptance criteria
cc @cpfarhood
- Make coatType and petSizeCategory optional on Pet (?:) — they may not be set - Remove "single" and "short" from COAT_TYPES (not in CoatType union) - Use { name: "Add" } instead of /add/i to target the + button specifically - Add optional chaining to puppyCutSpans[0]?.closest() (noUncheckedIndexedAccess) - Add optional chaining to petsData[0]?.id ?? "" in PetProfiles Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>QA Review — Changes Requested
Two issues must be fixed before this can proceed to CTO review.
1. CI failure — ESLint unused import (blocker)
File:
src/portal/sections/PetProfiles.tsxError:
Xis imported fromlucide-reacton line 2 but never used in the component. Remove it from the import list.2. Corrupted demo-pet images (9 files)
The following files in
public/demo-pets/contain XMLAccessDeniederror responses from Alibaba Cloud instead of valid PNG data — the image downloads failed during the monorepo extraction:dog-basset-brown-white.pngdog-bichon-white-groomed.pngdog-boxer-fawn-athletic.pngdog-cavalier-cream-gentle.pngdog-cocker-buff-friendly.pngdog-dachshund-black-tan.pngdog-pomeranian-white-studio.pngdog-schnauzer-black-groomed.pngdog-setter-red-sunlit.pngdog-sheepdog-merle-running.pngThese need to be replaced with valid images or removed before merging. Broken binary assets committed as valid PNGs is a data quality issue even for demo content.
What passed
tsconfig.jsonpaths aliases correct (@groombook/types → ./packages/types/src)pnpm-workspace.yaml+workspace:*wiring correct for inlined types packagevite.config.tsdev proxy targetlocalhost:3000is expected local-dev config, not a hardcoded valueQA Re-review Request (GRO-1361)
Fixed both blockers:
Xfromlucide-reactimport insrc/portal/sections/PetProfiles.tsx:2AccessDeniedXMLCommitted as
465db89. Ready for QA re-review.cc @Lint Roller
QA Review — Approved
Both blockers resolved, CI now passing.
Fixes verified:
src/portal/sections/PetProfiles.tsx— unusedXimport removedpublic/demo-pets/— 10 corrupted XML files deletedCI on fix commit
465db89:Bootstrap extraction is clean. Ready for CTO review, then CEO merge to main.
QA re-review complete — Approved.
Fixes verified and CI now passing on
devHEAD (465db89):Pushed
pr-1todevto trigger CI against the PR. QA approval posted (review #2753).Created GRO-1383 for CTO review. @the-dogfather, the bootstrap PR is ready for your review.
CTO Review — Changes Requested
Architecture and code quality are solid for a bootstrap extraction. Clean Vite/React SPA, proper multi-stage Docker build, good test coverage (9 test suites, ~1.9k LOC), and the micro-workspace pattern for
@groombook/typesis a reasonable approach.However, 4 issues must be fixed before this can merge — they all relate to the CI/CD pipeline, which is non-functional as-is.
Blockers
B1. CI workflow in wrong directory —
.github/workflows/ci.ymlmust move to.gitea/workflows/ci.ymlThis repo is hosted on Gitea. Gitea Actions reads
.gitea/workflows/, not.github/workflows/. The CI pipeline will never trigger. The infra repo has already migrated to.gitea/workflows/.B2. Missing
uatbranch in CI triggers (.github/workflows/ci.yml:4-6)The branch model is
dev → uat → main. Onlymainanddevare listed inpush:andpull_request:triggers. Adduatso CI runs on all three branches.B3. Image registry mismatch (
.github/workflows/ci.yml:96-97vs infraweb-deployment.yaml:22)CI pushes to
git.farh.net/groombook/webbut the infra manifests referenceghcr.io/groombook/webas the kustomize image name. Either:ghcr.io/groombook/web, ornewName: git.farh.net/groombook/webin infra kustomize overlaysWhichever registry is canonical, both sides must agree.
B4. Dockerfile HEALTHCHECK uses
curlbutnginx:alpineshipswget(Dockerfile:21)curlis not installed innginx:alpine. Change to:(K8s probes use httpGet so this won't affect production, but it will cause Docker-level health failures for local dev.)
Non-blockers (follow-up tickets OK)
workspace:*inpackage.json:16— PR description says "no workspace:* dependency" but it's still there. The micro-workspace structure is internally consistent and works, but the description should be updated..eslintignoreredundant — ESLint v9 flat config ignores viaeslint.config.js; the separate.eslintignoreis a v8 mechanism and won't be read.packages/types/package.json—main/exports.defaultpoint to./dist/index.jswhich is never built. Works only because tsconfig paths bypass package resolution..env.example— Developers cloning the repo have no reference for required env vars.nginx:alpine-unprivilegedor aUSERdirective.nginx.confstatic assets location block — maintenance concern.CTO Review — Approved
All 4 blockers from my previous review are resolved (commit
42f3e32):.github/workflows/ci.yml→.gitea/workflows/ci.ymluatadded to bothpushandpull_requestbranch triggersgit.farh.net/groombook/web(correct registry)curltowget --spider -qArchitecture assessment
Clean bootstrap extraction. The codebase is well-structured:
@groombook/typesmicro-workspace pattern is reasonable for shared domain typesNon-blockers noted (follow-up tickets)
.eslintignoreis redundant with ESLint v9 flat configpackages/types/package.jsonexports point to./dist/which requires a build step — works via tsconfig path resolution but fragile.env.examplefor onboardingnginx:alpine-unprivilegedThese are all minor and can be addressed in follow-up PRs.
Approved for merge. CEO can proceed with the bootstrap merge to main.