3.4 KiB
AGENTS.md
Architecture
apps/next: Next.js 16 frontend plus embedded Payload CMS.apps/expo: Expo scaffold; only work here when explicitly requested.packages/backend/convex: self-hosted Convex functions, schema, and auth.packages/ui: shared shadcn-based UI components.tools: shared ESLint, Prettier, Tailwind, TypeScript, and Vitest config.- Local development uses host-run apps, local Convex on ports 3210/3211, its own data volume, and Payload Postgres on port 5432. Convex does not use Postgres unless a cloned project explicitly enables the commented option.
Protected and generated files
- Never edit
packages/backend/convex/_generated/**orpackages/backend/convex/http.ts. - Do not rename
apps/next/next.config.jsorapps/next/src/proxy.ts. - Preserve
withPayload(...)andtypescript.ignoreBuildErrorsin Next config. - Do not edit Payload-generated routes, layouts, import maps, or
apps/next/payload-types.tsmanually. - Do not modify Sentry config or
tools/tailwind/theme.cssunless requested. - Generated
.cache,.turbo,.local, and environment files are ignored.
Environment rules
- Local
devandstagingcome only from Infisical viascripts/with-env; it never falls back to.env*. - Run
infisical loginandinfisical initbefore local development. - Machine-generated values belong in
.local/<env>.generated.env; never put the generated Convex admin key in shared Infisical. - CI uses Gitea-injected secrets or
CI_ENV_FILEand must not call Infisical. - App code imports validated variables from
@/env, neverprocess.env. - Add cache-relevant variables to
turbo.jsonglobalEnv.
Code and dependency rules
- Use
constarrow functions instead of function declarations. - Add
.jsextensions to Convex generated-file imports. - Put custom frontend routes in
apps/next/src/app/(frontend). - Extend the Convex
userstable for application user data; do not add a profile table by default. Authenticate protected functions. - Manage shared versions in root catalogs. Never run
bun updatein a package. - Run root
bun installand verify withbun lint:ws. - Update this guide when architecture or workflows change.
Local stack
bun db:up # start Payload Postgres, Convex, and dashboard
bun dev:next # host Next + deploy/watch local Convex functions
bun db:down # stop and preserve both data volumes
bun db:down:wipe # remove both volumes, generated admin key, and seed marker
bun db:sync:payload # refresh and apply the local Payload seed snapshot
Local URLs: app http://localhost:3000, Convex http://localhost:3210,
dashboard http://localhost:6791, Payload Postgres localhost:5432.
Use INFISICAL_ENV=staging bun dev:next for staging services.
db:sync:payload is an explicit, destructive local operation. It validates a
remote staging source and localhost destination, stores the sensitive snapshot
only under .local/, and never changes Convex or production data. Normal
db:up never connects to staging; it only applies .local/payload-staging.dump
when .local/payload-seed-state.env is absent or stale. Do not store seed
markers in Payload Postgres; schema push treats unmanaged tables as drift.
Validation
Use bun typecheck, never a production build for routine validation. The full
gate is SKIP_E2E=1 bun run ci:check; local-stack smoke e2e is bun test:e2e.
Pre-commit runs lint-staged serially and pre-push runs the bounded full gate.