/
PavelNikolaeW
/
worms-wars
Обзор
Документация
Войти
/
PavelNikolaeW
/
worms-wars
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
scripts/parse-phases.py
82 строки
2 KB
Павел Николаев
EPIC-02 phase-1: safety commit
31 янв 2026, 16:14
31 янв 2026, 16:14
132b965
Код
Авторство
О чём код?
#!/usr/bin/env python3 """ parse-phases.py — парсит plan.md и извлекает фазы. Использование: python3 scripts/parse-phases.py <path-to-plan.md> Вывод: JSON-массив в stdout: [ {"number": 1, "name": "...", "stories": ["US-001"], "raw_markdown": "..."}, ... ] """ import json import re import sys def parse_phases(plan_path: str) -> list[dict]: with open(plan_path) as f: content = f.read() # Pattern: ### Фаза N: <name> (US-XXX, US-YYY) # Also handles the variant without parenthesized stories phase_pattern = re.compile( r'^###\s+Фаза\s+(\d+)\s*:\s*(.+?)(?:\s*\(([^)]+)\))?\s*$', re.MULTILINE, ) matches = list(phase_pattern.finditer(content)) if not matches: print("Ошибка: фазы не найдены в plan.md", file=sys.stderr) sys.exit(1) phases = [] for i, match in enumerate(matches): number = int(match.group(1)) name = match.group(2).strip() # Extract stories from parentheses stories_str = match.group(3) or "" stories = [] if stories_str: stories = [s.strip() for s in stories_str.split(",") if s.strip()] # Extract raw markdown: from this header to the next phase header (or end) start = match.start() if i + 1 < len(matches): end = matches[i + 1].start() else: # Until the next ## header or end of file next_h2 = re.search(r'^## ', content[match.end():], re.MULTILINE) if next_h2: end = match.end() + next_h2.start() else: end = len(content) raw_markdown = content[start:end].rstrip() phases.append({ "number": number, "name": name, "stories": stories, "raw_markdown": raw_markdown, }) return phases def main(): if len(sys.argv) != 2: print(f"Использование: {sys.argv[0]} <plan.md>", file=sys.stderr) sys.exit(1) plan_path = sys.argv[1] phases = parse_phases(plan_path) print(json.dumps(phases, ensure_ascii=False, indent=2)) if __name__ == "__main__": main()