@kraken-e2e/cli 0.1.0 → 2.0.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/devices.d.ts +11 -0
- package/dist/commands/devices.d.ts.map +1 -0
- package/dist/commands/devices.js +21 -0
- package/dist/commands/devices.js.map +1 -0
- package/dist/devices-report.d.ts +15 -0
- package/dist/devices-report.d.ts.map +1 -0
- package/dist/devices-report.js +66 -0
- package/dist/devices-report.js.map +1 -0
- package/dist/serve.d.ts.map +1 -1
- package/dist/serve.js +66 -15
- package/dist/serve.js.map +1 -1
- package/package.json +9 -9
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Command } from '@oclif/core';
|
|
2
|
+
export default class Devices extends Command {
|
|
3
|
+
static description: string;
|
|
4
|
+
static examples: string[];
|
|
5
|
+
static enableJsonFlag: boolean;
|
|
6
|
+
static flags: {
|
|
7
|
+
cwd: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
|
|
8
|
+
};
|
|
9
|
+
run(): Promise<unknown>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=devices.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devices.d.ts","sourceRoot":"","sources":["../../src/commands/devices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAI7C,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;IAC1C,OAAgB,WAAW,SACwH;IAEnJ,OAAgB,QAAQ,WAAqE;IAE7F,OAAgB,cAAc,UAAQ;IAEtC,OAAgB,KAAK;;MAEnB;IAEI,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC;CAU9B"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Command, Flags } from '@oclif/core';
|
|
2
|
+
import { buildDevicesReport, renderDevicesText } from '../devices-report.js';
|
|
3
|
+
export default class Devices extends Command {
|
|
4
|
+
static description = 'List the devices you can already drive — booted simulators, running emulators, connected devices, browsers — with ready-to-paste actor config.';
|
|
5
|
+
static examples = ['<%= config.bin %> devices', '<%= config.bin %> devices --json'];
|
|
6
|
+
static enableJsonFlag = true;
|
|
7
|
+
static flags = {
|
|
8
|
+
cwd: Flags.string({ description: 'project directory (defaults to the current one)' }),
|
|
9
|
+
};
|
|
10
|
+
async run() {
|
|
11
|
+
const { flags } = await this.parse(Devices);
|
|
12
|
+
const report = await buildDevicesReport({
|
|
13
|
+
...(flags.cwd !== undefined ? { cwd: flags.cwd } : {}),
|
|
14
|
+
});
|
|
15
|
+
if (!this.jsonEnabled()) {
|
|
16
|
+
this.log(renderDevicesText(report));
|
|
17
|
+
}
|
|
18
|
+
return report;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=devices.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devices.js","sourceRoot":"","sources":["../../src/commands/devices.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAE7C,OAAO,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAE7E,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,OAAO;IAC1C,MAAM,CAAU,WAAW,GACzB,gJAAgJ,CAAC;IAEnJ,MAAM,CAAU,QAAQ,GAAG,CAAC,2BAA2B,EAAE,kCAAkC,CAAC,CAAC;IAE7F,MAAM,CAAU,cAAc,GAAG,IAAI,CAAC;IAEtC,MAAM,CAAU,KAAK,GAAG;QACtB,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,iDAAiD,EAAE,CAAC;KACtF,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC;YACtC,GAAG,CAAC,KAAK,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvD,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC;QACtC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { DeviceTarget } from '@kraken-e2e/contracts';
|
|
2
|
+
export interface DevicesReport {
|
|
3
|
+
readonly drivers: ReadonlyArray<{
|
|
4
|
+
readonly driverId: string;
|
|
5
|
+
readonly platformLabel: string;
|
|
6
|
+
readonly targets: readonly DeviceTarget[];
|
|
7
|
+
}>;
|
|
8
|
+
/** Drivers that are registered but expose no enumeration (older contract). */
|
|
9
|
+
readonly withoutEnumeration: readonly string[];
|
|
10
|
+
}
|
|
11
|
+
export declare function buildDevicesReport(options: {
|
|
12
|
+
cwd?: string;
|
|
13
|
+
}): Promise<DevicesReport>;
|
|
14
|
+
export declare function renderDevicesText(report: DevicesReport): string;
|
|
15
|
+
//# sourceMappingURL=devices-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devices-report.d.ts","sourceRoot":"","sources":["../src/devices-report.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAQ1D,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;QAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;QAC1B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;QAC/B,QAAQ,CAAC,OAAO,EAAE,SAAS,YAAY,EAAE,CAAC;KAC3C,CAAC,CAAC;IACH,8EAA8E;IAC9E,QAAQ,CAAC,kBAAkB,EAAE,SAAS,MAAM,EAAE,CAAC;CAChD;AAED,wBAAsB,kBAAkB,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,aAAa,CAAC,CAyB1F;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAqC/D"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `kraken devices` (contract 2.1): show what you can ALREADY drive — booted
|
|
3
|
+
* simulators, running emulators, connected devices, installed browsers —
|
|
4
|
+
* with ready-to-paste actor config for each. Use what you have; provision
|
|
5
|
+
* only when you have nothing.
|
|
6
|
+
*/
|
|
7
|
+
import { loadConfig } from '@kraken-e2e/config';
|
|
8
|
+
import { createHostContext, DriverRegistry, systemHostProbe, } from '@kraken-e2e/core';
|
|
9
|
+
export async function buildDevicesReport(options) {
|
|
10
|
+
const host = systemHostProbe.detect();
|
|
11
|
+
const config = await loadConfig({ ...(options.cwd !== undefined ? { cwd: options.cwd } : {}) });
|
|
12
|
+
const registry = await DriverRegistry.create({
|
|
13
|
+
registrations: config.drivers,
|
|
14
|
+
host,
|
|
15
|
+
projectRoot: config.projectRoot,
|
|
16
|
+
});
|
|
17
|
+
const drivers = [];
|
|
18
|
+
const withoutEnumeration = [];
|
|
19
|
+
const hostContext = createHostContext(host, config.projectRoot);
|
|
20
|
+
for (const driver of registry.readyDrivers()) {
|
|
21
|
+
if (typeof driver.listTargets !== 'function') {
|
|
22
|
+
withoutEnumeration.push(driver.manifest.id);
|
|
23
|
+
continue;
|
|
24
|
+
}
|
|
25
|
+
drivers.push({
|
|
26
|
+
driverId: driver.manifest.id,
|
|
27
|
+
platformLabel: driver.manifest.platformLabel,
|
|
28
|
+
targets: await driver.listTargets(hostContext),
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
return { drivers, withoutEnumeration };
|
|
32
|
+
}
|
|
33
|
+
export function renderDevicesText(report) {
|
|
34
|
+
const lines = [];
|
|
35
|
+
let running = 0;
|
|
36
|
+
let available = 0;
|
|
37
|
+
for (const entry of report.drivers) {
|
|
38
|
+
lines.push(`${entry.driverId} — ${entry.platformLabel}`);
|
|
39
|
+
if (entry.targets.length === 0) {
|
|
40
|
+
lines.push(' (no targets found)');
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
for (const target of entry.targets) {
|
|
44
|
+
const mark = target.state === 'running' ? '●' : '○';
|
|
45
|
+
if (target.state === 'running')
|
|
46
|
+
running += 1;
|
|
47
|
+
else
|
|
48
|
+
available += 1;
|
|
49
|
+
const detail = target.detail ? ` — ${target.detail}` : '';
|
|
50
|
+
lines.push(` ${mark} ${target.name} [${target.state}]${detail}`);
|
|
51
|
+
if (target.actorConfig) {
|
|
52
|
+
lines.push(` actor config: ${JSON.stringify(target.actorConfig)}`);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
lines.push('');
|
|
56
|
+
}
|
|
57
|
+
for (const id of report.withoutEnumeration) {
|
|
58
|
+
lines.push(`${id} — (driver does not support device enumeration)`);
|
|
59
|
+
}
|
|
60
|
+
lines.push(`${running} running (● reuse these — nothing to boot), ${available} available (○ provisioned on demand)`);
|
|
61
|
+
if (running > 0) {
|
|
62
|
+
lines.push("Tip: paste a ● target's actor config into kraken.config.ts to reuse what is already up.");
|
|
63
|
+
}
|
|
64
|
+
return lines.join('\n');
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=devices-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devices-report.js","sourceRoot":"","sources":["../src/devices-report.ts"],"names":[],"mappings":"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"}
|
package/dist/serve.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"AA6BA,MAAM,WAAW,YAAY;IAC3B,+CAA+C;IAC/C,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAyFD,wBAAsB,UAAU,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAwI5E"}
|
package/dist/serve.js
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* GET /api/runs/:id/artifacts/<p> → artifact files (traversal-safe)
|
|
13
13
|
* WS /api/runs/:id/live → replay + live tail of events
|
|
14
14
|
*/
|
|
15
|
-
import { existsSync, readdirSync, readFileSync, statSync, watch } from 'node:fs';
|
|
15
|
+
import { closeSync, existsSync, openSync, readdirSync, readFileSync, readSync, statSync, watch, } from 'node:fs';
|
|
16
16
|
import { createServer } from 'node:http';
|
|
17
17
|
import { join, normalize, resolve, sep } from 'node:path';
|
|
18
18
|
import { WebSocketServer } from 'ws';
|
|
@@ -25,13 +25,33 @@ function readEvents(runDir) {
|
|
|
25
25
|
.filter((line) => line.trim().length > 0)
|
|
26
26
|
.map((line) => JSON.parse(line));
|
|
27
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* Summaries are cached by the events file's (mtime, size): a finished run's
|
|
30
|
+
* log never changes, so its full parse happens once — the viewer's 3s /api/runs
|
|
31
|
+
* poll re-parses only runs that are actively being written (was: re-parse
|
|
32
|
+
* EVERY run's whole log on every poll).
|
|
33
|
+
*/
|
|
34
|
+
const summaryCache = new Map();
|
|
28
35
|
function summarize(runsDir, id) {
|
|
29
36
|
const dir = join(runsDir, id);
|
|
37
|
+
const eventsPath = join(dir, 'events.jsonl');
|
|
38
|
+
const dirMtime = statSync(dir).mtimeMs;
|
|
39
|
+
let key;
|
|
40
|
+
try {
|
|
41
|
+
const stat = statSync(eventsPath);
|
|
42
|
+
key = `${stat.mtimeMs}:${stat.size}`;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
key = `none:${dirMtime}`;
|
|
46
|
+
}
|
|
47
|
+
const cached = summaryCache.get(id);
|
|
48
|
+
if (cached && cached.key === key)
|
|
49
|
+
return cached.summary;
|
|
30
50
|
const events = readEvents(dir);
|
|
31
51
|
const last = [...events].reverse().find((event) => event['type'] === 'runFinished');
|
|
32
|
-
|
|
52
|
+
const summary = {
|
|
33
53
|
id,
|
|
34
|
-
modifiedAt:
|
|
54
|
+
modifiedAt: dirMtime,
|
|
35
55
|
status: last
|
|
36
56
|
? last['status']
|
|
37
57
|
: events.length > 0
|
|
@@ -39,6 +59,8 @@ function summarize(runsDir, id) {
|
|
|
39
59
|
: 'unknown',
|
|
40
60
|
events: events.length,
|
|
41
61
|
};
|
|
62
|
+
summaryCache.set(id, { key, summary });
|
|
63
|
+
return summary;
|
|
42
64
|
}
|
|
43
65
|
const VIEWER_HTML = `<!DOCTYPE html>
|
|
44
66
|
<html lang="en"><head><meta charset="utf-8"><title>Kraken serve</title>
|
|
@@ -134,23 +156,52 @@ export async function startServe(options) {
|
|
|
134
156
|
socket.close(4004, 'unknown endpoint');
|
|
135
157
|
return;
|
|
136
158
|
}
|
|
137
|
-
|
|
138
|
-
|
|
159
|
+
// Containment: the segment can't contain '/', but `..` alone would escape
|
|
160
|
+
// (join(runsDir, '..', …)). Same guard the artifact HTTP route enforces.
|
|
161
|
+
const dir = resolve(runsDir, match[1]);
|
|
162
|
+
if (!dir.startsWith(resolve(runsDir) + sep)) {
|
|
163
|
+
socket.close(4004, 'invalid run id');
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const eventsPath = join(dir, 'events.jsonl');
|
|
167
|
+
// BYTE offset + leftover buffer: read ONLY the appended tail each tick
|
|
168
|
+
// (was: re-read + re-slice the ENTIRE growing log on every poll/watch).
|
|
169
|
+
let byteOffset = 0;
|
|
170
|
+
let leftover = Buffer.alloc(0);
|
|
139
171
|
const push = () => {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
172
|
+
let size;
|
|
173
|
+
try {
|
|
174
|
+
size = statSync(eventsPath).size;
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
return; // events.jsonl not written yet
|
|
178
|
+
}
|
|
179
|
+
if (size <= byteOffset)
|
|
144
180
|
return;
|
|
145
|
-
const
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
181
|
+
const fd = openSync(eventsPath, 'r');
|
|
182
|
+
try {
|
|
183
|
+
const chunk = Buffer.allocUnsafe(size - byteOffset);
|
|
184
|
+
const read = readSync(fd, chunk, 0, chunk.length, byteOffset);
|
|
185
|
+
byteOffset += read;
|
|
186
|
+
let data = leftover.length > 0
|
|
187
|
+
? Buffer.concat([leftover, chunk.subarray(0, read)])
|
|
188
|
+
: chunk.subarray(0, read);
|
|
189
|
+
let newline = data.indexOf(0x0a);
|
|
190
|
+
while (newline !== -1) {
|
|
191
|
+
const line = data.subarray(0, newline).toString('utf8').trim();
|
|
192
|
+
if (line.length > 0)
|
|
193
|
+
socket.send(line);
|
|
194
|
+
data = data.subarray(newline + 1);
|
|
195
|
+
newline = data.indexOf(0x0a);
|
|
196
|
+
}
|
|
197
|
+
// keep bytes past the last newline (a partially-written trailing event)
|
|
198
|
+
leftover = Buffer.from(data);
|
|
199
|
+
}
|
|
200
|
+
finally {
|
|
201
|
+
closeSync(fd);
|
|
150
202
|
}
|
|
151
203
|
};
|
|
152
204
|
push();
|
|
153
|
-
const dir = join(runsDir, match[1]);
|
|
154
205
|
const watcher = existsSync(dir) ? watch(dir, () => push()) : undefined;
|
|
155
206
|
// fs.watch coalesces; a slow poll catches missed notifications.
|
|
156
207
|
const poll = setInterval(push, 500);
|
package/dist/serve.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,
|
|
1
|
+
{"version":3,"file":"serve.js","sourceRoot":"","sources":["../src/serve.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kraken-e2e/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"description": "The kraken CLI (oclif): run, doctor, init, plugins — the composition layer wiring all packages together",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -24,14 +24,14 @@
|
|
|
24
24
|
"jiti": "^2.7.0",
|
|
25
25
|
"tinyglobby": "^0.2.0",
|
|
26
26
|
"ws": "^8.18.0",
|
|
27
|
-
"@kraken-e2e/contracts": "0.
|
|
28
|
-
"@kraken-e2e/
|
|
29
|
-
"@kraken-e2e/
|
|
30
|
-
"@kraken-e2e/doctor": "0.
|
|
31
|
-
"@kraken-e2e/
|
|
32
|
-
"@kraken-e2e/
|
|
33
|
-
"@kraken-e2e/
|
|
34
|
-
"@kraken-e2e/
|
|
27
|
+
"@kraken-e2e/contracts": "2.0.0",
|
|
28
|
+
"@kraken-e2e/config": "2.0.0",
|
|
29
|
+
"@kraken-e2e/gherkin": "2.0.0",
|
|
30
|
+
"@kraken-e2e/doctor": "2.0.0",
|
|
31
|
+
"@kraken-e2e/signaling": "2.0.0",
|
|
32
|
+
"@kraken-e2e/tui": "2.0.0",
|
|
33
|
+
"@kraken-e2e/reporters": "2.0.0",
|
|
34
|
+
"@kraken-e2e/core": "2.0.0"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@types/node": "^22.15.0",
|