@veolab/discoverylab 1.3.4 → 1.4.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/.claude-plugin/marketplace.json +1 -1
- package/.claude-plugin/plugin.json +1 -1
- package/dist/chunk-34KRJWZL.js +477 -0
- package/dist/chunk-4VNS5WPM.js +42 -0
- package/dist/{chunk-FIL7IWEL.js → chunk-DGXAP477.js} +1 -1
- package/dist/{chunk-HGWEHWKJ.js → chunk-DKAX5RCX.js} +1 -1
- package/dist/{chunk-7EDIUVIO.js → chunk-EU63HPKT.js} +1 -1
- package/dist/chunk-QMUEC6B5.js +288 -0
- package/dist/{chunk-FNUN7EPB.js → chunk-RCY26WEK.js} +2 -2
- package/dist/{chunk-ZLHIHMSL.js → chunk-SWZIBO2R.js} +1 -1
- package/dist/chunk-VYYAP5G5.js +265 -0
- package/dist/{chunk-VVIOB362.js → chunk-XAMA3JJG.js} +18 -1
- package/dist/{chunk-BE7BFMYC.js → chunk-XWBFSSNB.js} +10224 -393
- package/dist/{chunk-AHVBE25Y.js → chunk-YNLUOZSZ.js} +274 -667
- package/dist/cli.js +33 -31
- package/dist/{db-6WLEVKUV.js → db-745LC5YC.js} +2 -2
- package/dist/document-AE4XI2CP.js +104 -0
- package/dist/{esvp-KVOWYW6G.js → esvp-4LIAU76K.js} +3 -3
- package/dist/{esvp-mobile-GZ5EMYPG.js → esvp-mobile-FKFHDS5Q.js} +4 -4
- package/dist/frames-RCNLSDD6.js +24 -0
- package/dist/{gridCompositor-M3K3LCLZ.js → gridCompositor-VUWBZXYL.js} +262 -3
- package/dist/index.d.ts +32 -0
- package/dist/index.html +1197 -9
- package/dist/index.js +15 -10
- package/dist/notion-api-OXSWOJPZ.js +190 -0
- package/dist/{ocr-QDYNCSPE.js → ocr-FXRLEP66.js} +1 -1
- package/dist/{playwright-VZ7PXDC5.js → playwright-GYKUH34L.js} +3 -3
- package/dist/renderer-D22GCMMD.js +17 -0
- package/dist/{server-6N3KIEGP.js → server-NTT2XGCC.js} +1 -1
- package/dist/server-TKYRIYJ6.js +24 -0
- package/dist/{setup-2SQC5UHJ.js → setup-O6WQQAGP.js} +3 -3
- package/dist/templates/bundle/bundle.js +4 -2
- package/dist/{tools-YGM5HRIB.js → tools-FVVWKEGC.js} +15 -7
- package/package.json +2 -2
- package/skills/knowledge-brain/SKILL.md +64 -0
- package/dist/chunk-MLKGABMK.js +0 -9
- package/dist/server-QKZXPZRC.js +0 -22
package/dist/cli.js
CHANGED
|
@@ -5,7 +5,7 @@ import {
|
|
|
5
5
|
import {
|
|
6
6
|
APP_VERSION
|
|
7
7
|
} from "./chunk-6EGBXRDK.js";
|
|
8
|
-
import "./chunk-
|
|
8
|
+
import "./chunk-4VNS5WPM.js";
|
|
9
9
|
|
|
10
10
|
// src/cli.ts
|
|
11
11
|
import { Command } from "commander";
|
|
@@ -57,7 +57,7 @@ async function withESVPCli(action) {
|
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
async function getESVPBaseResult(serverUrl) {
|
|
60
|
-
const { getESVPConnection } = await import("./esvp-
|
|
60
|
+
const { getESVPConnection } = await import("./esvp-4LIAU76K.js");
|
|
61
61
|
const connection = await getESVPConnection(serverUrl);
|
|
62
62
|
return {
|
|
63
63
|
serverUrl: connection.serverUrl,
|
|
@@ -72,7 +72,7 @@ function executorToPlatform(executor) {
|
|
|
72
72
|
var esvp = program.command("esvp").description("Access the public ESVP protocol and runtime from the CLI");
|
|
73
73
|
esvp.command("status").description("Check the configured ESVP server health").option("-s, --server <url>", "ESVP base URL").action(async (options) => {
|
|
74
74
|
await withESVPCli(async () => {
|
|
75
|
-
const { getESVPHealth } = await import("./esvp-
|
|
75
|
+
const { getESVPHealth } = await import("./esvp-4LIAU76K.js");
|
|
76
76
|
return {
|
|
77
77
|
...await getESVPBaseResult(options.server),
|
|
78
78
|
health: await getESVPHealth(options.server)
|
|
@@ -81,7 +81,7 @@ esvp.command("status").description("Check the configured ESVP server health").op
|
|
|
81
81
|
});
|
|
82
82
|
esvp.command("devices").description("List ESVP-visible devices").option("-s, --server <url>", "ESVP base URL").option("-p, --platform <platform>", "adb | ios-sim | maestro-ios | all", "all").action(async (options) => {
|
|
83
83
|
await withESVPCli(async () => {
|
|
84
|
-
const { listESVPDevices } = await import("./esvp-
|
|
84
|
+
const { listESVPDevices } = await import("./esvp-4LIAU76K.js");
|
|
85
85
|
return {
|
|
86
86
|
...await getESVPBaseResult(options.server),
|
|
87
87
|
devices: await listESVPDevices(options.platform, options.server)
|
|
@@ -90,7 +90,7 @@ esvp.command("devices").description("List ESVP-visible devices").option("-s, --s
|
|
|
90
90
|
});
|
|
91
91
|
esvp.command("sessions").description("List public ESVP sessions").option("-s, --server <url>", "ESVP base URL").action(async (options) => {
|
|
92
92
|
await withESVPCli(async () => {
|
|
93
|
-
const { listESVPSessions } = await import("./esvp-
|
|
93
|
+
const { listESVPSessions } = await import("./esvp-4LIAU76K.js");
|
|
94
94
|
return {
|
|
95
95
|
...await getESVPBaseResult(options.server),
|
|
96
96
|
...await listESVPSessions(options.server)
|
|
@@ -99,7 +99,7 @@ esvp.command("sessions").description("List public ESVP sessions").option("-s, --
|
|
|
99
99
|
});
|
|
100
100
|
esvp.command("create").description("Create a new ESVP session").requiredOption("-e, --executor <executor>", "fake | adb | ios-sim | maestro-ios").option("-s, --server <url>", "ESVP base URL").option("-d, --device-id <id>", "Device or simulator ID").option("--meta-json <json>", "Session metadata as JSON").option("--meta-file <path>", "Path to session metadata JSON").option("--crash-clip-json <json>", "Crash clip config as JSON").option("--crash-clip-file <path>", "Path to crash clip config JSON").option("--with-network", "Auto-configure the default App Lab external-proxy profile after creating the session").action(async (options) => {
|
|
101
101
|
await withESVPCli(async () => {
|
|
102
|
-
const { createESVPSession, configureESVPNetwork } = await import("./esvp-
|
|
102
|
+
const { createESVPSession, configureESVPNetwork } = await import("./esvp-4LIAU76K.js");
|
|
103
103
|
const meta = await readJsonSource(options.metaJson, options.metaFile, "meta");
|
|
104
104
|
const crashClip = await readJsonSource(options.crashClipJson, options.crashClipFile, "crash clip");
|
|
105
105
|
const createResult = await createESVPSession(
|
|
@@ -142,7 +142,7 @@ esvp.command("create").description("Create a new ESVP session").requiredOption("
|
|
|
142
142
|
});
|
|
143
143
|
esvp.command("get <sessionId>").description("Get a public ESVP session summary").option("-s, --server <url>", "ESVP base URL").action(async (sessionId, options) => {
|
|
144
144
|
await withESVPCli(async () => {
|
|
145
|
-
const { getESVPSession } = await import("./esvp-
|
|
145
|
+
const { getESVPSession } = await import("./esvp-4LIAU76K.js");
|
|
146
146
|
return {
|
|
147
147
|
...await getESVPBaseResult(options.server),
|
|
148
148
|
...await getESVPSession(sessionId, options.server)
|
|
@@ -151,7 +151,7 @@ esvp.command("get <sessionId>").description("Get a public ESVP session summary")
|
|
|
151
151
|
});
|
|
152
152
|
esvp.command("inspect <sessionId>").description("Inspect a session and optionally load transcript and artifacts").option("-s, --server <url>", "ESVP base URL").option("--transcript", "Include transcript").option("--artifacts", "Include artifacts").action(async (sessionId, options) => {
|
|
153
153
|
await withESVPCli(async () => {
|
|
154
|
-
const { inspectESVPSession } = await import("./esvp-
|
|
154
|
+
const { inspectESVPSession } = await import("./esvp-4LIAU76K.js");
|
|
155
155
|
return {
|
|
156
156
|
...await getESVPBaseResult(options.server),
|
|
157
157
|
...await inspectESVPSession(
|
|
@@ -167,7 +167,7 @@ esvp.command("inspect <sessionId>").description("Inspect a session and optionall
|
|
|
167
167
|
});
|
|
168
168
|
esvp.command("transcript <sessionId>").description("Fetch the canonical session transcript").option("-s, --server <url>", "ESVP base URL").action(async (sessionId, options) => {
|
|
169
169
|
await withESVPCli(async () => {
|
|
170
|
-
const { getESVPTranscript } = await import("./esvp-
|
|
170
|
+
const { getESVPTranscript } = await import("./esvp-4LIAU76K.js");
|
|
171
171
|
return {
|
|
172
172
|
...await getESVPBaseResult(options.server),
|
|
173
173
|
sessionId,
|
|
@@ -177,7 +177,7 @@ esvp.command("transcript <sessionId>").description("Fetch the canonical session
|
|
|
177
177
|
});
|
|
178
178
|
esvp.command("artifacts <sessionId>").description("List session artifacts").option("-s, --server <url>", "ESVP base URL").action(async (sessionId, options) => {
|
|
179
179
|
await withESVPCli(async () => {
|
|
180
|
-
const { listESVPArtifacts } = await import("./esvp-
|
|
180
|
+
const { listESVPArtifacts } = await import("./esvp-4LIAU76K.js");
|
|
181
181
|
return {
|
|
182
182
|
...await getESVPBaseResult(options.server),
|
|
183
183
|
sessionId,
|
|
@@ -187,13 +187,13 @@ esvp.command("artifacts <sessionId>").description("List session artifacts").opti
|
|
|
187
187
|
});
|
|
188
188
|
esvp.command("artifact <sessionId> <artifactPath>").description("Read a public artifact payload").option("-s, --server <url>", "ESVP base URL").action(async (sessionId, artifactPath, options) => {
|
|
189
189
|
await withESVPCli(async () => {
|
|
190
|
-
const { getESVPArtifactContent } = await import("./esvp-
|
|
190
|
+
const { getESVPArtifactContent } = await import("./esvp-4LIAU76K.js");
|
|
191
191
|
return await getESVPArtifactContent(sessionId, artifactPath, options.server);
|
|
192
192
|
});
|
|
193
193
|
});
|
|
194
194
|
esvp.command("actions <sessionId>").description("Run public ESVP actions inside a session").option("-s, --server <url>", "ESVP base URL").option("--actions-json <json>", "JSON array of ESVP actions").option("--actions-file <path>", "Path to a JSON file with ESVP actions").option("--finish", "Finish the session after actions").option("--capture-logcat", "Capture logcat on finish when supported").option("--checkpoint-after-each", "Set checkpointAfter on every action").option("--with-network", "Auto-configure the default App Lab external-proxy profile before running actions if not already configured").action(async (sessionId, options) => {
|
|
195
195
|
await withESVPCli(async () => {
|
|
196
|
-
const { runESVPActions, getESVPSessionNetwork, configureESVPNetwork } = await import("./esvp-
|
|
196
|
+
const { runESVPActions, getESVPSessionNetwork, configureESVPNetwork } = await import("./esvp-4LIAU76K.js");
|
|
197
197
|
const actions = await readJsonSource(options.actionsJson, options.actionsFile, "actions");
|
|
198
198
|
if (!Array.isArray(actions) || actions.length === 0) {
|
|
199
199
|
failCli("Provide --actions-json or --actions-file with a non-empty array of ESVP actions.");
|
|
@@ -239,7 +239,7 @@ esvp.command("actions <sessionId>").description("Run public ESVP actions inside
|
|
|
239
239
|
});
|
|
240
240
|
esvp.command("checkpoint <sessionId>").description("Capture an ESVP checkpoint").option("-s, --server <url>", "ESVP base URL").option("-l, --label <label>", "Checkpoint label").action(async (sessionId, options) => {
|
|
241
241
|
await withESVPCli(async () => {
|
|
242
|
-
const { captureESVPCheckpoint } = await import("./esvp-
|
|
242
|
+
const { captureESVPCheckpoint } = await import("./esvp-4LIAU76K.js");
|
|
243
243
|
return {
|
|
244
244
|
...await getESVPBaseResult(options.server),
|
|
245
245
|
...await captureESVPCheckpoint(
|
|
@@ -254,7 +254,7 @@ esvp.command("checkpoint <sessionId>").description("Capture an ESVP checkpoint")
|
|
|
254
254
|
});
|
|
255
255
|
esvp.command("finish <sessionId>").description("Finish an ESVP session").option("-s, --server <url>", "ESVP base URL").option("--capture-logcat", "Capture logcat on finish when supported").action(async (sessionId, options) => {
|
|
256
256
|
await withESVPCli(async () => {
|
|
257
|
-
const { finishESVPSession } = await import("./esvp-
|
|
257
|
+
const { finishESVPSession } = await import("./esvp-4LIAU76K.js");
|
|
258
258
|
return {
|
|
259
259
|
...await getESVPBaseResult(options.server),
|
|
260
260
|
...await finishESVPSession(
|
|
@@ -269,7 +269,7 @@ esvp.command("finish <sessionId>").description("Finish an ESVP session").option(
|
|
|
269
269
|
});
|
|
270
270
|
esvp.command("preflight <sessionId>").description("Run preflight/bootstrap rules on an ESVP session").option("-s, --server <url>", "ESVP base URL").option("--policy <policy>", "Preflight policy name (e.g. fresh_install)").option("--app-id <appId>", "Target app ID").option("--json <json>", "Preflight config as JSON string").option("--file <path>", "Path to preflight config JSON file").action(async (sessionId, options) => {
|
|
271
271
|
await withESVPCli(async () => {
|
|
272
|
-
const { runESVPPreflight } = await import("./esvp-
|
|
272
|
+
const { runESVPPreflight } = await import("./esvp-4LIAU76K.js");
|
|
273
273
|
const fromSource = await readJsonSource(options.json, options.file, "preflight config");
|
|
274
274
|
const config = {
|
|
275
275
|
...typeof fromSource === "object" && fromSource ? fromSource : {},
|
|
@@ -284,7 +284,7 @@ esvp.command("preflight <sessionId>").description("Run preflight/bootstrap rules
|
|
|
284
284
|
});
|
|
285
285
|
esvp.command("replay-run <sessionId>").description("Replay a session to a new ESVP session").option("-s, --server <url>", "ESVP base URL").option("-e, --executor <executor>", "fake | adb | ios-sim | maestro-ios").option("-d, --device-id <id>", "Replay target device ID").option("--capture-logcat", "Capture logcat on finish when supported").option("--meta-json <json>", "Replay metadata as JSON").option("--meta-file <path>", "Path to replay metadata JSON").action(async (sessionId, options) => {
|
|
286
286
|
await withESVPCli(async () => {
|
|
287
|
-
const { replayESVPSession, getESVPReplayConsistency } = await import("./esvp-
|
|
287
|
+
const { replayESVPSession, getESVPReplayConsistency } = await import("./esvp-4LIAU76K.js");
|
|
288
288
|
const meta = await readJsonSource(options.metaJson, options.metaFile, "replay meta");
|
|
289
289
|
const replay = await replayESVPSession(
|
|
290
290
|
sessionId,
|
|
@@ -307,7 +307,7 @@ esvp.command("replay-run <sessionId>").description("Replay a session to a new ES
|
|
|
307
307
|
});
|
|
308
308
|
esvp.command("replay-validate <sessionId>").description("Validate whether a session supports public replay").option("-s, --server <url>", "ESVP base URL").action(async (sessionId, options) => {
|
|
309
309
|
await withESVPCli(async () => {
|
|
310
|
-
const { validateESVPReplay } = await import("./esvp-
|
|
310
|
+
const { validateESVPReplay } = await import("./esvp-4LIAU76K.js");
|
|
311
311
|
return {
|
|
312
312
|
...await getESVPBaseResult(options.server),
|
|
313
313
|
...await validateESVPReplay(sessionId, options.server)
|
|
@@ -316,7 +316,7 @@ esvp.command("replay-validate <sessionId>").description("Validate whether a sess
|
|
|
316
316
|
});
|
|
317
317
|
esvp.command("replay-consistency <sessionId>").description("Inspect replay consistency for a replay session").option("-s, --server <url>", "ESVP base URL").action(async (sessionId, options) => {
|
|
318
318
|
await withESVPCli(async () => {
|
|
319
|
-
const { getESVPReplayConsistency } = await import("./esvp-
|
|
319
|
+
const { getESVPReplayConsistency } = await import("./esvp-4LIAU76K.js");
|
|
320
320
|
return {
|
|
321
321
|
...await getESVPBaseResult(options.server),
|
|
322
322
|
...await getESVPReplayConsistency(sessionId, options.server)
|
|
@@ -325,7 +325,7 @@ esvp.command("replay-consistency <sessionId>").description("Inspect replay consi
|
|
|
325
325
|
});
|
|
326
326
|
esvp.command("network <sessionId>").description("Read the public network state for a session").option("-s, --server <url>", "ESVP base URL").action(async (sessionId, options) => {
|
|
327
327
|
await withESVPCli(async () => {
|
|
328
|
-
const { getESVPSessionNetwork } = await import("./esvp-
|
|
328
|
+
const { getESVPSessionNetwork } = await import("./esvp-4LIAU76K.js");
|
|
329
329
|
return {
|
|
330
330
|
...await getESVPBaseResult(options.server),
|
|
331
331
|
...await getESVPSessionNetwork(sessionId, options.server)
|
|
@@ -334,7 +334,7 @@ esvp.command("network <sessionId>").description("Read the public network state f
|
|
|
334
334
|
});
|
|
335
335
|
esvp.command("network-configure <sessionId>").description("Apply a public ESVP network profile").option("-s, --server <url>", "ESVP base URL").option("--json <json>", "Raw network profile JSON").option("--file <path>", "Path to network profile JSON").option("--profile <name>", "Profile name").option("--label <label>", "Profile label").option("--connectivity <state>", "online | offline | reset").action(async (sessionId, options) => {
|
|
336
336
|
await withESVPCli(async () => {
|
|
337
|
-
const { configureESVPNetwork } = await import("./esvp-
|
|
337
|
+
const { configureESVPNetwork } = await import("./esvp-4LIAU76K.js");
|
|
338
338
|
const payload = await readJsonSource(options.json, options.file, "network profile") || {};
|
|
339
339
|
const merged = {
|
|
340
340
|
...typeof payload === "object" && payload ? payload : {},
|
|
@@ -350,7 +350,7 @@ esvp.command("network-configure <sessionId>").description("Apply a public ESVP n
|
|
|
350
350
|
});
|
|
351
351
|
esvp.command("network-clear <sessionId>").description("Clear the active ESVP network profile").option("-s, --server <url>", "ESVP base URL").action(async (sessionId, options) => {
|
|
352
352
|
await withESVPCli(async () => {
|
|
353
|
-
const { clearESVPNetwork } = await import("./esvp-
|
|
353
|
+
const { clearESVPNetwork } = await import("./esvp-4LIAU76K.js");
|
|
354
354
|
return {
|
|
355
355
|
...await getESVPBaseResult(options.server),
|
|
356
356
|
...await clearESVPNetwork(sessionId, options.server)
|
|
@@ -359,7 +359,7 @@ esvp.command("network-clear <sessionId>").description("Clear the active ESVP net
|
|
|
359
359
|
});
|
|
360
360
|
esvp.command("trace-attach <sessionId>").description("Attach a public network trace artifact to a session").requiredOption("--trace-kind <kind>", "Trace kind, e.g. http_trace or har").option("-s, --server <url>", "ESVP base URL").option("--json <json>", "Trace payload JSON").option("--file <path>", "Path to trace payload JSON/text").option("--label <label>", "Trace label").option("--source <source>", "Trace source").option("--request-id <id>", "Correlated request ID").option("--method <method>", "HTTP method").option("--url <url>", "Request URL").option("--status-code <code>", "HTTP status code").option("--format <format>", "Payload format label").action(async (sessionId, options) => {
|
|
361
361
|
await withESVPCli(async () => {
|
|
362
|
-
const { attachESVPNetworkTrace } = await import("./esvp-
|
|
362
|
+
const { attachESVPNetworkTrace } = await import("./esvp-4LIAU76K.js");
|
|
363
363
|
const payload = await readJsonSource(options.json, options.file, "trace payload");
|
|
364
364
|
if (payload == null) {
|
|
365
365
|
failCli("Provide --json or --file with the trace payload to attach.");
|
|
@@ -389,7 +389,7 @@ program.command("serve").alias("server").description("Start the DiscoveryLab web
|
|
|
389
389
|
console.log(chalk.cyan("\n DiscoveryLab"));
|
|
390
390
|
console.log(chalk.gray(" AI-powered app testing & evidence generator\n"));
|
|
391
391
|
try {
|
|
392
|
-
const { startServer } = await import("./server-
|
|
392
|
+
const { startServer } = await import("./server-TKYRIYJ6.js");
|
|
393
393
|
await startServer(port);
|
|
394
394
|
console.log(chalk.green(` Server running at http://localhost:${port}`));
|
|
395
395
|
console.log(chalk.gray(" Press Ctrl+C to stop\n"));
|
|
@@ -404,7 +404,7 @@ program.command("serve").alias("server").description("Start the DiscoveryLab web
|
|
|
404
404
|
program.command("setup").description("Check and configure DiscoveryLab dependencies").action(async () => {
|
|
405
405
|
console.log(chalk.cyan("\n DiscoveryLab Setup\n"));
|
|
406
406
|
try {
|
|
407
|
-
const { setupStatusTool } = await import("./setup-
|
|
407
|
+
const { setupStatusTool } = await import("./setup-O6WQQAGP.js");
|
|
408
408
|
const result = await setupStatusTool.handler({});
|
|
409
409
|
if (result.isError) {
|
|
410
410
|
console.error(chalk.red(" Setup check failed"));
|
|
@@ -440,7 +440,7 @@ program.command("setup").description("Check and configure DiscoveryLab dependenc
|
|
|
440
440
|
program.command("init").description("Initialize DiscoveryLab data directories").action(async () => {
|
|
441
441
|
console.log(chalk.cyan("\n Initializing DiscoveryLab...\n"));
|
|
442
442
|
try {
|
|
443
|
-
const { getDatabase, DATA_DIR, PROJECTS_DIR, EXPORTS_DIR } = await import("./db-
|
|
443
|
+
const { getDatabase, DATA_DIR, PROJECTS_DIR, EXPORTS_DIR } = await import("./db-745LC5YC.js");
|
|
444
444
|
getDatabase();
|
|
445
445
|
console.log(chalk.green(" Created directories:"));
|
|
446
446
|
console.log(chalk.gray(` ${DATA_DIR}`));
|
|
@@ -486,9 +486,9 @@ program.command("install").description("Install DiscoveryLab as Claude Code MCP
|
|
|
486
486
|
});
|
|
487
487
|
program.command("mcp").description("Run as MCP server (for Claude Code integration)").action(async () => {
|
|
488
488
|
try {
|
|
489
|
-
const { getDatabase } = await import("./db-
|
|
489
|
+
const { getDatabase } = await import("./db-745LC5YC.js");
|
|
490
490
|
getDatabase();
|
|
491
|
-
const { mcpServer } = await import("./server-
|
|
491
|
+
const { mcpServer } = await import("./server-NTT2XGCC.js");
|
|
492
492
|
const {
|
|
493
493
|
uiTools,
|
|
494
494
|
projectTools,
|
|
@@ -500,8 +500,9 @@ program.command("mcp").description("Run as MCP server (for Claude Code integrati
|
|
|
500
500
|
testingTools,
|
|
501
501
|
integrationTools,
|
|
502
502
|
taskHubTools,
|
|
503
|
-
esvpTools
|
|
504
|
-
|
|
503
|
+
esvpTools,
|
|
504
|
+
knowledgeTools
|
|
505
|
+
} = await import("./tools-FVVWKEGC.js");
|
|
505
506
|
mcpServer.registerTools([
|
|
506
507
|
...uiTools,
|
|
507
508
|
...projectTools,
|
|
@@ -513,7 +514,8 @@ program.command("mcp").description("Run as MCP server (for Claude Code integrati
|
|
|
513
514
|
...testingTools,
|
|
514
515
|
...integrationTools,
|
|
515
516
|
...taskHubTools,
|
|
516
|
-
...esvpTools
|
|
517
|
+
...esvpTools,
|
|
518
|
+
...knowledgeTools
|
|
517
519
|
]);
|
|
518
520
|
await mcpServer.runStdio();
|
|
519
521
|
} catch (error) {
|
|
@@ -528,7 +530,7 @@ program.command("info").description("Show version and configuration info").actio
|
|
|
528
530
|
console.log(chalk.gray(" AI-powered app testing & evidence generator"));
|
|
529
531
|
console.log(chalk.gray(" Claude Code Plugin\n"));
|
|
530
532
|
try {
|
|
531
|
-
const { DATA_DIR, DB_PATH } = await import("./db-
|
|
533
|
+
const { DATA_DIR, DB_PATH } = await import("./db-745LC5YC.js");
|
|
532
534
|
console.log(chalk.white(" Paths:"));
|
|
533
535
|
console.log(chalk.gray(` Data: ${DATA_DIR}`));
|
|
534
536
|
console.log(chalk.gray(` Database: ${DB_PATH}`));
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import "./chunk-4VNS5WPM.js";
|
|
2
|
+
|
|
3
|
+
// src/core/export/document.ts
|
|
4
|
+
function buildDefaultDocument(project) {
|
|
5
|
+
const sections = [];
|
|
6
|
+
const title = project.marketingTitle || project.name;
|
|
7
|
+
sections.push({
|
|
8
|
+
type: "callout",
|
|
9
|
+
text: title,
|
|
10
|
+
color: "purple"
|
|
11
|
+
});
|
|
12
|
+
if (project.marketingDescription) {
|
|
13
|
+
sections.push({
|
|
14
|
+
type: "paragraph",
|
|
15
|
+
text: project.marketingDescription
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
let links = [];
|
|
19
|
+
if (project.taskHubLinks) {
|
|
20
|
+
try {
|
|
21
|
+
const parsed = JSON.parse(project.taskHubLinks);
|
|
22
|
+
links = parsed.map((l) => ({
|
|
23
|
+
label: l.title || l.url,
|
|
24
|
+
url: l.url,
|
|
25
|
+
linkType: l.type || "other"
|
|
26
|
+
}));
|
|
27
|
+
} catch {
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
if (links.length > 0) {
|
|
31
|
+
sections.push({ type: "links", items: links });
|
|
32
|
+
}
|
|
33
|
+
sections.push({ type: "divider" });
|
|
34
|
+
if (project.frames && project.frames.length > 0) {
|
|
35
|
+
sections.push({
|
|
36
|
+
type: "image-gallery",
|
|
37
|
+
images: project.frames.map((f, i) => ({
|
|
38
|
+
path: f.imagePath,
|
|
39
|
+
caption: f.ocrText?.slice(0, 40) || `Screen ${i + 1}`,
|
|
40
|
+
selected: true
|
|
41
|
+
}))
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
if (project.templateRenderPath) {
|
|
45
|
+
sections.push({
|
|
46
|
+
type: "video",
|
|
47
|
+
path: project.templateRenderPath,
|
|
48
|
+
duration: project.duration || void 0
|
|
49
|
+
});
|
|
50
|
+
} else if (project.videoPath) {
|
|
51
|
+
sections.push({
|
|
52
|
+
type: "video",
|
|
53
|
+
path: project.videoPath,
|
|
54
|
+
duration: project.duration || void 0
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
if (project.frames && project.frames.length > 0) {
|
|
58
|
+
sections.push({
|
|
59
|
+
type: "gif",
|
|
60
|
+
path: "",
|
|
61
|
+
// generated on export
|
|
62
|
+
caption: "Flow Diagram",
|
|
63
|
+
templateId: "flow-diagram"
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
if (project.aiSummary) {
|
|
67
|
+
sections.push({ type: "divider" });
|
|
68
|
+
sections.push({
|
|
69
|
+
type: "markdown",
|
|
70
|
+
content: project.aiSummary,
|
|
71
|
+
collapsible: true,
|
|
72
|
+
label: "App Intelligence"
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
return {
|
|
76
|
+
title,
|
|
77
|
+
subtitle: project.marketingDescription || void 0,
|
|
78
|
+
sections,
|
|
79
|
+
metadata: {
|
|
80
|
+
projectId: project.id,
|
|
81
|
+
platform: project.platform || void 0
|
|
82
|
+
}
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function getSectionTypeInfo(type) {
|
|
86
|
+
const info = {
|
|
87
|
+
"heading": { label: "Heading", description: "Section title" },
|
|
88
|
+
"paragraph": { label: "Description", description: "Text content" },
|
|
89
|
+
"divider": { label: "Divider", description: "Horizontal line" },
|
|
90
|
+
"callout": { label: "Header", description: "Highlighted title block" },
|
|
91
|
+
"links": { label: "Links", description: "External references" },
|
|
92
|
+
"image-gallery": { label: "Screenshots", description: "Select frames to include" },
|
|
93
|
+
"image": { label: "Image", description: "Single image" },
|
|
94
|
+
"video": { label: "Video", description: "Recording file" },
|
|
95
|
+
"gif": { label: "Interactive", description: "Animated visualization" },
|
|
96
|
+
"grid": { label: "Grid", description: "Composed screenshot grid" },
|
|
97
|
+
"markdown": { label: "Analysis", description: "App Intelligence report" }
|
|
98
|
+
};
|
|
99
|
+
return info[type] || { label: type, description: "" };
|
|
100
|
+
}
|
|
101
|
+
export {
|
|
102
|
+
buildDefaultDocument,
|
|
103
|
+
getSectionTypeInfo
|
|
104
|
+
};
|
|
@@ -22,10 +22,10 @@ import {
|
|
|
22
22
|
runESVPActions,
|
|
23
23
|
runESVPPreflight,
|
|
24
24
|
validateESVPReplay
|
|
25
|
-
} from "./chunk-
|
|
25
|
+
} from "./chunk-EU63HPKT.js";
|
|
26
26
|
import "./chunk-6EGBXRDK.js";
|
|
27
|
-
import "./chunk-
|
|
28
|
-
import "./chunk-
|
|
27
|
+
import "./chunk-XAMA3JJG.js";
|
|
28
|
+
import "./chunk-4VNS5WPM.js";
|
|
29
29
|
export {
|
|
30
30
|
attachESVPNetworkTrace,
|
|
31
31
|
captureESVPCheckpoint,
|
|
@@ -4,14 +4,14 @@ import {
|
|
|
4
4
|
diagnoseESVPNetworkState,
|
|
5
5
|
translateMaestroActionsToESVP,
|
|
6
6
|
validateMaestroRecordingWithESVP
|
|
7
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-SWZIBO2R.js";
|
|
8
8
|
import "./chunk-LB3RNE3O.js";
|
|
9
|
-
import "./chunk-
|
|
9
|
+
import "./chunk-EU63HPKT.js";
|
|
10
10
|
import "./chunk-6EGBXRDK.js";
|
|
11
11
|
import "./chunk-SLNJEF32.js";
|
|
12
|
-
import "./chunk-
|
|
12
|
+
import "./chunk-XAMA3JJG.js";
|
|
13
13
|
import "./chunk-XFVDP332.js";
|
|
14
|
-
import "./chunk-
|
|
14
|
+
import "./chunk-4VNS5WPM.js";
|
|
15
15
|
export {
|
|
16
16
|
collectESVPSessionNetworkData,
|
|
17
17
|
createMobileNetworkCaptureMeta,
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import {
|
|
2
|
+
cleanupFrames,
|
|
3
|
+
compareFrames,
|
|
4
|
+
detectKeyFrames,
|
|
5
|
+
extractFrames,
|
|
6
|
+
extractKeyFramesOnly,
|
|
7
|
+
filterBlankFrames,
|
|
8
|
+
generateThumbnail,
|
|
9
|
+
getVideoInfo,
|
|
10
|
+
isBlankFrame
|
|
11
|
+
} from "./chunk-QMUEC6B5.js";
|
|
12
|
+
import "./chunk-XAMA3JJG.js";
|
|
13
|
+
import "./chunk-4VNS5WPM.js";
|
|
14
|
+
export {
|
|
15
|
+
cleanupFrames,
|
|
16
|
+
compareFrames,
|
|
17
|
+
detectKeyFrames,
|
|
18
|
+
extractFrames,
|
|
19
|
+
extractKeyFramesOnly,
|
|
20
|
+
filterBlankFrames,
|
|
21
|
+
generateThumbnail,
|
|
22
|
+
getVideoInfo,
|
|
23
|
+
isBlankFrame
|
|
24
|
+
};
|