"""根据模板创建任务归档草稿。""" from __future__ import annotations import argparse import re from datetime import date from pathlib import Path ROOT = Path(__file__).resolve().parents[1] TEMPLATE = ROOT / "docs" / "templates" / "task-archive.md" TASK_DIR = ROOT / "docs" / "task" def safe_title(title: str) -> str: """把标题转换为适合文件名的短文本。""" cleaned = re.sub(r'[<>:"/\\|?*]', "-", title.strip()) cleaned = re.sub(r"\s+", "-", cleaned) return cleaned.strip(".-") def create_archive(issue_number: str, title: str) -> Path: """创建归档草稿;目标文件存在时拒绝覆盖。""" short_title = safe_title(title) if not issue_number.isdigit(): raise ValueError("工单号必须是数字") if not short_title: raise ValueError("标题不能为空") target = TASK_DIR / f"{issue_number}-{short_title}.md" if target.exists(): raise FileExistsError(f"文件已存在:{target}") content = TEMPLATE.read_text(encoding="utf-8") content = content.replace("<工单号>", issue_number, 1) content = content.replace("<标题>", title.strip(), 1) content = content.replace("YYYY-MM-DD", date.today().isoformat(), 1) target.write_text(content, encoding="utf-8") return target def main() -> None: parser = argparse.ArgumentParser(description="创建 docs/task 任务归档草稿") parser.add_argument("issue_number", help="Gitea 工单号,例如 123") parser.add_argument("title", help="简短任务标题") args = parser.parse_args() target = create_archive(args.issue_number, args.title) print(f"已创建:{target.relative_to(ROOT)}") if __name__ == "__main__": main()