# AGENTS.md ## Stack and runtime - Astro 5 SSR app with `@astrojs/node` in `standalone` mode (`astro.config.mjs`). - Production entrypoint is `node ./dist/server/entry.mjs` (`package.json`, `Dockerfile`, `nixpacks.toml`). - Node 20 is the deployed runtime in both Docker and Nixpacks. - TypeScript extends `astro/tsconfigs/strict`; `dist` is excluded (`tsconfig.json`). ## Verified commands - Install deps: `npm install` or `npm ci` - Dev server: `npm run dev` - Type/content check: `npm run check` - Build: `npm run build` - Local preview: `npm run preview` - Production start: `npm run start` Recommended verification after any page, styling, metadata, or asset change: 1. `npm run check` 2. `npm run build` There are currently no repo scripts for linting, formatting, or tests, and no CI workflows or Husky hooks to catch mistakes for you. ## Real app structure - File-based routes live in `src/pages/`. - Current public/legal routes are: `index.astro`, `nosotros.astro`, `bodas-reales.astro`, `corporativo-business.astro`, `reuniones-familiares.astro`, `contacto.astro`, `cookies.astro`, `privacidad.astro`, and `aviso-legal.astro`. - `src/layouts/MainLayout.astro` is the real app shell for every route. - Shared UI lives in `src/components/`. - Global CSS is imported only through `MainLayout.astro` from `src/styles/{tokens,base,layout,components,utilities,animations}.css`. ## Wiring facts agents usually miss - `MainLayout.astro` owns the canonical URL, OG/Twitter metadata, default JSON-LD, and optional Umami injection via `PUBLIC_UMAMI_URL` + `PUBLIC_UMAMI_WEBSITE_ID`. - `MainLayout.astro` also mounts `SiteHeader`, `SiteFooter`, `WhatsAppButton`, and `CookieBanner` globally, plus the reveal/scroll-progress/page-transition client behavior. - The canonical site URL is `https://www.mnqcatering.com` (`astro.config.mjs`). - This is a marketing site optimized for WhatsApp lead capture. Keep WhatsApp as the primary CTA. - `src/pages/contacto.astro` currently has **no form at all**. It is a WhatsApp/phone-led contact page with FAQs and coverage text, so do not describe or implement it as an existing form flow unless you are intentionally adding one. - The WhatsApp destination/phone number is duplicated across layouts, components, and pages. If routing changes, search the whole repo instead of editing one component and assuming coverage. ## Content and design constraints - Read `DESIGN.md` before making visual changes; it defines the premium editorial tone. - Gold is an accent, not a dominant fill color. - Keep the mobile-first approach and use existing CSS tokens/variables instead of adding a utility framework. - Keep service pages structurally aligned, but adapt copy, CTA, and gallery content per service instead of cloning sections blindly. - Galleries are embedded inside service pages, not split into a separate gallery route. ## Deployment and SEO gotchas - Docker build flow is `npm ci` -> `npm run build` -> `node ./dist/server/entry.mjs`. - Runtime defaults used by deploy configs are `HOST=0.0.0.0`, `PORT=4321`, `NODE_ENV=production`. - Sitemap generation excludes `/cookies/` and `/privacidad/` only. `aviso-legal.astro` sets `robots="noindex,follow"`, but it is **not** filtered out of the sitemap in `astro.config.mjs`. ## Ignore / generated output - Treat `.astro/` and `dist/` as generated output. - `.gitignore` also excludes `.opencode/`, `.worktrees/`, and `docs/plans/`.