#!/usr/bin/env node
import { readdirSync, readFileSync } from "node:fs";
import { resolve, dirname } from "node:path";
import { fileURLToPath } from "node:url";
const __dirname = dirname(fileURLToPath(import.meta.url));
const plansDir = resolve(__dirname, "../plans");
function getPlanStatus(filePath) {
try {
const text = readFileSync(filePath, "utf8");
const patterns = [
/Plan Status:\s*\*\*(.+?)\*\*/i,
/^>\s*Plan Status:\s*(.+)$/m,
/^>\s*Status:\s*(.+)$/m,
];
for (const re of patterns) {
const m = text.match(re);
if (m) return m[1].trim().toLowerCase();
}
return "unknown";
} catch {
return "error";
}
}
function isActive(status) {
return !["completed", "superseded", "cancelled", "deferred"].includes(status);
}
const files = readdirSync(plansDir)
.filter(f => f.endsWith(".md") && f !== "00-plan-authoring-and-execution-guide.md")
.sort();
const plans = [];
for (const f of files) {
const status = getPlanStatus(resolve(plansDir, f));
plans.push({ file: f, status, active: isActive(status) });
}
const activePlans = plans.filter(p => p.active);
const completedPlans = plans.filter(p => !p.active);
console.log(`Total plans: ${plans.length}`);
console.log(`Active: ${activePlans.length}`);
console.log(`Completed: ${completedPlans.length}`);
console.log("");
if (activePlans.length > 0) {
console.log("=== ACTIVE PLANS (按编号排序) ===");
for (const p of activePlans) {
console.log(` ${p.file} → ${p.status}`);
}
}
console.log("");
console.log("=== RECENT COMPLETED (last 5) ===");
for (const p of completedPlans.slice(-5)) {
console.log(` ${p.file} → ${p.status}`);
}