vralphy 0.5.6 → 0.6.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/commands/build.d.ts +0 -3
- package/dist/commands/build.d.ts.map +1 -1
- package/dist/commands/build.js +16 -50
- package/dist/commands/build.js.map +1 -1
- package/dist/commands/init.d.ts +0 -7
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +12 -77
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/plan.d.ts +0 -3
- package/dist/commands/plan.d.ts.map +1 -1
- package/dist/commands/plan.js +16 -50
- package/dist/commands/plan.js.map +1 -1
- package/dist/commands/spec.d.ts +0 -3
- package/dist/commands/spec.d.ts.map +1 -1
- package/dist/commands/spec.js +15 -77
- package/dist/commands/spec.js.map +1 -1
- package/dist/index.js +20 -72
- package/dist/index.js.map +1 -1
- package/dist/lib/config.d.ts +0 -23
- package/dist/lib/config.d.ts.map +1 -1
- package/dist/lib/config.js +4 -63
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/engines/base.d.ts +8 -59
- package/dist/lib/engines/base.d.ts.map +1 -1
- package/dist/lib/engines/base.js +5 -58
- package/dist/lib/engines/base.js.map +1 -1
- package/dist/lib/engines/claude.d.ts +2 -6
- package/dist/lib/engines/claude.d.ts.map +1 -1
- package/dist/lib/engines/claude.js +15 -133
- package/dist/lib/engines/claude.js.map +1 -1
- package/dist/lib/engines/codex.d.ts +2 -5
- package/dist/lib/engines/codex.d.ts.map +1 -1
- package/dist/lib/engines/codex.js +15 -61
- package/dist/lib/engines/codex.js.map +1 -1
- package/dist/lib/engines/index.d.ts +1 -11
- package/dist/lib/engines/index.d.ts.map +1 -1
- package/dist/lib/engines/index.js +0 -16
- package/dist/lib/engines/index.js.map +1 -1
- package/dist/lib/engines/opencode.d.ts +2 -6
- package/dist/lib/engines/opencode.d.ts.map +1 -1
- package/dist/lib/engines/opencode.js +14 -114
- package/dist/lib/engines/opencode.js.map +1 -1
- package/dist/lib/init.d.ts +1 -17
- package/dist/lib/init.d.ts.map +1 -1
- package/dist/lib/init.js +55 -245
- package/dist/lib/init.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,149 +1,31 @@
|
|
|
1
1
|
import { spawn } from 'child_process';
|
|
2
|
-
import {
|
|
2
|
+
import { commandExists } from './base.js';
|
|
3
3
|
export class ClaudeEngine {
|
|
4
4
|
name = 'claude';
|
|
5
|
-
async
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
outputFormat: options.outputFormat,
|
|
10
|
-
verbose: options.verbose,
|
|
11
|
-
reasoningEffort: options.reasoningEffort,
|
|
12
|
-
});
|
|
13
|
-
const args = ['-p', ...flags];
|
|
14
|
-
const child = spawn('claude', args, {
|
|
15
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
16
|
-
});
|
|
17
|
-
child.stdin.write(prompt);
|
|
18
|
-
child.stdin.end();
|
|
19
|
-
let buffer = '';
|
|
20
|
-
for await (const data of child.stdout) {
|
|
21
|
-
buffer += data.toString();
|
|
22
|
-
if (options.outputFormat === 'stream-json') {
|
|
23
|
-
const lines = buffer.split('\n');
|
|
24
|
-
buffer = lines.pop() ?? '';
|
|
25
|
-
for (const line of lines) {
|
|
26
|
-
if (!line.trim())
|
|
27
|
-
continue;
|
|
28
|
-
try {
|
|
29
|
-
const parsed = JSON.parse(line);
|
|
30
|
-
yield this.parseStreamJson(parsed);
|
|
31
|
-
}
|
|
32
|
-
catch {
|
|
33
|
-
yield { type: 'text', content: line };
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
yield { type: 'text', content: data.toString() };
|
|
39
|
-
buffer = '';
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
if (buffer.trim()) {
|
|
43
|
-
if (options.outputFormat === 'stream-json') {
|
|
44
|
-
try {
|
|
45
|
-
const parsed = JSON.parse(buffer);
|
|
46
|
-
yield this.parseStreamJson(parsed);
|
|
47
|
-
}
|
|
48
|
-
catch {
|
|
49
|
-
yield { type: 'text', content: buffer };
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
yield { type: 'text', content: buffer };
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
let stderrOutput = '';
|
|
57
|
-
for await (const data of child.stderr) {
|
|
58
|
-
stderrOutput += data.toString();
|
|
5
|
+
async run(prompt, options) {
|
|
6
|
+
const args = ['-p', '--dangerously-skip-permissions'];
|
|
7
|
+
if (options.model) {
|
|
8
|
+
args.push('--model', options.model);
|
|
59
9
|
}
|
|
60
|
-
|
|
10
|
+
return new Promise((resolve, reject) => {
|
|
11
|
+
const child = spawn('claude', args, {
|
|
12
|
+
stdio: ['pipe', 'inherit', 'inherit'],
|
|
13
|
+
});
|
|
14
|
+
child.stdin.write(prompt);
|
|
15
|
+
child.stdin.end();
|
|
61
16
|
child.on('close', (code) => {
|
|
62
|
-
if (code
|
|
63
|
-
|
|
17
|
+
if (code === 0) {
|
|
18
|
+
resolve();
|
|
64
19
|
}
|
|
65
20
|
else {
|
|
66
|
-
|
|
21
|
+
reject(new Error(`Claude exited with code ${code}`));
|
|
67
22
|
}
|
|
68
23
|
});
|
|
69
24
|
child.on('error', reject);
|
|
70
25
|
});
|
|
71
|
-
yield { type: 'done' };
|
|
72
|
-
}
|
|
73
|
-
parseStreamJson(data) {
|
|
74
|
-
if (typeof data !== 'object' || data === null) {
|
|
75
|
-
return { type: 'text', content: '' };
|
|
76
|
-
}
|
|
77
|
-
const obj = data;
|
|
78
|
-
// Claude emits: {"type":"assistant","message":{"content":[{"type":"text","text":"..."}]}}
|
|
79
|
-
if (obj.type === 'assistant') {
|
|
80
|
-
const message = obj.message;
|
|
81
|
-
const content = message?.content;
|
|
82
|
-
if (Array.isArray(content)) {
|
|
83
|
-
const texts = content
|
|
84
|
-
.filter(c => c.type === 'text' && typeof c.text === 'string')
|
|
85
|
-
.map(c => c.text);
|
|
86
|
-
if (texts.length > 0) {
|
|
87
|
-
return { type: 'text', content: texts.join('') };
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
return { type: 'text', content: '' };
|
|
91
|
-
}
|
|
92
|
-
if (obj.type === 'tool_use') {
|
|
93
|
-
return { type: 'tool_use', tool: String(obj.name ?? 'unknown') };
|
|
94
|
-
}
|
|
95
|
-
if (obj.type === 'error') {
|
|
96
|
-
return { type: 'error', error: String(obj.error ?? 'Unknown error') };
|
|
97
|
-
}
|
|
98
|
-
// Ignore system events, result events, etc.
|
|
99
|
-
return { type: 'text', content: '' };
|
|
100
26
|
}
|
|
101
27
|
async isAvailable() {
|
|
102
|
-
return
|
|
103
|
-
const child = spawn('claude', ['--version'], {
|
|
104
|
-
stdio: ['ignore', 'pipe', 'ignore'],
|
|
105
|
-
});
|
|
106
|
-
child.on('close', (code) => {
|
|
107
|
-
resolve(code === 0);
|
|
108
|
-
});
|
|
109
|
-
child.on('error', () => {
|
|
110
|
-
resolve(false);
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
getFlags(options) {
|
|
115
|
-
const flags = [];
|
|
116
|
-
if (options.model) {
|
|
117
|
-
flags.push('--model', resolveModel(options.model, 'claude'));
|
|
118
|
-
}
|
|
119
|
-
if (options.skipPermissions) {
|
|
120
|
-
flags.push('--dangerously-skip-permissions');
|
|
121
|
-
}
|
|
122
|
-
if (options.outputFormat) {
|
|
123
|
-
flags.push('--output-format', options.outputFormat);
|
|
124
|
-
// Auto-add verbose for stream-json (Claude CLI requirement)
|
|
125
|
-
if (options.outputFormat === 'stream-json') {
|
|
126
|
-
flags.push('--verbose');
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
else if (options.verbose) {
|
|
130
|
-
// Only add explicit verbose if not already added above
|
|
131
|
-
flags.push('--verbose');
|
|
132
|
-
}
|
|
133
|
-
if (options.reasoningEffort) {
|
|
134
|
-
// Claude CLI does not support effort/reasoning parameters
|
|
135
|
-
// The Claude API supports "effort" (low/medium/high) in Opus 4.5 only,
|
|
136
|
-
// but the CLI tool does not expose this parameter yet
|
|
137
|
-
// GitHub issue: https://github.com/anthropics/claude-code/issues/12376
|
|
138
|
-
console.warn('Warning: Claude CLI does not support reasoning-effort parameter (not yet implemented). Ignoring.');
|
|
139
|
-
}
|
|
140
|
-
return flags;
|
|
141
|
-
}
|
|
142
|
-
supportsInteractive() {
|
|
143
|
-
return true;
|
|
144
|
-
}
|
|
145
|
-
getCommand() {
|
|
146
|
-
return 'claude';
|
|
28
|
+
return commandExists('claude');
|
|
147
29
|
}
|
|
148
30
|
}
|
|
149
31
|
//# sourceMappingURL=claude.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../src/lib/engines/claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../src/lib/engines/claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAsB,aAAa,EAAE,MAAM,WAAW,CAAC;AAE9D,MAAM,OAAO,YAAY;IACd,IAAI,GAAG,QAAQ,CAAC;IAEzB,KAAK,CAAC,GAAG,CAAC,MAAc,EAAE,OAAmB;QAC3C,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,gCAAgC,CAAC,CAAC;QAEtD,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,KAAK,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE;gBAClC,KAAK,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC;aACtC,CAAC,CAAC;YAEH,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC1B,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YAElB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,OAAO,EAAE,CAAC;gBACZ,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,IAAI,EAAE,CAAC,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,aAAa,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;CACF"}
|
|
@@ -1,10 +1,7 @@
|
|
|
1
|
-
import { Engine,
|
|
1
|
+
import { Engine, RunOptions } from './base.js';
|
|
2
2
|
export declare class CodexEngine implements Engine {
|
|
3
3
|
readonly name = "codex";
|
|
4
|
-
|
|
4
|
+
run(prompt: string, options: RunOptions): Promise<void>;
|
|
5
5
|
isAvailable(): Promise<boolean>;
|
|
6
|
-
getFlags(options: EngineFlags): string[];
|
|
7
|
-
supportsInteractive(): boolean;
|
|
8
|
-
getCommand(): string;
|
|
9
6
|
}
|
|
10
7
|
//# sourceMappingURL=codex.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/lib/engines/codex.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/lib/engines/codex.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAiB,MAAM,WAAW,CAAC;AAE9D,qBAAa,WAAY,YAAW,MAAM;IACxC,QAAQ,CAAC,IAAI,WAAW;IAElB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BvD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAGtC"}
|
|
@@ -1,77 +1,31 @@
|
|
|
1
1
|
import { spawn } from 'child_process';
|
|
2
|
-
import {
|
|
2
|
+
import { commandExists } from './base.js';
|
|
3
3
|
export class CodexEngine {
|
|
4
4
|
name = 'codex';
|
|
5
|
-
async
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
outputFormat: options.outputFormat,
|
|
10
|
-
verbose: options.verbose,
|
|
11
|
-
reasoningEffort: options.reasoningEffort,
|
|
12
|
-
});
|
|
13
|
-
const args = [...flags];
|
|
14
|
-
const child = spawn('codex', args, {
|
|
15
|
-
stdio: ['pipe', 'pipe', 'pipe'],
|
|
16
|
-
});
|
|
17
|
-
child.stdin.write(prompt);
|
|
18
|
-
child.stdin.end();
|
|
19
|
-
for await (const data of child.stdout) {
|
|
20
|
-
yield { type: 'text', content: data.toString() };
|
|
21
|
-
}
|
|
22
|
-
let stderrOutput = '';
|
|
23
|
-
for await (const data of child.stderr) {
|
|
24
|
-
stderrOutput += data.toString();
|
|
5
|
+
async run(prompt, options) {
|
|
6
|
+
const args = ['--full-auto'];
|
|
7
|
+
if (options.model) {
|
|
8
|
+
args.push('--model', options.model);
|
|
25
9
|
}
|
|
26
|
-
|
|
10
|
+
return new Promise((resolve, reject) => {
|
|
11
|
+
const child = spawn('codex', args, {
|
|
12
|
+
stdio: ['pipe', 'inherit', 'inherit'],
|
|
13
|
+
});
|
|
14
|
+
child.stdin.write(prompt);
|
|
15
|
+
child.stdin.end();
|
|
27
16
|
child.on('close', (code) => {
|
|
28
|
-
if (code
|
|
29
|
-
|
|
17
|
+
if (code === 0) {
|
|
18
|
+
resolve();
|
|
30
19
|
}
|
|
31
20
|
else {
|
|
32
|
-
|
|
21
|
+
reject(new Error(`Codex exited with code ${code}`));
|
|
33
22
|
}
|
|
34
23
|
});
|
|
35
24
|
child.on('error', reject);
|
|
36
25
|
});
|
|
37
|
-
yield { type: 'done' };
|
|
38
26
|
}
|
|
39
27
|
async isAvailable() {
|
|
40
|
-
return
|
|
41
|
-
const child = spawn('codex', ['--version'], {
|
|
42
|
-
stdio: ['ignore', 'pipe', 'ignore'],
|
|
43
|
-
});
|
|
44
|
-
child.on('close', (code) => {
|
|
45
|
-
resolve(code === 0);
|
|
46
|
-
});
|
|
47
|
-
child.on('error', () => {
|
|
48
|
-
resolve(false);
|
|
49
|
-
});
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
getFlags(options) {
|
|
53
|
-
const flags = [];
|
|
54
|
-
if (options.model) {
|
|
55
|
-
flags.push('--model', resolveModel(options.model, 'codex'));
|
|
56
|
-
}
|
|
57
|
-
if (options.skipPermissions) {
|
|
58
|
-
flags.push('--full-auto');
|
|
59
|
-
}
|
|
60
|
-
if (options.verbose) {
|
|
61
|
-
flags.push('--verbose');
|
|
62
|
-
}
|
|
63
|
-
if (options.reasoningEffort) {
|
|
64
|
-
// Codex supports reasoning effort via config override
|
|
65
|
-
// Values: minimal, low, medium, high, xhigh
|
|
66
|
-
flags.push('-c', `model_reasoning_effort="${options.reasoningEffort}"`);
|
|
67
|
-
}
|
|
68
|
-
return flags;
|
|
69
|
-
}
|
|
70
|
-
supportsInteractive() {
|
|
71
|
-
return true; // Codex supports interactive mode
|
|
72
|
-
}
|
|
73
|
-
getCommand() {
|
|
74
|
-
return 'codex';
|
|
28
|
+
return commandExists('codex');
|
|
75
29
|
}
|
|
76
30
|
}
|
|
77
31
|
//# sourceMappingURL=codex.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/lib/engines/codex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/lib/engines/codex.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAsB,aAAa,EAAE,MAAM,WAAW,CAAC;AAE9D,MAAM,OAAO,WAAW;IACb,IAAI,GAAG,OAAO,CAAC;IAExB,KAAK,CAAC,GAAG,CAAC,MAAc,EAAE,OAAmB;QAC3C,MAAM,IAAI,GAAG,CAAC,aAAa,CAAC,CAAC;QAE7B,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;gBACjC,KAAK,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC;aACtC,CAAC,CAAC;YAEH,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YAC1B,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YAElB,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,OAAO,EAAE,CAAC;gBACZ,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,KAAK,CAAC,0BAA0B,IAAI,EAAE,CAAC,CAAC,CAAC;gBACtD,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,aAAa,CAAC,OAAO,CAAC,CAAC;IAChC,CAAC;CACF"}
|
|
@@ -1,19 +1,9 @@
|
|
|
1
|
-
export { Engine,
|
|
1
|
+
export { Engine, RunOptions } from './base.js';
|
|
2
2
|
export { ClaudeEngine } from './claude.js';
|
|
3
3
|
export { OpenCodeEngine } from './opencode.js';
|
|
4
4
|
export { CodexEngine } from './codex.js';
|
|
5
5
|
import { Engine } from './base.js';
|
|
6
6
|
export type EngineName = 'claude' | 'opencode' | 'codex';
|
|
7
|
-
/**
|
|
8
|
-
* Get engine by name
|
|
9
|
-
*/
|
|
10
7
|
export declare function getEngine(name: EngineName): Engine;
|
|
11
|
-
/**
|
|
12
|
-
* Detect available engines
|
|
13
|
-
*/
|
|
14
8
|
export declare function detectEngines(): Promise<EngineName[]>;
|
|
15
|
-
/**
|
|
16
|
-
* Get default engine (first available)
|
|
17
|
-
*/
|
|
18
|
-
export declare function getDefaultEngine(): Promise<Engine | null>;
|
|
19
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/engines/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/engines/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAKnC,MAAM,MAAM,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,OAAO,CAAC;AAQzD,wBAAgB,SAAS,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAElD;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,CAQ3D"}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
export { MODEL_ALIASES, resolveModel } from './base.js';
|
|
2
1
|
export { ClaudeEngine } from './claude.js';
|
|
3
2
|
export { OpenCodeEngine } from './opencode.js';
|
|
4
3
|
export { CodexEngine } from './codex.js';
|
|
@@ -10,15 +9,9 @@ const engines = {
|
|
|
10
9
|
opencode: new OpenCodeEngine(),
|
|
11
10
|
codex: new CodexEngine(),
|
|
12
11
|
};
|
|
13
|
-
/**
|
|
14
|
-
* Get engine by name
|
|
15
|
-
*/
|
|
16
12
|
export function getEngine(name) {
|
|
17
13
|
return engines[name];
|
|
18
14
|
}
|
|
19
|
-
/**
|
|
20
|
-
* Detect available engines
|
|
21
|
-
*/
|
|
22
15
|
export async function detectEngines() {
|
|
23
16
|
const available = [];
|
|
24
17
|
for (const [name, engine] of Object.entries(engines)) {
|
|
@@ -28,13 +21,4 @@ export async function detectEngines() {
|
|
|
28
21
|
}
|
|
29
22
|
return available;
|
|
30
23
|
}
|
|
31
|
-
/**
|
|
32
|
-
* Get default engine (first available)
|
|
33
|
-
*/
|
|
34
|
-
export async function getDefaultEngine() {
|
|
35
|
-
const available = await detectEngines();
|
|
36
|
-
if (available.length === 0)
|
|
37
|
-
return null;
|
|
38
|
-
return engines[available[0]];
|
|
39
|
-
}
|
|
40
24
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/engines/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/engines/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAIzC,MAAM,OAAO,GAA+B;IAC1C,MAAM,EAAE,IAAI,YAAY,EAAE;IAC1B,QAAQ,EAAE,IAAI,cAAc,EAAE;IAC9B,KAAK,EAAE,IAAI,WAAW,EAAE;CACzB,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,IAAgB;IACxC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,MAAM,SAAS,GAAiB,EAAE,CAAC;IACnC,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACrD,IAAI,MAAM,MAAM,CAAC,WAAW,EAAE,EAAE,CAAC;YAC/B,SAAS,CAAC,IAAI,CAAC,IAAkB,CAAC,CAAC;QACrC,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|
|
@@ -1,11 +1,7 @@
|
|
|
1
|
-
import { Engine,
|
|
1
|
+
import { Engine, RunOptions } from './base.js';
|
|
2
2
|
export declare class OpenCodeEngine implements Engine {
|
|
3
3
|
readonly name = "opencode";
|
|
4
|
-
|
|
4
|
+
run(prompt: string, options: RunOptions): Promise<void>;
|
|
5
5
|
isAvailable(): Promise<boolean>;
|
|
6
|
-
getFlags(options: EngineFlags): string[];
|
|
7
|
-
private parseStreamJson;
|
|
8
|
-
supportsInteractive(): boolean;
|
|
9
|
-
getCommand(): string;
|
|
10
6
|
}
|
|
11
7
|
//# sourceMappingURL=opencode.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../../src/lib/engines/opencode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"opencode.d.ts","sourceRoot":"","sources":["../../../src/lib/engines/opencode.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAiB,MAAM,WAAW,CAAC;AAE9D,qBAAa,cAAe,YAAW,MAAM;IAC3C,QAAQ,CAAC,IAAI,cAAc;IAErB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IA0BvD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAGtC"}
|
|
@@ -1,130 +1,30 @@
|
|
|
1
1
|
import { spawn } from 'child_process';
|
|
2
|
-
import {
|
|
2
|
+
import { commandExists } from './base.js';
|
|
3
3
|
export class OpenCodeEngine {
|
|
4
4
|
name = 'opencode';
|
|
5
|
-
async
|
|
6
|
-
const
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
outputFormat: options.outputFormat,
|
|
10
|
-
verbose: options.verbose,
|
|
11
|
-
reasoningEffort: options.reasoningEffort,
|
|
12
|
-
});
|
|
13
|
-
const args = ['run', ...flags, prompt];
|
|
14
|
-
const child = spawn('opencode', args, {
|
|
15
|
-
stdio: ['ignore', 'pipe', 'pipe'],
|
|
16
|
-
});
|
|
17
|
-
let buffer = '';
|
|
18
|
-
for await (const data of child.stdout) {
|
|
19
|
-
buffer += data.toString();
|
|
20
|
-
if (options.outputFormat === 'stream-json') {
|
|
21
|
-
const lines = buffer.split('\n');
|
|
22
|
-
buffer = lines.pop() ?? '';
|
|
23
|
-
for (const line of lines) {
|
|
24
|
-
if (!line.trim())
|
|
25
|
-
continue;
|
|
26
|
-
try {
|
|
27
|
-
const parsed = JSON.parse(line);
|
|
28
|
-
yield this.parseStreamJson(parsed);
|
|
29
|
-
}
|
|
30
|
-
catch {
|
|
31
|
-
yield { type: 'text', content: line };
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
yield { type: 'text', content: data.toString() };
|
|
37
|
-
buffer = '';
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
if (buffer.trim()) {
|
|
41
|
-
if (options.outputFormat === 'stream-json') {
|
|
42
|
-
try {
|
|
43
|
-
const parsed = JSON.parse(buffer);
|
|
44
|
-
yield this.parseStreamJson(parsed);
|
|
45
|
-
}
|
|
46
|
-
catch {
|
|
47
|
-
yield { type: 'text', content: buffer };
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
else {
|
|
51
|
-
yield { type: 'text', content: buffer };
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
let stderrOutput = '';
|
|
55
|
-
for await (const data of child.stderr) {
|
|
56
|
-
stderrOutput += data.toString();
|
|
5
|
+
async run(prompt, options) {
|
|
6
|
+
const args = ['run'];
|
|
7
|
+
if (options.model) {
|
|
8
|
+
args.push('--model', options.model);
|
|
57
9
|
}
|
|
58
|
-
|
|
10
|
+
args.push(prompt);
|
|
11
|
+
return new Promise((resolve, reject) => {
|
|
12
|
+
const child = spawn('opencode', args, {
|
|
13
|
+
stdio: 'inherit',
|
|
14
|
+
});
|
|
59
15
|
child.on('close', (code) => {
|
|
60
|
-
if (code
|
|
61
|
-
|
|
16
|
+
if (code === 0) {
|
|
17
|
+
resolve();
|
|
62
18
|
}
|
|
63
19
|
else {
|
|
64
|
-
|
|
20
|
+
reject(new Error(`OpenCode exited with code ${code}`));
|
|
65
21
|
}
|
|
66
22
|
});
|
|
67
23
|
child.on('error', reject);
|
|
68
24
|
});
|
|
69
|
-
yield { type: 'done' };
|
|
70
25
|
}
|
|
71
26
|
async isAvailable() {
|
|
72
|
-
return
|
|
73
|
-
const child = spawn('opencode', ['--version'], {
|
|
74
|
-
stdio: ['ignore', 'pipe', 'ignore'],
|
|
75
|
-
});
|
|
76
|
-
child.on('close', (code) => {
|
|
77
|
-
resolve(code === 0);
|
|
78
|
-
});
|
|
79
|
-
child.on('error', () => {
|
|
80
|
-
resolve(false);
|
|
81
|
-
});
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
getFlags(options) {
|
|
85
|
-
const flags = [];
|
|
86
|
-
if (options.model) {
|
|
87
|
-
flags.push('--model', resolveModel(options.model, 'opencode'));
|
|
88
|
-
}
|
|
89
|
-
// OpenCode doesn't have --yes or --verbose flags
|
|
90
|
-
// skipPermissions and verbose options are ignored for this engine
|
|
91
|
-
// Map stream-json to OpenCode's --format json
|
|
92
|
-
if (options.outputFormat === 'stream-json') {
|
|
93
|
-
flags.push('--format', 'json');
|
|
94
|
-
}
|
|
95
|
-
if (options.reasoningEffort) {
|
|
96
|
-
// OpenCode uses --variant for reasoning effort (not --reasoning-effort)
|
|
97
|
-
flags.push('--variant', options.reasoningEffort);
|
|
98
|
-
}
|
|
99
|
-
return flags;
|
|
100
|
-
}
|
|
101
|
-
parseStreamJson(data) {
|
|
102
|
-
if (typeof data !== 'object' || data === null) {
|
|
103
|
-
return { type: 'text', content: '' };
|
|
104
|
-
}
|
|
105
|
-
const obj = data;
|
|
106
|
-
// OpenCode emits: {"type":"text","part":{"type":"text","text":"..."}}
|
|
107
|
-
if (obj.type === 'text') {
|
|
108
|
-
const part = obj.part;
|
|
109
|
-
const text = (typeof obj.content === 'string' && obj.content) ||
|
|
110
|
-
(typeof part?.text === 'string' && part.text) ||
|
|
111
|
-
(typeof part?.content === 'string' && part.content);
|
|
112
|
-
return { type: 'text', content: text || '' };
|
|
113
|
-
}
|
|
114
|
-
if (obj.type === 'tool_use') {
|
|
115
|
-
return { type: 'tool_use', tool: String(obj.name ?? 'unknown') };
|
|
116
|
-
}
|
|
117
|
-
if (obj.type === 'error') {
|
|
118
|
-
return { type: 'error', error: String(obj.error ?? 'Unknown error') };
|
|
119
|
-
}
|
|
120
|
-
// Ignore step_start, step_finish, and other event types
|
|
121
|
-
return { type: 'text', content: '' };
|
|
122
|
-
}
|
|
123
|
-
supportsInteractive() {
|
|
124
|
-
return false;
|
|
125
|
-
}
|
|
126
|
-
getCommand() {
|
|
127
|
-
return 'opencode';
|
|
27
|
+
return commandExists('opencode');
|
|
128
28
|
}
|
|
129
29
|
}
|
|
130
30
|
//# sourceMappingURL=opencode.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../src/lib/engines/opencode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,
|
|
1
|
+
{"version":3,"file":"opencode.js","sourceRoot":"","sources":["../../../src/lib/engines/opencode.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AACtC,OAAO,EAAsB,aAAa,EAAE,MAAM,WAAW,CAAC;AAE9D,MAAM,OAAO,cAAc;IAChB,IAAI,GAAG,UAAU,CAAC;IAE3B,KAAK,CAAC,GAAG,CAAC,MAAc,EAAE,OAAmB;QAC3C,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;QAErB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAElB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE;gBACpC,KAAK,EAAE,SAAS;aACjB,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;gBACzB,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;oBACf,OAAO,EAAE,CAAC;gBACZ,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,IAAI,KAAK,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC,CAAC;gBACzD,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,aAAa,CAAC,UAAU,CAAC,CAAC;IACnC,CAAC;CACF"}
|
package/dist/lib/init.d.ts
CHANGED
|
@@ -1,25 +1,9 @@
|
|
|
1
|
-
import { EngineName } from './engines/index.js';
|
|
2
1
|
export interface InitOptions {
|
|
3
|
-
noAi?: boolean;
|
|
4
|
-
approve?: boolean;
|
|
5
|
-
engine?: EngineName;
|
|
6
2
|
verbose?: boolean;
|
|
7
3
|
}
|
|
8
4
|
export interface InitResult {
|
|
9
5
|
created: string[];
|
|
10
6
|
skipped: string[];
|
|
11
|
-
agentsMdContent?: string;
|
|
12
7
|
}
|
|
13
|
-
|
|
14
|
-
* Template-based init (fallback when no AI available)
|
|
15
|
-
*/
|
|
16
|
-
export declare function templateBasedInit(dir: string): Promise<InitResult>;
|
|
17
|
-
/**
|
|
18
|
-
* AI-powered init using the specified engine
|
|
19
|
-
*/
|
|
20
|
-
export declare function aiPoweredInit(dir: string, engineName: EngineName, options: InitOptions): Promise<InitResult>;
|
|
21
|
-
/**
|
|
22
|
-
* Initialize a project for vralphy
|
|
23
|
-
*/
|
|
24
|
-
export declare function initProject(dir?: string, options?: InitOptions): Promise<InitResult>;
|
|
8
|
+
export declare function initProject(dir?: string): Promise<InitResult>;
|
|
25
9
|
//# sourceMappingURL=init.d.ts.map
|
package/dist/lib/init.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/lib/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/lib/init.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAgED,wBAAsB,WAAW,CAAC,GAAG,GAAE,MAAsB,GAAG,OAAO,CAAC,UAAU,CAAC,CAkFlF"}
|