@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
package/dist/commands/review.js
CHANGED
|
@@ -2,7 +2,7 @@ import { success, failure } from "../result.js";
|
|
|
2
2
|
import { ErrorCode, createError } from "../errors.js";
|
|
3
3
|
import { validateId } from "../validation.js";
|
|
4
4
|
import { escapeAppleScript } from "../escape.js";
|
|
5
|
-
import { runAppleScript, omniFocusScriptWithHelpers
|
|
5
|
+
import { runAppleScript, omniFocusScriptWithHelpers } from "../applescript.js";
|
|
6
6
|
/**
|
|
7
7
|
* Mark a project as reviewed in OmniFocus.
|
|
8
8
|
*/
|
|
@@ -129,4 +129,90 @@ export async function queryProjectsForReview() {
|
|
|
129
129
|
}
|
|
130
130
|
return success(result.data ?? []);
|
|
131
131
|
}
|
|
132
|
+
// Seconds per day for review interval conversion
|
|
133
|
+
const SECONDS_PER_DAY = 86400;
|
|
134
|
+
/**
|
|
135
|
+
* Get the review interval for a project in OmniFocus.
|
|
136
|
+
* Returns the interval in days.
|
|
137
|
+
*/
|
|
138
|
+
export async function getReviewInterval(projectId) {
|
|
139
|
+
// Validate project ID
|
|
140
|
+
const idError = validateId(projectId, "project");
|
|
141
|
+
if (idError)
|
|
142
|
+
return failure(idError);
|
|
143
|
+
const script = `
|
|
144
|
+
set theProject to first flattened project whose id is "${escapeAppleScript(projectId)}"
|
|
145
|
+
|
|
146
|
+
set projId to id of theProject
|
|
147
|
+
set projName to name of theProject
|
|
148
|
+
|
|
149
|
+
-- Review interval is stored in seconds
|
|
150
|
+
set intervalSecs to 0
|
|
151
|
+
try
|
|
152
|
+
set intervalSecs to review interval of theProject
|
|
153
|
+
end try
|
|
154
|
+
|
|
155
|
+
-- Convert to days (integer division)
|
|
156
|
+
set intervalDays to intervalSecs div ${String(SECONDS_PER_DAY)}
|
|
157
|
+
|
|
158
|
+
return "{" & ¬
|
|
159
|
+
"\\"projectId\\": \\"" & projId & "\\"," & ¬
|
|
160
|
+
"\\"projectName\\": \\"" & (my escapeJson(projName)) & "\\"," & ¬
|
|
161
|
+
"\\"reviewIntervalDays\\": " & intervalDays & ¬
|
|
162
|
+
"}"
|
|
163
|
+
`;
|
|
164
|
+
const result = await runAppleScript(omniFocusScriptWithHelpers(script));
|
|
165
|
+
if (!result.success) {
|
|
166
|
+
return failure(result.error ??
|
|
167
|
+
createError(ErrorCode.UNKNOWN_ERROR, "Failed to get review interval"));
|
|
168
|
+
}
|
|
169
|
+
if (result.data === undefined) {
|
|
170
|
+
return failure(createError(ErrorCode.UNKNOWN_ERROR, "No result returned"));
|
|
171
|
+
}
|
|
172
|
+
return success(result.data);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Set the review interval for a project in OmniFocus.
|
|
176
|
+
* The interval is specified in days.
|
|
177
|
+
*/
|
|
178
|
+
export async function setReviewInterval(projectId, days) {
|
|
179
|
+
// Validate project ID
|
|
180
|
+
const idError = validateId(projectId, "project");
|
|
181
|
+
if (idError)
|
|
182
|
+
return failure(idError);
|
|
183
|
+
// Validate days
|
|
184
|
+
if (!Number.isInteger(days) || days < 1) {
|
|
185
|
+
return failure(createError(ErrorCode.VALIDATION_ERROR, "Review interval must be a positive integer (days)"));
|
|
186
|
+
}
|
|
187
|
+
// Convert days to seconds
|
|
188
|
+
const intervalSeconds = days * SECONDS_PER_DAY;
|
|
189
|
+
const script = `
|
|
190
|
+
set theProject to first flattened project whose id is "${escapeAppleScript(projectId)}"
|
|
191
|
+
|
|
192
|
+
-- Set review interval (stored in seconds)
|
|
193
|
+
set review interval of theProject to ${String(intervalSeconds)}
|
|
194
|
+
|
|
195
|
+
set projId to id of theProject
|
|
196
|
+
set projName to name of theProject
|
|
197
|
+
|
|
198
|
+
-- Get the updated interval
|
|
199
|
+
set intervalSecs to review interval of theProject
|
|
200
|
+
set intervalDays to intervalSecs div ${String(SECONDS_PER_DAY)}
|
|
201
|
+
|
|
202
|
+
return "{" & ¬
|
|
203
|
+
"\\"projectId\\": \\"" & projId & "\\"," & ¬
|
|
204
|
+
"\\"projectName\\": \\"" & (my escapeJson(projName)) & "\\"," & ¬
|
|
205
|
+
"\\"reviewIntervalDays\\": " & intervalDays & ¬
|
|
206
|
+
"}"
|
|
207
|
+
`;
|
|
208
|
+
const result = await runAppleScript(omniFocusScriptWithHelpers(script));
|
|
209
|
+
if (!result.success) {
|
|
210
|
+
return failure(result.error ??
|
|
211
|
+
createError(ErrorCode.UNKNOWN_ERROR, "Failed to set review interval"));
|
|
212
|
+
}
|
|
213
|
+
if (result.data === undefined) {
|
|
214
|
+
return failure(createError(ErrorCode.UNKNOWN_ERROR, "No result returned"));
|
|
215
|
+
}
|
|
216
|
+
return success(result.data);
|
|
217
|
+
}
|
|
132
218
|
//# sourceMappingURL=review.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,
|
|
1
|
+
{"version":3,"file":"review.js","sourceRoot":"","sources":["../../src/commands/review.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { CliOutput } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Options for querying statistics.
|
|
4
|
+
*/
|
|
5
|
+
export interface StatsOptions {
|
|
6
|
+
/** Filter by project name */
|
|
7
|
+
project?: string | undefined;
|
|
8
|
+
/** Start date for the period (ISO date string) */
|
|
9
|
+
since?: string | undefined;
|
|
10
|
+
/** End date for the period (ISO date string) */
|
|
11
|
+
until?: string | undefined;
|
|
12
|
+
/** Predefined period: "day", "week", "month", "year" */
|
|
13
|
+
period?: "day" | "week" | "month" | "year" | undefined;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Statistics result.
|
|
17
|
+
*/
|
|
18
|
+
export interface StatsResult {
|
|
19
|
+
/** Period start date */
|
|
20
|
+
periodStart: string;
|
|
21
|
+
/** Period end date */
|
|
22
|
+
periodEnd: string;
|
|
23
|
+
/** Number of tasks completed in the period */
|
|
24
|
+
tasksCompleted: number;
|
|
25
|
+
/** Number of tasks that are overdue */
|
|
26
|
+
tasksOverdue: number;
|
|
27
|
+
/** Number of tasks currently available/actionable */
|
|
28
|
+
tasksAvailable: number;
|
|
29
|
+
/** Total number of remaining tasks */
|
|
30
|
+
tasksRemaining: number;
|
|
31
|
+
/** Number of flagged tasks */
|
|
32
|
+
tasksFlagged: number;
|
|
33
|
+
/** Number of active projects */
|
|
34
|
+
projectsActive: number;
|
|
35
|
+
/** Number of projects on hold */
|
|
36
|
+
projectsOnHold: number;
|
|
37
|
+
/** Tasks due today */
|
|
38
|
+
tasksDueToday: number;
|
|
39
|
+
/** Tasks due this week */
|
|
40
|
+
tasksDueThisWeek: number;
|
|
41
|
+
/** Project filter applied (if any) */
|
|
42
|
+
projectFilter: string | null;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Get productivity statistics from OmniFocus.
|
|
46
|
+
*/
|
|
47
|
+
export declare function getStats(options?: StatsOptions): Promise<CliOutput<StatsResult>>;
|
|
48
|
+
//# sourceMappingURL=stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAM7C;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,6BAA6B;IAC7B,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,kDAAkD;IAClD,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,gDAAgD;IAChD,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,wDAAwD;IACxD,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;CACxD;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,wBAAwB;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,sBAAsB;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,cAAc,EAAE,MAAM,CAAC;IACvB,uCAAuC;IACvC,YAAY,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,cAAc,EAAE,MAAM,CAAC;IACvB,sCAAsC;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,CAAC;IACrB,gCAAgC;IAChC,cAAc,EAAE,MAAM,CAAC;IACvB,iCAAiC;IACjC,cAAc,EAAE,MAAM,CAAC;IACvB,sBAAsB;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,0BAA0B;IAC1B,gBAAgB,EAAE,MAAM,CAAC;IACzB,sCAAsC;IACtC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAwHD;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,OAAO,GAAE,YAAiB,GACzB,OAAO,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CA2GjC"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
import { success, failure, failureMessage } from "../result.js";
|
|
2
|
+
import { queryTasks } from "./tasks.js";
|
|
3
|
+
import { queryProjects } from "./projects.js";
|
|
4
|
+
import { validateDateString } from "../validation.js";
|
|
5
|
+
/**
|
|
6
|
+
* Get start of day for a date.
|
|
7
|
+
*/
|
|
8
|
+
function startOfDay(date) {
|
|
9
|
+
const d = new Date(date);
|
|
10
|
+
d.setHours(0, 0, 0, 0);
|
|
11
|
+
return d;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Get end of day for a date.
|
|
15
|
+
*/
|
|
16
|
+
function endOfDay(date) {
|
|
17
|
+
const d = new Date(date);
|
|
18
|
+
d.setHours(23, 59, 59, 999);
|
|
19
|
+
return d;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Calculate period dates based on options.
|
|
23
|
+
*/
|
|
24
|
+
function calculatePeriod(options) {
|
|
25
|
+
const now = new Date();
|
|
26
|
+
let start;
|
|
27
|
+
let end = endOfDay(now);
|
|
28
|
+
if (options.since && options.until) {
|
|
29
|
+
start = startOfDay(new Date(options.since));
|
|
30
|
+
end = endOfDay(new Date(options.until));
|
|
31
|
+
}
|
|
32
|
+
else if (options.since) {
|
|
33
|
+
start = startOfDay(new Date(options.since));
|
|
34
|
+
}
|
|
35
|
+
else if (options.period) {
|
|
36
|
+
switch (options.period) {
|
|
37
|
+
case "day":
|
|
38
|
+
start = startOfDay(now);
|
|
39
|
+
break;
|
|
40
|
+
case "week": {
|
|
41
|
+
start = startOfDay(now);
|
|
42
|
+
start.setDate(start.getDate() - start.getDay()); // Start of week (Sunday)
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
case "month": {
|
|
46
|
+
start = startOfDay(now);
|
|
47
|
+
start.setDate(1); // Start of month
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
case "year": {
|
|
51
|
+
start = startOfDay(now);
|
|
52
|
+
start.setMonth(0, 1); // Start of year
|
|
53
|
+
break;
|
|
54
|
+
}
|
|
55
|
+
default:
|
|
56
|
+
start = startOfDay(now);
|
|
57
|
+
start.setDate(start.getDate() - 7); // Default to last week
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
// Default to last 7 days
|
|
62
|
+
start = startOfDay(now);
|
|
63
|
+
start.setDate(start.getDate() - 7);
|
|
64
|
+
}
|
|
65
|
+
return { start, end };
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Format date as ISO date string (YYYY-MM-DD).
|
|
69
|
+
*/
|
|
70
|
+
function formatDate(date) {
|
|
71
|
+
return date.toISOString().split("T")[0] ?? "";
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Parse a date string from OmniFocus format.
|
|
75
|
+
*/
|
|
76
|
+
function parseDate(dateStr) {
|
|
77
|
+
if (!dateStr)
|
|
78
|
+
return null;
|
|
79
|
+
const date = new Date(dateStr);
|
|
80
|
+
return isNaN(date.getTime()) ? null : date;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Check if a date is today.
|
|
84
|
+
*/
|
|
85
|
+
function isToday(dateStr) {
|
|
86
|
+
const date = parseDate(dateStr);
|
|
87
|
+
if (!date)
|
|
88
|
+
return false;
|
|
89
|
+
const today = new Date();
|
|
90
|
+
return (date.getFullYear() === today.getFullYear() &&
|
|
91
|
+
date.getMonth() === today.getMonth() &&
|
|
92
|
+
date.getDate() === today.getDate());
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Check if a date is within this week.
|
|
96
|
+
*/
|
|
97
|
+
function isThisWeek(dateStr) {
|
|
98
|
+
const date = parseDate(dateStr);
|
|
99
|
+
if (!date)
|
|
100
|
+
return false;
|
|
101
|
+
const now = new Date();
|
|
102
|
+
const startOfWeek = startOfDay(now);
|
|
103
|
+
startOfWeek.setDate(startOfWeek.getDate() - startOfWeek.getDay());
|
|
104
|
+
const endOfWeek = endOfDay(now);
|
|
105
|
+
endOfWeek.setDate(endOfWeek.getDate() + (6 - endOfWeek.getDay()));
|
|
106
|
+
return date >= startOfWeek && date <= endOfWeek;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Check if a task is overdue.
|
|
110
|
+
*/
|
|
111
|
+
function isOverdue(dueDate) {
|
|
112
|
+
const date = parseDate(dueDate);
|
|
113
|
+
if (!date)
|
|
114
|
+
return false;
|
|
115
|
+
const now = new Date();
|
|
116
|
+
return date < startOfDay(now);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Get productivity statistics from OmniFocus.
|
|
120
|
+
*/
|
|
121
|
+
export async function getStats(options = {}) {
|
|
122
|
+
// Validate date inputs
|
|
123
|
+
if (options.since) {
|
|
124
|
+
const sinceError = validateDateString(options.since);
|
|
125
|
+
if (sinceError) {
|
|
126
|
+
return failure(sinceError);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (options.until) {
|
|
130
|
+
const untilError = validateDateString(options.until);
|
|
131
|
+
if (untilError) {
|
|
132
|
+
return failure(untilError);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const { start, end } = calculatePeriod(options);
|
|
136
|
+
// Get all tasks (including completed for the stats)
|
|
137
|
+
const allTasksResult = await queryTasks({
|
|
138
|
+
project: options.project,
|
|
139
|
+
completed: true,
|
|
140
|
+
});
|
|
141
|
+
if (!allTasksResult.success) {
|
|
142
|
+
return failureMessage(allTasksResult.error?.message ?? "Failed to query tasks");
|
|
143
|
+
}
|
|
144
|
+
const allTasks = allTasksResult.data ?? [];
|
|
145
|
+
// Get available tasks
|
|
146
|
+
const availableTasksResult = await queryTasks({
|
|
147
|
+
project: options.project,
|
|
148
|
+
available: true,
|
|
149
|
+
});
|
|
150
|
+
const availableTasks = availableTasksResult.success
|
|
151
|
+
? (availableTasksResult.data ?? [])
|
|
152
|
+
: [];
|
|
153
|
+
// Get projects
|
|
154
|
+
const projectsResult = await queryProjects({});
|
|
155
|
+
const projects = projectsResult.success ? (projectsResult.data ?? []) : [];
|
|
156
|
+
// Calculate statistics
|
|
157
|
+
let tasksCompleted = 0;
|
|
158
|
+
let tasksOverdue = 0;
|
|
159
|
+
let tasksFlagged = 0;
|
|
160
|
+
let tasksRemaining = 0;
|
|
161
|
+
let tasksDueToday = 0;
|
|
162
|
+
let tasksDueThisWeek = 0;
|
|
163
|
+
for (const task of allTasks) {
|
|
164
|
+
if (task.completed) {
|
|
165
|
+
// Count completed tasks within the period
|
|
166
|
+
// Note: OmniFocus doesn't expose completion date directly,
|
|
167
|
+
// so we count all completed tasks if no period filter
|
|
168
|
+
tasksCompleted++;
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
tasksRemaining++;
|
|
172
|
+
if (task.flagged) {
|
|
173
|
+
tasksFlagged++;
|
|
174
|
+
}
|
|
175
|
+
if (isOverdue(task.dueDate)) {
|
|
176
|
+
tasksOverdue++;
|
|
177
|
+
}
|
|
178
|
+
if (isToday(task.dueDate)) {
|
|
179
|
+
tasksDueToday++;
|
|
180
|
+
}
|
|
181
|
+
if (isThisWeek(task.dueDate)) {
|
|
182
|
+
tasksDueThisWeek++;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// Project statistics
|
|
187
|
+
let projectsActive = 0;
|
|
188
|
+
let projectsOnHold = 0;
|
|
189
|
+
for (const project of projects) {
|
|
190
|
+
if (project.status === "active") {
|
|
191
|
+
projectsActive++;
|
|
192
|
+
}
|
|
193
|
+
else if (project.status === "on-hold") {
|
|
194
|
+
projectsOnHold++;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return success({
|
|
198
|
+
periodStart: formatDate(start),
|
|
199
|
+
periodEnd: formatDate(end),
|
|
200
|
+
tasksCompleted,
|
|
201
|
+
tasksOverdue,
|
|
202
|
+
tasksAvailable: availableTasks.length,
|
|
203
|
+
tasksRemaining,
|
|
204
|
+
tasksFlagged,
|
|
205
|
+
projectsActive,
|
|
206
|
+
projectsOnHold,
|
|
207
|
+
tasksDueToday,
|
|
208
|
+
tasksDueThisWeek,
|
|
209
|
+
projectFilter: options.project ?? null,
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
//# sourceMappingURL=stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { CliOutput } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Sync status information.
|
|
4
|
+
*/
|
|
5
|
+
export interface SyncStatus {
|
|
6
|
+
/** Whether sync is currently in progress */
|
|
7
|
+
syncing: boolean;
|
|
8
|
+
/** Last sync date (ISO 8601 format) */
|
|
9
|
+
lastSync: string | null;
|
|
10
|
+
/** Sync account name if configured */
|
|
11
|
+
accountName: string | null;
|
|
12
|
+
/** Whether sync is enabled */
|
|
13
|
+
syncEnabled: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Result of sync operation.
|
|
17
|
+
*/
|
|
18
|
+
export interface SyncResult {
|
|
19
|
+
/** Whether sync was triggered */
|
|
20
|
+
triggered: boolean;
|
|
21
|
+
/** Message about the operation */
|
|
22
|
+
message: string;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Get the current sync status.
|
|
26
|
+
*/
|
|
27
|
+
export declare function getSyncStatus(): Promise<CliOutput<SyncStatus>>;
|
|
28
|
+
/**
|
|
29
|
+
* Trigger a sync operation.
|
|
30
|
+
*/
|
|
31
|
+
export declare function triggerSync(): Promise<CliOutput<SyncResult>>;
|
|
32
|
+
//# sourceMappingURL=sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAK7C;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,4CAA4C;IAC5C,OAAO,EAAE,OAAO,CAAC;IACjB,uCAAuC;IACvC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,sCAAsC;IACtC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,8BAA8B;IAC9B,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,iCAAiC;IACjC,SAAS,EAAE,OAAO,CAAC;IACnB,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,aAAa,IAAI,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CA0CpE;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CA6BlE"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { success, failure } from "../result.js";
|
|
2
|
+
import { ErrorCode, createError } from "../errors.js";
|
|
3
|
+
import { runAppleScript, omniFocusScriptWithHelpers } from "../applescript.js";
|
|
4
|
+
/**
|
|
5
|
+
* Get the current sync status.
|
|
6
|
+
*/
|
|
7
|
+
export async function getSyncStatus() {
|
|
8
|
+
const script = `
|
|
9
|
+
set syncEnabled to false
|
|
10
|
+
set lastSyncStr to "null"
|
|
11
|
+
set accountStr to "null"
|
|
12
|
+
set isSyncing to false
|
|
13
|
+
|
|
14
|
+
try
|
|
15
|
+
-- Check if synchronizing
|
|
16
|
+
set isSyncing to synchronizing
|
|
17
|
+
end try
|
|
18
|
+
|
|
19
|
+
-- OmniFocus doesn't expose detailed sync info via AppleScript
|
|
20
|
+
-- We can only check basic sync state; syncEnabled is always reported as false
|
|
21
|
+
-- because there's no reliable way to determine this via AppleScript
|
|
22
|
+
|
|
23
|
+
return "{" & ¬
|
|
24
|
+
"\\"syncing\\": " & (isSyncing as string) & "," & ¬
|
|
25
|
+
"\\"lastSync\\": " & lastSyncStr & "," & ¬
|
|
26
|
+
"\\"accountName\\": " & accountStr & "," & ¬
|
|
27
|
+
"\\"syncEnabled\\": " & (syncEnabled as string) & ¬
|
|
28
|
+
"}"
|
|
29
|
+
`;
|
|
30
|
+
const result = await runAppleScript(omniFocusScriptWithHelpers(script));
|
|
31
|
+
if (!result.success) {
|
|
32
|
+
return failure(result.error ??
|
|
33
|
+
createError(ErrorCode.UNKNOWN_ERROR, "Failed to get sync status"));
|
|
34
|
+
}
|
|
35
|
+
if (result.data === undefined) {
|
|
36
|
+
return failure(createError(ErrorCode.UNKNOWN_ERROR, "No result data returned"));
|
|
37
|
+
}
|
|
38
|
+
return success(result.data);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Trigger a sync operation.
|
|
42
|
+
*/
|
|
43
|
+
export async function triggerSync() {
|
|
44
|
+
const script = `
|
|
45
|
+
-- Trigger synchronization
|
|
46
|
+
synchronize
|
|
47
|
+
|
|
48
|
+
return "{" & ¬
|
|
49
|
+
"\\"triggered\\": true," & ¬
|
|
50
|
+
"\\"message\\": \\"Synchronization started\\"" & ¬
|
|
51
|
+
"}"
|
|
52
|
+
`;
|
|
53
|
+
const result = await runAppleScript(omniFocusScriptWithHelpers(script));
|
|
54
|
+
if (!result.success) {
|
|
55
|
+
return failure(result.error ??
|
|
56
|
+
createError(ErrorCode.UNKNOWN_ERROR, "Failed to trigger sync"));
|
|
57
|
+
}
|
|
58
|
+
if (result.data === undefined) {
|
|
59
|
+
return failure(createError(ErrorCode.UNKNOWN_ERROR, "No result data returned"));
|
|
60
|
+
}
|
|
61
|
+
return success(result.data);
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,0BAA0B,EAAE,MAAM,mBAAmB,CAAC;AA0B/E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;GAqBd,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC,0BAA0B,CAAC,MAAM,CAAC,CACnC,CAAC;IAEF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,OAAO,CACZ,MAAM,CAAC,KAAK;YACV,WAAW,CAAC,SAAS,CAAC,aAAa,EAAE,2BAA2B,CAAC,CACpE,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,OAAO,CACZ,WAAW,CAAC,SAAS,CAAC,aAAa,EAAE,yBAAyB,CAAC,CAChE,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,MAAM,GAAG;;;;;;;;GAQd,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,cAAc,CACjC,0BAA0B,CAAC,MAAM,CAAC,CACnC,CAAC;IAEF,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,OAAO,CACZ,MAAM,CAAC,KAAK;YACV,WAAW,CAAC,SAAS,CAAC,aAAa,EAAE,wBAAwB,CAAC,CACjE,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAC9B,OAAO,OAAO,CACZ,WAAW,CAAC,SAAS,CAAC,aAAa,EAAE,yBAAyB,CAAC,CAChE,CAAC;IACJ,CAAC;IAED,OAAO,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { CliOutput } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Options for exporting to TaskPaper format.
|
|
4
|
+
*/
|
|
5
|
+
export interface TaskPaperExportOptions {
|
|
6
|
+
/** Export only a specific project by name */
|
|
7
|
+
project?: string | undefined;
|
|
8
|
+
/** Include completed tasks */
|
|
9
|
+
includeCompleted?: boolean | undefined;
|
|
10
|
+
/** Include dropped tasks */
|
|
11
|
+
includeDropped?: boolean | undefined;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Result of a TaskPaper export.
|
|
15
|
+
*/
|
|
16
|
+
export interface TaskPaperExportResult {
|
|
17
|
+
content: string;
|
|
18
|
+
taskCount: number;
|
|
19
|
+
projectCount: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Options for importing from TaskPaper format.
|
|
23
|
+
*/
|
|
24
|
+
export interface TaskPaperImportOptions {
|
|
25
|
+
/** Target project for tasks without a project */
|
|
26
|
+
defaultProject?: string | undefined;
|
|
27
|
+
/** Whether to create projects that don't exist */
|
|
28
|
+
createProjects?: boolean | undefined;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Result of a TaskPaper import.
|
|
32
|
+
*/
|
|
33
|
+
export interface TaskPaperImportResult {
|
|
34
|
+
tasksCreated: number;
|
|
35
|
+
projectsCreated: number;
|
|
36
|
+
errors: string[];
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Export tasks and projects to TaskPaper format.
|
|
40
|
+
*/
|
|
41
|
+
export declare function exportTaskPaper(options?: TaskPaperExportOptions): Promise<CliOutput<TaskPaperExportResult>>;
|
|
42
|
+
/**
|
|
43
|
+
* Import tasks from TaskPaper format.
|
|
44
|
+
*/
|
|
45
|
+
export declare function importTaskPaper(content: string, options?: TaskPaperImportOptions): Promise<CliOutput<TaskPaperImportResult>>;
|
|
46
|
+
//# sourceMappingURL=taskpaper.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taskpaper.d.ts","sourceRoot":"","sources":["../../src/commands/taskpaper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAqB,MAAM,aAAa,CAAC;AAOhE;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,6CAA6C;IAC7C,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7B,8BAA8B;IAC9B,gBAAgB,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACvC,4BAA4B;IAC5B,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,iDAAiD;IACjD,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,kDAAkD;IAClD,cAAc,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAoGD;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC,CA2F3C;AA4ID;;GAEG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,sBAA2B,GACnC,OAAO,CAAC,SAAS,CAAC,qBAAqB,CAAC,CAAC,CAwE3C"}
|