- Plugin contract gains get_config_schema(); the plugins list API returns it.
Employees plugin declares its directory-DB fields (host/name/user + password).
- employee_connection reads host/name/user settings-first (env fallback); the
password stays env-only.
- Setup wizard Features step renders each enabled plugin's config: non-secret
fields save to settings; secrets are never stored - the wizard emits .env
lines to paste. Fixed the plugins-list data path (data.plugins).
- Settings PUT now upserts (creates the row on first write) so plugin-config
keys can be saved without pre-seeding.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- GET /settings now masks password/token values (were returned in plaintext
to anonymous callers); sending the mask back on update is a no-op so the
real secret is never clobbered.
- Move the employee-directory DB credentials out of source into env-backed
config (shopdb.utils.employee_db); employees + notification recognition use
the shared helper. Employee lookups stop leaking exception strings.
- Fix low-supplies report using loc.location instead of loc.locationname.
Employee/notification read endpoints stay unauthenticated by design (public
shopfloor kiosk displays consume them).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>