11# WinClean - Инструкции для Claude
22
3- > Последнее обновление: 2026-01-17
4- > Текущая версия скрипта: 2.12
3+ > Последнее обновление: 2026-01-18
4+ > Текущая версия скрипта: 2.13
55
66---
77
1111
1212| Параметр | Значение |
1313| ----------| ----------|
14- | ** Версия** | 2.12 |
14+ | ** Версия** | 2.13 |
1515| ** Язык** | PowerShell 7.1+ |
1616| ** Платформа** | Windows 11 (23H2/24H2/25H2) |
1717| ** Лицензия** | MIT |
2222### Статус публикации
2323
2424- ** GitHub** : ✅ Опубликован, активно развивается
25- - ** PSGallery** : ✅ Опубликован (v2.12, 17 .01.2026)
26- - ** CI/CD** : ✅ GitHub Actions с PSScriptAnalyzer
25+ - ** PSGallery** : ✅ Опубликован (v2.13, 18 .01.2026)
26+ - ** CI/CD** : ✅ GitHub Actions ( PSScriptAnalyzer + Pester)
2727
2828---
2929
@@ -41,11 +41,14 @@ CleanScript/
4141├── CLAUDE.md # Этот файл — инструкции для Claude
4242├── assets/
4343│ └── logo.svg # Логотип проекта
44+ ├── tests/ # Pester тесты (v2.13+)
45+ │ ├── Helpers.Tests.ps1 # Unit-тесты helper-функций (52 теста)
46+ │ └── Fixes.Tests.ps1 # Валидационные тесты исправлений (42 теста)
4447├── docs/ # Черновики документации (НЕ в git!)
4548│ ├── habr-article.md # Статья для Хабра
4649│ └── habr-article-info.md # Документация по статье
4750└── .github/
48- ├── workflows/ci.yml # GitHub Actions CI
51+ ├── workflows/ci.yml # GitHub Actions CI (lint + syntax + Pester)
4952 ├── PULL_REQUEST_TEMPLATE.md
5053 └── ISSUE_TEMPLATE/ # Шаблоны issues (bug, feature, question)
5154```
@@ -73,7 +76,7 @@ WinClean.ps1 — монолитный скрипт (~2700 строк) с мод
7376### Ключевые переменные
7477
7578``` powershell
76- $script:Version = "2.10 " # Единый источник версии
79+ $script:Version = "2.13 " # Единый источник версии
7780$script:Stats = [hashtable]::Synchronized(@{...}) # Thread-safe статистика
7881$script:LogPath = "..." # Путь к лог-файлу
7982$script:ProtectedPaths = @(...) # Защищённые пути (никогда не удаляются)
@@ -153,24 +156,51 @@ Publish-PSResource -Path .\WinClean.ps1 -Repository PSGallery -ApiKey $env:PSGAL
153156
154157Файл: ` .github/workflows/ci.yml `
155158
156- ** Проверки:**
157- - PSScriptAnalyzer (Warning, Error)
158- - Синтаксис PowerShell
159+ ** Проверки (3 job'а):**
160+ 1 . ** lint** — PSScriptAnalyzer (Warning, Error)
161+ 2 . ** syntax** — Проверка синтаксиса PowerShell
162+ 3 . ** test** — Pester тесты (94 теста, запускается после lint и syntax)
159163
160164** Исключения PSScriptAnalyzer** (допустимые для CLI):
161165- PSAvoidUsingWriteHost — это интерактивная утилита
162166- PSAvoidUsingEmptyCatchBlock — намеренное подавление ошибок
163167- PSUseShouldProcessForStateChangingFunctions — не применимо
164168
169+ ### Pester тесты (v2.13+)
170+
171+ ** Структура тестов:**
172+ - ` tests/Helpers.Tests.ps1 ` — 52 unit-теста helper-функций
173+ - ` tests/Fixes.Tests.ps1 ` — 42 валидационных теста исправлений
174+
175+ ** Тестируемые функции:**
176+ - Format-FileSize, ConvertFrom-HumanReadableSize
177+ - Get-FolderSize, Test-PathProtected
178+ - Test-InteractiveConsole, Test-PendingReboot
179+ - Write-Log, Get-RecycleBinSize
180+
181+ ** Особенности реализации:**
182+ - Функции определены напрямую в ` BeforeAll ` (AST-парсинг не работает в контексте Pester)
183+ - Используются regex-паттерны для locale-независимых сравнений (` "^1[,.]00 KB$" ` )
184+ - Параметризованные тесты преобразованы в отдельные ` It ` блоки
185+
186+ ** Запуск локально:**
187+ ``` powershell
188+ Install-Module Pester -Force -Scope CurrentUser -MinimumVersion 5.0
189+ Invoke-Pester ./tests -Output Detailed
190+ ```
191+
165192---
166193
167194## 7. Текущие задачи и планы
168195
169196### Выполнено (январь 2026)
170197
171- - [x] Публикация в PSGallery (v2.9, затем v2.10 )
198+ - [x] Публикация в PSGallery (v2.9 → v2.13 )
172199- [x] CI/CD с PSScriptAnalyzer
173200- [x] Функция авто-проверки обновлений (v2.10)
201+ - [x] Таймауты для winget/DISM (v2.11)
202+ - [x] PS 7.4+ совместимость, улучшенная статистика (v2.12)
203+ - [x] ** Pester тесты — 94 теста** (v2.13)
174204- [x] Документация EN/RU синхронизирована
175205- [x] Issue templates (bug, feature, question)
176206- [x] Черновик статьи для Хабра
@@ -179,6 +209,7 @@ Publish-PSResource -Path .\WinClean.ps1 -Repository PSGallery -ApiKey $env:PSGAL
179209
180210- [ ] Публикация статьи на Хабре (песочница)
181211- [ ] Скриншоты для статьи
212+ - [ ] Интеграционное тестирование в Hyper-V VM
182213
183214### Планы на будущее
184215
@@ -275,6 +306,12 @@ Publish-PSResource -Path .\WinClean.ps1 -Repository PSGallery -ApiKey $env:PSGAL
275306
276307| Проблема | Решение | Версия |
277308| ----------| ---------| --------|
309+ | Docker regex не парсит новый формат | Обновлён regex для обоих форматов | 2.13 |
310+ | Browser cache отрицательные значения | ` [math]::Max(0, ...) ` | 2.13 |
311+ | Temp paths дублируются | GetFullPath + Group-Object | 2.13 |
312+ | Get-FolderSize медленный | Добавлен флаг ` -File ` | 2.13 |
313+ | PS 7.4 удалил ` -UseBasicParsing ` | Удалён deprecated параметр | 2.12 |
314+ | winget статистика при ошибках | Проверка exit code | 2.12 |
278315| PSWindowsUpdate зависает при установке | TLS 1.2 + таймауты | 2.9 |
279316| Disk Cleanup зависает | Уменьшен таймаут до 7 мин | 2.8 |
280317| TotalFreedBytes всегда 0 | Заменён Interlocked на += | 2.3 |
@@ -284,32 +321,38 @@ Publish-PSResource -Path .\WinClean.ps1 -Repository PSGallery -ApiKey $env:PSGAL
284321
285322## 12. Тестирование
286323
287- ### Быстрая проверка
324+ ### Автоматические тесты (безопасно на рабочей машине)
288325
289326``` powershell
290- # Режим предпросмотра (без изменений)
291- .\WinClean.ps1 -ReportOnly
292- ```
293-
294- ### PSScriptAnalyzer
327+ # Pester тесты (94 теста, без изменений системы)
328+ Invoke-Pester ./tests -Output Detailed
295329
296- ``` powershell
330+ # PSScriptAnalyzer
297331Invoke-ScriptAnalyzer -Path .\WinClean.ps1 -Severity Warning,Error
298- ```
299-
300- ### Синтаксис
301332
302- ``` powershell
333+ # Проверка синтаксиса
303334$null = [scriptblock]::Create((Get-Content .\WinClean.ps1 -Raw))
304335```
305336
306- ### Полный запуск
337+ ### Ручное тестирование
307338
308339``` powershell
309- # Требует Admin, создаёт Restore Point
340+ # Режим предпросмотра (без изменений)
341+ .\WinClean.ps1 -ReportOnly
342+
343+ # Полный запуск (требует Admin, создаёт Restore Point)
310344.\WinClean.ps1
311345```
312346
347+ ### Тестирование в изоляции
348+
349+ Для полного интеграционного тестирования рекомендуется Hyper-V VM:
350+ 1 . Создать VM с Windows 11 Pro
351+ 2 . Создать snapshot "Clean-Install"
352+ 3 . Создать "грязную" систему (кэши, корзина, temp файлы)
353+ 4 . Создать snapshot "Dirty-System"
354+ 5 . Запустить полный прогон и проверить результаты
355+
313356---
314357
315358## 13. Контакты и ресурсы
@@ -329,6 +372,7 @@ $null = [scriptblock]::Create((Get-Content .\WinClean.ps1 -Raw))
3293723 . ** Обновлять CHANGELOG** — каждое изменение должно быть задокументировано
3303734 . ** Версия в нескольких местах** — см. раздел "Версионирование"
3313745 . ** docs/ не в git** — черновики и рабочие материалы
375+ 6 . ** Запускать Pester тесты** после изменений helper-функций
332376
333377### Что помнить о проекте
334378
@@ -337,4 +381,12 @@ $null = [scriptblock]::Create((Get-Content .\WinClean.ps1 -Raw))
337381- Поддерживает -ReportOnly для безопасного предпросмотра
338382- Лог сохраняется в ` %TEMP%\WinClean_*.log `
339383- Опубликован в PSGallery — нужен API ключ для публикации
384+ - ** 94 Pester теста** в CI/CD — регрессии отслеживаются автоматически
340385- Статья для Хабра готова, ждёт скриншоты
386+
387+ ### Особенности Pester тестов
388+
389+ - Функции ** определены напрямую в BeforeAll** — AST-парсинг не работает в Pester
390+ - Используются ** regex для locale-независимости** (` "^1[,.]00 KB$" ` вместо точного сравнения)
391+ - ` -ForEach ` параметризация преобразована в ** отдельные It блоки** для надёжности
392+ - Тесты ** не модифицируют систему** — безопасны для запуска на рабочей машине
0 commit comments