getForecastTasks.tsโข3.86 kB
import { executeOmniFocusScript } from '../../utils/scriptExecution.js';
export interface GetForecastTasksOptions {
days?: number;
hideCompleted?: boolean;
includeDeferredOnly?: boolean;
}
export async function getForecastTasks(options: GetForecastTasksOptions = {}): Promise<string> {
const { days = 7, hideCompleted = true, includeDeferredOnly = false } = options;
try {
// Execute the forecast tasks script
const result = await executeOmniFocusScript('@forecastTasks.js', {
days: days,
hideCompleted: hideCompleted,
includeDeferredOnly: includeDeferredOnly
});
if (typeof result === 'string') {
return result;
}
// If result is an object, format it
if (result && typeof result === 'object') {
const data = result as any;
if (data.error) {
throw new Error(data.error);
}
// Format the forecast tasks
let output = `# ๐
FORECAST - Next ${days} days\n\n`;
if (data.tasksByDate && typeof data.tasksByDate === 'object') {
const dates = Object.keys(data.tasksByDate).sort();
if (dates.length === 0) {
output += "๐ No tasks due in the forecast period - enjoy the calm!\n";
} else {
const today = new Date();
today.setHours(0, 0, 0, 0);
dates.forEach(dateStr => {
const tasks = data.tasksByDate[dateStr];
if (!tasks || tasks.length === 0) return;
const taskDate = new Date(dateStr);
const isToday = taskDate.getTime() === today.getTime();
const isTomorrow = taskDate.getTime() === today.getTime() + 24 * 60 * 60 * 1000;
const isOverdue = taskDate < today;
let dateHeader = '';
if (isOverdue) {
dateHeader = `## โ ๏ธ OVERDUE - ${taskDate.toLocaleDateString()}`;
} else if (isToday) {
dateHeader = `## ๐ฅ TODAY - ${taskDate.toLocaleDateString()}`;
} else if (isTomorrow) {
dateHeader = `## โฐ TOMORROW - ${taskDate.toLocaleDateString()}`;
} else {
const dayOfWeek = taskDate.toLocaleDateString('en-US', { weekday: 'long' });
dateHeader = `## ๐
${dayOfWeek} - ${taskDate.toLocaleDateString()}`;
}
output += `${dateHeader}\n`;
tasks.forEach((task: any) => {
const flagSymbol = task.flagged ? '๐ฉ ' : '';
const projectStr = task.projectName ? ` (${task.projectName})` : ' (Inbox)';
const statusStr = task.taskStatus !== 'Available' ? ` [${task.taskStatus}]` : '';
const estimateStr = task.estimatedMinutes ? ` โฑ${task.estimatedMinutes}m` : '';
const typeIndicator = task.isDue ? '๐
' : '๐'; // Due vs Deferred
output += `โข ${typeIndicator} ${flagSymbol}${task.name}${projectStr}${statusStr}${estimateStr}\n`;
if (task.note && task.note.trim()) {
output += ` ๐ ${task.note.trim()}\n`;
}
});
output += '\n';
});
// Summary
const totalTasks = dates.reduce((sum, date) => sum + data.tasksByDate[date].length, 0);
output += `๐ **Summary**: ${totalTasks} task${totalTasks === 1 ? '' : 's'} in forecast\n`;
}
} else {
output += "No forecast data available\n";
}
return output;
}
return "Unexpected result format from OmniFocus";
} catch (error) {
console.error("Error in getForecastTasks:", error);
throw new Error(`Failed to get forecast tasks: ${error instanceof Error ? error.message : 'Unknown error'}`);
}
}