From ed4da9b6a0d1739f08cbcfc19b25f1d1f4a7c1dc Mon Sep 17 00:00:00 2001 From: lanyuanxiaoyao Date: Wed, 10 Jun 2026 13:06:30 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=96=B0=E5=A2=9E=20create=20=E5=91=BD?= =?UTF-8?q?=E4=BB=A4=EF=BC=8C=E7=A7=BB=E9=99=A4=20fallbackNote=EF=BC=8Cpla?= =?UTF-8?q?n=20=E4=B8=8D=E5=86=8D=E8=87=AA=E5=8A=A8=20mkdir?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/cli.ts | 35 +++++++++++++++++++++++++++-------- src/core/assembler.ts | 2 +- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/cli.ts b/src/cli.ts index ae04374..4a602c2 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -7,6 +7,7 @@ import { runInit } from "./commands/init.ts"; import { findProjectRoot, loadConfig, getChangeDir, getArchiveDir } from "./core/config.ts"; import { assembleDiscussPrompt, + assembleCreatePrompt, assemblePlanPrompt, assembleBuildPrompt, assembleArchivePrompt, @@ -15,7 +16,7 @@ import { scanChanges } from "./core/scanner.ts"; import { UsageError, ConfigError, CommandError, InternalError, CliError } from "./cli/errors.ts"; import { printError } from "./cli/output.ts"; import { showGlobalHelp, showCommandHelp } from "./cli/help.ts"; -import { getPmPrefix, getFallbackNote, DEFAULT_PREFIX, detectCommandPrefix } from "./core/pm.ts"; +import { getPmPrefix, DEFAULT_PREFIX, detectCommandPrefix } from "./core/pm.ts"; import type { ChangeStatus, RuneConfig } from "./types.ts"; function requireProjectRoot(): string { @@ -137,11 +138,10 @@ cli.command("version", "显示版本号").action(() => { cli.command("init [...tools]", "初始化 Rune 并注入工具配置").action(async (tools: string[]) => { const prefix = getPmPrefix(); - const fallbackNote = getFallbackNote(); if (!tools || tools.length === 0) { throw new UsageError("请指定至少一个工具", { usage: `${prefix} init <工具...>`, - hint: `如:${prefix} init opencode\n\n${fallbackNote}`, + hint: `如:${prefix} init opencode`, }); } await runInit(process.cwd(), tools); @@ -150,11 +150,10 @@ cli.command("init [...tools]", "初始化 Rune 并注入工具配置").action(as cli.command("update [...tools]", "更新已注入的工具配置").action(async (tools: string[]) => { const prefix = getPmPrefix(); - const fallbackNote = getFallbackNote(); if (!tools || tools.length === 0) { throw new UsageError("请指定至少一个工具", { usage: `${prefix} update <工具...>`, - hint: `如:${prefix} update opencode\n\n${fallbackNote}`, + hint: `如:${prefix} update opencode`, }); } const root = requireProjectRoot(); @@ -206,6 +205,21 @@ cli.command("discuss", "讨论阶段").action(async () => { console.log(prompt); }); +cli.command("create ", "创建变更").action(async (changeName: string) => { + validateChangeName(changeName); + const root = requireProjectRoot(); + const config = await loadConfig(root); + const changeDir = getChangeDir(root, changeName); + if (existsSync(changeDir)) { + throw new CommandError(`变更 "${changeName}" 已存在`, { + hint: `请使用其他名称,或运行 ${getPmPrefix(config)} status 查看现有变更`, + }); + } + await mkdir(changeDir, { recursive: true }); + const prompt = assembleCreatePrompt(config); + console.log(prompt); +}); + cli .command("plan ", "规划阶段") .action(async (changeName: string, documentName: string) => { @@ -220,7 +234,12 @@ cli } const changeDir = getChangeDir(root, changeName); - await mkdir(changeDir, { recursive: true }); + if (!existsSync(changeDir)) { + const prefix = getPmPrefix(config); + throw new CommandError(`变更 '${changeName}' 不存在`, { + hint: `请先运行 ${prefix} create ${changeName} 创建变更`, + }); + } const doc = planDocs.find((d) => d.name === documentName)!; if (doc.depend && doc.depend.length > 0) { @@ -246,7 +265,7 @@ cli.command("build ", "构建阶段").action(async (changeName: str if (!existsSync(changeDir)) { const prefix = getPmPrefix(); throw new CommandError(`变更 '${changeName}' 不存在`, { - hint: `请先运行 ${prefix} plan ${changeName} 创建变更`, + hint: `请先运行 ${prefix} create ${changeName} 创建变更`, }); } const config = await loadConfig(root); @@ -261,7 +280,7 @@ cli.command("archive ", "归档阶段").action(async (changeName: s if (!existsSync(changeDir)) { const prefix = getPmPrefix(); throw new CommandError(`变更 '${changeName}' 不存在`, { - hint: `请先运行 ${prefix} plan ${changeName} 创建变更`, + hint: `请先运行 ${prefix} create ${changeName} 创建变更`, }); } const config = await loadConfig(root); diff --git a/src/core/assembler.ts b/src/core/assembler.ts index b62e322..995fafb 100644 --- a/src/core/assembler.ts +++ b/src/core/assembler.ts @@ -106,7 +106,7 @@ export async function assembleBuildPrompt( } catch { const prefix = getPmPrefix(config); throw new CommandError(`变更 "${changeName}" 尚未完成规划,task.md 不存在`, { - hint: `请先完成规划阶段:${prefix} plan ${changeName} 生成所有规划文档`, + hint: `请先完成规划阶段:${prefix} plan ${changeName} task 生成任务文档`, }); }