/
Mihaham
/
Table-Time
Обзор
Документация
Войти
/
Mihaham
/
Table-Time
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
scripts/patch_catalog_statuses.py
166 строк
5 KB
MihahamYT
feat: full game catalog — 46 plugins, docs nav, web UI kit
14 июн 2026, 12:43
14 июн 2026, 12:43
2cd5f50
Код
Авторство
О чём код?
#!/usr/bin/env python3 """Patch game status columns in catalog markdown files.""" from __future__ import annotations import re from pathlib import Path ROOT = Path(__file__).resolve().parents[1] V1_PLUGINS = { "dice_board", "shlyapa", "kontakt", "yatzy", "koaliciya", "memo", "perudo", "sto_kletok", } MVP_PLUGINS = { "belosnezhka", "bingo", "bonjour_madame", "chapaev", "chet_nechet", "chto_ranshe", "chto_tut_est", "draw_film", "dva_slova", "four_questions", "holodno_goryacho", "karty", "korol_govno", "kto_bolshe", "kubiki", "kucha_mala", "loto", "na_bukvu", "naidi_chislo", "ne_krestiki", "one_to_twelve", "ot_nachala_do_kontsa", "palma", "parol", "pazly", "poryadok", "shagay_naadan", "siluet", "skachki", "sound_quiz", "spy_i_see", "storytelling", "sunduchki", "tabletime_clock", "tri_v_ryad", "veriu_ne_veriu", "ya_tak_vizhu", "ya_tebya_znayu", } def status_for(plugin_id: str) -> str | None: if plugin_id in V1_PLUGINS: return "✅ v1" if plugin_id in MVP_PLUGINS: return "✅ MVP" return None def patch_table_line(line: str) -> str: m = re.search(r"`([a-z0-9_]+)`", line) if not m: return line pid = m.group(1) new_status = status_for(pid) if not new_status: return line if line.rstrip().endswith(new_status): return line # Replace last table cell (status column) parts = line.rstrip().split("|") if len(parts) < 3: return line parts[-2] = f" {new_status} " return "|".join(parts) + "\n" def patch_file(path: Path) -> None: text = path.read_text(encoding="utf-8") lines = [patch_table_line(ln) for ln in text.splitlines(keepends=True)] path.write_text("".join(lines), encoding="utf-8") def build_implemented_section() -> str: all_plugins = sorted(V1_PLUGINS | MVP_PLUGINS | {"dice_board", "shlyapa", "kontakt"}) rows = [] for pid in sorted(V1_PLUGINS | MVP_PLUGINS): folder = "dice-board" if pid == "dice_board" else pid tier = "✅ v1" if pid in V1_PLUGINS else "✅ MVP" rows.append( f"| `{pid}` | {tier} | [05-games/{folder}/game-spec.md]({folder}/game-spec.md) |" ) return ( "## Реализовано (46 плагинов, Tier 1–3)\n\n" "| `plugin_id` | Уровень | Спека |\n" "|-------------|---------|-------|\n" + "\n".join(rows) + "\n\n" "**PhysicalProxy (Phase 7):** `pugovki`, `magnet_garden`, `na_oshchup`, " "`gora_kamney`, `ya_by_sdul`, `korobochka`, `stakanchiki`, `tbd_finale` — без плагина.\n" ) def patch_master_catalog() -> None: path = ROOT / "docs" / "05-games" / "master-catalog.md" patch_file(path) text = path.read_text(encoding="utf-8") # Update legend text = text.replace( "| ✅ v1 | Реализован плагин в API + веб |\n| 📋 Spec | Спецификация готова, код в roadmap |", "| ✅ v1 | Полный UI + API (референсные панели) |\n" "| ✅ MVP | Плагин API + GenericGamePanel / спека |\n" "| 📋 Spec | Спецификация готова, код в roadmap |", ) # Replace implemented section start = text.index("## Реализовано") end = text.index("## Связанные документы") text = text[:start] + build_implemented_section() + "\n" + text[end:] path.write_text(text, encoding="utf-8") def patch_catalog_roadmap() -> None: path = ROOT / "docs" / "05-games" / "catalog-roadmap.md" patch_file(path) text = path.read_text(encoding="utf-8") text = text.replace( "| ✅ v1 | Реализован плагин |\n| 📋 Spec | Спецификация готова |", "| ✅ v1 | Полный UI + API |\n| ✅ MVP | Плагин API + GenericGamePanel |\n| 📋 Spec | Спецификация готова |", ) old_priority = "## Приоритет Phase 4a\n\n1. `dice_board` ✅\n2. `shlyapa` ✅\n3. `kontakt` ✅\n4. `yatzy` ✅\n5. `koaliciya` ✅\n6. `memo` ✅\n7. `perudo`, `sto_kletok` 📋 Spec" new_priority = ( "## Статус реализации (2026-06-14)\n\n" "- **46 плагинов** зарегистрированы в `registry.py` (Tier 1–3).\n" "- **8 игр** с выделенными web-панелями: `dice_board`, `shlyapa`, `kontakt`, " "`yatzy`, `koaliciya`, `memo`, `perudo`, `sto_kletok`.\n" "- Остальные — **MVP** через `GenericGamePanel` + unit-тесты.\n" "- Полный индекс документации: [index.md](index.md).\n\n" "## Приоритет Phase 4a (завершён)\n\n" "1. `dice_board` ✅ v1\n2. `shlyapa` ✅ v1\n3. `kontakt` ✅ v1\n" "4. `yatzy` ✅ v1\n5. `koaliciya` ✅ v1\n6. `memo` ✅ v1\n" "7. `perudo` ✅ v1\n8. `sto_kletok` ✅ v1" ) text = text.replace(old_priority, new_priority) path.write_text(text, encoding="utf-8") def main() -> None: patch_master_catalog() patch_catalog_roadmap() print("OK: catalog statuses updated") if __name__ == "__main__": main()