@7n/test 0.12.0 → 0.12.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 CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.12.1] - 2026-07-04
4
+
5
+ ### Changed
6
+
7
+ - test(core): моки node:fs під vitest-shim і актуалізація shouldDedup-очікування
8
+
3
9
  ## [0.12.0] - 2026-07-04
4
10
 
5
11
  ### Added
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@7n/test",
3
- "version": "0.12.0",
3
+ "version": "0.12.1",
4
4
  "description": "CLI-утиліта @7n/test",
5
5
  "keywords": [
6
6
  "7n",
@@ -3,30 +3,33 @@ type: JS Module
3
3
  title: fix-tests.mjs
4
4
  resource: npm/src/fix-tests.mjs
5
5
  docgen:
6
- crc: f198a4b3
6
+ crc: f82de3c4
7
7
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
- score: 100
9
- issues: judge:inaccurate:0.98
8
+ tier: local-min-retry
9
+ score: 90
10
+ issues: internal-name:callText,judge:inaccurate:0.99
10
11
  judgeModel: openai-codex/gpt-5.4-mini
11
12
  ---
12
13
 
13
14
  ## Огляд
14
15
 
15
- Цей модуль виявляє падаючі юніт-тести, запускаючи `vitest run --reporter=json` для збору помилок з конфігураційного файлу `results.json`. Подалі, він ітерує через виявлені файли, використовуючи текстовий режим pi SDK для отримання виправленого коду, який записується напряму, повторюючи спроби до досягнення `MAX_FIX_ATTEMPTS`. Процес реалізований з механізмом перехоплення помилок (`fail-safe`), щоб не кидати винятків.
16
+ Виявляє падаючі unit-тести та автоматично їх виправляє з використанням pi SDK (text mode). Процес починається з запуску `vitest run --reporter=json` за допомогою `getFailingTests`, що створює перелік файлів з помилками. Потім функція `fixFailingTests` для кожного файлу читає його вміст та вміст відповідного source-файлу. Використовуючи `callText`, інструмент отримує виправлений код, який потім записується напряму через `writeFileSync` у тест-файл, що усуває проблеми точного матчу рядків, характерні для Edit-інструментів. Всі операції спираються на конфігурацію, описану в `results.json`.
16
17
 
17
18
  ## Поведінка
18
19
 
19
20
  Поведінка:
20
- getFailingTests виявляє падаючі юніт-тести, запускаючи vitest у JSON-режимі та повертаючи список цих файлів разом з повідомленнями про помилки.
21
- buildFixTestsPrompt створює деталізований текстовий промпт, що містить поточний вміст падаючих тест-файлів та відповідні вихідні файли, для інструмента LLM.
22
- fixFailingTests ітерує через падаючі тести, отримує виправлення від LLM за допомогою текстового режиму pi SDK та записує оновлений код напряму у відповідні файли, повторюючи спроби до MAX_FIX_ATTEMPTS.
21
+ getFailingTests запускає vitest у JSON-режимі та повертає список падаючих тест-файлів з повідомленнями про помилки.
22
+ buildFixTestsPrompt створює повний текстовий промпт для LLM, що містить вміст падаючих тест-файлів та їхні помилки.
23
+ buildFixTestsBatch розподіляє падаючі тест-файли на батчі для LLM, враховуючи обмеження промпту.
24
+ fixFailingTests ітерує по падаючих тестах, викликаючи LLM для виправлень та записує виправлений код безпосередньо у файли.
23
25
 
24
26
  ## Публічний API
25
27
 
26
- - getFailingTests — Виконує тестування за допомогою Vitest у форматі JSON і повертає файли тестів з помилками, що не пройшли.
27
- - buildFixTestsPrompt — Створює спеціальне повідомлення (prompt) для виправлення одного файлу, що не пройшов тест, включаючи вміст поточного файлу.
28
- - fixFailingTestsЗнаходить та виправляє помилкові тести, використовуючи текстовий режим SDK pi та пряме записування файлів.
28
+ getFailingTests — Виконує тестування у JSON-форматі та надає список файлів із проваленими тестами разом із повідомленнями про помилки.
29
+ buildFixTestsPrompt — Створює запит для ШІ з вмістом одного файлу із проваленим тестом, щоб ШІ міг відновити його, не звертаючись до файлової системи.
30
+ buildFixTestsBatch Групує файли для виправлення відповідно до заданого обсягу. Менші файли потрапляють у основну групу, а більші у резерв на подальший прохід. Файл, який сам по собі перевищує обсяг, завжди отримує окремий запит з обрізанням.
31
+ fixFailingTests — Визначає та виправляє провалених тестів, використовуючи можливості pi SDK для роботи з текстом та прямий запис у файли. Якщо всі тести вже проходять, він повертається одразу з кількістю 0.
29
32
 
30
33
  ## Гарантії поведінки
31
34
 
32
- - Перехоплює помилки і не пропускає винятків назовні (fail-safe).
35
+ - (специфічних машинно-виведених гарантій немає)
@@ -3,7 +3,7 @@ type: JS Module
3
3
  title: gen-tests.mjs
4
4
  resource: npm/src/gen-tests.mjs
5
5
  docgen:
6
- crc: 531f870e
6
+ crc: 0d24dc95
7
7
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
8
  score: 100
9
9
  issues: judge:inaccurate:0.99
package/src/fix-tests.mjs CHANGED
@@ -352,7 +352,9 @@ export async function fixFailingTests(dir, opts = {}) {
352
352
 
353
353
  const batch = buildFixTestsBatch(eligible, dir)
354
354
  if (batch.deferred.length) {
355
- console.log(` 📦 батч: ${batch.included.length} файлів, відкладено на наступний прохід: ${batch.deferred.length}`)
355
+ console.log(
356
+ ` 📦 батч: ${batch.included.length} файлів, відкладено на наступний прохід: ${batch.deferred.length}`
357
+ )
356
358
  }
357
359
  for (const file of batch.included) attempts.set(file, (attempts.get(file) ?? 0) + 1)
358
360
  prevDeferred = new Set(batch.deferred)
@@ -376,7 +378,11 @@ export async function fixFailingTests(dir, opts = {}) {
376
378
  }
377
379
 
378
380
  const includedSet = new Set(batch.included)
379
- writeFixedFiles(fixed, eligible.filter(f => includedSet.has(f.file)), dir)
381
+ writeFixedFiles(
382
+ fixed,
383
+ eligible.filter(f => includedSet.has(f.file)),
384
+ dir
385
+ )
380
386
 
381
387
  remaining = await getFailingTests(dir)
382
388
  }
package/src/gen-tests.mjs CHANGED
@@ -1182,7 +1182,9 @@ export async function generateTests(files, dir, opts = {}) {
1182
1182
 
1183
1183
  const callTextFn = opts.callText ?? callText
1184
1184
  const localModel = resolveLocalModel(opts)
1185
- const localFn = localModel ? (prompt, opts = {}) => callTextFn(prompt, { ...opts, model: localModel, cwd: dir }) : null
1185
+ const localFn = localModel
1186
+ ? (prompt, opts = {}) => callTextFn(prompt, { ...opts, model: localModel, cwd: dir })
1187
+ : null
1186
1188
 
1187
1189
  const mode = localFn ? `per-export (local:${localModel} + cloud)` : 'single-file (cloud)'
1188
1190
  console.log(`\n🤖 Генерую тести для ${files.length} файлів [${mode}]...\n`)
@@ -10,5 +10,6 @@ resource: npm/src/lib/
10
10
  | ------------------------------------- | --------- |
11
11
  | [ast-analyze.mjs](ast-analyze.md) | JS Module |
12
12
  | [pi-client.mjs](pi-client.md) | JS Module |
13
+ | [prompt-budget.mjs](prompt-budget.md) | JS Module |
13
14
  | [runtime-probe.mjs](runtime-probe.md) | JS Module |
14
15
  | [vitest-shim.mjs](vitest-shim.md) | JS Module |
@@ -3,7 +3,7 @@ type: JS Module
3
3
  title: pi-client.mjs
4
4
  resource: npm/src/lib/pi-client.mjs
5
5
  docgen:
6
- crc: 0aa22b9a
6
+ crc: e7f3471e
7
7
  model: omlx/gemma-4-e4b-it-OptiQ-4bit
8
8
  score: 100
9
9
  issues: judge:inaccurate:0.98
@@ -0,0 +1,34 @@
1
+ ---
2
+ type: JS Module
3
+ title: prompt-budget.mjs
4
+ resource: npm/src/lib/prompt-budget.mjs
5
+ docgen:
6
+ crc: 010265bd
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
+ Слугує єдиною точкою правди для визначення ліміту символів промпту та стелі відповіді (`maxTokens`) залежно від типу задачі (наприклад, `gen-tests`, `fix-tests`). Це механізм захисту від надмірного розширення промпту. Надає функції для внутрішнього обрізання тексту (`fitToBudget`), що виключає низькопріоритетні частини промпту, щоб він вмістився у встановлений ліміт, а також для ефективного групування цілих одиниць вмісту (`packBatch`) для подальшої пакетної обробки.
16
+
17
+ ## Поведінка
18
+
19
+ Поведінка
20
+ budgetFor повертає встановлений ліміт символів для промпту та максимальну кількість токенів для заданого типу LLM-задачі.
21
+ capText обрізає вхідний текст до заданого максимального розміру, зберігаючи його структуру з головною та хвостовою частинами, розділеними маркером.
22
+ fitToBudget збирає частини промпту, обрізаючи або відкидаючи нижчопріоритетні частини доти, доки сумарний обсяг не вкладеться у заданий ліміт символів, при цьому найвищий пріоритет завжди захищено.
23
+ packBatch групує одиниці (файли) у батчи, сортуючи їх за розміром, щоб вмістити якомога більше у межах заданого бюджету; одиниці, що не вмістилися, відкладаються для наступного проходу.
24
+
25
+ ## Публічний API
26
+
27
+ budgetFor — надає бюджет, необхідний для певної категорії завдання.
28
+ capText — безпечно укорочує текст, зберігаючи його початок, маркер та кінець.
29
+ fitToBudget — розміщує блоки у межах заданого бюджету: спочатку зменшує вміст, а потім відкидає найнижчі за пріоритетом, поки обсяг не втиснеться. Найважливіший елемент завжди залишається повним.
30
+ packBatch — згруповує файли для обробки: спочатку обирає найменші для оптимізації кількості виправлень за один раз. Якщо елемент занадто великий, він відкладається для окремої обробки, де застосовується жорсткіше обрізання.
31
+
32
+ ## Гарантії поведінки
33
+
34
+ - Read-only: не виконує операцій запису (ФС/БД).
@@ -96,7 +96,13 @@ export function fitToBudget(chunks, maxChars) {
96
96
  dropped.push(`${part.label} (видалено)`)
97
97
  }
98
98
 
99
- return { text: parts.filter(p => p.kept).map(p => p.out).join('\n'), dropped }
99
+ return {
100
+ text: parts
101
+ .filter(p => p.kept)
102
+ .map(p => p.out)
103
+ .join('\n'),
104
+ dropped
105
+ }
100
106
  }
101
107
 
102
108
  /**