Files
lonc/AGENTS.md
T
bblaz 6f617fe449
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
Add Vitest coverage reporting to Woodpecker CI
2026-04-10 15:00:13 +02:00

227 lines
6.3 KiB
Markdown

# Lonc Agent Guidelines
This document is the working guide for future coding agents on the Lonc frontend.
## Project purpose
Lonc is a lightweight PWA frontend for household kitchen stock and labeling workflows.
The frontend:
- talks to a separate Tryton backend
- uses Tryton user application keys for auth
- is optimized for phone and desktop use
- prefers practical, high-frequency operational UX over generic CRUD
## Core stack
- Vite
- Alpine.js
- Bootstrap 5
- plain `fetch()` API modules
- static PWA assets in `public/`
## General operating procedure
When changing this project, follow this order:
1. Find the existing feature module instead of adding parallel logic.
2. Prefer updating shared API helpers before patching individual pages.
3. Preserve the existing UX language and interaction patterns.
4. Verify with `npm run build`.
For larger behavior changes:
1. Check the relevant API module in `src/api/`
2. Check the page module in `src/features/`
3. Check supporting shared state in `src/app/`
4. Check matching CSS in `src/styles/app.css`
## Key architecture rules
### API usage
- All HTTP requests should go through `src/api/client.js`
- Do not build ad hoc URLs in feature components
- Use `getPath()` and shared API modules in `src/api/`
- Prefer same-origin requests when `baseUrl` is empty
- Keep custom headers minimal
### Auth model
Lonc does not use Tryton JSON-RPC session login.
It uses Tryton user application keys for the `kitchen` application:
1. `POST /{database}/user/application/`
2. store returned key locally
3. user validates key in Tryton preferences
4. frontend verifies with authenticated kitchen request
Relevant session states:
- `not_connected`
- `pending_validation`
- `connected`
- `invalid_key`
If authenticated requests start failing after a key had previously worked, the app should move toward invalid-key handling instead of repeatedly hitting the backend.
### Service worker
- In development, service workers should not stay registered
- In production, avoid sticky caching for JS/CSS
- Be careful when debugging frontend/API mismatches because stale cached bundles have already caused confusion in this project
## Current backend conventions
These are current project assumptions and should not be casually changed.
### Main endpoints
- `/{database}/user/application/`
- `/{database}/kitchen/kitchens`
- `/{database}/kitchen/items`
- `/{database}/kitchen/items/grouped`
- `/{database}/kitchen/items/{uuid_b64}`
- `/{database}/kitchen/items/{uuid_b64}/stock`
- `/{database}/kitchen/locations`
### Labels
- Preview uses label-preview flags
- Create uses label-generation flags
- Actual create currently also needs `print=1`
### Item-definition search for label creation
The label form does not search `items` directly anymore.
It now searches grouped items:
- `GET /{database}/kitchen/items/grouped?search_name=...&expanded=0`
Reason:
- grouped result is a better template for “new item from existing definition”
- not expanding children keeps the query lighter
### Grouped stock view
Grouped stock view uses:
- `GET /{database}/kitchen/items/grouped?expanded=1`
Important:
- group-level fields are meaningful and should be used
- group expiration status should follow the backend-provided “first item expires” semantics
- do not assume grouped child records are always returned unless `expanded=1`
## UX rules that should be preserved
### Label creation
- Required fields must be clearly marked with a red asterisk
- Required-field validation should happen before both preview and create
- `Quantity` is always visible
- `Quantity` is required only for `measured`
- `Production date` is required
- changing production date should keep expiration calculations in sync
- item-definition selection should act like copying defaults for a new item, not cloning old dates blindly
- location picker and expiration day picker were tuned for Safari/iPhone behavior, so be cautious when changing event handling
### Stock review
This is an operational page, not a generic data table.
Priorities:
- expiration visibility
- stock state clarity
- location clarity
- quick actions
- phone usability
Do not degrade it into a dense admin CRUD screen.
### Filters and overviews
Stock page filtering is intentionally overview-driven:
- main text search
- `Expiration overview`
- `Location overview`
The overviews:
- are collapsible
- are collapsed by default
- act as filter controls
- should remain visually understandable on both small and large screens
### Normal and grouped stock views
These two views should feel related.
- same filter concepts
- similar visual language
- direct “view item” access should exist in both
- grouped view should stay compact by default
## Known project-specific decisions
- `Quantity` prefill on label creation comes from `quantity_initial`, not `quantity`
- grouped label search should use grouped entities as source defaults
- grouped expiration logic should rely on backend-provided group semantics
- location filtering includes descendants when parent is selected
- removing a parent location from filters removes its selected children too
- grouped child item cards use softer expiration colors than the parent group card
## File map
### App shell and state
- `src/app/bootstrap.js`
- `src/app/router.js`
- `src/app/store.js`
- `src/app/config.js`
### API layer
- `src/api/client.js`
- `src/api/auth.js`
- `src/api/stock.js`
- `src/api/locations.js`
- `src/api/labels.js`
### Main feature pages
- `src/features/auth/login-page.js`
- `src/features/auth/settings-page.js`
- `src/features/labels/label-create-page.js`
- `src/features/stock/stock-list-page.js`
- `src/features/stock/stock-detail-page.js`
### Styling
- `src/styles/app.css`
## Editing guidance for future agents
- Keep behavior centralized where possible
- Reuse existing helpers instead of inventing near-duplicates
- Be careful when modifying auth invalidation, service worker behavior, or custom pickers
- If changing endpoint behavior, update both API modules and README/AGENTS notes when appropriate
- When changing interactive UI, test the desktop and small-screen behavior mentally at minimum
## Verification expectation
After meaningful frontend changes, run:
```bash
npm run build
```
If behavior depends on caching, auth, or service workers, mention that explicitly in the handoff.