diff --git a/src/cli.ts b/src/cli.ts index 88c6652..d9223cf 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -69,17 +69,40 @@ cli.command("discuss", "讨论阶段").action(async () => { console.log(prompt); }); -cli.command("plan ", "规划阶段").action( - async (changeName: string) => { +cli.command("plan ", "规划阶段").action( + async (changeName: string, documentName: string) => { const root = requireProjectRoot(); - await mkdir(getChangeDir(root, changeName), { recursive: true }); const config = await loadConfig(root); - const plan = config.stages.plan; - if (!plan) throw new Error("plan 阶段未配置"); - for (const doc of plan.documents) { - const prompt = await assemblePlanPrompt(config, root, changeName, doc.name); - console.log(prompt); + const planDocs = config.stages.plan?.documents; + if (!planDocs || !planDocs.find((d) => d.name === documentName)) { + throw new CommandError( + `文档 "${documentName}" 不在配置的 plan.documents 中`, + { + hint: `可用文档:${planDocs?.map((d) => d.name).join(", ") ?? "无"}`, + }, + ); } + + const changeDir = getChangeDir(root, changeName); + await mkdir(changeDir, { recursive: true }); + + const doc = planDocs.find((d) => d.name === documentName)!; + if (doc.depend && doc.depend.length > 0) { + const missing = doc.depend.filter( + (dep) => !existsSync(join(changeDir, `${dep}.md`)), + ); + if (missing.length > 0) { + throw new CommandError( + `文档 "${documentName}" 的前置依赖未满足:${missing.map((d) => `${d}.md`).join("、")} 尚未完成`, + { + hint: `请先完成依赖文档:rune plan ${changeName} ${missing[0]}`, + }, + ); + } + } + + const prompt = await assemblePlanPrompt(config, root, changeName, documentName); + console.log(prompt); }, );