-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathopencode-cli.ts
More file actions
55 lines (48 loc) · 1.96 KB
/
opencode-cli.ts
File metadata and controls
55 lines (48 loc) · 1.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
type BuildRunCommandInput = {
resolveOpencodeBinCommand: string;
workingDir: string;
prompt: string;
model: string;
variant?: string;
forwardedEnvEntries?: Array<[string, string]>;
};
type BuildModelsCommandInput = {
resolveOpencodeBinCommand: string;
provider: string;
forwardedEnvEntries?: Array<[string, string]>;
};
function shellEscape(value: string): string {
return `'${value.replace(/'/g, `'"'"'`)}'`;
}
function buildForwardedEnvArgs(entries: Array<[string, string]> | undefined): string {
return (entries ?? []).map(([name, value]) => `${name}=${shellEscape(value)}`).join(" ");
}
export function buildInstallOpencodeCommand(): string {
return [
"if command -v bun >/dev/null 2>&1; then",
' echo "[bootstrap] Attempting OpenCode install via bun..."',
" if bun add -g opencode-ai@latest; then exit 0; fi",
' echo "[bootstrap] bun install failed; falling back to npm..." >&2',
"fi",
'npm install -g opencode-ai@latest --prefix "$HOME/.local" --no-audit --no-fund',
].join("\n");
}
export function buildOpencodeRunCommand(input: BuildRunCommandInput): string {
const modelArg = ` --model ${shellEscape(input.model)}`;
const variantArg = input.variant ? ` --variant ${shellEscape(input.variant)}` : "";
const forwardedEnvArgs = buildForwardedEnvArgs(input.forwardedEnvEntries);
return (
`OPENCODE_BIN="$(${input.resolveOpencodeBinCommand})"; ` +
`cd ${shellEscape(input.workingDir)} && ` +
`${forwardedEnvArgs ? `env ${forwardedEnvArgs} ` : ""}` +
`"${"$"}OPENCODE_BIN" run --print-logs${modelArg}${variantArg} ${shellEscape(input.prompt)}`
);
}
export function buildOpencodeModelsCommand(input: BuildModelsCommandInput): string {
const forwardedEnvArgs = buildForwardedEnvArgs(input.forwardedEnvEntries);
return (
`OPENCODE_BIN="$(${input.resolveOpencodeBinCommand})"; ` +
`${forwardedEnvArgs ? `env ${forwardedEnvArgs} ` : ""}` +
`"${"$"}OPENCODE_BIN" models ${shellEscape(input.provider)}`
);
}