opencastle 0.23.1 → 0.24.0
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/cli/convoy/engine.d.ts +1 -0
- package/dist/cli/convoy/engine.d.ts.map +1 -1
- package/dist/cli/convoy/engine.js +72 -22
- package/dist/cli/convoy/engine.js.map +1 -1
- package/dist/cli/convoy/engine.test.js +205 -0
- package/dist/cli/convoy/engine.test.js.map +1 -1
- package/dist/cli/dashboard.d.ts.map +1 -1
- package/dist/cli/dashboard.js +5 -4
- package/dist/cli/dashboard.js.map +1 -1
- package/dist/cli/run/adapters/claude.d.ts +6 -0
- package/dist/cli/run/adapters/claude.d.ts.map +1 -0
- package/dist/cli/run/adapters/claude.js +211 -0
- package/dist/cli/run/adapters/claude.js.map +1 -0
- package/dist/cli/run/adapters/copilot.d.ts +0 -18
- package/dist/cli/run/adapters/copilot.d.ts.map +1 -1
- package/dist/cli/run/adapters/copilot.js +123 -38
- package/dist/cli/run/adapters/copilot.js.map +1 -1
- package/dist/cli/run/adapters/index.js +2 -2
- package/dist/cli/run/adapters/index.js.map +1 -1
- package/dist/cli/run/schema.d.ts.map +1 -1
- package/dist/cli/run/schema.js +8 -0
- package/dist/cli/run/schema.js.map +1 -1
- package/dist/cli/run/schema.test.js +41 -0
- package/dist/cli/run/schema.test.js.map +1 -1
- package/dist/cli/run.d.ts.map +1 -1
- package/dist/cli/run.js +21 -9
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/types.d.ts +2 -0
- package/dist/cli/types.d.ts.map +1 -1
- package/package.json +9 -1
- package/src/cli/convoy/engine.test.ts +240 -0
- package/src/cli/convoy/engine.ts +80 -23
- package/src/cli/dashboard.ts +6 -5
- package/src/cli/run/adapters/claude.ts +238 -0
- package/src/cli/run/adapters/copilot.ts +125 -47
- package/src/cli/run/adapters/index.ts +2 -2
- package/src/cli/run/adapters/vendor.d.ts +2 -0
- package/src/cli/run/schema.test.ts +51 -0
- package/src/cli/run/schema.ts +10 -0
- package/src/cli/run.ts +23 -11
- package/src/cli/types.ts +2 -0
- package/src/dashboard/node_modules/.vite/deps/_metadata.json +6 -6
- package/src/orchestrator/agents/team-lead.agent.md +6 -6
- package/src/orchestrator/prompts/bug-fix.prompt.md +6 -2
- package/src/orchestrator/prompts/generate-convoy.prompt.md +3 -3
- package/src/orchestrator/prompts/implement-feature.prompt.md +8 -19
- package/dist/cli/run/adapters/claude-code.d.ts +0 -16
- package/dist/cli/run/adapters/claude-code.d.ts.map +0 -1
- package/dist/cli/run/adapters/claude-code.js +0 -95
- package/dist/cli/run/adapters/claude-code.js.map +0 -1
- package/src/cli/run/adapters/claude-code.ts +0 -107
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
import { spawn } from 'node:child_process';
|
|
2
|
-
/** Adapter name */
|
|
3
|
-
export const name = 'claude-code';
|
|
4
|
-
/**
|
|
5
|
-
* Check if the `claude` CLI is available on the system PATH.
|
|
6
|
-
*/
|
|
7
|
-
export async function isAvailable() {
|
|
8
|
-
return new Promise((resolve) => {
|
|
9
|
-
const proc = spawn('which', ['claude'], { stdio: 'pipe' });
|
|
10
|
-
proc.on('close', (code) => resolve(code === 0));
|
|
11
|
-
proc.on('error', () => resolve(false));
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Execute a task by invoking the Claude Code CLI in print mode.
|
|
16
|
-
*/
|
|
17
|
-
export async function execute(task, options = {}) {
|
|
18
|
-
let prompt = `You are a ${task.agent}. ${task.prompt}`;
|
|
19
|
-
if (task.files && task.files.length > 0) {
|
|
20
|
-
prompt += `\n\nOnly modify files under: ${task.files.join(', ')}`;
|
|
21
|
-
}
|
|
22
|
-
const args = [
|
|
23
|
-
'-p',
|
|
24
|
-
prompt,
|
|
25
|
-
'--output-format',
|
|
26
|
-
'json',
|
|
27
|
-
'--max-turns',
|
|
28
|
-
'50',
|
|
29
|
-
];
|
|
30
|
-
return new Promise((resolve) => {
|
|
31
|
-
const proc = spawn('claude', args, {
|
|
32
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
33
|
-
env: { ...process.env },
|
|
34
|
-
cwd: options?.cwd ?? process.cwd(),
|
|
35
|
-
});
|
|
36
|
-
let stdout = '';
|
|
37
|
-
let stderr = '';
|
|
38
|
-
proc.stdout.on('data', (chunk) => {
|
|
39
|
-
stdout += chunk.toString();
|
|
40
|
-
if (options.verbose) {
|
|
41
|
-
process.stdout.write(chunk);
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
proc.stderr.on('data', (chunk) => {
|
|
45
|
-
stderr += chunk.toString();
|
|
46
|
-
if (options.verbose) {
|
|
47
|
-
process.stderr.write(chunk);
|
|
48
|
-
}
|
|
49
|
-
});
|
|
50
|
-
proc.on('close', (code) => {
|
|
51
|
-
const output = [stdout, stderr].filter(Boolean).join('\n');
|
|
52
|
-
let usage;
|
|
53
|
-
try {
|
|
54
|
-
const parsed = JSON.parse(stdout);
|
|
55
|
-
const u = parsed?.usage;
|
|
56
|
-
if (u) {
|
|
57
|
-
const promptTokens = (u.input_tokens ?? u.prompt_tokens);
|
|
58
|
-
const completionTokens = (u.output_tokens ?? u.completion_tokens);
|
|
59
|
-
const total = ((promptTokens ?? 0) + (completionTokens ?? 0)) || undefined;
|
|
60
|
-
usage = { prompt_tokens: promptTokens, completion_tokens: completionTokens, total_tokens: total };
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
catch { /* not JSON or no usage — graceful degradation */ }
|
|
64
|
-
resolve({
|
|
65
|
-
success: code === 0,
|
|
66
|
-
output: output.slice(0, 10000), // Cap output size
|
|
67
|
-
exitCode: code ?? -1,
|
|
68
|
-
usage,
|
|
69
|
-
});
|
|
70
|
-
});
|
|
71
|
-
proc.on('error', (err) => {
|
|
72
|
-
resolve({
|
|
73
|
-
success: false,
|
|
74
|
-
output: `Failed to spawn claude: ${err.message}`,
|
|
75
|
-
exitCode: -1,
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
// Store process ref for potential timeout kill
|
|
79
|
-
task._process = proc;
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* Kill the process associated with a task (used by timeout enforcement).
|
|
84
|
-
*/
|
|
85
|
-
export function kill(task) {
|
|
86
|
-
if (task._process && !task._process.killed) {
|
|
87
|
-
task._process.kill('SIGTERM');
|
|
88
|
-
setTimeout(() => {
|
|
89
|
-
if (task._process && !task._process.killed) {
|
|
90
|
-
task._process.kill('SIGKILL');
|
|
91
|
-
}
|
|
92
|
-
}, 5000);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
//# sourceMappingURL=claude-code.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../../src/cli/run/adapters/claude-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import { spawn } from 'node:child_process'
|
|
2
|
-
import type { Task, ExecuteOptions, ExecuteResult, TokenUsage } from '../../types.js'
|
|
3
|
-
|
|
4
|
-
/** Adapter name */
|
|
5
|
-
export const name = 'claude-code'
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Check if the `claude` CLI is available on the system PATH.
|
|
9
|
-
*/
|
|
10
|
-
export async function isAvailable(): Promise<boolean> {
|
|
11
|
-
return new Promise((resolve) => {
|
|
12
|
-
const proc = spawn('which', ['claude'], { stdio: 'pipe' })
|
|
13
|
-
proc.on('close', (code) => resolve(code === 0))
|
|
14
|
-
proc.on('error', () => resolve(false))
|
|
15
|
-
})
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Execute a task by invoking the Claude Code CLI in print mode.
|
|
20
|
-
*/
|
|
21
|
-
export async function execute(task: Task, options: ExecuteOptions = {}): Promise<ExecuteResult> {
|
|
22
|
-
let prompt = `You are a ${task.agent}. ${task.prompt}`
|
|
23
|
-
|
|
24
|
-
if (task.files && task.files.length > 0) {
|
|
25
|
-
prompt += `\n\nOnly modify files under: ${task.files.join(', ')}`
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
const args = [
|
|
29
|
-
'-p',
|
|
30
|
-
prompt,
|
|
31
|
-
'--output-format',
|
|
32
|
-
'json',
|
|
33
|
-
'--max-turns',
|
|
34
|
-
'50',
|
|
35
|
-
]
|
|
36
|
-
|
|
37
|
-
return new Promise((resolve) => {
|
|
38
|
-
const proc = spawn('claude', args, {
|
|
39
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
40
|
-
env: { ...process.env },
|
|
41
|
-
cwd: options?.cwd ?? process.cwd(),
|
|
42
|
-
})
|
|
43
|
-
|
|
44
|
-
let stdout = ''
|
|
45
|
-
let stderr = ''
|
|
46
|
-
|
|
47
|
-
proc.stdout.on('data', (chunk: Buffer) => {
|
|
48
|
-
stdout += chunk.toString()
|
|
49
|
-
if (options.verbose) {
|
|
50
|
-
process.stdout.write(chunk)
|
|
51
|
-
}
|
|
52
|
-
})
|
|
53
|
-
|
|
54
|
-
proc.stderr.on('data', (chunk: Buffer) => {
|
|
55
|
-
stderr += chunk.toString()
|
|
56
|
-
if (options.verbose) {
|
|
57
|
-
process.stderr.write(chunk)
|
|
58
|
-
}
|
|
59
|
-
})
|
|
60
|
-
|
|
61
|
-
proc.on('close', (code) => {
|
|
62
|
-
const output = [stdout, stderr].filter(Boolean).join('\n')
|
|
63
|
-
let usage: TokenUsage | undefined
|
|
64
|
-
try {
|
|
65
|
-
const parsed = JSON.parse(stdout) as Record<string, unknown>
|
|
66
|
-
const u = parsed?.usage as Record<string, number> | undefined
|
|
67
|
-
if (u) {
|
|
68
|
-
const promptTokens = (u.input_tokens ?? u.prompt_tokens) as number | undefined
|
|
69
|
-
const completionTokens = (u.output_tokens ?? u.completion_tokens) as number | undefined
|
|
70
|
-
const total = ((promptTokens ?? 0) + (completionTokens ?? 0)) || undefined
|
|
71
|
-
usage = { prompt_tokens: promptTokens, completion_tokens: completionTokens, total_tokens: total }
|
|
72
|
-
}
|
|
73
|
-
} catch { /* not JSON or no usage — graceful degradation */ }
|
|
74
|
-
resolve({
|
|
75
|
-
success: code === 0,
|
|
76
|
-
output: output.slice(0, 10000), // Cap output size
|
|
77
|
-
exitCode: code ?? -1,
|
|
78
|
-
usage,
|
|
79
|
-
})
|
|
80
|
-
})
|
|
81
|
-
|
|
82
|
-
proc.on('error', (err) => {
|
|
83
|
-
resolve({
|
|
84
|
-
success: false,
|
|
85
|
-
output: `Failed to spawn claude: ${err.message}`,
|
|
86
|
-
exitCode: -1,
|
|
87
|
-
})
|
|
88
|
-
})
|
|
89
|
-
|
|
90
|
-
// Store process ref for potential timeout kill
|
|
91
|
-
task._process = proc
|
|
92
|
-
})
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
/**
|
|
96
|
-
* Kill the process associated with a task (used by timeout enforcement).
|
|
97
|
-
*/
|
|
98
|
-
export function kill(task: Task): void {
|
|
99
|
-
if (task._process && !task._process.killed) {
|
|
100
|
-
task._process.kill('SIGTERM')
|
|
101
|
-
setTimeout(() => {
|
|
102
|
-
if (task._process && !task._process.killed) {
|
|
103
|
-
task._process.kill('SIGKILL')
|
|
104
|
-
}
|
|
105
|
-
}, 5000)
|
|
106
|
-
}
|
|
107
|
-
}
|