# Аудит и план доработок ## 1. Невыполненный пункт todo.md - [ ] **Боковая панель** — при изменении настроек должна обновляться (или кнопка refresh) - `todo.md:58-60` --- ## 2. Рефакторинг: слияние frontmatterBlock.ts → frontmatterFields.ts ### Зачем `frontmatterBlock.ts` (148 строк) — единственный крупный модуль без единого теста. Его логика (поиск строк/позиций в frontmatter) тесно связана с `frontmatterFields.ts`. Ни один другой потребитель не требует отдельного файла. ### План 1. Перенести весь код `frontmatterBlock.ts` в `frontmatterFields.ts` 2. Убрать `export * from "./frontmatterBlock"` и соответствующий import 3. Обновить импорты в `validateFrontmatter.ts` и `parseTaskTags.ts` 4. Удалить `frontmatterBlock.ts` 5. Написать unit-тесты на перенесённые функции: - `extractFrontmatterBlock` — валидный/без закрытия/без frontmatter/пустой/CRLF - `findFieldLineRange` — поле найдено/не найдено/с отступами --- ## 3. Тесты на edge cases ### 🔴 Приоритет: высокий | Модуль | Недостающие кейсы | | ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | | `dashboard/sortTasks` | пустой массив, одинаковые `created`, невалидные даты | | `kanban/buildKanbanBoard` | одинаковые `updated` (стабильность sort) | | `storage/FsTaskRepository` | ошибки fs при readdir/readFile/writeFile/deleteFile, кириллица в заголовке, title ровно 80 символов, теги с кавычками/спецсимволами | | `dashboard/applyRawTaskContent` | raw с другим порядком полей, raw без тела (description) | | `dashboard/buildDashboardView` | пустой массив задач (`tasks: []`) | | `dashboard/groupTasks` | неизвестный статус/приоритет в данных | ### 🟡 Приоритет: средний | Модуль | Недостающие кейсы | | ----------------------- | --------------------------------------------------------------------------------------- | | — | Интеграционный тест: create → serialize → write → read → parse (полный цикл через файл) | | `dashboard/filterTasks` | пустой массив, все фильтры пустые | | `FsTaskRepository` | конфликт ID при merge задач из project + global | --- ## 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 | --- ## Порядок работ (рекомендуемый) 1. **Рефакторинг** — слияние `frontmatterBlock.ts` → `frontmatterFields.ts` + тесты 2. **Edge case тесты** — FsTaskRepository, sortTasks, buildKanbanBoard, applyRawTaskContent 3. **Хрупкие тесты** — snapshot → `toEqual`, `_unsafeUnwrap` → безопасный паттерн 4. **config.ts + taskFile.ts** — unit-тесты 5. **todo.md** — refresh боковой панели 6. **Интеграционный тест** — полный round-trip через файл