docs: add audit plan

This commit is contained in:
2026-07-18 07:02:42 +05:00
parent 9b1281ce49
commit e2e194efb5
+98
View File
@@ -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 через файл