digital-tasks 2.0.1

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,259 @@
1
+ /**
2
+ * Project Management - Task workflows, dependencies, and execution modes
3
+ *
4
+ * Provides project management primitives for organizing tasks:
5
+ * - Projects/TaskLists as containers
6
+ * - Parallel vs Sequential execution
7
+ * - Dependencies and dependants (bidirectional)
8
+ * - Subtasks with inheritance
9
+ *
10
+ * ## Execution Modes
11
+ *
12
+ * Tasks can be organized for parallel or sequential execution:
13
+ *
14
+ * ```ts
15
+ * // Parallel - all can run simultaneously
16
+ * parallel(
17
+ * task('Design UI'),
18
+ * task('Write API specs'),
19
+ * task('Set up infrastructure'),
20
+ * )
21
+ *
22
+ * // Sequential - must run in order
23
+ * sequential(
24
+ * task('Implement backend'),
25
+ * task('Implement frontend'),
26
+ * task('Integration testing'),
27
+ * )
28
+ * ```
29
+ *
30
+ * ## Markdown Syntax
31
+ *
32
+ * Tasks map to markdown checklists:
33
+ * - `- [ ]` = Parallel/unordered tasks
34
+ * - `1. [ ]` = Sequential/ordered tasks
35
+ *
36
+ * @packageDocumentation
37
+ */
38
+ import type { AnyTask, TaskPriority, WorkerRef } from './types.js';
39
+ /**
40
+ * How tasks should be executed relative to each other
41
+ */
42
+ export type ExecutionMode = 'parallel' | 'sequential';
43
+ /**
44
+ * Task node in a workflow - can be a single task or a group
45
+ */
46
+ export type TaskNode = TaskDefinition | ParallelGroup | SequentialGroup;
47
+ /**
48
+ * Function type for the DSL
49
+ */
50
+ export type FunctionType = 'code' | 'generative' | 'agentic' | 'human';
51
+ /**
52
+ * A single task definition
53
+ */
54
+ export interface TaskDefinition {
55
+ __type: 'task';
56
+ title: string;
57
+ description?: string;
58
+ functionType?: FunctionType;
59
+ priority?: TaskPriority;
60
+ assignTo?: WorkerRef;
61
+ tags?: string[];
62
+ subtasks?: TaskNode[];
63
+ metadata?: Record<string, unknown>;
64
+ }
65
+ /**
66
+ * A group of tasks that can run in parallel
67
+ */
68
+ export interface ParallelGroup {
69
+ __type: 'parallel';
70
+ tasks: TaskNode[];
71
+ }
72
+ /**
73
+ * A group of tasks that must run sequentially
74
+ */
75
+ export interface SequentialGroup {
76
+ __type: 'sequential';
77
+ tasks: TaskNode[];
78
+ }
79
+ /**
80
+ * Project status
81
+ */
82
+ export type ProjectStatus = 'draft' | 'active' | 'paused' | 'completed' | 'cancelled';
83
+ /**
84
+ * Project definition
85
+ */
86
+ export interface Project {
87
+ /** Unique project ID */
88
+ id: string;
89
+ /** Project name */
90
+ name: string;
91
+ /** Project description */
92
+ description?: string;
93
+ /** Project status */
94
+ status: ProjectStatus;
95
+ /** Root task nodes */
96
+ tasks: TaskNode[];
97
+ /** Default execution mode for top-level tasks */
98
+ defaultMode?: ExecutionMode;
99
+ /** Project owner */
100
+ owner?: WorkerRef;
101
+ /** Project tags */
102
+ tags?: string[];
103
+ /** Created timestamp */
104
+ createdAt: Date;
105
+ /** Updated timestamp */
106
+ updatedAt: Date;
107
+ /** Project metadata */
108
+ metadata?: Record<string, unknown>;
109
+ }
110
+ /**
111
+ * Options for creating a project
112
+ */
113
+ export interface CreateProjectOptions {
114
+ name: string;
115
+ description?: string;
116
+ tasks?: TaskNode[];
117
+ defaultMode?: ExecutionMode;
118
+ owner?: WorkerRef;
119
+ tags?: string[];
120
+ metadata?: Record<string, unknown>;
121
+ }
122
+ /**
123
+ * Create a task definition
124
+ *
125
+ * @example
126
+ * ```ts
127
+ * task('Implement feature')
128
+ * task('Review PR', { priority: 'high', assignTo: { type: 'human', id: 'user_123' } })
129
+ * task('Parent task', {
130
+ * subtasks: [
131
+ * task('Subtask 1'),
132
+ * task('Subtask 2'),
133
+ * ]
134
+ * })
135
+ * ```
136
+ */
137
+ export declare function task(title: string, options?: Partial<Omit<TaskDefinition, '__type' | 'title'>>): TaskDefinition;
138
+ /**
139
+ * Create a group of tasks that can run in parallel
140
+ *
141
+ * @example
142
+ * ```ts
143
+ * parallel(
144
+ * task('Design UI'),
145
+ * task('Write API specs'),
146
+ * task('Set up infrastructure'),
147
+ * )
148
+ * ```
149
+ */
150
+ export declare function parallel(...tasks: TaskNode[]): ParallelGroup;
151
+ /**
152
+ * Create a group of tasks that must run sequentially
153
+ *
154
+ * @example
155
+ * ```ts
156
+ * sequential(
157
+ * task('Implement backend'),
158
+ * task('Implement frontend'),
159
+ * task('Integration testing'),
160
+ * )
161
+ * ```
162
+ */
163
+ export declare function sequential(...tasks: TaskNode[]): SequentialGroup;
164
+ /**
165
+ * Create a new project
166
+ *
167
+ * @example
168
+ * ```ts
169
+ * const project = createProject({
170
+ * name: 'Launch New Feature',
171
+ * description: 'Ship the new dashboard feature',
172
+ * tasks: [
173
+ * parallel(
174
+ * task('Design mockups'),
175
+ * task('Write technical spec'),
176
+ * ),
177
+ * sequential(
178
+ * task('Implement backend API'),
179
+ * task('Implement frontend UI'),
180
+ * task('Write tests'),
181
+ * task('Deploy to staging'),
182
+ * ),
183
+ * task('QA testing'),
184
+ * task('Deploy to production'),
185
+ * ],
186
+ * })
187
+ * ```
188
+ */
189
+ export declare function createProject(options: CreateProjectOptions): Project;
190
+ /**
191
+ * Workflow builder for fluent task definition
192
+ *
193
+ * @example
194
+ * ```ts
195
+ * const workflow = workflow('Feature Launch')
196
+ * .parallel(
197
+ * task('Design'),
198
+ * task('Spec'),
199
+ * )
200
+ * .then(task('Implement'))
201
+ * .then(task('Test'))
202
+ * .parallel(
203
+ * task('Deploy staging'),
204
+ * task('Update docs'),
205
+ * )
206
+ * .then(task('Deploy production'))
207
+ * .build()
208
+ * ```
209
+ */
210
+ export declare function workflow(name: string, description?: string): {
211
+ /**
212
+ * Add tasks that can run in parallel
213
+ */
214
+ parallel(...nodes: TaskNode[]): /*elided*/ any;
215
+ /**
216
+ * Add tasks that must run sequentially
217
+ */
218
+ sequential(...nodes: TaskNode[]): /*elided*/ any;
219
+ /**
220
+ * Add a single task (sequential with previous)
221
+ */
222
+ then(...nodes: TaskNode[]): /*elided*/ any;
223
+ /**
224
+ * Add a task (alias for then)
225
+ */
226
+ task(title: string, options?: Partial<Omit<TaskDefinition, "__type" | "title">>): /*elided*/ any;
227
+ /**
228
+ * Build the project
229
+ */
230
+ build(options?: Partial<Omit<CreateProjectOptions, "name" | "tasks">>): Project;
231
+ };
232
+ /**
233
+ * Flatten task nodes into actual Task objects with dependencies
234
+ */
235
+ export declare function materializeProject(project: Project): Promise<{
236
+ project: Project;
237
+ tasks: AnyTask[];
238
+ }>;
239
+ /**
240
+ * Get all tasks that depend on a given task (dependants)
241
+ */
242
+ export declare function getDependants(taskId: string, allTasks: AnyTask[]): AnyTask[];
243
+ /**
244
+ * Get all tasks that a given task depends on (dependencies)
245
+ */
246
+ export declare function getDependencies(task: AnyTask, allTasks: AnyTask[]): AnyTask[];
247
+ /**
248
+ * Get tasks that are ready to execute (no unsatisfied dependencies)
249
+ */
250
+ export declare function getReadyTasks(allTasks: AnyTask[]): AnyTask[];
251
+ /**
252
+ * Check if a task graph has cycles
253
+ */
254
+ export declare function hasCycles(allTasks: AnyTask[]): boolean;
255
+ /**
256
+ * Sort tasks by their dependencies (tasks with no dependencies first)
257
+ */
258
+ export declare function sortTasks(allTasks: AnyTask[]): AnyTask[];
259
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,397 @@
1
+ /**
2
+ * Project Management - Task workflows, dependencies, and execution modes
3
+ *
4
+ * Provides project management primitives for organizing tasks:
5
+ * - Projects/TaskLists as containers
6
+ * - Parallel vs Sequential execution
7
+ * - Dependencies and dependants (bidirectional)
8
+ * - Subtasks with inheritance
9
+ *
10
+ * ## Execution Modes
11
+ *
12
+ * Tasks can be organized for parallel or sequential execution:
13
+ *
14
+ * ```ts
15
+ * // Parallel - all can run simultaneously
16
+ * parallel(
17
+ * task('Design UI'),
18
+ * task('Write API specs'),
19
+ * task('Set up infrastructure'),
20
+ * )
21
+ *
22
+ * // Sequential - must run in order
23
+ * sequential(
24
+ * task('Implement backend'),
25
+ * task('Implement frontend'),
26
+ * task('Integration testing'),
27
+ * )
28
+ * ```
29
+ *
30
+ * ## Markdown Syntax
31
+ *
32
+ * Tasks map to markdown checklists:
33
+ * - `- [ ]` = Parallel/unordered tasks
34
+ * - `1. [ ]` = Sequential/ordered tasks
35
+ *
36
+ * @packageDocumentation
37
+ */
38
+ import { createTask as createBaseTask } from './task.js';
39
+ // ============================================================================
40
+ // Task DSL Functions
41
+ // ============================================================================
42
+ /**
43
+ * Create a task definition
44
+ *
45
+ * @example
46
+ * ```ts
47
+ * task('Implement feature')
48
+ * task('Review PR', { priority: 'high', assignTo: { type: 'human', id: 'user_123' } })
49
+ * task('Parent task', {
50
+ * subtasks: [
51
+ * task('Subtask 1'),
52
+ * task('Subtask 2'),
53
+ * ]
54
+ * })
55
+ * ```
56
+ */
57
+ export function task(title, options) {
58
+ return {
59
+ __type: 'task',
60
+ title,
61
+ ...options,
62
+ };
63
+ }
64
+ /**
65
+ * Create a group of tasks that can run in parallel
66
+ *
67
+ * @example
68
+ * ```ts
69
+ * parallel(
70
+ * task('Design UI'),
71
+ * task('Write API specs'),
72
+ * task('Set up infrastructure'),
73
+ * )
74
+ * ```
75
+ */
76
+ export function parallel(...tasks) {
77
+ return {
78
+ __type: 'parallel',
79
+ tasks,
80
+ };
81
+ }
82
+ /**
83
+ * Create a group of tasks that must run sequentially
84
+ *
85
+ * @example
86
+ * ```ts
87
+ * sequential(
88
+ * task('Implement backend'),
89
+ * task('Implement frontend'),
90
+ * task('Integration testing'),
91
+ * )
92
+ * ```
93
+ */
94
+ export function sequential(...tasks) {
95
+ return {
96
+ __type: 'sequential',
97
+ tasks,
98
+ };
99
+ }
100
+ // ============================================================================
101
+ // Project DSL Functions
102
+ // ============================================================================
103
+ /**
104
+ * Generate a unique project ID
105
+ */
106
+ function generateProjectId() {
107
+ return `proj_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`;
108
+ }
109
+ /**
110
+ * Create a new project
111
+ *
112
+ * @example
113
+ * ```ts
114
+ * const project = createProject({
115
+ * name: 'Launch New Feature',
116
+ * description: 'Ship the new dashboard feature',
117
+ * tasks: [
118
+ * parallel(
119
+ * task('Design mockups'),
120
+ * task('Write technical spec'),
121
+ * ),
122
+ * sequential(
123
+ * task('Implement backend API'),
124
+ * task('Implement frontend UI'),
125
+ * task('Write tests'),
126
+ * task('Deploy to staging'),
127
+ * ),
128
+ * task('QA testing'),
129
+ * task('Deploy to production'),
130
+ * ],
131
+ * })
132
+ * ```
133
+ */
134
+ export function createProject(options) {
135
+ const now = new Date();
136
+ return {
137
+ id: generateProjectId(),
138
+ name: options.name,
139
+ description: options.description,
140
+ status: 'draft',
141
+ tasks: options.tasks || [],
142
+ defaultMode: options.defaultMode || 'sequential',
143
+ owner: options.owner,
144
+ tags: options.tags,
145
+ createdAt: now,
146
+ updatedAt: now,
147
+ metadata: options.metadata,
148
+ };
149
+ }
150
+ // ============================================================================
151
+ // Workflow Builder (Fluent API)
152
+ // ============================================================================
153
+ /**
154
+ * Workflow builder for fluent task definition
155
+ *
156
+ * @example
157
+ * ```ts
158
+ * const workflow = workflow('Feature Launch')
159
+ * .parallel(
160
+ * task('Design'),
161
+ * task('Spec'),
162
+ * )
163
+ * .then(task('Implement'))
164
+ * .then(task('Test'))
165
+ * .parallel(
166
+ * task('Deploy staging'),
167
+ * task('Update docs'),
168
+ * )
169
+ * .then(task('Deploy production'))
170
+ * .build()
171
+ * ```
172
+ */
173
+ export function workflow(name, description) {
174
+ const tasks = [];
175
+ const builder = {
176
+ /**
177
+ * Add tasks that can run in parallel
178
+ */
179
+ parallel(...nodes) {
180
+ tasks.push(parallel(...nodes));
181
+ return builder;
182
+ },
183
+ /**
184
+ * Add tasks that must run sequentially
185
+ */
186
+ sequential(...nodes) {
187
+ tasks.push(sequential(...nodes));
188
+ return builder;
189
+ },
190
+ /**
191
+ * Add a single task (sequential with previous)
192
+ */
193
+ then(...nodes) {
194
+ if (nodes.length === 1) {
195
+ tasks.push(nodes[0]);
196
+ }
197
+ else {
198
+ tasks.push(sequential(...nodes));
199
+ }
200
+ return builder;
201
+ },
202
+ /**
203
+ * Add a task (alias for then)
204
+ */
205
+ task(title, options) {
206
+ tasks.push(task(title, options));
207
+ return builder;
208
+ },
209
+ /**
210
+ * Build the project
211
+ */
212
+ build(options) {
213
+ return createProject({
214
+ name,
215
+ description,
216
+ tasks,
217
+ ...options,
218
+ });
219
+ },
220
+ };
221
+ return builder;
222
+ }
223
+ // ============================================================================
224
+ // Task Materialization
225
+ // ============================================================================
226
+ /**
227
+ * Flatten task nodes into actual Task objects with dependencies
228
+ */
229
+ export async function materializeProject(project) {
230
+ const tasks = [];
231
+ let taskIndex = 0;
232
+ async function processNode(node, parentId, previousIds = [], mode = 'sequential') {
233
+ if (node.__type === 'task') {
234
+ const taskDef = node;
235
+ const taskId = `${project.id}_task_${taskIndex++}`;
236
+ // Create dependencies based on mode (as string array for CreateTaskOptions)
237
+ const dependencies = mode === 'sequential' && previousIds.length > 0
238
+ ? previousIds
239
+ : undefined;
240
+ // Create a FunctionDefinition from the task definition
241
+ // Default to generative function type for DSL tasks
242
+ const functionDef = {
243
+ type: taskDef.functionType || 'generative',
244
+ name: taskDef.title,
245
+ description: taskDef.description,
246
+ args: {},
247
+ output: 'string',
248
+ };
249
+ const newTask = await createBaseTask({
250
+ function: functionDef,
251
+ priority: taskDef.priority || 'normal',
252
+ assignTo: taskDef.assignTo,
253
+ tags: taskDef.tags,
254
+ parentId,
255
+ projectId: project.id,
256
+ dependencies,
257
+ metadata: {
258
+ ...taskDef.metadata,
259
+ _taskNodeIndex: taskIndex - 1,
260
+ },
261
+ });
262
+ newTask.id = taskId;
263
+ tasks.push(newTask);
264
+ // Process subtasks
265
+ if (taskDef.subtasks && taskDef.subtasks.length > 0) {
266
+ let subtaskPrevIds = [];
267
+ for (const subtask of taskDef.subtasks) {
268
+ subtaskPrevIds = await processNode(subtask, taskId, subtaskPrevIds, 'sequential');
269
+ }
270
+ }
271
+ return [taskId];
272
+ }
273
+ if (node.__type === 'parallel') {
274
+ const group = node;
275
+ const allIds = [];
276
+ // All tasks in parallel group can start simultaneously
277
+ // They don't depend on each other, only on previousIds
278
+ for (const child of group.tasks) {
279
+ const childIds = await processNode(child, parentId, previousIds, 'parallel');
280
+ allIds.push(...childIds);
281
+ }
282
+ return allIds;
283
+ }
284
+ if (node.__type === 'sequential') {
285
+ const group = node;
286
+ let currentPrevIds = previousIds;
287
+ // Each task depends on the previous one
288
+ for (const child of group.tasks) {
289
+ currentPrevIds = await processNode(child, parentId, currentPrevIds, 'sequential');
290
+ }
291
+ return currentPrevIds;
292
+ }
293
+ return [];
294
+ }
295
+ // Process all root-level tasks
296
+ let previousIds = [];
297
+ for (const node of project.tasks) {
298
+ previousIds = await processNode(node, undefined, previousIds, project.defaultMode || 'sequential');
299
+ }
300
+ return { project, tasks };
301
+ }
302
+ // ============================================================================
303
+ // Dependency Graph Utilities
304
+ // ============================================================================
305
+ /**
306
+ * Get all tasks that depend on a given task (dependants)
307
+ */
308
+ export function getDependants(taskId, allTasks) {
309
+ return allTasks.filter(t => t.dependencies?.some(d => d.taskId === taskId && d.type === 'blocked_by'));
310
+ }
311
+ /**
312
+ * Get all tasks that a given task depends on (dependencies)
313
+ */
314
+ export function getDependencies(task, allTasks) {
315
+ if (!task.dependencies)
316
+ return [];
317
+ const depIds = task.dependencies
318
+ .filter(d => d.type === 'blocked_by')
319
+ .map(d => d.taskId);
320
+ return allTasks.filter(t => depIds.includes(t.id));
321
+ }
322
+ /**
323
+ * Get tasks that are ready to execute (no unsatisfied dependencies)
324
+ */
325
+ export function getReadyTasks(allTasks) {
326
+ return allTasks.filter(t => {
327
+ if (t.status !== 'queued' && t.status !== 'pending')
328
+ return false;
329
+ if (!t.dependencies || t.dependencies.length === 0)
330
+ return true;
331
+ return t.dependencies
332
+ .filter(d => d.type === 'blocked_by')
333
+ .every(d => d.satisfied);
334
+ });
335
+ }
336
+ /**
337
+ * Check if a task graph has cycles
338
+ */
339
+ export function hasCycles(allTasks) {
340
+ const visited = new Set();
341
+ const recStack = new Set();
342
+ function dfs(taskId) {
343
+ visited.add(taskId);
344
+ recStack.add(taskId);
345
+ const task = allTasks.find(t => t.id === taskId);
346
+ if (task?.dependencies) {
347
+ for (const dep of task.dependencies) {
348
+ if (dep.type === 'blocked_by') {
349
+ if (!visited.has(dep.taskId)) {
350
+ if (dfs(dep.taskId))
351
+ return true;
352
+ }
353
+ else if (recStack.has(dep.taskId)) {
354
+ return true;
355
+ }
356
+ }
357
+ }
358
+ }
359
+ recStack.delete(taskId);
360
+ return false;
361
+ }
362
+ for (const task of allTasks) {
363
+ if (!visited.has(task.id)) {
364
+ if (dfs(task.id))
365
+ return true;
366
+ }
367
+ }
368
+ return false;
369
+ }
370
+ /**
371
+ * Sort tasks by their dependencies (tasks with no dependencies first)
372
+ */
373
+ export function sortTasks(allTasks) {
374
+ const result = [];
375
+ const visited = new Set();
376
+ function visit(task) {
377
+ if (visited.has(task.id))
378
+ return;
379
+ visited.add(task.id);
380
+ // Visit dependencies first
381
+ if (task.dependencies) {
382
+ for (const dep of task.dependencies) {
383
+ if (dep.type === 'blocked_by') {
384
+ const depTask = allTasks.find(t => t.id === dep.taskId);
385
+ if (depTask)
386
+ visit(depTask);
387
+ }
388
+ }
389
+ }
390
+ result.push(task);
391
+ }
392
+ for (const task of allTasks) {
393
+ visit(task);
394
+ }
395
+ return result;
396
+ }
397
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../src/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Task Queue - In-memory task queue implementation
3
+ *
4
+ * Provides task queuing, assignment, and execution management.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ import type { TaskQueue, TaskQueueOptions } from './types.js';
9
+ /**
10
+ * Global task queue instance
11
+ */
12
+ export declare const taskQueue: TaskQueue;
13
+ /**
14
+ * Create a new task queue instance
15
+ */
16
+ export declare function createTaskQueue(options?: TaskQueueOptions): TaskQueue;
17
+ //# sourceMappingURL=queue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue.d.ts","sourceRoot":"","sources":["../src/queue.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAEV,SAAS,EACT,gBAAgB,EASjB,MAAM,YAAY,CAAA;AAyYnB;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,SAAmC,CAAA;AAE3D;;GAEG;AACH,wBAAgB,eAAe,CAAC,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAErE"}