Files
Moonbase/CLAUDE.md
2026-06-16 00:18:06 -05:00

76 lines
3.8 KiB
Markdown

# Moon Base — Project Notes
Property management for the Moon homestead (Eau Claire, WI). Next.js 14 + Prisma +
Postgres. Same conventions as FMB (`/Users/bonnamoon/Projects/fullmoonbakehouse`).
Repo on Gitea: **`bonna61/Moonbase`**. Live at NAS:8053. See `README.md` for the
user-facing overview.
## Modules (all live)
- **Garden** — Plant registry + care/harvest logs, plant **groups**, reusable
**PlantType** records, Wikipedia photos. Plants sit on the shared location tree.
- **Inventory** — durable **Item**s that nest (`parentItemId`), with **Label**s
(M:N via `LabelOnItem`), `ItemAttachment`, and `ItemLog`. Shares the Location spine.
- **Locations** — `Location` tree (self-ref `parentId`) shared by plants + items.
- **Reminders** — `Task` + `TaskCompletion`; recurrence in `src/lib/tasks/schedule.ts`.
- **REST API** — `/api/v1/*` authed by `ApiToken` (per-scope; logic in `src/lib/api/`).
- **Suggestions** — `@otm/account-panel` (Gitea npm registry) → files issues to the repo.
- **Backup & Restore** — `/api/admin/backup` + `/api/admin/restore` (admin only).
- **Self-update** — admin "Pull & rebuild" (see Deploy).
## Local dev
- DB: `postgresql://tonym@localhost:5432/moonbase_dev`; copy `.env.example``.env`.
- `npm install`, `npm run dev` (3000). After schema edits: `npx prisma generate`.
- `npx prisma migrate deploy` provisions Bonna + Tony. `npm run db:seed` for demo
data (`SEED_MODE=minimal` = accounts only).
- Backfills for the location/plant-type refactors: `npm run db:backfill-locations`,
`npm run db:backfill-plant-types`.
## Deploy — git checkout on the NAS (NOT rsync)
The NAS appdata (`/mnt/user/appdata/moonbase`) is a real **git checkout** tracking
`origin/master` (remote URL carries the token). Deploy by:
```sh
git push origin master
ssh root@192.168.0.5 'cd /mnt/user/appdata/moonbase && git pull && docker compose up -d --build'
```
Or admins click **Settings → Updates → Pull & rebuild**, which signals the
privileged `updater` sidecar (docker socket + adnanh/webhook) to run the same
`git pull && compose up -d --build app` detached; the UI polls `/api/version` and
reloads. **Never rsync over the appdata dir** — it fights the checkout.
- **Secrets** (`NEXTAUTH_SECRET`, `GITEA_TOKEN`, `UPDATER_SECRET`) live in a
gitignored host `.env` next to the compose file, interpolated in — never committed.
- **Docker runtime** mirrors FMB: `node:20-bookworm-slim` + openssl, runs as root,
full `node_modules`, `next start`. Migrations run on container start via the
entrypoint (waits for Postgres first). Image gotcha: don't let `npx prisma`
resolve at runtime — with no local prisma on PATH it pulls Prisma 7, which
rejects `url` in the datasource.
## Conventions (same as FMB)
- **Every commit bumps APP_VERSION** in `src/lib/version.ts` + a plain-English
entry atop `src/lib/changelog.ts` (the footer shows it + an "update available"
badge from `src/lib/update-check.ts`). Minor for features/migrations, patch for fixes.
- **AuditEvent on every mutation** — append-only.
- **Soft-delete** via `active=false`.
- **Pure core + colocated test** — logic in `src/lib/...` with a `.test.ts`; routes thin.
## Auth
- Username OR email login. Accounts `bonna` / `tony`, role `ADMIN`.
- `getSession()` / `requireAuth()` / `isAdmin()` in `src/lib/auth.ts`.
- **Forced password change is wired** (provisioned accounts ship `moonbase!` +
`mustChangePassword=true`): the dashboard layout redirects to `/change-password`
(outside the layout group; backed by `/api/account/change-password`). Don't
remove that redirect.
- `NEXTAUTH_SECRET` is asserted at runtime in production (skipped during build).
## Color palette
Forest / earth theme: `--canopy` (sidebar), `--leaf` (accent), `--soil` (text),
`--dew` (bg), `--ember` (destructive).