(llm-first): context budget, validation, and eval harness, orchestration general-prompt
This commit is contained in:
@@ -1,65 +1,118 @@
|
||||
# Frontend Rules
|
||||
|
||||
The frontend stays a React Admin SPA generated from `domain/*.dsl` and anchored to the existing auth seams.
|
||||
<!-- prompt-version: 2.0 -->
|
||||
<!-- applies-to: client/src/resources/, client/src/App.tsx -->
|
||||
<!-- validated-by: tools/validate-generation.mjs §validateApiDslCoverage -->
|
||||
|
||||
## Frontend scaffold baseline
|
||||
Use this document during the **Frontend** stage defined in `prompts/general-prompt.md`.
|
||||
|
||||
- Start frontend initialization from the official Vite React TypeScript scaffold, not from manually assembled files.
|
||||
- Preserve a valid Vite workspace baseline, including:
|
||||
## Purpose
|
||||
|
||||
Generate React Admin resources that stay aligned with the DSL contract, the backend contract, and the repository auth/data provider seams.
|
||||
|
||||
## Mandatory Inputs
|
||||
|
||||
- `prompts/general-prompt.md`
|
||||
- the active `api API.<Entity>` block from `domain/toir.api.dsl`
|
||||
- referenced DTOs and enums from `domain/toir.api.dsl`
|
||||
- an intact or repaired official Vite React TypeScript scaffold under `client/`
|
||||
|
||||
## Expected Outputs
|
||||
|
||||
Per entity:
|
||||
|
||||
- `client/src/resources/<kebab>/<Entity>List.tsx`
|
||||
- `client/src/resources/<kebab>/<Entity>Create.tsx`
|
||||
- `client/src/resources/<kebab>/<Entity>Edit.tsx`
|
||||
- `client/src/resources/<kebab>/<Entity>Show.tsx`
|
||||
|
||||
Repository-wide:
|
||||
|
||||
- `client/src/App.tsx` resource registrations
|
||||
|
||||
## Scaffold Baseline
|
||||
|
||||
- Start frontend initialization and repair from the official Vite React TypeScript scaffold, not from a hand-written shell.
|
||||
- Preserve workspace essentials:
|
||||
- `client/index.html`
|
||||
- `client/tsconfig.json`
|
||||
- `client/vite.config.*`
|
||||
- `client/src/main.tsx`
|
||||
- Add React Admin and auth seams on top of that baseline instead of replacing the workspace with a hand-written minimal shell.
|
||||
- Do not delete required Vite entry/config files just because the LLM can write a shorter custom setup.
|
||||
- Repair the scaffold before generating resources if it is degraded.
|
||||
|
||||
## Forbidden frontend generation patterns
|
||||
## Resource Contract
|
||||
|
||||
- Do not bootstrap `client/` by hand-writing a pseudo-Vite project from memory.
|
||||
- Do not remove `index.html`, `tsconfig*`, or `vite.config.*` after generation.
|
||||
- Do not replace standard Vite package scripts with ad hoc commands that break `vite build`, `vite dev`, or `vite preview`.
|
||||
- Do not continue React Admin resource generation on top of a degraded frontend workspace without repairing the workspace first.
|
||||
- Use the shared entity-to-resource naming convention from `prompts/general-prompt.md`.
|
||||
- Every entity becomes a React Admin resource with `list`, `create`, `edit`, and `show`.
|
||||
- `Resource` registration in `client/src/App.tsx` must include `show={...}`.
|
||||
- Every frontend record must work with React Admin's `id` contract, including natural-key entities.
|
||||
|
||||
## Resource generation
|
||||
DTO-driven view rules:
|
||||
|
||||
- Each entity becomes a React Admin resource with list/create/edit/show views.
|
||||
- Resource names must stay aligned with backend path segments.
|
||||
- Foreign keys must use `ReferenceInput` / `ReferenceField`.
|
||||
- Foreign keys shown in list/show views must stay clickable via `ReferenceField link="show"` to open full details of the related resource.
|
||||
- Lists must expose filters through `List` `filters` and an actions toolbar with `FilterButton`.
|
||||
- For enum fields where multi-select is required (for example `status`), use `SelectArrayInput` in list filters.
|
||||
- For foreign key filters and form selection use `ReferenceInput` + `AutocompleteInput` with `filterToQuery={(searchText) => ({ q: searchText })}`.
|
||||
- Form mapping must stay type-safe:
|
||||
- `integer` / `decimal` -> `NumberInput`
|
||||
- `date` -> `DateInput`
|
||||
- List and Show views use fields from `DTO.<Entity>`
|
||||
- Create view uses fields from `DTO.<Entity>Create`
|
||||
- Edit view uses fields from `DTO.<Entity>Update`
|
||||
- Do not derive form fields directly from model attributes when the DTO contract is narrower
|
||||
|
||||
## Provider seams
|
||||
## Input And Field Mapping
|
||||
|
||||
- `client/src/dataProvider.ts` is the single authenticated request seam.
|
||||
- `client/src/auth/authProvider.ts` is the single React Admin auth seam.
|
||||
- Auth logic must not leak into resource components.
|
||||
Form inputs:
|
||||
|
||||
## Identity and permissions
|
||||
- `integer`, `number`, `decimal` -> `NumberInput`
|
||||
- `date` -> `DateInput`
|
||||
- required `boolean` -> `BooleanInput`
|
||||
- nullable `boolean` -> `NullableBooleanInput`
|
||||
- enum -> `SelectInput`
|
||||
- FK reference -> `ReferenceInput` + `AutocompleteInput`
|
||||
|
||||
- `getIdentity()` must resolve from parsed token claims.
|
||||
- `getPermissions()` may expose realm roles for UI awareness.
|
||||
- Backend enforcement remains authoritative.
|
||||
Display fields:
|
||||
|
||||
## React Admin compatibility
|
||||
- `integer`, `number`, `decimal` -> `NumberField`
|
||||
- `date` -> `DateField`
|
||||
- `boolean` -> `BooleanField`
|
||||
- enum -> `SelectField`
|
||||
- FK reference -> `ReferenceField`
|
||||
|
||||
- Every resource record must include `id`.
|
||||
- Natural-key resources must preserve route, update, and sort compatibility with React Admin contracts.
|
||||
- Frontend requests must continue to work when the real primary key is not named `id`.
|
||||
- `dataProvider` query serialization must preserve repeated query params for array filters (for example enum multi-select).
|
||||
- `Resource` wiring in `App.tsx` must keep `show={...}` registration for all generated resources.
|
||||
Hard failure rule:
|
||||
|
||||
## Reproducibility invariants
|
||||
- using plain `TextInput` for `integer`, `number`, `decimal`, `date`, or `boolean` is a generation failure
|
||||
|
||||
- A freshly generated frontend must remain compatible with standard Vite commands such as `npm run dev` and `npm run build`.
|
||||
- Missing Vite workspace files or missing local Vite executable wiring is a generation failure, not an acceptable simplification.
|
||||
- The generated frontend should fail only on missing installation/env/runtime backend availability, not because the Vite app structure itself is incomplete.
|
||||
## Filter And Reference Contract
|
||||
|
||||
## Recovery rule if frontend workspace degraded
|
||||
- Lists must expose filters and include a toolbar with `FilterButton`.
|
||||
- Enum multi-select filters use `SelectArrayInput`.
|
||||
- Reference filters and form selectors use `ReferenceInput` + `AutocompleteInput` with `filterToQuery={(searchText) => ({ q: searchText })}`.
|
||||
- FK list/show rendering must use `ReferenceField link=\"show\"`.
|
||||
- `dataProvider` query serialization must preserve repeated params for array filters.
|
||||
|
||||
- If required Vite scaffold files are missing or broken, restore the official workspace baseline before editing resources, auth seams, or UI code.
|
||||
- Treat workspace repair as higher priority than feature generation, because generated React Admin code on top of a broken Vite workspace is invalid baseline output.
|
||||
Reference display expression priority:
|
||||
|
||||
1. if `inventoryNumber` exists: ``(record) => `${record.inventoryNumber} — ${record.name ?? record.inventoryNumber}``
|
||||
2. else if `code` exists: ``(record) => `${record.code} — ${record.name ?? record.code}``
|
||||
3. else if `number` exists: ``(record) => `${record.number} — ${record.name ?? record.number}``
|
||||
4. else if `name` exists: `(record) => record.name ?? record.id`
|
||||
5. else: `(record) => record.id`
|
||||
|
||||
## Auth And Provider Seams
|
||||
|
||||
- `client/src/dataProvider.ts` remains the single authenticated request seam.
|
||||
- `client/src/auth/authProvider.ts` remains the single React Admin auth seam.
|
||||
- Resource components must not embed auth logic.
|
||||
- `getIdentity()` resolves from token claims.
|
||||
- `getPermissions()` may expose realm roles for UI awareness, but backend enforcement stays authoritative.
|
||||
|
||||
## Natural-Key Compatibility
|
||||
|
||||
- Frontend requests and routes must continue to work when the real primary key is not named `id`.
|
||||
- Edit/show/delete flows must preserve compatibility with backend natural-key handling.
|
||||
- Sorting and filtering assumptions must not regress to a fake physical `id`.
|
||||
|
||||
## Completion Expectations
|
||||
|
||||
Frontend generation is incomplete if any of the following is true:
|
||||
|
||||
- required Vite scaffold files are missing
|
||||
- Create/Edit inputs are type-incorrect
|
||||
- filter UI is missing or incomplete
|
||||
- reference fields stop linking to `show`
|
||||
- resource registration omits `show={...}`
|
||||
|
||||
Reference in New Issue
Block a user