/** * Example: Query project timeline and display statistics * * Usage: * npx tsx examples/query-timeline.ts */ import { createGanttClientFromEnv } from "../index.js"; async function main(): Promise { const projectId = process.argv[2]; if (!projectId) { console.error("Usage: npx tsx examples/query-timeline.ts "); process.exit(1); } const client = createGanttClientFromEnv(); console.log(`Fetching timeline for project ${projectId}...\n`); const timeline = await client.getProjectTimeline(projectId); console.log(`Project: ${timeline.project.name}`); console.log(`Status: ${timeline.project.status}`); if (timeline.project.startDate && timeline.project.endDate) { console.log(`Timeline: ${timeline.project.startDate} → ${timeline.project.endDate}`); } console.log(`\nTasks (${timeline.stats.total} total):`); console.log(` ✓ Completed: ${timeline.stats.completed}`); console.log(` ⊙ In Progress: ${timeline.stats.inProgress}`); console.log(` □ Not Started: ${timeline.stats.notStarted}`); console.log(` ⏸ Paused: ${timeline.stats.paused}`); console.log(` ⚠ Target passed: ${timeline.stats.targetPassed}`); console.log("\nTask List:"); const statusIcon = (status: string): string => { switch (status) { case "COMPLETED": return "✓"; case "IN_PROGRESS": return "⊙"; case "PAUSED": return "⏸"; case "ARCHIVED": return "📦"; default: return "□"; } }; const now = new Date(); for (const task of timeline.tasks) { const icon = statusIcon(task.status); const dueInfo = task.dueDate ? ` Due: ${task.dueDate}` : ""; const targetPassed = task.dueDate && new Date(task.dueDate) < now && task.status !== "COMPLETED" ? " (target passed)" : ""; console.log(`${icon} ${task.title} [${task.status}]${dueInfo}${targetPassed}`); } } main().catch((error) => { console.error("Error:", error.message); process.exit(1); });