digital-tasks 2.3.0 → 2.4.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.
@@ -0,0 +1,531 @@
1
+ /**
2
+ * Markdown Task List Parser and Serializer
3
+ *
4
+ * Bidirectional conversion between markdown task lists and Task objects.
5
+ *
6
+ * ## Syntax
7
+ *
8
+ * - `- [ ]` = Unordered/parallel tasks (can run simultaneously)
9
+ * - `1. [ ]` = Ordered/sequential tasks (must run in order)
10
+ * - `- [x]` or `1. [x]` = Completed task
11
+ * - `- [-]` = In progress task
12
+ * - `- [~]` = Blocked task
13
+ * - `- [!]` = Failed task
14
+ * - Indentation (2 spaces) = Subtasks
15
+ * - `# Heading` = Project name
16
+ * - `## Heading` = Task group/section
17
+ *
18
+ * ## Example
19
+ *
20
+ * ```markdown
21
+ * # Launch Feature
22
+ *
23
+ * ## Planning (parallel)
24
+ * - [ ] Design mockups
25
+ * - [ ] Write technical spec
26
+ * - [x] Create project board
27
+ *
28
+ * ## Implementation (sequential)
29
+ * 1. [ ] Implement backend API
30
+ * 2. [-] Implement frontend UI
31
+ * - [ ] Create components
32
+ * - [ ] Add state management
33
+ * 3. [ ] Write tests
34
+ *
35
+ * ## Deployment
36
+ * 1. [ ] Deploy to staging
37
+ * 2. [ ] QA testing
38
+ * 3. [ ] Deploy to production
39
+ * ```
40
+ *
41
+ * @packageDocumentation
42
+ */
43
+ import { task, parallel, sequential, createProject } from './project.js';
44
+ // ============================================================================
45
+ // Status Markers
46
+ // ============================================================================
47
+ /**
48
+ * Markdown checkbox markers and their task status
49
+ */
50
+ const STATUS_MARKERS = {
51
+ ' ': 'pending',
52
+ x: 'completed',
53
+ X: 'completed',
54
+ '-': 'in_progress',
55
+ '~': 'blocked',
56
+ '!': 'failed',
57
+ '/': 'cancelled',
58
+ '?': 'review',
59
+ };
60
+ /**
61
+ * Reverse mapping: task status to marker
62
+ */
63
+ const STATUS_TO_MARKER = {
64
+ pending: ' ',
65
+ queued: ' ',
66
+ assigned: '-',
67
+ in_progress: '-',
68
+ blocked: '~',
69
+ review: '?',
70
+ completed: 'x',
71
+ failed: '!',
72
+ cancelled: '/',
73
+ };
74
+ /**
75
+ * Priority markers (can be added after checkbox)
76
+ */
77
+ const PRIORITY_MARKERS = {
78
+ '!!': 'critical',
79
+ '!': 'urgent',
80
+ '^': 'high',
81
+ '': 'normal',
82
+ v: 'low',
83
+ };
84
+ // ============================================================================
85
+ // Parser
86
+ // ============================================================================
87
+ /**
88
+ * Parse a single line of markdown
89
+ */
90
+ function parseLine(line) {
91
+ const raw = line;
92
+ // Count leading spaces for indent (2 spaces = 1 level)
93
+ const leadingSpacesMatch = line.match(/^(\s*)/);
94
+ const leadingSpaces = leadingSpacesMatch?.[1]?.length ?? 0;
95
+ const indent = Math.floor(leadingSpaces / 2);
96
+ const trimmed = line.slice(leadingSpaces);
97
+ // Check for heading
98
+ const headingMatch = trimmed.match(/^(#{1,6})\s+(.+)$/);
99
+ if (headingMatch) {
100
+ const matchedHashes = headingMatch[1];
101
+ const matchedTitle = headingMatch[2];
102
+ return {
103
+ indent,
104
+ isTask: false,
105
+ isOrdered: false,
106
+ title: matchedTitle.trim(),
107
+ isHeading: true,
108
+ headingLevel: matchedHashes.length,
109
+ raw,
110
+ };
111
+ }
112
+ // Check for unordered task: - [ ] or - [x] etc.
113
+ const unorderedMatch = trimmed.match(/^[-*]\s+\[([^\]]*)\]\s*(.*)$/);
114
+ if (unorderedMatch) {
115
+ const marker = unorderedMatch[1];
116
+ let title = unorderedMatch[2].trim();
117
+ let priority = 'normal';
118
+ // Check for priority marker at start of title
119
+ if (title.startsWith('!!')) {
120
+ priority = 'critical';
121
+ title = title.slice(2).trim();
122
+ }
123
+ else if (title.startsWith('!')) {
124
+ priority = 'urgent';
125
+ title = title.slice(1).trim();
126
+ }
127
+ else if (title.startsWith('^')) {
128
+ priority = 'high';
129
+ title = title.slice(1).trim();
130
+ }
131
+ else if (title.startsWith('v')) {
132
+ priority = 'low';
133
+ title = title.slice(1).trim();
134
+ }
135
+ return {
136
+ indent,
137
+ isTask: true,
138
+ isOrdered: false,
139
+ status: STATUS_MARKERS[marker] ?? 'pending',
140
+ priority,
141
+ title,
142
+ isHeading: false,
143
+ raw,
144
+ };
145
+ }
146
+ // Check for ordered task: 1. [ ] or 1. [x] etc.
147
+ const orderedMatch = trimmed.match(/^(\d+)\.\s+\[([^\]]*)\]\s*(.*)$/);
148
+ if (orderedMatch) {
149
+ const orderNum = orderedMatch[1];
150
+ const marker = orderedMatch[2];
151
+ let title = orderedMatch[3].trim();
152
+ let priority = 'normal';
153
+ // Check for priority marker
154
+ if (title.startsWith('!!')) {
155
+ priority = 'critical';
156
+ title = title.slice(2).trim();
157
+ }
158
+ else if (title.startsWith('!')) {
159
+ priority = 'urgent';
160
+ title = title.slice(1).trim();
161
+ }
162
+ else if (title.startsWith('^')) {
163
+ priority = 'high';
164
+ title = title.slice(1).trim();
165
+ }
166
+ else if (title.startsWith('v')) {
167
+ priority = 'low';
168
+ title = title.slice(1).trim();
169
+ }
170
+ return {
171
+ indent,
172
+ isTask: true,
173
+ isOrdered: true,
174
+ orderNumber: parseInt(orderNum, 10),
175
+ status: STATUS_MARKERS[marker] ?? 'pending',
176
+ priority,
177
+ title,
178
+ isHeading: false,
179
+ raw,
180
+ };
181
+ }
182
+ // Plain text line
183
+ return {
184
+ indent,
185
+ isTask: false,
186
+ isOrdered: false,
187
+ title: trimmed,
188
+ isHeading: false,
189
+ raw,
190
+ };
191
+ }
192
+ /**
193
+ * Parse tasks at a specific indent level
194
+ */
195
+ function parseTasksAtIndent(lines, startIndex, baseIndent) {
196
+ const tasks = [];
197
+ let index = startIndex;
198
+ let mode = 'parallel'; // Default based on first task type
199
+ let modeSet = false;
200
+ while (index < lines.length) {
201
+ const line = lines[index];
202
+ // Stop if we've gone back to a lower indent level
203
+ if (line.indent < baseIndent && (line.isTask || line.isHeading)) {
204
+ break;
205
+ }
206
+ // Skip lines at lower indent (they belong to parent)
207
+ if (line.indent < baseIndent) {
208
+ index++;
209
+ continue;
210
+ }
211
+ // Process tasks at our indent level
212
+ if (line.indent === baseIndent && line.isTask) {
213
+ // Set mode based on first task
214
+ if (!modeSet) {
215
+ mode = line.isOrdered ? 'sequential' : 'parallel';
216
+ modeSet = true;
217
+ }
218
+ // Parse subtasks
219
+ const { tasks: subtasks, nextIndex } = parseTasksAtIndent(lines, index + 1, baseIndent + 1);
220
+ const taskOptions = {
221
+ metadata: {
222
+ _originalStatus: line.status,
223
+ _lineNumber: index,
224
+ },
225
+ };
226
+ if (line.priority !== undefined) {
227
+ taskOptions.priority = line.priority;
228
+ }
229
+ if (subtasks.length > 0) {
230
+ taskOptions.subtasks = subtasks;
231
+ }
232
+ const taskDef = task(line.title, taskOptions);
233
+ tasks.push(taskDef);
234
+ index = nextIndex;
235
+ }
236
+ else {
237
+ index++;
238
+ }
239
+ }
240
+ return { tasks, nextIndex: index, mode };
241
+ }
242
+ /**
243
+ * Parse a markdown string into a Project
244
+ *
245
+ * @example
246
+ * ```ts
247
+ * const markdown = `
248
+ * # My Project
249
+ *
250
+ * - [ ] Task 1
251
+ * - [ ] Task 2
252
+ *
253
+ * ## Sequential Work
254
+ * 1. [ ] Step 1
255
+ * 2. [ ] Step 2
256
+ * `
257
+ *
258
+ * const project = parseMarkdown(markdown)
259
+ * ```
260
+ */
261
+ export function parseMarkdown(markdown) {
262
+ // Normalize line endings (handle Windows \r\n and old Mac \r)
263
+ const normalizedMarkdown = markdown.replace(/\r\n/g, '\n').replace(/\r/g, '\n');
264
+ const rawLines = normalizedMarkdown.split('\n');
265
+ const lines = rawLines.map(parseLine);
266
+ let projectName = 'Untitled Project';
267
+ let projectDescription;
268
+ const allTasks = [];
269
+ // Find project name from first h1
270
+ const h1Index = lines.findIndex((l) => l.isHeading && l.headingLevel === 1);
271
+ if (h1Index !== -1) {
272
+ projectName = lines[h1Index].title;
273
+ }
274
+ // Process sections and tasks
275
+ let currentSection = null;
276
+ let index = 0;
277
+ while (index < lines.length) {
278
+ const line = lines[index];
279
+ // New section (h2)
280
+ if (line.isHeading && line.headingLevel === 2) {
281
+ // Save previous section
282
+ if (currentSection && currentSection.tasks.length > 0) {
283
+ if (currentSection.mode === 'sequential') {
284
+ allTasks.push(sequential(...currentSection.tasks));
285
+ }
286
+ else {
287
+ allTasks.push(parallel(...currentSection.tasks));
288
+ }
289
+ }
290
+ // Detect mode from section name (e.g., "## Implementation (sequential)")
291
+ let sectionName = line.title;
292
+ let sectionMode = 'parallel';
293
+ const modeMatch = sectionName.match(/\((parallel|sequential)\)\s*$/i);
294
+ if (modeMatch) {
295
+ sectionMode = modeMatch[1].toLowerCase();
296
+ sectionName = sectionName.replace(/\s*\((parallel|sequential)\)\s*$/i, '');
297
+ }
298
+ currentSection = { name: sectionName, mode: sectionMode, tasks: [] };
299
+ index++;
300
+ continue;
301
+ }
302
+ // Task at root level or in section
303
+ if (line.isTask && line.indent === 0) {
304
+ const { tasks, nextIndex, mode } = parseTasksAtIndent(lines, index, 0);
305
+ if (currentSection) {
306
+ currentSection.tasks.push(...tasks);
307
+ // Update section mode based on first task if not explicitly set
308
+ if (currentSection.tasks.length === tasks.length) {
309
+ currentSection.mode = mode;
310
+ }
311
+ }
312
+ else {
313
+ // No section, add to root with appropriate grouping
314
+ if (mode === 'sequential') {
315
+ allTasks.push(sequential(...tasks));
316
+ }
317
+ else {
318
+ allTasks.push(parallel(...tasks));
319
+ }
320
+ }
321
+ index = nextIndex;
322
+ continue;
323
+ }
324
+ index++;
325
+ }
326
+ // Add final section
327
+ if (currentSection && currentSection.tasks.length > 0) {
328
+ if (currentSection.mode === 'sequential') {
329
+ allTasks.push(sequential(...currentSection.tasks));
330
+ }
331
+ else {
332
+ allTasks.push(parallel(...currentSection.tasks));
333
+ }
334
+ }
335
+ const projectOptions = {
336
+ name: projectName,
337
+ tasks: allTasks,
338
+ };
339
+ if (projectDescription !== undefined) {
340
+ projectOptions.description = projectDescription;
341
+ }
342
+ return createProject(projectOptions);
343
+ }
344
+ /**
345
+ * Serialize a task node to markdown lines
346
+ */
347
+ function serializeTaskNode(node, indent, options, isSequential) {
348
+ const lines = [];
349
+ const indentStr = ' '.repeat(indent * (options.indentSize || 2));
350
+ if (node.__type === 'task') {
351
+ const taskDef = node;
352
+ const status = taskDef.metadata?.['_originalStatus'] || 'pending';
353
+ const marker = options.includeStatus !== false ? STATUS_TO_MARKER[status] : ' ';
354
+ let prefix;
355
+ if (isSequential) {
356
+ // Use numbered list for sequential
357
+ const num = taskDef.metadata?.['_sequenceNumber'] || 1;
358
+ prefix = `${num}. [${marker}]`;
359
+ }
360
+ else {
361
+ // Use bullet for parallel
362
+ prefix = `- [${marker}]`;
363
+ }
364
+ let title = taskDef.title;
365
+ if (options.includePriority && taskDef.priority && taskDef.priority !== 'normal') {
366
+ const priorityMarker = taskDef.priority === 'critical'
367
+ ? '!!'
368
+ : taskDef.priority === 'urgent'
369
+ ? '!'
370
+ : taskDef.priority === 'high'
371
+ ? '^'
372
+ : taskDef.priority === 'low'
373
+ ? 'v'
374
+ : '';
375
+ title = `${priorityMarker}${title}`;
376
+ }
377
+ lines.push(`${indentStr}${prefix} ${title}`);
378
+ // Serialize subtasks
379
+ if (taskDef.subtasks && taskDef.subtasks.length > 0) {
380
+ for (const subtask of taskDef.subtasks) {
381
+ lines.push(...serializeTaskNode(subtask, indent + 1, options, false));
382
+ }
383
+ }
384
+ }
385
+ else if (node.__type === 'parallel') {
386
+ const group = node;
387
+ let seqNum = 1;
388
+ for (const child of group.tasks) {
389
+ if (child.__type === 'task') {
390
+ ;
391
+ child.metadata = {
392
+ ...child.metadata,
393
+ _sequenceNumber: seqNum++,
394
+ };
395
+ }
396
+ lines.push(...serializeTaskNode(child, indent, options, false));
397
+ }
398
+ }
399
+ else if (node.__type === 'sequential') {
400
+ const group = node;
401
+ let seqNum = 1;
402
+ for (const child of group.tasks) {
403
+ if (child.__type === 'task') {
404
+ ;
405
+ child.metadata = {
406
+ ...child.metadata,
407
+ _sequenceNumber: seqNum++,
408
+ };
409
+ }
410
+ lines.push(...serializeTaskNode(child, indent, options, true));
411
+ }
412
+ }
413
+ return lines;
414
+ }
415
+ /**
416
+ * Serialize a Project to markdown
417
+ *
418
+ * @example
419
+ * ```ts
420
+ * const project = createProject({
421
+ * name: 'My Project',
422
+ * tasks: [
423
+ * parallel(
424
+ * task('Task 1'),
425
+ * task('Task 2'),
426
+ * ),
427
+ * sequential(
428
+ * task('Step 1'),
429
+ * task('Step 2'),
430
+ * ),
431
+ * ],
432
+ * })
433
+ *
434
+ * const markdown = toMarkdown(project)
435
+ * // # My Project
436
+ * //
437
+ * // - [ ] Task 1
438
+ * // - [ ] Task 2
439
+ * //
440
+ * // 1. [ ] Step 1
441
+ * // 2. [ ] Step 2
442
+ * ```
443
+ */
444
+ export function toMarkdown(project, options = {}) {
445
+ const lines = [];
446
+ // Project title
447
+ lines.push(`# ${project.name}`);
448
+ lines.push('');
449
+ if (project.description) {
450
+ lines.push(project.description);
451
+ lines.push('');
452
+ }
453
+ // Tasks
454
+ for (const node of project.tasks) {
455
+ const taskLines = serializeTaskNode(node, 0, options, false);
456
+ lines.push(...taskLines);
457
+ // Add blank line between top-level groups
458
+ if (taskLines.length > 0) {
459
+ lines.push('');
460
+ }
461
+ }
462
+ return lines.join('\n').trim() + '\n';
463
+ }
464
+ // ============================================================================
465
+ // Conversion Utilities
466
+ // ============================================================================
467
+ /**
468
+ * Update task statuses in a project from markdown
469
+ * (Useful for syncing when markdown is edited externally)
470
+ */
471
+ export function syncStatusFromMarkdown(project, markdown) {
472
+ const parsed = parseMarkdown(markdown);
473
+ // Build a map of task titles to statuses from parsed markdown
474
+ const statusMap = new Map();
475
+ function collectStatuses(node) {
476
+ if (node.__type === 'task') {
477
+ const taskDef = node;
478
+ const status = taskDef.metadata?.['_originalStatus'];
479
+ if (status) {
480
+ statusMap.set(taskDef.title, status);
481
+ }
482
+ if (taskDef.subtasks) {
483
+ taskDef.subtasks.forEach(collectStatuses);
484
+ }
485
+ }
486
+ else if (node.__type === 'parallel' || node.__type === 'sequential') {
487
+ const group = node;
488
+ group.tasks.forEach(collectStatuses);
489
+ }
490
+ }
491
+ parsed.tasks.forEach(collectStatuses);
492
+ // Update statuses in original project
493
+ function updateStatuses(node) {
494
+ if (node.__type === 'task') {
495
+ const taskDef = node;
496
+ const newStatus = statusMap.get(taskDef.title);
497
+ const result = {
498
+ ...taskDef,
499
+ metadata: {
500
+ ...taskDef.metadata,
501
+ _originalStatus: newStatus || taskDef.metadata?.['_originalStatus'],
502
+ },
503
+ };
504
+ if (taskDef.subtasks) {
505
+ result.subtasks = taskDef.subtasks.map(updateStatuses);
506
+ }
507
+ return result;
508
+ }
509
+ else if (node.__type === 'parallel') {
510
+ const group = node;
511
+ return {
512
+ ...group,
513
+ tasks: group.tasks.map(updateStatuses),
514
+ };
515
+ }
516
+ else if (node.__type === 'sequential') {
517
+ const group = node;
518
+ return {
519
+ ...group,
520
+ tasks: group.tasks.map(updateStatuses),
521
+ };
522
+ }
523
+ return node;
524
+ }
525
+ return {
526
+ ...project,
527
+ tasks: project.tasks.map(updateStatuses),
528
+ updatedAt: new Date(),
529
+ };
530
+ }
531
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"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"}