Files

128 lines
4.3 KiB
Python

#!/usr/bin/env python3
import argparse
from pathlib import Path
from datetime import datetime
DOC_MAP = {
"prd": "prd.md",
"frd": "frd.md",
"dar": "dar.md",
}
def now_ts():
return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
def read_template(doc_type: str) -> str:
ref_name = DOC_MAP[doc_type]
ref_path = Path(__file__).resolve().parent.parent / "references" / ref_name
if ref_path.exists():
return ref_path.read_text(encoding="utf-8")
return f"# {doc_type.upper()}\n\n> 模板缺失,请手动补充。\n"
def write_file(path: Path, content: str, force: bool = False) -> bool:
if path.exists() and not force:
return False
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text(content, encoding="utf-8")
return True
def main():
parser = argparse.ArgumentParser(description="Initialize pmassist session workspace")
parser.add_argument("--path", required=True, help="Work directory path")
parser.add_argument("--doc", required=True, choices=["prd", "frd", "dar"], help="Document type")
parser.add_argument("--alias", default="", help="Project alias (short name)")
parser.add_argument("--title", default="", help="Document title")
parser.add_argument("--desc", default="", help="Raw requirement description")
parser.add_argument("--force", action="store_true", help="Overwrite existing files")
parser.add_argument("--enable-prototype", action="store_true", help="Enable prototype design phase")
args = parser.parse_args()
workdir = Path(args.path).resolve()
workdir.mkdir(parents=True, exist_ok=True)
# Directories
base_dirs = ["materials", "rounds", "questions", "outputs"]
proto_dirs = [
"materials/prototypes",
"materials/prototypes/reference",
"materials/prototypes/analysis",
"prototypes",
"prototypes/screenshots",
"prototypes/webapp"
]
dirs_to_create = base_dirs + (proto_dirs if args.enable_prototype else [])
for d in dirs_to_create:
(workdir / d).mkdir(parents=True, exist_ok=True)
ts = now_ts()
alias = args.alias or ""
title = args.title or ""
raw_desc = args.desc or ""
desc_md = f"""# 需求描述\n\n## 元信息\n- 创建时间: {ts}\n- 最后更新: {ts}\n- 文档类型: {args.doc.upper()}\n- 项目简称: {alias}\n- 标题: {title}\n\n## 原始输入\n{raw_desc if raw_desc else '[待补充原始需求]'}\n\n## WWH 分析\n### What - 做什么\n[待补充]\n\n### Why - 为什么\n[待补充]\n\n### How - 怎么做\n[待补充]\n"""
# Build prototype section if enabled
proto_section = ""
if args.enable_prototype:
proto_section = """
prototype:
enabled: true
status: "proto_pending"
proto_round: 0
tech_stack: []
outputs: []
unresolved_proto_questions: []
"""
session_yaml = f"""project_alias: "{alias}"
doc_type: "{args.doc}"
title: "{title}"
created_at: "{ts}"
updated_at: "{ts}"
round: 0
status: "init"
unresolved_questions: []
last_output: ""
materials: []{proto_section}
"""
summary_md = f"""# 会话摘要\n\n- {ts} 初始化会话\n"""
decision_log_md = """# 决策记录\n\n| 时间 | 事项 | 决策 | 依据 |\n|---|---|---|---|\n"""
materials_index_md = """# 资料索引\n\n| ID | 标题 | 类型 | 来源/路径 | 摘要 | 日期 |\n|---|---|---|---|---|---|\n"""
output_template = read_template(args.doc)
wrote = []
if write_file(workdir / "desc.md", desc_md, args.force):
wrote.append("desc.md")
if write_file(workdir / "session.yaml", session_yaml, args.force):
wrote.append("session.yaml")
if write_file(workdir / "summary.md", summary_md, args.force):
wrote.append("summary.md")
if write_file(workdir / "decision_log.md", decision_log_md, args.force):
wrote.append("decision_log.md")
if write_file(workdir / "materials_index.md", materials_index_md, args.force):
wrote.append("materials_index.md")
output_name = DOC_MAP[args.doc]
if write_file(workdir / "outputs" / output_name, output_template, args.force):
wrote.append(f"outputs/{output_name}")
if wrote:
print("[OK] Created/updated:")
for f in wrote:
print(" -", f)
else:
print("[SKIP] No files changed. Use --force to overwrite.")
if __name__ == "__main__":
main()