@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.
- package/LICENSE +21 -0
- package/api-report/ofocus-sdk.api.md +496 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/commands/archive.d.ts +48 -0
- package/dist/commands/archive.d.ts.map +1 -0
- package/dist/commands/archive.js +132 -0
- package/dist/commands/archive.js.map +1 -0
- package/dist/commands/attachments.d.ts +67 -0
- package/dist/commands/attachments.d.ts.map +1 -0
- package/dist/commands/attachments.js +160 -0
- package/dist/commands/attachments.js.map +1 -0
- package/dist/commands/defer.d.ts +37 -0
- package/dist/commands/defer.d.ts.map +1 -0
- package/dist/commands/defer.js +198 -0
- package/dist/commands/defer.js.map +1 -0
- package/dist/commands/deferred.d.ts +18 -0
- package/dist/commands/deferred.d.ts.map +1 -0
- package/dist/commands/deferred.js +146 -0
- package/dist/commands/deferred.js.map +1 -0
- package/dist/commands/duplicate.d.ts +15 -0
- package/dist/commands/duplicate.d.ts.map +1 -0
- package/dist/commands/duplicate.js +49 -0
- package/dist/commands/duplicate.js.map +1 -0
- package/dist/commands/focus.d.ts +26 -0
- package/dist/commands/focus.d.ts.map +1 -0
- package/dist/commands/focus.js +182 -0
- package/dist/commands/focus.js.map +1 -0
- package/dist/commands/folders-crud.d.ts +18 -0
- package/dist/commands/folders-crud.d.ts.map +1 -0
- package/dist/commands/folders-crud.js +117 -0
- package/dist/commands/folders-crud.js.map +1 -0
- package/dist/commands/forecast.d.ts +20 -0
- package/dist/commands/forecast.d.ts.map +1 -0
- package/dist/commands/forecast.js +145 -0
- package/dist/commands/forecast.js.map +1 -0
- package/dist/commands/open.d.ts +17 -0
- package/dist/commands/open.d.ts.map +1 -0
- package/dist/commands/open.js +88 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/projects-crud.d.ts +30 -0
- package/dist/commands/projects-crud.d.ts.map +1 -0
- package/dist/commands/projects-crud.js +209 -0
- package/dist/commands/projects-crud.js.map +1 -0
- package/dist/commands/quick.d.ts +41 -0
- package/dist/commands/quick.d.ts.map +1 -0
- package/dist/commands/quick.js +257 -0
- package/dist/commands/quick.js.map +1 -0
- package/dist/commands/review.d.ts +18 -0
- package/dist/commands/review.d.ts.map +1 -1
- package/dist/commands/review.js +87 -1
- package/dist/commands/review.js.map +1 -1
- package/dist/commands/stats.d.ts +48 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +212 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/sync.d.ts +32 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +63 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/taskpaper.d.ts +46 -0
- package/dist/commands/taskpaper.d.ts.map +1 -0
- package/dist/commands/taskpaper.js +359 -0
- package/dist/commands/taskpaper.js.map +1 -0
- package/dist/commands/templates.d.ts +134 -0
- package/dist/commands/templates.d.ts.map +1 -0
- package/dist/commands/templates.js +252 -0
- package/dist/commands/templates.js.map +1 -0
- package/dist/commands/url.d.ts +16 -0
- package/dist/commands/url.d.ts.map +1 -0
- package/dist/commands/url.js +96 -0
- package/dist/commands/url.js.map +1 -0
- package/dist/index.d.ts +38 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +30 -3
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +27 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/validation.d.ts +1 -1
- package/dist/validation.d.ts.map +1 -1
- package/dist/validation.js +3 -1
- package/dist/validation.js.map +1 -1
- package/package.json +12 -12
- 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;
|
|
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"}
|