import { describe, it, expect, beforeEach, afterEach } from "bun:test"; import { mkdir, writeFile } from "node:fs/promises"; import { join } from "node:path"; import { createRunner } from "./agent-mock.ts"; import { setupTempDir, cleanupTempDir, getTempDir, createFreshProject, writeDoc, changeFileExists, } from "./fixtures.ts"; import { scanChanges, scanArchives } from "../../src/core/scanner.ts"; import { getChangeDir } from "../../src/core/config.ts"; describe("e2e: archive 阶段", () => { let runner: ReturnType; beforeEach(async () => { await setupTempDir(); runner = createRunner(); }); afterEach(async () => { await cleanupTempDir(); }); it("全部任务完成时变更移至 archive/", async () => { const config = await createFreshProject(); await writeDoc("ready", "task", "- [x] 任务\n"); await runner.runArchive(getTempDir(), "ready", config); expect(changeFileExists("ready", "task.md")).toBe(false); const archives = await scanArchives(getTempDir()); expect(archives.length).toBeGreaterThanOrEqual(1); const changes = await scanChanges(getTempDir(), config); expect(changes.find((c) => c.name === "ready")).toBeUndefined(); }); it("任务未完成时阻止归档", async () => { const config = await createFreshProject(); await writeDoc("pending", "task", "- [ ] 未完成\n"); await expect(runner.runArchive(getTempDir(), "pending", config)).rejects.toThrow("未完成任务"); expect(changeFileExists("pending", "task.md")).toBe(true); }); it("无 task.md 时允许归档", async () => { const config = await createFreshProject(); const changeDir = getChangeDir(getTempDir(), "no-task"); await mkdir(changeDir, { recursive: true }); await writeFile(join(changeDir, "design.md"), "# 设计\n"); await runner.runArchive(getTempDir(), "no-task", config); expect(changeFileExists("no-task", "design.md")).toBe(false); const archives = await scanArchives(getTempDir()); expect(archives.length).toBeGreaterThanOrEqual(1); }); });