@veolab/discoverylab 1.6.3 → 1.6.5
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/assets/applab-bundle-icon.png +0 -0
- package/assets/icons/icons8-claude-150.png +0 -0
- package/assets/icons/icons8-claude-500.png +0 -0
- package/dist/{chunk-HFN6BTVO.js → chunk-JAA53ES7.js} +1 -1
- package/dist/{chunk-5AISGCS4.js → chunk-Q7Q3A2ZI.js} +136 -3
- package/dist/{chunk-XKX6NBHF.js → chunk-TWRWARU4.js} +52 -2
- package/dist/{chunk-IVX2OSOJ.js → chunk-V6RREMYD.js} +94 -50
- package/dist/cli.js +10 -5
- package/dist/index.d.ts +30 -6
- package/dist/index.html +70 -19
- package/dist/index.js +4 -4
- package/dist/mcpb/node_modules/@anthropic-ai/sdk/src/lib/.keep +4 -0
- package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/better_sqlite3.node.d +1 -0
- package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/obj.target/better_sqlite3/src/better_sqlite3.o.d +133 -0
- package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/obj.target/deps/locate_sqlite3.stamp.d +1 -0
- package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/obj.target/sqlite3/gen/sqlite3/sqlite3.o.d +4 -0
- package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/obj.target/test_extension/deps/test_extension.o.d +7 -0
- package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/sqlite3.a.d +1 -0
- package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/test_extension.node.d +1 -0
- package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/ba23eeee118cd63e16015df367567cb043fed872.intermediate.d +1 -0
- package/dist/{server-W3JQ5RG7.js → server-C2NZM2RV.js} +1 -1
- package/dist/{server-OVOACIOJ.js → server-WN6DCCUA.js} +1 -1
- package/dist/{setup-F7MGEFIM.js → setup-SMN7FJNZ.js} +2 -2
- package/dist/{tools-VYFNRUS4.js → tools-VXU3JEQP.js} +3 -3
- package/package.json +8 -2
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
"name": "discoverylab",
|
|
13
13
|
"source": ".",
|
|
14
14
|
"description": "AI-powered app testing & marketing asset generator. Record mobile/web apps, run automated tests with Maestro & Playwright, and generate professional screenshots, GIFs, and test reports.",
|
|
15
|
-
"version": "1.6.
|
|
15
|
+
"version": "1.6.4",
|
|
16
16
|
"author": {
|
|
17
17
|
"name": "Anderson Melo"
|
|
18
18
|
},
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "discoverylab",
|
|
3
3
|
"description": "AI-powered app testing & marketing asset generator. Record mobile/web apps, run automated tests with Maestro & Playwright, and generate professional screenshots, GIFs, and test reports.",
|
|
4
|
-
"version": "1.6.
|
|
4
|
+
"version": "1.6.4",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Anderson Melo",
|
|
7
7
|
"email": "anderson.90@gmail.com"
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -14,8 +14,9 @@ import {
|
|
|
14
14
|
import {
|
|
15
15
|
createErrorResult,
|
|
16
16
|
createJsonResult,
|
|
17
|
-
createTextResult
|
|
18
|
-
|
|
17
|
+
createTextResult,
|
|
18
|
+
mcpServer
|
|
19
|
+
} from "./chunk-TWRWARU4.js";
|
|
19
20
|
import {
|
|
20
21
|
getAvailableTemplates,
|
|
21
22
|
isTemplatesInstalled
|
|
@@ -6919,6 +6920,102 @@ var templateTools = [
|
|
|
6919
6920
|
// src/mcp/tools/knowledge.ts
|
|
6920
6921
|
import { z as z12 } from "zod";
|
|
6921
6922
|
import { desc as desc2 } from "drizzle-orm";
|
|
6923
|
+
var KNOWLEDGE_VIEWER_RESOURCE_URI = "ui://discoverylab/knowledge-viewer.html";
|
|
6924
|
+
var KNOWLEDGE_VIEWER_MIME_TYPE = "text/html;profile=mcp-app";
|
|
6925
|
+
function buildViewerPlaceholderHtml(message) {
|
|
6926
|
+
const safeMessage = JSON.stringify(message);
|
|
6927
|
+
return `<!DOCTYPE html>
|
|
6928
|
+
<html lang="en">
|
|
6929
|
+
<head>
|
|
6930
|
+
<meta charset="UTF-8" />
|
|
6931
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6932
|
+
<title>DiscoveryLab Flow Viewer</title>
|
|
6933
|
+
<style>
|
|
6934
|
+
:root {
|
|
6935
|
+
color-scheme: dark;
|
|
6936
|
+
--bg: #0b1117;
|
|
6937
|
+
--panel: rgba(255, 255, 255, 0.04);
|
|
6938
|
+
--border: rgba(255, 255, 255, 0.1);
|
|
6939
|
+
--text: #eff5fb;
|
|
6940
|
+
--muted: #9fb0c2;
|
|
6941
|
+
--accent: #2dd4bf;
|
|
6942
|
+
}
|
|
6943
|
+
|
|
6944
|
+
* { box-sizing: border-box; }
|
|
6945
|
+
|
|
6946
|
+
body {
|
|
6947
|
+
margin: 0;
|
|
6948
|
+
min-height: 100vh;
|
|
6949
|
+
display: grid;
|
|
6950
|
+
place-items: center;
|
|
6951
|
+
padding: 24px;
|
|
6952
|
+
background:
|
|
6953
|
+
radial-gradient(circle at top left, rgba(45, 212, 191, 0.18), transparent 28%),
|
|
6954
|
+
linear-gradient(180deg, #101826, var(--bg));
|
|
6955
|
+
color: var(--text);
|
|
6956
|
+
font: 14px/1.5 "IBM Plex Sans", "Segoe UI", system-ui, sans-serif;
|
|
6957
|
+
}
|
|
6958
|
+
|
|
6959
|
+
.card {
|
|
6960
|
+
width: min(720px, 100%);
|
|
6961
|
+
border: 1px solid var(--border);
|
|
6962
|
+
border-radius: 24px;
|
|
6963
|
+
padding: 24px;
|
|
6964
|
+
background: var(--panel);
|
|
6965
|
+
box-shadow: 0 24px 60px rgba(0, 0, 0, 0.28);
|
|
6966
|
+
}
|
|
6967
|
+
|
|
6968
|
+
.eyebrow {
|
|
6969
|
+
display: inline-flex;
|
|
6970
|
+
align-items: center;
|
|
6971
|
+
gap: 8px;
|
|
6972
|
+
border: 1px solid var(--border);
|
|
6973
|
+
border-radius: 999px;
|
|
6974
|
+
padding: 6px 12px;
|
|
6975
|
+
color: var(--muted);
|
|
6976
|
+
font-size: 12px;
|
|
6977
|
+
text-transform: uppercase;
|
|
6978
|
+
letter-spacing: 0.03em;
|
|
6979
|
+
}
|
|
6980
|
+
|
|
6981
|
+
h1 {
|
|
6982
|
+
margin: 16px 0 8px;
|
|
6983
|
+
font: 700 32px/1.02 "Space Grotesk", "Avenir Next", system-ui, sans-serif;
|
|
6984
|
+
letter-spacing: -0.03em;
|
|
6985
|
+
}
|
|
6986
|
+
|
|
6987
|
+
p {
|
|
6988
|
+
margin: 0;
|
|
6989
|
+
color: var(--muted);
|
|
6990
|
+
}
|
|
6991
|
+
</style>
|
|
6992
|
+
</head>
|
|
6993
|
+
<body>
|
|
6994
|
+
<main class="card">
|
|
6995
|
+
<div class="eyebrow">DiscoveryLab Local Viewer</div>
|
|
6996
|
+
<h1>Open a flow in Claude Desktop</h1>
|
|
6997
|
+
<p id="message"></p>
|
|
6998
|
+
</main>
|
|
6999
|
+
<script>
|
|
7000
|
+
document.getElementById('message').textContent = ${safeMessage};
|
|
7001
|
+
</script>
|
|
7002
|
+
</body>
|
|
7003
|
+
</html>`;
|
|
7004
|
+
}
|
|
7005
|
+
mcpServer.registerResource({
|
|
7006
|
+
uri: KNOWLEDGE_VIEWER_RESOURCE_URI,
|
|
7007
|
+
name: "discoverylab-knowledge-viewer",
|
|
7008
|
+
title: "DiscoveryLab Flow Viewer",
|
|
7009
|
+
description: "Interactive local flow viewer for DiscoveryLab projects.",
|
|
7010
|
+
mimeType: KNOWLEDGE_VIEWER_MIME_TYPE,
|
|
7011
|
+
contents: [
|
|
7012
|
+
{
|
|
7013
|
+
uri: KNOWLEDGE_VIEWER_RESOURCE_URI,
|
|
7014
|
+
mimeType: KNOWLEDGE_VIEWER_MIME_TYPE,
|
|
7015
|
+
text: buildViewerPlaceholderHtml("Use dlab.knowledge.open to load a local project into the canvas.")
|
|
7016
|
+
}
|
|
7017
|
+
]
|
|
7018
|
+
});
|
|
6922
7019
|
var knowledgeSearchTool = {
|
|
6923
7020
|
name: "dlab.knowledge.search",
|
|
6924
7021
|
description: `Search across all DiscoveryLab projects for app flows, UI elements, screens, and behaviors. Use this when the user asks about how an app works, what a specific screen looks like, or any question about captured app flows. Returns relevant projects with their analysis, OCR text, and context.`,
|
|
@@ -7093,6 +7190,11 @@ var knowledgeOpenTool = {
|
|
|
7093
7190
|
query: z12.string().optional().describe('Search query to find the project (e.g. "login flow", "onboarding")'),
|
|
7094
7191
|
projectId: z12.string().optional().describe("Direct project ID if known")
|
|
7095
7192
|
}),
|
|
7193
|
+
_meta: {
|
|
7194
|
+
ui: {
|
|
7195
|
+
resourceUri: KNOWLEDGE_VIEWER_RESOURCE_URI
|
|
7196
|
+
}
|
|
7197
|
+
},
|
|
7096
7198
|
handler: async (params) => {
|
|
7097
7199
|
try {
|
|
7098
7200
|
const db = getDatabase();
|
|
@@ -7148,7 +7250,38 @@ var knowledgeOpenTool = {
|
|
|
7148
7250
|
if (!html) {
|
|
7149
7251
|
return createErrorResult("Failed to generate infographic HTML (template not found)");
|
|
7150
7252
|
}
|
|
7151
|
-
|
|
7253
|
+
mcpServer.upsertResourceContents(KNOWLEDGE_VIEWER_RESOURCE_URI, {
|
|
7254
|
+
name: "discoverylab-knowledge-viewer",
|
|
7255
|
+
title: `DiscoveryLab Flow Viewer \xB7 ${project.marketingTitle || project.name}`,
|
|
7256
|
+
description: "Interactive local flow viewer for DiscoveryLab projects.",
|
|
7257
|
+
mimeType: KNOWLEDGE_VIEWER_MIME_TYPE,
|
|
7258
|
+
contents: [
|
|
7259
|
+
{
|
|
7260
|
+
uri: KNOWLEDGE_VIEWER_RESOURCE_URI,
|
|
7261
|
+
mimeType: KNOWLEDGE_VIEWER_MIME_TYPE,
|
|
7262
|
+
text: html
|
|
7263
|
+
}
|
|
7264
|
+
]
|
|
7265
|
+
});
|
|
7266
|
+
return {
|
|
7267
|
+
content: [
|
|
7268
|
+
{
|
|
7269
|
+
type: "text",
|
|
7270
|
+
text: `Opened the local DiscoveryLab flow viewer for ${project.marketingTitle || project.name}.`
|
|
7271
|
+
}
|
|
7272
|
+
],
|
|
7273
|
+
structuredContent: {
|
|
7274
|
+
projectId: project.id,
|
|
7275
|
+
name: project.marketingTitle || project.name,
|
|
7276
|
+
frameCount: frameFiles.length,
|
|
7277
|
+
platform: project.platform || "unknown"
|
|
7278
|
+
},
|
|
7279
|
+
_meta: {
|
|
7280
|
+
ui: {
|
|
7281
|
+
resourceUri: KNOWLEDGE_VIEWER_RESOURCE_URI
|
|
7282
|
+
}
|
|
7283
|
+
}
|
|
7284
|
+
};
|
|
7152
7285
|
} catch (error) {
|
|
7153
7286
|
return createErrorResult(`Failed to open flow: ${error instanceof Error ? error.message : String(error)}`);
|
|
7154
7287
|
}
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
import { z } from "zod";
|
|
7
7
|
var MCPServer = class {
|
|
8
8
|
tools = /* @__PURE__ */ new Map();
|
|
9
|
+
resources = /* @__PURE__ */ new Map();
|
|
9
10
|
serverInfo = {
|
|
10
11
|
name: "discoverylab",
|
|
11
12
|
version: APP_VERSION
|
|
@@ -18,6 +19,15 @@ var MCPServer = class {
|
|
|
18
19
|
this.registerTool(tool);
|
|
19
20
|
}
|
|
20
21
|
}
|
|
22
|
+
registerResource(resource) {
|
|
23
|
+
this.resources.set(resource.uri, resource);
|
|
24
|
+
}
|
|
25
|
+
upsertResourceContents(uri, resource) {
|
|
26
|
+
this.resources.set(uri, {
|
|
27
|
+
uri,
|
|
28
|
+
...resource
|
|
29
|
+
});
|
|
30
|
+
}
|
|
21
31
|
async handleRequest(request) {
|
|
22
32
|
const { id, method, params } = request;
|
|
23
33
|
try {
|
|
@@ -28,6 +38,10 @@ var MCPServer = class {
|
|
|
28
38
|
return this.handleToolsList(id);
|
|
29
39
|
case "tools/call":
|
|
30
40
|
return this.handleToolCall(id, params);
|
|
41
|
+
case "resources/list":
|
|
42
|
+
return this.handleResourcesList(id);
|
|
43
|
+
case "resources/read":
|
|
44
|
+
return this.handleResourcesRead(id, params);
|
|
31
45
|
case "ping":
|
|
32
46
|
return { jsonrpc: "2.0", id, result: { pong: true } };
|
|
33
47
|
default:
|
|
@@ -54,7 +68,8 @@ var MCPServer = class {
|
|
|
54
68
|
protocolVersion: "2024-11-05",
|
|
55
69
|
serverInfo: this.serverInfo,
|
|
56
70
|
capabilities: {
|
|
57
|
-
tools: {}
|
|
71
|
+
tools: {},
|
|
72
|
+
resources: {}
|
|
58
73
|
}
|
|
59
74
|
}
|
|
60
75
|
};
|
|
@@ -63,7 +78,8 @@ var MCPServer = class {
|
|
|
63
78
|
const tools = Array.from(this.tools.values()).map((tool) => ({
|
|
64
79
|
name: tool.name,
|
|
65
80
|
description: tool.description,
|
|
66
|
-
inputSchema: this.zodToJsonSchema(tool.inputSchema)
|
|
81
|
+
inputSchema: this.zodToJsonSchema(tool.inputSchema),
|
|
82
|
+
...tool._meta ? { _meta: tool._meta } : {}
|
|
67
83
|
}));
|
|
68
84
|
return {
|
|
69
85
|
jsonrpc: "2.0",
|
|
@@ -71,6 +87,40 @@ var MCPServer = class {
|
|
|
71
87
|
result: { tools }
|
|
72
88
|
};
|
|
73
89
|
}
|
|
90
|
+
handleResourcesList(id) {
|
|
91
|
+
const resources = Array.from(this.resources.values()).map((resource) => ({
|
|
92
|
+
uri: resource.uri,
|
|
93
|
+
name: resource.name,
|
|
94
|
+
...resource.title ? { title: resource.title } : {},
|
|
95
|
+
...resource.description ? { description: resource.description } : {},
|
|
96
|
+
mimeType: resource.mimeType
|
|
97
|
+
}));
|
|
98
|
+
return {
|
|
99
|
+
jsonrpc: "2.0",
|
|
100
|
+
id,
|
|
101
|
+
result: { resources }
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
handleResourcesRead(id, params) {
|
|
105
|
+
const uri = typeof params?.uri === "string" ? params.uri : "";
|
|
106
|
+
const resource = this.resources.get(uri);
|
|
107
|
+
if (!resource) {
|
|
108
|
+
return {
|
|
109
|
+
jsonrpc: "2.0",
|
|
110
|
+
id,
|
|
111
|
+
error: { code: -32602, message: `Resource not found: ${uri}` }
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
const contents = Array.isArray(resource.contents) && resource.contents.length > 0 ? resource.contents : [{
|
|
115
|
+
uri: resource.uri,
|
|
116
|
+
mimeType: resource.mimeType
|
|
117
|
+
}];
|
|
118
|
+
return {
|
|
119
|
+
jsonrpc: "2.0",
|
|
120
|
+
id,
|
|
121
|
+
result: { contents }
|
|
122
|
+
};
|
|
123
|
+
}
|
|
74
124
|
async handleToolCall(id, params) {
|
|
75
125
|
const { name, arguments: args } = params;
|
|
76
126
|
const tool = this.tools.get(name);
|
|
@@ -67,6 +67,7 @@ import {
|
|
|
67
67
|
import {
|
|
68
68
|
DATA_DIR,
|
|
69
69
|
EXPORTS_DIR,
|
|
70
|
+
FRAMES_DIR,
|
|
70
71
|
PROJECTS_DIR,
|
|
71
72
|
frames,
|
|
72
73
|
getDatabase,
|
|
@@ -3707,7 +3708,7 @@ app.post("/api/upload", async (c) => {
|
|
|
3707
3708
|
const { exec: exec2 } = await import("child_process");
|
|
3708
3709
|
const { promisify } = await import("util");
|
|
3709
3710
|
const execAsync = promisify(exec2);
|
|
3710
|
-
const { PROJECTS_DIR: PROJECTS_DIR2, FRAMES_DIR } = await import("./db-5ECN3O7F.js");
|
|
3711
|
+
const { PROJECTS_DIR: PROJECTS_DIR2, FRAMES_DIR: FRAMES_DIR2 } = await import("./db-5ECN3O7F.js");
|
|
3711
3712
|
const id = crypto.randomUUID();
|
|
3712
3713
|
const now = /* @__PURE__ */ new Date();
|
|
3713
3714
|
const projectDir = join6(PROJECTS_DIR2, id);
|
|
@@ -3736,7 +3737,7 @@ app.post("/api/upload", async (c) => {
|
|
|
3736
3737
|
let framePaths = [];
|
|
3737
3738
|
try {
|
|
3738
3739
|
if (isVideo) {
|
|
3739
|
-
const projectFramesDir = join6(
|
|
3740
|
+
const projectFramesDir = join6(FRAMES_DIR2, id);
|
|
3740
3741
|
if (!fsExists(projectFramesDir)) {
|
|
3741
3742
|
mkdirSync5(projectFramesDir, { recursive: true });
|
|
3742
3743
|
}
|
|
@@ -4503,8 +4504,8 @@ app.post("/api/analyze/:id", async (c) => {
|
|
|
4503
4504
|
const { promisify } = await import("util");
|
|
4504
4505
|
const { mkdirSync: mkdirSync5, readdirSync: readdirSync5 } = await import("fs");
|
|
4505
4506
|
const execAsync = promisify(exec2);
|
|
4506
|
-
const { FRAMES_DIR } = await import("./db-5ECN3O7F.js");
|
|
4507
|
-
const projectFramesDir = join6(
|
|
4507
|
+
const { FRAMES_DIR: FRAMES_DIR2 } = await import("./db-5ECN3O7F.js");
|
|
4508
|
+
const projectFramesDir = join6(FRAMES_DIR2, id);
|
|
4508
4509
|
if (!existsSync5(projectFramesDir)) {
|
|
4509
4510
|
mkdirSync5(projectFramesDir, { recursive: true });
|
|
4510
4511
|
}
|
|
@@ -5007,11 +5008,11 @@ app.get("/api/grid/project-frames/:id", async (c) => {
|
|
|
5007
5008
|
return c.json({ error: "Project not found" }, 404);
|
|
5008
5009
|
}
|
|
5009
5010
|
const project = result[0];
|
|
5010
|
-
const { FRAMES_DIR } = await import("./db-5ECN3O7F.js");
|
|
5011
|
+
const { FRAMES_DIR: FRAMES_DIR2 } = await import("./db-5ECN3O7F.js");
|
|
5011
5012
|
const { readdirSync: readdirSync5 } = await import("fs");
|
|
5012
5013
|
const availableFrames = [];
|
|
5013
5014
|
const { isBlankFrame } = await import("./frames-2NFCSKXQ.js");
|
|
5014
|
-
const projectFramesDir = join6(
|
|
5015
|
+
const projectFramesDir = join6(FRAMES_DIR2, id);
|
|
5015
5016
|
if (existsSync5(projectFramesDir)) {
|
|
5016
5017
|
const frameFiles = readdirSync5(projectFramesDir).filter((f) => /\.(png|jpg|jpeg)$/i.test(f)).sort();
|
|
5017
5018
|
for (const f of frameFiles) {
|
|
@@ -5138,18 +5139,43 @@ function resolveProjectBundleRecordingDir(originalVideoPath, resolvedVideoPath)
|
|
|
5138
5139
|
}
|
|
5139
5140
|
return null;
|
|
5140
5141
|
}
|
|
5141
|
-
function
|
|
5142
|
-
|
|
5143
|
-
|
|
5142
|
+
function collectProjectExportFramePaths(projectId, recordingBaseDir) {
|
|
5143
|
+
const candidateDirs = [
|
|
5144
|
+
join6(FRAMES_DIR, projectId),
|
|
5145
|
+
join6(PROJECTS_DIR, projectId, "frames"),
|
|
5146
|
+
recordingBaseDir ? join6(recordingBaseDir, "screenshots") : null,
|
|
5147
|
+
recordingBaseDir
|
|
5148
|
+
].filter((value, index, items) => !!value && items.indexOf(value) === index);
|
|
5149
|
+
const framePaths = [];
|
|
5150
|
+
const seen = /* @__PURE__ */ new Set();
|
|
5151
|
+
for (const dirPath of candidateDirs) {
|
|
5152
|
+
if (!existsSync5(dirPath) || !statSync3(dirPath).isDirectory()) {
|
|
5153
|
+
continue;
|
|
5154
|
+
}
|
|
5155
|
+
const files = readdirSync4(dirPath).filter((entry) => /\.(png|jpg|jpeg|webp)$/i.test(entry)).filter((entry) => !entry.startsWith("._")).sort();
|
|
5156
|
+
for (const entry of files) {
|
|
5157
|
+
const absolutePath = join6(dirPath, entry);
|
|
5158
|
+
if (seen.has(absolutePath)) {
|
|
5159
|
+
continue;
|
|
5160
|
+
}
|
|
5161
|
+
seen.add(absolutePath);
|
|
5162
|
+
framePaths.push(absolutePath);
|
|
5163
|
+
}
|
|
5144
5164
|
}
|
|
5145
|
-
|
|
5146
|
-
|
|
5147
|
-
|
|
5148
|
-
|
|
5149
|
-
|
|
5165
|
+
return framePaths;
|
|
5166
|
+
}
|
|
5167
|
+
function resolveAppLabBundleIconPath() {
|
|
5168
|
+
const candidates = [
|
|
5169
|
+
join6(__dirname, "..", "..", "assets", "applab-bundle-icon.png"),
|
|
5170
|
+
join6(__dirname, "..", "assets", "applab-bundle-icon.png"),
|
|
5171
|
+
join6(process.cwd(), "assets", "applab-bundle-icon.png")
|
|
5172
|
+
];
|
|
5173
|
+
for (const candidate of candidates) {
|
|
5174
|
+
if (existsSync5(candidate)) {
|
|
5175
|
+
return candidate;
|
|
5150
5176
|
}
|
|
5151
5177
|
}
|
|
5152
|
-
return
|
|
5178
|
+
return null;
|
|
5153
5179
|
}
|
|
5154
5180
|
async function runExportCommand(command, args, cwd) {
|
|
5155
5181
|
await new Promise((resolve, reject) => {
|
|
@@ -5282,7 +5308,6 @@ app.post("/api/export", async (c) => {
|
|
|
5282
5308
|
const projectFrames = await db.select().from(frames).where(eq(frames.projectId, projectId)).orderBy(frames.frameNumber);
|
|
5283
5309
|
const exportRecords = await db.select().from(projectExports).where(eq(projectExports.projectId, projectId)).orderBy(desc(projectExports.createdAt));
|
|
5284
5310
|
const recordingBaseDir = resolveProjectBundleRecordingDir(rawProject.videoPath, resolvedVideoPath);
|
|
5285
|
-
const exportArtifactsDir = join6(EXPORTS_DIR, projectId);
|
|
5286
5311
|
const sessionPath = recordingBaseDir ? join6(recordingBaseDir, "session.json") : null;
|
|
5287
5312
|
let sessionData = null;
|
|
5288
5313
|
let networkEntries = [];
|
|
@@ -5307,8 +5332,7 @@ app.post("/api/export", async (c) => {
|
|
|
5307
5332
|
const summaryPath = rawProject.aiSummary ? "analysis/app-intelligence.md" : null;
|
|
5308
5333
|
const ocrPath = rawProject.ocrText ? "analysis/ocr.txt" : null;
|
|
5309
5334
|
const thumbnailName = rawProject.thumbnailPath ? basename3(rawProject.thumbnailPath) : null;
|
|
5310
|
-
|
|
5311
|
-
const bundledFrames = projectFrames.map((frame) => {
|
|
5335
|
+
let bundledFrames = projectFrames.map((frame) => {
|
|
5312
5336
|
const extensionMatch = basename3(frame.imagePath).match(/(\.[^.]+)$/);
|
|
5313
5337
|
const extension = extensionMatch ? extensionMatch[1] : ".png";
|
|
5314
5338
|
const relativeImagePath = `frames/frame-${String(frame.frameNumber).padStart(4, "0")}${extension}`;
|
|
@@ -5318,19 +5342,39 @@ app.post("/api/export", async (c) => {
|
|
|
5318
5342
|
imagePath: relativeImagePath
|
|
5319
5343
|
};
|
|
5320
5344
|
});
|
|
5321
|
-
|
|
5322
|
-
|
|
5323
|
-
|
|
5324
|
-
|
|
5325
|
-
|
|
5345
|
+
if (bundledFrames.length === 0) {
|
|
5346
|
+
const fallbackFramePaths = collectProjectExportFramePaths(projectId, recordingBaseDir);
|
|
5347
|
+
bundledFrames = fallbackFramePaths.map((framePath, index) => {
|
|
5348
|
+
const extensionMatch = basename3(framePath).match(/(\.[^.]+)$/);
|
|
5349
|
+
const extension = extensionMatch ? extensionMatch[1] : ".png";
|
|
5350
|
+
const relativeImagePath = `frames/frame-${String(index + 1).padStart(4, "0")}${extension}`;
|
|
5351
|
+
copyPathIntoExportBundle(framePath, join6(bundleRoot, relativeImagePath));
|
|
5352
|
+
return {
|
|
5353
|
+
id: `${projectId}-fallback-frame-${index + 1}`,
|
|
5354
|
+
projectId,
|
|
5355
|
+
frameNumber: index + 1,
|
|
5356
|
+
imagePath: relativeImagePath,
|
|
5357
|
+
ocrText: null,
|
|
5358
|
+
timestamp,
|
|
5359
|
+
createdAt: new Date(timestamp),
|
|
5360
|
+
isKeyFrame: null
|
|
5361
|
+
};
|
|
5362
|
+
});
|
|
5326
5363
|
}
|
|
5364
|
+
const mediaFiles = [];
|
|
5327
5365
|
if (rawProject.thumbnailPath && existsSync5(rawProject.thumbnailPath) && thumbnailName) {
|
|
5328
5366
|
const relativePath = `media/${thumbnailName}`;
|
|
5329
5367
|
copyPathIntoExportBundle(rawProject.thumbnailPath, join6(bundleRoot, relativePath));
|
|
5330
5368
|
mediaFiles.push({ role: "thumbnail", path: relativePath });
|
|
5331
5369
|
}
|
|
5332
|
-
const
|
|
5333
|
-
const
|
|
5370
|
+
const canonicalBundleIconPath = resolveAppLabBundleIconPath();
|
|
5371
|
+
const bundleIconRelativePath = canonicalBundleIconPath ? "media/icon.png" : null;
|
|
5372
|
+
if (canonicalBundleIconPath && bundleIconRelativePath) {
|
|
5373
|
+
copyPathIntoExportBundle(canonicalBundleIconPath, join6(bundleRoot, bundleIconRelativePath));
|
|
5374
|
+
mediaFiles.push({ role: "icon", path: bundleIconRelativePath });
|
|
5375
|
+
}
|
|
5376
|
+
const recordingIncluded = false;
|
|
5377
|
+
const exportArtifactCount = 0;
|
|
5334
5378
|
const esvpSessionId = resolveProjectESVPSessionId(esvp);
|
|
5335
5379
|
const esvpServerUrl = resolveProjectESVPServerUrl(esvp);
|
|
5336
5380
|
let esvpSnapshot = null;
|
|
@@ -5352,9 +5396,13 @@ app.post("/api/export", async (c) => {
|
|
|
5352
5396
|
}
|
|
5353
5397
|
const packagedProject = {
|
|
5354
5398
|
...normalizedProject,
|
|
5355
|
-
videoPath:
|
|
5399
|
+
videoPath: null,
|
|
5356
5400
|
thumbnailPath: thumbnailName ? `media/${thumbnailName}` : normalizedProject.thumbnailPath,
|
|
5357
|
-
frames: bundledFrames
|
|
5401
|
+
frames: bundledFrames,
|
|
5402
|
+
icon: bundleIconRelativePath ? {
|
|
5403
|
+
path: bundleIconRelativePath,
|
|
5404
|
+
kind: "app-icon"
|
|
5405
|
+
} : null
|
|
5358
5406
|
};
|
|
5359
5407
|
writeExportJson(join6(bundleRoot, "manifest.json"), {
|
|
5360
5408
|
bundleVersion: 1,
|
|
@@ -5368,6 +5416,10 @@ app.post("/api/export", async (c) => {
|
|
|
5368
5416
|
id: rawProject.id,
|
|
5369
5417
|
name: rawProject.name,
|
|
5370
5418
|
platform: rawProject.platform || null,
|
|
5419
|
+
icon: bundleIconRelativePath ? {
|
|
5420
|
+
path: bundleIconRelativePath,
|
|
5421
|
+
kind: "app-icon"
|
|
5422
|
+
} : null,
|
|
5371
5423
|
frameCount: bundledFrames.length,
|
|
5372
5424
|
hasRecordingFolder: recordingIncluded,
|
|
5373
5425
|
hasNetworkTrace: networkEntries.length > 0 || !!networkCapture,
|
|
@@ -5419,18 +5471,6 @@ app.post("/api/export", async (c) => {
|
|
|
5419
5471
|
if (esvpSnapshot) {
|
|
5420
5472
|
writeExportJson(join6(bundleRoot, "esvp", "snapshot.json"), esvpSnapshot);
|
|
5421
5473
|
}
|
|
5422
|
-
const projectExportsDir = join6(EXPORTS_DIR, projectId);
|
|
5423
|
-
if (existsSync5(projectExportsDir) && statSync3(projectExportsDir).isDirectory()) {
|
|
5424
|
-
const rendersDir = join6(bundleRoot, "renders");
|
|
5425
|
-
mkdirSync4(rendersDir, { recursive: true });
|
|
5426
|
-
const exportFiles = readdirSync4(projectExportsDir);
|
|
5427
|
-
for (const f of exportFiles) {
|
|
5428
|
-
const src = join6(projectExportsDir, f);
|
|
5429
|
-
if (statSync3(src).isFile()) {
|
|
5430
|
-
cpSync(src, join6(rendersDir, f));
|
|
5431
|
-
}
|
|
5432
|
-
}
|
|
5433
|
-
}
|
|
5434
5474
|
const templateContentPath = join6(PROJECTS_DIR, projectId, "template-content.json");
|
|
5435
5475
|
if (existsSync5(templateContentPath)) {
|
|
5436
5476
|
mkdirSync4(join6(bundleRoot, "templates"), { recursive: true });
|
|
@@ -5443,12 +5483,16 @@ app.post("/api/export", async (c) => {
|
|
|
5443
5483
|
"This package bundles the local project context for sharing or re-analysis.",
|
|
5444
5484
|
"",
|
|
5445
5485
|
"Included when available:",
|
|
5446
|
-
"-
|
|
5447
|
-
"-
|
|
5486
|
+
"- selected thumbnail and analyzed frames",
|
|
5487
|
+
"- lightweight project/session metadata",
|
|
5448
5488
|
"- OCR text and app intelligence summary",
|
|
5449
5489
|
"- network trace, capture metadata, and ESVP snapshot",
|
|
5450
|
-
"-
|
|
5451
|
-
"
|
|
5490
|
+
"- Task Hub links, requirements, and test map",
|
|
5491
|
+
"",
|
|
5492
|
+
"Excluded by default to keep the bundle Claude-friendly:",
|
|
5493
|
+
"- original long-form media",
|
|
5494
|
+
"- recording folder",
|
|
5495
|
+
"- generated export assets and renders"
|
|
5452
5496
|
].join("\n"));
|
|
5453
5497
|
outputPath = join6(exportDir, `export-${timestamp}.${format}`);
|
|
5454
5498
|
mimeType = "application/zip";
|
|
@@ -5609,8 +5653,8 @@ app.get("/api/visualization/:projectId/:templateId", async (c) => {
|
|
|
5609
5653
|
const db = getDatabase();
|
|
5610
5654
|
const [project] = await db.select().from(projects).where(eq(projects.id, projectId)).limit(1);
|
|
5611
5655
|
if (!project) return c.json({ error: "Project not found" }, 404);
|
|
5612
|
-
const { FRAMES_DIR } = await import("./db-5ECN3O7F.js");
|
|
5613
|
-
const projectFramesDir = join6(
|
|
5656
|
+
const { FRAMES_DIR: FRAMES_DIR2 } = await import("./db-5ECN3O7F.js");
|
|
5657
|
+
const projectFramesDir = join6(FRAMES_DIR2, projectId);
|
|
5614
5658
|
const dbFrames = await db.select().from(frames).where(eq(frames.projectId, projectId)).orderBy(frames.frameNumber).limit(10);
|
|
5615
5659
|
let frameImages = [];
|
|
5616
5660
|
if (dbFrames.length > 0) {
|
|
@@ -6006,9 +6050,9 @@ app.get("/api/export/document/:projectId", async (c) => {
|
|
|
6006
6050
|
const projectFrames = await db.select().from(frames).where(eq(frames.projectId, projectId)).orderBy(frames.frameNumber).limit(20);
|
|
6007
6051
|
let frameData = projectFrames.map((f) => ({ imagePath: f.imagePath, ocrText: f.ocrText }));
|
|
6008
6052
|
if (frameData.length === 0 && project.videoPath) {
|
|
6009
|
-
const { FRAMES_DIR } = await import("./db-5ECN3O7F.js");
|
|
6053
|
+
const { FRAMES_DIR: FRAMES_DIR2 } = await import("./db-5ECN3O7F.js");
|
|
6010
6054
|
const dirs = [
|
|
6011
|
-
join6(
|
|
6055
|
+
join6(FRAMES_DIR2, projectId),
|
|
6012
6056
|
join6(project.videoPath, "screenshots"),
|
|
6013
6057
|
join6(PROJECTS_DIR, "maestro-recordings", projectId, "screenshots"),
|
|
6014
6058
|
join6(PROJECTS_DIR, "web-recordings", projectId, "screenshots")
|
|
@@ -6085,7 +6129,7 @@ app.post("/api/export/batch", async (c) => {
|
|
|
6085
6129
|
if (!manifest.destination?.type) {
|
|
6086
6130
|
return c.json({ error: "Destination type required" }, 400);
|
|
6087
6131
|
}
|
|
6088
|
-
const { FRAMES_DIR } = await import("./db-5ECN3O7F.js");
|
|
6132
|
+
const { FRAMES_DIR: FRAMES_DIR2 } = await import("./db-5ECN3O7F.js");
|
|
6089
6133
|
const dataProvider = {
|
|
6090
6134
|
async getProject(projectId) {
|
|
6091
6135
|
const db2 = getDatabase();
|
|
@@ -6093,7 +6137,7 @@ app.post("/api/export/batch", async (c) => {
|
|
|
6093
6137
|
return p || null;
|
|
6094
6138
|
},
|
|
6095
6139
|
getFramesDir(projectId) {
|
|
6096
|
-
return join6(
|
|
6140
|
+
return join6(FRAMES_DIR2, projectId);
|
|
6097
6141
|
}
|
|
6098
6142
|
};
|
|
6099
6143
|
const result = await executeBatchExport(manifest, dataProvider, (progress) => {
|
|
@@ -10112,7 +10156,7 @@ app.get("/api/mobile-chat/providers", async (c) => {
|
|
|
10112
10156
|
});
|
|
10113
10157
|
app.get("/api/setup/status", async (c) => {
|
|
10114
10158
|
try {
|
|
10115
|
-
const { setupStatusTool } = await import("./setup-
|
|
10159
|
+
const { setupStatusTool } = await import("./setup-SMN7FJNZ.js");
|
|
10116
10160
|
const result = await setupStatusTool.handler({});
|
|
10117
10161
|
const data = JSON.parse(result.content[0].text);
|
|
10118
10162
|
const idbInstalled = await isIdbInstalled().catch(() => false);
|
package/dist/cli.js
CHANGED
|
@@ -11,6 +11,7 @@ import "./chunk-R5U7XKVJ.js";
|
|
|
11
11
|
import { Command } from "commander";
|
|
12
12
|
import chalk from "chalk";
|
|
13
13
|
import open from "open";
|
|
14
|
+
import { fileURLToPath } from "url";
|
|
14
15
|
var program = new Command();
|
|
15
16
|
var binName = process.argv[1]?.replace(/.*[\\/]/, "").replace(/\.[^.]+$/, "") === "applab" ? "applab" : "discoverylab";
|
|
16
17
|
program.name(binName).description("AI-powered app testing & evidence generator - Claude Code Plugin").version(APP_VERSION);
|
|
@@ -389,7 +390,7 @@ program.command("serve").alias("server").description("Start the DiscoveryLab web
|
|
|
389
390
|
console.log(chalk.cyan("\n DiscoveryLab"));
|
|
390
391
|
console.log(chalk.gray(" AI-powered app testing & evidence generator\n"));
|
|
391
392
|
try {
|
|
392
|
-
const { startServer } = await import("./server-
|
|
393
|
+
const { startServer } = await import("./server-C2NZM2RV.js");
|
|
393
394
|
await startServer(port);
|
|
394
395
|
console.log(chalk.green(` Server running at http://localhost:${port}`));
|
|
395
396
|
console.log(chalk.gray(" Press Ctrl+C to stop\n"));
|
|
@@ -404,7 +405,7 @@ program.command("serve").alias("server").description("Start the DiscoveryLab web
|
|
|
404
405
|
program.command("setup").description("Check and configure DiscoveryLab dependencies").action(async () => {
|
|
405
406
|
console.log(chalk.cyan("\n DiscoveryLab Setup\n"));
|
|
406
407
|
try {
|
|
407
|
-
const { setupStatusTool } = await import("./setup-
|
|
408
|
+
const { setupStatusTool } = await import("./setup-SMN7FJNZ.js");
|
|
408
409
|
const result = await setupStatusTool.handler({});
|
|
409
410
|
if (result.isError) {
|
|
410
411
|
console.error(chalk.red(" Setup check failed"));
|
|
@@ -459,7 +460,11 @@ program.command("install").description("Install DiscoveryLab as MCP server for C
|
|
|
459
460
|
const { existsSync, readFileSync, writeFileSync, mkdirSync } = await import("fs");
|
|
460
461
|
const { join, dirname } = await import("path");
|
|
461
462
|
const home = homedir();
|
|
462
|
-
const
|
|
463
|
+
const localMcpEntrypoint = fileURLToPath(new URL("./index.js", import.meta.url));
|
|
464
|
+
const mcpEntry = existsSync(localMcpEntrypoint) ? {
|
|
465
|
+
command: process.execPath,
|
|
466
|
+
args: [localMcpEntrypoint]
|
|
467
|
+
} : {
|
|
463
468
|
command: "npx",
|
|
464
469
|
args: ["-y", "@veolab/discoverylab@latest", "mcp"]
|
|
465
470
|
};
|
|
@@ -531,7 +536,7 @@ program.command("mcp").description("Run as MCP server (for Claude Code integrati
|
|
|
531
536
|
try {
|
|
532
537
|
const { getDatabase } = await import("./db-5ECN3O7F.js");
|
|
533
538
|
getDatabase();
|
|
534
|
-
const { mcpServer } = await import("./server-
|
|
539
|
+
const { mcpServer } = await import("./server-WN6DCCUA.js");
|
|
535
540
|
const {
|
|
536
541
|
uiTools,
|
|
537
542
|
projectTools,
|
|
@@ -545,7 +550,7 @@ program.command("mcp").description("Run as MCP server (for Claude Code integrati
|
|
|
545
550
|
taskHubTools,
|
|
546
551
|
esvpTools,
|
|
547
552
|
knowledgeTools
|
|
548
|
-
} = await import("./tools-
|
|
553
|
+
} = await import("./tools-VXU3JEQP.js");
|
|
549
554
|
mcpServer.registerTools([
|
|
550
555
|
...uiTools,
|
|
551
556
|
...projectTools,
|
package/dist/index.d.ts
CHANGED
|
@@ -13,16 +13,35 @@ interface MCPTool {
|
|
|
13
13
|
name: string;
|
|
14
14
|
description: string;
|
|
15
15
|
inputSchema: z.ZodType<any>;
|
|
16
|
+
_meta?: Record<string, any>;
|
|
16
17
|
handler: (params: any) => Promise<MCPToolResult>;
|
|
17
18
|
}
|
|
19
|
+
interface MCPToolContent {
|
|
20
|
+
type: 'text' | 'image';
|
|
21
|
+
text?: string;
|
|
22
|
+
data?: string;
|
|
23
|
+
mimeType?: string;
|
|
24
|
+
}
|
|
18
25
|
interface MCPToolResult {
|
|
19
|
-
content:
|
|
20
|
-
type: 'text' | 'image';
|
|
21
|
-
text?: string;
|
|
22
|
-
data?: string;
|
|
23
|
-
mimeType?: string;
|
|
24
|
-
}>;
|
|
26
|
+
content: MCPToolContent[];
|
|
25
27
|
isError?: boolean;
|
|
28
|
+
structuredContent?: Record<string, any>;
|
|
29
|
+
_meta?: Record<string, any>;
|
|
30
|
+
}
|
|
31
|
+
interface MCPResourceContents {
|
|
32
|
+
uri: string;
|
|
33
|
+
mimeType: string;
|
|
34
|
+
text?: string;
|
|
35
|
+
blob?: string;
|
|
36
|
+
_meta?: Record<string, any>;
|
|
37
|
+
}
|
|
38
|
+
interface MCPResource {
|
|
39
|
+
uri: string;
|
|
40
|
+
name: string;
|
|
41
|
+
title?: string;
|
|
42
|
+
description?: string;
|
|
43
|
+
mimeType: string;
|
|
44
|
+
contents?: MCPResourceContents[];
|
|
26
45
|
}
|
|
27
46
|
interface MCPRequest {
|
|
28
47
|
jsonrpc: '2.0';
|
|
@@ -42,12 +61,17 @@ interface MCPResponse {
|
|
|
42
61
|
}
|
|
43
62
|
declare class MCPServer {
|
|
44
63
|
private tools;
|
|
64
|
+
private resources;
|
|
45
65
|
private serverInfo;
|
|
46
66
|
registerTool(tool: MCPTool): void;
|
|
47
67
|
registerTools(tools: MCPTool[]): void;
|
|
68
|
+
registerResource(resource: MCPResource): void;
|
|
69
|
+
upsertResourceContents(uri: string, resource: Omit<MCPResource, 'uri'>): void;
|
|
48
70
|
handleRequest(request: MCPRequest): Promise<MCPResponse>;
|
|
49
71
|
private handleInitialize;
|
|
50
72
|
private handleToolsList;
|
|
73
|
+
private handleResourcesList;
|
|
74
|
+
private handleResourcesRead;
|
|
51
75
|
private handleToolCall;
|
|
52
76
|
private zodToJsonSchema;
|
|
53
77
|
runStdio(): Promise<void>;
|
package/dist/index.html
CHANGED
|
@@ -927,7 +927,7 @@
|
|
|
927
927
|
.project-claude-action {
|
|
928
928
|
position: absolute;
|
|
929
929
|
top: 8px;
|
|
930
|
-
|
|
930
|
+
right: 8px;
|
|
931
931
|
display: inline-flex;
|
|
932
932
|
align-items: center;
|
|
933
933
|
justify-content: center;
|
|
@@ -944,13 +944,20 @@
|
|
|
944
944
|
backdrop-filter: blur(10px);
|
|
945
945
|
}
|
|
946
946
|
|
|
947
|
+
.project-claude-action.secondary {
|
|
948
|
+
background: rgba(18, 24, 34, 0.6);
|
|
949
|
+
border-color: rgba(255, 255, 255, 0.1);
|
|
950
|
+
color: var(--text-secondary);
|
|
951
|
+
}
|
|
952
|
+
|
|
947
953
|
.project-claude-action:hover {
|
|
948
954
|
transform: translateY(-1px);
|
|
949
955
|
border-color: rgba(245, 240, 230, 0.5);
|
|
950
956
|
background: rgba(17, 24, 32, 0.92);
|
|
951
957
|
}
|
|
952
958
|
|
|
953
|
-
.project-claude-action svg
|
|
959
|
+
.project-claude-action svg,
|
|
960
|
+
.project-claude-action img {
|
|
954
961
|
width: 16px;
|
|
955
962
|
height: 16px;
|
|
956
963
|
}
|
|
@@ -1092,10 +1099,12 @@
|
|
|
1092
1099
|
transform: none;
|
|
1093
1100
|
}
|
|
1094
1101
|
|
|
1095
|
-
.claude-action-btn svg
|
|
1102
|
+
.claude-action-btn svg,
|
|
1103
|
+
.claude-action-btn img {
|
|
1096
1104
|
width: 14px;
|
|
1097
1105
|
height: 14px;
|
|
1098
1106
|
flex-shrink: 0;
|
|
1107
|
+
object-fit: contain;
|
|
1099
1108
|
}
|
|
1100
1109
|
|
|
1101
1110
|
.project-meta {
|
|
@@ -8235,14 +8244,19 @@
|
|
|
8235
8244
|
|
|
8236
8245
|
function getClaudeIconSvg() {
|
|
8237
8246
|
return `
|
|
8238
|
-
<
|
|
8239
|
-
<path d="M12 3.5c-2.1 0-3.8 1-4.9 2.8C4.9 6.5 3.5 8.4 3.5 11c0 3.9 2.9 6.8 7.1 8.7a3 3 0 0 0 2.8 0c4.1-1.9 7.1-4.8 7.1-8.7 0-2.6-1.4-4.5-3.6-4.7C15.8 4.5 14.1 3.5 12 3.5Z" stroke="currentColor" stroke-width="1.5"/>
|
|
8240
|
-
<path d="M8.5 10.5c.9-1 2.1-1.5 3.5-1.5s2.6.5 3.5 1.5" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
|
|
8241
|
-
<path d="M9.2 13.8c.8.7 1.7 1.1 2.8 1.1 1 0 2-.4 2.8-1.1" stroke="currentColor" stroke-width="1.5" stroke-linecap="round"/>
|
|
8242
|
-
</svg>
|
|
8247
|
+
<img src="/assets/icons/icons8-claude-150.png" alt="" aria-hidden="true" />
|
|
8243
8248
|
`;
|
|
8244
8249
|
}
|
|
8245
8250
|
|
|
8251
|
+
function projectHasRenderableThumb(project) {
|
|
8252
|
+
if (!project) return false;
|
|
8253
|
+
if (project.thumbnailPath) return true;
|
|
8254
|
+
if (!project.videoPath) return false;
|
|
8255
|
+
|
|
8256
|
+
const ext = String(project.videoPath).toLowerCase().split('.').pop();
|
|
8257
|
+
return ['png', 'jpg', 'jpeg', 'gif', 'webp', 'mp4', 'mov', 'webm'].includes(ext);
|
|
8258
|
+
}
|
|
8259
|
+
|
|
8246
8260
|
function isProjectReadyForClaude(project) {
|
|
8247
8261
|
if (!project) return false;
|
|
8248
8262
|
if (isProjectAnalyzing(project.status || '')) return false;
|
|
@@ -8265,14 +8279,22 @@
|
|
|
8265
8279
|
}
|
|
8266
8280
|
|
|
8267
8281
|
function renderClaudeProjectQuickAction(project) {
|
|
8268
|
-
if (!claudeDesktopStatus.
|
|
8282
|
+
if (!isProjectReadyForClaude(project) || !claudeDesktopStatus.launcherSupported || !projectHasRenderableThumb(project)) {
|
|
8269
8283
|
return '';
|
|
8270
8284
|
}
|
|
8271
8285
|
|
|
8272
|
-
const
|
|
8286
|
+
const setupNeeded = claudeDesktopStatus.appDetected && !claudeDesktopStatus.mcpConfigured;
|
|
8287
|
+
const ready = claudeDesktopStatus.ready;
|
|
8288
|
+
const promptTitle = ready
|
|
8289
|
+
? `Copy prompt and open ${project.name} in Claude Desktop`
|
|
8290
|
+
: setupNeeded
|
|
8291
|
+
? `Copy the ${project.name} prompt and open Claude Desktop`
|
|
8292
|
+
: `Copy the ${project.name} prompt and check Claude Desktop`;
|
|
8293
|
+
const buttonClass = ready ? 'project-claude-action' : 'project-claude-action secondary';
|
|
8294
|
+
|
|
8273
8295
|
return `
|
|
8274
8296
|
<button
|
|
8275
|
-
class="
|
|
8297
|
+
class="${buttonClass}"
|
|
8276
8298
|
type="button"
|
|
8277
8299
|
data-project-id="${escapeAttr(project.id)}"
|
|
8278
8300
|
title="${escapeAttr(promptTitle)}"
|
|
@@ -8298,7 +8320,7 @@
|
|
|
8298
8320
|
: !projectReady
|
|
8299
8321
|
? 'Analyze first'
|
|
8300
8322
|
: setupNeeded
|
|
8301
|
-
? 'Copy
|
|
8323
|
+
? 'Copy prompt'
|
|
8302
8324
|
: 'Reload';
|
|
8303
8325
|
const buttonClass = ready ? 'claude-action-btn' : 'claude-action-btn secondary';
|
|
8304
8326
|
const action = ready
|
|
@@ -8306,7 +8328,7 @@
|
|
|
8306
8328
|
: !projectReady
|
|
8307
8329
|
? ''
|
|
8308
8330
|
: setupNeeded
|
|
8309
|
-
? '
|
|
8331
|
+
? 'copyCurrentProjectClaudePrompt()'
|
|
8310
8332
|
: 'refreshClaudeDesktopStatus()';
|
|
8311
8333
|
|
|
8312
8334
|
return `
|
|
@@ -8383,6 +8405,30 @@
|
|
|
8383
8405
|
});
|
|
8384
8406
|
}
|
|
8385
8407
|
|
|
8408
|
+
async function copyClaudeProjectPrompt(project) {
|
|
8409
|
+
if (!project) return false;
|
|
8410
|
+
|
|
8411
|
+
const copied = await copyToClipboard(buildClaudeDesktopPrompt(project), { silent: true });
|
|
8412
|
+
if (!copied) {
|
|
8413
|
+
showToast('Failed to copy Claude Desktop prompt', 'error');
|
|
8414
|
+
return false;
|
|
8415
|
+
}
|
|
8416
|
+
|
|
8417
|
+
return true;
|
|
8418
|
+
}
|
|
8419
|
+
|
|
8420
|
+
async function copyCurrentProjectClaudePrompt() {
|
|
8421
|
+
if (!currentProject?.id) {
|
|
8422
|
+
showToast('Select a project first', 'warning');
|
|
8423
|
+
return;
|
|
8424
|
+
}
|
|
8425
|
+
|
|
8426
|
+
const copied = await copyClaudeProjectPrompt(currentProject);
|
|
8427
|
+
if (!copied) return;
|
|
8428
|
+
|
|
8429
|
+
showToast('Claude Desktop prompt copied', 'success');
|
|
8430
|
+
}
|
|
8431
|
+
|
|
8386
8432
|
async function launchClaudeDesktop() {
|
|
8387
8433
|
const response = await fetch('/api/integrations/claude-desktop/launch', { method: 'POST' });
|
|
8388
8434
|
const data = await response.json();
|
|
@@ -8394,9 +8440,8 @@
|
|
|
8394
8440
|
async function copyPromptAndLaunchClaude(project) {
|
|
8395
8441
|
if (!project) return;
|
|
8396
8442
|
|
|
8397
|
-
const copied = await
|
|
8443
|
+
const copied = await copyClaudeProjectPrompt(project);
|
|
8398
8444
|
if (!copied) {
|
|
8399
|
-
showToast('Failed to copy Claude Desktop prompt', 'error');
|
|
8400
8445
|
return;
|
|
8401
8446
|
}
|
|
8402
8447
|
|
|
@@ -8417,11 +8462,17 @@
|
|
|
8417
8462
|
|
|
8418
8463
|
if (!claudeDesktopStatus.ready) {
|
|
8419
8464
|
if (claudeDesktopStatus.appDetected && !claudeDesktopStatus.mcpConfigured) {
|
|
8420
|
-
|
|
8465
|
+
const copied = await copyClaudeProjectPrompt(project);
|
|
8466
|
+
if (copied) {
|
|
8467
|
+
showToast('Project prompt copied. Enable the DiscoveryLab extension in Claude Desktop to open it there.', 'warning');
|
|
8468
|
+
}
|
|
8421
8469
|
return;
|
|
8422
8470
|
}
|
|
8423
8471
|
|
|
8424
|
-
|
|
8472
|
+
const copied = await copyClaudeProjectPrompt(project);
|
|
8473
|
+
if (copied) {
|
|
8474
|
+
showToast(claudeDesktopStatus.message || 'Project prompt copied. Claude Desktop is not ready yet.', 'warning');
|
|
8475
|
+
}
|
|
8425
8476
|
return;
|
|
8426
8477
|
}
|
|
8427
8478
|
|
|
@@ -22371,8 +22422,8 @@ appId: ${platform === 'ios' ? 'com.apple.Preferences' : 'com.android.settings'}
|
|
|
22371
22422
|
jpg: 'Exports the current capture as JPEG images.',
|
|
22372
22423
|
mp4: 'Exports the current capture as an MP4 video.',
|
|
22373
22424
|
gif: 'Exports the current capture as an animated GIF.',
|
|
22374
|
-
applab: 'Packages
|
|
22375
|
-
esvp: 'Packages
|
|
22425
|
+
applab: 'Packages a Claude-friendly App Lab bundle: analyzed frames, thumbnail, OCR, app intelligence, network trace, ESVP snapshot, and Task Hub metadata without heavy renders or long recordings.',
|
|
22426
|
+
esvp: 'Packages a lightweight ESVP-ready bundle with analyzed frames, OCR, app intelligence, network trace, and the attached ESVP snapshot when available.',
|
|
22376
22427
|
};
|
|
22377
22428
|
|
|
22378
22429
|
help.textContent = descriptions[select.value] || '';
|
package/dist/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
startServer,
|
|
4
4
|
stopServer
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-V6RREMYD.js";
|
|
6
6
|
import {
|
|
7
7
|
analyzeTools,
|
|
8
8
|
canvasTools,
|
|
@@ -16,15 +16,15 @@ import {
|
|
|
16
16
|
templateTools,
|
|
17
17
|
testingTools,
|
|
18
18
|
uiTools
|
|
19
|
-
} from "./chunk-
|
|
19
|
+
} from "./chunk-Q7Q3A2ZI.js";
|
|
20
20
|
import "./chunk-34GGYFXX.js";
|
|
21
21
|
import "./chunk-PMCXEA7J.js";
|
|
22
22
|
import {
|
|
23
23
|
setupTools
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-JAA53ES7.js";
|
|
25
25
|
import {
|
|
26
26
|
mcpServer
|
|
27
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-TWRWARU4.js";
|
|
28
28
|
import "./chunk-6GK5K6CS.js";
|
|
29
29
|
import "./chunk-7R5YNOXE.js";
|
|
30
30
|
import "./chunk-3ERJNXYM.js";
|
package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/better_sqlite3.node.d
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
cmd_Release/better_sqlite3.node := c++ -bundle -undefined dynamic_lookup -Wl,-search_paths_first -Wl,-dead_strip -mmacosx-version-min=10.7 -arch arm64 -L./Release -stdlib=libc++ -o Release/better_sqlite3.node Release/obj.target/better_sqlite3/src/better_sqlite3.o Release/sqlite3.a
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
cmd_Release/obj.target/better_sqlite3/src/better_sqlite3.o := c++ -o Release/obj.target/better_sqlite3/src/better_sqlite3.o ../src/better_sqlite3.cpp '-DNODE_GYP_MODULE_NAME=better_sqlite3' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_FILE_OFFSET_BITS=64' '-D_DARWIN_USE_64_BIT_INODE=1' '-D_LARGEFILE_SOURCE' '-DOPENSSL_NO_PINSHARED' '-DOPENSSL_THREADS' '-DBUILDING_NODE_EXTENSION' '-DNDEBUG' -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/src -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/openssl/config -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/openssl/openssl/include -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/uv/include -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/zlib -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/v8/include -I./Release/obj/gen/sqlite3 -O3 -fno-strict-aliasing -mmacosx-version-min=10.7 -arch arm64 -Wall -Wendif-labels -W -Wno-unused-parameter -std=gnu++20 -stdlib=libc++ -fno-rtti -fno-exceptions -fvisibility-inlines-hidden -std=c++20 -stdlib=libc++ -MMD -MF ./Release/.deps/Release/obj.target/better_sqlite3/src/better_sqlite3.o.d.raw -c
|
|
2
|
+
Release/obj.target/better_sqlite3/src/better_sqlite3.o: \
|
|
3
|
+
../src/better_sqlite3.cpp ../src/better_sqlite3.hpp \
|
|
4
|
+
Release/obj/gen/sqlite3/sqlite3.h \
|
|
5
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/node.h \
|
|
6
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8.h \
|
|
7
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/cppgc/common.h \
|
|
8
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8config.h \
|
|
9
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-array-buffer.h \
|
|
10
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-local-handle.h \
|
|
11
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-handle-base.h \
|
|
12
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-internal.h \
|
|
13
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-memory-span.h \
|
|
14
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-object.h \
|
|
15
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-maybe.h \
|
|
16
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/cppgc/internal/conditional-stack-allocated.h \
|
|
17
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/cppgc/macros.h \
|
|
18
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/cppgc/internal/compiler-specific.h \
|
|
19
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/cppgc/type-traits.h \
|
|
20
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-persistent-handle.h \
|
|
21
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-weak-callback-info.h \
|
|
22
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-primitive.h \
|
|
23
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-data.h \
|
|
24
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-value.h \
|
|
25
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-sandbox.h \
|
|
26
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-traced-handle.h \
|
|
27
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-platform.h \
|
|
28
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-source-location.h \
|
|
29
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-container.h \
|
|
30
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-context.h \
|
|
31
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-snapshot.h \
|
|
32
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-isolate.h \
|
|
33
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-callbacks.h \
|
|
34
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-promise.h \
|
|
35
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-debug.h \
|
|
36
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-script.h \
|
|
37
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-message.h \
|
|
38
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-embedder-heap.h \
|
|
39
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-exception.h \
|
|
40
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-function-callback.h \
|
|
41
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-microtask.h \
|
|
42
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-statistics.h \
|
|
43
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-unwinder.h \
|
|
44
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-embedder-state-scope.h \
|
|
45
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-date.h \
|
|
46
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-extension.h \
|
|
47
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-external.h \
|
|
48
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-function.h \
|
|
49
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-template.h \
|
|
50
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-initialization.h \
|
|
51
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-json.h \
|
|
52
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-locker.h \
|
|
53
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-microtask-queue.h \
|
|
54
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-primitive-object.h \
|
|
55
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-proxy.h \
|
|
56
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-regexp.h \
|
|
57
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-typed-array.h \
|
|
58
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-value-serializer.h \
|
|
59
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-version.h \
|
|
60
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-wasm.h \
|
|
61
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/node_version.h \
|
|
62
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/node_api.h \
|
|
63
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/js_native_api.h \
|
|
64
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/js_native_api_types.h \
|
|
65
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/node_api_types.h \
|
|
66
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/node_object_wrap.h \
|
|
67
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/node_buffer.h
|
|
68
|
+
../src/better_sqlite3.cpp:
|
|
69
|
+
../src/better_sqlite3.hpp:
|
|
70
|
+
Release/obj/gen/sqlite3/sqlite3.h:
|
|
71
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/node.h:
|
|
72
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8.h:
|
|
73
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/cppgc/common.h:
|
|
74
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8config.h:
|
|
75
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-array-buffer.h:
|
|
76
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-local-handle.h:
|
|
77
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-handle-base.h:
|
|
78
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-internal.h:
|
|
79
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-memory-span.h:
|
|
80
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-object.h:
|
|
81
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-maybe.h:
|
|
82
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/cppgc/internal/conditional-stack-allocated.h:
|
|
83
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/cppgc/macros.h:
|
|
84
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/cppgc/internal/compiler-specific.h:
|
|
85
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/cppgc/type-traits.h:
|
|
86
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-persistent-handle.h:
|
|
87
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-weak-callback-info.h:
|
|
88
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-primitive.h:
|
|
89
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-data.h:
|
|
90
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-value.h:
|
|
91
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-sandbox.h:
|
|
92
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-traced-handle.h:
|
|
93
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-platform.h:
|
|
94
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-source-location.h:
|
|
95
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-container.h:
|
|
96
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-context.h:
|
|
97
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-snapshot.h:
|
|
98
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-isolate.h:
|
|
99
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-callbacks.h:
|
|
100
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-promise.h:
|
|
101
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-debug.h:
|
|
102
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-script.h:
|
|
103
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-message.h:
|
|
104
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-embedder-heap.h:
|
|
105
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-exception.h:
|
|
106
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-function-callback.h:
|
|
107
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-microtask.h:
|
|
108
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-statistics.h:
|
|
109
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-unwinder.h:
|
|
110
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-embedder-state-scope.h:
|
|
111
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-date.h:
|
|
112
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-extension.h:
|
|
113
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-external.h:
|
|
114
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-function.h:
|
|
115
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-template.h:
|
|
116
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-initialization.h:
|
|
117
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-json.h:
|
|
118
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-locker.h:
|
|
119
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-microtask-queue.h:
|
|
120
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-primitive-object.h:
|
|
121
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-proxy.h:
|
|
122
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-regexp.h:
|
|
123
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-typed-array.h:
|
|
124
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-value-serializer.h:
|
|
125
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-version.h:
|
|
126
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/v8-wasm.h:
|
|
127
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/node_version.h:
|
|
128
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/node_api.h:
|
|
129
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/js_native_api.h:
|
|
130
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/js_native_api_types.h:
|
|
131
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/node_api_types.h:
|
|
132
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/node_object_wrap.h:
|
|
133
|
+
/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node/node_buffer.h:
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
cmd_Release/obj.target/deps/locate_sqlite3.stamp := touch Release/obj.target/deps/locate_sqlite3.stamp
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
cmd_Release/obj.target/sqlite3/gen/sqlite3/sqlite3.o := cc -o Release/obj.target/sqlite3/gen/sqlite3/sqlite3.o Release/obj/gen/sqlite3/sqlite3.c '-DNODE_GYP_MODULE_NAME=sqlite3' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_FILE_OFFSET_BITS=64' '-D_DARWIN_USE_64_BIT_INODE=1' '-D_LARGEFILE_SOURCE' '-DOPENSSL_NO_PINSHARED' '-DOPENSSL_THREADS' '-DHAVE_INT16_T=1' '-DHAVE_INT32_T=1' '-DHAVE_INT8_T=1' '-DHAVE_STDINT_H=1' '-DHAVE_UINT16_T=1' '-DHAVE_UINT32_T=1' '-DHAVE_UINT8_T=1' '-DHAVE_USLEEP=1' '-DSQLITE_DEFAULT_CACHE_SIZE=-16000' '-DSQLITE_DEFAULT_FOREIGN_KEYS=1' '-DSQLITE_DEFAULT_MEMSTATUS=0' '-DSQLITE_DEFAULT_WAL_SYNCHRONOUS=1' '-DSQLITE_DQS=0' '-DSQLITE_ENABLE_COLUMN_METADATA' '-DSQLITE_ENABLE_DBSTAT_VTAB' '-DSQLITE_ENABLE_DESERIALIZE' '-DSQLITE_ENABLE_FTS3' '-DSQLITE_ENABLE_FTS3_PARENTHESIS' '-DSQLITE_ENABLE_FTS4' '-DSQLITE_ENABLE_FTS5' '-DSQLITE_ENABLE_GEOPOLY' '-DSQLITE_ENABLE_JSON1' '-DSQLITE_ENABLE_MATH_FUNCTIONS' '-DSQLITE_ENABLE_RTREE' '-DSQLITE_ENABLE_STAT4' '-DSQLITE_ENABLE_UPDATE_DELETE_LIMIT' '-DSQLITE_LIKE_DOESNT_MATCH_BLOBS' '-DSQLITE_OMIT_DEPRECATED' '-DSQLITE_OMIT_PROGRESS_CALLBACK' '-DSQLITE_OMIT_SHARED_CACHE' '-DSQLITE_OMIT_TCL_VARIABLE' '-DSQLITE_SOUNDEX' '-DSQLITE_THREADSAFE=2' '-DSQLITE_TRACE_SIZE_LIMIT=32' '-DSQLITE_USE_URI=0' '-DNDEBUG' -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/src -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/openssl/config -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/openssl/openssl/include -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/uv/include -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/zlib -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/v8/include -I./Release/obj/gen/sqlite3 -O3 -fno-strict-aliasing -mmacosx-version-min=10.7 -arch arm64 -Wall -Wendif-labels -W -Wno-unused-parameter -w -std=c99 -MMD -MF ./Release/.deps/Release/obj.target/sqlite3/gen/sqlite3/sqlite3.o.d.raw -c
|
|
2
|
+
Release/obj.target/sqlite3/gen/sqlite3/sqlite3.o: \
|
|
3
|
+
Release/obj/gen/sqlite3/sqlite3.c
|
|
4
|
+
Release/obj/gen/sqlite3/sqlite3.c:
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
cmd_Release/obj.target/test_extension/deps/test_extension.o := cc -o Release/obj.target/test_extension/deps/test_extension.o ../deps/test_extension.c '-DNODE_GYP_MODULE_NAME=test_extension' '-DUSING_UV_SHARED=1' '-DUSING_V8_SHARED=1' '-DV8_DEPRECATION_WARNINGS=1' '-D_GLIBCXX_USE_CXX11_ABI=1' '-D_FILE_OFFSET_BITS=64' '-D_DARWIN_USE_64_BIT_INODE=1' '-D_LARGEFILE_SOURCE' '-DOPENSSL_NO_PINSHARED' '-DOPENSSL_THREADS' '-DBUILDING_NODE_EXTENSION' '-DNDEBUG' -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/include/node -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/src -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/openssl/config -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/openssl/openssl/include -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/uv/include -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/zlib -I/Users/andersonmelo/Library/Caches/node-gyp/24.11.1/deps/v8/include -I./Release/obj/gen/sqlite3 -O3 -fno-strict-aliasing -mmacosx-version-min=10.7 -arch arm64 -Wall -Wendif-labels -W -Wno-unused-parameter -MMD -MF ./Release/.deps/Release/obj.target/test_extension/deps/test_extension.o.d.raw -c
|
|
2
|
+
Release/obj.target/test_extension/deps/test_extension.o: \
|
|
3
|
+
../deps/test_extension.c Release/obj/gen/sqlite3/sqlite3ext.h \
|
|
4
|
+
Release/obj/gen/sqlite3/sqlite3.h
|
|
5
|
+
../deps/test_extension.c:
|
|
6
|
+
Release/obj/gen/sqlite3/sqlite3ext.h:
|
|
7
|
+
Release/obj/gen/sqlite3/sqlite3.h:
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
cmd_Release/sqlite3.a := rm -f Release/sqlite3.a && /Applications/Xcode.app/Contents/Developer/usr/bin/python3 gyp-mac-tool filter-libtool libtool -static -o Release/sqlite3.a Release/obj.target/sqlite3/gen/sqlite3/sqlite3.o
|
package/dist/mcpb/node_modules/better-sqlite3/build/Release/.deps/Release/test_extension.node.d
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
cmd_Release/test_extension.node := c++ -bundle -undefined dynamic_lookup -Wl,-search_paths_first -Wl,-dead_strip -mmacosx-version-min=10.7 -arch arm64 -L./Release -stdlib=libc++ -o Release/test_extension.node Release/obj.target/test_extension/deps/test_extension.o Release/sqlite3.a
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
cmd_ba23eeee118cd63e16015df367567cb043fed872.intermediate := LD_LIBRARY_PATH=/Users/andersonmelo/work/ander.ai/veolab/applab-discovery/node_modules/better-sqlite3/build/Release/lib.host:/Users/andersonmelo/work/ander.ai/veolab/applab-discovery/node_modules/better-sqlite3/build/Release/lib.target:$$LD_LIBRARY_PATH; export LD_LIBRARY_PATH; cd ../deps; mkdir -p /Users/andersonmelo/work/ander.ai/veolab/applab-discovery/node_modules/better-sqlite3/build/Release/obj/gen/sqlite3; node copy.js "/Users/andersonmelo/work/ander.ai/veolab/applab-discovery/node_modules/better-sqlite3/build/Release/obj/gen/sqlite3" ""
|
|
@@ -5,8 +5,8 @@ import {
|
|
|
5
5
|
setupReplayStatusTool,
|
|
6
6
|
setupStatusTool,
|
|
7
7
|
setupTools
|
|
8
|
-
} from "./chunk-
|
|
9
|
-
import "./chunk-
|
|
8
|
+
} from "./chunk-JAA53ES7.js";
|
|
9
|
+
import "./chunk-TWRWARU4.js";
|
|
10
10
|
import "./chunk-GRU332L4.js";
|
|
11
11
|
import "./chunk-6EGBXRDK.js";
|
|
12
12
|
import "./chunk-YYOK2RF7.js";
|
|
@@ -107,7 +107,7 @@ import {
|
|
|
107
107
|
uiStatusTool,
|
|
108
108
|
uiTools,
|
|
109
109
|
videoInfoTool
|
|
110
|
-
} from "./chunk-
|
|
110
|
+
} from "./chunk-Q7Q3A2ZI.js";
|
|
111
111
|
import "./chunk-34GGYFXX.js";
|
|
112
112
|
import "./chunk-PMCXEA7J.js";
|
|
113
113
|
import {
|
|
@@ -116,8 +116,8 @@ import {
|
|
|
116
116
|
setupReplayStatusTool,
|
|
117
117
|
setupStatusTool,
|
|
118
118
|
setupTools
|
|
119
|
-
} from "./chunk-
|
|
120
|
-
import "./chunk-
|
|
119
|
+
} from "./chunk-JAA53ES7.js";
|
|
120
|
+
import "./chunk-TWRWARU4.js";
|
|
121
121
|
import "./chunk-7R5YNOXE.js";
|
|
122
122
|
import "./chunk-3ERJNXYM.js";
|
|
123
123
|
import "./chunk-LB3RNE3O.js";
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@veolab/discoverylab",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.5",
|
|
4
4
|
"description": "AI-powered app testing & evidence generator - Claude Code Plugin",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
"dev": "tsx watch src/cli.ts serve",
|
|
13
13
|
"build": "tsup src/index.ts src/cli.ts --format esm --dts --clean && cp src/web/index.html dist/index.html && mkdir -p dist/visualizations dist/export && cp src/core/visualizations/templates/*.html dist/visualizations/ && cp src/core/export/infographic-template.html dist/export/ && node scripts/build-host-runtime.mjs --best-effort",
|
|
14
14
|
"build:host-runtime": "node scripts/build-host-runtime.mjs",
|
|
15
|
+
"mcpb:stage": "npm run build && node scripts/stage-mcpb.mjs",
|
|
16
|
+
"mcpb:pack": "npm run mcpb:stage && node scripts/pack-mcpb.mjs",
|
|
15
17
|
"pack:local": "npm run build && npm run build:host-runtime && node scripts/verify-host-runtime-bundle.mjs && npm pack",
|
|
16
18
|
"prepack": "npm run build && npm run build:host-runtime && node scripts/verify-host-runtime-bundle.mjs",
|
|
17
19
|
"start": "node dist/cli.js serve",
|
|
@@ -68,7 +70,7 @@
|
|
|
68
70
|
"claude-plugin": {
|
|
69
71
|
"name": "DiscoveryLab",
|
|
70
72
|
"description": "AI-powered app testing & evidence generator",
|
|
71
|
-
"version": "1.6.
|
|
73
|
+
"version": "1.6.5",
|
|
72
74
|
"tools": [
|
|
73
75
|
"dlab.capture.screen",
|
|
74
76
|
"dlab.capture.emulator",
|
|
@@ -107,7 +109,11 @@
|
|
|
107
109
|
"dlab.project.save",
|
|
108
110
|
"dlab.project.export",
|
|
109
111
|
"dlab.setup.status",
|
|
112
|
+
"dlab.setup.replay.status",
|
|
110
113
|
"dlab.setup.install",
|
|
114
|
+
"dlab.knowledge.search",
|
|
115
|
+
"dlab.knowledge.summary",
|
|
116
|
+
"dlab.knowledge.open",
|
|
111
117
|
"dlab.template.list",
|
|
112
118
|
"dlab.template.render"
|
|
113
119
|
]
|