diff --git a/.claude/skills/regression/run.mjs b/.claude/skills/regression/run.mjs index b81b1c01..60162479 100644 --- a/.claude/skills/regression/run.mjs +++ b/.claude/skills/regression/run.mjs @@ -26,6 +26,18 @@ export function parseExit(label, code) { // ── pure: test-count parsers ─────────────────────────────────────── export function parsePest(stdout) { + // pest --parallel emits a single JSON line: {"tool":"pest","result":...,"tests":N,"passed":N,"skipped":N,...} + const jsonMatch = stdout.match(/\{"tool"\s*:\s*"pest"[^}]+\}/); + if (jsonMatch) { + try { + const j = JSON.parse(jsonMatch[0]); + const passed = Number(j.passed ?? 0); + const skipped = Number(j.skipped ?? 0); + const total = Number(j.tests ?? passed + skipped); + const failed = total - passed - skipped; + return `Pest ${total}/${passed}/${skipped}sk/${Math.max(0, failed)}`; + } catch { /* fall through to regex */ } + } const passed = Number(stdout.match(/(\d+)\s+passed/)?.[1] ?? 0); const skipped = Number(stdout.match(/(\d+)\s+skipped/)?.[1] ?? 0); const failed = Number(stdout.match(/(\d+)\s+failed/)?.[1] ?? 0); diff --git a/.claude/skills/regression/run.test.mjs b/.claude/skills/regression/run.test.mjs index d382483e..9633cc77 100644 --- a/.claude/skills/regression/run.test.mjs +++ b/.claude/skills/regression/run.test.mjs @@ -44,6 +44,18 @@ test('parsePest: with failures', () => { test('parsePest: passed only → zeros for skipped/failed', () => { assert.equal(parsePest(' Tests: 19 passed (44 assertions)'), 'Pest 19/19/0sk/0'); }); +test('parsePest: JSON format (pest --parallel) passed + skipped', () => { + const out = '{"tool":"pest","result":"passed","tests":793,"passed":790,"assertions":2391,"duration_ms":32200,"skipped":3}'; + assert.equal(parsePest(out), 'Pest 793/790/3sk/0'); +}); +test('parsePest: JSON format with failures', () => { + const out = '{"tool":"pest","result":"failed","tests":793,"passed":788,"assertions":2380,"duration_ms":31000,"skipped":3}'; + assert.equal(parsePest(out), 'Pest 793/788/3sk/2'); +}); +test('parsePest: JSON format no skipped', () => { + const out = '{"tool":"pest","result":"passed","tests":19,"passed":19,"assertions":44,"duration_ms":1711}'; + assert.equal(parsePest(out), 'Pest 19/19/0sk/0'); +}); test('parseVitest: files + passed + skipped', () => { const out = ' Test Files 92 passed (92)\n Tests 774 passed | 3 skipped (777)\n Duration 12.6s';