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.
Files changed (51) hide show
  1. package/dist/cli/convoy/engine.d.ts +1 -0
  2. package/dist/cli/convoy/engine.d.ts.map +1 -1
  3. package/dist/cli/convoy/engine.js +72 -22
  4. package/dist/cli/convoy/engine.js.map +1 -1
  5. package/dist/cli/convoy/engine.test.js +205 -0
  6. package/dist/cli/convoy/engine.test.js.map +1 -1
  7. package/dist/cli/dashboard.d.ts.map +1 -1
  8. package/dist/cli/dashboard.js +5 -4
  9. package/dist/cli/dashboard.js.map +1 -1
  10. package/dist/cli/run/adapters/claude.d.ts +6 -0
  11. package/dist/cli/run/adapters/claude.d.ts.map +1 -0
  12. package/dist/cli/run/adapters/claude.js +211 -0
  13. package/dist/cli/run/adapters/claude.js.map +1 -0
  14. package/dist/cli/run/adapters/copilot.d.ts +0 -18
  15. package/dist/cli/run/adapters/copilot.d.ts.map +1 -1
  16. package/dist/cli/run/adapters/copilot.js +123 -38
  17. package/dist/cli/run/adapters/copilot.js.map +1 -1
  18. package/dist/cli/run/adapters/index.js +2 -2
  19. package/dist/cli/run/adapters/index.js.map +1 -1
  20. package/dist/cli/run/schema.d.ts.map +1 -1
  21. package/dist/cli/run/schema.js +8 -0
  22. package/dist/cli/run/schema.js.map +1 -1
  23. package/dist/cli/run/schema.test.js +41 -0
  24. package/dist/cli/run/schema.test.js.map +1 -1
  25. package/dist/cli/run.d.ts.map +1 -1
  26. package/dist/cli/run.js +21 -9
  27. package/dist/cli/run.js.map +1 -1
  28. package/dist/cli/types.d.ts +2 -0
  29. package/dist/cli/types.d.ts.map +1 -1
  30. package/package.json +9 -1
  31. package/src/cli/convoy/engine.test.ts +240 -0
  32. package/src/cli/convoy/engine.ts +80 -23
  33. package/src/cli/dashboard.ts +6 -5
  34. package/src/cli/run/adapters/claude.ts +238 -0
  35. package/src/cli/run/adapters/copilot.ts +125 -47
  36. package/src/cli/run/adapters/index.ts +2 -2
  37. package/src/cli/run/adapters/vendor.d.ts +2 -0
  38. package/src/cli/run/schema.test.ts +51 -0
  39. package/src/cli/run/schema.ts +10 -0
  40. package/src/cli/run.ts +23 -11
  41. package/src/cli/types.ts +2 -0
  42. package/src/dashboard/node_modules/.vite/deps/_metadata.json +6 -6
  43. package/src/orchestrator/agents/team-lead.agent.md +6 -6
  44. package/src/orchestrator/prompts/bug-fix.prompt.md +6 -2
  45. package/src/orchestrator/prompts/generate-convoy.prompt.md +3 -3
  46. package/src/orchestrator/prompts/implement-feature.prompt.md +8 -19
  47. package/dist/cli/run/adapters/claude-code.d.ts +0 -16
  48. package/dist/cli/run/adapters/claude-code.d.ts.map +0 -1
  49. package/dist/cli/run/adapters/claude-code.js +0 -95
  50. package/dist/cli/run/adapters/claude-code.js.map +0 -1
  51. 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
- }