@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,30 @@
1
+ import type { CliOutput, OFProject, UpdateProjectOptions } from "../types.js";
2
+ /**
3
+ * Result from deleting a project.
4
+ */
5
+ export interface DeleteProjectResult {
6
+ projectId: string;
7
+ deleted: true;
8
+ }
9
+ /**
10
+ * Result from dropping a project.
11
+ */
12
+ export interface DropProjectResult {
13
+ projectId: string;
14
+ projectName: string;
15
+ dropped: boolean;
16
+ }
17
+ /**
18
+ * Update an existing project in OmniFocus.
19
+ */
20
+ export declare function updateProject(projectId: string, options: UpdateProjectOptions): Promise<CliOutput<OFProject>>;
21
+ /**
22
+ * Delete a project permanently from OmniFocus.
23
+ * Note: This cannot be undone.
24
+ */
25
+ export declare function deleteProject(projectId: string): Promise<CliOutput<DeleteProjectResult>>;
26
+ /**
27
+ * Drop a project in OmniFocus (marks as dropped but keeps history).
28
+ */
29
+ export declare function dropProject(projectId: string): Promise<CliOutput<DropProjectResult>>;
30
+ //# sourceMappingURL=projects-crud.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects-crud.d.ts","sourceRoot":"","sources":["../../src/commands/projects-crud.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAW9E;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,IAAI,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAyK/B;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,CA4BzC;AAED;;GAEG;AACH,wBAAsB,WAAW,CAC/B,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,SAAS,CAAC,iBAAiB,CAAC,CAAC,CAmCvC"}
@@ -0,0 +1,209 @@
1
+ import { success, failure } from "../result.js";
2
+ import { ErrorCode, createError } from "../errors.js";
3
+ import { validateId, validateProjectName, validateFolderName, } from "../validation.js";
4
+ import { escapeAppleScript } from "../escape.js";
5
+ import { runAppleScript, omniFocusScriptWithHelpers } from "../applescript.js";
6
+ /**
7
+ * Update an existing project in OmniFocus.
8
+ */
9
+ export async function updateProject(projectId, options) {
10
+ // Validate project ID
11
+ const idError = validateId(projectId, "project");
12
+ if (idError)
13
+ return failure(idError);
14
+ // Validate optional inputs
15
+ if (options.name !== undefined) {
16
+ const nameError = validateProjectName(options.name);
17
+ if (nameError)
18
+ return failure(nameError);
19
+ }
20
+ if (options.folderId !== undefined) {
21
+ const folderIdError = validateId(options.folderId, "folder");
22
+ if (folderIdError)
23
+ return failure(folderIdError);
24
+ }
25
+ if (options.folderName !== undefined) {
26
+ const folderNameError = validateFolderName(options.folderName);
27
+ if (folderNameError)
28
+ return failure(folderNameError);
29
+ }
30
+ // Build the update statements
31
+ const updates = [];
32
+ if (options.name !== undefined) {
33
+ updates.push(`set name of theProject to "${escapeAppleScript(options.name)}"`);
34
+ }
35
+ if (options.note !== undefined) {
36
+ updates.push(`set note of theProject to "${escapeAppleScript(options.note)}"`);
37
+ }
38
+ if (options.sequential !== undefined) {
39
+ updates.push(`set sequential of theProject to ${String(options.sequential)}`);
40
+ }
41
+ // Handle status changes
42
+ // OmniFocus status values: active, on hold, done, dropped
43
+ if (options.status !== undefined) {
44
+ let statusValue;
45
+ switch (options.status) {
46
+ case "active":
47
+ statusValue = "active";
48
+ break;
49
+ case "on-hold":
50
+ statusValue = "on hold";
51
+ break;
52
+ case "completed":
53
+ statusValue = "done";
54
+ break;
55
+ case "dropped":
56
+ statusValue = "dropped";
57
+ break;
58
+ default:
59
+ statusValue = "active";
60
+ }
61
+ updates.push(`set status of theProject to ${statusValue}`);
62
+ }
63
+ // Handle due date
64
+ if (options.dueDate !== undefined) {
65
+ if (options.dueDate === "") {
66
+ updates.push(`set due date of theProject to missing value`);
67
+ }
68
+ else {
69
+ updates.push(`set due date of theProject to date "${escapeAppleScript(options.dueDate)}"`);
70
+ }
71
+ }
72
+ // Handle defer date
73
+ if (options.deferDate !== undefined) {
74
+ if (options.deferDate === "") {
75
+ updates.push(`set defer date of theProject to missing value`);
76
+ }
77
+ else {
78
+ updates.push(`set defer date of theProject to date "${escapeAppleScript(options.deferDate)}"`);
79
+ }
80
+ }
81
+ // Handle folder move
82
+ let moveScript = "";
83
+ if (options.folderId !== undefined) {
84
+ moveScript = `
85
+ set targetFolder to first flattened folder whose id is "${escapeAppleScript(options.folderId)}"
86
+ move theProject to end of projects of targetFolder
87
+ `;
88
+ }
89
+ else if (options.folderName !== undefined) {
90
+ moveScript = `
91
+ set targetFolder to first flattened folder whose name is "${escapeAppleScript(options.folderName)}"
92
+ move theProject to end of projects of targetFolder
93
+ `;
94
+ }
95
+ const updateScript = updates.join("\n ");
96
+ const script = `
97
+ set theProject to first flattened project whose id is "${escapeAppleScript(projectId)}"
98
+
99
+ ${updateScript}
100
+ ${moveScript}
101
+
102
+ -- Return updated project info
103
+ set projId to id of theProject
104
+ set projName to name of theProject
105
+ set projNote to note of theProject
106
+ set projSeq to sequential of theProject
107
+
108
+ set projStatus to "active"
109
+ try
110
+ set theStatus to status of theProject
111
+ if theStatus is on hold then
112
+ set projStatus to "on-hold"
113
+ else if theStatus is done then
114
+ set projStatus to "completed"
115
+ else if theStatus is dropped then
116
+ set projStatus to "dropped"
117
+ end if
118
+ end try
119
+
120
+ set folderId to ""
121
+ set folderName to ""
122
+ try
123
+ set f to folder of theProject
124
+ set folderId to id of f
125
+ set folderName to name of f
126
+ end try
127
+
128
+ set taskCount to count of tasks of theProject
129
+ set remainingCount to count of (tasks of theProject where completed is false)
130
+
131
+ return "{" & ¬
132
+ "\\"id\\": \\"" & projId & "\\"," & ¬
133
+ "\\"name\\": \\"" & (my escapeJson(projName)) & "\\"," & ¬
134
+ "\\"note\\": " & (my jsonString(projNote)) & "," & ¬
135
+ "\\"status\\": \\"" & projStatus & "\\"," & ¬
136
+ "\\"sequential\\": " & projSeq & "," & ¬
137
+ "\\"folderId\\": " & (my jsonString(folderId)) & "," & ¬
138
+ "\\"folderName\\": " & (my jsonString(folderName)) & "," & ¬
139
+ "\\"taskCount\\": " & taskCount & "," & ¬
140
+ "\\"remainingTaskCount\\": " & remainingCount & ¬
141
+ "}"
142
+ `;
143
+ const result = await runAppleScript(omniFocusScriptWithHelpers(script));
144
+ if (!result.success) {
145
+ return failure(result.error ??
146
+ createError(ErrorCode.UNKNOWN_ERROR, "Failed to update project"));
147
+ }
148
+ if (result.data === undefined) {
149
+ return failure(createError(ErrorCode.UNKNOWN_ERROR, "No project data returned"));
150
+ }
151
+ return success(result.data);
152
+ }
153
+ /**
154
+ * Delete a project permanently from OmniFocus.
155
+ * Note: This cannot be undone.
156
+ */
157
+ export async function deleteProject(projectId) {
158
+ // Validate project ID
159
+ const idError = validateId(projectId, "project");
160
+ if (idError)
161
+ return failure(idError);
162
+ const script = `
163
+ set theProject to first flattened project whose id is "${escapeAppleScript(projectId)}"
164
+ delete theProject
165
+
166
+ return "{\\"projectId\\": \\"${escapeAppleScript(projectId)}\\", \\"deleted\\": true}"
167
+ `;
168
+ const result = await runAppleScript(omniFocusScriptWithHelpers(script));
169
+ if (!result.success) {
170
+ return failure(result.error ??
171
+ createError(ErrorCode.UNKNOWN_ERROR, "Failed to delete project"));
172
+ }
173
+ if (result.data === undefined) {
174
+ return failure(createError(ErrorCode.UNKNOWN_ERROR, "No result returned"));
175
+ }
176
+ return success(result.data);
177
+ }
178
+ /**
179
+ * Drop a project in OmniFocus (marks as dropped but keeps history).
180
+ */
181
+ export async function dropProject(projectId) {
182
+ // Validate project ID
183
+ const idError = validateId(projectId, "project");
184
+ if (idError)
185
+ return failure(idError);
186
+ const script = `
187
+ set theProject to first flattened project whose id is "${escapeAppleScript(projectId)}"
188
+ set status of theProject to dropped
189
+
190
+ set projName to name of theProject
191
+ set projDropped to (status of theProject is dropped)
192
+
193
+ return "{" & ¬
194
+ "\\"projectId\\": \\"${escapeAppleScript(projectId)}\\"," & ¬
195
+ "\\"projectName\\": \\"" & (my escapeJson(projName)) & "\\"," & ¬
196
+ "\\"dropped\\": " & projDropped & ¬
197
+ "}"
198
+ `;
199
+ const result = await runAppleScript(omniFocusScriptWithHelpers(script));
200
+ if (!result.success) {
201
+ return failure(result.error ??
202
+ createError(ErrorCode.UNKNOWN_ERROR, "Failed to drop project"));
203
+ }
204
+ if (result.data === undefined) {
205
+ return failure(createError(ErrorCode.UNKNOWN_ERROR, "No result returned"));
206
+ }
207
+ return success(result.data);
208
+ }
209
+ //# sourceMappingURL=projects-crud.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects-crud.js","sourceRoot":"","sources":["../../src/commands/projects-crud.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ import type { CliOutput, OFTask, RepetitionRule } from "../types.js";
2
+ /**
3
+ * Parsed result from quick capture input.
4
+ */
5
+ export interface ParsedQuickInput {
6
+ title: string;
7
+ note: string | null;
8
+ due: string | null;
9
+ defer: string | null;
10
+ flagged: boolean;
11
+ tags: string[];
12
+ project: string | null;
13
+ estimatedMinutes: number | null;
14
+ repeat: RepetitionRule | null;
15
+ }
16
+ /**
17
+ * Quick capture options.
18
+ */
19
+ export interface QuickOptions {
20
+ /** Additional note text to add */
21
+ note?: string | undefined;
22
+ }
23
+ /**
24
+ * Parse natural language quick capture input.
25
+ *
26
+ * Syntax:
27
+ * - `@tagname` - Add a tag
28
+ * - `#projectname` - Set project
29
+ * - `!` or `!!` - Flag the task
30
+ * - `~30m` or `~1h` - Set estimated duration
31
+ * - `due:tomorrow` or `due:monday` - Set due date
32
+ * - `defer:tomorrow` - Set defer date
33
+ * - `repeat:daily` or `repeat:weekly` - Set repetition
34
+ * - Everything else is the title
35
+ */
36
+ export declare function parseQuickInput(input: string): ParsedQuickInput;
37
+ /**
38
+ * Quick capture - parse natural language input and add task to inbox.
39
+ */
40
+ export declare function quickCapture(input: string, options?: QuickOptions): Promise<CliOutput<OFTask>>;
41
+ //# sourceMappingURL=quick.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quick.d.ts","sourceRoot":"","sources":["../../src/commands/quick.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAKrE;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,MAAM,EAAE,cAAc,GAAG,IAAI,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,kCAAkC;IAClC,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AA2HD;;;;;;;;;;;;GAYG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,gBAAgB,CA2H/D;AAED;;GAEG;AACH,wBAAsB,YAAY,CAChC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CA4B5B"}
@@ -0,0 +1,257 @@
1
+ import { failure } from "../result.js";
2
+ import { ErrorCode, createError } from "../errors.js";
3
+ import { addToInbox } from "./inbox.js";
4
+ /**
5
+ * Date keywords for natural language parsing.
6
+ */
7
+ const DATE_KEYWORDS = {
8
+ today: () => formatDate(new Date()),
9
+ tomorrow: () => {
10
+ const d = new Date();
11
+ d.setDate(d.getDate() + 1);
12
+ return formatDate(d);
13
+ },
14
+ yesterday: () => {
15
+ const d = new Date();
16
+ d.setDate(d.getDate() - 1);
17
+ return formatDate(d);
18
+ },
19
+ monday: () => getNextDayOfWeek(1),
20
+ tuesday: () => getNextDayOfWeek(2),
21
+ wednesday: () => getNextDayOfWeek(3),
22
+ thursday: () => getNextDayOfWeek(4),
23
+ friday: () => getNextDayOfWeek(5),
24
+ saturday: () => getNextDayOfWeek(6),
25
+ sunday: () => getNextDayOfWeek(0),
26
+ };
27
+ /**
28
+ * Format date as string suitable for AppleScript.
29
+ */
30
+ function formatDate(date) {
31
+ const months = [
32
+ "January",
33
+ "February",
34
+ "March",
35
+ "April",
36
+ "May",
37
+ "June",
38
+ "July",
39
+ "August",
40
+ "September",
41
+ "October",
42
+ "November",
43
+ "December",
44
+ ];
45
+ const month = months[date.getMonth()] ?? "January";
46
+ return `${month} ${String(date.getDate())}, ${String(date.getFullYear())}`;
47
+ }
48
+ /**
49
+ * Get next occurrence of a day of week (0=Sunday, 6=Saturday).
50
+ */
51
+ function getNextDayOfWeek(targetDay) {
52
+ const d = new Date();
53
+ const currentDay = d.getDay();
54
+ let daysToAdd = targetDay - currentDay;
55
+ if (daysToAdd <= 0) {
56
+ daysToAdd += 7;
57
+ }
58
+ d.setDate(d.getDate() + daysToAdd);
59
+ return formatDate(d);
60
+ }
61
+ /**
62
+ * Parse duration strings like "30m", "1h", "1.5h".
63
+ */
64
+ function parseDuration(duration) {
65
+ const match = /^(\d+(?:\.\d+)?)(m|h|min|hour|hours|minutes?)$/i.exec(duration);
66
+ if (match?.[1] === undefined || match[2] === undefined)
67
+ return null;
68
+ const value = parseFloat(match[1]);
69
+ const unit = match[2].toLowerCase();
70
+ if (unit === "h" || unit === "hour" || unit === "hours") {
71
+ return Math.round(value * 60);
72
+ }
73
+ return Math.round(value);
74
+ }
75
+ /**
76
+ * Parse repetition strings like "daily", "weekly", "every 2 weeks".
77
+ */
78
+ function parseRepetition(rep) {
79
+ const normalized = rep.toLowerCase();
80
+ // Simple patterns
81
+ if (normalized === "daily") {
82
+ return { frequency: "daily", interval: 1, repeatMethod: "due-again" };
83
+ }
84
+ if (normalized === "weekly") {
85
+ return { frequency: "weekly", interval: 1, repeatMethod: "due-again" };
86
+ }
87
+ if (normalized === "monthly") {
88
+ return { frequency: "monthly", interval: 1, repeatMethod: "due-again" };
89
+ }
90
+ if (normalized === "yearly" || normalized === "annually") {
91
+ return { frequency: "yearly", interval: 1, repeatMethod: "due-again" };
92
+ }
93
+ // "every N" patterns
94
+ const everyMatch = /^every\s+(\d+)\s+(day|week|month|year)s?$/.exec(normalized);
95
+ if (everyMatch?.[1] !== undefined && everyMatch[2] !== undefined) {
96
+ const interval = parseInt(everyMatch[1], 10);
97
+ const unit = everyMatch[2];
98
+ const frequencyMap = {
99
+ day: "daily",
100
+ week: "weekly",
101
+ month: "monthly",
102
+ year: "yearly",
103
+ };
104
+ return {
105
+ frequency: frequencyMap[unit] ?? "daily",
106
+ interval,
107
+ repeatMethod: "due-again",
108
+ };
109
+ }
110
+ return null;
111
+ }
112
+ /**
113
+ * Parse natural language quick capture input.
114
+ *
115
+ * Syntax:
116
+ * - `@tagname` - Add a tag
117
+ * - `#projectname` - Set project
118
+ * - `!` or `!!` - Flag the task
119
+ * - `~30m` or `~1h` - Set estimated duration
120
+ * - `due:tomorrow` or `due:monday` - Set due date
121
+ * - `defer:tomorrow` - Set defer date
122
+ * - `repeat:daily` or `repeat:weekly` - Set repetition
123
+ * - Everything else is the title
124
+ */
125
+ export function parseQuickInput(input) {
126
+ const result = {
127
+ title: "",
128
+ note: null,
129
+ due: null,
130
+ defer: null,
131
+ flagged: false,
132
+ tags: [],
133
+ project: null,
134
+ estimatedMinutes: null,
135
+ repeat: null,
136
+ };
137
+ // Tokenize while preserving quoted strings
138
+ const tokens = [];
139
+ let current = "";
140
+ let inQuotes = false;
141
+ let quoteChar = "";
142
+ for (const char of input) {
143
+ if ((char === '"' || char === "'") && !inQuotes) {
144
+ inQuotes = true;
145
+ quoteChar = char;
146
+ continue;
147
+ }
148
+ if (char === quoteChar && inQuotes) {
149
+ inQuotes = false;
150
+ quoteChar = "";
151
+ continue;
152
+ }
153
+ if (char === " " && !inQuotes) {
154
+ if (current) {
155
+ tokens.push(current);
156
+ current = "";
157
+ }
158
+ continue;
159
+ }
160
+ current += char;
161
+ }
162
+ if (current) {
163
+ tokens.push(current);
164
+ }
165
+ const titleParts = [];
166
+ for (const token of tokens) {
167
+ // Tags: @tagname
168
+ if (token.startsWith("@")) {
169
+ const tag = token.slice(1);
170
+ if (tag) {
171
+ result.tags.push(tag);
172
+ }
173
+ continue;
174
+ }
175
+ // Project: #projectname
176
+ if (token.startsWith("#")) {
177
+ const project = token.slice(1);
178
+ if (project) {
179
+ result.project = project;
180
+ }
181
+ continue;
182
+ }
183
+ // Flags: ! or !!
184
+ if (/^!+$/.test(token)) {
185
+ result.flagged = true;
186
+ continue;
187
+ }
188
+ // Estimated duration: ~30m, ~1h
189
+ if (token.startsWith("~")) {
190
+ const duration = parseDuration(token.slice(1));
191
+ if (duration !== null) {
192
+ result.estimatedMinutes = duration;
193
+ continue;
194
+ }
195
+ }
196
+ // Due date: due:tomorrow, due:monday
197
+ if (token.toLowerCase().startsWith("due:")) {
198
+ const dateKey = token.slice(4).toLowerCase();
199
+ if (DATE_KEYWORDS[dateKey]) {
200
+ result.due = DATE_KEYWORDS[dateKey]();
201
+ continue;
202
+ }
203
+ // Try as literal date
204
+ result.due = token.slice(4);
205
+ continue;
206
+ }
207
+ // Defer date: defer:tomorrow
208
+ if (token.toLowerCase().startsWith("defer:")) {
209
+ const dateKey = token.slice(6).toLowerCase();
210
+ if (DATE_KEYWORDS[dateKey]) {
211
+ result.defer = DATE_KEYWORDS[dateKey]();
212
+ continue;
213
+ }
214
+ // Try as literal date
215
+ result.defer = token.slice(6);
216
+ continue;
217
+ }
218
+ // Repetition: repeat:daily, repeat:weekly
219
+ if (token.toLowerCase().startsWith("repeat:")) {
220
+ const rep = parseRepetition(token.slice(7));
221
+ if (rep) {
222
+ result.repeat = rep;
223
+ continue;
224
+ }
225
+ }
226
+ // Everything else is part of the title
227
+ titleParts.push(token);
228
+ }
229
+ result.title = titleParts.join(" ").trim();
230
+ return result;
231
+ }
232
+ /**
233
+ * Quick capture - parse natural language input and add task to inbox.
234
+ */
235
+ export async function quickCapture(input, options = {}) {
236
+ // Validate input
237
+ if (!input || input.trim() === "") {
238
+ return failure(createError(ErrorCode.VALIDATION_ERROR, "Input cannot be empty"));
239
+ }
240
+ // Parse the input
241
+ const parsed = parseQuickInput(input);
242
+ // Validate that we have a title
243
+ if (!parsed.title) {
244
+ return failure(createError(ErrorCode.VALIDATION_ERROR, "Task title cannot be empty"));
245
+ }
246
+ // Add to inbox with parsed options
247
+ return addToInbox(parsed.title, {
248
+ note: options.note ?? parsed.note ?? undefined,
249
+ due: parsed.due ?? undefined,
250
+ defer: parsed.defer ?? undefined,
251
+ flag: parsed.flagged,
252
+ tags: parsed.tags.length > 0 ? parsed.tags : undefined,
253
+ estimatedMinutes: parsed.estimatedMinutes ?? undefined,
254
+ repeat: parsed.repeat ?? undefined,
255
+ });
256
+ }
257
+ //# sourceMappingURL=quick.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quick.js","sourceRoot":"","sources":["../../src/commands/quick.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,12 @@
1
1
  import type { CliOutput, OFProject, ReviewResult } from "../types.js";
2
+ /**
3
+ * Result from getting or setting review interval.
4
+ */
5
+ export interface ReviewIntervalResult {
6
+ projectId: string;
7
+ projectName: string;
8
+ reviewIntervalDays: number;
9
+ }
2
10
  /**
3
11
  * Mark a project as reviewed in OmniFocus.
4
12
  */
@@ -7,4 +15,14 @@ export declare function reviewProject(projectId: string): Promise<CliOutput<Revi
7
15
  * Query projects that are due for review in OmniFocus.
8
16
  */
9
17
  export declare function queryProjectsForReview(): Promise<CliOutput<OFProject[]>>;
18
+ /**
19
+ * Get the review interval for a project in OmniFocus.
20
+ * Returns the interval in days.
21
+ */
22
+ export declare function getReviewInterval(projectId: string): Promise<CliOutput<ReviewIntervalResult>>;
23
+ /**
24
+ * Set the review interval for a project in OmniFocus.
25
+ * The interval is specified in days.
26
+ */
27
+ export declare function setReviewInterval(projectId: string, days: number): Promise<CliOutput<ReviewIntervalResult>>;
10
28
  //# sourceMappingURL=review.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAUtE;;GAEG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAkDlC;AAED;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CAAC,SAAS,CAAC,SAAS,EAAE,CAAC,CAAC,CAwF9E"}
1
+ {"version":3,"file":"review.d.ts","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAOtE;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAgDlC;AAED;;GAEG;AACH,wBAAsB,sBAAsB,IAAI,OAAO,CACrD,SAAS,CAAC,SAAS,EAAE,CAAC,CACvB,CAwFA;AAKD;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC,CA2C1C;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC,CAsD1C"}