backend/: Spring Boot (Java 21) API, Flyway migrations inbackend/src/main/resources/db/migration/.seller-web/: Seller dashboard (Next.js + TypeScript), source inseller-web/src/.buyer-mobile/: Shared/mobile JS workspace (Vitest), source inbuyer-mobile/src/.buyer-android/: Android app (Gradle), app code inbuyer-android/app/.buyer-ios/: iOS app (Swift Package), code inbuyer-ios/PoultryBuyer/, tests inbuyer-ios/Tests/.infra/: Kubernetes manifests and ops scripts (seeinfra/k8s/).docs/: Operational and deployment docs.
Generated artifacts (don’t edit/commit): backend/build/, seller-web/.next/, **/node_modules/.
- Local stack (recommended):
cp .env.example .envthendocker-compose up -d(API onhttp://localhost:8080). - Backend (local):
cd backend && ./gradlew bootRun(start),./gradlew test(JUnit),./gradlew build(build). - Seller web:
cd seller-web && npm ci,npm run dev,npm run lint,npm test,npm run build. - Buyer mobile tests:
cd buyer-mobile && npm test. - Mobile apps:
cd buyer-android && ./gradlew test,cd buyer-ios && swift test.
- Java: 4-space indentation, keep packages under
com.poultry.*, prefer small focused services/controllers. - SQL migrations: follow Flyway naming
V<version>__<description>.sqland keep them idempotent where possible. - TypeScript/React: follow existing Next.js patterns; keep imports using
@/…aliases inseller-web/. - Lint/format: run
seller-weblint vianpm run lint; backend quality checks exist in CI (./gradlew checkstyleMain,./gradlew spotbugsMain).
- Backend: JUnit 5 + Spring Boot Test + Testcontainers; coverage is enforced via JaCoCo (minimum 50%).
- Frontend: Jest + Testing Library (
seller-web), Vitest (buyer-mobile). - Naming:
*Test.javafor unit tests; prefer*IntegrationTest.javafor container-backed flows.
- Commits: repo history is free-form; use short imperative subjects and add a module prefix when helpful (e.g.,
backend: add settlement reconciliation). - PRs: include a clear description, linked issue(s), test evidence (commands run), and screenshots for UI changes (
seller-web/). Avoid committing secrets; use.env.example/.env.production.exampleas templates.