@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 +6 -0
- package/package.json +1 -1
- package/src/docs/fix-tests.md +14 -11
- package/src/docs/gen-tests.md +1 -1
- package/src/fix-tests.mjs +8 -2
- package/src/gen-tests.mjs +3 -1
- package/src/lib/docs/index.md +1 -0
- package/src/lib/docs/pi-client.md +1 -1
- package/src/lib/docs/prompt-budget.md +34 -0
- package/src/lib/prompt-budget.mjs +7 -1
package/CHANGELOG.md
CHANGED
package/package.json
CHANGED
package/src/docs/fix-tests.md
CHANGED
|
@@ -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:
|
|
6
|
+
crc: f82de3c4
|
|
7
7
|
model: omlx/gemma-4-e4b-it-OptiQ-4bit
|
|
8
|
-
|
|
9
|
-
|
|
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
|
-
|
|
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
|
|
21
|
-
buildFixTestsPrompt створює
|
|
22
|
-
|
|
21
|
+
getFailingTests запускає vitest у JSON-режимі та повертає список падаючих тест-файлів з повідомленнями про помилки.
|
|
22
|
+
buildFixTestsPrompt створює повний текстовий промпт для LLM, що містить вміст падаючих тест-файлів та їхні помилки.
|
|
23
|
+
buildFixTestsBatch розподіляє падаючі тест-файли на батчі для LLM, враховуючи обмеження промпту.
|
|
24
|
+
fixFailingTests ітерує по падаючих тестах, викликаючи LLM для виправлень та записує виправлений код безпосередньо у файли.
|
|
23
25
|
|
|
24
26
|
## Публічний API
|
|
25
27
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
28
|
+
getFailingTests — Виконує тестування у JSON-форматі та надає список файлів із проваленими тестами разом із повідомленнями про помилки.
|
|
29
|
+
buildFixTestsPrompt — Створює запит для ШІ з вмістом одного файлу із проваленим тестом, щоб ШІ міг відновити його, не звертаючись до файлової системи.
|
|
30
|
+
buildFixTestsBatch — Групує файли для виправлення відповідно до заданого обсягу. Менші файли потрапляють у основну групу, а більші — у резерв на подальший прохід. Файл, який сам по собі перевищує обсяг, завжди отримує окремий запит з обрізанням.
|
|
31
|
+
fixFailingTests — Визначає та виправляє провалених тестів, використовуючи можливості pi SDK для роботи з текстом та прямий запис у файли. Якщо всі тести вже проходять, він повертається одразу з кількістю 0.
|
|
29
32
|
|
|
30
33
|
## Гарантії поведінки
|
|
31
34
|
|
|
32
|
-
-
|
|
35
|
+
- (специфічних машинно-виведених гарантій немає)
|
package/src/docs/gen-tests.md
CHANGED
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(
|
|
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(
|
|
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
|
|
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`)
|
package/src/lib/docs/index.md
CHANGED
|
@@ -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 |
|
|
@@ -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 {
|
|
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
|
/**
|