docs: update audit plan

This commit is contained in:
2026-07-18 07:18:11 +05:00
parent f57b181e99
commit 526a001d06
+55 -42
View File
@@ -10,46 +10,58 @@
## 2. Рефакторинг: слияние frontmatterBlock.ts → frontmatterFields.ts ## 2. Рефакторинг: слияние frontmatterBlock.ts → frontmatterFields.ts
### Зачем > ✅ **Выполнено**
`frontmatterBlock.ts` (148 строк) — единственный крупный модуль без единого - `frontmatterBlock.ts` удалён, логика перенесена в `frontmatterFields.ts`
теста. Его логика (поиск строк/позиций в frontmatter) тесно связана с - Обновлены импорты в `validateFrontmatter.ts` и `parseTaskTags.ts`
`frontmatterFields.ts`. Ни один другой потребитель не требует отдельного файла. - Написаны 7 unit-тестов на `extractFrontmatterBlock`
### План
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 ## 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` | пустой массив, все фильтры пустые | | ------------------ | -------------------------------------------------------------- |
| — | Интеграционный тест: create → serialize → write → read → parse |
| `FsTaskRepository` | конфликт ID при merge задач из project + global | | `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. Хрупкие тесты ## 4. Хрупкие тесты
@@ -78,21 +90,22 @@ assertion ошибки будет `RuntimeError: called _unsafeUnwrap on an Err`
## 5. Untested-модули (кроме UI/vscode-адаптеров) ## 5. Untested-модули (кроме UI/vscode-адаптеров)
| Модуль | Строк | Действие | **`src/config.ts`** (60 строк) После слияния `frontmatterBlock.ts` — самый
| ----------------------- | ----- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | крупный untested модуль.
| `src/config.ts` | 60 | После слияния `frontmatterBlock.ts` останется самым крупным untested модулем. Стоит покрыть: `getConfigSection`, `getSettingDefault`, ошибки при missing keys | Стоит покрыть: `getConfigSection`, `getSettingDefault`, ошибки при missing keys.
| `src/model/taskFile.ts` | 46 | `isTaskFileName` + константы — можно быстрый unit |
**`src/model/taskFile.ts`** (46 строк) `isTaskFileName` + константы — можно
быстрый unit-тест.
--- ---
## Порядок работ (рекомендуемый) ## Текущий статус
1. **Рефакторинг** слияние `frontmatterBlock.ts``frontmatterFields.ts` + - [x] **Рефакторинг**`frontmatterBlock.ts``frontmatterFields.ts` + тесты
тесты - [x] **Edge case тесты** — 14 тестов добавлены, все зелёные
2. **Edge case тесты** — FsTaskRepository, sortTasks, buildKanbanBoard, - [ ] **Дизайн-вопрос** — решить судьбу неизвестных статусов/приоритетов
applyRawTaskContent - [ ] **Хрупкие тесты** — snapshot → `toEqual`, `_unsafeUnwrap` → безопасный
3. **Хрупкие тесты** — snapshot → `toEqual`, `_unsafeUnwrap` → безопасный
паттерн паттерн
4. **config.ts + taskFile.ts** — unit-тесты - [ ] **config.ts + taskFile.ts** — unit-тесты
5. **todo.md** — refresh боковой панели - [ ] **todo.md** — refresh боковой панели
6. **Интеграционный тест** — полный round-trip через файл - [ ] **Интеграционный тест** — полный round-trip через файл