/** * 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); });