@ofocus/sdk 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/LICENSE +21 -0
  2. package/api-report/ofocus-sdk.api.md +496 -1
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/commands/archive.d.ts +48 -0
  5. package/dist/commands/archive.d.ts.map +1 -0
  6. package/dist/commands/archive.js +132 -0
  7. package/dist/commands/archive.js.map +1 -0
  8. package/dist/commands/attachments.d.ts +67 -0
  9. package/dist/commands/attachments.d.ts.map +1 -0
  10. package/dist/commands/attachments.js +160 -0
  11. package/dist/commands/attachments.js.map +1 -0
  12. package/dist/commands/defer.d.ts +37 -0
  13. package/dist/commands/defer.d.ts.map +1 -0
  14. package/dist/commands/defer.js +198 -0
  15. package/dist/commands/defer.js.map +1 -0
  16. package/dist/commands/deferred.d.ts +18 -0
  17. package/dist/commands/deferred.d.ts.map +1 -0
  18. package/dist/commands/deferred.js +146 -0
  19. package/dist/commands/deferred.js.map +1 -0
  20. package/dist/commands/duplicate.d.ts +15 -0
  21. package/dist/commands/duplicate.d.ts.map +1 -0
  22. package/dist/commands/duplicate.js +49 -0
  23. package/dist/commands/duplicate.js.map +1 -0
  24. package/dist/commands/focus.d.ts +26 -0
  25. package/dist/commands/focus.d.ts.map +1 -0
  26. package/dist/commands/focus.js +182 -0
  27. package/dist/commands/focus.js.map +1 -0
  28. package/dist/commands/folders-crud.d.ts +18 -0
  29. package/dist/commands/folders-crud.d.ts.map +1 -0
  30. package/dist/commands/folders-crud.js +117 -0
  31. package/dist/commands/folders-crud.js.map +1 -0
  32. package/dist/commands/forecast.d.ts +20 -0
  33. package/dist/commands/forecast.d.ts.map +1 -0
  34. package/dist/commands/forecast.js +145 -0
  35. package/dist/commands/forecast.js.map +1 -0
  36. package/dist/commands/open.d.ts +17 -0
  37. package/dist/commands/open.d.ts.map +1 -0
  38. package/dist/commands/open.js +88 -0
  39. package/dist/commands/open.js.map +1 -0
  40. package/dist/commands/projects-crud.d.ts +30 -0
  41. package/dist/commands/projects-crud.d.ts.map +1 -0
  42. package/dist/commands/projects-crud.js +209 -0
  43. package/dist/commands/projects-crud.js.map +1 -0
  44. package/dist/commands/quick.d.ts +41 -0
  45. package/dist/commands/quick.d.ts.map +1 -0
  46. package/dist/commands/quick.js +257 -0
  47. package/dist/commands/quick.js.map +1 -0
  48. package/dist/commands/review.d.ts +18 -0
  49. package/dist/commands/review.d.ts.map +1 -1
  50. package/dist/commands/review.js +87 -1
  51. package/dist/commands/review.js.map +1 -1
  52. package/dist/commands/stats.d.ts +48 -0
  53. package/dist/commands/stats.d.ts.map +1 -0
  54. package/dist/commands/stats.js +212 -0
  55. package/dist/commands/stats.js.map +1 -0
  56. package/dist/commands/sync.d.ts +32 -0
  57. package/dist/commands/sync.d.ts.map +1 -0
  58. package/dist/commands/sync.js +63 -0
  59. package/dist/commands/sync.js.map +1 -0
  60. package/dist/commands/taskpaper.d.ts +46 -0
  61. package/dist/commands/taskpaper.d.ts.map +1 -0
  62. package/dist/commands/taskpaper.js +359 -0
  63. package/dist/commands/taskpaper.js.map +1 -0
  64. package/dist/commands/templates.d.ts +134 -0
  65. package/dist/commands/templates.d.ts.map +1 -0
  66. package/dist/commands/templates.js +252 -0
  67. package/dist/commands/templates.js.map +1 -0
  68. package/dist/commands/url.d.ts +16 -0
  69. package/dist/commands/url.d.ts.map +1 -0
  70. package/dist/commands/url.js +96 -0
  71. package/dist/commands/url.js.map +1 -0
  72. package/dist/index.d.ts +38 -5
  73. package/dist/index.d.ts.map +1 -1
  74. package/dist/index.js +30 -3
  75. package/dist/index.js.map +1 -1
  76. package/dist/types.d.ts +27 -0
  77. package/dist/types.d.ts.map +1 -1
  78. package/dist/validation.d.ts +1 -1
  79. package/dist/validation.d.ts.map +1 -1
  80. package/dist/validation.js +3 -1
  81. package/dist/validation.js.map +1 -1
  82. package/package.json +12 -12
  83. package/dist/ofocus-sdk.d.ts +0 -608
@@ -0,0 +1,359 @@
1
+ import { success, failureMessage } from "../result.js";
2
+ import { queryTasks } from "./tasks.js";
3
+ import { queryProjects } from "./projects.js";
4
+ import { addToInbox } from "./inbox.js";
5
+ import { createProject } from "./create-project.js";
6
+ /**
7
+ * Format a date for TaskPaper (YYYY-MM-DD).
8
+ */
9
+ function formatTaskPaperDate(dateStr) {
10
+ if (!dateStr)
11
+ return null;
12
+ // Try to parse various date formats and output YYYY-MM-DD
13
+ const date = new Date(dateStr);
14
+ if (isNaN(date.getTime()))
15
+ return dateStr; // Return as-is if can't parse
16
+ return date.toISOString().split("T")[0] ?? null;
17
+ }
18
+ /**
19
+ * Escape a string for TaskPaper format.
20
+ */
21
+ function escapeTaskPaper(str) {
22
+ // TaskPaper doesn't have much escaping, but we should handle newlines
23
+ return str.replace(/\n/g, " ").replace(/\t/g, " ");
24
+ }
25
+ /**
26
+ * Format a task as TaskPaper.
27
+ */
28
+ function formatTaskAsTaskPaper(task, indent) {
29
+ const prefix = "\t".repeat(indent) + "- ";
30
+ let line = prefix + escapeTaskPaper(task.name);
31
+ // Add tags
32
+ for (const tag of task.tags) {
33
+ line += ` @${escapeTaskPaper(tag)}`;
34
+ }
35
+ // Add special tags
36
+ if (task.flagged) {
37
+ line += " @flagged";
38
+ }
39
+ if (task.completed) {
40
+ line += " @done";
41
+ }
42
+ // Add dates
43
+ const dueDate = formatTaskPaperDate(task.dueDate);
44
+ if (dueDate) {
45
+ line += ` @due(${dueDate})`;
46
+ }
47
+ const deferDate = formatTaskPaperDate(task.deferDate);
48
+ if (deferDate) {
49
+ line += ` @defer(${deferDate})`;
50
+ }
51
+ // Add estimate
52
+ if (task.estimatedMinutes !== null && task.estimatedMinutes > 0) {
53
+ line += ` @estimate(${String(task.estimatedMinutes)}m)`;
54
+ }
55
+ return line;
56
+ }
57
+ /**
58
+ * Format a project as TaskPaper.
59
+ */
60
+ function formatProjectAsTaskPaper(project) {
61
+ let line = escapeTaskPaper(project.name) + ":";
62
+ // Add project-level tags
63
+ if (project.status === "on-hold") {
64
+ line += " @on-hold";
65
+ }
66
+ else if (project.status === "completed") {
67
+ line += " @done";
68
+ }
69
+ else if (project.status === "dropped") {
70
+ line += " @dropped";
71
+ }
72
+ if (project.sequential) {
73
+ line += " @sequential";
74
+ }
75
+ else {
76
+ line += " @parallel";
77
+ }
78
+ return line;
79
+ }
80
+ /**
81
+ * Export tasks and projects to TaskPaper format.
82
+ */
83
+ export async function exportTaskPaper(options = {}) {
84
+ const lines = [];
85
+ let taskCount = 0;
86
+ let projectCount = 0;
87
+ // Get projects
88
+ const projectsResult = await queryProjects({
89
+ status: options.includeCompleted ? undefined : "active",
90
+ });
91
+ if (!projectsResult.success) {
92
+ return failureMessage(projectsResult.error?.message ?? "Failed to query projects");
93
+ }
94
+ const projects = projectsResult.data ?? [];
95
+ // Filter to specific project if requested
96
+ const filteredProjects = options.project
97
+ ? projects.filter((p) => p.name.toLowerCase() === options.project?.toLowerCase())
98
+ : projects;
99
+ // Get tasks for each project
100
+ for (const project of filteredProjects) {
101
+ // Add project line
102
+ lines.push(formatProjectAsTaskPaper(project));
103
+ projectCount++;
104
+ // Add project note if present
105
+ if (project.note) {
106
+ lines.push("\t" + escapeTaskPaper(project.note));
107
+ }
108
+ // Get tasks for this project
109
+ const tasksResult = await queryTasks({
110
+ project: project.name,
111
+ completed: options.includeCompleted ? true : undefined,
112
+ });
113
+ if (tasksResult.success && tasksResult.data) {
114
+ for (const task of tasksResult.data) {
115
+ // TODO: Dropped task filtering is not yet implemented at the query layer.
116
+ // The OFTask type doesn't expose the `dropped` property, and queryTasks
117
+ // doesn't support filtering by dropped status. When includeDropped=false,
118
+ // dropped tasks may still appear in the export. To properly implement this,
119
+ // we would need to:
120
+ // 1. Add `dropped: boolean` to OFTask
121
+ // 2. Add `dropped?: boolean` to TaskQueryOptions
122
+ // 3. Filter by `effectively dropped` in the AppleScript query
123
+ void options.includeDropped; // Acknowledged but not yet functional
124
+ lines.push(formatTaskAsTaskPaper(task, 1));
125
+ taskCount++;
126
+ // Add task note if present
127
+ if (task.note) {
128
+ lines.push("\t\t" + escapeTaskPaper(task.note));
129
+ }
130
+ }
131
+ }
132
+ lines.push(""); // Blank line between projects
133
+ }
134
+ // Get inbox tasks (tasks without a project)
135
+ const inboxResult = await queryTasks({
136
+ completed: options.includeCompleted ? true : undefined,
137
+ });
138
+ if (inboxResult.success && inboxResult.data) {
139
+ const inboxTasks = inboxResult.data.filter((t) => !t.projectName);
140
+ if (inboxTasks.length > 0) {
141
+ lines.push("Inbox:");
142
+ for (const task of inboxTasks) {
143
+ lines.push(formatTaskAsTaskPaper(task, 1));
144
+ taskCount++;
145
+ if (task.note) {
146
+ lines.push("\t\t" + escapeTaskPaper(task.note));
147
+ }
148
+ }
149
+ }
150
+ }
151
+ return success({
152
+ content: lines.join("\n"),
153
+ taskCount,
154
+ projectCount,
155
+ });
156
+ }
157
+ /**
158
+ * Parse a single line of TaskPaper format.
159
+ */
160
+ function parseTaskPaperLine(line) {
161
+ // Count leading tabs for indent
162
+ let indent = 0;
163
+ let content = line;
164
+ while (content.startsWith("\t")) {
165
+ indent++;
166
+ content = content.slice(1);
167
+ }
168
+ // Also handle spaces (4 spaces = 1 indent level)
169
+ const spaceMatch = /^( +)/.exec(content);
170
+ if (spaceMatch?.[1]) {
171
+ indent += Math.floor(spaceMatch[1].length / 4);
172
+ content = content.slice(spaceMatch[1].length);
173
+ }
174
+ content = content.trim();
175
+ if (!content)
176
+ return null;
177
+ // Check if it's a project. We support:
178
+ // - "ProjectName:" (original behavior), and
179
+ // - "ProjectName: @tag ..." (exported project lines with trailing tags).
180
+ const colonIndex = content.indexOf(":");
181
+ if (colonIndex > 0) {
182
+ const namePart = content.slice(0, colonIndex).trim();
183
+ const trailing = content.slice(colonIndex + 1);
184
+ const trailingTrimmed = trailing.trim();
185
+ const looksLikeProject =
186
+ // Original behavior: just "ProjectName:" with no tags anywhere.
187
+ (!trailingTrimmed && !content.includes("@")) ||
188
+ // New behavior: "ProjectName: @tag ..." where the first non-space
189
+ // character after the colon starts a tag.
190
+ trailingTrimmed.startsWith("@");
191
+ if (namePart && looksLikeProject) {
192
+ return {
193
+ type: "project",
194
+ name: namePart,
195
+ indent,
196
+ tags: [],
197
+ due: null,
198
+ defer: null,
199
+ flagged: false,
200
+ completed: false,
201
+ dropped: false,
202
+ estimate: null,
203
+ note: null,
204
+ };
205
+ }
206
+ }
207
+ // Check if it's a task (starts with - or *)
208
+ if (content.startsWith("- ") || content.startsWith("* ")) {
209
+ content = content.slice(2);
210
+ // Parse tags and special attributes
211
+ const tags = [];
212
+ let due = null;
213
+ let defer = null;
214
+ let flagged = false;
215
+ let completed = false;
216
+ let dropped = false;
217
+ let estimate = null;
218
+ // Extract tags with values like @due(2024-01-15)
219
+ const tagWithValueRegex = /@(\w+)\(([^)]+)\)/g;
220
+ let match;
221
+ while ((match = tagWithValueRegex.exec(content)) !== null) {
222
+ const tagName = match[1]?.toLowerCase();
223
+ const tagValue = match[2];
224
+ if (tagName === "due" && tagValue) {
225
+ due = tagValue;
226
+ }
227
+ else if (tagName === "defer" && tagValue) {
228
+ defer = tagValue;
229
+ }
230
+ else if (tagName === "estimate" && tagValue) {
231
+ // Parse estimate like "30m" or "1h"
232
+ const estMatch = /^(\d+)(m|h)$/i.exec(tagValue);
233
+ if (estMatch?.[1] && estMatch[2]) {
234
+ const value = parseInt(estMatch[1], 10);
235
+ estimate = estMatch[2].toLowerCase() === "h" ? value * 60 : value;
236
+ }
237
+ }
238
+ }
239
+ content = content.replace(tagWithValueRegex, "");
240
+ // Extract simple tags like @flagged, @done, @on-hold (allow hyphens in tag names)
241
+ const simpleTagRegex = /@([\w-]+)/g;
242
+ while ((match = simpleTagRegex.exec(content)) !== null) {
243
+ const tagName = match[1]?.toLowerCase();
244
+ if (tagName === "flagged") {
245
+ flagged = true;
246
+ }
247
+ else if (tagName === "done") {
248
+ completed = true;
249
+ }
250
+ else if (tagName === "dropped") {
251
+ dropped = true;
252
+ }
253
+ else if (match[1]) {
254
+ // Regular tag
255
+ tags.push(match[1]);
256
+ }
257
+ }
258
+ content = content.replace(simpleTagRegex, "");
259
+ const name = content.trim();
260
+ return {
261
+ type: "task",
262
+ name,
263
+ indent,
264
+ tags,
265
+ due,
266
+ defer,
267
+ flagged,
268
+ completed,
269
+ dropped,
270
+ estimate,
271
+ note: null,
272
+ };
273
+ }
274
+ // Otherwise it's a note/description
275
+ return {
276
+ type: "note",
277
+ name: content,
278
+ indent,
279
+ tags: [],
280
+ due: null,
281
+ defer: null,
282
+ flagged: false,
283
+ completed: false,
284
+ dropped: false,
285
+ estimate: null,
286
+ note: null,
287
+ };
288
+ }
289
+ /**
290
+ * Import tasks from TaskPaper format.
291
+ */
292
+ export async function importTaskPaper(content, options = {}) {
293
+ const lines = content.split("\n");
294
+ const result = {
295
+ tasksCreated: 0,
296
+ projectsCreated: 0,
297
+ errors: [],
298
+ };
299
+ // Track current project for task assignment (TODO: implement project assignment)
300
+ let _currentProject = options.defaultProject ?? null;
301
+ let lastItem = null;
302
+ for (const line of lines) {
303
+ const parsed = parseTaskPaperLine(line);
304
+ if (!parsed)
305
+ continue;
306
+ if (parsed.type === "project") {
307
+ // Skip "Inbox" pseudo-project
308
+ if (parsed.name.toLowerCase() === "inbox") {
309
+ _currentProject = null;
310
+ continue;
311
+ }
312
+ // Create project if it doesn't exist and option is set
313
+ if (options.createProjects) {
314
+ const createResult = await createProject(parsed.name, {});
315
+ if (createResult.success) {
316
+ result.projectsCreated++;
317
+ }
318
+ // Don't treat "already exists" as an error
319
+ }
320
+ _currentProject = parsed.name;
321
+ lastItem = parsed;
322
+ }
323
+ else if (parsed.type === "task") {
324
+ // Skip completed/dropped tasks during import
325
+ if (parsed.completed || parsed.dropped) {
326
+ lastItem = parsed;
327
+ continue;
328
+ }
329
+ // Create the task
330
+ const taskResult = await addToInbox(parsed.name, {
331
+ due: parsed.due ?? undefined,
332
+ defer: parsed.defer ?? undefined,
333
+ flag: parsed.flagged,
334
+ tags: parsed.tags.length > 0 ? parsed.tags : undefined,
335
+ estimatedMinutes: parsed.estimate ?? undefined,
336
+ });
337
+ if (taskResult.success) {
338
+ result.tasksCreated++;
339
+ }
340
+ else {
341
+ result.errors.push(`Failed to create task "${parsed.name}": ${taskResult.error?.message ?? "Unknown error"}`);
342
+ }
343
+ lastItem = parsed;
344
+ }
345
+ else {
346
+ // parsed.type === "note"
347
+ // Notes are informational only during import - we could potentially
348
+ // update the previous task/project with this note, but for simplicity
349
+ // we'll skip it in this version
350
+ if (lastItem) {
351
+ // Reserved for future note handling
352
+ }
353
+ }
354
+ }
355
+ // Project tracking is reserved for future use when we implement direct project assignment
356
+ void _currentProject;
357
+ return success(result);
358
+ }
359
+ //# sourceMappingURL=taskpaper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taskpaper.js","sourceRoot":"","sources":["../../src/commands/taskpaper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,134 @@
1
+ import type { CliOutput } from "../types.js";
2
+ /**
3
+ * A task within a template (without OmniFocus-specific IDs).
4
+ */
5
+ export interface TemplateTask {
6
+ /** Task title */
7
+ title: string;
8
+ /** Task note */
9
+ note: string | null;
10
+ /** Whether the task is flagged */
11
+ flagged: boolean;
12
+ /** Estimated duration in minutes */
13
+ estimatedMinutes: number | null;
14
+ /** Tags to apply */
15
+ tags: string[];
16
+ /** Relative defer offset in days from project creation (null = no defer) */
17
+ deferOffsetDays: number | null;
18
+ /** Relative due offset in days from project creation (null = no due) */
19
+ dueOffsetDays: number | null;
20
+ }
21
+ /**
22
+ * A project template definition.
23
+ */
24
+ export interface ProjectTemplate {
25
+ /** Template name */
26
+ name: string;
27
+ /** Template description */
28
+ description: string | null;
29
+ /** Whether the project is sequential */
30
+ sequential: boolean;
31
+ /** Project note */
32
+ note: string | null;
33
+ /** Default folder for instantiation */
34
+ defaultFolder: string | null;
35
+ /** Tasks in the template */
36
+ tasks: TemplateTask[];
37
+ /** Creation timestamp */
38
+ createdAt: string;
39
+ /** Source project name (for reference) */
40
+ sourceProject: string | null;
41
+ }
42
+ /**
43
+ * Result of saving a template.
44
+ */
45
+ export interface SaveTemplateResult {
46
+ /** Template name */
47
+ name: string;
48
+ /** Number of tasks in the template */
49
+ taskCount: number;
50
+ /** Path where the template was saved */
51
+ path: string;
52
+ }
53
+ /**
54
+ * Template summary info for listing.
55
+ */
56
+ export interface TemplateSummary {
57
+ name: string;
58
+ description: string | null;
59
+ taskCount: number;
60
+ createdAt: string;
61
+ sourceProject: string | null;
62
+ }
63
+ /**
64
+ * Result of listing templates.
65
+ */
66
+ export interface ListTemplatesResult {
67
+ /** Available templates */
68
+ templates: TemplateSummary[];
69
+ }
70
+ /**
71
+ * Result of creating from a template.
72
+ */
73
+ export interface CreateFromTemplateResult {
74
+ /** Created project name */
75
+ projectName: string;
76
+ /** Number of tasks created */
77
+ tasksCreated: number;
78
+ /** Project ID */
79
+ projectId: string;
80
+ }
81
+ /**
82
+ * Result of deleting a template.
83
+ */
84
+ export interface DeleteTemplateResult {
85
+ /** Deleted template name */
86
+ name: string;
87
+ /** Whether the deletion was successful */
88
+ deleted: boolean;
89
+ }
90
+ /**
91
+ * Options for saving a template.
92
+ */
93
+ export interface SaveTemplateOptions {
94
+ /** Template name */
95
+ name: string;
96
+ /** Source project ID or name */
97
+ sourceProject: string;
98
+ /** Template description */
99
+ description?: string | undefined;
100
+ }
101
+ /**
102
+ * Options for creating from a template.
103
+ */
104
+ export interface CreateFromTemplateOptions {
105
+ /** Template name */
106
+ templateName: string;
107
+ /** New project name (defaults to template name) */
108
+ projectName?: string | undefined;
109
+ /** Folder to create the project in */
110
+ folder?: string | undefined;
111
+ /** Base date for calculating offsets (defaults to today) */
112
+ baseDate?: string | undefined;
113
+ }
114
+ /**
115
+ * Save a project as a template.
116
+ */
117
+ export declare function saveTemplate(options: SaveTemplateOptions): Promise<CliOutput<SaveTemplateResult>>;
118
+ /**
119
+ * List all available templates.
120
+ */
121
+ export declare function listTemplates(): CliOutput<ListTemplatesResult>;
122
+ /**
123
+ * Get a template by name.
124
+ */
125
+ export declare function getTemplate(name: string): CliOutput<ProjectTemplate>;
126
+ /**
127
+ * Create a new project from a template.
128
+ */
129
+ export declare function createFromTemplate(options: CreateFromTemplateOptions): Promise<CliOutput<CreateFromTemplateResult>>;
130
+ /**
131
+ * Delete a template.
132
+ */
133
+ export declare function deleteTemplate(name: string): CliOutput<DeleteTemplateResult>;
134
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/commands/templates.ts"],"names":[],"mappings":"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"}