opencastle 0.23.2 → 0.24.1
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/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.js +5 -5
- package/dist/cli/run.js.map +1 -1
- package/package.json +9 -1
- 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.ts +5 -5
- package/src/dashboard/node_modules/.vite/deps/_metadata.json +6 -6
- 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
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Task, ExecuteOptions, ExecuteResult } from '../../types.js';
|
|
2
|
+
export declare const name = "claude";
|
|
3
|
+
export declare function isAvailable(): Promise<boolean>;
|
|
4
|
+
export declare function execute(task: Task, options?: ExecuteOptions): Promise<ExecuteResult>;
|
|
5
|
+
export declare function kill(task: Task): void;
|
|
6
|
+
//# sourceMappingURL=claude.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../../../../src/cli/run/adapters/claude.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,aAAa,EAAc,MAAM,gBAAgB,CAAA;AAGrF,eAAO,MAAM,IAAI,WAAW,CAAA;AAwB5B,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAUpD;AA6LD,wBAAsB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CAI9F;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAGrC"}
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { spawn } from 'node:child_process';
|
|
2
|
+
import { parseTimeout } from '../schema.js';
|
|
3
|
+
// Adapter name
|
|
4
|
+
export const name = 'claude';
|
|
5
|
+
// Module-level state for mode selection
|
|
6
|
+
let mode = null;
|
|
7
|
+
// SDK dynamic import check
|
|
8
|
+
async function sdkAvailable() {
|
|
9
|
+
try {
|
|
10
|
+
await import('@anthropic-ai/agent-sdk');
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
// CLI check
|
|
18
|
+
async function cliAvailable() {
|
|
19
|
+
return new Promise((resolve) => {
|
|
20
|
+
const proc = spawn('which', ['claude'], { stdio: 'pipe' });
|
|
21
|
+
proc.on('close', (code) => resolve(code === 0));
|
|
22
|
+
proc.on('error', () => resolve(false));
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
export async function isAvailable() {
|
|
26
|
+
if (await sdkAvailable()) {
|
|
27
|
+
mode = 'sdk';
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
if (await cliAvailable()) {
|
|
31
|
+
mode = 'cli';
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
let clientPromise = null;
|
|
37
|
+
let cachedApproveAll = null;
|
|
38
|
+
const activeSessions = new Map();
|
|
39
|
+
async function getClient() {
|
|
40
|
+
if (!clientPromise) {
|
|
41
|
+
clientPromise = (async () => {
|
|
42
|
+
const sdk = await import('@anthropic-ai/agent-sdk');
|
|
43
|
+
const { AgentClient, approveAll } = sdk;
|
|
44
|
+
cachedApproveAll = approveAll;
|
|
45
|
+
const client = new AgentClient({
|
|
46
|
+
autoStart: false,
|
|
47
|
+
logLevel: 'error',
|
|
48
|
+
});
|
|
49
|
+
await client.start();
|
|
50
|
+
return client;
|
|
51
|
+
})();
|
|
52
|
+
}
|
|
53
|
+
return clientPromise;
|
|
54
|
+
}
|
|
55
|
+
async function executeViaSdk(task, options = {}) {
|
|
56
|
+
let prompt = `You are a ${task.agent}. ${task.prompt}`;
|
|
57
|
+
if (task.files && task.files.length > 0) {
|
|
58
|
+
prompt += `\n\nOnly modify files under: ${task.files.join(', ')}`;
|
|
59
|
+
}
|
|
60
|
+
const client = await getClient();
|
|
61
|
+
const session = await client.createSession({
|
|
62
|
+
onPermissionRequest: cachedApproveAll,
|
|
63
|
+
cwd: options.cwd ?? process.cwd(),
|
|
64
|
+
systemMessage: {
|
|
65
|
+
content: [
|
|
66
|
+
`You are a ${task.agent}.`,
|
|
67
|
+
'Work autonomously without asking questions.',
|
|
68
|
+
'Follow all instructions precisely.',
|
|
69
|
+
].join(' '),
|
|
70
|
+
},
|
|
71
|
+
infiniteSessions: { enabled: false },
|
|
72
|
+
...(options.verbose ? { streaming: true } : {}),
|
|
73
|
+
});
|
|
74
|
+
activeSessions.set(task.id, session);
|
|
75
|
+
if (options.verbose) {
|
|
76
|
+
session.on('assistant.message_delta', (...args) => {
|
|
77
|
+
const event = args[0];
|
|
78
|
+
process.stdout.write(event.data.deltaContent);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
try {
|
|
82
|
+
const timeoutMs = parseTimeout(task.timeout);
|
|
83
|
+
const response = await session.sendAndWait({ prompt }, timeoutMs);
|
|
84
|
+
const data = response?.data;
|
|
85
|
+
const output = data?.content ?? '';
|
|
86
|
+
const rawUsage = data?.usage ?? response?.usage;
|
|
87
|
+
const u = rawUsage;
|
|
88
|
+
const usageResult = u
|
|
89
|
+
? {
|
|
90
|
+
prompt_tokens: u.prompt_tokens ?? u.promptTokens,
|
|
91
|
+
completion_tokens: u.completion_tokens ?? u.completionTokens,
|
|
92
|
+
total_tokens: u.total_tokens ?? u.totalTokens,
|
|
93
|
+
}
|
|
94
|
+
: undefined;
|
|
95
|
+
return {
|
|
96
|
+
success: true,
|
|
97
|
+
output: output.slice(0, 10_000),
|
|
98
|
+
exitCode: 0,
|
|
99
|
+
usage: usageResult,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
catch (err) {
|
|
103
|
+
return {
|
|
104
|
+
success: false,
|
|
105
|
+
output: `Claude Agent SDK error: ${err.message}`,
|
|
106
|
+
exitCode: 1,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
finally {
|
|
110
|
+
activeSessions.delete(task.id);
|
|
111
|
+
await session.destroy().catch(() => { });
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
function killSdk(task) {
|
|
115
|
+
const session = activeSessions.get(task.id);
|
|
116
|
+
if (session) {
|
|
117
|
+
session.abort().catch(() => { });
|
|
118
|
+
session.destroy().catch(() => { });
|
|
119
|
+
activeSessions.delete(task.id);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// --- CLI implementation (from claude-code.ts) ---
|
|
123
|
+
async function executeViaCli(task, options = {}) {
|
|
124
|
+
let prompt = `You are a ${task.agent}. ${task.prompt}`;
|
|
125
|
+
if (task.files && task.files.length > 0) {
|
|
126
|
+
prompt += `\n\nOnly modify files under: ${task.files.join(', ')}`;
|
|
127
|
+
}
|
|
128
|
+
const args = [
|
|
129
|
+
'-p',
|
|
130
|
+
prompt,
|
|
131
|
+
'--output-format',
|
|
132
|
+
'json',
|
|
133
|
+
'--max-turns',
|
|
134
|
+
'50',
|
|
135
|
+
];
|
|
136
|
+
return new Promise((resolve) => {
|
|
137
|
+
const proc = spawn('claude', args, {
|
|
138
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
139
|
+
env: { ...process.env },
|
|
140
|
+
cwd: options?.cwd ?? process.cwd(),
|
|
141
|
+
});
|
|
142
|
+
let stdout = '';
|
|
143
|
+
let stderr = '';
|
|
144
|
+
proc.stdout.on('data', (chunk) => {
|
|
145
|
+
stdout += chunk.toString();
|
|
146
|
+
if (options.verbose) {
|
|
147
|
+
process.stdout.write(chunk);
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
proc.stderr.on('data', (chunk) => {
|
|
151
|
+
stderr += chunk.toString();
|
|
152
|
+
if (options.verbose) {
|
|
153
|
+
process.stderr.write(chunk);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
proc.on('close', (code) => {
|
|
157
|
+
const output = [stdout, stderr].filter(Boolean).join('\n');
|
|
158
|
+
let usage;
|
|
159
|
+
try {
|
|
160
|
+
const parsedJson = JSON.parse(stdout);
|
|
161
|
+
const u = parsedJson?.usage;
|
|
162
|
+
if (u) {
|
|
163
|
+
const promptTokens = (u.input_tokens ?? u.prompt_tokens);
|
|
164
|
+
const completionTokens = (u.output_tokens ?? u.completion_tokens);
|
|
165
|
+
const total = ((promptTokens ?? 0) + (completionTokens ?? 0)) || undefined;
|
|
166
|
+
usage = { prompt_tokens: promptTokens, completion_tokens: completionTokens, total_tokens: total };
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch { /* not JSON or no usage — graceful degradation */ }
|
|
170
|
+
resolve({
|
|
171
|
+
success: code === 0,
|
|
172
|
+
output: output.slice(0, 10000),
|
|
173
|
+
exitCode: code ?? -1,
|
|
174
|
+
usage,
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
proc.on('error', (err) => {
|
|
178
|
+
resolve({
|
|
179
|
+
success: false,
|
|
180
|
+
output: `Failed to spawn claude: ${err.message}`,
|
|
181
|
+
exitCode: -1,
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
task._process = proc;
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
function killCli(task) {
|
|
188
|
+
if (task._process && !task._process.killed) {
|
|
189
|
+
task._process.kill('SIGTERM');
|
|
190
|
+
setTimeout(() => {
|
|
191
|
+
if (task._process && !task._process.killed) {
|
|
192
|
+
task._process.kill('SIGKILL');
|
|
193
|
+
}
|
|
194
|
+
}, 5000);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
// --- Unified interface ---
|
|
198
|
+
export async function execute(task, options = {}) {
|
|
199
|
+
if (!mode)
|
|
200
|
+
await isAvailable();
|
|
201
|
+
if (mode === 'sdk')
|
|
202
|
+
return executeViaSdk(task, options);
|
|
203
|
+
return executeViaCli(task, options);
|
|
204
|
+
}
|
|
205
|
+
export function kill(task) {
|
|
206
|
+
if (mode === 'sdk')
|
|
207
|
+
killSdk(task);
|
|
208
|
+
else
|
|
209
|
+
killCli(task);
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=claude.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../../src/cli/run/adapters/claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAG3C,eAAe;AACf,MAAM,CAAC,MAAM,IAAI,GAAG,QAAQ,CAAA;AAE5B,wCAAwC;AACxC,IAAI,IAAI,GAAyB,IAAI,CAAA;AAErC,2BAA2B;AAC3B,KAAK,UAAU,YAAY;IACzB,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,yBAAyB,CAAC,CAAA;QACvC,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,YAAY;AACZ,KAAK,UAAU,YAAY;IACzB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAA;QAC1D,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAA;QAC/C,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,IAAI,MAAM,YAAY,EAAE,EAAE,CAAC;QACzB,IAAI,GAAG,KAAK,CAAA;QACZ,OAAO,IAAI,CAAA;IACb,CAAC;IACD,IAAI,MAAM,YAAY,EAAE,EAAE,CAAC;QACzB,IAAI,GAAG,KAAK,CAAA;QACZ,OAAO,IAAI,CAAA;IACb,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAqBD,IAAI,aAAa,GAAsC,IAAI,CAAA;AAC3D,IAAI,gBAAgB,GAAY,IAAI,CAAA;AACpC,MAAM,cAAc,GAAG,IAAI,GAAG,EAAwB,CAAA;AAEtD,KAAK,UAAU,SAAS;IACtB,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,aAAa,GAAG,CAAC,KAAK,IAAI,EAAE;YAC1B,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAA4B,CAAA;YAC9E,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,GAAG,GAGnC,CAAA;YACD,gBAAgB,GAAG,UAAU,CAAA;YAC7B,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC;gBAC7B,SAAS,EAAE,KAAK;gBAChB,QAAQ,EAAE,OAAO;aAClB,CAAC,CAAA;YACF,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;YACpB,OAAO,MAAM,CAAA;QACf,CAAC,CAAC,EAAE,CAAA;IACN,CAAC;IACD,OAAO,aAAa,CAAA;AACtB,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAU,EAAE,UAA0B,EAAE;IACnE,IAAI,MAAM,GAAG,aAAa,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,MAAM,EAAE,CAAA;IACtD,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,gCAAgC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAA;IACnE,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAA;IAChC,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC;QACzC,mBAAmB,EAAE,gBAAiB;QACtC,GAAG,EAAE,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;QACjC,aAAa,EAAE;YACb,OAAO,EAAE;gBACP,aAAa,IAAI,CAAC,KAAK,GAAG;gBAC1B,6CAA6C;gBAC7C,oCAAoC;aACrC,CAAC,IAAI,CAAC,GAAG,CAAC;SACZ;QACD,gBAAgB,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;QACpC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChD,CAAC,CAAA;IACF,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,CAAA;IACpC,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,CAAC,EAAE,CAAC,yBAAyB,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE;YAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAuC,CAAA;YAC3D,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;QAC/C,CAAC,CAAC,CAAA;IACJ,CAAC;IACD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;QAC5C,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,WAAW,CAAC,EAAE,MAAM,EAAE,EAAE,SAAS,CAAC,CAAA;QACjE,MAAM,IAAI,GAAI,QAAgB,EAAE,IAA2C,CAAA;QAC3E,MAAM,MAAM,GAAI,IAAI,EAAE,OAA8B,IAAI,EAAE,CAAA;QAC1D,MAAM,QAAQ,GAAG,IAAI,EAAE,KAAK,IAAK,QAAgB,EAAE,KAAK,CAAA;QACxD,MAAM,CAAC,GAAG,QAA8C,CAAA;QACxD,MAAM,WAAW,GAAG,CAAC;YACnB,CAAC,CAAC;gBACE,aAAa,EAAE,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,YAAY;gBAChD,iBAAiB,EAAE,CAAC,CAAC,iBAAiB,IAAI,CAAC,CAAC,gBAAgB;gBAC5D,YAAY,EAAE,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,WAAW;aAC9C;YACH,CAAC,CAAC,SAAS,CAAA;QACb,OAAO;YACL,OAAO,EAAE,IAAI;YACb,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC;YAC/B,QAAQ,EAAE,CAAC;YACX,KAAK,EAAE,WAAW;SACnB,CAAA;IACH,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,2BAA4B,GAAa,CAAC,OAAO,EAAE;YAC3D,QAAQ,EAAE,CAAC;SACZ,CAAA;IACH,CAAC;YAAS,CAAC;QACT,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC9B,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;IACzC,CAAC;AACH,CAAC;AAED,SAAS,OAAO,CAAC,IAAU;IACzB,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAC3C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QAC/B,OAAO,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAA;QACjC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IAChC,CAAC;AACH,CAAC;AAED,mDAAmD;AACnD,KAAK,UAAU,aAAa,CAAC,IAAU,EAAE,UAA0B,EAAE;IACnE,IAAI,MAAM,GAAG,aAAa,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,MAAM,EAAE,CAAA;IACtD,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,gCAAgC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAA;IACnE,CAAC;IACD,MAAM,IAAI,GAAG;QACX,IAAI;QACJ,MAAM;QACN,iBAAiB;QACjB,MAAM;QACN,aAAa;QACb,IAAI;KACL,CAAA;IACD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE;YACjC,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE;YACvB,GAAG,EAAE,OAAO,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;SACnC,CAAC,CAAA;QACF,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,IAAI,MAAM,GAAG,EAAE,CAAA;QACf,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACvC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAA;YAC1B,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YAC7B,CAAC;QACH,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACvC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAA;YAC1B,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;YAC7B,CAAC;QACH,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACxB,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YAC1D,IAAI,KAA6B,CAAA;YACjC,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAA4B,CAAA;gBAChE,MAAM,CAAC,GAAG,UAAU,EAAE,KAA2C,CAAA;gBACjE,IAAI,CAAC,EAAE,CAAC;oBACN,MAAM,YAAY,GAAG,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,aAAa,CAAuB,CAAA;oBAC9E,MAAM,gBAAgB,GAAG,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,CAAC,iBAAiB,CAAuB,CAAA;oBACvF,MAAM,KAAK,GAAG,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,GAAG,CAAC,gBAAgB,IAAI,CAAC,CAAC,CAAC,IAAI,SAAS,CAAA;oBAC1E,KAAK,GAAG,EAAE,aAAa,EAAE,YAAY,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,YAAY,EAAE,KAAK,EAAE,CAAA;gBACnG,CAAC;YACH,CAAC;YAAC,MAAM,CAAC,CAAC,iDAAiD,CAAC,CAAC;YAC7D,OAAO,CAAC;gBACN,OAAO,EAAE,IAAI,KAAK,CAAC;gBACnB,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC;gBAC9B,QAAQ,EAAE,IAAI,IAAI,CAAC,CAAC;gBACpB,KAAK;aACN,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACvB,OAAO,CAAC;gBACN,OAAO,EAAE,KAAK;gBACd,MAAM,EAAE,2BAA2B,GAAG,CAAC,OAAO,EAAE;gBAChD,QAAQ,EAAE,CAAC,CAAC;aACb,CAAC,CAAA;QACJ,CAAC,CAAC,CAAA;QACF,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAA;IACtB,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,IAAU;IACzB,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QAC3C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAC7B,UAAU,CAAC,GAAG,EAAE;YACd,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAC3C,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;YAC/B,CAAC;QACH,CAAC,EAAE,IAAI,CAAC,CAAA;IACV,CAAC;AACH,CAAC;AAED,4BAA4B;AAC5B,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAAU,EAAE,UAA0B,EAAE;IACpE,IAAI,CAAC,IAAI;QAAE,MAAM,WAAW,EAAE,CAAA;IAC9B,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;IACvD,OAAO,aAAa,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;AACrC,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,IAAU;IAC7B,IAAI,IAAI,KAAK,KAAK;QAAE,OAAO,CAAC,IAAI,CAAC,CAAA;;QAC5B,OAAO,CAAC,IAAI,CAAC,CAAA;AACpB,CAAC"}
|
|
@@ -1,24 +1,6 @@
|
|
|
1
1
|
import type { Task, ExecuteOptions, ExecuteResult } from '../../types.js';
|
|
2
|
-
/** Adapter name */
|
|
3
2
|
export declare const name = "copilot";
|
|
4
|
-
/**
|
|
5
|
-
* Check if the `copilot` CLI is available on the system PATH.
|
|
6
|
-
* The SDK communicates with the CLI in server mode, so it must be installed.
|
|
7
|
-
*/
|
|
8
3
|
export declare function isAvailable(): Promise<boolean>;
|
|
9
|
-
/**
|
|
10
|
-
* Execute a task using the Copilot SDK.
|
|
11
|
-
*
|
|
12
|
-
* Each task gets its own session with:
|
|
13
|
-
* - All tool permissions auto-approved (equivalent to `--allow-all-tools`)
|
|
14
|
-
* - No `ask_user` tool (autonomous — equivalent to `--no-ask-user`)
|
|
15
|
-
* - System message injected with the agent role
|
|
16
|
-
* - Streaming enabled in verbose mode for live output
|
|
17
|
-
*/
|
|
18
4
|
export declare function execute(task: Task, options?: ExecuteOptions): Promise<ExecuteResult>;
|
|
19
|
-
/**
|
|
20
|
-
* Abort and destroy the session associated with a task.
|
|
21
|
-
* Called by the executor when a task exceeds its timeout.
|
|
22
|
-
*/
|
|
23
5
|
export declare function kill(task: Task): void;
|
|
24
6
|
//# sourceMappingURL=copilot.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copilot.d.ts","sourceRoot":"","sources":["../../../../src/cli/run/adapters/copilot.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"copilot.d.ts","sourceRoot":"","sources":["../../../../src/cli/run/adapters/copilot.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,cAAc,EAAE,aAAa,EAAc,MAAM,gBAAgB,CAAA;AAGrF,eAAO,MAAM,IAAI,YAAY,CAAA;AAwB7B,wBAAsB,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC,CAUpD;AAuKD,wBAAsB,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,aAAa,CAAC,CAI9F;AAED,wBAAgB,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,CAGrC"}
|
|
@@ -1,32 +1,42 @@
|
|
|
1
1
|
import { spawn } from 'node:child_process';
|
|
2
2
|
import { parseTimeout } from '../schema.js';
|
|
3
|
-
|
|
3
|
+
// Adapter name
|
|
4
4
|
export const name = 'copilot';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
export async function isAvailable() {
|
|
5
|
+
// --- Unified adapter: SDK first, fallback to CLI ---
|
|
6
|
+
let mode = null;
|
|
7
|
+
// SDK check
|
|
8
|
+
async function sdkAvailable() {
|
|
9
|
+
try {
|
|
10
|
+
await import('@github/copilot-sdk');
|
|
11
|
+
return true;
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
return false;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
// CLI check
|
|
18
|
+
async function cliAvailable() {
|
|
20
19
|
return new Promise((resolve) => {
|
|
21
20
|
const proc = spawn('which', ['copilot'], { stdio: 'pipe' });
|
|
22
21
|
proc.on('close', (code) => resolve(code === 0));
|
|
23
22
|
proc.on('error', () => resolve(false));
|
|
24
23
|
});
|
|
25
24
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
25
|
+
export async function isAvailable() {
|
|
26
|
+
if (await sdkAvailable()) {
|
|
27
|
+
mode = 'sdk';
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
if (await cliAvailable()) {
|
|
31
|
+
mode = 'cli';
|
|
32
|
+
return true;
|
|
33
|
+
}
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
// --- SDK implementation (existing logic) ---
|
|
37
|
+
let clientPromise = null;
|
|
38
|
+
let cachedApproveAll = null;
|
|
39
|
+
const activeSessions = new Map();
|
|
30
40
|
async function getClient() {
|
|
31
41
|
if (!clientPromise) {
|
|
32
42
|
clientPromise = (async () => {
|
|
@@ -42,21 +52,11 @@ async function getClient() {
|
|
|
42
52
|
}
|
|
43
53
|
return clientPromise;
|
|
44
54
|
}
|
|
45
|
-
|
|
46
|
-
* Execute a task using the Copilot SDK.
|
|
47
|
-
*
|
|
48
|
-
* Each task gets its own session with:
|
|
49
|
-
* - All tool permissions auto-approved (equivalent to `--allow-all-tools`)
|
|
50
|
-
* - No `ask_user` tool (autonomous — equivalent to `--no-ask-user`)
|
|
51
|
-
* - System message injected with the agent role
|
|
52
|
-
* - Streaming enabled in verbose mode for live output
|
|
53
|
-
*/
|
|
54
|
-
export async function execute(task, options = {}) {
|
|
55
|
+
async function executeViaSdk(task, options = {}) {
|
|
55
56
|
// NOTE: The Copilot SDK CopilotClient is a shared singleton. Per-task cwd
|
|
56
57
|
// isolation requires SDK support for per-session workingDirectory, which is
|
|
57
58
|
// not yet available. When running in convoy mode with worktrees, prefer
|
|
58
|
-
// subprocess-based adapters (
|
|
59
|
-
// natively. Copilot SDK per-session cwd support is tracked for Phase 3.
|
|
59
|
+
// subprocess-based adapters (cli mode) that support options.cwd natively.
|
|
60
60
|
let prompt = `You are a ${task.agent}. ${task.prompt}`;
|
|
61
61
|
if (task.files && task.files.length > 0) {
|
|
62
62
|
prompt += `\n\nOnly modify files under: ${task.files.join(', ')}`;
|
|
@@ -75,7 +75,6 @@ export async function execute(task, options = {}) {
|
|
|
75
75
|
...(options.verbose ? { streaming: true } : {}),
|
|
76
76
|
});
|
|
77
77
|
activeSessions.set(task.id, session);
|
|
78
|
-
// Stream deltas to stdout in verbose mode
|
|
79
78
|
if (options.verbose) {
|
|
80
79
|
session.on('assistant.message_delta', (event) => {
|
|
81
80
|
process.stdout.write(event.data.deltaContent);
|
|
@@ -111,11 +110,7 @@ export async function execute(task, options = {}) {
|
|
|
111
110
|
await session.destroy().catch(() => { });
|
|
112
111
|
}
|
|
113
112
|
}
|
|
114
|
-
|
|
115
|
-
* Abort and destroy the session associated with a task.
|
|
116
|
-
* Called by the executor when a task exceeds its timeout.
|
|
117
|
-
*/
|
|
118
|
-
export function kill(task) {
|
|
113
|
+
function killSdk(task) {
|
|
119
114
|
const session = activeSessions.get(task.id);
|
|
120
115
|
if (session) {
|
|
121
116
|
session.abort().catch(() => { });
|
|
@@ -123,4 +118,94 @@ export function kill(task) {
|
|
|
123
118
|
activeSessions.delete(task.id);
|
|
124
119
|
}
|
|
125
120
|
}
|
|
121
|
+
// --- CLI implementation ---
|
|
122
|
+
async function executeViaCli(task, options = {}) {
|
|
123
|
+
// CLI supports --output-format json, --max-turns, and respects cwd
|
|
124
|
+
let prompt = `You are a ${task.agent}. ${task.prompt}`;
|
|
125
|
+
if (task.files && task.files.length > 0) {
|
|
126
|
+
prompt += `\n\nOnly modify files under: ${task.files.join(', ')}`;
|
|
127
|
+
}
|
|
128
|
+
const args = [
|
|
129
|
+
'-p',
|
|
130
|
+
prompt,
|
|
131
|
+
'--output-format',
|
|
132
|
+
'json',
|
|
133
|
+
'--max-turns',
|
|
134
|
+
'50',
|
|
135
|
+
];
|
|
136
|
+
return new Promise((resolve) => {
|
|
137
|
+
const proc = spawn('copilot', args, {
|
|
138
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
139
|
+
env: { ...process.env },
|
|
140
|
+
cwd: options?.cwd ?? process.cwd(),
|
|
141
|
+
});
|
|
142
|
+
let stdout = '';
|
|
143
|
+
let stderr = '';
|
|
144
|
+
proc.stdout.on('data', (chunk) => {
|
|
145
|
+
stdout += chunk.toString();
|
|
146
|
+
if (options.verbose) {
|
|
147
|
+
process.stdout.write(chunk);
|
|
148
|
+
}
|
|
149
|
+
});
|
|
150
|
+
proc.stderr.on('data', (chunk) => {
|
|
151
|
+
stderr += chunk.toString();
|
|
152
|
+
if (options.verbose) {
|
|
153
|
+
process.stderr.write(chunk);
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
proc.on('close', (code) => {
|
|
157
|
+
const output = [stdout, stderr].filter(Boolean).join('\n');
|
|
158
|
+
let usage;
|
|
159
|
+
try {
|
|
160
|
+
const parsedJson = JSON.parse(stdout);
|
|
161
|
+
const u = parsedJson?.usage;
|
|
162
|
+
if (u) {
|
|
163
|
+
const promptTokens = (u.input_tokens ?? u.prompt_tokens);
|
|
164
|
+
const completionTokens = (u.output_tokens ?? u.completion_tokens);
|
|
165
|
+
const total = ((promptTokens ?? 0) + (completionTokens ?? 0)) || undefined;
|
|
166
|
+
usage = { prompt_tokens: promptTokens, completion_tokens: completionTokens, total_tokens: total };
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch { /* not JSON or no usage — graceful degradation */ }
|
|
170
|
+
resolve({
|
|
171
|
+
success: code === 0,
|
|
172
|
+
output: output.slice(0, 10000),
|
|
173
|
+
exitCode: code ?? -1,
|
|
174
|
+
usage,
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
proc.on('error', (err) => {
|
|
178
|
+
resolve({
|
|
179
|
+
success: false,
|
|
180
|
+
output: `Failed to spawn copilot: ${err.message}`,
|
|
181
|
+
exitCode: -1,
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
task._process = proc;
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
function killCli(task) {
|
|
188
|
+
if (task._process && !task._process.killed) {
|
|
189
|
+
task._process.kill('SIGTERM');
|
|
190
|
+
setTimeout(() => {
|
|
191
|
+
if (task._process && !task._process.killed) {
|
|
192
|
+
task._process.kill('SIGKILL');
|
|
193
|
+
}
|
|
194
|
+
}, 5000);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
// --- Unified interface ---
|
|
198
|
+
export async function execute(task, options = {}) {
|
|
199
|
+
if (!mode)
|
|
200
|
+
await isAvailable();
|
|
201
|
+
if (mode === 'sdk')
|
|
202
|
+
return executeViaSdk(task, options);
|
|
203
|
+
return executeViaCli(task, options);
|
|
204
|
+
}
|
|
205
|
+
export function kill(task) {
|
|
206
|
+
if (mode === 'sdk')
|
|
207
|
+
killSdk(task);
|
|
208
|
+
else
|
|
209
|
+
killCli(task);
|
|
210
|
+
}
|
|
126
211
|
//# sourceMappingURL=copilot.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../../../src/cli/run/adapters/copilot.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"copilot.js","sourceRoot":"","sources":["../../../../src/cli/run/adapters/copilot.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Adapter registry for agent runtimes.
|
|
3
3
|
*/
|
|
4
4
|
const ADAPTERS = {
|
|
5
|
-
|
|
5
|
+
claude: () => import('./claude.js'),
|
|
6
6
|
copilot: () => import('./copilot.js'),
|
|
7
7
|
cursor: () => import('./cursor.js'),
|
|
8
8
|
opencode: () => import('./opencode.js'),
|
|
@@ -23,7 +23,7 @@ export async function getAdapter(name) {
|
|
|
23
23
|
* Detection priority order — checked first-to-last.
|
|
24
24
|
* The first available adapter wins.
|
|
25
25
|
*/
|
|
26
|
-
const DETECTION_ORDER = ['copilot', 'claude
|
|
26
|
+
const DETECTION_ORDER = ['copilot', 'claude', 'cursor', 'opencode'];
|
|
27
27
|
/**
|
|
28
28
|
* Auto-detect which adapter CLI is available on the system.
|
|
29
29
|
* Returns the adapter name or null if none found.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/run/adapters/index.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,QAAQ,GAAgD;IAC5D,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/run/adapters/index.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,QAAQ,GAAgD;IAC5D,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAA0B;IAC5D,OAAO,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,cAAc,CAA0B;IAC9D,MAAM,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAA0B;IAC5D,QAAQ,EAAE,GAAG,EAAE,CAAC,MAAM,CAAC,eAAe,CAA0B;CACjE,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAY;IAC3C,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC7B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAClD,MAAM,IAAI,KAAK,CACb,oBAAoB,IAAI,0BAA0B,SAAS,EAAE,CAC9D,CAAA;IACH,CAAC;IACD,OAAO,MAAM,EAAE,CAAA;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,eAAe,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,CAAU,CAAA;AAE5E;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,KAAK,MAAM,IAAI,IAAI,eAAe,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC,CAAA;QACtC,IAAI,MAAM,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;YAChC,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY;IAChC,MAAM,MAAM,GAAgD,EAAE,CAAA;IAC9D,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtD,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE,CAAA;QAC1B,MAAM,CAAC,IAAI,CAAC;YACV,IAAI;YACJ,SAAS,EAAE,MAAM,GAAG,CAAC,WAAW,EAAE;SACnC,CAAC,CAAA;IACJ,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC"}
|
package/dist/cli/run.js
CHANGED
|
@@ -126,7 +126,7 @@ function printAdapterError(detectionFailed, adapterName) {
|
|
|
126
126
|
}
|
|
127
127
|
else {
|
|
128
128
|
const hints = {
|
|
129
|
-
'claude
|
|
129
|
+
'claude': ' Install: npm install -g @anthropic-ai/claude-code\n' +
|
|
130
130
|
' Docs: https://docs.anthropic.com/en/docs/claude-code',
|
|
131
131
|
copilot: ' Requires the Copilot CLI installed and authenticated:\n' +
|
|
132
132
|
' https://docs.github.com/en/copilot/how-tos/set-up/install-copilot-cli\n' +
|
|
@@ -137,7 +137,7 @@ function printAdapterError(detectionFailed, adapterName) {
|
|
|
137
137
|
opencode: ' Install OpenCode from https://opencode.ai\n' +
|
|
138
138
|
' Ensure the "opencode" command is on your PATH.',
|
|
139
139
|
};
|
|
140
|
-
const cliName = adapterName === '
|
|
140
|
+
const cliName = adapterName === 'cursor' ? 'agent' : adapterName;
|
|
141
141
|
const hint = hints[adapterName] ?? '';
|
|
142
142
|
console.error(` ✗ Adapter "${adapterName}" is not available.\n` +
|
|
143
143
|
` Make sure the "${cliName}" CLI is installed and on your PATH.\n` +
|
|
@@ -310,7 +310,7 @@ export default async function run({ args, pkgRoot }) {
|
|
|
310
310
|
}
|
|
311
311
|
else {
|
|
312
312
|
resumePipelineDetectionFailed = true;
|
|
313
|
-
resumePipelineSpec.adapter = 'claude
|
|
313
|
+
resumePipelineSpec.adapter = 'claude';
|
|
314
314
|
}
|
|
315
315
|
}
|
|
316
316
|
const resumePipelineAdapter = await getAdapter(resumePipelineSpec.adapter);
|
|
@@ -359,7 +359,7 @@ export default async function run({ args, pkgRoot }) {
|
|
|
359
359
|
}
|
|
360
360
|
else {
|
|
361
361
|
resumeDetectionFailed = true;
|
|
362
|
-
resumeSpec.adapter = 'claude
|
|
362
|
+
resumeSpec.adapter = 'claude';
|
|
363
363
|
}
|
|
364
364
|
}
|
|
365
365
|
const resumeAdapter = await getAdapter(resumeSpec.adapter);
|
|
@@ -422,7 +422,7 @@ export default async function run({ args, pkgRoot }) {
|
|
|
422
422
|
}
|
|
423
423
|
else {
|
|
424
424
|
detectionFailed = true;
|
|
425
|
-
spec.adapter = 'claude
|
|
425
|
+
spec.adapter = 'claude'; // fallback for availability check below
|
|
426
426
|
}
|
|
427
427
|
}
|
|
428
428
|
// ── Dry run ──────────────────────────────────────────────────
|