feat: status 命令根据 tracked 决定是否扫描 task.md
This commit is contained in:
@@ -44,6 +44,7 @@ export async function scanChanges(
|
|||||||
const buildUnlocked = planCompleted;
|
const buildUnlocked = planCompleted;
|
||||||
|
|
||||||
let taskProgress: { completed: number; total: number } | null = null;
|
let taskProgress: { completed: number; total: number } | null = null;
|
||||||
|
if (config?.metadata?.tracked) {
|
||||||
const taskFile = files.find((d) => d === "task.md");
|
const taskFile = files.find((d) => d === "task.md");
|
||||||
if (taskFile) {
|
if (taskFile) {
|
||||||
const content = await readFile(join(entryPath, taskFile), "utf-8");
|
const content = await readFile(join(entryPath, taskFile), "utf-8");
|
||||||
@@ -53,6 +54,7 @@ export async function scanChanges(
|
|||||||
total: tasks.length,
|
total: tasks.length,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
results.push({
|
results.push({
|
||||||
name: entry,
|
name: entry,
|
||||||
|
|||||||
@@ -27,14 +27,25 @@ describe("scanChanges", () => {
|
|||||||
await writeFile(join(changesDir, "user-auth", "design.md"), "# 设计");
|
await writeFile(join(changesDir, "user-auth", "design.md"), "# 设计");
|
||||||
await writeFile(join(changesDir, "user-auth", "task.md"), `- [x] 任务一\n- [ ] 任务二`);
|
await writeFile(join(changesDir, "user-auth", "task.md"), `- [x] 任务一\n- [ ] 任务二`);
|
||||||
|
|
||||||
const changes = await scanChanges(TMP_DIR);
|
const config: RuneConfig = {
|
||||||
|
stages: {
|
||||||
|
plan: {
|
||||||
|
documents: [
|
||||||
|
{ name: "design", prompt: "生成设计" },
|
||||||
|
{ name: "task", prompt: "生成任务" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
metadata: { tracked: true },
|
||||||
|
};
|
||||||
|
const changes = await scanChanges(TMP_DIR, config);
|
||||||
expect(changes).toHaveLength(1);
|
expect(changes).toHaveLength(1);
|
||||||
expect(changes[0].name).toBe("user-auth");
|
expect(changes[0].name).toBe("user-auth");
|
||||||
const docNames = changes[0].documents.map((d) => `${d.name}.md`);
|
const docNames = changes[0].documents.map((d) => `${d.name}.md`);
|
||||||
expect(docNames).toContain("design.md");
|
expect(docNames).toContain("design.md");
|
||||||
expect(docNames).toContain("task.md");
|
expect(docNames).toContain("task.md");
|
||||||
expect(changes[0].planCompleted).toBe(false);
|
expect(changes[0].planCompleted).toBe(true);
|
||||||
expect(changes[0].buildUnlocked).toBe(false);
|
expect(changes[0].buildUnlocked).toBe(true);
|
||||||
expect(changes[0].taskProgress).toEqual({ completed: 1, total: 2 });
|
expect(changes[0].taskProgress).toEqual({ completed: 1, total: 2 });
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -145,6 +156,59 @@ describe("scanChanges", () => {
|
|||||||
expect(changes[0].planCompleted).toBe(false);
|
expect(changes[0].planCompleted).toBe(false);
|
||||||
expect(changes[0].buildUnlocked).toBe(false);
|
expect(changes[0].buildUnlocked).toBe(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("tracked=false 时不扫描 task.md,taskProgress 为 null", async () => {
|
||||||
|
const changesDir = join(TMP_DIR, ".rune", "changes");
|
||||||
|
await mkdir(join(changesDir, "test-change"), { recursive: true });
|
||||||
|
await writeFile(join(changesDir, "test-change", "design.md"), "# 设计");
|
||||||
|
await writeFile(join(changesDir, "test-change", "task.md"), "- [x] 完成\n- [ ] 未完成");
|
||||||
|
const config: RuneConfig = {
|
||||||
|
stages: {
|
||||||
|
plan: {
|
||||||
|
documents: [{ name: "design", prompt: "生成设计" }],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
metadata: { tracked: false },
|
||||||
|
};
|
||||||
|
const results = await scanChanges(TMP_DIR, config);
|
||||||
|
expect(results[0].taskProgress).toBeNull();
|
||||||
|
});
|
||||||
|
|
||||||
|
it("tracked=true 时扫描 task.md,taskProgress 有值", async () => {
|
||||||
|
const changesDir = join(TMP_DIR, ".rune", "changes");
|
||||||
|
await mkdir(join(changesDir, "test-change2"), { recursive: true });
|
||||||
|
await writeFile(join(changesDir, "test-change2", "design.md"), "# 设计");
|
||||||
|
await writeFile(join(changesDir, "test-change2", "task.md"), "- [x] 完成\n- [ ] 未完成");
|
||||||
|
const config: RuneConfig = {
|
||||||
|
stages: {
|
||||||
|
plan: {
|
||||||
|
documents: [
|
||||||
|
{ name: "design", prompt: "生成设计" },
|
||||||
|
{ name: "task", prompt: "生成任务" },
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
metadata: { tracked: true },
|
||||||
|
};
|
||||||
|
const results = await scanChanges(TMP_DIR, config);
|
||||||
|
expect(results[0].taskProgress).toEqual({ completed: 1, total: 2 });
|
||||||
|
});
|
||||||
|
|
||||||
|
it("tracked 未配置(undefined)时不扫描 task.md", async () => {
|
||||||
|
const changesDir = join(TMP_DIR, ".rune", "changes");
|
||||||
|
await mkdir(join(changesDir, "test-change3"), { recursive: true });
|
||||||
|
await writeFile(join(changesDir, "test-change3", "design.md"), "# 设计");
|
||||||
|
await writeFile(join(changesDir, "test-change3", "task.md"), "- [x] 完成");
|
||||||
|
const config: RuneConfig = {
|
||||||
|
stages: {
|
||||||
|
plan: {
|
||||||
|
documents: [{ name: "design", prompt: "生成设计" }],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
const results = await scanChanges(TMP_DIR, config);
|
||||||
|
expect(results[0].taskProgress).toBeNull();
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("scanArchives", () => {
|
describe("scanArchives", () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user