task-o-matic 0.0.20 → 0.0.22

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 (67) hide show
  1. package/dist/commands/benchmark.js +203 -173
  2. package/dist/commands/install.d.ts +3 -0
  3. package/dist/commands/install.d.ts.map +1 -0
  4. package/dist/commands/install.js +150 -0
  5. package/dist/commands/prd.d.ts +5 -0
  6. package/dist/commands/prd.d.ts.map +1 -1
  7. package/dist/commands/prd.js +297 -189
  8. package/dist/commands/tasks/split.d.ts.map +1 -1
  9. package/dist/commands/tasks/split.js +129 -27
  10. package/dist/commands/utils/ai-parallel.d.ts +20 -0
  11. package/dist/commands/utils/ai-parallel.d.ts.map +1 -0
  12. package/dist/commands/utils/ai-parallel.js +115 -0
  13. package/dist/commands/workflow.d.ts.map +1 -1
  14. package/dist/commands/workflow.js +59 -0
  15. package/dist/index.d.ts.map +1 -1
  16. package/dist/index.js +3 -1
  17. package/dist/lib/ai-service/gemini-proxy.d.ts +15 -0
  18. package/dist/lib/ai-service/gemini-proxy.d.ts.map +1 -0
  19. package/dist/lib/ai-service/gemini-proxy.js +90 -0
  20. package/dist/lib/ai-service/json-parser.d.ts +16 -4
  21. package/dist/lib/ai-service/json-parser.d.ts.map +1 -1
  22. package/dist/lib/ai-service/json-parser.js +93 -19
  23. package/dist/lib/ai-service/model-provider.d.ts.map +1 -1
  24. package/dist/lib/ai-service/model-provider.js +31 -2
  25. package/dist/lib/ai-service/prd-operations.d.ts.map +1 -1
  26. package/dist/lib/ai-service/prd-operations.js +21 -5
  27. package/dist/lib/ai-service/task-operations.d.ts.map +1 -1
  28. package/dist/lib/ai-service/task-operations.js +10 -2
  29. package/dist/lib/better-t-stack-cli.d.ts.map +1 -1
  30. package/dist/lib/better-t-stack-cli.js +6 -5
  31. package/dist/lib/config-validation.d.ts +9 -9
  32. package/dist/lib/config-validation.d.ts.map +1 -1
  33. package/dist/lib/config-validation.js +11 -3
  34. package/dist/lib/config.d.ts.map +1 -1
  35. package/dist/lib/config.js +11 -2
  36. package/dist/lib/git-utils.d.ts +35 -0
  37. package/dist/lib/git-utils.d.ts.map +1 -1
  38. package/dist/lib/git-utils.js +69 -0
  39. package/dist/lib/provider-defaults.json +11 -1
  40. package/dist/lib/task-loop-execution.d.ts.map +1 -1
  41. package/dist/lib/task-loop-execution.js +5 -1
  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/tasks.d.ts.map +1 -1
  46. package/dist/services/tasks.js +25 -15
  47. package/dist/services/workflow.d.ts +12 -0
  48. package/dist/services/workflow.d.ts.map +1 -1
  49. package/dist/services/workflow.js +20 -0
  50. package/dist/test/commands.test.js +10 -10
  51. package/dist/test/model-parsing.test.d.ts +2 -0
  52. package/dist/test/model-parsing.test.d.ts.map +1 -0
  53. package/dist/test/model-parsing.test.js +73 -0
  54. package/dist/types/cli-options.d.ts +2 -0
  55. package/dist/types/cli-options.d.ts.map +1 -1
  56. package/dist/types/index.d.ts +13 -1
  57. package/dist/types/index.d.ts.map +1 -1
  58. package/dist/types/index.js +10 -0
  59. package/dist/types/workflow-options.d.ts +25 -0
  60. package/dist/types/workflow-options.d.ts.map +1 -1
  61. package/dist/utils/ai-operation-utility.d.ts.map +1 -1
  62. package/dist/utils/ai-operation-utility.js +26 -2
  63. package/dist/utils/metadata-utils.d.ts +1 -1
  64. package/dist/utils/streaming-utils.d.ts.map +1 -1
  65. package/dist/utils/streaming-utils.js +8 -0
  66. package/docs/agents/cli.md +19 -12
  67. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "openrouter": {
3
- "model": "z-ai/glm-4.6",
3
+ "model": "z-ai/glm-4.7",
4
4
  "maxTokens": 32768,
5
5
  "temperature": 0.5
6
6
  },
@@ -18,5 +18,15 @@
18
18
  "model": "llama-3.3-70b",
19
19
  "maxTokens": 32768,
20
20
  "temperature": 0.5
21
+ },
22
+ "gemini": {
23
+ "model": "gemini-3-flash-preview",
24
+ "maxTokens": 32768,
25
+ "temperature": 0.5
26
+ },
27
+ "zai": {
28
+ "model": "glm-4.7",
29
+ "maxTokens": 32768,
30
+ "temperature": 0.5
21
31
  }
22
32
  }
@@ -1 +1 @@
1
- {"version":3,"file":"task-loop-execution.d.ts","sourceRoot":"","sources":["../../src/lib/task-loop-execution.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EAIlB,MAAM,UAAU,CAAC;AAIlB;;;GAGG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAgL5B"}
1
+ {"version":3,"file":"task-loop-execution.d.ts","sourceRoot":"","sources":["../../src/lib/task-loop-execution.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAClB,iBAAiB,EAIlB,MAAM,UAAU,CAAC;AAIlB;;;GAGG;AACH,wBAAsB,eAAe,CACnC,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,iBAAiB,CAAC,CAmL5B"}
@@ -14,9 +14,12 @@ const chalk_1 = __importDefault(require("chalk"));
14
14
  async function executeTaskLoop(options) {
15
15
  const startTime = Date.now();
16
16
  const { filters = {}, tool = "opencode", config = {}, dry = false } = options;
17
- const { maxRetries = 3, verificationCommands = [], autoCommit = false, tryModels, plan, planModel, reviewPlan, review, reviewModel, customMessage, continueSession, } = config;
17
+ const { maxRetries = 3, verificationCommands = [], autoCommit = false, tryModels, plan, planModel, reviewPlan, review, reviewModel, customMessage, continueSession, model, // NEW: Extract model from config
18
+ } = config;
18
19
  console.log(chalk_1.default.blue.bold("\n🔄 Starting Task Loop Execution\n"));
19
20
  console.log(chalk_1.default.cyan(`Executor Tool: ${tool}`));
21
+ if (model)
22
+ console.log(chalk_1.default.cyan(`Executor Model: ${model}`));
20
23
  console.log(chalk_1.default.cyan(`Max Retries per Task: ${maxRetries}`));
21
24
  console.log(chalk_1.default.cyan(`Verification Commands: ${verificationCommands.length > 0
22
25
  ? verificationCommands.join(", ")
@@ -68,6 +71,7 @@ async function executeTaskLoop(options) {
68
71
  customMessage, // NEW: Support custom message override
69
72
  executorConfig: {
70
73
  continueLastSession: continueSession, // NEW: Support session continuation
74
+ model, // NEW: Pass model to executor
71
75
  },
72
76
  verificationCommands,
73
77
  enableRetry: true, // Always enable retry in loop
@@ -1,6 +1,20 @@
1
1
  import { BenchmarkConfig, BenchmarkRun, BenchmarkProgressEvent } from "../lib/benchmark/types";
2
+ import { ExecuteLoopOptions } from "../types";
3
+ import { WorkflowBenchmarkInput } from "../lib/benchmark/types";
4
+ export interface ExecutionBenchmarkOptions {
5
+ taskId: string;
6
+ verificationCommands?: string[];
7
+ maxRetries?: number;
8
+ keepBranches?: boolean;
9
+ }
2
10
  export declare class BenchmarkService {
3
11
  runBenchmark(operationId: string, input: any, config: BenchmarkConfig, onProgress?: (event: BenchmarkProgressEvent) => void): Promise<BenchmarkRun>;
12
+ runExecutionBenchmark(options: ExecutionBenchmarkOptions, config: BenchmarkConfig, onProgress?: (event: BenchmarkProgressEvent) => void): Promise<BenchmarkRun>;
13
+ runExecuteLoopBenchmark(options: {
14
+ loopOptions: ExecuteLoopOptions;
15
+ keepBranches?: boolean;
16
+ }, config: BenchmarkConfig, onProgress?: (event: BenchmarkProgressEvent) => void): Promise<BenchmarkRun>;
17
+ runWorkflowBenchmark(input: WorkflowBenchmarkInput, config: BenchmarkConfig, onProgress?: (event: BenchmarkProgressEvent) => void): Promise<BenchmarkRun>;
4
18
  getRun(id: string): BenchmarkRun | null;
5
19
  listRuns(): Array<{
6
20
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"benchmark.d.ts","sourceRoot":"","sources":["../../src/services/benchmark.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,eAAe,EACf,YAAY,EACZ,sBAAsB,EACvB,MAAM,wBAAwB,CAAC;AAEhC,qBAAa,gBAAgB;IACrB,YAAY,CAChB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,GAAG,EACV,MAAM,EAAE,eAAe,EACvB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,GACnD,OAAO,CAAC,YAAY,CAAC;IAIxB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAIvC,QAAQ,IAAI,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAGtE;AAED,eAAO,MAAM,gBAAgB,kBAAyB,CAAC"}
1
+ {"version":3,"file":"benchmark.d.ts","sourceRoot":"","sources":["../../src/services/benchmark.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,eAAe,EACf,YAAY,EACZ,sBAAsB,EAEvB,MAAM,wBAAwB,CAAC;AAKhC,OAAO,EAAuB,kBAAkB,EAAE,MAAM,UAAU,CAAC;AAInE,OAAO,EAAE,sBAAsB,EAAE,MAAM,wBAAwB,CAAC;AAIhE,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB,CAAC,EAAE,MAAM,EAAE,CAAC;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,qBAAa,gBAAgB;IACrB,YAAY,CAChB,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,GAAG,EACV,MAAM,EAAE,eAAe,EACvB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,GACnD,OAAO,CAAC,YAAY,CAAC;IAIlB,qBAAqB,CACzB,OAAO,EAAE,yBAAyB,EAClC,MAAM,EAAE,eAAe,EACvB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,GACnD,OAAO,CAAC,YAAY,CAAC;IA8HlB,uBAAuB,CAC3B,OAAO,EAAE;QACP,WAAW,EAAE,kBAAkB,CAAC;QAChC,YAAY,CAAC,EAAE,OAAO,CAAC;KACxB,EACD,MAAM,EAAE,eAAe,EACvB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,GACnD,OAAO,CAAC,YAAY,CAAC;IAoGlB,oBAAoB,CACxB,KAAK,EAAE,sBAAsB,EAC7B,MAAM,EAAE,eAAe,EACvB,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,IAAI,GACnD,OAAO,CAAC,YAAY,CAAC;IAiJxB,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI;IAIvC,QAAQ,IAAI,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAGtE;AAED,eAAO,MAAM,gBAAgB,kBAAyB,CAAC"}
@@ -3,10 +3,335 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.benchmarkService = exports.BenchmarkService = void 0;
4
4
  const runner_1 = require("../lib/benchmark/runner");
5
5
  const storage_1 = require("../lib/benchmark/storage");
6
+ const tasks_1 = require("../services/tasks");
7
+ const task_execution_core_1 = require("../lib/task-execution-core");
8
+ const config_1 = require("../lib/config");
9
+ const git_utils_1 = require("../lib/git-utils");
10
+ const logger_1 = require("../lib/logger");
11
+ const task_loop_execution_1 = require("../lib/task-loop-execution");
12
+ const workflow_1 = require("./workflow");
13
+ const path_1 = require("path");
6
14
  class BenchmarkService {
7
15
  async runBenchmark(operationId, input, config, onProgress) {
8
16
  return await runner_1.benchmarkRunner.run(operationId, input, config, onProgress);
9
17
  }
18
+ async runExecutionBenchmark(options, config, onProgress) {
19
+ const { taskId, verificationCommands, maxRetries = 3, keepBranches = true } = options;
20
+ // 1. Safety Check: Git state must be clean
21
+ if (!(await (0, git_utils_1.isClean)())) {
22
+ throw new Error("Working directory is not clean. Please commit or stash changes before running benchmarks.");
23
+ }
24
+ const task = await tasks_1.taskService.getTask(taskId);
25
+ if (!task) {
26
+ throw new Error(`Task ${taskId} not found`);
27
+ }
28
+ const baseBranch = await (0, git_utils_1.getCurrentBranch)();
29
+ const runId = `bench-${taskId}-${Date.now()}`;
30
+ const results = [];
31
+ logger_1.logger.info(`🚀 Starting Execution Benchmark for Task: ${task.title}`);
32
+ logger_1.logger.info(`📍 Base Branch: ${baseBranch}`);
33
+ // 2. Iterate Models
34
+ for (const modelConfig of config.models) {
35
+ const modelId = `${modelConfig.provider}:${modelConfig.model}`;
36
+ // Sanitize model name for branch
37
+ const safeModelName = modelConfig.model.replace(/[^a-zA-Z0-9-]/g, "-");
38
+ const branchName = `bench/${taskId}/${safeModelName}-${Date.now()}`;
39
+ onProgress?.({ type: "start", modelId });
40
+ try {
41
+ // 3. Create & Checkout Isolation Branch
42
+ await (0, git_utils_1.createBenchmarkBranch)(branchName, baseBranch);
43
+ await (0, git_utils_1.checkoutBranch)(branchName);
44
+ // 4. Configure Environment
45
+ const previousConfig = config_1.configManager.getAIConfig();
46
+ await config_1.configManager.setAIConfig({
47
+ provider: modelConfig.provider,
48
+ model: modelConfig.model,
49
+ });
50
+ // 5. Execute Task
51
+ const startTime = Date.now();
52
+ const executionConfig = {
53
+ tool: "opencode", // Default executor
54
+ executorConfig: {
55
+ model: modelConfig.model,
56
+ },
57
+ verificationCommands: verificationCommands,
58
+ enableRetry: true,
59
+ maxRetries: maxRetries,
60
+ tryModels: [], // No model fallback during benchmark
61
+ autoCommit: true, // Force commit to capture work in branch
62
+ };
63
+ let output;
64
+ let error;
65
+ try {
66
+ output = await (0, task_execution_core_1.executeTaskCore)(taskId, executionConfig);
67
+ }
68
+ catch (e) {
69
+ error = e instanceof Error ? e.message : String(e);
70
+ }
71
+ const duration = Date.now() - startTime;
72
+ // Restore Config
73
+ await config_1.configManager.setAIConfig(previousConfig);
74
+ // 6. Capture Result
75
+ results.push({
76
+ modelId,
77
+ output: {
78
+ ...output,
79
+ branch: branchName,
80
+ status: output?.success ? "PASS" : "FAIL",
81
+ },
82
+ duration,
83
+ error,
84
+ timestamp: Date.now(),
85
+ });
86
+ onProgress?.({
87
+ type: output?.success ? "complete" : "error",
88
+ modelId,
89
+ duration,
90
+ error,
91
+ });
92
+ // 7. Cleanup
93
+ await (0, git_utils_1.checkoutBranch)(baseBranch);
94
+ if (!keepBranches) {
95
+ await (0, git_utils_1.cleanupBenchmarkBranch)(branchName);
96
+ }
97
+ }
98
+ catch (err) {
99
+ // Critical Failure Loop Rescue
100
+ logger_1.logger.error(`💥 Critical Benchmark Failure for ${modelId}: ${err}`);
101
+ try {
102
+ // Attempt to return to safety
103
+ const current = await (0, git_utils_1.getCurrentBranch)();
104
+ if (current !== baseBranch) {
105
+ await (0, git_utils_1.checkoutBranch)(baseBranch);
106
+ }
107
+ }
108
+ catch (resetErr) {
109
+ logger_1.logger.error(`🔥 FATAL: Could not reset branch: ${resetErr}`);
110
+ throw resetErr; // Stop everything if git state is corrupted
111
+ }
112
+ }
113
+ }
114
+ const run = {
115
+ id: runId,
116
+ timestamp: Date.now(),
117
+ command: "execution-benchmark",
118
+ input: options,
119
+ config,
120
+ results,
121
+ };
122
+ storage_1.benchmarkStorage.saveRun(run);
123
+ return run;
124
+ }
125
+ async runExecuteLoopBenchmark(options, config, onProgress) {
126
+ const { loopOptions, keepBranches = true } = options;
127
+ // 1. Safety Check: Git state must be clean
128
+ if (!(await (0, git_utils_1.isClean)())) {
129
+ throw new Error("Working directory is not clean. Please commit or stash changes before running benchmarks.");
130
+ }
131
+ const baseBranch = await (0, git_utils_1.getCurrentBranch)();
132
+ const runId = `bench-loop-${Date.now()}`;
133
+ const results = [];
134
+ logger_1.logger.info(`🚀 Starting Execute Loop Benchmark`);
135
+ logger_1.logger.info(`📍 Base Branch: ${baseBranch}`);
136
+ // 2. Iterate Models
137
+ for (const modelConfig of config.models) {
138
+ const modelId = `${modelConfig.provider}:${modelConfig.model}`;
139
+ const safeModelName = modelConfig.model.replace(/[^a-zA-Z0-9-]/g, "-");
140
+ const branchName = `bench/loop/${safeModelName}-${Date.now()}`;
141
+ onProgress?.({ type: "start", modelId });
142
+ try {
143
+ // 3. Create & Checkout Isolation Branch
144
+ await (0, git_utils_1.createBenchmarkBranch)(branchName, baseBranch);
145
+ await (0, git_utils_1.checkoutBranch)(branchName);
146
+ // 4. Configure Environment
147
+ const previousConfig = config_1.configManager.getAIConfig();
148
+ await config_1.configManager.setAIConfig({
149
+ provider: modelConfig.provider,
150
+ model: modelConfig.model,
151
+ });
152
+ // 5. Execute Loop
153
+ const startTime = Date.now();
154
+ const loopResult = await (0, task_loop_execution_1.executeTaskLoop)(loopOptions);
155
+ const duration = Date.now() - startTime;
156
+ // Restore Config
157
+ await config_1.configManager.setAIConfig(previousConfig);
158
+ // 6. Capture Result
159
+ const success = loopResult.failedTasks === 0;
160
+ results.push({
161
+ modelId,
162
+ output: {
163
+ ...loopResult,
164
+ branch: branchName,
165
+ status: success ? "PASS" : "FAIL",
166
+ },
167
+ duration,
168
+ error: success
169
+ ? undefined
170
+ : `${loopResult.failedTasks} tasks failed`,
171
+ timestamp: Date.now(),
172
+ });
173
+ onProgress?.({
174
+ type: success ? "complete" : "error",
175
+ modelId,
176
+ duration,
177
+ error: success ? undefined : `${loopResult.failedTasks} tasks failed`,
178
+ });
179
+ // 7. Cleanup
180
+ await (0, git_utils_1.checkoutBranch)(baseBranch);
181
+ if (!keepBranches) {
182
+ await (0, git_utils_1.cleanupBenchmarkBranch)(branchName);
183
+ }
184
+ }
185
+ catch (err) {
186
+ logger_1.logger.error(`💥 Critical Benchmark Failure for ${modelId}: ${err}`);
187
+ try {
188
+ const current = await (0, git_utils_1.getCurrentBranch)();
189
+ if (current !== baseBranch) {
190
+ await (0, git_utils_1.checkoutBranch)(baseBranch);
191
+ }
192
+ }
193
+ catch (resetErr) {
194
+ logger_1.logger.error(`🔥 FATAL: Could not reset branch: ${resetErr}`);
195
+ throw resetErr;
196
+ }
197
+ }
198
+ }
199
+ const run = {
200
+ id: runId,
201
+ timestamp: Date.now(),
202
+ command: "execute-loop-benchmark",
203
+ input: options,
204
+ config,
205
+ results,
206
+ };
207
+ storage_1.benchmarkStorage.saveRun(run);
208
+ return run;
209
+ }
210
+ async runWorkflowBenchmark(input, config, onProgress) {
211
+ const runId = `bench-workflow-${Date.now()}`;
212
+ const results = [];
213
+ const baseDir = input.tempDirBase || (0, path_1.resolve)(process.cwd(), "benchmarks");
214
+ logger_1.logger.info(`🚀 Starting Workflow Benchmark`);
215
+ logger_1.logger.info(`📍 Base Directory: ${baseDir}`);
216
+ for (const modelConfig of config.models) {
217
+ const modelId = `${modelConfig.provider}:${modelConfig.model}`;
218
+ const safeModelName = modelConfig.model.replace(/[^a-zA-Z0-9-]/g, "-");
219
+ const timestamp = Date.now();
220
+ const projectDir = (0, path_1.join)(baseDir, `${input.collectedResponses.projectName}-${safeModelName}-${timestamp}`);
221
+ onProgress?.({ type: "start", modelId });
222
+ const startTime = Date.now();
223
+ try {
224
+ // Prepare AI Options
225
+ const aiOptions = {
226
+ aiProvider: modelConfig.provider,
227
+ aiModel: modelConfig.model,
228
+ aiKey: process.env.AI_API_KEY, // Propagate key
229
+ };
230
+ // 1. Initialize
231
+ const initResult = await workflow_1.workflowService.initializeProject({
232
+ projectName: input.collectedResponses.projectName,
233
+ projectDir,
234
+ initMethod: input.collectedResponses.initMethod,
235
+ projectDescription: input.collectedResponses.projectDescription,
236
+ stackConfig: input.collectedResponses.stackConfig,
237
+ aiOptions,
238
+ bootstrap: true, // Always bootstrap for benchmarks? or follow input
239
+ includeDocs: true,
240
+ });
241
+ // 2. Define PRD
242
+ const prdResult = await workflow_1.workflowService.definePRD({
243
+ method: input.collectedResponses.prdMethod,
244
+ prdContent: input.collectedResponses.prdContent,
245
+ prdDescription: input.collectedResponses.prdDescription,
246
+ prdFile: input.collectedResponses.prdFile,
247
+ projectDir,
248
+ aiOptions,
249
+ });
250
+ // 3. Generate Tasks
251
+ let tasksResult = { tasks: [] };
252
+ if (input.collectedResponses.generateTasks) {
253
+ tasksResult = await workflow_1.workflowService.generateTasks({
254
+ prdFile: prdResult.prdFile,
255
+ method: "ai",
256
+ customInstructions: input.collectedResponses.customInstructions,
257
+ projectDir,
258
+ aiOptions,
259
+ });
260
+ }
261
+ // 4. Split Tasks
262
+ let splitResult;
263
+ if (input.collectedResponses.splitTasks &&
264
+ tasksResult.tasks.length > 0) {
265
+ splitResult = await workflow_1.workflowService.splitTasks({
266
+ taskIds: tasksResult.tasks.map((t) => t.id),
267
+ splitMethod: "standard",
268
+ customInstructions: input.collectedResponses.splitInstructions,
269
+ aiOptions,
270
+ });
271
+ }
272
+ // 5. Execute Tasks (Optional)
273
+ let executionResult;
274
+ if (input.workflowOptions.executeTasks) {
275
+ // Switch to project dir for execution
276
+ const originalCwd = process.cwd();
277
+ process.chdir(projectDir);
278
+ try {
279
+ executionResult = await workflow_1.workflowService.executeTasks({
280
+ options: {
281
+ filters: {}, // Execute all
282
+ tool: "opencode",
283
+ config: {
284
+ maxRetries: 3,
285
+ autoCommit: true,
286
+ },
287
+ dry: false
288
+ }
289
+ });
290
+ }
291
+ finally {
292
+ process.chdir(originalCwd);
293
+ }
294
+ }
295
+ const duration = Date.now() - startTime;
296
+ results.push({
297
+ modelId,
298
+ duration,
299
+ timestamp: Date.now(),
300
+ output: {
301
+ projectDir,
302
+ stats: {
303
+ totalTasks: tasksResult.tasks.length,
304
+ successfulSteps: 5, // Approximate
305
+ totalSteps: 5
306
+ },
307
+ execution: executionResult
308
+ }
309
+ });
310
+ onProgress?.({ type: "complete", modelId, duration });
311
+ }
312
+ catch (error) {
313
+ const duration = Date.now() - startTime;
314
+ results.push({
315
+ modelId,
316
+ duration,
317
+ timestamp: Date.now(),
318
+ error: error instanceof Error ? error.message : String(error),
319
+ output: {}
320
+ });
321
+ onProgress?.({ type: "error", modelId, error: String(error) });
322
+ }
323
+ }
324
+ const run = {
325
+ id: runId,
326
+ timestamp: Date.now(),
327
+ command: "workflow-benchmark",
328
+ input,
329
+ config,
330
+ results,
331
+ };
332
+ storage_1.benchmarkStorage.saveRun(run);
333
+ return run;
334
+ }
10
335
  getRun(id) {
11
336
  return storage_1.benchmarkStorage.getRun(id);
12
337
  }
@@ -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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"}
@@ -699,21 +699,31 @@ class TaskService {
699
699
  message: `Creating subtask ${i + 1}/${subtaskData.length}: ${subtask.title}`,
700
700
  type: "progress",
701
701
  });
702
- const result = await this.createTask({
703
- title: subtask.title,
704
- content: subtask.content,
705
- effort: subtask.estimatedEffort,
706
- parentId: taskId,
707
- });
708
- createdSubtasks.push(result.task);
709
- // Save AI metadata for each subtask (Bug fix 2.3)
710
- const subtaskMetadata = {
711
- ...(0, metadata_utils_1.createBaseAIMetadata)(result.task.id, aiConfig, promptOverride, "Split task into meaningful subtasks with full context and existing subtask awareness", 0.9),
712
- splitAt: splitTimestamp,
713
- parentTaskId: taskId,
714
- subtaskIndex: i + 1,
715
- };
716
- await (0, ai_service_factory_1.getStorage)().saveTaskAIMetadata(subtaskMetadata);
702
+ // console.log(
703
+ // `[DEBUG] Creating subtask ${i + 1}:`,
704
+ // JSON.stringify(subtask, null, 2)
705
+ // );
706
+ try {
707
+ const result = await this.createTask({
708
+ title: subtask.title,
709
+ content: subtask.content,
710
+ effort: subtask.estimatedEffort,
711
+ parentId: taskId,
712
+ });
713
+ createdSubtasks.push(result.task);
714
+ // Save AI metadata for each subtask (Bug fix 2.3)
715
+ const subtaskMetadata = {
716
+ ...(0, metadata_utils_1.createBaseAIMetadata)(result.task.id, aiConfig, promptOverride, "Split task into meaningful subtasks with full context and existing subtask awareness", 0.9),
717
+ splitAt: splitTimestamp,
718
+ parentTaskId: taskId,
719
+ subtaskIndex: i + 1,
720
+ };
721
+ await (0, ai_service_factory_1.getStorage)().saveTaskAIMetadata(subtaskMetadata);
722
+ }
723
+ catch (err) {
724
+ console.error(`[DEBUG] Failed to create subtask ${i + 1}:`, err);
725
+ throw err;
726
+ }
717
727
  }
718
728
  // Save AI metadata for parent task as well
719
729
  const parentMetadata = {
@@ -2,6 +2,7 @@ import { AIOptions } from "../utils/ai-config-builder";
2
2
  import { StreamingOptions } from "../types";
3
3
  import { ProgressCallback } from "../types/callbacks";
4
4
  import { InitializeResult, DefinePRDResult, RefinePRDResult, GenerateTasksResult, SplitTasksResult } from "../types/workflow-results";
5
+ import { ExecuteLoopOptions, ExecuteLoopResult } from "../types";
5
6
  /**
6
7
  * WorkflowService - Business logic for workflow operations
7
8
  * Extracts all workflow logic from the command layer for reusability
@@ -90,6 +91,17 @@ export declare class WorkflowService {
90
91
  streamingOptions?: StreamingOptions;
91
92
  callbacks?: ProgressCallback;
92
93
  }): Promise<SplitTasksResult>;
94
+ /**
95
+ * Step 6: Execute Tasks
96
+ * Executes the generated tasks using the task loop executor
97
+ */
98
+ executeTasks(input: {
99
+ options: ExecuteLoopOptions;
100
+ callbacks?: ProgressCallback;
101
+ }): Promise<{
102
+ success: boolean;
103
+ result: ExecuteLoopResult;
104
+ }>;
93
105
  }
94
106
  export declare const workflowService: WorkflowService;
95
107
  //# sourceMappingURL=workflow.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/services/workflow.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"workflow.d.ts","sourceRoot":"","sources":["../../src/services/workflow.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,7 @@ const prd_1 = require("./prd");
9
9
  const tasks_1 = require("./tasks");
10
10
  const workflow_ai_assistant_1 = require("./workflow-ai-assistant");
11
11
  const task_o_matic_error_1 = require("../utils/task-o-matic-error");
12
+ const task_loop_execution_1 = require("../lib/task-loop-execution");
12
13
  /**
13
14
  * WorkflowService - Business logic for workflow operations
14
15
  * Extracts all workflow logic from the command layer for reusability
@@ -554,6 +555,25 @@ class WorkflowService {
554
555
  results,
555
556
  };
556
557
  }
558
+ /**
559
+ * Step 6: Execute Tasks
560
+ * Executes the generated tasks using the task loop executor
561
+ */
562
+ async executeTasks(input) {
563
+ input.callbacks?.onProgress?.({
564
+ type: "started",
565
+ message: "Executing tasks...",
566
+ });
567
+ const result = await (0, task_loop_execution_1.executeTaskLoop)(input.options);
568
+ input.callbacks?.onProgress?.({
569
+ type: "completed",
570
+ message: `Execution complete: ${result.completedTasks} completed, ${result.failedTasks} failed`,
571
+ });
572
+ return {
573
+ success: result.failedTasks === 0,
574
+ result,
575
+ };
576
+ }
557
577
  }
558
578
  exports.WorkflowService = WorkflowService;
559
579
  // Export singleton instance
@@ -37,35 +37,35 @@ const child_process_1 = require("child_process");
37
37
  const assert = __importStar(require("assert"));
38
38
  describe("CLI Commands", () => {
39
39
  it("should show help for the main command", (done) => {
40
- (0, child_process_1.exec)("npx tsx src/cli/bin.ts --help", (error, stdout, stderr) => {
40
+ (0, child_process_1.exec)("bun src/cli/bin.ts --help", (error, stdout, stderr) => {
41
41
  assert.strictEqual(error, null);
42
- assert.ok(stdout.includes("Usage: task-o-matic [options] [command]"));
42
+ assert.ok(stdout.includes("Usage: task-o-matic"));
43
43
  done();
44
44
  });
45
45
  });
46
46
  it("should show help for the config command", (done) => {
47
- (0, child_process_1.exec)("npx tsx src/cli/bin.ts config --help", (error, stdout, stderr) => {
47
+ (0, child_process_1.exec)("bun src/cli/bin.ts config --help", (error, stdout, stderr) => {
48
48
  assert.strictEqual(error, null);
49
- assert.ok(stdout.includes("Usage: task-o-matic config [options] [command]"));
49
+ assert.ok(stdout.includes("Usage: task-o-matic config"));
50
50
  done();
51
51
  });
52
52
  });
53
- it("should show help for the tasks command", (done) => {
54
- (0, child_process_1.exec)("npx tsx src/cli/bin.ts tasks --help", (error, stdout, stderr) => {
53
+ it("should help for the tasks command", (done) => {
54
+ (0, child_process_1.exec)("bun src/cli/bin.ts tasks --help", (error, stdout, stderr) => {
55
55
  assert.strictEqual(error, null);
56
- assert.ok(stdout.includes("Usage: task-o-matic tasks [options] [command]"));
56
+ assert.ok(stdout.includes("Usage: task-o-matic tasks"));
57
57
  done();
58
58
  });
59
59
  });
60
60
  it("should show help for the prd command", (done) => {
61
- (0, child_process_1.exec)("npx tsx src/cli/bin.ts prd --help", (error, stdout, stderr) => {
61
+ (0, child_process_1.exec)("bun src/cli/bin.ts prd --help", (error, stdout, stderr) => {
62
62
  assert.strictEqual(error, null);
63
- assert.ok(stdout.includes("Usage: task-o-matic prd [options] [command]"));
63
+ assert.ok(stdout.includes("Usage: task-o-matic prd"));
64
64
  done();
65
65
  });
66
66
  });
67
67
  it("should show help for the init command", (done) => {
68
- (0, child_process_1.exec)("npx tsx src/cli/bin.ts init --help", (error, stdout, stderr) => {
68
+ (0, child_process_1.exec)("bun src/cli/bin.ts init --help", (error, stdout, stderr) => {
69
69
  assert.strictEqual(error, null);
70
70
  assert.ok(stdout.includes("Usage: task-o-matic init [options] [command]"));
71
71
  done();
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=model-parsing.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-parsing.test.d.ts","sourceRoot":"","sources":["../../src/test/model-parsing.test.ts"],"names":[],"mappings":""}