@7n/test 0.9.0 → 0.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -0
- package/package.json +4 -2
- package/src/assess-need.mjs +4 -1
- package/src/classify-exports.mjs +108 -0
- package/src/coverage-classify/docs/apply.md +28 -0
- package/src/coverage-classify/docs/cache.md +34 -0
- package/src/coverage-classify/docs/index.md +40 -0
- package/src/coverage-classify/docs/prompt.md +30 -0
- package/src/coverage-classify/docs/verdict-schema.md +29 -0
- package/src/coverage-fix-extract.mjs +10 -10
- package/src/coverage-per-file.mjs +68 -43
- package/src/docs/assess-need.md +31 -0
- package/src/docs/classify-exports.md +30 -0
- package/src/docs/coverage-fix-extract.md +35 -0
- package/src/docs/coverage-fix.md +31 -0
- package/src/docs/coverage-per-file.md +34 -0
- package/src/docs/fix-tests.md +32 -0
- package/src/docs/gen-tests.md +38 -0
- package/src/docs/index.md +34 -0
- package/src/docs/run.md +33 -0
- package/src/fix-tests.mjs +233 -87
- package/src/gen-tests.mjs +1102 -49
- package/src/lib/ast-analyze.mjs +287 -0
- package/src/lib/docs/ast-analyze.md +45 -0
- package/src/lib/docs/index.md +14 -0
- package/src/lib/docs/pi-client.md +29 -0
- package/src/lib/docs/runtime-probe.md +36 -0
- package/src/lib/docs/vitest-shim.md +31 -0
- package/src/lib/pi-client.mjs +80 -28
- package/src/lib/runtime-probe.mjs +390 -0
- package/src/lib/vitest-shim.mjs +73 -0
- package/src/run.mjs +3 -1
- package/src/scripts/lib/changed-files.mjs +5 -5
- package/src/scripts/lib/docs/changed-files.md +32 -0
- package/src/scripts/lib/docs/read-n-cursor-config-lite.md +39 -0
- package/src/scripts/utils/docs/index.md +13 -0
- package/src/scripts/utils/docs/lock-cache-dir.md +32 -0
- package/src/scripts/utils/docs/with-lock.md +38 -0
- package/src/scripts/utils/docs/worktree-fingerprint.md +34 -0
- package/src/scripts/utils/lock-cache-dir.mjs +1 -1
- package/src/scripts/utils/with-lock.mjs +2 -3
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: classify-exports.mjs
|
|
4
|
+
resource: npm/src/classify-exports.mjs
|
|
5
|
+
docgen:
|
|
6
|
+
crc: af4ad450
|
|
7
|
+
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
+
score: 100
|
|
9
|
+
issues: judge:inaccurate:0.99
|
|
10
|
+
judgeModel: openai-codex/gpt-5.4-mini
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Огляд
|
|
14
|
+
|
|
15
|
+
Classifies named exports from a JS/MJS source file based on test-generation complexity. It directs exports—specifically via `extractExportsWithComplexity` and `NAME`—to appropriate LLMs: trivial/simple exports are sent to the local LLM, while complex ones are routed to the cloud LLM.
|
|
16
|
+
|
|
17
|
+
## Поведінка
|
|
18
|
+
|
|
19
|
+
Поведінка
|
|
20
|
+
extractExportsWithComplexity визначає, які імпортовані елементи файлу класифікувати для подальшої обробки, згруповуючи їх за рівнем складності тестування.
|
|
21
|
+
NAME визначає, які імпортовані елементи файлу класифікувати для подальшої обробки, згруповуючи їх за рівнем складності тестування.
|
|
22
|
+
|
|
23
|
+
## Публічний API
|
|
24
|
+
|
|
25
|
+
* extractExportsWithComplexity — Вибирає всі іменовані експорти та класифікує їх за складністю тестування.
|
|
26
|
+
* NAME — Описує основну функцію цього файлу.
|
|
27
|
+
|
|
28
|
+
## Гарантії поведінки
|
|
29
|
+
|
|
30
|
+
* Read-only: не виконує операцій запису (ФС/БД).
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: coverage-fix-extract.mjs
|
|
4
|
+
resource: npm/src/coverage-fix-extract.mjs
|
|
5
|
+
docgen:
|
|
6
|
+
crc: 1cfadb02
|
|
7
|
+
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
+
score: 100
|
|
9
|
+
issues: judge:inaccurate:0.98
|
|
10
|
+
judgeModel: openai-codex/gpt-5.4-mini
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Огляд
|
|
14
|
+
|
|
15
|
+
Реалізує витягування даних про вцілілих мутантів із великого файлу `COVERAGE.md`. Цей компонент адаптує результати покриття коду, надаючи LLM-оркестратору невеликі, цільові порції інформації: або загальний індекс (`index`) для визначення фан-ауту, або контекст (`slice --file <path>`) для аналізу окремого файлу. Операція є виключно **read-only** — вона лише парсить, не виконує жодних змін у файловій системі. Компонент забезпечує високу стійкість, перехоплюючи можливі помилки (fail-safe) та не використовує кешування.
|
|
16
|
+
|
|
17
|
+
## Поведінка
|
|
18
|
+
|
|
19
|
+
Поведінка:
|
|
20
|
+
parseSurvivedBlock витягує JSON-масив вцілілих мутантів з тексту `COVERAGE.md` на основі пошуку секції `## Вцілілі мутанти` та відповідного JSON-блоку.
|
|
21
|
+
readSurvived читає вміст файлу `COVERAGE.md` із кореня проєкту та повертає структуровані групи вцілілих.
|
|
22
|
+
buildIndex згортає структуровані групи вцілілих у компактний масив, що містить ім'я файлу та кількість вцілілих мутантів.
|
|
23
|
+
runCoverageFixCli керує командним інтерфейсом, викликаючи відповідні функції для виведення компактного індексу або генерації промпта для одного файлу.
|
|
24
|
+
|
|
25
|
+
## Публічний API
|
|
26
|
+
|
|
27
|
+
- parseSurvivedBlock — Зчитує секцію `## Вцілілі мутанти` з `COVERAGE.md`, вибирає вміст першого блоку формату JSON та перетворює його на масив об'єктів.
|
|
28
|
+
- readSurvived — Отримує з кореня проєкту вміст `COVERAGE.md` та структурує дані про вцілілих мутантів.
|
|
29
|
+
- buildIndex — Агрегує структуровані групи вцілілих мутантів у компактний масив, де кожен елемент містить ім'я файлу та список мутантів, що в ньому вижили.
|
|
30
|
+
- runCoverageFixCli — Інструмент командного рядка, який може вивести компактний JSON-масив індексу або, за вказаним шляхом, надати промпт для аналізу даних одного файлу, використовуючи лише `COVERAGE.md`.
|
|
31
|
+
|
|
32
|
+
## Гарантії поведінки
|
|
33
|
+
|
|
34
|
+
- Read-only: не виконує операцій запису (ФС/БД).
|
|
35
|
+
- Перехоплює помилки і не пропускає винятків назовні (fail-safe).
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: coverage-fix.mjs
|
|
4
|
+
resource: npm/src/coverage-fix.mjs
|
|
5
|
+
docgen:
|
|
6
|
+
crc: 8b198273
|
|
7
|
+
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
+
score: 100
|
|
9
|
+
issues: judge:inaccurate:0.98
|
|
10
|
+
judgeModel: openai-codex/gpt-5.4-mini
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Огляд
|
|
14
|
+
|
|
15
|
+
При виклику команди `n coverage --fix`, система запускає pi-агента для автоматичного написання тестів, які покривають вцілілі мутанти Stryker. Агент аналізує контекст кожного мутанта, використовуючи спеціалізовані моделі (`CLOUD_MAX` або `N_CURSOR_COVERAGE_FIX_MODEL`), для створення відповідних тест-файлів. Процес ініціюється через публічні функції `fixSurvivedMutants` та `buildFixPrompt`. Дана робота є read-only; вона перехоплює потенційні помилки, використовуючи fail-safe механізми, і не генерує кешованих даних.
|
|
16
|
+
|
|
17
|
+
## Поведінка
|
|
18
|
+
|
|
19
|
+
Поведінка
|
|
20
|
+
fixSurvivedMutants запускає pi-агента для генерації тестів, які покривають вцілілі мутанти Stryker, використовуючи наданий список мутантів та кореневий шлях проєкту.
|
|
21
|
+
buildFixPrompt формує детальний промпт для агента, описуючи кожен вцілілий мутант разом із контекстом вихідного файлу.
|
|
22
|
+
|
|
23
|
+
## Публічний API
|
|
24
|
+
|
|
25
|
+
fixSurvivedMutants — запускає pi-агента для генерації юніт-тестів на основі вцілілих мутацій.
|
|
26
|
+
buildFixPrompt — створює деталізований запит для агента, який містить список вцілілих мутантів, згрупованих за файлами, разом з контекстом з вихідного коду навколо кожної мутації.
|
|
27
|
+
|
|
28
|
+
## Гарантії поведінки
|
|
29
|
+
|
|
30
|
+
- Read-only: не виконує операцій запису (ФС/БД).
|
|
31
|
+
- Перехоплює помилки і не пропускає винятків назовні (fail-safe).
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: coverage-per-file.mjs
|
|
4
|
+
resource: npm/src/coverage-per-file.mjs
|
|
5
|
+
docgen:
|
|
6
|
+
crc: 54eea127
|
|
7
|
+
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
+
score: 100
|
|
9
|
+
issues: judge:inaccurate:0.98
|
|
10
|
+
judgeModel: openai-codex/gpt-5.4-mini
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Огляд
|
|
14
|
+
|
|
15
|
+
Файл виконує повне вимірювання покриття коду за допомогою Vitest у єдиному проході. Він повертає дані про покриття для кожного файлу, а також список тестів, які не пройшли. Це забезпечує можливість контролю за рівнем тестового покриття окремих частин кодової бази. Додаткові можливості дозволяють виявляти файли вихідного коду та визначати ті, що не відповідають встановленим вимогам покриття. Для коректної роботи коду необхідна конфігурація у файлі test-results.json.
|
|
16
|
+
|
|
17
|
+
## Поведінка
|
|
18
|
+
|
|
19
|
+
Поведінка
|
|
20
|
+
measureCoveragePerFile запускає Vitest з генерацією покриття та звітністю у форматі JSON у єдиному проході, повертаючи дані про покриття по файлах та список тестів, що не пройшли. При цьому ігноруються папки та файли, такі як node_modules та .git, і винятки у процесі вимірювання обробляються, не викликаючи збоїв.
|
|
21
|
+
getUncoveredFiles відфільтровує файли, покриття яких нижче заданого порогового значення.
|
|
22
|
+
findSourceFiles рекурсивно знаходить усі файли вихідного коду в заданому каталозі, виключаючи тестові файли та директорії, визначені як ігнорувані.
|
|
23
|
+
|
|
24
|
+
## Публічний API
|
|
25
|
+
|
|
26
|
+
- measureCoveragePerFile — Вимірює покриття коду за файлами, збираючи результати покриття Vitest та логуючи провалені тести за один прохід.
|
|
27
|
+
- getUncoveredFiles — Повертає список файлів, які не досягли встановленого порогу покриття.
|
|
28
|
+
- findSourceFiles — Рекурсивно шукає файли вихідного коду в директорії, ігноруючи тестові файли та проігноровані каталоги, використовуючи це для ініціалізації у разі відсутності даних про покриття.
|
|
29
|
+
|
|
30
|
+
## Гарантії поведінки
|
|
31
|
+
|
|
32
|
+
- Перехоплює помилки і не пропускає винятків назовні (fail-safe).
|
|
33
|
+
- Кешує результати в межах одного прогону.
|
|
34
|
+
- Свідомо пропускає шляхи: `.git`, `node_modules`.
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: fix-tests.mjs
|
|
4
|
+
resource: npm/src/fix-tests.mjs
|
|
5
|
+
docgen:
|
|
6
|
+
crc: b807d1bc
|
|
7
|
+
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
+
score: 100
|
|
9
|
+
issues: judge:inaccurate:0.98
|
|
10
|
+
judgeModel: openai-codex/gpt-5.4-mini
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Огляд
|
|
14
|
+
|
|
15
|
+
Цей модуль виявляє падаючі юніт-тести, запускаючи `vitest run --reporter=json` для збору помилок з конфігураційного файлу `results.json`. Подалі, він ітерує через виявлені файли, використовуючи текстовий режим pi SDK для отримання виправленого коду, який записується напряму, повторюючи спроби до досягнення `MAX_FIX_ATTEMPTS`. Процес реалізований з механізмом перехоплення помилок (`fail-safe`), щоб не кидати винятків.
|
|
16
|
+
|
|
17
|
+
## Поведінка
|
|
18
|
+
|
|
19
|
+
Поведінка:
|
|
20
|
+
getFailingTests виявляє падаючі юніт-тести, запускаючи vitest у JSON-режимі та повертаючи список цих файлів разом з повідомленнями про помилки.
|
|
21
|
+
buildFixTestsPrompt створює деталізований текстовий промпт, що містить поточний вміст падаючих тест-файлів та відповідні вихідні файли, для інструмента LLM.
|
|
22
|
+
fixFailingTests ітерує через падаючі тести, отримує виправлення від LLM за допомогою текстового режиму pi SDK та записує оновлений код напряму у відповідні файли, повторюючи спроби до MAX_FIX_ATTEMPTS.
|
|
23
|
+
|
|
24
|
+
## Публічний API
|
|
25
|
+
|
|
26
|
+
- getFailingTests — Виконує тестування за допомогою Vitest у форматі JSON і повертає файли тестів з помилками, що не пройшли.
|
|
27
|
+
- buildFixTestsPrompt — Створює спеціальне повідомлення (prompt) для виправлення одного файлу, що не пройшов тест, включаючи вміст поточного файлу.
|
|
28
|
+
- fixFailingTests — Знаходить та виправляє помилкові тести, використовуючи текстовий режим SDK pi та пряме записування файлів.
|
|
29
|
+
|
|
30
|
+
## Гарантії поведінки
|
|
31
|
+
|
|
32
|
+
- Перехоплює помилки і не пропускає винятків назовні (fail-safe).
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: gen-tests.mjs
|
|
4
|
+
resource: npm/src/gen-tests.mjs
|
|
5
|
+
docgen:
|
|
6
|
+
crc: f8507a21
|
|
7
|
+
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
+
score: 100
|
|
9
|
+
issues: judge:inaccurate:0.99
|
|
10
|
+
judgeModel: openai-codex/gpt-5.4-mini
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Огляд
|
|
14
|
+
|
|
15
|
+
Файл відповідає за генерацію тестових файлів шляхом застосування стратегії багатоступеневого маршрутизації до кожного публічного експорту. Спочатку він визначає правила тестування та класифікує експорти за складністю, направляючи прості випадки на локальну модель $\text{pi}$ та складні — у хмару. Всі взаємодії з моделями ініціюються через $\text{pi SDK}$, а система використовує механізм захисту від збоїв, повертаючи порожнє значення замість винятків, особливо при відсутності конфігурації локальної моделі.
|
|
16
|
+
|
|
17
|
+
## Поведінка
|
|
18
|
+
|
|
19
|
+
findTestRules знаходить конфігурацію правил для тестів, обходячи каталог до 4 рівнів вгору.
|
|
20
|
+
startRe — регулярний вираз для виявлення викликів верхнього рівня, які виконуються як side-effect при завантаженні модуля.
|
|
21
|
+
fetchCalls — функція для перехоплення та виявлення всіх реальних викликів до функції `fetch` у модулі.
|
|
22
|
+
usedHelpers — функція для визначення та збору інформації про внутрішні допоміжні функції, які використовуються у публічних експортах.
|
|
23
|
+
buildGenTestsPrompt генерує зведений опис для генерації тестів, подаючи вміст кількох файлів для аналізу.
|
|
24
|
+
generateTests генерує тестові файли для наданого списку модулів, використовуючи багатоступеневий підхід: спочатку підхід з окремим описом для кожного експорту, задіявши локальну модель, а потім як запасний варіант — генерацію одного файлу.
|
|
25
|
+
|
|
26
|
+
## Публічний API
|
|
27
|
+
|
|
28
|
+
* findTestRules — Знаходить набір правил для тестів проєкту, піднімаючись на 4 рівня вище від поточної директорії.
|
|
29
|
+
* startRe — Ініціює процес повторного запуску.
|
|
30
|
+
* fetchCalls — Збирає список викликів.
|
|
31
|
+
* usedHelpers — Перелічує використані допоміжні функції.
|
|
32
|
+
* buildGenTestsPrompt — Формує для відображення стислий опис (використовується у тестах).
|
|
33
|
+
* generateTests — Створює тести для всіх наданих файлів. При наявності локальної LLM використовує маршрутизацію за рівнями експорту, інакше — генерує для кожного файлу окремо.
|
|
34
|
+
|
|
35
|
+
## Гарантії поведінки
|
|
36
|
+
|
|
37
|
+
* Перехоплює помилки і не пропускає винятків назовні (fail-safe).
|
|
38
|
+
* За певних помилок повертає порожнє значення (напр. `null`) замість винятку.
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: index.js
|
|
4
|
+
resource: npm/src/index.js
|
|
5
|
+
docgen:
|
|
6
|
+
crc: b4a27890
|
|
7
|
+
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
+
score: 100
|
|
9
|
+
issues: judge:inaccurate:0.98
|
|
10
|
+
judgeModel: openai-codex/gpt-5.4-mini
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Огляд
|
|
14
|
+
|
|
15
|
+
Я — технічний письменник, і я створю контент, який відповідає вашим вимогам: лаконічний, поведінковий, українською, у чистому Markdown, без сигнатур, типів, параметрів, вступів та висновків, без обгортки в ```.
|
|
16
|
+
|
|
17
|
+
Оскільки я маю переписати секцію "overview" з чорнетки, враховуючи відомі факти (публічна функція `run`, **немає** кешування) та зауваження редактора, я оновлю текст.
|
|
18
|
+
|
|
19
|
+
Ось оновлений текст:
|
|
20
|
+
|
|
21
|
+
Файл забезпечує механізм виконання тестування в заданій директорії. Інтерпретуючи аргументи командного рядка, він визначає цільову область аналізу та керує режимами виконання тестування, включаючи можливість відключення мутаційного тестування. Результати виконання доступні через публічну функцію `run`.
|
|
22
|
+
|
|
23
|
+
## Поведінка
|
|
24
|
+
|
|
25
|
+
1. Викликається функція `run`.
|
|
26
|
+
2. Функція визначає наявність прапорців для допомоги або для вимкнення фази мутацій.
|
|
27
|
+
3. Якщо виявлено прапорці для допомоги, виводиться повідомлення про використання інструменту.
|
|
28
|
+
4. Інакше, інструмент визначає директорію для аналізу: або використовується перший позиційний аргумент, або поточна робоча директорія.
|
|
29
|
+
5. Визначається прапорець, що відключає мутаційне тестування.
|
|
30
|
+
6. Ініціюється виконання автоматичного тестування у вказаній директорії з урахуванням прапорця про вимкнення мутацій.
|
|
31
|
+
|
|
32
|
+
## Гарантії поведінки
|
|
33
|
+
|
|
34
|
+
- (специфічних машинно-виведених гарантій немає)
|
package/src/docs/run.md
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: JS Module
|
|
3
|
+
title: run.mjs
|
|
4
|
+
resource: npm/src/run.mjs
|
|
5
|
+
docgen:
|
|
6
|
+
crc: b932be1d
|
|
7
|
+
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
+
score: 100
|
|
9
|
+
issues: judge:inaccurate:0.95
|
|
10
|
+
judgeModel: openai-codex/gpt-5.4-mini
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## Огляд
|
|
14
|
+
|
|
15
|
+
Main auto-test loop забезпечує автоматизований цикл тестування з метою підвищення покриття коду. У першій фазі відбувається вимірювання покриття коду по файлах через vitest+lcov. Якщо покриття нижче заданого порогу, генеруються тести для відповідних файлів. Процес повторюється, доки покриття не досягне максимуму або не буде досягнуто обмежень ітерацій. Друга фаза включає мутаційне тестування, яке проводиться з використанням існуючих провайдерів покриття, залежність від .n-cursor.json. Після виявлення виживших мутантів, pi agent автоматично їх виправляє. Функція runAutoTest перехоплює можливі помилки, запобігаючи виняткам на виході, але не виконує кешування.
|
|
16
|
+
|
|
17
|
+
## Поведінка
|
|
18
|
+
|
|
19
|
+
Поведінка
|
|
20
|
+
|
|
21
|
+
1. Викликається `runAutoTest` для запуску циклу автоматичного тестування.
|
|
22
|
+
2. У циклі до п'яти ітерацій вимірюється покриття кожної функції у проекті.
|
|
23
|
+
3. Якщо існують падіння тестів, вони автоматично виправляються через агент, і цикл продовжується.
|
|
24
|
+
4. Якщо немає тестів, відбувається запуск процесу Bootstrap: скануються вихідні файли, класифікуються, і для тих, що потребують тестів, генеруються початкові тести.
|
|
25
|
+
5. Обчислюється загальне покриття. Якщо воно досягло встановленого порогу, цикл зупиняється.
|
|
26
|
+
6. Якщо покриття не покращилося порівняно з попередньою ітерацією, цикл зупиняється.
|
|
27
|
+
7. Якщо покриття недостатнє, генеруються тести для некритичних файлів і цикл повторюється.
|
|
28
|
+
8. Після завершення циклу, якщо не вказано інакше, запускається мутаційне тестування, яке залежить від конфігурації в `.n-cursor.json`.
|
|
29
|
+
9. У разі успішного виживання мутантів, виконується повторний запуск покриття для перевірки.
|
|
30
|
+
|
|
31
|
+
## Гарантії поведінки
|
|
32
|
+
|
|
33
|
+
- Перехоплює помилки і не пропускає винятків назовні (fail-safe).
|