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.
- package/dist/commands/benchmark.js +203 -173
- package/dist/commands/install.d.ts +3 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +150 -0
- package/dist/commands/prd.d.ts +5 -0
- package/dist/commands/prd.d.ts.map +1 -1
- package/dist/commands/prd.js +297 -189
- package/dist/commands/tasks/split.d.ts.map +1 -1
- package/dist/commands/tasks/split.js +129 -27
- package/dist/commands/utils/ai-parallel.d.ts +20 -0
- package/dist/commands/utils/ai-parallel.d.ts.map +1 -0
- package/dist/commands/utils/ai-parallel.js +115 -0
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +59 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/lib/ai-service/gemini-proxy.d.ts +15 -0
- package/dist/lib/ai-service/gemini-proxy.d.ts.map +1 -0
- package/dist/lib/ai-service/gemini-proxy.js +90 -0
- package/dist/lib/ai-service/json-parser.d.ts +16 -4
- package/dist/lib/ai-service/json-parser.d.ts.map +1 -1
- package/dist/lib/ai-service/json-parser.js +93 -19
- package/dist/lib/ai-service/model-provider.d.ts.map +1 -1
- package/dist/lib/ai-service/model-provider.js +31 -2
- package/dist/lib/ai-service/prd-operations.d.ts.map +1 -1
- package/dist/lib/ai-service/prd-operations.js +21 -5
- package/dist/lib/ai-service/task-operations.d.ts.map +1 -1
- package/dist/lib/ai-service/task-operations.js +10 -2
- package/dist/lib/better-t-stack-cli.d.ts.map +1 -1
- package/dist/lib/better-t-stack-cli.js +6 -5
- package/dist/lib/config-validation.d.ts +9 -9
- package/dist/lib/config-validation.d.ts.map +1 -1
- package/dist/lib/config-validation.js +11 -3
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +11 -2
- package/dist/lib/git-utils.d.ts +35 -0
- package/dist/lib/git-utils.d.ts.map +1 -1
- package/dist/lib/git-utils.js +69 -0
- package/dist/lib/provider-defaults.json +11 -1
- package/dist/lib/task-loop-execution.d.ts.map +1 -1
- package/dist/lib/task-loop-execution.js +5 -1
- package/dist/services/benchmark.d.ts +14 -0
- package/dist/services/benchmark.d.ts.map +1 -1
- package/dist/services/benchmark.js +325 -0
- package/dist/services/tasks.d.ts.map +1 -1
- package/dist/services/tasks.js +25 -15
- package/dist/services/workflow.d.ts +12 -0
- package/dist/services/workflow.d.ts.map +1 -1
- package/dist/services/workflow.js +20 -0
- package/dist/test/commands.test.js +10 -10
- package/dist/test/model-parsing.test.d.ts +2 -0
- package/dist/test/model-parsing.test.d.ts.map +1 -0
- package/dist/test/model-parsing.test.js +73 -0
- package/dist/types/cli-options.d.ts +2 -0
- package/dist/types/cli-options.d.ts.map +1 -1
- package/dist/types/index.d.ts +13 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +10 -0
- package/dist/types/workflow-options.d.ts +25 -0
- package/dist/types/workflow-options.d.ts.map +1 -1
- package/dist/utils/ai-operation-utility.d.ts.map +1 -1
- package/dist/utils/ai-operation-utility.js +26 -2
- package/dist/utils/metadata-utils.d.ts +1 -1
- package/dist/utils/streaming-utils.d.ts.map +1 -1
- package/dist/utils/streaming-utils.js +8 -0
- package/docs/agents/cli.md +19 -12
- package/package.json +1 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"openrouter": {
|
|
3
|
-
"model": "z-ai/glm-4.
|
|
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,
|
|
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,
|
|
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,
|
|
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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"}
|
package/dist/services/tasks.js
CHANGED
|
@@ -699,21 +699,31 @@ class TaskService {
|
|
|
699
699
|
message: `Creating subtask ${i + 1}/${subtaskData.length}: ${subtask.title}`,
|
|
700
700
|
type: "progress",
|
|
701
701
|
});
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
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)("
|
|
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
|
|
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)("
|
|
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
|
|
49
|
+
assert.ok(stdout.includes("Usage: task-o-matic config"));
|
|
50
50
|
done();
|
|
51
51
|
});
|
|
52
52
|
});
|
|
53
|
-
it("should
|
|
54
|
-
(0, child_process_1.exec)("
|
|
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
|
|
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)("
|
|
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
|
|
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)("
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"model-parsing.test.d.ts","sourceRoot":"","sources":["../../src/test/model-parsing.test.ts"],"names":[],"mappings":""}
|