feat: 新增 create 命令,移除 fallbackNote,plan 不再自动 mkdir
This commit is contained in:
35
src/cli.ts
35
src/cli.ts
@@ -7,6 +7,7 @@ import { runInit } from "./commands/init.ts";
|
|||||||
import { findProjectRoot, loadConfig, getChangeDir, getArchiveDir } from "./core/config.ts";
|
import { findProjectRoot, loadConfig, getChangeDir, getArchiveDir } from "./core/config.ts";
|
||||||
import {
|
import {
|
||||||
assembleDiscussPrompt,
|
assembleDiscussPrompt,
|
||||||
|
assembleCreatePrompt,
|
||||||
assemblePlanPrompt,
|
assemblePlanPrompt,
|
||||||
assembleBuildPrompt,
|
assembleBuildPrompt,
|
||||||
assembleArchivePrompt,
|
assembleArchivePrompt,
|
||||||
@@ -15,7 +16,7 @@ import { scanChanges } from "./core/scanner.ts";
|
|||||||
import { UsageError, ConfigError, CommandError, InternalError, CliError } from "./cli/errors.ts";
|
import { UsageError, ConfigError, CommandError, InternalError, CliError } from "./cli/errors.ts";
|
||||||
import { printError } from "./cli/output.ts";
|
import { printError } from "./cli/output.ts";
|
||||||
import { showGlobalHelp, showCommandHelp } from "./cli/help.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";
|
import type { ChangeStatus, RuneConfig } from "./types.ts";
|
||||||
|
|
||||||
function requireProjectRoot(): string {
|
function requireProjectRoot(): string {
|
||||||
@@ -137,11 +138,10 @@ cli.command("version", "显示版本号").action(() => {
|
|||||||
|
|
||||||
cli.command("init [...tools]", "初始化 Rune 并注入工具配置").action(async (tools: string[]) => {
|
cli.command("init [...tools]", "初始化 Rune 并注入工具配置").action(async (tools: string[]) => {
|
||||||
const prefix = getPmPrefix();
|
const prefix = getPmPrefix();
|
||||||
const fallbackNote = getFallbackNote();
|
|
||||||
if (!tools || tools.length === 0) {
|
if (!tools || tools.length === 0) {
|
||||||
throw new UsageError("请指定至少一个工具", {
|
throw new UsageError("请指定至少一个工具", {
|
||||||
usage: `${prefix} init <工具...>`,
|
usage: `${prefix} init <工具...>`,
|
||||||
hint: `如:${prefix} init opencode\n\n${fallbackNote}`,
|
hint: `如:${prefix} init opencode`,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
await runInit(process.cwd(), tools);
|
await runInit(process.cwd(), tools);
|
||||||
@@ -150,11 +150,10 @@ cli.command("init [...tools]", "初始化 Rune 并注入工具配置").action(as
|
|||||||
|
|
||||||
cli.command("update [...tools]", "更新已注入的工具配置").action(async (tools: string[]) => {
|
cli.command("update [...tools]", "更新已注入的工具配置").action(async (tools: string[]) => {
|
||||||
const prefix = getPmPrefix();
|
const prefix = getPmPrefix();
|
||||||
const fallbackNote = getFallbackNote();
|
|
||||||
if (!tools || tools.length === 0) {
|
if (!tools || tools.length === 0) {
|
||||||
throw new UsageError("请指定至少一个工具", {
|
throw new UsageError("请指定至少一个工具", {
|
||||||
usage: `${prefix} update <工具...>`,
|
usage: `${prefix} update <工具...>`,
|
||||||
hint: `如:${prefix} update opencode\n\n${fallbackNote}`,
|
hint: `如:${prefix} update opencode`,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
const root = requireProjectRoot();
|
const root = requireProjectRoot();
|
||||||
@@ -206,6 +205,21 @@ cli.command("discuss", "讨论阶段").action(async () => {
|
|||||||
console.log(prompt);
|
console.log(prompt);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
cli.command("create <change-name>", "创建变更").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
|
cli
|
||||||
.command("plan <change-name> <document-name>", "规划阶段")
|
.command("plan <change-name> <document-name>", "规划阶段")
|
||||||
.action(async (changeName: string, documentName: string) => {
|
.action(async (changeName: string, documentName: string) => {
|
||||||
@@ -220,7 +234,12 @@ cli
|
|||||||
}
|
}
|
||||||
|
|
||||||
const changeDir = getChangeDir(root, changeName);
|
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)!;
|
const doc = planDocs.find((d) => d.name === documentName)!;
|
||||||
if (doc.depend && doc.depend.length > 0) {
|
if (doc.depend && doc.depend.length > 0) {
|
||||||
@@ -246,7 +265,7 @@ cli.command("build <change-name>", "构建阶段").action(async (changeName: str
|
|||||||
if (!existsSync(changeDir)) {
|
if (!existsSync(changeDir)) {
|
||||||
const prefix = getPmPrefix();
|
const prefix = getPmPrefix();
|
||||||
throw new CommandError(`变更 '${changeName}' 不存在`, {
|
throw new CommandError(`变更 '${changeName}' 不存在`, {
|
||||||
hint: `请先运行 ${prefix} plan ${changeName} 创建变更`,
|
hint: `请先运行 ${prefix} create ${changeName} 创建变更`,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
const config = await loadConfig(root);
|
const config = await loadConfig(root);
|
||||||
@@ -261,7 +280,7 @@ cli.command("archive <change-name>", "归档阶段").action(async (changeName: s
|
|||||||
if (!existsSync(changeDir)) {
|
if (!existsSync(changeDir)) {
|
||||||
const prefix = getPmPrefix();
|
const prefix = getPmPrefix();
|
||||||
throw new CommandError(`变更 '${changeName}' 不存在`, {
|
throw new CommandError(`变更 '${changeName}' 不存在`, {
|
||||||
hint: `请先运行 ${prefix} plan ${changeName} 创建变更`,
|
hint: `请先运行 ${prefix} create ${changeName} 创建变更`,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
const config = await loadConfig(root);
|
const config = await loadConfig(root);
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ export async function assembleBuildPrompt(
|
|||||||
} catch {
|
} catch {
|
||||||
const prefix = getPmPrefix(config);
|
const prefix = getPmPrefix(config);
|
||||||
throw new CommandError(`变更 "${changeName}" 尚未完成规划,task.md 不存在`, {
|
throw new CommandError(`变更 "${changeName}" 尚未完成规划,task.md 不存在`, {
|
||||||
hint: `请先完成规划阶段:${prefix} plan ${changeName} 生成所有规划文档`,
|
hint: `请先完成规划阶段:${prefix} plan ${changeName} task 生成任务文档`,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user