From e2e194efb5e07b5f21c030928b5026606a83edd6 Mon Sep 17 00:00:00 2001 From: Ku6epXBOCTuK Date: Sat, 18 Jul 2026 07:02:42 +0500 Subject: [PATCH] docs: add audit plan --- docs/AUDIT-PLAN.md | 98 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 docs/AUDIT-PLAN.md diff --git a/docs/AUDIT-PLAN.md b/docs/AUDIT-PLAN.md new file mode 100644 index 0000000..7c9312e --- /dev/null +++ b/docs/AUDIT-PLAN.md @@ -0,0 +1,98 @@ +# Аудит и план доработок + +## 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 через файл