This is a Dineway site -- an Agentic Web builder built with a full admin UI.

## Commands

```bash
npx dineway dev        # Start dev server (runs migrations, seeds, generates types)
npx dineway types      # Regenerate TypeScript types from schema
```

The admin UI is at `http://localhost:4321/_dineway/admin`.

## Key Files

| File                     | Purpose                                                                            |
| ------------------------ | ---------------------------------------------------------------------------------- |
| `astro.config.mjs`       | Astro config with `dineway()` integration, database, and storage                   |
| `src/live.config.ts`     | Dineway loader registration (boilerplate -- don't modify)                          |
| `seed/seed.json`         | Schema definition + demo content (collections, fields, taxonomies, menus, widgets) |
| `dineway-env.d.ts`       | Generated types for collections (auto-regenerated on dev server start)             |
| `src/layouts/Base.astro` | Base layout with Dineway wiring (menus, search, page contributions)                |
| `src/pages/`             | Astro pages -- all server-rendered                                                 |

## Skills

Agent skills are in `.agents/skills/`. Load them when working on specific tasks:

- **building-dineway-site** -- Querying content, rendering Portable Text, schema design, seed files, site features (menus, widgets, search, SEO, comments, bylines). Start here.
- **creating-plugins** -- Building Dineway plugins with hooks, storage, admin UI, API routes, and Portable Text block types.
- **dineway-cli** -- CLI commands for content management, seeding, type generation, and visual editing flow.

## Rules

- All content pages must be server-rendered (`output: "server"`). No `getStaticPaths()` for CMS content.
- Image fields are objects (`{ src, alt }`), not strings. Use `<Image image={...} />` from `"dineway/ui"`.
- `entry.id` is the slug (for URLs). `entry.data.id` is the database ULID (for API calls like `getEntryTerms`).
- Always call `Astro.cache.set(cacheHint)` on pages that query content.
- Taxonomy names in queries must match the seed's `"name"` field exactly (e.g., `"category"` not `"categories"`).
