diff --git a/src/adapters/opencode.ts b/src/adapters/opencode.ts index 96a08c8..fc4b99d 100644 --- a/src/adapters/opencode.ts +++ b/src/adapters/opencode.ts @@ -55,6 +55,12 @@ function generateSkill(stage: string, hasChangeName: boolean): string { const nameHint = hasChangeName ? `将 <变更名> 替换为实际的变更名称。\n` : ""; + + let extraGuide = ""; + if (stage === "plan") { + extraGuide = `\n规划阶段应先运行 \`rune status <变更名>\` 获取当前有哪些文档需要编写,再按依赖顺序逐个生成。\n`; + } + const descriptionMap: Record = { discuss: "Use when 需要进入 SDD 讨论阶段,自由讨论需求和架构方案", plan: "Use when 需要进入 SDD 规划阶段,生成设计文档和任务清单", @@ -75,7 +81,7 @@ description: ${descriptionMap[stage] ?? `Use when 需要执行 SDD ${stage} 阶 ${cmd} \`\`\` -${nameHint}将命令输出作为工作指引,执行当前阶段的工作。 +${nameHint}${extraGuide}将命令输出作为工作指引,执行当前阶段的工作。 `; } diff --git a/src/defaults/config.ts b/src/defaults/config.ts index c438f48..1459ecf 100644 --- a/src/defaults/config.ts +++ b/src/defaults/config.ts @@ -18,7 +18,11 @@ export const defaultConfig: RuneConfig = { documents: [ { name: "design", - prompt: `请根据之前的讨论内容,生成一份设计文档。 + prompt: `请先获取当前规划状态。 + +建议执行: rune status <变更名> + +请根据之前的讨论内容和状态输出,生成一份设计文档。 要求: - 清晰描述背景和目标 @@ -43,7 +47,11 @@ export const defaultConfig: RuneConfig = { { name: "task", depend: ["design"], - prompt: `请根据设计文档,生成一份任务列表。 + prompt: `请先获取当前规划状态。 + +建议执行: rune status <变更名> + +请根据设计文档,生成一份任务列表。 要求: - 将设计拆分为可独立执行的小任务 diff --git a/tests/adapters/opencode.test.ts b/tests/adapters/opencode.test.ts index ad345f1..206bd27 100644 --- a/tests/adapters/opencode.test.ts +++ b/tests/adapters/opencode.test.ts @@ -75,6 +75,24 @@ describe("injectOpenCode", () => { } }); + it("plan skill 包含运行 status 的引导", async () => { + await injectOpenCode(TMP_DIR); + const content = await readFile( + join(TMP_DIR, ".opencode", "skills", "rune-plan", "SKILL.md"), + "utf-8", + ); + expect(content).toContain("rune status"); + }); + + it("discuss skill 不包含 status 引导", async () => { + await injectOpenCode(TMP_DIR); + const content = await readFile( + join(TMP_DIR, ".opencode", "skills", "rune-discuss", "SKILL.md"), + "utf-8", + ); + expect(content).not.toContain("rune status"); + }); + it("重复注入时不覆盖已存在的文件", async () => { await injectOpenCode(TMP_DIR); const originalContent = await readFile(