// tools/plan-skills.test.mjs import { describe, it, expect } from 'vitest'; import { parsePlanSkills, extractPlanGoal } from './plan-skills.mjs'; describe('parsePlanSkills', () => { const md = ['# План', '```skills-json', '["executing-plans","test-driven-development"]', '```', '## Цель', 'x'].join('\n'); it('достаёт список скилов из ```skills-json блока', () => { expect(parsePlanSkills(md)).toEqual(['executing-plans', 'test-driven-development']); }); it('нет блока → пустой массив', () => { expect(parsePlanSkills('# План\nтекст')).toEqual([]); }); it('битый JSON → пустой массив (fail-safe)', () => { expect(parsePlanSkills('```skills-json\n[не json\n```')).toEqual([]); }); it('не-массив / не-строки отфильтрованы', () => { expect(parsePlanSkills('```skills-json\n["ok", 5, null, "two"]\n```')).toEqual(['ok', 'two']); }); }); describe('extractPlanGoal (зеркало extractGoal судьи)', () => { it('секция ## Цель → её текст до след. заголовка', () => { const md = ['# План', '## Цель', 'починить парсер X', '', '## Шаги', 'шаг 1'].join('\n'); expect(extractPlanGoal(md)).toBe('починить парсер X'); }); it('секция ## Goal → её текст', () => { expect(extractPlanGoal('## Goal\nfix the bug\n## Steps')).toBe('fix the bug'); }); it('нет секции цели → первый непустой не-заголовок абзац', () => { expect(extractPlanGoal('# План\n\nделаем фичу\n')).toBe('делаем фичу'); }); it('пусто → пустая строка', () => { expect(extractPlanGoal('')).toBe(''); }); });