import { describe, it, expect } from "bun:test"; import { formatChangeStatus, suggestNextStep } from "../../src/cli.ts"; import type { ChangeStatus, RuneConfig } from "../../src/types.ts"; function makeStatus(overrides: Partial = {}): ChangeStatus { return { name: "test-change", documents: [], planCompleted: false, buildUnlocked: false, taskProgress: null, ...overrides, }; } describe("formatChangeStatus", () => { it("显示变更名", () => { const output = formatChangeStatus(makeStatus()); expect(output).toContain("test-change"); }); it("显示已完成和待完成文档", () => { const status = makeStatus({ documents: [ { name: "design", completed: true, dependMet: true }, { name: "task", completed: false, dependMet: true }, ], }); const output = formatChangeStatus(status); expect(output).toContain("design.md ✓ 已完成"); expect(output).toContain("task.md ○ 待完成"); }); it("显示文档依赖信息(dependMet 为 false 且 config 中有依赖)", () => { const status = makeStatus({ documents: [{ name: "task", completed: false, dependMet: false }], }); const config: RuneConfig = { stages: { plan: { documents: [ { name: "design", prompt: "生成设计" }, { name: "task", prompt: "生成任务", depend: ["design"] }, ], }, }, }; const output = formatChangeStatus(status, config); expect(output).toContain("依赖 design.md"); }); it("dependMet 为 false 但无 config 时不显示文档依赖信息", () => { const status = makeStatus({ documents: [{ name: "task", completed: false, dependMet: false }], }); const output = formatChangeStatus(status); expect(output).not.toContain("(依赖"); }); it("显示规划进度", () => { const status = makeStatus({ documents: [ { name: "design", completed: true, dependMet: true }, { name: "task", completed: false, dependMet: true }, ], }); const output = formatChangeStatus(status); expect(output).toContain("1/2 文档已完成"); }); it("规划完成时显示构建已解锁", () => { const status = makeStatus({ documents: [ { name: "design", completed: true, dependMet: true }, { name: "task", completed: true, dependMet: true }, ], planCompleted: true, buildUnlocked: true, }); const output = formatChangeStatus(status); expect(output).toContain("已解锁"); }); it("显示任务进度", () => { const status = makeStatus({ taskProgress: { completed: 3, total: 5 }, }); const output = formatChangeStatus(status); expect(output).toContain("3/5 已完成"); }); it("包含下一步建议", () => { const output = formatChangeStatus(makeStatus()); expect(output).toContain("建议下一步"); }); }); describe("suggestNextStep", () => { it("规划未完成时返回下一个可规划文档", () => { const status = makeStatus({ documents: [{ name: "design", completed: false, dependMet: true }], }); expect(suggestNextStep(status)).toContain("rune plan test-change design"); }); it("规划未完成且依赖未满足时提示完成前置依赖", () => { const status = makeStatus({ documents: [{ name: "design", completed: false, dependMet: false }], }); expect(suggestNextStep(status)).toBe("完成前置依赖后再规划文档"); }); it("规划完成且有未完成任务时建议 build", () => { const status = makeStatus({ documents: [ { name: "design", completed: true, dependMet: true }, { name: "task", completed: true, dependMet: true }, ], planCompleted: true, taskProgress: { completed: 2, total: 5 }, }); expect(suggestNextStep(status)).toContain("rune build test-change"); }); it("任务全部完成时建议 archive", () => { const status = makeStatus({ documents: [ { name: "design", completed: true, dependMet: true }, { name: "task", completed: true, dependMet: true }, ], planCompleted: true, taskProgress: { completed: 5, total: 5 }, }); expect(suggestNextStep(status)).toContain("rune archive test-change"); }); it("规划完成但无 taskProgress 时建议 build", () => { const status = makeStatus({ documents: [ { name: "design", completed: true, dependMet: true }, { name: "task", completed: true, dependMet: true }, ], planCompleted: true, taskProgress: null, }); expect(suggestNextStep(status)).toContain("rune build test-change"); }); });