From cb34b5a3f34545f5536fc0fa2899a99756b55598 Mon Sep 17 00:00:00 2001 From: lanyuanxiaoyao Date: Thu, 11 Jun 2026 15:06:24 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E4=BC=98=E5=8C=96=20suggestNextStep=20?= =?UTF-8?q?=E4=BE=9D=E8=B5=96=E6=8F=90=E7=A4=BA=EF=BC=8C=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=20finish=20=E5=BD=92=E6=A1=A3=E7=9B=AE=E5=BD=95=E7=BC=BA?= =?UTF-8?q?=E5=A4=B1=E9=97=AE=E9=A2=98=EF=BC=8C=E7=A7=BB=E9=99=A4=20es-too?= =?UTF-8?q?lkit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bun.lock | 3 --- package.json | 1 - src/cli.ts | 38 ++++++++++++++++++++++++++------------ 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/bun.lock b/bun.lock index 2eff4f5..8569307 100644 --- a/bun.lock +++ b/bun.lock @@ -6,7 +6,6 @@ "name": "rune", "dependencies": { "cac": "^7.0.0", - "es-toolkit": "^1.47.0", "yaml": "^2.7.0", }, "devDependencies": { @@ -120,8 +119,6 @@ "environment": ["environment@1.1.0", "", {}, "sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q=="], - "es-toolkit": ["es-toolkit@1.47.0", "", {}, "sha512-n1GuoD0WEQZMBk5tttoZSqwgyLx01oqa5XsBmCHwPyNe1S9jPBEmtR2pSgp2kJuWE3ciFZ6yRHmY4pM4C3OOkw=="], - "eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="], "get-east-asian-width": ["get-east-asian-width@1.6.0", "", {}, "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA=="], diff --git a/package.json b/package.json index 0b551e5..b9e30ad 100644 --- a/package.json +++ b/package.json @@ -21,7 +21,6 @@ }, "dependencies": { "cac": "^7.0.0", - "es-toolkit": "^1.47.0", "yaml": "^2.7.0" }, "devDependencies": { diff --git a/src/cli.ts b/src/cli.ts index c436018..401214a 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -76,11 +76,26 @@ export function formatChangeStatus(change: ChangeStatus, config?: RuneConfig): s export function suggestNextStep(change: ChangeStatus, config?: RuneConfig): string { const prefix = getPmPrefix(config); + const planDocs = config?.stages.plan?.documents; if (!change.planCompleted) { const nextDoc = change.documents.find((d) => !d.completed && d.dependMet); if (nextDoc) { return `${prefix} plan ${change.name} ${nextDoc.name}`; } + const firstMissingDep = change.documents + .filter((d) => !d.completed && !d.dependMet) + .map((d) => { + const docConfig = planDocs?.find((c) => c.name === d.name); + const missing = + docConfig?.depend?.filter( + (dep) => !change.documents.find((cd) => cd.name === dep)?.completed, + ) ?? []; + return { name: d.name, missing }; + }) + .find((d) => d.missing.length > 0); + if (firstMissingDep) { + return `${prefix} plan ${change.name} ${firstMissingDep.missing[0]}(${firstMissingDep.name} 的前置依赖)`; + } return `完成前置依赖后再规划文档`; } @@ -261,14 +276,13 @@ cli cli.command("task ", "任务拆解阶段").action(async (changeName: string) => { validateChangeName(changeName); const root = requireProjectRoot(); + const config = await loadConfig(root); const changeDir = getChangeDir(root, changeName); if (!existsSync(changeDir)) { - const prefix = getPmPrefix(); throw new CommandError(`变更"${changeName}"不存在`, { - hint: `请先运行 ${prefix} create ${changeName} 创建变更`, + hint: `请先运行 ${getPmPrefix(config)} create ${changeName} 创建变更`, }); } - const config = await loadConfig(root); const prompt = await assembleTaskPrompt(config, root, changeName); console.log(prompt); }); @@ -276,14 +290,13 @@ cli.command("task ", "任务拆解阶段").action(async (changeName cli.command("build ", "构建阶段").action(async (changeName: string) => { validateChangeName(changeName); const root = requireProjectRoot(); + const config = await loadConfig(root); const changeDir = getChangeDir(root, changeName); if (!existsSync(changeDir)) { - const prefix = getPmPrefix(); throw new CommandError(`变更"${changeName}"不存在`, { - hint: `请先运行 ${prefix} create ${changeName} 创建变更`, + hint: `请先运行 ${getPmPrefix(config)} create ${changeName} 创建变更`, }); } - const config = await loadConfig(root); const prompt = await assembleBuildPrompt(config, root, changeName); console.log(prompt); }); @@ -291,14 +304,13 @@ cli.command("build ", "构建阶段").action(async (changeName: str cli.command("archive ", "归档阶段").action(async (changeName: string) => { validateChangeName(changeName); const root = requireProjectRoot(); + const config = await loadConfig(root); const changeDir = getChangeDir(root, changeName); if (!existsSync(changeDir)) { - const prefix = getPmPrefix(); throw new CommandError(`变更"${changeName}"不存在`, { - hint: `请先运行 ${prefix} create ${changeName} 创建变更`, + hint: `请先运行 ${getPmPrefix(config)} create ${changeName} 创建变更`, }); } - const config = await loadConfig(root); const prompt = await assembleArchivePrompt(config, root, changeName); console.log(prompt); }); @@ -306,15 +318,17 @@ cli.command("archive ", "归档阶段").action(async (changeName: s cli.command("finish ", "归档变更").action(async (changeName: string) => { validateChangeName(changeName); const root = requireProjectRoot(); + const config = await loadConfig(root); const changeDir = getChangeDir(root, changeName); if (!existsSync(changeDir)) { - const prefix = getPmPrefix(); throw new CommandError(`变更"${changeName}"不存在`, { - hint: `请先运行 ${prefix} create ${changeName} 创建变更`, + hint: `请先运行 ${getPmPrefix(config)} create ${changeName} 创建变更`, }); } const today = new Date().toISOString().slice(0, 10); - const dest = join(getArchiveDir(root), `${today}-${changeName}`); + const archiveDir = getArchiveDir(root); + await mkdir(archiveDir, { recursive: true }); + const dest = join(archiveDir, `${today}-${changeName}`); if (existsSync(dest)) { throw new CommandError(`归档目标 "${today}-${changeName}" 已存在`, { hint: `同一天同一变更名只能归档一次。如需重新归档,请先删除 .rune/archive/${today}-${changeName} 目录`,