@dokobot/cli 2.1.1 → 2.2.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/README.md +12 -15
- package/dist/src/cli.js +12 -1
- package/dist/src/cli.js.map +1 -1
- package/dist/src/doko.js +12 -205
- package/dist/src/doko.js.map +1 -1
- package/dist/src/install-skill.d.ts +5 -0
- package/dist/src/install-skill.js +127 -0
- package/dist/src/install-skill.js.map +1 -0
- package/dist/src/server-client.d.ts +0 -21
- package/dist/src/server-client.js +0 -64
- package/dist/src/server-client.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -13,23 +13,17 @@ npm i -g @dokobot/cli
|
|
|
13
13
|
### Local mode (free, unlimited)
|
|
14
14
|
|
|
15
15
|
```bash
|
|
16
|
-
# Install
|
|
17
|
-
dokobot install-
|
|
18
|
-
|
|
19
|
-
# Read any page locally through your browser
|
|
16
|
+
dokobot install-bridge # Install native messaging bridge (one-time)
|
|
17
|
+
dokobot install-skill # Install skill for your AI agent (one-time)
|
|
20
18
|
dokobot doko read --local https://example.com
|
|
21
19
|
```
|
|
22
20
|
|
|
23
21
|
### Remote mode (cloud API)
|
|
24
22
|
|
|
25
23
|
```bash
|
|
26
|
-
# Configure your API key
|
|
27
|
-
dokobot
|
|
28
|
-
|
|
29
|
-
# Read any page via cloud API
|
|
24
|
+
dokobot config # Configure your API key
|
|
25
|
+
dokobot install-skill # Install skill for your AI agent (one-time)
|
|
30
26
|
dokobot doko read https://example.com
|
|
31
|
-
|
|
32
|
-
# Search the web
|
|
33
27
|
dokobot doko search "latest AI news"
|
|
34
28
|
```
|
|
35
29
|
|
|
@@ -101,16 +95,19 @@ dokobot doko search "latest AI news" --num 10
|
|
|
101
95
|
|--------|-------------|
|
|
102
96
|
| `--num <n>` | Number of results, 1-10 (default: 5) |
|
|
103
97
|
|
|
104
|
-
### `
|
|
98
|
+
### `install-skill`
|
|
105
99
|
|
|
106
|
-
|
|
100
|
+
Download and install the Dokobot skill for your AI agent. Auto-detects installed agents or lets you choose.
|
|
107
101
|
|
|
108
102
|
```bash
|
|
109
|
-
dokobot
|
|
110
|
-
dokobot
|
|
111
|
-
dokobot
|
|
103
|
+
dokobot install-skill # Interactive agent selection
|
|
104
|
+
dokobot install-skill --agent claude-code # Install for Claude Code
|
|
105
|
+
dokobot install-skill --agent codex # Install for Codex
|
|
106
|
+
dokobot install-skill -o ./my-skills # Custom skills directory
|
|
112
107
|
```
|
|
113
108
|
|
|
109
|
+
Supported agents: `claude-code`, `openclaw`, `windsurf`, `codex`.
|
|
110
|
+
|
|
114
111
|
### `doko list` / `doko remove <id>`
|
|
115
112
|
|
|
116
113
|
List or remove registered doko devices.
|
package/dist/src/cli.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Command } from 'commander';
|
|
2
2
|
import { input } from '@inquirer/prompts';
|
|
3
|
-
import { loadConfig, saveConfig } from './config.js';
|
|
3
|
+
import { loadConfig, saveConfig, getServerUrl } from './config.js';
|
|
4
4
|
import { getCurrentVersion } from './version.js';
|
|
5
5
|
import { checkForUpdateNow, formatUpdateNotification } from './update-checker.js';
|
|
6
6
|
import { registerDokoCommands } from './doko.js';
|
|
@@ -51,6 +51,17 @@ export function createProgram() {
|
|
|
51
51
|
const { installBridge } = await import('./install-bridge.js');
|
|
52
52
|
await installBridge(options);
|
|
53
53
|
});
|
|
54
|
+
program
|
|
55
|
+
.command('install-skill')
|
|
56
|
+
.description('Download and install the Dokobot skill for your AI agent')
|
|
57
|
+
.option('-o, --output <path>', 'Custom skills directory (skill will be saved to <path>/doko/SKILL.md)')
|
|
58
|
+
.option('--agent <name>', 'Target agent (claude-code, openclaw, windsurf, codex)')
|
|
59
|
+
.action(async (options) => {
|
|
60
|
+
const globalOpts = program.opts();
|
|
61
|
+
const serverUrl = getServerUrl(globalOpts.server);
|
|
62
|
+
const { installSkill } = await import('./install-skill.js');
|
|
63
|
+
await installSkill({ serverUrl, outputPath: options.output, agent: options.agent });
|
|
64
|
+
});
|
|
54
65
|
registerDokoCommands(program);
|
|
55
66
|
return program;
|
|
56
67
|
}
|
package/dist/src/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/src/doko.js
CHANGED
|
@@ -1,41 +1,18 @@
|
|
|
1
|
-
import { input, select } from '@inquirer/prompts';
|
|
2
|
-
import { McpClient } from './mcp-client.js';
|
|
3
1
|
import { ServerClient } from './server-client.js';
|
|
4
|
-
import {
|
|
5
|
-
import { Heartbeat } from './heartbeat.js';
|
|
6
|
-
import { Executor, DOKO_TOOLS } from './executor.js';
|
|
7
|
-
import { getApiKey, getServerUrl, loadConfig, saveConfig, saveDevice, listDevices, removeDevice, findDeviceByName, } from './config.js';
|
|
2
|
+
import { getApiKey, getServerUrl, listDevices, removeDevice, } from './config.js';
|
|
8
3
|
import { setLogLevel } from './logger.js';
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
${G}▄████████▄${R}
|
|
18
|
-
${G}███${W}██${R}${G}█${W}██${R}${G}███${R} ${B}Dokobot CLI${R} ${D}v${getCurrentVersion()}${R}
|
|
19
|
-
${G}███████████${R} ${D}Open the full web to AI agent${R}
|
|
20
|
-
${G}▀████████▀${R}
|
|
21
|
-
`;
|
|
4
|
+
function requireApiKey(globalOpts) {
|
|
5
|
+
const apiKey = getApiKey(globalOpts.apiKey);
|
|
6
|
+
if (!apiKey) {
|
|
7
|
+
console.error('API key required for remote mode. Run `dokobot config` to set your key, or use `--local` for local mode without an API key.');
|
|
8
|
+
process.exit(1);
|
|
9
|
+
}
|
|
10
|
+
return apiKey;
|
|
11
|
+
}
|
|
22
12
|
export function registerDokoCommands(program) {
|
|
23
13
|
const doko = program
|
|
24
14
|
.command('doko')
|
|
25
15
|
.description('Manage doko devices');
|
|
26
|
-
doko
|
|
27
|
-
.command('connect')
|
|
28
|
-
.description('Connect a Chrome browser via Chrome DevTools MCP')
|
|
29
|
-
.option('--name <name>', 'Name for the doko')
|
|
30
|
-
.option('--device-id <id>', 'Reuse an existing device ID')
|
|
31
|
-
.option('--browser-url <url>', 'Connect to a running Chrome instance (e.g. http://127.0.0.1:9222)')
|
|
32
|
-
.option('--mcp-args <args>', 'Extra arguments for chrome-devtools-mcp (comma-separated)')
|
|
33
|
-
.action(async (options) => {
|
|
34
|
-
const globalOpts = program.opts();
|
|
35
|
-
if (globalOpts.verbose)
|
|
36
|
-
setLogLevel('debug');
|
|
37
|
-
await connectCommand(globalOpts, options);
|
|
38
|
-
});
|
|
39
16
|
doko
|
|
40
17
|
.command('list')
|
|
41
18
|
.description('List registered devices')
|
|
@@ -93,11 +70,7 @@ export function registerDokoCommands(program) {
|
|
|
93
70
|
result = await client.readPage(readParams);
|
|
94
71
|
}
|
|
95
72
|
else {
|
|
96
|
-
const apiKey =
|
|
97
|
-
if (!apiKey) {
|
|
98
|
-
console.error('API key required. Run `dokobot config` first.');
|
|
99
|
-
process.exit(1);
|
|
100
|
-
}
|
|
73
|
+
const apiKey = requireApiKey(globalOpts);
|
|
101
74
|
const serverUrl = getServerUrl(globalOpts.server);
|
|
102
75
|
const client = new ServerClient(serverUrl, apiKey);
|
|
103
76
|
result = await client.readPage({ ...readParams, deviceId: options.device });
|
|
@@ -132,11 +105,7 @@ export function registerDokoCommands(program) {
|
|
|
132
105
|
await client.closeSession(sessionId);
|
|
133
106
|
}
|
|
134
107
|
else {
|
|
135
|
-
const apiKey =
|
|
136
|
-
if (!apiKey) {
|
|
137
|
-
console.error('API key required. Run `dokobot config` first.');
|
|
138
|
-
process.exit(1);
|
|
139
|
-
}
|
|
108
|
+
const apiKey = requireApiKey(globalOpts);
|
|
140
109
|
const serverUrl = getServerUrl(globalOpts.server);
|
|
141
110
|
const client = new ServerClient(serverUrl, apiKey);
|
|
142
111
|
await client.closeSession(sessionId);
|
|
@@ -156,11 +125,7 @@ export function registerDokoCommands(program) {
|
|
|
156
125
|
const globalOpts = program.opts();
|
|
157
126
|
if (globalOpts.verbose)
|
|
158
127
|
setLogLevel('debug');
|
|
159
|
-
const apiKey =
|
|
160
|
-
if (!apiKey) {
|
|
161
|
-
console.error('API key required. Run `dokobot config` first.');
|
|
162
|
-
process.exit(1);
|
|
163
|
-
}
|
|
128
|
+
const apiKey = requireApiKey(globalOpts);
|
|
164
129
|
const serverUrl = getServerUrl(globalOpts.server);
|
|
165
130
|
const client = new ServerClient(serverUrl, apiKey);
|
|
166
131
|
try {
|
|
@@ -182,162 +147,4 @@ export function registerDokoCommands(program) {
|
|
|
182
147
|
}
|
|
183
148
|
});
|
|
184
149
|
}
|
|
185
|
-
async function connectCommand(globalOpts, options) {
|
|
186
|
-
console.log(BANNER);
|
|
187
|
-
const serverUrl = getServerUrl(globalOpts.server);
|
|
188
|
-
let deviceId = options.deviceId;
|
|
189
|
-
let deviceName = options.name;
|
|
190
|
-
let apiKey = getApiKey(globalOpts.apiKey);
|
|
191
|
-
if (!apiKey) {
|
|
192
|
-
if (deviceId) {
|
|
193
|
-
const guideUrl = `${serverUrl}/guide?source=cli&deviceId=${deviceId}`;
|
|
194
|
-
console.log(` No API key found. Opening setup guide...`);
|
|
195
|
-
console.log(` ${D}${guideUrl}${R}`);
|
|
196
|
-
console.log('');
|
|
197
|
-
const { exec } = await import('child_process');
|
|
198
|
-
exec(`open "${guideUrl}"`);
|
|
199
|
-
apiKey = await input({ message: 'Paste your API key:' });
|
|
200
|
-
if (!apiKey) {
|
|
201
|
-
console.error('API key is required.');
|
|
202
|
-
process.exit(1);
|
|
203
|
-
}
|
|
204
|
-
const config = loadConfig();
|
|
205
|
-
saveConfig({ ...config, apiKey });
|
|
206
|
-
console.log(' ✓ API key saved');
|
|
207
|
-
}
|
|
208
|
-
else {
|
|
209
|
-
const { randomUUID } = await import('crypto');
|
|
210
|
-
const preferredId = randomUUID();
|
|
211
|
-
const guideUrl = `${serverUrl}/guide?source=cli&deviceId=${preferredId}`;
|
|
212
|
-
console.log(` No API key found. Opening setup guide...`);
|
|
213
|
-
console.log(` ${D}${guideUrl}${R}`);
|
|
214
|
-
console.log('');
|
|
215
|
-
console.log(' Follow the guide to complete the setup.');
|
|
216
|
-
const { exec } = await import('child_process');
|
|
217
|
-
exec(`open "${guideUrl}"`);
|
|
218
|
-
process.exit(0);
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
const serverClient = new ServerClient(serverUrl, apiKey);
|
|
222
|
-
if (!deviceId && deviceName) {
|
|
223
|
-
const existing = findDeviceByName(deviceName);
|
|
224
|
-
if (existing) {
|
|
225
|
-
deviceId = existing.id;
|
|
226
|
-
}
|
|
227
|
-
}
|
|
228
|
-
if (!deviceId && !deviceName) {
|
|
229
|
-
const devices = listDevices();
|
|
230
|
-
const choices = [
|
|
231
|
-
{ name: '+ Create new doko', value: '__new__' },
|
|
232
|
-
...devices.map(d => ({ name: `${d.name} (${d.id})`, value: d.id })),
|
|
233
|
-
];
|
|
234
|
-
const selected = await select({
|
|
235
|
-
message: 'Choose a doko:',
|
|
236
|
-
choices,
|
|
237
|
-
});
|
|
238
|
-
if (selected === '__new__') {
|
|
239
|
-
deviceName = await input({
|
|
240
|
-
message: 'Name your new doko:',
|
|
241
|
-
default: 'My Chrome',
|
|
242
|
-
});
|
|
243
|
-
}
|
|
244
|
-
else {
|
|
245
|
-
deviceId = selected;
|
|
246
|
-
const existing = devices.find(d => d.id === deviceId);
|
|
247
|
-
deviceName = existing?.name;
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
const mcpExtraArgs = options.mcpArgs ? options.mcpArgs.split(',') : [];
|
|
251
|
-
const mcpClient = new McpClient();
|
|
252
|
-
console.log(' Connecting to Chrome...');
|
|
253
|
-
try {
|
|
254
|
-
await mcpClient.connect({
|
|
255
|
-
browserUrl: options.browserUrl,
|
|
256
|
-
extraArgs: mcpExtraArgs,
|
|
257
|
-
});
|
|
258
|
-
}
|
|
259
|
-
catch (error) {
|
|
260
|
-
console.error('Failed to connect to Chrome DevTools MCP:', error instanceof Error ? error.message : error);
|
|
261
|
-
process.exit(1);
|
|
262
|
-
}
|
|
263
|
-
let tools;
|
|
264
|
-
try {
|
|
265
|
-
tools = await mcpClient.listTools();
|
|
266
|
-
}
|
|
267
|
-
catch (error) {
|
|
268
|
-
console.error(' ✗ Failed to connect to Chrome DevTools MCP:', error instanceof Error ? error.message : error);
|
|
269
|
-
await mcpClient.disconnect();
|
|
270
|
-
process.exit(1);
|
|
271
|
-
}
|
|
272
|
-
try {
|
|
273
|
-
const check = await mcpClient.callTool('list_pages', {});
|
|
274
|
-
if (check.isError) {
|
|
275
|
-
const msg = check.content?.[0]?.text ?? '';
|
|
276
|
-
console.error(' ✗ Chrome is not reachable.');
|
|
277
|
-
console.error('');
|
|
278
|
-
console.error(' Please enable remote debugging in Chrome:');
|
|
279
|
-
console.error(' 1. Open chrome://inspect/#remote-debugging');
|
|
280
|
-
console.error(' 2. Check "Allow remote debugging for this browser instance"');
|
|
281
|
-
console.error(' 3. Re-run this command');
|
|
282
|
-
console.error('');
|
|
283
|
-
console.error(` Detail: ${msg}`);
|
|
284
|
-
await mcpClient.disconnect();
|
|
285
|
-
process.exit(1);
|
|
286
|
-
}
|
|
287
|
-
console.log(` ✓ Connected to Chrome (${tools.length} tools available)`);
|
|
288
|
-
}
|
|
289
|
-
catch (error) {
|
|
290
|
-
console.error(' ✗ Chrome health check failed:', error instanceof Error ? error.message : error);
|
|
291
|
-
await mcpClient.disconnect();
|
|
292
|
-
process.exit(1);
|
|
293
|
-
}
|
|
294
|
-
try {
|
|
295
|
-
const result = await serverClient.connect({
|
|
296
|
-
type: 'chrome',
|
|
297
|
-
deviceId,
|
|
298
|
-
name: deviceName,
|
|
299
|
-
tools: [...tools, ...DOKO_TOOLS],
|
|
300
|
-
});
|
|
301
|
-
deviceId = result.deviceId;
|
|
302
|
-
deviceName = result.name;
|
|
303
|
-
saveDevice({
|
|
304
|
-
id: result.deviceId,
|
|
305
|
-
name: result.name,
|
|
306
|
-
type: result.type,
|
|
307
|
-
createdAt: Date.now(),
|
|
308
|
-
});
|
|
309
|
-
console.log(` ✓ Registered "${deviceName}" (${deviceId})`);
|
|
310
|
-
}
|
|
311
|
-
catch (error) {
|
|
312
|
-
console.error('Registration failed:', error instanceof Error ? error.message : error);
|
|
313
|
-
await mcpClient.disconnect();
|
|
314
|
-
process.exit(1);
|
|
315
|
-
}
|
|
316
|
-
const executor = new Executor(mcpClient, serverUrl);
|
|
317
|
-
const heartbeat = new Heartbeat(serverClient, deviceId);
|
|
318
|
-
const statusLine = ` ${G}●${R} Listening for commands... (Ctrl+C to quit)`;
|
|
319
|
-
const poller = new CommandPoller(serverClient, executor, deviceId, {
|
|
320
|
-
onReconnect: () => process.stdout.write(statusLine),
|
|
321
|
-
});
|
|
322
|
-
heartbeat.start();
|
|
323
|
-
poller.start();
|
|
324
|
-
const updateInfo = getUpdateResult();
|
|
325
|
-
if (updateInfo) {
|
|
326
|
-
console.error(formatUpdateNotification(updateInfo));
|
|
327
|
-
}
|
|
328
|
-
console.log('');
|
|
329
|
-
process.stdout.write(statusLine);
|
|
330
|
-
const shutdown = async () => {
|
|
331
|
-
process.stdout.write(`\r\x1b[2K`);
|
|
332
|
-
console.log(' Shutting down...');
|
|
333
|
-
poller.stop();
|
|
334
|
-
heartbeat.stop();
|
|
335
|
-
await serverClient.disconnect(deviceId);
|
|
336
|
-
await mcpClient.disconnect();
|
|
337
|
-
process.exit(0);
|
|
338
|
-
};
|
|
339
|
-
process.on('SIGINT', shutdown);
|
|
340
|
-
process.on('SIGTERM', shutdown);
|
|
341
|
-
await new Promise(() => { });
|
|
342
|
-
}
|
|
343
150
|
//# sourceMappingURL=doko.js.map
|
package/dist/src/doko.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"doko.js","sourceRoot":"","sources":["../../src/doko.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"doko.js","sourceRoot":"","sources":["../../src/doko.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as os from 'os';
|
|
4
|
+
import { select, input } from '@inquirer/prompts';
|
|
5
|
+
const SKILL_NAME = 'doko';
|
|
6
|
+
const CUSTOM_CHOICE = '__custom__';
|
|
7
|
+
function allAgents() {
|
|
8
|
+
const home = os.homedir();
|
|
9
|
+
return [
|
|
10
|
+
{
|
|
11
|
+
name: 'Claude Code',
|
|
12
|
+
dir: path.join(home, '.claude', 'skills', SKILL_NAME),
|
|
13
|
+
file: 'SKILL.md',
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
name: 'OpenClaw',
|
|
17
|
+
dir: path.join(home, '.openclaw', 'skills', SKILL_NAME),
|
|
18
|
+
file: 'SKILL.md',
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
name: 'Windsurf',
|
|
22
|
+
dir: path.join(home, '.codeium', 'windsurf', 'skills', SKILL_NAME),
|
|
23
|
+
file: 'SKILL.md',
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
name: 'Codex',
|
|
27
|
+
dir: path.join(home, '.codex', 'skills', SKILL_NAME),
|
|
28
|
+
file: 'SKILL.md',
|
|
29
|
+
},
|
|
30
|
+
];
|
|
31
|
+
}
|
|
32
|
+
function detectInstalled() {
|
|
33
|
+
const markers = {
|
|
34
|
+
'Claude Code': path.join(os.homedir(), '.claude'),
|
|
35
|
+
'OpenClaw': path.join(os.homedir(), '.openclaw'),
|
|
36
|
+
'Windsurf': path.join(os.homedir(), '.codeium', 'windsurf'),
|
|
37
|
+
'Codex': path.join(os.homedir(), '.codex'),
|
|
38
|
+
};
|
|
39
|
+
return allAgents().filter(a => fs.existsSync(markers[a.name]));
|
|
40
|
+
}
|
|
41
|
+
const AGENT_ALIASES = {
|
|
42
|
+
'claude-code': 'Claude Code',
|
|
43
|
+
'claude': 'Claude Code',
|
|
44
|
+
'openclaw': 'OpenClaw',
|
|
45
|
+
'windsurf': 'Windsurf',
|
|
46
|
+
'codex': 'Codex',
|
|
47
|
+
};
|
|
48
|
+
function resolveAgentByName(name) {
|
|
49
|
+
const normalized = AGENT_ALIASES[name.toLowerCase()];
|
|
50
|
+
if (!normalized)
|
|
51
|
+
return undefined;
|
|
52
|
+
return allAgents().find(a => a.name === normalized);
|
|
53
|
+
}
|
|
54
|
+
export async function installSkill(options) {
|
|
55
|
+
const skillUrl = `${options.serverUrl}/api/tools/skill`;
|
|
56
|
+
if (options.outputPath) {
|
|
57
|
+
const resolved = path.join(resolvePath(options.outputPath), SKILL_NAME, 'SKILL.md');
|
|
58
|
+
fs.mkdirSync(path.dirname(resolved), { recursive: true });
|
|
59
|
+
await downloadTo(skillUrl, resolved);
|
|
60
|
+
console.log(`Skill installed to ${resolved}`);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (options.agent) {
|
|
64
|
+
const target = resolveAgentByName(options.agent);
|
|
65
|
+
if (!target) {
|
|
66
|
+
const valid = Object.keys(AGENT_ALIASES).join(', ');
|
|
67
|
+
console.error(`Unknown agent: ${options.agent}. Valid options: ${valid}`);
|
|
68
|
+
process.exit(1);
|
|
69
|
+
}
|
|
70
|
+
fs.mkdirSync(target.dir, { recursive: true });
|
|
71
|
+
const dest = path.join(target.dir, target.file);
|
|
72
|
+
await downloadTo(skillUrl, dest);
|
|
73
|
+
console.log(`Skill installed for ${target.name}: ${dest}`);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const installed = detectInstalled();
|
|
77
|
+
const agents = installed.length > 0 ? installed : allAgents();
|
|
78
|
+
const choices = [
|
|
79
|
+
...agents.map(a => ({
|
|
80
|
+
name: `${a.name} → ${shortenHome(path.join(a.dir, a.file))}`,
|
|
81
|
+
value: a.name,
|
|
82
|
+
})),
|
|
83
|
+
{ name: 'Custom path', value: CUSTOM_CHOICE },
|
|
84
|
+
];
|
|
85
|
+
const chosen = await select({
|
|
86
|
+
message: 'Install skill for:',
|
|
87
|
+
choices,
|
|
88
|
+
});
|
|
89
|
+
if (chosen === CUSTOM_CHOICE) {
|
|
90
|
+
const raw = await input({
|
|
91
|
+
message: 'Enter skills directory:',
|
|
92
|
+
default: './',
|
|
93
|
+
});
|
|
94
|
+
const resolved = path.join(resolvePath(raw), SKILL_NAME, 'SKILL.md');
|
|
95
|
+
fs.mkdirSync(path.dirname(resolved), { recursive: true });
|
|
96
|
+
await downloadTo(skillUrl, resolved);
|
|
97
|
+
console.log(`Skill installed to ${resolved}`);
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
const target = agents.find(a => a.name === chosen);
|
|
101
|
+
fs.mkdirSync(target.dir, { recursive: true });
|
|
102
|
+
const dest = path.join(target.dir, target.file);
|
|
103
|
+
await downloadTo(skillUrl, dest);
|
|
104
|
+
console.log(`Skill installed for ${target.name}: ${dest}`);
|
|
105
|
+
}
|
|
106
|
+
function resolvePath(p) {
|
|
107
|
+
if (p.startsWith('~')) {
|
|
108
|
+
return path.join(os.homedir(), p.slice(1));
|
|
109
|
+
}
|
|
110
|
+
return path.resolve(p);
|
|
111
|
+
}
|
|
112
|
+
function shortenHome(p) {
|
|
113
|
+
const home = os.homedir();
|
|
114
|
+
return p.startsWith(home) ? '~' + p.slice(home.length) : p;
|
|
115
|
+
}
|
|
116
|
+
async function downloadTo(url, dest) {
|
|
117
|
+
const res = await fetch(url);
|
|
118
|
+
if (!res.ok) {
|
|
119
|
+
throw new Error(`Failed to download skill: ${res.status} ${res.statusText}`);
|
|
120
|
+
}
|
|
121
|
+
const text = await res.text();
|
|
122
|
+
if (!text.startsWith('---')) {
|
|
123
|
+
throw new Error('Downloaded content is not a valid skill file');
|
|
124
|
+
}
|
|
125
|
+
fs.writeFileSync(dest, text);
|
|
126
|
+
}
|
|
127
|
+
//# sourceMappingURL=install-skill.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-skill.js","sourceRoot":"","sources":["../../src/install-skill.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,28 +1,8 @@
|
|
|
1
|
-
interface McpTool {
|
|
2
|
-
name: string;
|
|
3
|
-
description?: string;
|
|
4
|
-
inputSchema?: Record<string, unknown>;
|
|
5
|
-
}
|
|
6
|
-
interface RegisterResponse {
|
|
7
|
-
deviceId: string;
|
|
8
|
-
name: string;
|
|
9
|
-
type: string;
|
|
10
|
-
}
|
|
11
1
|
export declare class ServerClient {
|
|
12
2
|
private serverUrl;
|
|
13
3
|
private apiKey;
|
|
14
4
|
constructor(serverUrl: string, apiKey: string);
|
|
15
5
|
private request;
|
|
16
|
-
connect(params: {
|
|
17
|
-
name?: string;
|
|
18
|
-
type: 'chrome';
|
|
19
|
-
deviceId?: string;
|
|
20
|
-
tools?: McpTool[];
|
|
21
|
-
}): Promise<RegisterResponse>;
|
|
22
|
-
disconnect(deviceId: string): Promise<void>;
|
|
23
|
-
heartbeat(deviceId: string): Promise<void>;
|
|
24
|
-
pollCommand(deviceId: string, signal?: AbortSignal): Promise<Record<string, unknown> | null>;
|
|
25
|
-
sendResult(requestId: string, result: Record<string, unknown>): Promise<void>;
|
|
26
6
|
readPage(params: {
|
|
27
7
|
url: string;
|
|
28
8
|
screens?: number;
|
|
@@ -53,4 +33,3 @@ export interface SearchResult {
|
|
|
53
33
|
position: number;
|
|
54
34
|
}>;
|
|
55
35
|
}
|
|
56
|
-
export {};
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { logger } from './logger.js';
|
|
2
1
|
export class ServerClient {
|
|
3
2
|
serverUrl;
|
|
4
3
|
apiKey;
|
|
@@ -30,69 +29,6 @@ export class ServerClient {
|
|
|
30
29
|
clearTimeout(timer);
|
|
31
30
|
}
|
|
32
31
|
}
|
|
33
|
-
async connect(params) {
|
|
34
|
-
const res = await this.request('/api/dokos/connect', {
|
|
35
|
-
method: 'POST',
|
|
36
|
-
body: JSON.stringify(params),
|
|
37
|
-
});
|
|
38
|
-
if (!res.ok) {
|
|
39
|
-
const body = await res.json().catch(() => ({}));
|
|
40
|
-
throw new Error(`Registration failed (${res.status}): ${body.error || res.statusText}`);
|
|
41
|
-
}
|
|
42
|
-
return res.json();
|
|
43
|
-
}
|
|
44
|
-
async disconnect(deviceId) {
|
|
45
|
-
try {
|
|
46
|
-
await this.request('/api/dokos/disconnect', {
|
|
47
|
-
method: 'POST',
|
|
48
|
-
body: JSON.stringify({ deviceId }),
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
catch { /* best effort */ }
|
|
52
|
-
}
|
|
53
|
-
async heartbeat(deviceId) {
|
|
54
|
-
const res = await this.request('/api/devices/heartbeat', {
|
|
55
|
-
method: 'POST',
|
|
56
|
-
body: JSON.stringify({ deviceId }),
|
|
57
|
-
});
|
|
58
|
-
if (!res.ok) {
|
|
59
|
-
logger.warn(`Heartbeat failed: ${res.status}`);
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
async pollCommand(deviceId, signal) {
|
|
63
|
-
const res = await this.request(`/api/commands/poll?deviceId=${encodeURIComponent(deviceId)}`, {
|
|
64
|
-
method: 'GET',
|
|
65
|
-
signal,
|
|
66
|
-
timeoutMs: 90_000,
|
|
67
|
-
});
|
|
68
|
-
if (res.status === 204)
|
|
69
|
-
return null;
|
|
70
|
-
if (!res.ok) {
|
|
71
|
-
throw new Error(`Poll failed: ${res.status}`);
|
|
72
|
-
}
|
|
73
|
-
return res.json();
|
|
74
|
-
}
|
|
75
|
-
async sendResult(requestId, result) {
|
|
76
|
-
const maxRetries = 3;
|
|
77
|
-
for (let attempt = 0; attempt < maxRetries; attempt++) {
|
|
78
|
-
try {
|
|
79
|
-
const res = await this.request(`/api/commands/${requestId}/result`, {
|
|
80
|
-
method: 'POST',
|
|
81
|
-
body: JSON.stringify(result),
|
|
82
|
-
});
|
|
83
|
-
if (res.ok)
|
|
84
|
-
return;
|
|
85
|
-
logger.warn(`sendResult HTTP error: ${res.status}, attempt ${attempt + 1}`);
|
|
86
|
-
}
|
|
87
|
-
catch (error) {
|
|
88
|
-
logger.error(`sendResult failed, attempt ${attempt + 1}`, error);
|
|
89
|
-
}
|
|
90
|
-
if (attempt < maxRetries - 1) {
|
|
91
|
-
await new Promise(r => setTimeout(r, 300 * (attempt + 1)));
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
logger.error(`sendResult failed after all retries for ${requestId}`);
|
|
95
|
-
}
|
|
96
32
|
async readPage(params) {
|
|
97
33
|
const res = await this.request('/api/tools/read', {
|
|
98
34
|
method: 'POST',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-client.js","sourceRoot":"","sources":["../../src/server-client.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"server-client.js","sourceRoot":"","sources":["../../src/server-client.ts"],"names":[],"mappings":"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"}
|