Initial commit
This commit is contained in:
106
skills/omnifocus-manager/scripts/add_task.js
Normal file
106
skills/omnifocus-manager/scripts/add_task.js
Normal file
@@ -0,0 +1,106 @@
|
||||
#!/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}`
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user