task-o-matic 0.0.1 → 0.0.3

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 (38) hide show
  1. package/dist/commands/prd.js +4 -0
  2. package/dist/commands/prompt.d.ts.map +1 -1
  3. package/dist/commands/prompt.js +69 -61
  4. package/dist/commands/tasks.js +93 -1
  5. package/dist/lib/ai-service/ai-operations.d.ts +5 -3
  6. package/dist/lib/ai-service/ai-operations.d.ts.map +1 -1
  7. package/dist/lib/ai-service/ai-operations.js +189 -20
  8. package/dist/lib/ai-service/filesystem-tools.d.ts +69 -0
  9. package/dist/lib/ai-service/filesystem-tools.d.ts.map +1 -0
  10. package/dist/lib/ai-service/filesystem-tools.js +70 -0
  11. package/dist/lib/ai-service/json-parser.d.ts +13 -0
  12. package/dist/lib/ai-service/json-parser.d.ts.map +1 -1
  13. package/dist/lib/ai-service/json-parser.js +66 -5
  14. package/dist/lib/executors/claude-code-executor.d.ts +6 -0
  15. package/dist/lib/executors/claude-code-executor.d.ts.map +1 -0
  16. package/dist/lib/executors/claude-code-executor.js +41 -0
  17. package/dist/lib/executors/codex-executor.d.ts +6 -0
  18. package/dist/lib/executors/codex-executor.d.ts.map +1 -0
  19. package/dist/lib/executors/codex-executor.js +41 -0
  20. package/dist/lib/executors/executor-factory.d.ts.map +1 -1
  21. package/dist/lib/executors/executor-factory.js +6 -3
  22. package/dist/lib/executors/gemini-executor.d.ts +6 -0
  23. package/dist/lib/executors/gemini-executor.d.ts.map +1 -0
  24. package/dist/lib/executors/gemini-executor.js +41 -0
  25. package/dist/lib/executors/opencode-executor.d.ts.map +1 -1
  26. package/dist/lib/executors/opencode-executor.js +2 -3
  27. package/dist/lib/prompt-builder.d.ts +8 -0
  28. package/dist/lib/prompt-builder.d.ts.map +1 -1
  29. package/dist/lib/prompt-builder.js +98 -0
  30. package/dist/lib/task-execution.d.ts.map +1 -1
  31. package/dist/lib/task-execution.js +44 -14
  32. package/dist/services/prd.d.ts +2 -0
  33. package/dist/services/prd.d.ts.map +1 -1
  34. package/dist/services/prd.js +4 -4
  35. package/dist/services/tasks.d.ts +10 -1
  36. package/dist/services/tasks.d.ts.map +1 -1
  37. package/dist/services/tasks.js +97 -2
  38. package/package.json +1 -1
@@ -7,6 +7,7 @@ exports.executeTask = executeTask;
7
7
  const tasks_1 = require("../services/tasks");
8
8
  const executor_factory_1 = require("./executors/executor-factory");
9
9
  const validation_1 = require("./validation");
10
+ const context_builder_1 = require("./context-builder");
10
11
  const chalk_1 = __importDefault(require("chalk"));
11
12
  async function executeSingleTask(taskId, tool, dry) {
12
13
  // Load task
@@ -15,19 +16,54 @@ async function executeSingleTask(taskId, tool, dry) {
15
16
  throw new Error(`Task with ID ${taskId} not found`);
16
17
  }
17
18
  console.log(chalk_1.default.blue(`🎯 ${dry ? "DRY RUN" : "Executing"} task: ${task.title} (${taskId})`));
18
- // Build execution message
19
- let executionMessage;
19
+ // Build comprehensive execution message with full context
20
+ const contextBuilder = new context_builder_1.ContextBuilder();
21
+ const taskContext = await contextBuilder.buildContext(taskId);
22
+ // Build execution message with ALL context
23
+ const messageParts = [];
24
+ // Add task plan if available
20
25
  const planData = await tasks_1.taskService.getTaskPlan(taskId);
21
26
  if (planData) {
22
- executionMessage = `Execute this task plan:\n\n${planData.plan}`;
27
+ messageParts.push(`# Task Plan\n\n${planData.plan}\n`);
23
28
  }
24
29
  else {
25
- executionMessage = `Execute this task: ${task.title}\n\nDescription: ${task.description || "No description"}`;
30
+ messageParts.push(`# Task: ${task.title}\n\n${task.description || "No description"}\n`);
26
31
  }
32
+ // Add PRD context if available
33
+ if (taskContext.prdContent) {
34
+ messageParts.push(`\n# Product Requirements Document\n\n${taskContext.prdContent}\n`);
35
+ }
36
+ // Add stack/technology context
37
+ if (taskContext.stack) {
38
+ messageParts.push(`\n# Technology Stack\n\n`);
39
+ messageParts.push(`- **Project**: ${taskContext.stack.projectName}\n`);
40
+ messageParts.push(`- **Frontend**: ${taskContext.stack.frontend}\n`);
41
+ messageParts.push(`- **Backend**: ${taskContext.stack.backend}\n`);
42
+ if (taskContext.stack.database !== "none") {
43
+ messageParts.push(`- **Database**: ${taskContext.stack.database}\n`);
44
+ }
45
+ if (taskContext.stack.orm !== "none") {
46
+ messageParts.push(`- **ORM**: ${taskContext.stack.orm}\n`);
47
+ }
48
+ messageParts.push(`- **Auth**: ${taskContext.stack.auth}\n`);
49
+ if (taskContext.stack.addons.length > 0) {
50
+ messageParts.push(`- **Addons**: ${taskContext.stack.addons.join(", ")}\n`);
51
+ }
52
+ messageParts.push(`- **Package Manager**: ${taskContext.stack.packageManager}\n`);
53
+ }
54
+ // Add documentation context if available
55
+ if (taskContext.documentation) {
56
+ messageParts.push(`\n# Documentation Context\n\n`);
57
+ messageParts.push(`${taskContext.documentation.recap}\n`);
58
+ if (taskContext.documentation.files.length > 0) {
59
+ messageParts.push(`\n**Relevant Documentation Files**:\n`);
60
+ taskContext.documentation.files.forEach((file) => {
61
+ messageParts.push(`- ${file.path}\n`);
62
+ });
63
+ }
64
+ }
65
+ const executionMessage = messageParts.join('');
27
66
  if (!dry) {
28
- // console.log(chalk.yellow(`📝 Message that would be sent:`));
29
- // console.log(chalk.cyan(executionMessage));
30
- // } else {
31
67
  // Update task status to in-progress
32
68
  await tasks_1.taskService.setTaskStatus(taskId, "in-progress");
33
69
  console.log(chalk_1.default.yellow("⏳ Task status updated to in-progress"));
@@ -35,7 +71,6 @@ async function executeSingleTask(taskId, tool, dry) {
35
71
  try {
36
72
  // Create executor and run
37
73
  const executor = executor_factory_1.ExecutorFactory.create(tool);
38
- console.log(chalk_1.default.cyan(`🔧 Using executor: ${executor.name}`));
39
74
  await executor.execute(executionMessage, dry);
40
75
  if (!dry) {
41
76
  // Update task status to completed
@@ -95,17 +130,12 @@ async function executeTask(options) {
95
130
  throw new Error(`Task with ID ${taskId} not found`);
96
131
  }
97
132
  console.log(chalk_1.default.blue(`🎯 ${dry ? "DRY RUN - Would execute" : "Executing"} task with custom message: ${task.title} (${taskId})`));
98
- if (dry) {
99
- console.log(chalk_1.default.yellow(`📝 Custom message that would be sent:`));
100
- console.log(chalk_1.default.cyan(message));
101
- }
102
- else {
133
+ if (!dry) {
103
134
  await tasks_1.taskService.setTaskStatus(taskId, "in-progress");
104
135
  console.log(chalk_1.default.yellow("⏳ Task status updated to in-progress"));
105
136
  }
106
137
  try {
107
138
  const executor = executor_factory_1.ExecutorFactory.create(tool);
108
- console.log(chalk_1.default.cyan(`🔧 Using executor: ${executor.name}`));
109
139
  await executor.execute(message, dry);
110
140
  if (!dry) {
111
141
  await tasks_1.taskService.setTaskStatus(taskId, "completed");
@@ -10,6 +10,7 @@ export declare class PRDService {
10
10
  parsePRD(input: {
11
11
  file: string;
12
12
  workingDirectory?: string;
13
+ enableFilesystemTools?: boolean;
13
14
  aiOptions?: AIOptions;
14
15
  promptOverride?: string;
15
16
  messageOverride?: string;
@@ -21,6 +22,7 @@ export declare class PRDService {
21
22
  feedback: string;
22
23
  output?: string;
23
24
  workingDirectory?: string;
25
+ enableFilesystemTools?: boolean;
24
26
  aiOptions?: AIOptions;
25
27
  promptOverride?: string;
26
28
  messageOverride?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"prd.d.ts","sourceRoot":"","sources":["../../src/services/prd.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAY,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;;GAGG;AACH,qBAAa,UAAU;IAEf,QAAQ,CAAC,KAAK,EAAE;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;QACpC,SAAS,CAAC,EAAE,gBAAgB,CAAC;KAC9B,GAAG,OAAO,CAAC,cAAc,CAAC;IA+KrB,SAAS,CAAC,KAAK,EAAE;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;QACpC,SAAS,CAAC,EAAE,gBAAgB,CAAC;KAC9B,GAAG,OAAO,CAAC,MAAM,CAAC;CA4DpB;AAGD,eAAO,MAAM,UAAU,YAAmB,CAAC"}
1
+ {"version":3,"file":"prd.d.ts","sourceRoot":"","sources":["../../src/services/prd.ts"],"names":[],"mappings":"AAGA,OAAO,EAAiB,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EAAY,gBAAgB,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAGlD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;;GAGG;AACH,qBAAa,UAAU;IAEf,QAAQ,CAAC,KAAK,EAAE;QACpB,IAAI,EAAE,MAAM,CAAC;QACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,qBAAqB,CAAC,EAAE,OAAO,CAAC;QAChC,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;QACpC,SAAS,CAAC,EAAE,gBAAgB,CAAC;KAC9B,GAAG,OAAO,CAAC,cAAc,CAAC;IAgLrB,SAAS,CAAC,KAAK,EAAE;QACrB,IAAI,EAAE,MAAM,CAAC;QACb,QAAQ,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;QAC1B,qBAAqB,CAAC,EAAE,OAAO,CAAC;QAChC,SAAS,CAAC,EAAE,SAAS,CAAC;QACtB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,eAAe,CAAC,EAAE,MAAM,CAAC;QACzB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;QACpC,SAAS,CAAC,EAAE,gBAAgB,CAAC;KAC9B,GAAG,OAAO,CAAC,MAAM,CAAC;CA6DpB;AAGD,eAAO,MAAM,UAAU,YAAmB,CAAC"}
@@ -69,8 +69,8 @@ class PRDService {
69
69
  });
70
70
  const stepStart2 = Date.now();
71
71
  const result = await (0, ai_service_factory_1.getAIOperations)().parsePRD(prdContent, aiConfig, input.promptOverride, input.messageOverride, input.streamingOptions, undefined, // retryConfig
72
- workingDir // Pass working directory to AI operations
73
- );
72
+ workingDir, // Pass working directory to AI operations
73
+ input.enableFilesystemTools);
74
74
  steps.push({
75
75
  step: 'AI Parsing',
76
76
  status: 'completed',
@@ -171,8 +171,8 @@ class PRDService {
171
171
  message: 'Calling AI to improve PRD...',
172
172
  });
173
173
  const improvedPRD = await (0, ai_service_factory_1.getAIOperations)().reworkPRD(prdContent, input.feedback, aiConfig, input.promptOverride, input.messageOverride, input.streamingOptions, undefined, // retryConfig
174
- workingDir // Pass working directory to AI operations
175
- );
174
+ workingDir, // Pass working directory to AI operations
175
+ input.enableFilesystemTools);
176
176
  input.callbacks?.onProgress?.({
177
177
  type: 'progress',
178
178
  message: 'Saving improved PRD...',
@@ -47,9 +47,18 @@ export declare class TaskService {
47
47
  }): Promise<Task | null>;
48
48
  getTaskTree(rootId?: string): Promise<Task[]>;
49
49
  enhanceTask(taskId: string, aiOptions?: AIOptions, streamingOptions?: StreamingOptions, callbacks?: ProgressCallback): Promise<EnhanceTaskResult>;
50
- splitTask(taskId: string, aiOptions?: AIOptions, promptOverride?: string, messageOverride?: string, streamingOptions?: StreamingOptions, callbacks?: ProgressCallback): Promise<SplitTaskResult>;
50
+ splitTask(taskId: string, aiOptions?: AIOptions, promptOverride?: string, messageOverride?: string, streamingOptions?: StreamingOptions, callbacks?: ProgressCallback, enableFilesystemTools?: boolean): Promise<SplitTaskResult>;
51
51
  documentTask(taskId: string, force?: boolean, aiOptions?: AIOptions, streamingOptions?: StreamingOptions, callbacks?: ProgressCallback): Promise<DocumentTaskResult>;
52
52
  planTask(taskId: string, aiOptions?: AIOptions, streamingOptions?: StreamingOptions, callbacks?: ProgressCallback): Promise<PlanTaskResult>;
53
+ getTaskDocumentation(taskId: string): Promise<string | null>;
54
+ addTaskDocumentationFromFile(taskId: string, filePath: string): Promise<{
55
+ filePath: string;
56
+ task: Task;
57
+ }>;
58
+ setTaskPlan(taskId: string, planText?: string, planFilePath?: string): Promise<{
59
+ planFile: string;
60
+ task: Task;
61
+ }>;
53
62
  getTaskPlan(taskId: string): Promise<{
54
63
  plan: string;
55
64
  createdAt: number;
@@ -1 +1 @@
1
- {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/services/tasks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/services/tasks.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,37 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.taskService = exports.TaskService = void 0;
4
37
  const ai_service_factory_1 = require("../utils/ai-service-factory");
@@ -323,7 +356,7 @@ class TaskService {
323
356
  },
324
357
  };
325
358
  }
326
- async splitTask(taskId, aiOptions, promptOverride, messageOverride, streamingOptions, callbacks) {
359
+ async splitTask(taskId, aiOptions, promptOverride, messageOverride, streamingOptions, callbacks, enableFilesystemTools) {
327
360
  const startTime = Date.now();
328
361
  callbacks?.onProgress?.({
329
362
  type: 'started',
@@ -353,7 +386,7 @@ class TaskService {
353
386
  message: 'Calling AI to break down task...',
354
387
  });
355
388
  // Use AI service to break down the task with enhanced context
356
- const subtaskData = await (0, ai_service_factory_1.getAIOperations)().breakdownTask(task, breakdownAIConfig, promptOverride, messageOverride, streamingOptions, undefined, fullContent, stackInfo, existingSubtasks);
389
+ const subtaskData = await (0, ai_service_factory_1.getAIOperations)().breakdownTask(task, breakdownAIConfig, promptOverride, messageOverride, streamingOptions, undefined, fullContent, stackInfo, existingSubtasks, enableFilesystemTools);
357
390
  callbacks?.onProgress?.({
358
391
  type: 'progress',
359
392
  message: `Creating ${subtaskData.length} subtasks...`,
@@ -579,6 +612,68 @@ class TaskService {
579
612
  };
580
613
  }
581
614
  // ============================================================================
615
+ // DOCUMENTATION OPERATIONS
616
+ // ============================================================================
617
+ async getTaskDocumentation(taskId) {
618
+ return (0, ai_service_factory_1.getStorage)().getTaskDocumentation(taskId);
619
+ }
620
+ async addTaskDocumentationFromFile(taskId, filePath) {
621
+ const task = await this.getTask(taskId);
622
+ if (!task) {
623
+ throw new Error(`Task with ID ${taskId} not found`);
624
+ }
625
+ try {
626
+ const { readFileSync, existsSync } = await Promise.resolve().then(() => __importStar(require('fs')));
627
+ const { resolve } = await Promise.resolve().then(() => __importStar(require('path')));
628
+ const resolvedPath = resolve(filePath);
629
+ if (!existsSync(resolvedPath)) {
630
+ throw new Error(`Documentation file not found: ${filePath}`);
631
+ }
632
+ const content = readFileSync(resolvedPath, 'utf-8');
633
+ const savedPath = await (0, ai_service_factory_1.getStorage)().saveTaskDocumentation(taskId, content);
634
+ return {
635
+ filePath: savedPath,
636
+ task,
637
+ };
638
+ }
639
+ catch (error) {
640
+ throw new Error(`Failed to add documentation from file: ${error instanceof Error ? error.message : 'Unknown error'}`);
641
+ }
642
+ }
643
+ async setTaskPlan(taskId, planText, planFilePath) {
644
+ const task = await this.getTask(taskId);
645
+ if (!task) {
646
+ throw new Error(`Task with ID ${taskId} not found`);
647
+ }
648
+ let plan;
649
+ if (planFilePath) {
650
+ try {
651
+ const { readFileSync, existsSync } = await Promise.resolve().then(() => __importStar(require('fs')));
652
+ const { resolve } = await Promise.resolve().then(() => __importStar(require('path')));
653
+ const resolvedPath = resolve(planFilePath);
654
+ if (!existsSync(resolvedPath)) {
655
+ throw new Error(`Plan file not found: ${planFilePath}`);
656
+ }
657
+ plan = readFileSync(resolvedPath, 'utf-8');
658
+ }
659
+ catch (error) {
660
+ throw new Error(`Failed to read plan file: ${error instanceof Error ? error.message : 'Unknown error'}`);
661
+ }
662
+ }
663
+ else if (planText) {
664
+ plan = planText;
665
+ }
666
+ else {
667
+ throw new Error('Either planText or planFilePath must be provided');
668
+ }
669
+ await (0, ai_service_factory_1.getStorage)().savePlan(taskId, plan);
670
+ const planFile = `plans/${taskId}.md`;
671
+ return {
672
+ planFile,
673
+ task,
674
+ };
675
+ }
676
+ // ============================================================================
582
677
  // PLAN OPERATIONS
583
678
  // ============================================================================
584
679
  async getTaskPlan(taskId) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "task-o-matic",
3
- "version": "0.0.1",
3
+ "version": "0.0.3",
4
4
  "description": "AI-powered task management CLI",
5
5
  "keywords": [
6
6
  "task-management",