# Аудит и план доработок ## 1. Невыполненный пункт todo.md - [ ] **Боковая панель** — при изменении настроек должна обновляться (или кнопка refresh) - `todo.md:58-60` --- ## 2. Рефакторинг: слияние frontmatterBlock.ts → frontmatterFields.ts > ✅ **Выполнено** - `frontmatterBlock.ts` удалён, логика перенесена в `frontmatterFields.ts` - Обновлены импорты в `validateFrontmatter.ts` и `parseTaskTags.ts` - Написаны 7 unit-тестов на `extractFrontmatterBlock` --- ## 3. Тесты на edge cases > ✅ **Выполнено** — добавлено 14 тестов во все перечисленные модули. Список покрытых кейсов: | Модуль | Что добавили | | ------------------------------- | --------------------------------------------------------------------- | | `dashboard/sortTasks` | пустой массив, одинаковые created, invalid даты | | `kanban/buildKanbanBoard` | одинаковые updated (стабильность) | | `storage/FsTaskRepository` | кириллица, title 80 символов, спецсимволы в тегах, slug для Fix___bug | | `dashboard/applyRawTaskContent` | разный порядок полей, пустое body | | `dashboard/buildDashboardView` | пустой массив | | `dashboard/groupTasks` | неизвестный статус/приоритет | | `dashboard/filterTasks` | пустой массив | ### 🟡 Ещё можно добавить | Модуль | Кейс | | ------------------ | -------------------------------------------------------------- | | — | Интеграционный тест: create → serialize → write → read → parse | | `FsTaskRepository` | конфликт ID при merge задач из project + global | ### ❓ Дизайн-вопрос: неизвестные статусы/приоритеты `groupTasks` молча дропает задачи, у которых `status` или `priority` не входит в известный список (`TASK_STATUS_ORDER` / `TASK_PRIORITY_ORDER`). Такая задача будет в `visibleTasks`, но не попадёт ни в одну группу → фактически невидима в grouped-view. **Возможное решение:** добавить `TaskStatus.UNKNOWN` / `TaskPriority.UNKNOWN` и маппить любые невалидные значения на них при парсинге в `parseTaskFile` (`utils/markdown.ts`). Тогда groupTasks всегда найдёт такую задачу в группе "Unknown". Решение требует изменений: - `model/taskStatus.ts` — `TaskStatus.UNKNOWN`, `TASK_STATUS_ORDER`, `TASK_STATUS_META` - `model/taskPriority.ts` — `TaskPriority.UNKNOWN`, `TASK_PRIORITY_ORDER`, `TASK_PRIORITY_META` - `utils/markdown.ts` — маппинг в `parseTaskFile` - `validateFrontmatter.ts` — возможно, смягчить валидацию для unknown --- ## 4. Хрупкие тесты ### Snapshot-тесты - `model/taskStatus.test.ts` — `toMatchSnapshot()` на `TaskStatus` - `model/taskPriority.test.ts` — `toMatchSnapshot()` на `TaskPriority` Ломаются от любого изменения порядка ключей. → Заменить на `toEqual()` с явными ожиданиями. ### `_unsafeUnwrap()` вместо проверок isErr/isOk 7 мест, где используется `_unsafeUnwrap()` — при падении теста вместо понятной assertion ошибки будет `RuntimeError: called _unsafeUnwrap on an Err`: - `src/commands/addProjectTag.test.ts:27,28,50,63,66` - `src/projectConfig/parseProjectConfig.test.ts:14,15,24` - `src/projectConfig/serializeProjectConfig.test.ts:11,17` → Заменить на `isErr()`/`isOk()` + `if (result.isErr()) return` паттерн. --- ## 5. Untested-модули (кроме UI/vscode-адаптеров) **`src/config.ts`** (60 строк) После слияния `frontmatterBlock.ts` — самый крупный untested модуль. Стоит покрыть: `getConfigSection`, `getSettingDefault`, ошибки при missing keys. **`src/model/taskFile.ts`** (46 строк) `isTaskFileName` + константы — можно быстрый unit-тест. --- ## Текущий статус - [x] **Рефакторинг** — `frontmatterBlock.ts` → `frontmatterFields.ts` + тесты - [x] **Edge case тесты** — 14 тестов добавлены, все зелёные - [ ] **Дизайн-вопрос** — решить судьбу неизвестных статусов/приоритетов - [ ] **Хрупкие тесты** — snapshot → `toEqual`, `_unsafeUnwrap` → безопасный паттерн - [ ] **config.ts + taskFile.ts** — unit-тесты - [ ] **todo.md** — refresh боковой панели - [ ] **Интеграционный тест** — полный round-trip через файл