task-o-matic 0.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.
Files changed (159) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +552 -0
  3. package/dist/cli/bin.d.ts +3 -0
  4. package/dist/cli/bin.d.ts.map +1 -0
  5. package/dist/cli/bin.js +8 -0
  6. package/dist/cli/display/common.d.ts +5 -0
  7. package/dist/cli/display/common.d.ts.map +1 -0
  8. package/dist/cli/display/common.js +44 -0
  9. package/dist/cli/display/plan.d.ts +11 -0
  10. package/dist/cli/display/plan.d.ts.map +1 -0
  11. package/dist/cli/display/plan.js +42 -0
  12. package/dist/cli/display/progress.d.ts +11 -0
  13. package/dist/cli/display/progress.d.ts.map +1 -0
  14. package/dist/cli/display/progress.js +47 -0
  15. package/dist/cli/display/task.d.ts +18 -0
  16. package/dist/cli/display/task.d.ts.map +1 -0
  17. package/dist/cli/display/task.js +250 -0
  18. package/dist/commands/config.d.ts +3 -0
  19. package/dist/commands/config.d.ts.map +1 -0
  20. package/dist/commands/config.js +61 -0
  21. package/dist/commands/init.d.ts +4 -0
  22. package/dist/commands/init.d.ts.map +1 -0
  23. package/dist/commands/init.js +197 -0
  24. package/dist/commands/prd.d.ts +4 -0
  25. package/dist/commands/prd.d.ts.map +1 -0
  26. package/dist/commands/prd.js +131 -0
  27. package/dist/commands/prompt.d.ts +3 -0
  28. package/dist/commands/prompt.d.ts.map +1 -0
  29. package/dist/commands/prompt.js +192 -0
  30. package/dist/commands/tasks.d.ts +3 -0
  31. package/dist/commands/tasks.d.ts.map +1 -0
  32. package/dist/commands/tasks.js +599 -0
  33. package/dist/index.d.ts +18 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +67 -0
  36. package/dist/lib/ai-service/ai-operations.d.ts +31 -0
  37. package/dist/lib/ai-service/ai-operations.d.ts.map +1 -0
  38. package/dist/lib/ai-service/ai-operations.js +648 -0
  39. package/dist/lib/ai-service/json-parser.d.ts +9 -0
  40. package/dist/lib/ai-service/json-parser.d.ts.map +1 -0
  41. package/dist/lib/ai-service/json-parser.js +37 -0
  42. package/dist/lib/ai-service/mcp-client.d.ts +9 -0
  43. package/dist/lib/ai-service/mcp-client.d.ts.map +1 -0
  44. package/dist/lib/ai-service/mcp-client.js +48 -0
  45. package/dist/lib/ai-service/model-provider.d.ts +8 -0
  46. package/dist/lib/ai-service/model-provider.d.ts.map +1 -0
  47. package/dist/lib/ai-service/model-provider.js +71 -0
  48. package/dist/lib/ai-service/research-tools.d.ts +4 -0
  49. package/dist/lib/ai-service/research-tools.d.ts.map +1 -0
  50. package/dist/lib/ai-service/research-tools.js +8 -0
  51. package/dist/lib/ai-service/retry-handler.d.ts +8 -0
  52. package/dist/lib/ai-service/retry-handler.d.ts.map +1 -0
  53. package/dist/lib/ai-service/retry-handler.js +62 -0
  54. package/dist/lib/better-t-stack-cli.d.ts +35 -0
  55. package/dist/lib/better-t-stack-cli.d.ts.map +1 -0
  56. package/dist/lib/better-t-stack-cli.js +118 -0
  57. package/dist/lib/config.d.ts +24 -0
  58. package/dist/lib/config.d.ts.map +1 -0
  59. package/dist/lib/config.js +160 -0
  60. package/dist/lib/context-builder.d.ts +53 -0
  61. package/dist/lib/context-builder.d.ts.map +1 -0
  62. package/dist/lib/context-builder.js +294 -0
  63. package/dist/lib/executors/executor-factory.d.ts +5 -0
  64. package/dist/lib/executors/executor-factory.d.ts.map +1 -0
  65. package/dist/lib/executors/executor-factory.js +21 -0
  66. package/dist/lib/executors/opencode-executor.d.ts +6 -0
  67. package/dist/lib/executors/opencode-executor.d.ts.map +1 -0
  68. package/dist/lib/executors/opencode-executor.js +46 -0
  69. package/dist/lib/index.d.ts +89 -0
  70. package/dist/lib/index.d.ts.map +1 -0
  71. package/dist/lib/index.js +134 -0
  72. package/dist/lib/prompt-builder.d.ts +50 -0
  73. package/dist/lib/prompt-builder.d.ts.map +1 -0
  74. package/dist/lib/prompt-builder.js +171 -0
  75. package/dist/lib/prompt-registry.d.ts +22 -0
  76. package/dist/lib/prompt-registry.d.ts.map +1 -0
  77. package/dist/lib/prompt-registry.js +201 -0
  78. package/dist/lib/storage.d.ts +60 -0
  79. package/dist/lib/storage.d.ts.map +1 -0
  80. package/dist/lib/storage.js +768 -0
  81. package/dist/lib/task-execution.d.ts +3 -0
  82. package/dist/lib/task-execution.d.ts.map +1 -0
  83. package/dist/lib/task-execution.js +130 -0
  84. package/dist/lib/validation.d.ts +4 -0
  85. package/dist/lib/validation.d.ts.map +1 -0
  86. package/dist/lib/validation.js +52 -0
  87. package/dist/mcp/prompts.d.ts +3 -0
  88. package/dist/mcp/prompts.d.ts.map +1 -0
  89. package/dist/mcp/prompts.js +7 -0
  90. package/dist/mcp/resources.d.ts +3 -0
  91. package/dist/mcp/resources.d.ts.map +1 -0
  92. package/dist/mcp/resources.js +7 -0
  93. package/dist/mcp/server.d.ts +3 -0
  94. package/dist/mcp/server.d.ts.map +1 -0
  95. package/dist/mcp/server.js +25 -0
  96. package/dist/mcp/tools.d.ts +3 -0
  97. package/dist/mcp/tools.d.ts.map +1 -0
  98. package/dist/mcp/tools.js +99 -0
  99. package/dist/prompts/documentation-detection.d.ts +2 -0
  100. package/dist/prompts/documentation-detection.d.ts.map +1 -0
  101. package/dist/prompts/documentation-detection.js +24 -0
  102. package/dist/prompts/index.d.ts +7 -0
  103. package/dist/prompts/index.d.ts.map +1 -0
  104. package/dist/prompts/index.js +22 -0
  105. package/dist/prompts/prd-parsing.d.ts +3 -0
  106. package/dist/prompts/prd-parsing.d.ts.map +1 -0
  107. package/dist/prompts/prd-parsing.js +172 -0
  108. package/dist/prompts/prd-rework.d.ts +3 -0
  109. package/dist/prompts/prd-rework.d.ts.map +1 -0
  110. package/dist/prompts/prd-rework.js +81 -0
  111. package/dist/prompts/task-breakdown.d.ts +3 -0
  112. package/dist/prompts/task-breakdown.d.ts.map +1 -0
  113. package/dist/prompts/task-breakdown.js +151 -0
  114. package/dist/prompts/task-enhancement.d.ts +3 -0
  115. package/dist/prompts/task-enhancement.d.ts.map +1 -0
  116. package/dist/prompts/task-enhancement.js +140 -0
  117. package/dist/prompts/task-planning.d.ts +3 -0
  118. package/dist/prompts/task-planning.d.ts.map +1 -0
  119. package/dist/prompts/task-planning.js +66 -0
  120. package/dist/services/prd.d.ts +32 -0
  121. package/dist/services/prd.d.ts.map +1 -0
  122. package/dist/services/prd.js +191 -0
  123. package/dist/services/tasks.d.ts +67 -0
  124. package/dist/services/tasks.d.ts.map +1 -0
  125. package/dist/services/tasks.js +596 -0
  126. package/dist/test/commands.test.d.ts +2 -0
  127. package/dist/test/commands.test.d.ts.map +1 -0
  128. package/dist/test/commands.test.js +74 -0
  129. package/dist/test/storage.test.d.ts +2 -0
  130. package/dist/test/storage.test.d.ts.map +1 -0
  131. package/dist/test/storage.test.js +207 -0
  132. package/dist/types/callbacks.d.ts +27 -0
  133. package/dist/types/callbacks.d.ts.map +1 -0
  134. package/dist/types/callbacks.js +2 -0
  135. package/dist/types/index.d.ts +252 -0
  136. package/dist/types/index.d.ts.map +1 -0
  137. package/dist/types/index.js +2 -0
  138. package/dist/types/mcp.d.ts +3 -0
  139. package/dist/types/mcp.d.ts.map +1 -0
  140. package/dist/types/mcp.js +3 -0
  141. package/dist/types/options.d.ts +94 -0
  142. package/dist/types/options.d.ts.map +1 -0
  143. package/dist/types/options.js +2 -0
  144. package/dist/types/results.d.ts +90 -0
  145. package/dist/types/results.d.ts.map +1 -0
  146. package/dist/types/results.js +2 -0
  147. package/dist/utils/ai-config-builder.d.ts +14 -0
  148. package/dist/utils/ai-config-builder.d.ts.map +1 -0
  149. package/dist/utils/ai-config-builder.js +22 -0
  150. package/dist/utils/ai-service-factory.d.ts +10 -0
  151. package/dist/utils/ai-service-factory.d.ts.map +1 -0
  152. package/dist/utils/ai-service-factory.js +52 -0
  153. package/dist/utils/stack-formatter.d.ts +11 -0
  154. package/dist/utils/stack-formatter.d.ts.map +1 -0
  155. package/dist/utils/stack-formatter.js +30 -0
  156. package/dist/utils/streaming-options.d.ts +10 -0
  157. package/dist/utils/streaming-options.d.ts.map +1 -0
  158. package/dist/utils/streaming-options.js +53 -0
  159. package/package.json +82 -0
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.prdService = exports.PRDService = void 0;
4
+ const fs_1 = require("fs");
5
+ const path_1 = require("path");
6
+ const ai_service_factory_1 = require("../utils/ai-service-factory");
7
+ const ai_config_builder_1 = require("../utils/ai-config-builder");
8
+ const config_1 = require("../lib/config");
9
+ const validation_1 = require("../lib/validation");
10
+ /**
11
+ * PRDService - Business logic for PRD operations
12
+ * Handles PRD parsing, task extraction, and PRD improvement
13
+ */
14
+ class PRDService {
15
+ async parsePRD(input) {
16
+ const startTime = Date.now();
17
+ const steps = [];
18
+ input.callbacks?.onProgress?.({
19
+ type: 'started',
20
+ message: 'Starting PRD parsing...',
21
+ });
22
+ // Validate file exists
23
+ if (!(0, fs_1.existsSync)(input.file)) {
24
+ throw new Error(`PRD file not found: ${input.file}`);
25
+ }
26
+ // Ensure we're in a task-o-matic project
27
+ const taskOMaticDir = config_1.configManager.getTaskOMaticDir();
28
+ if (!(0, fs_1.existsSync)(taskOMaticDir)) {
29
+ throw new Error(`Not a task-o-matic project. Run 'task-o-matic init init' first.`);
30
+ }
31
+ // Set working directory from CLI layer (defaults to process.cwd() for backward compatibility)
32
+ const workingDir = input.workingDirectory || process.cwd();
33
+ config_1.configManager.setWorkingDirectory(workingDir);
34
+ input.callbacks?.onProgress?.({
35
+ type: 'progress',
36
+ message: 'Reading PRD file...',
37
+ });
38
+ const prdContent = (0, fs_1.readFileSync)(input.file, "utf-8");
39
+ // Save PRD file to .task-o-matic/prd directory
40
+ input.callbacks?.onProgress?.({
41
+ type: 'progress',
42
+ message: 'Saving PRD to project directory...',
43
+ });
44
+ const stepStart1 = Date.now();
45
+ const prdDir = (0, path_1.join)(taskOMaticDir, "prd");
46
+ const prdFileName = (0, path_1.basename)(input.file);
47
+ const savedPrdPath = (0, path_1.join)(prdDir, prdFileName);
48
+ // Ensure PRD directory exists
49
+ if (!(0, fs_1.existsSync)(prdDir)) {
50
+ (0, fs_1.mkdirSync)(prdDir, { recursive: true });
51
+ }
52
+ // Copy PRD file to project directory
53
+ (0, fs_1.copyFileSync)(input.file, savedPrdPath);
54
+ // Get relative path from .task-o-matic directory for storage
55
+ const relativePrdPath = (0, path_1.relative)(taskOMaticDir, savedPrdPath);
56
+ steps.push({
57
+ step: 'Save PRD File',
58
+ status: 'completed',
59
+ duration: Date.now() - stepStart1,
60
+ });
61
+ // Validate AI provider if specified
62
+ if (input.aiOptions?.aiProvider && !(0, validation_1.isValidAIProvider)(input.aiOptions.aiProvider)) {
63
+ throw new Error(`Invalid AI provider: ${input.aiOptions.aiProvider}`);
64
+ }
65
+ const aiConfig = (0, ai_config_builder_1.buildAIConfig)(input.aiOptions);
66
+ input.callbacks?.onProgress?.({
67
+ type: 'progress',
68
+ message: 'Parsing PRD with AI...',
69
+ });
70
+ const stepStart2 = Date.now();
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
+ );
74
+ steps.push({
75
+ step: 'AI Parsing',
76
+ status: 'completed',
77
+ duration: Date.now() - stepStart2,
78
+ details: { tasksFound: result.tasks.length },
79
+ });
80
+ input.callbacks?.onProgress?.({
81
+ type: 'progress',
82
+ message: `Creating ${result.tasks.length} tasks...`,
83
+ });
84
+ // Create tasks
85
+ const stepStart3 = Date.now();
86
+ const createdTasks = [];
87
+ for (let i = 0; i < result.tasks.length; i++) {
88
+ const task = result.tasks[i];
89
+ input.callbacks?.onProgress?.({
90
+ type: 'progress',
91
+ message: `Creating task ${i + 1}/${result.tasks.length}: ${task.title}`,
92
+ current: i + 1,
93
+ total: result.tasks.length,
94
+ });
95
+ const createdTask = await (0, ai_service_factory_1.getStorage)().createTask({
96
+ id: task.id, // Preserve AI-generated ID for dependencies
97
+ title: task.title,
98
+ description: task.description,
99
+ content: task.content,
100
+ estimatedEffort: task.estimatedEffort,
101
+ status: "todo",
102
+ dependencies: task.dependencies,
103
+ tags: task.tags,
104
+ prdFile: relativePrdPath, // Reference to the PRD file
105
+ });
106
+ createdTasks.push(createdTask);
107
+ // Update AI metadata with the actual task ID
108
+ const aiMetadata = {
109
+ taskId: createdTask.id,
110
+ aiGenerated: true,
111
+ aiPrompt: input.promptOverride || "Parse PRD and extract tasks",
112
+ confidence: result.confidence,
113
+ aiProvider: input.aiOptions?.aiProvider,
114
+ aiModel: input.aiOptions?.aiModel,
115
+ generatedAt: Date.now(),
116
+ };
117
+ await (0, ai_service_factory_1.getStorage)().saveTaskAIMetadata(aiMetadata);
118
+ }
119
+ steps.push({
120
+ step: 'Create Tasks',
121
+ status: 'completed',
122
+ duration: Date.now() - stepStart3,
123
+ details: { count: createdTasks.length },
124
+ });
125
+ input.callbacks?.onProgress?.({
126
+ type: 'completed',
127
+ message: `Successfully created ${createdTasks.length} tasks from PRD`,
128
+ });
129
+ const duration = Date.now() - startTime;
130
+ return {
131
+ success: true,
132
+ prd: {
133
+ overview: result.summary || "",
134
+ objectives: [],
135
+ features: [],
136
+ },
137
+ tasks: createdTasks,
138
+ stats: {
139
+ tasksCreated: createdTasks.length,
140
+ duration,
141
+ aiProvider: input.aiOptions?.aiProvider || "default",
142
+ aiModel: input.aiOptions?.aiModel || "default",
143
+ },
144
+ steps,
145
+ };
146
+ }
147
+ async reworkPRD(input) {
148
+ input.callbacks?.onProgress?.({
149
+ type: 'started',
150
+ message: 'Starting PRD improvement...',
151
+ });
152
+ // Validate file exists
153
+ if (!(0, fs_1.existsSync)(input.file)) {
154
+ throw new Error(`PRD file not found: ${input.file}`);
155
+ }
156
+ // Set working directory from CLI layer (defaults to process.cwd() for backward compatibility)
157
+ const workingDir = input.workingDirectory || process.cwd();
158
+ config_1.configManager.setWorkingDirectory(workingDir);
159
+ input.callbacks?.onProgress?.({
160
+ type: 'progress',
161
+ message: 'Reading PRD file...',
162
+ });
163
+ const prdContent = (0, fs_1.readFileSync)(input.file, "utf-8");
164
+ // Validate AI provider if specified
165
+ if (input.aiOptions?.aiProvider && !(0, validation_1.isValidAIProvider)(input.aiOptions.aiProvider)) {
166
+ throw new Error(`Invalid AI provider: ${input.aiOptions.aiProvider}`);
167
+ }
168
+ const aiConfig = (0, ai_config_builder_1.buildAIConfig)(input.aiOptions);
169
+ input.callbacks?.onProgress?.({
170
+ type: 'progress',
171
+ message: 'Calling AI to improve PRD...',
172
+ });
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
+ );
176
+ input.callbacks?.onProgress?.({
177
+ type: 'progress',
178
+ message: 'Saving improved PRD...',
179
+ });
180
+ const outputPath = input.output || input.file;
181
+ (0, fs_1.writeFileSync)(outputPath, improvedPRD);
182
+ input.callbacks?.onProgress?.({
183
+ type: 'completed',
184
+ message: `PRD improved and saved to ${outputPath}`,
185
+ });
186
+ return outputPath;
187
+ }
188
+ }
189
+ exports.PRDService = PRDService;
190
+ // Export singleton instance
191
+ exports.prdService = new PRDService();
@@ -0,0 +1,67 @@
1
+ import { AIOptions } from "../utils/ai-config-builder";
2
+ import { Task, StreamingOptions } from "../types";
3
+ import { ProgressCallback } from "../types/callbacks";
4
+ import { CreateTaskResult, EnhanceTaskResult, SplitTaskResult, PlanTaskResult, DocumentTaskResult, DeleteTaskResult } from "../types/results";
5
+ /**
6
+ * TaskService - Centralized business logic for all task operations
7
+ * This service is framework-agnostic and can be used by CLI, TUI, or Web
8
+ */
9
+ export declare class TaskService {
10
+ createTask(input: {
11
+ title: string;
12
+ content?: string;
13
+ parentId?: string;
14
+ effort?: string;
15
+ aiEnhance?: boolean;
16
+ aiOptions?: AIOptions;
17
+ streamingOptions?: StreamingOptions;
18
+ callbacks?: ProgressCallback;
19
+ }): Promise<CreateTaskResult>;
20
+ listTasks(filters: {
21
+ status?: string;
22
+ tag?: string;
23
+ }): Promise<Task[]>;
24
+ getTask(id: string): Promise<Task | null>;
25
+ getTaskContent(id: string): Promise<string | null>;
26
+ getTaskAIMetadata(id: string): Promise<any | null>;
27
+ getSubtasks(id: string): Promise<Task[]>;
28
+ updateTask(id: string, updates: {
29
+ title?: string;
30
+ description?: string;
31
+ status?: string;
32
+ effort?: string;
33
+ tags?: string | string[];
34
+ }): Promise<Task>;
35
+ setTaskStatus(id: string, status: string): Promise<Task>;
36
+ deleteTask(id: string, options?: {
37
+ cascade?: boolean;
38
+ force?: boolean;
39
+ }): Promise<DeleteTaskResult>;
40
+ addTags(id: string, tags: string[]): Promise<Task>;
41
+ removeTags(id: string, tags: string[]): Promise<Task>;
42
+ getNextTask(filters: {
43
+ status?: string;
44
+ tag?: string;
45
+ effort?: string;
46
+ priority?: string;
47
+ }): Promise<Task | null>;
48
+ getTaskTree(rootId?: string): Promise<Task[]>;
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>;
51
+ documentTask(taskId: string, force?: boolean, aiOptions?: AIOptions, streamingOptions?: StreamingOptions, callbacks?: ProgressCallback): Promise<DocumentTaskResult>;
52
+ planTask(taskId: string, aiOptions?: AIOptions, streamingOptions?: StreamingOptions, callbacks?: ProgressCallback): Promise<PlanTaskResult>;
53
+ getTaskPlan(taskId: string): Promise<{
54
+ plan: string;
55
+ createdAt: number;
56
+ updatedAt: number;
57
+ } | null>;
58
+ listTaskPlans(): Promise<Array<{
59
+ taskId: string;
60
+ plan: string;
61
+ createdAt: number;
62
+ updatedAt: number;
63
+ }>>;
64
+ deleteTaskPlan(taskId: string): Promise<boolean>;
65
+ }
66
+ export declare const taskService: TaskService;
67
+ //# sourceMappingURL=tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/services/tasks.ts"],"names":[],"mappings":"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"}