Files
2025-11-30 08:35:59 +08:00

107 lines
3.1 KiB
JavaScript

#!/usr/bin/env osascript -l JavaScript
// Add a task to OmniFocus using pure JXA (no URL scheme, no popups)
// Usage: osascript -l JavaScript add_task.js '{"name":"Task name","project":"Project Name","tags":["Tag1","Tag2"],"dueDate":"2025-11-25","note":"Optional note"}'
function run(argv) {
const app = Application('OmniFocus');
app.includeStandardAdditions = true;
const doc = app.defaultDocument;
// Parse input
let input;
try {
input = JSON.parse(argv[0]);
} catch (e) {
return JSON.stringify({
success: false,
error: "Invalid JSON input. Expected: {name, project, tags, dueDate, note}"
});
}
const taskName = input.name;
const projectName = input.project;
const tagNames = input.tags || [];
const dueDateStr = input.dueDate;
const noteText = input.note || "";
const deferDateStr = input.deferDate;
const flagged = input.flagged || false;
if (!taskName) {
return JSON.stringify({
success: false,
error: "Task name is required"
});
}
try {
// Build task properties
const taskProps = {
name: taskName,
note: noteText,
flagged: flagged
};
// Set dates if provided
if (dueDateStr) {
taskProps.dueDate = new Date(dueDateStr);
}
if (deferDateStr) {
taskProps.deferDate = new Date(deferDateStr);
}
let task;
let targetLocation = "Inbox";
// Always create in inbox first
task = app.InboxTask(taskProps);
doc.inboxTasks.push(task);
// Then move to project if specified
if (projectName) {
const projects = doc.flattenedProjects.whose({name: projectName});
if (projects.length === 0) {
return JSON.stringify({
success: false,
error: `Project not found: ${projectName}`
});
}
const project = projects[0];
// Move task to project
task.assignedContainer = project;
targetLocation = projectName;
}
// Add tags (use app.add for existing objects, not push)
const addedTags = [];
for (const tagName of tagNames) {
const tags = doc.flattenedTags.whose({name: tagName});
if (tags.length > 0) {
app.add(tags[0], {to: task.tags});
addedTags.push(tagName);
}
}
return JSON.stringify({
success: true,
task: {
id: task.id(),
name: task.name(),
project: targetLocation,
tags: addedTags,
dueDate: dueDateStr || null,
deferDate: deferDateStr || null,
note: noteText || null,
flagged: flagged
}
});
} catch (e) {
return JSON.stringify({
success: false,
error: `Failed to create task: ${e.message}`
});
}
}