From 526a001d067538d4c06d52a3c5f004baf8029dba Mon Sep 17 00:00:00 2001 From: Ku6epXBOCTuK Date: Sat, 18 Jul 2026 07:18:11 +0500 Subject: [PATCH] docs: update audit plan --- docs/AUDIT-PLAN.md | 101 +++++++++++++++++++++++++-------------------- 1 file changed, 57 insertions(+), 44 deletions(-) diff --git a/docs/AUDIT-PLAN.md b/docs/AUDIT-PLAN.md index 7c9312e..8af084c 100644 --- a/docs/AUDIT-PLAN.md +++ b/docs/AUDIT-PLAN.md @@ -10,45 +10,57 @@ ## 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` — поле найдено/не найдено/с отступами +- `frontmatterBlock.ts` удалён, логика перенесена в `frontmatterFields.ts` +- Обновлены импорты в `validateFrontmatter.ts` и `parseTaskTags.ts` +- Написаны 7 unit-тестов на `extractFrontmatterBlock` --- ## 3. Тесты на edge cases -### 🔴 Приоритет: высокий +> ✅ **Выполнено** — добавлено 14 тестов во все перечисленные модули. -| Модуль | Недостающие кейсы | -| ------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- | -| `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` | неизвестный статус/приоритет в данных | +Список покрытых кейсов: -### 🟡 Приоритет: средний +| Модуль | Что добавили | +| ------------------------------- | --------------------------------------------------------------------- | +| `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 (полный цикл через файл) | -| `dashboard/filterTasks` | пустой массив, все фильтры пустые | -| `FsTaskRepository` | конфликт ID при merge задач из project + global | +### 🟡 Ещё можно добавить + +| Модуль | Кейс | +| ------------------ | -------------------------------------------------------------- | +| — | Интеграционный тест: 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 --- @@ -78,21 +90,22 @@ assertion ошибки будет `RuntimeError: called _unsafeUnwrap on an Err` ## 5. Untested-модули (кроме UI/vscode-адаптеров) -| Модуль | Строк | Действие | -| ----------------------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `src/config.ts` | 60 | После слияния `frontmatterBlock.ts` останется самым крупным untested модулем. Стоит покрыть: `getConfigSection`, `getSettingDefault`, ошибки при missing keys | -| `src/model/taskFile.ts` | 46 | `isTaskFileName` + константы — можно быстрый unit | +**`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 через файл +- [x] **Рефакторинг** — `frontmatterBlock.ts` → `frontmatterFields.ts` + тесты +- [x] **Edge case тесты** — 14 тестов добавлены, все зелёные +- [ ] **Дизайн-вопрос** — решить судьбу неизвестных статусов/приоритетов +- [ ] **Хрупкие тесты** — snapshot → `toEqual`, `_unsafeUnwrap` → безопасный + паттерн +- [ ] **config.ts + taskFile.ts** — unit-тесты +- [ ] **todo.md** — refresh боковой панели +- [ ] **Интеграционный тест** — полный round-trip через файл