mirror of
https://github.com/Matysh/houseplan-card
synced 2026-10-01 12:18:51 +00:00
Validate / hacs (push) Failing after 12s
Validate / hassfest (push) Failing after 13s
Validate / frontend (push) Successful in 3m2s
Validate / golden (push) Failing after 51s
Validate / backend (push) Failing after 6m50s
Validate / smoke (push) Failing after 13m44s
Validate / performance (push) Failing after 24m13s
56 lines
2.9 KiB
Markdown
56 lines
2.9 KiB
Markdown
# ТЗ #38 — Конструктор правил иконок
|
||
|
||
- Issue: https://github.com/Matysh/houseplan-card/issues/38
|
||
- Приоритет: P2
|
||
- Статус ТЗ: draft, data-model proposal требует утверждения
|
||
|
||
## Цель
|
||
|
||
Обычный пользователь создаёт правило без regex, видит порядок и объяснение
|
||
первого совпадения; существующие regex остаются lossless advanced rules.
|
||
|
||
## Модель v2
|
||
|
||
```ts
|
||
type IconRule =
|
||
| { kind: 'simple'; domains?: string[]; device_classes?: string[];
|
||
name_words?: string[]; model_words?: string[]; icon: string }
|
||
| { kind: 'regex'; pattern: string; icon: string };
|
||
```
|
||
|
||
Внутри одного simple rule непустые группы соединяются AND, значения группы —
|
||
OR. `name_words/model_words` — case-insensitive literal tokens, не regex.
|
||
Пустое условие невалидно. Порядок массива — приоритет, первое совпадение
|
||
побеждает. Default built-in rules идут после custom.
|
||
|
||
Legacy `{pattern,icon}` читается как `kind:'regex'` и не переписывается до
|
||
явного Save/Optimize. Backend принимает оба shapes на окно совместимости.
|
||
|
||
## UX
|
||
|
||
- Список sortable keyboard/pointer, номер и summary каждого правила.
|
||
- Simple editor: domain multiselect, device_class multiselect, words chips для
|
||
имени/модели, HA icon picker.
|
||
- «Расширенный режим» показывает regex, live validation и предупреждение, что
|
||
правило проверяется раньше нижележащих.
|
||
- Test device picker использует registry projection и показывает: итоговую
|
||
icon, rule number/kind и human-readable reason по каждому matched field.
|
||
- Draft reorder/edit не влияет на plan до Save; Cancel lossless.
|
||
|
||
## Compiler
|
||
|
||
`compileIconRules()` нормализует оба shapes в predicates и diagnostics.
|
||
Invalid regex отключает только правило с объяснением, но Save блокируется.
|
||
Limits: max rules/words/string length, regex length; no flags кроме `i`.
|
||
Runtime evaluation остаётся bounded; catastrophic regex mitigated длиной и
|
||
опциональным safe-regex check, а не async worker в v1.
|
||
|
||
## Проверки и приёмка
|
||
|
||
- simple AND/OR semantics, case/whitespace, order, fallback;
|
||
- legacy regex byte-preserving roundtrip;
|
||
- invalid/overlong regex and limits backend/frontend parity;
|
||
- test device explanation совпадает с реальным `resolveIcon`;
|
||
- reorder keyboard, unsaved Cancel, narrow dialog;
|
||
- существующий config даёт те же icons до явного редактирования.
|