@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,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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"}
|