task-o-matic 0.0.19 → 0.0.21

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.
Files changed (54) hide show
  1. package/dist/cli/display/task.d.ts +28 -2
  2. package/dist/cli/display/task.d.ts.map +1 -1
  3. package/dist/cli/display/task.js +27 -21
  4. package/dist/commands/benchmark.js +203 -173
  5. package/dist/commands/tasks/show.d.ts.map +1 -1
  6. package/dist/commands/tasks/show.js +21 -1
  7. package/dist/commands/tasks/tree.d.ts.map +1 -1
  8. package/dist/commands/tasks/tree.js +21 -1
  9. package/dist/commands/workflow.d.ts.map +1 -1
  10. package/dist/commands/workflow.js +59 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +3 -0
  13. package/dist/lib/ai-service/model-provider.d.ts +4 -0
  14. package/dist/lib/ai-service/model-provider.d.ts.map +1 -1
  15. package/dist/lib/ai-service/model-provider.js +21 -5
  16. package/dist/lib/ai-service/prd-operations.d.ts.map +1 -1
  17. package/dist/lib/ai-service/prd-operations.js +1 -4
  18. package/dist/lib/config.d.ts +8 -0
  19. package/dist/lib/config.d.ts.map +1 -1
  20. package/dist/lib/config.js +59 -23
  21. package/dist/lib/git-utils.d.ts +35 -0
  22. package/dist/lib/git-utils.d.ts.map +1 -1
  23. package/dist/lib/git-utils.js +81 -15
  24. package/dist/lib/hooks/logger.d.ts.map +1 -1
  25. package/dist/lib/hooks/logger.js +16 -0
  26. package/dist/lib/hooks.d.ts +10 -1
  27. package/dist/lib/hooks.d.ts.map +1 -1
  28. package/dist/lib/logger.d.ts +20 -0
  29. package/dist/lib/logger.d.ts.map +1 -0
  30. package/dist/lib/logger.js +32 -0
  31. package/dist/lib/provider-defaults.json +22 -0
  32. package/dist/lib/task-execution-core.d.ts.map +1 -1
  33. package/dist/lib/task-execution-core.js +29 -33
  34. package/dist/lib/task-loop-execution.d.ts.map +1 -1
  35. package/dist/lib/task-loop-execution.js +5 -1
  36. package/dist/lib/task-planning.d.ts.map +1 -1
  37. package/dist/lib/task-planning.js +9 -9
  38. package/dist/lib/task-review.d.ts.map +1 -1
  39. package/dist/lib/task-review.js +10 -13
  40. package/dist/lib/validation.d.ts.map +1 -1
  41. package/dist/lib/validation.js +12 -15
  42. package/dist/services/benchmark.d.ts +14 -0
  43. package/dist/services/benchmark.d.ts.map +1 -1
  44. package/dist/services/benchmark.js +325 -0
  45. package/dist/services/workflow.d.ts +12 -0
  46. package/dist/services/workflow.d.ts.map +1 -1
  47. package/dist/services/workflow.js +20 -0
  48. package/dist/types/index.d.ts +1 -0
  49. package/dist/types/index.d.ts.map +1 -1
  50. package/dist/types/workflow-options.d.ts +25 -0
  51. package/dist/types/workflow-options.d.ts.map +1 -1
  52. package/dist/utils/streaming-utils.d.ts.map +1 -1
  53. package/dist/utils/streaming-utils.js +4 -0
  54. package/package.json +1 -1
@@ -4,8 +4,30 @@ export interface TaskDisplayOptions {
4
4
  showSubtasks?: boolean;
5
5
  showMetadata?: boolean;
6
6
  }
7
+ /**
8
+ * Data object for displayTaskDetails - makes the function pure
9
+ */
10
+ export interface TaskDetailsData {
11
+ task: Task;
12
+ content?: string;
13
+ aiMetadata?: TaskAIMetadata;
14
+ subtasks?: Task[];
15
+ subtaskMetadata?: Map<string, TaskAIMetadata>;
16
+ }
17
+ /**
18
+ * Data object for displayTaskTree - makes the function pure
19
+ */
20
+ export interface TaskTreeData {
21
+ tasks: Task[];
22
+ subtasksMap: Map<string, Task[]>;
23
+ rootId?: string;
24
+ }
7
25
  export declare function displayTask(task: Task, options?: TaskDisplayOptions): Promise<void>;
8
- export declare function displayTaskDetails(task: Task): Promise<void>;
26
+ /**
27
+ * Display detailed task information.
28
+ * Pure function - accepts all data as arguments, no internal service calls.
29
+ */
30
+ export declare function displayTaskDetails(data: TaskDetailsData): void;
9
31
  export declare function displayTaskList(tasks: Task[]): void;
10
32
  export declare function displayCreatedTask(task: Task, aiMetadata?: TaskAIMetadata): void;
11
33
  export declare function displaySubtaskCreation(subtasks: Task[]): void;
@@ -14,5 +36,9 @@ export declare function displayTaskDelete(deleted: Task[], orphanedSubtasks: Tas
14
36
  export declare function displayTaskStatusChange(task: Task, oldStatus: string, newStatus: string): void;
15
37
  export declare function displayTagsUpdate(task: Task, addedTags: string[], removedTags: string[]): void;
16
38
  export declare function displayNextTask(task: Task, criteria: string): void;
17
- export declare function displayTaskTree(tasks: Task[], rootId?: string): Promise<void>;
39
+ /**
40
+ * Display hierarchical task tree.
41
+ * Pure function - accepts all data as arguments, no internal service calls.
42
+ */
43
+ export declare function displayTaskTree(data: TaskTreeData): void;
18
44
  //# sourceMappingURL=task.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../../src/cli/display/task.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGnD,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAsB,WAAW,CAC/B,IAAI,EAAE,IAAI,EACV,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAsBf;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CA6FlE;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAKnD;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,IAAI,EACV,UAAU,CAAC,EAAE,cAAc,GAC1B,IAAI,CAUN;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,CAS7D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,GAAG,IAAI,CAyBhE;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,IAAI,EAAE,EACf,gBAAgB,EAAE,IAAI,EAAE,GACvB,IAAI,CAeN;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,IAAI,CAaN;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,MAAM,EAAE,GACpB,IAAI,CAgBN;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAwBlE;AAED,wBAAsB,eAAe,CACnC,KAAK,EAAE,IAAI,EAAE,EACb,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,IAAI,CAAC,CA6Df"}
1
+ {"version":3,"file":"task.d.ts","sourceRoot":"","sources":["../../../src/cli/display/task.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,QAAQ,CAAC,EAAE,IAAI,EAAE,CAAC;IAClB,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;CAC/C;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,IAAI,EAAE,CAAC;IACd,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACjC,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,WAAW,CAC/B,IAAI,EAAE,IAAI,EACV,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,IAAI,CAAC,CAwBf;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CA8F9D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,IAAI,CAKnD;AAED,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,IAAI,EACV,UAAU,CAAC,EAAE,cAAc,GAC1B,IAAI,CAUN;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,CAS7D;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,GAAG,IAAI,CAyBhE;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,IAAI,EAAE,EACf,gBAAgB,EAAE,IAAI,EAAE,GACvB,IAAI,CAeN;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,GAChB,IAAI,CAaN;AAED,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,EAAE,EACnB,WAAW,EAAE,MAAM,EAAE,GACpB,IAAI,CAgBN;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAkClE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAmExD"}
@@ -15,7 +15,6 @@ exports.displayTagsUpdate = displayTagsUpdate;
15
15
  exports.displayNextTask = displayNextTask;
16
16
  exports.displayTaskTree = displayTaskTree;
17
17
  const chalk_1 = __importDefault(require("chalk"));
18
- const tasks_1 = require("../../services/tasks");
19
18
  async function displayTask(task, options = {}) {
20
19
  const { indent = "", showSubtasks = true, showMetadata = false } = options;
21
20
  const statusColor = task.status === "completed"
@@ -33,7 +32,12 @@ async function displayTask(task, options = {}) {
33
32
  }
34
33
  }
35
34
  }
36
- async function displayTaskDetails(task) {
35
+ /**
36
+ * Display detailed task information.
37
+ * Pure function - accepts all data as arguments, no internal service calls.
38
+ */
39
+ function displayTaskDetails(data) {
40
+ const { task, content, aiMetadata, subtasks = [], subtaskMetadata } = data;
37
41
  console.log(chalk_1.default.blue("Task Details:"));
38
42
  console.log(`${chalk_1.default.cyan("ID:")} ${task.id}`);
39
43
  console.log(`${chalk_1.default.cyan("Title:")} ${chalk_1.default.bold(task.title)}`);
@@ -41,12 +45,9 @@ async function displayTaskDetails(task) {
41
45
  if (task.description) {
42
46
  console.log(`${chalk_1.default.cyan("Description:")} ${task.description}`);
43
47
  }
44
- if (task.contentFile) {
45
- const fullContent = await tasks_1.taskService.getTaskContent(task.id);
46
- if (fullContent) {
47
- console.log(`${chalk_1.default.cyan("Full Content:")}`);
48
- console.log(fullContent);
49
- }
48
+ if (content) {
49
+ console.log(`${chalk_1.default.cyan("Full Content:")}`);
50
+ console.log(content);
50
51
  }
51
52
  if (task.estimatedEffort) {
52
53
  console.log(`${chalk_1.default.cyan("Estimated Effort:")} ${task.estimatedEffort}`);
@@ -54,7 +55,6 @@ async function displayTaskDetails(task) {
54
55
  if (task.tags && task.tags.length > 0) {
55
56
  console.log(`${chalk_1.default.cyan("Tags:")} ${task.tags.join(", ")}`);
56
57
  }
57
- const aiMetadata = await tasks_1.taskService.getTaskAIMetadata(task.id);
58
58
  if (aiMetadata?.aiGenerated) {
59
59
  console.log(`${chalk_1.default.magenta("šŸ¤– AI-generated")}`);
60
60
  if (aiMetadata.aiProvider) {
@@ -76,7 +76,6 @@ async function displayTaskDetails(task) {
76
76
  });
77
77
  });
78
78
  }
79
- const subtasks = await tasks_1.taskService.getSubtasks(task.id);
80
79
  if (subtasks.length > 0) {
81
80
  console.log(chalk_1.default.blue(`\nšŸ“‹ Subtasks (${subtasks.length}):`));
82
81
  for (let i = 0; i < subtasks.length; i++) {
@@ -93,8 +92,8 @@ async function displayTaskDetails(task) {
93
92
  if (subtask.estimatedEffort) {
94
93
  console.log(chalk_1.default.cyan(` Effort: ${subtask.estimatedEffort}`));
95
94
  }
96
- const subtaskAiMetadata = await tasks_1.taskService.getTaskAIMetadata(subtask.id);
97
- if (subtaskAiMetadata?.aiGenerated) {
95
+ const subtaskAiMeta = subtaskMetadata?.get(subtask.id);
96
+ if (subtaskAiMeta?.aiGenerated) {
98
97
  console.log(chalk_1.default.magenta(` šŸ¤– AI-generated`));
99
98
  }
100
99
  if (i < subtasks.length - 1)
@@ -185,9 +184,11 @@ function displayTagsUpdate(task, addedTags, removedTags) {
185
184
  function displayNextTask(task, criteria) {
186
185
  console.log(chalk_1.default.blue(`\nšŸŽÆ Next task (${criteria}):`));
187
186
  console.log(chalk_1.default.green(`āœ“ ${task.title} (${task.id})`));
188
- const statusColor = task.status === "completed" ? chalk_1.default.green :
189
- task.status === "in-progress" ? chalk_1.default.yellow :
190
- chalk_1.default.gray;
187
+ const statusColor = task.status === "completed"
188
+ ? chalk_1.default.green
189
+ : task.status === "in-progress"
190
+ ? chalk_1.default.yellow
191
+ : chalk_1.default.gray;
191
192
  console.log(statusColor(` Status: ${task.status}`));
192
193
  if (task.description) {
193
194
  console.log(chalk_1.default.cyan(` Description: ${task.description.substring(0, 100)}${task.description.length > 100 ? "..." : ""}`));
@@ -200,7 +201,12 @@ function displayNextTask(task, criteria) {
200
201
  }
201
202
  console.log(chalk_1.default.gray(` Created: ${new Date(task.createdAt).toLocaleString()}`));
202
203
  }
203
- async function displayTaskTree(tasks, rootId) {
204
+ /**
205
+ * Display hierarchical task tree.
206
+ * Pure function - accepts all data as arguments, no internal service calls.
207
+ */
208
+ function displayTaskTree(data) {
209
+ const { tasks, subtasksMap, rootId } = data;
204
210
  if (tasks.length === 0) {
205
211
  console.log(chalk_1.default.yellow("No tasks found."));
206
212
  return;
@@ -211,14 +217,14 @@ async function displayTaskTree(tasks, rootId) {
211
217
  else {
212
218
  console.log(chalk_1.default.blue(`\n🌳 Complete Task Tree:`));
213
219
  }
214
- const displayTaskWithIndent = async (task, indent = "", isLast = false) => {
220
+ const displayTaskWithIndent = (task, indent = "", isLast = false) => {
215
221
  const statusColor = task.status === "completed"
216
222
  ? chalk_1.default.green
217
223
  : task.status === "in-progress"
218
224
  ? chalk_1.default.yellow
219
225
  : chalk_1.default.gray;
220
226
  const connector = isLast ? "└── " : "ā”œā”€ā”€ ";
221
- const subtasks = await tasks_1.taskService.getSubtasks(task.id);
227
+ const subtasks = subtasksMap.get(task.id) || [];
222
228
  const hasSubtasks = subtasks.length > 0;
223
229
  console.log(`${indent}${connector}${statusColor(`[${task.status}]`)} ${chalk_1.default.bold(task.title)} ${chalk_1.default.gray(`(${task.id})`)}`);
224
230
  if (task.tags && task.tags.length > 0) {
@@ -228,7 +234,7 @@ async function displayTaskTree(tasks, rootId) {
228
234
  const subtaskIndent = indent + (isLast ? " " : "│ ");
229
235
  for (let i = 0; i < subtasks.length; i++) {
230
236
  const isLastSubtask = i === subtasks.length - 1;
231
- await displayTaskWithIndent(subtasks[i], subtaskIndent, isLastSubtask);
237
+ displayTaskWithIndent(subtasks[i], subtaskIndent, isLastSubtask);
232
238
  }
233
239
  }
234
240
  };
@@ -236,7 +242,7 @@ async function displayTaskTree(tasks, rootId) {
236
242
  if (rootId) {
237
243
  const rootTask = tasks.find((t) => t.id === rootId);
238
244
  if (rootTask) {
239
- await displayTaskWithIndent(rootTask, "", true);
245
+ displayTaskWithIndent(rootTask, "", true);
240
246
  }
241
247
  }
242
248
  else {
@@ -244,7 +250,7 @@ async function displayTaskTree(tasks, rootId) {
244
250
  const topLevelTasks = tasks.filter((task) => !task.parentId);
245
251
  for (let i = 0; i < topLevelTasks.length; i++) {
246
252
  const isLast = i === topLevelTasks.length - 1;
247
- await displayTaskWithIndent(topLevelTasks[i], "", isLast);
253
+ displayTaskWithIndent(topLevelTasks[i], "", isLast);
248
254
  }
249
255
  }
250
256
  }