From 5799ab69785c7a93e30374aa2f019d136ecbb195 Mon Sep 17 00:00:00 2001 From: lanyuanxiaoyao Date: Tue, 9 Jun 2026 10:54:03 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20plan=20=E5=91=BD=E4=BB=A4=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=20document-name=20=E5=8F=82=E6=95=B0=EF=BC=8C?= =?UTF-8?q?=E6=A0=A1=E9=AA=8C=E4=BE=9D=E8=B5=96=E6=98=AF=E5=90=A6=E6=BB=A1?= =?UTF-8?q?=E8=B6=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cli.ts | 39 +++++++++++++++++++++++++++++++-------- 1 file changed, 31 insertions(+), 8 deletions(-) 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); }, );