task-o-matic 0.0.2 → 0.0.4
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.
- package/README.md +96 -40
- package/dist/commands/prd.js +4 -0
- package/dist/commands/prompt.d.ts.map +1 -1
- package/dist/commands/prompt.js +69 -61
- package/dist/commands/tasks/create.d.ts +3 -0
- package/dist/commands/tasks/create.d.ts.map +1 -0
- package/dist/commands/tasks/create.js +58 -0
- package/dist/commands/tasks/delete.d.ts +3 -0
- package/dist/commands/tasks/delete.d.ts.map +1 -0
- package/dist/commands/tasks/delete.js +40 -0
- package/dist/commands/tasks/document.d.ts +5 -0
- package/dist/commands/tasks/document.d.ts.map +1 -0
- package/dist/commands/tasks/document.js +118 -0
- package/dist/commands/tasks/enhance.d.ts +3 -0
- package/dist/commands/tasks/enhance.d.ts.map +1 -0
- package/dist/commands/tasks/enhance.js +86 -0
- package/dist/commands/tasks/execute.d.ts +3 -0
- package/dist/commands/tasks/execute.d.ts.map +1 -0
- package/dist/commands/tasks/execute.js +33 -0
- package/dist/commands/tasks/index.d.ts +16 -0
- package/dist/commands/tasks/index.d.ts.map +1 -0
- package/dist/commands/tasks/index.js +31 -0
- package/dist/commands/tasks/list.d.ts +3 -0
- package/dist/commands/tasks/list.d.ts.map +1 -0
- package/dist/commands/tasks/list.js +27 -0
- package/dist/commands/tasks/next.d.ts +3 -0
- package/dist/commands/tasks/next.d.ts.map +1 -0
- package/dist/commands/tasks/next.js +44 -0
- package/dist/commands/tasks/plan.d.ts +7 -0
- package/dist/commands/tasks/plan.d.ts.map +1 -0
- package/dist/commands/tasks/plan.js +131 -0
- package/dist/commands/tasks/show.d.ts +3 -0
- package/dist/commands/tasks/show.d.ts.map +1 -0
- package/dist/commands/tasks/show.js +23 -0
- package/dist/commands/tasks/split.d.ts +3 -0
- package/dist/commands/tasks/split.d.ts.map +1 -0
- package/dist/commands/tasks/split.js +95 -0
- package/dist/commands/tasks/status.d.ts +3 -0
- package/dist/commands/tasks/status.d.ts.map +1 -0
- package/dist/commands/tasks/status.js +26 -0
- package/dist/commands/tasks/subtasks.d.ts +3 -0
- package/dist/commands/tasks/subtasks.d.ts.map +1 -0
- package/dist/commands/tasks/subtasks.js +35 -0
- package/dist/commands/tasks/tags.d.ts +4 -0
- package/dist/commands/tasks/tags.d.ts.map +1 -0
- package/dist/commands/tasks/tags.js +37 -0
- package/dist/commands/tasks/tree.d.ts +3 -0
- package/dist/commands/tasks/tree.d.ts.map +1 -0
- package/dist/commands/tasks/tree.js +20 -0
- package/dist/commands/tasks/update.d.ts +3 -0
- package/dist/commands/tasks/update.d.ts.map +1 -0
- package/dist/commands/tasks/update.js +35 -0
- package/dist/commands/tasks.d.ts.map +1 -1
- package/dist/commands/tasks.js +23 -594
- package/dist/commands/workflow.d.ts +4 -0
- package/dist/commands/workflow.d.ts.map +1 -0
- package/dist/commands/workflow.js +434 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/lib/ai-service/ai-operations.d.ts +5 -3
- package/dist/lib/ai-service/ai-operations.d.ts.map +1 -1
- package/dist/lib/ai-service/ai-operations.js +231 -30
- package/dist/lib/ai-service/filesystem-tools.d.ts +69 -0
- package/dist/lib/ai-service/filesystem-tools.d.ts.map +1 -0
- package/dist/lib/ai-service/filesystem-tools.js +70 -0
- package/dist/lib/ai-service/research-tools.d.ts.map +1 -1
- package/dist/lib/ai-service/research-tools.js +2 -2
- package/dist/lib/context-builder.d.ts +2 -1
- package/dist/lib/context-builder.d.ts.map +1 -1
- package/dist/lib/context-builder.js +3 -8
- package/dist/lib/executors/claude-code-executor.d.ts +6 -0
- package/dist/lib/executors/claude-code-executor.d.ts.map +1 -0
- package/dist/lib/executors/claude-code-executor.js +41 -0
- package/dist/lib/executors/codex-executor.d.ts +6 -0
- package/dist/lib/executors/codex-executor.d.ts.map +1 -0
- package/dist/lib/executors/codex-executor.js +41 -0
- package/dist/lib/executors/executor-factory.d.ts.map +1 -1
- package/dist/lib/executors/executor-factory.js +6 -3
- package/dist/lib/executors/gemini-executor.d.ts +6 -0
- package/dist/lib/executors/gemini-executor.d.ts.map +1 -0
- package/dist/lib/executors/gemini-executor.js +41 -0
- package/dist/lib/executors/opencode-executor.d.ts.map +1 -1
- package/dist/lib/executors/opencode-executor.js +2 -3
- package/dist/lib/hooks/logger.d.ts +2 -0
- package/dist/lib/hooks/logger.d.ts.map +1 -0
- package/dist/lib/hooks/logger.js +27 -0
- package/dist/lib/hooks.d.ts +64 -0
- package/dist/lib/hooks.d.ts.map +1 -0
- package/dist/lib/hooks.js +60 -0
- package/dist/lib/index.d.ts +18 -17
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +3 -3
- package/dist/lib/prompt-builder.d.ts +8 -0
- package/dist/lib/prompt-builder.d.ts.map +1 -1
- package/dist/lib/prompt-builder.js +110 -4
- package/dist/lib/{storage.d.ts → storage/file-system.d.ts} +4 -3
- package/dist/lib/storage/file-system.d.ts.map +1 -0
- package/dist/lib/{storage.js → storage/file-system.js} +141 -152
- package/dist/lib/storage/types.d.ts +43 -0
- package/dist/lib/storage/types.d.ts.map +1 -0
- package/dist/lib/storage/types.js +2 -0
- package/dist/lib/task-execution.d.ts.map +1 -1
- package/dist/lib/task-execution.js +63 -14
- package/dist/prompts/workflow-assistance.d.ts +32 -0
- package/dist/prompts/workflow-assistance.d.ts.map +1 -0
- package/dist/prompts/workflow-assistance.js +130 -0
- package/dist/services/prd.d.ts +2 -0
- package/dist/services/prd.d.ts.map +1 -1
- package/dist/services/prd.js +4 -4
- package/dist/services/tasks.d.ts +13 -6
- package/dist/services/tasks.d.ts.map +1 -1
- package/dist/services/tasks.js +202 -88
- package/dist/services/workflow-ai-assistant.d.ts +74 -0
- package/dist/services/workflow-ai-assistant.d.ts.map +1 -0
- package/dist/services/workflow-ai-assistant.js +223 -0
- package/dist/test/hooks.test.d.ts +2 -0
- package/dist/test/hooks.test.d.ts.map +1 -0
- package/dist/test/hooks.test.js +58 -0
- package/dist/test/storage.test.js +16 -16
- package/dist/types/options.d.ts +35 -0
- package/dist/types/options.d.ts.map +1 -1
- package/dist/utils/ai-service-factory.d.ts +5 -5
- package/dist/utils/ai-service-factory.d.ts.map +1 -1
- package/dist/utils/ai-service-factory.js +4 -3
- package/dist/utils/workflow-prompts.d.ts +17 -0
- package/dist/utils/workflow-prompts.d.ts.map +1 -0
- package/dist/utils/workflow-prompts.js +88 -0
- package/package.json +2 -2
- package/dist/lib/storage.d.ts.map +0 -1
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { Task, CreateTaskRequest, TaskAIMetadata } from "../../types";
|
|
2
|
+
export interface TaskRepository {
|
|
3
|
+
getTasks(): Promise<Task[]>;
|
|
4
|
+
getTopLevelTasks(): Promise<Task[]>;
|
|
5
|
+
getTask(id: string): Promise<Task | null>;
|
|
6
|
+
createTask(task: CreateTaskRequest, aiMetadata?: TaskAIMetadata): Promise<Task>;
|
|
7
|
+
updateTask(id: string, updates: Partial<Task>): Promise<Task | null>;
|
|
8
|
+
deleteTask(id: string): Promise<boolean>;
|
|
9
|
+
getSubtasks(parentId: string): Promise<Task[]>;
|
|
10
|
+
getTaskContent(taskId: string): Promise<string | null>;
|
|
11
|
+
saveTaskContent(taskId: string, content: string): Promise<string>;
|
|
12
|
+
saveEnhancedTaskContent(taskId: string, content: string): Promise<string>;
|
|
13
|
+
deleteTaskContent(taskId: string): Promise<void>;
|
|
14
|
+
migrateTaskContent(): Promise<number>;
|
|
15
|
+
cleanupOrphanedContent(): Promise<number>;
|
|
16
|
+
getTaskAIMetadata(taskId: string): Promise<TaskAIMetadata | null>;
|
|
17
|
+
saveTaskAIMetadata(metadata: TaskAIMetadata): Promise<void>;
|
|
18
|
+
deleteTaskAIMetadata(taskId: string): Promise<void>;
|
|
19
|
+
getTaskDocumentation(taskId: string): Promise<string | null>;
|
|
20
|
+
saveTaskDocumentation(taskId: string, content: string): Promise<string>;
|
|
21
|
+
saveContext7Documentation(library: string, query: string, content: string): Promise<string>;
|
|
22
|
+
getDocumentationFile(fileName: string): Promise<string | null>;
|
|
23
|
+
listDocumentationFiles(): Promise<string[]>;
|
|
24
|
+
getPlan(taskId: string): Promise<{
|
|
25
|
+
plan: string;
|
|
26
|
+
createdAt: number;
|
|
27
|
+
updatedAt: number;
|
|
28
|
+
} | null>;
|
|
29
|
+
savePlan(taskId: string, plan: string): Promise<void>;
|
|
30
|
+
listPlans(): Promise<Array<{
|
|
31
|
+
taskId: string;
|
|
32
|
+
plan: string;
|
|
33
|
+
createdAt: number;
|
|
34
|
+
updatedAt: number;
|
|
35
|
+
}>>;
|
|
36
|
+
deletePlan(taskId: string): Promise<boolean>;
|
|
37
|
+
sanitizeForFilename(name: string): string;
|
|
38
|
+
validateStorageIntegrity(): Promise<{
|
|
39
|
+
isValid: boolean;
|
|
40
|
+
issues: string[];
|
|
41
|
+
}>;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/storage/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAEtE,MAAM,WAAW,cAAc;IAE7B,QAAQ,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAC5B,gBAAgB,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IACpC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAC1C,UAAU,CACR,IAAI,EAAE,iBAAiB,EACvB,UAAU,CAAC,EAAE,cAAc,GAC1B,OAAO,CAAC,IAAI,CAAC,CAAC;IACjB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IACrE,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAG/C,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACvD,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAClE,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1E,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,sBAAsB,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IAG1C,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAClE,kBAAkB,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAGpD,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC7D,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACxE,yBAAyB,CACvB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAAC;IACnB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC/D,sBAAsB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAG5C,OAAO,CACL,MAAM,EAAE,MAAM,GACb,OAAO,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IAC1E,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,SAAS,IAAI,OAAO,CAClB,KAAK,CAAC;QACJ,MAAM,EAAE,MAAM,CAAC;QACf,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC,CACH,CAAC;IACF,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAG7C,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAC1C,wBAAwB,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,CAAC;CAC7E"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-execution.d.ts","sourceRoot":"","sources":["../../src/lib/task-execution.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAgB,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"task-execution.d.ts","sourceRoot":"","sources":["../../src/lib/task-execution.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAgB,MAAM,UAAU,CAAC;AA8L5D,wBAAsB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqE5E"}
|
|
@@ -7,6 +7,8 @@ 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 ai_service_factory_1 = require("../utils/ai-service-factory");
|
|
11
|
+
const hooks_1 = require("./hooks");
|
|
10
12
|
const chalk_1 = __importDefault(require("chalk"));
|
|
11
13
|
async function executeSingleTask(taskId, tool, dry) {
|
|
12
14
|
// Load task
|
|
@@ -15,35 +17,78 @@ async function executeSingleTask(taskId, tool, dry) {
|
|
|
15
17
|
throw new Error(`Task with ID ${taskId} not found`);
|
|
16
18
|
}
|
|
17
19
|
console.log(chalk_1.default.blue(`🎯 ${dry ? "DRY RUN" : "Executing"} task: ${task.title} (${taskId})`));
|
|
18
|
-
// Build execution message
|
|
19
|
-
|
|
20
|
+
// Build comprehensive execution message with full context
|
|
21
|
+
const contextBuilder = (0, ai_service_factory_1.getContextBuilder)();
|
|
22
|
+
const taskContext = await contextBuilder.buildContext(taskId);
|
|
23
|
+
// Build execution message with ALL context
|
|
24
|
+
const messageParts = [];
|
|
25
|
+
// Add task plan if available
|
|
20
26
|
const planData = await tasks_1.taskService.getTaskPlan(taskId);
|
|
21
27
|
if (planData) {
|
|
22
|
-
|
|
28
|
+
messageParts.push(`# Task Plan\n\n${planData.plan}\n`);
|
|
23
29
|
}
|
|
24
30
|
else {
|
|
25
|
-
|
|
31
|
+
messageParts.push(`# Task: ${task.title}\n\n${task.description || "No description"}\n`);
|
|
26
32
|
}
|
|
33
|
+
// Add PRD context if available
|
|
34
|
+
if (taskContext.prdContent) {
|
|
35
|
+
messageParts.push(`\n# Product Requirements Document\n\n${taskContext.prdContent}\n`);
|
|
36
|
+
}
|
|
37
|
+
// Add stack/technology context
|
|
38
|
+
if (taskContext.stack) {
|
|
39
|
+
messageParts.push(`\n# Technology Stack\n\n`);
|
|
40
|
+
messageParts.push(`- **Project**: ${taskContext.stack.projectName}\n`);
|
|
41
|
+
messageParts.push(`- **Frontend**: ${taskContext.stack.frontend}\n`);
|
|
42
|
+
messageParts.push(`- **Backend**: ${taskContext.stack.backend}\n`);
|
|
43
|
+
if (taskContext.stack.database !== "none") {
|
|
44
|
+
messageParts.push(`- **Database**: ${taskContext.stack.database}\n`);
|
|
45
|
+
}
|
|
46
|
+
if (taskContext.stack.orm !== "none") {
|
|
47
|
+
messageParts.push(`- **ORM**: ${taskContext.stack.orm}\n`);
|
|
48
|
+
}
|
|
49
|
+
messageParts.push(`- **Auth**: ${taskContext.stack.auth}\n`);
|
|
50
|
+
if (taskContext.stack.addons.length > 0) {
|
|
51
|
+
messageParts.push(`- **Addons**: ${taskContext.stack.addons.join(", ")}\n`);
|
|
52
|
+
}
|
|
53
|
+
messageParts.push(`- **Package Manager**: ${taskContext.stack.packageManager}\n`);
|
|
54
|
+
}
|
|
55
|
+
// Add documentation context if available
|
|
56
|
+
if (taskContext.documentation) {
|
|
57
|
+
messageParts.push(`\n# Documentation Context\n\n`);
|
|
58
|
+
messageParts.push(`${taskContext.documentation.recap}\n`);
|
|
59
|
+
if (taskContext.documentation.files.length > 0) {
|
|
60
|
+
messageParts.push(`\n**Relevant Documentation Files**:\n`);
|
|
61
|
+
taskContext.documentation.files.forEach((file) => {
|
|
62
|
+
messageParts.push(`- ${file.path}\n`);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
const executionMessage = messageParts.join("");
|
|
27
67
|
if (!dry) {
|
|
28
|
-
// console.log(chalk.yellow(`📝 Message that would be sent:`));
|
|
29
|
-
// console.log(chalk.cyan(executionMessage));
|
|
30
|
-
// } else {
|
|
31
68
|
// Update task status to in-progress
|
|
32
69
|
await tasks_1.taskService.setTaskStatus(taskId, "in-progress");
|
|
33
70
|
console.log(chalk_1.default.yellow("⏳ Task status updated to in-progress"));
|
|
34
71
|
}
|
|
72
|
+
// Emit execution:start event
|
|
73
|
+
await hooks_1.hooks.emit("execution:start", { taskId, tool });
|
|
35
74
|
try {
|
|
36
75
|
// Create executor and run
|
|
37
76
|
const executor = executor_factory_1.ExecutorFactory.create(tool);
|
|
38
|
-
console.log(chalk_1.default.cyan(`🔧 Using executor: ${executor.name}`));
|
|
39
77
|
await executor.execute(executionMessage, dry);
|
|
40
78
|
if (!dry) {
|
|
41
79
|
// Update task status to completed
|
|
42
80
|
await tasks_1.taskService.setTaskStatus(taskId, "completed");
|
|
43
81
|
console.log(chalk_1.default.green("✅ Task execution completed successfully"));
|
|
44
82
|
}
|
|
83
|
+
// Emit execution:end event
|
|
84
|
+
await hooks_1.hooks.emit("execution:end", { taskId, success: true });
|
|
45
85
|
}
|
|
46
86
|
catch (error) {
|
|
87
|
+
// Emit execution:error event
|
|
88
|
+
await hooks_1.hooks.emit("execution:error", {
|
|
89
|
+
taskId,
|
|
90
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
91
|
+
});
|
|
47
92
|
if (!dry) {
|
|
48
93
|
// Update task status back to todo on failure
|
|
49
94
|
await tasks_1.taskService.setTaskStatus(taskId, "todo");
|
|
@@ -95,22 +140,21 @@ async function executeTask(options) {
|
|
|
95
140
|
throw new Error(`Task with ID ${taskId} not found`);
|
|
96
141
|
}
|
|
97
142
|
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 {
|
|
143
|
+
if (!dry) {
|
|
103
144
|
await tasks_1.taskService.setTaskStatus(taskId, "in-progress");
|
|
104
145
|
console.log(chalk_1.default.yellow("⏳ Task status updated to in-progress"));
|
|
105
146
|
}
|
|
147
|
+
// Emit execution:start event
|
|
148
|
+
await hooks_1.hooks.emit("execution:start", { taskId, tool });
|
|
106
149
|
try {
|
|
107
150
|
const executor = executor_factory_1.ExecutorFactory.create(tool);
|
|
108
|
-
console.log(chalk_1.default.cyan(`🔧 Using executor: ${executor.name}`));
|
|
109
151
|
await executor.execute(message, dry);
|
|
110
152
|
if (!dry) {
|
|
111
153
|
await tasks_1.taskService.setTaskStatus(taskId, "completed");
|
|
112
154
|
console.log(chalk_1.default.green("✅ Task execution completed successfully"));
|
|
113
155
|
}
|
|
156
|
+
// Emit execution:end event
|
|
157
|
+
await hooks_1.hooks.emit("execution:end", { taskId, success: true });
|
|
114
158
|
// Run validations after task completion
|
|
115
159
|
await (0, validation_1.runValidations)(validate, dry);
|
|
116
160
|
}
|
|
@@ -119,6 +163,11 @@ async function executeTask(options) {
|
|
|
119
163
|
await tasks_1.taskService.setTaskStatus(taskId, "todo");
|
|
120
164
|
console.log(chalk_1.default.red("❌ Task execution failed, status reset to todo"));
|
|
121
165
|
}
|
|
166
|
+
// Emit execution:error event
|
|
167
|
+
await hooks_1.hooks.emit("execution:error", {
|
|
168
|
+
taskId,
|
|
169
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
170
|
+
});
|
|
122
171
|
throw error;
|
|
123
172
|
}
|
|
124
173
|
return;
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prompt templates for workflow AI assistance
|
|
3
|
+
*/
|
|
4
|
+
export declare const initConfigPrompt: {
|
|
5
|
+
system: string;
|
|
6
|
+
template: (userDescription: string) => string;
|
|
7
|
+
};
|
|
8
|
+
export declare const prdCreationPrompt: {
|
|
9
|
+
system: string;
|
|
10
|
+
template: (userDescription: string) => string;
|
|
11
|
+
};
|
|
12
|
+
export declare const prdRefinementPrompt: {
|
|
13
|
+
system: string;
|
|
14
|
+
template: (currentPRD: string, feedback: string) => string;
|
|
15
|
+
};
|
|
16
|
+
export declare const taskGenerationPrompt: {
|
|
17
|
+
system: string;
|
|
18
|
+
template: (prdContent: string, customInstructions?: string) => string;
|
|
19
|
+
};
|
|
20
|
+
export declare const taskSplitPrompt: {
|
|
21
|
+
system: string;
|
|
22
|
+
template: (taskTitle: string, taskContent: string, customInstructions?: string) => string;
|
|
23
|
+
};
|
|
24
|
+
export declare const taskPrioritizationPrompt: {
|
|
25
|
+
system: string;
|
|
26
|
+
template: (tasks: Array<{
|
|
27
|
+
id: string;
|
|
28
|
+
title: string;
|
|
29
|
+
description?: string;
|
|
30
|
+
}>, userGuidance: string) => string;
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=workflow-assistance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-assistance.d.ts","sourceRoot":"","sources":["../../src/prompts/workflow-assistance.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,eAAO,MAAM,gBAAgB;;gCAKC,MAAM;CAcnC,CAAC;AAEF,eAAO,MAAM,iBAAiB;;gCAIA,MAAM;CAiBnC,CAAC;AAEF,eAAO,MAAM,mBAAmB;;2BAIP,MAAM,YAAY,MAAM;CAYhD,CAAC;AAEF,eAAO,MAAM,oBAAoB;;2BAIR,MAAM,uBAAuB,MAAM;CAoB3D,CAAC;AAEF,eAAO,MAAM,eAAe;;0BAKb,MAAM,eACJ,MAAM,uBACE,MAAM;CAiB9B,CAAC;AAEF,eAAO,MAAM,wBAAwB;;sBAK1B,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,gBACnD,MAAM;CA0BvB,CAAC"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Prompt templates for workflow AI assistance
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.taskPrioritizationPrompt = exports.taskSplitPrompt = exports.taskGenerationPrompt = exports.prdRefinementPrompt = exports.prdCreationPrompt = exports.initConfigPrompt = void 0;
|
|
7
|
+
exports.initConfigPrompt = {
|
|
8
|
+
system: `You are an expert developer assistant helping configure a new project.
|
|
9
|
+
Your role is to recommend appropriate technologies based on the user's description.
|
|
10
|
+
Always consider modern best practices, compatibility, and the user's experience level.`,
|
|
11
|
+
template: (userDescription) => `
|
|
12
|
+
Based on this project description, recommend a complete tech stack:
|
|
13
|
+
|
|
14
|
+
"${userDescription}"
|
|
15
|
+
|
|
16
|
+
Available options:
|
|
17
|
+
- AI Providers: openrouter, anthropic, openai, custom
|
|
18
|
+
- Frontend: next, tanstack-router, react-router, vite-react, remix
|
|
19
|
+
- Backend: hono, express, elysia, fastify
|
|
20
|
+
- Database: sqlite, postgres, mysql, mongodb, turso, neon
|
|
21
|
+
- Auth: better-auth, clerk, auth0, custom
|
|
22
|
+
|
|
23
|
+
Respond with JSON containing: projectName, aiProvider, aiModel, frontend, backend, database, auth (boolean), reasoning
|
|
24
|
+
`,
|
|
25
|
+
};
|
|
26
|
+
exports.prdCreationPrompt = {
|
|
27
|
+
system: `You are an experienced product manager creating Product Requirements Documents.
|
|
28
|
+
Your PRDs are clear, comprehensive, and actionable. You focus on MVP features while noting future enhancements.`,
|
|
29
|
+
template: (userDescription) => `
|
|
30
|
+
Create a comprehensive PRD for this product:
|
|
31
|
+
|
|
32
|
+
"${userDescription}"
|
|
33
|
+
|
|
34
|
+
Include these sections:
|
|
35
|
+
1. Overview - Brief product description
|
|
36
|
+
2. Objectives - Key goals
|
|
37
|
+
3. Target Audience - Who will use it
|
|
38
|
+
4. Core Features - Essential MVP features
|
|
39
|
+
5. Future Features - Nice-to-have additions
|
|
40
|
+
6. Technical Requirements - Tech constraints
|
|
41
|
+
7. Success Metrics - How to measure success
|
|
42
|
+
8. Timeline - Rough milestones
|
|
43
|
+
|
|
44
|
+
Be specific and actionable.
|
|
45
|
+
`,
|
|
46
|
+
};
|
|
47
|
+
exports.prdRefinementPrompt = {
|
|
48
|
+
system: `You are a senior product manager reviewing and improving PRDs.
|
|
49
|
+
You focus on clarity, completeness, feasibility, and measurable outcomes.`,
|
|
50
|
+
template: (currentPRD, feedback) => `
|
|
51
|
+
Improve this PRD based on the feedback:
|
|
52
|
+
|
|
53
|
+
Current PRD:
|
|
54
|
+
${currentPRD}
|
|
55
|
+
|
|
56
|
+
Feedback:
|
|
57
|
+
"${feedback}"
|
|
58
|
+
|
|
59
|
+
Return the improved PRD maintaining the same structure but incorporating the feedback.
|
|
60
|
+
Focus on making it more specific, actionable, and complete.
|
|
61
|
+
`,
|
|
62
|
+
};
|
|
63
|
+
exports.taskGenerationPrompt = {
|
|
64
|
+
system: `You are a technical lead breaking down PRDs into actionable tasks.
|
|
65
|
+
You create clear, well-scoped tasks with appropriate dependencies and effort estimates.`,
|
|
66
|
+
template: (prdContent, customInstructions) => `
|
|
67
|
+
Parse this PRD into actionable tasks:
|
|
68
|
+
|
|
69
|
+
${prdContent}
|
|
70
|
+
|
|
71
|
+
${customInstructions ? `Special Instructions:\n${customInstructions}\n` : ""}
|
|
72
|
+
|
|
73
|
+
For each task, provide:
|
|
74
|
+
- Clear title
|
|
75
|
+
- Detailed description
|
|
76
|
+
- Estimated effort (small/medium/large)
|
|
77
|
+
- Dependencies (if any)
|
|
78
|
+
- Tags for categorization
|
|
79
|
+
|
|
80
|
+
Focus on creating tasks that are:
|
|
81
|
+
1. Actionable and specific
|
|
82
|
+
2. Appropriately sized (not too big or small)
|
|
83
|
+
3. Properly ordered by dependencies
|
|
84
|
+
4. Tagged for easy filtering
|
|
85
|
+
`,
|
|
86
|
+
};
|
|
87
|
+
exports.taskSplitPrompt = {
|
|
88
|
+
system: `You are a technical lead breaking down complex tasks into manageable subtasks.
|
|
89
|
+
You create well-scoped subtasks that can be completed independently when possible.`,
|
|
90
|
+
template: (taskTitle, taskContent, customInstructions) => `
|
|
91
|
+
Break down this task into subtasks:
|
|
92
|
+
|
|
93
|
+
Task: ${taskTitle}
|
|
94
|
+
Description: ${taskContent}
|
|
95
|
+
|
|
96
|
+
${customInstructions ? `Special Instructions:\n${customInstructions}\n` : ""}
|
|
97
|
+
|
|
98
|
+
Create subtasks that are:
|
|
99
|
+
1. Independently completable when possible
|
|
100
|
+
2. Appropriately sized (2-4 hours each)
|
|
101
|
+
3. Logically ordered
|
|
102
|
+
4. Include testing/validation steps
|
|
103
|
+
|
|
104
|
+
For each subtask provide: title, description, estimated effort, dependencies
|
|
105
|
+
`,
|
|
106
|
+
};
|
|
107
|
+
exports.taskPrioritizationPrompt = {
|
|
108
|
+
system: `You are a project manager prioritizing tasks for optimal execution.
|
|
109
|
+
You consider dependencies, risk, MVP scope, and team efficiency.`,
|
|
110
|
+
template: (tasks, userGuidance) => `
|
|
111
|
+
Prioritize these tasks:
|
|
112
|
+
|
|
113
|
+
${tasks
|
|
114
|
+
.map((t, i) => `${i + 1}. [${t.id}] ${t.title}${t.description ? `: ${t.description}` : ""}`)
|
|
115
|
+
.join("\n")}
|
|
116
|
+
|
|
117
|
+
User's Guidance:
|
|
118
|
+
"${userGuidance}"
|
|
119
|
+
|
|
120
|
+
Respond with JSON containing:
|
|
121
|
+
- prioritizedTasks: array of {id, priority (1=highest), reasoning}
|
|
122
|
+
- recommendations: overall execution strategy
|
|
123
|
+
|
|
124
|
+
Consider:
|
|
125
|
+
1. Dependencies (what must be done first)
|
|
126
|
+
2. MVP vs. nice-to-have
|
|
127
|
+
3. Risk and complexity
|
|
128
|
+
4. User's specific guidance
|
|
129
|
+
`,
|
|
130
|
+
};
|
package/dist/services/prd.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/services/prd.js
CHANGED
|
@@ -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...',
|
package/dist/services/tasks.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { AIOptions } from "../utils/ai-config-builder";
|
|
2
2
|
import { Task, StreamingOptions } from "../types";
|
|
3
|
-
import { ProgressCallback } from "../types/callbacks";
|
|
4
3
|
import { CreateTaskResult, EnhanceTaskResult, SplitTaskResult, PlanTaskResult, DocumentTaskResult, DeleteTaskResult } from "../types/results";
|
|
5
4
|
/**
|
|
6
5
|
* TaskService - Centralized business logic for all task operations
|
|
@@ -15,7 +14,6 @@ export declare class TaskService {
|
|
|
15
14
|
aiEnhance?: boolean;
|
|
16
15
|
aiOptions?: AIOptions;
|
|
17
16
|
streamingOptions?: StreamingOptions;
|
|
18
|
-
callbacks?: ProgressCallback;
|
|
19
17
|
}): Promise<CreateTaskResult>;
|
|
20
18
|
listTasks(filters: {
|
|
21
19
|
status?: string;
|
|
@@ -46,10 +44,19 @@ export declare class TaskService {
|
|
|
46
44
|
priority?: string;
|
|
47
45
|
}): Promise<Task | null>;
|
|
48
46
|
getTaskTree(rootId?: string): Promise<Task[]>;
|
|
49
|
-
enhanceTask(taskId: string, aiOptions?: AIOptions, streamingOptions?: StreamingOptions
|
|
50
|
-
splitTask(taskId: string, aiOptions?: AIOptions, promptOverride?: string, messageOverride?: string, streamingOptions?: StreamingOptions,
|
|
51
|
-
documentTask(taskId: string, force?: boolean, aiOptions?: AIOptions, streamingOptions?: StreamingOptions
|
|
52
|
-
planTask(taskId: string, aiOptions?: AIOptions, streamingOptions?: StreamingOptions
|
|
47
|
+
enhanceTask(taskId: string, aiOptions?: AIOptions, streamingOptions?: StreamingOptions): Promise<EnhanceTaskResult>;
|
|
48
|
+
splitTask(taskId: string, aiOptions?: AIOptions, promptOverride?: string, messageOverride?: string, streamingOptions?: StreamingOptions, enableFilesystemTools?: boolean): Promise<SplitTaskResult>;
|
|
49
|
+
documentTask(taskId: string, force?: boolean, aiOptions?: AIOptions, streamingOptions?: StreamingOptions): Promise<DocumentTaskResult>;
|
|
50
|
+
planTask(taskId: string, aiOptions?: AIOptions, streamingOptions?: StreamingOptions): Promise<PlanTaskResult>;
|
|
51
|
+
getTaskDocumentation(taskId: string): Promise<string | null>;
|
|
52
|
+
addTaskDocumentationFromFile(taskId: string, filePath: string): Promise<{
|
|
53
|
+
filePath: string;
|
|
54
|
+
task: Task;
|
|
55
|
+
}>;
|
|
56
|
+
setTaskPlan(taskId: string, planText?: string, planFilePath?: string): Promise<{
|
|
57
|
+
planFile: string;
|
|
58
|
+
task: Task;
|
|
59
|
+
}>;
|
|
53
60
|
getTaskPlan(taskId: string): Promise<{
|
|
54
61
|
plan: string;
|
|
55
62
|
createdAt: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/services/tasks.ts"],"names":[],"mappings":"AAOA,OAAO,EAAiB,SAAS,EAAE,MAAM,4BAA4B,CAAC;AACtE,OAAO,EACL,IAAI,EACJ,gBAAgB,EAIjB,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/services/tasks.ts"],"names":[],"mappings":"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"}
|