#!/usr/bin/env python3 from __future__ import annotations import argparse from pathlib import Path import re ROOT = Path(__file__).resolve().parents[1] TEMPLATES = { 'list': 'CrudListPage.vue.template', 'form': 'CrudFormPage.vue.template', 'detail': 'CrudDetailPage.vue.template', 'review': 'CrudReviewPage.vue.template', } def pascal(value: str) -> str: parts = re.findall(r'[A-Za-z0-9]+', value) if not parts: raise ValueError('feature must contain letters or digits') return ''.join(x[:1].upper() + x[1:] for x in parts) def main() -> int: parser = argparse.ArgumentParser(description='Scaffold a K-ArtSell standard UI screen without vendor imports.') parser.add_argument('--feature', required=True) parser.add_argument('--kind', choices=sorted(TEMPLATES), required=True) parser.add_argument('--title', required=True) parser.add_argument('--force', action='store_true') args = parser.parse_args() feature = pascal(args.feature) template = (ROOT / 'templates/vue/screens' / TEMPLATES[args.kind]).read_text(encoding='utf-8') output = ROOT / 'frontend/src/features' / re.sub(r'(?