dev3000 0.0.49 → 0.0.51
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +55 -6
- package/dist/cdp-monitor.d.ts.map +1 -1
- package/dist/cdp-monitor.js +54 -48
- package/dist/cdp-monitor.js.map +1 -1
- package/dist/cli.js +39 -33
- package/dist/cli.js.map +1 -1
- package/dist/dev-environment.d.ts +2 -0
- package/dist/dev-environment.d.ts.map +1 -1
- package/dist/dev-environment.js +212 -181
- package/dist/dev-environment.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/mcp-server/app/api/config/route.ts +7 -7
- package/mcp-server/app/api/logs/append/route.ts +59 -51
- package/mcp-server/app/api/logs/head/route.ts +22 -22
- package/mcp-server/app/api/logs/list/route.ts +39 -42
- package/mcp-server/app/api/logs/rotate/route.ts +28 -38
- package/mcp-server/app/api/logs/stream/route.ts +35 -35
- package/mcp-server/app/api/logs/tail/route.ts +22 -22
- package/mcp-server/app/api/mcp/[transport]/route.ts +189 -188
- package/mcp-server/app/api/replay/route.ts +217 -202
- package/mcp-server/app/layout.tsx +9 -8
- package/mcp-server/app/logs/LogsClient.test.ts +123 -99
- package/mcp-server/app/logs/LogsClient.tsx +724 -562
- package/mcp-server/app/logs/page.tsx +71 -72
- package/mcp-server/app/logs/utils.ts +99 -28
- package/mcp-server/app/page.tsx +10 -14
- package/mcp-server/app/replay/ReplayClient.tsx +120 -119
- package/mcp-server/app/replay/page.tsx +3 -3
- package/mcp-server/next.config.ts +2 -0
- package/mcp-server/package.json +5 -2
- package/mcp-server/pnpm-lock.yaml +37 -5
- package/mcp-server/tsconfig.json +4 -17
- package/package.json +16 -13
|
@@ -1,122 +1,124 @@
|
|
|
1
|
-
|
|
1
|
+
"use client"
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { useEffect, useState } from "react"
|
|
4
4
|
|
|
5
5
|
interface InteractionEvent {
|
|
6
|
-
timestamp: string
|
|
7
|
-
type:
|
|
8
|
-
x?: number
|
|
9
|
-
y?: number
|
|
10
|
-
target?: string
|
|
11
|
-
direction?: string
|
|
12
|
-
distance?: number
|
|
13
|
-
key?: string
|
|
6
|
+
timestamp: string
|
|
7
|
+
type: "CLICK" | "TAP" | "SCROLL" | "KEY"
|
|
8
|
+
x?: number
|
|
9
|
+
y?: number
|
|
10
|
+
target?: string
|
|
11
|
+
direction?: string
|
|
12
|
+
distance?: number
|
|
13
|
+
key?: string
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
interface NavigationEvent {
|
|
17
|
-
timestamp: string
|
|
18
|
-
url: string
|
|
17
|
+
timestamp: string
|
|
18
|
+
url: string
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
interface ScreenshotEvent {
|
|
22
|
-
timestamp: string
|
|
23
|
-
url: string
|
|
24
|
-
event: string
|
|
22
|
+
timestamp: string
|
|
23
|
+
url: string
|
|
24
|
+
event: string
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
interface ReplayData {
|
|
28
|
-
interactions: InteractionEvent[]
|
|
29
|
-
navigations: NavigationEvent[]
|
|
30
|
-
screenshots: ScreenshotEvent[]
|
|
31
|
-
startTime: string
|
|
32
|
-
endTime: string
|
|
33
|
-
duration: number
|
|
28
|
+
interactions: InteractionEvent[]
|
|
29
|
+
navigations: NavigationEvent[]
|
|
30
|
+
screenshots: ScreenshotEvent[]
|
|
31
|
+
startTime: string
|
|
32
|
+
endTime: string
|
|
33
|
+
duration: number
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
export default function ReplayClient() {
|
|
37
|
-
const [replayData, setReplayData] = useState<ReplayData | null>(null)
|
|
38
|
-
const [loading, setLoading] = useState(false)
|
|
39
|
-
const [selectedTimeRange,
|
|
40
|
-
start: string
|
|
41
|
-
end: string
|
|
42
|
-
} | null>(null)
|
|
43
|
-
const [playbackSpeed, setPlaybackSpeed] = useState(1)
|
|
44
|
-
const [isPlaying, setIsPlaying] = useState(false)
|
|
45
|
-
const [currentEventIndex, setCurrentEventIndex] = useState(0)
|
|
37
|
+
const [replayData, setReplayData] = useState<ReplayData | null>(null)
|
|
38
|
+
const [loading, setLoading] = useState(false)
|
|
39
|
+
const [selectedTimeRange, _setSelectedTimeRange] = useState<{
|
|
40
|
+
start: string
|
|
41
|
+
end: string
|
|
42
|
+
} | null>(null)
|
|
43
|
+
const [playbackSpeed, setPlaybackSpeed] = useState(1)
|
|
44
|
+
const [isPlaying, setIsPlaying] = useState(false)
|
|
45
|
+
const [currentEventIndex, setCurrentEventIndex] = useState(0)
|
|
46
46
|
|
|
47
47
|
const loadReplayData = async () => {
|
|
48
|
-
setLoading(true)
|
|
48
|
+
setLoading(true)
|
|
49
49
|
try {
|
|
50
|
-
const params = new URLSearchParams({ action:
|
|
50
|
+
const params = new URLSearchParams({ action: "parse" })
|
|
51
51
|
if (selectedTimeRange) {
|
|
52
|
-
params.set(
|
|
53
|
-
params.set(
|
|
52
|
+
params.set("startTime", selectedTimeRange.start)
|
|
53
|
+
params.set("endTime", selectedTimeRange.end)
|
|
54
54
|
}
|
|
55
|
-
|
|
56
|
-
const response = await fetch(`/api/replay?${params}`)
|
|
57
|
-
const data = await response.json()
|
|
58
|
-
|
|
55
|
+
|
|
56
|
+
const response = await fetch(`/api/replay?${params}`)
|
|
57
|
+
const data = await response.json()
|
|
58
|
+
|
|
59
59
|
if (response.ok) {
|
|
60
|
-
setReplayData(data)
|
|
60
|
+
setReplayData(data)
|
|
61
61
|
} else {
|
|
62
|
-
console.error(
|
|
62
|
+
console.error("Failed to load replay data:", data.error)
|
|
63
63
|
}
|
|
64
64
|
} catch (error) {
|
|
65
|
-
console.error(
|
|
65
|
+
console.error("Error loading replay data:", error)
|
|
66
66
|
}
|
|
67
|
-
setLoading(false)
|
|
68
|
-
}
|
|
67
|
+
setLoading(false)
|
|
68
|
+
}
|
|
69
69
|
|
|
70
70
|
useEffect(() => {
|
|
71
|
-
loadReplayData()
|
|
72
|
-
}, [
|
|
71
|
+
loadReplayData()
|
|
72
|
+
}, [loadReplayData])
|
|
73
73
|
|
|
74
|
-
const allEvents = replayData
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
74
|
+
const allEvents = replayData
|
|
75
|
+
? [
|
|
76
|
+
...replayData.interactions.map((i) => ({ ...i, eventType: "interaction" as const })),
|
|
77
|
+
...replayData.navigations.map((n) => ({ ...n, eventType: "navigation" as const }))
|
|
78
|
+
].sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime())
|
|
79
|
+
: []
|
|
78
80
|
|
|
79
81
|
const formatTimestamp = (timestamp: string) => {
|
|
80
|
-
return new Date(timestamp).toLocaleTimeString()
|
|
81
|
-
}
|
|
82
|
+
return new Date(timestamp).toLocaleTimeString()
|
|
83
|
+
}
|
|
82
84
|
|
|
83
85
|
const formatDuration = (ms: number) => {
|
|
84
|
-
const seconds = Math.floor(ms / 1000)
|
|
85
|
-
const minutes = Math.floor(seconds / 60)
|
|
86
|
-
return `${minutes}m ${seconds % 60}s
|
|
87
|
-
}
|
|
86
|
+
const seconds = Math.floor(ms / 1000)
|
|
87
|
+
const minutes = Math.floor(seconds / 60)
|
|
88
|
+
return `${minutes}m ${seconds % 60}s`
|
|
89
|
+
}
|
|
88
90
|
|
|
89
91
|
const startReplay = async () => {
|
|
90
|
-
if (!replayData) return
|
|
91
|
-
|
|
92
|
-
setIsPlaying(true)
|
|
93
|
-
setCurrentEventIndex(0)
|
|
94
|
-
|
|
92
|
+
if (!replayData) return
|
|
93
|
+
|
|
94
|
+
setIsPlaying(true)
|
|
95
|
+
setCurrentEventIndex(0)
|
|
96
|
+
|
|
95
97
|
// This is a simplified preview - in a full implementation,
|
|
96
98
|
// this would actually control a browser session
|
|
97
99
|
for (let i = 0; i < allEvents.length; i++) {
|
|
98
|
-
if (!isPlaying) break
|
|
99
|
-
|
|
100
|
-
setCurrentEventIndex(i)
|
|
101
|
-
|
|
102
|
-
const event = allEvents[i]
|
|
103
|
-
const nextEvent = allEvents[i + 1]
|
|
104
|
-
|
|
100
|
+
if (!isPlaying) break
|
|
101
|
+
|
|
102
|
+
setCurrentEventIndex(i)
|
|
103
|
+
|
|
104
|
+
const event = allEvents[i]
|
|
105
|
+
const nextEvent = allEvents[i + 1]
|
|
106
|
+
|
|
105
107
|
if (nextEvent) {
|
|
106
|
-
const currentTime = new Date(event.timestamp).getTime()
|
|
107
|
-
const nextTime = new Date(nextEvent.timestamp).getTime()
|
|
108
|
-
const delay = (nextTime - currentTime) / playbackSpeed
|
|
109
|
-
|
|
110
|
-
await new Promise(resolve => setTimeout(resolve, Math.min(delay, 5000)))
|
|
108
|
+
const currentTime = new Date(event.timestamp).getTime()
|
|
109
|
+
const nextTime = new Date(nextEvent.timestamp).getTime()
|
|
110
|
+
const delay = (nextTime - currentTime) / playbackSpeed
|
|
111
|
+
|
|
112
|
+
await new Promise((resolve) => setTimeout(resolve, Math.min(delay, 5000))) // Cap at 5s
|
|
111
113
|
}
|
|
112
114
|
}
|
|
113
|
-
|
|
114
|
-
setIsPlaying(false)
|
|
115
|
-
}
|
|
115
|
+
|
|
116
|
+
setIsPlaying(false)
|
|
117
|
+
}
|
|
116
118
|
|
|
117
119
|
const stopReplay = () => {
|
|
118
|
-
setIsPlaying(false)
|
|
119
|
-
}
|
|
120
|
+
setIsPlaying(false)
|
|
121
|
+
}
|
|
120
122
|
|
|
121
123
|
if (loading) {
|
|
122
124
|
return (
|
|
@@ -126,7 +128,7 @@ export default function ReplayClient() {
|
|
|
126
128
|
<div className="text-gray-500 text-sm mt-4">Loading replay data...</div>
|
|
127
129
|
</div>
|
|
128
130
|
</div>
|
|
129
|
-
)
|
|
131
|
+
)
|
|
130
132
|
}
|
|
131
133
|
|
|
132
134
|
return (
|
|
@@ -145,10 +147,10 @@ export default function ReplayClient() {
|
|
|
145
147
|
</div>
|
|
146
148
|
)}
|
|
147
149
|
</div>
|
|
148
|
-
|
|
150
|
+
|
|
149
151
|
<div className="flex items-center gap-2">
|
|
150
|
-
<select
|
|
151
|
-
value={playbackSpeed}
|
|
152
|
+
<select
|
|
153
|
+
value={playbackSpeed}
|
|
152
154
|
onChange={(e) => setPlaybackSpeed(Number(e.target.value))}
|
|
153
155
|
className="px-3 py-1 border border-gray-300 rounded text-sm"
|
|
154
156
|
>
|
|
@@ -158,7 +160,7 @@ export default function ReplayClient() {
|
|
|
158
160
|
<option value={4}>4x</option>
|
|
159
161
|
<option value={8}>8x</option>
|
|
160
162
|
</select>
|
|
161
|
-
|
|
163
|
+
|
|
162
164
|
{!isPlaying ? (
|
|
163
165
|
<button
|
|
164
166
|
onClick={startReplay}
|
|
@@ -168,10 +170,7 @@ export default function ReplayClient() {
|
|
|
168
170
|
▶ Play
|
|
169
171
|
</button>
|
|
170
172
|
) : (
|
|
171
|
-
<button
|
|
172
|
-
onClick={stopReplay}
|
|
173
|
-
className="px-4 py-2 bg-red-600 text-white rounded hover:bg-red-700"
|
|
174
|
-
>
|
|
173
|
+
<button onClick={stopReplay} className="px-4 py-2 bg-red-600 text-white rounded hover:bg-red-700">
|
|
175
174
|
⏹ Stop
|
|
176
175
|
</button>
|
|
177
176
|
)}
|
|
@@ -184,9 +183,7 @@ export default function ReplayClient() {
|
|
|
184
183
|
{!replayData ? (
|
|
185
184
|
<div className="text-center py-12">
|
|
186
185
|
<div className="text-gray-400 text-lg">No replay data available</div>
|
|
187
|
-
<div className="text-gray-500 text-sm mt-2">
|
|
188
|
-
Start using your app to generate interaction data
|
|
189
|
-
</div>
|
|
186
|
+
<div className="text-gray-500 text-sm mt-2">Start using your app to generate interaction data</div>
|
|
190
187
|
</div>
|
|
191
188
|
) : (
|
|
192
189
|
<div className="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
|
@@ -197,27 +194,27 @@ export default function ReplayClient() {
|
|
|
197
194
|
</div>
|
|
198
195
|
<div className="max-h-96 overflow-y-auto">
|
|
199
196
|
{allEvents.map((event, index) => (
|
|
200
|
-
<div
|
|
197
|
+
<div
|
|
201
198
|
key={index}
|
|
202
199
|
className={`px-4 py-2 border-b last:border-b-0 ${
|
|
203
|
-
index === currentEventIndex ?
|
|
200
|
+
index === currentEventIndex ? "bg-blue-50 border-blue-200" : ""
|
|
204
201
|
}`}
|
|
205
202
|
>
|
|
206
203
|
<div className="flex items-center justify-between">
|
|
207
204
|
<div className="flex items-center gap-2">
|
|
208
|
-
<span className="text-xs font-mono text-gray-500">
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
{event.eventType ===
|
|
205
|
+
<span className="text-xs font-mono text-gray-500">{formatTimestamp(event.timestamp)}</span>
|
|
206
|
+
<span
|
|
207
|
+
className={`px-2 py-1 rounded text-xs font-medium ${
|
|
208
|
+
event.eventType === "navigation"
|
|
209
|
+
? "bg-purple-100 text-purple-800"
|
|
210
|
+
: event.type === "CLICK"
|
|
211
|
+
? "bg-green-100 text-green-800"
|
|
212
|
+
: event.type === "SCROLL"
|
|
213
|
+
? "bg-yellow-100 text-yellow-800"
|
|
214
|
+
: "bg-gray-100 text-gray-800"
|
|
215
|
+
}`}
|
|
216
|
+
>
|
|
217
|
+
{event.eventType === "navigation" ? "NAV" : event.type}
|
|
221
218
|
</span>
|
|
222
219
|
</div>
|
|
223
220
|
{isPlaying && index === currentEventIndex && (
|
|
@@ -225,14 +222,20 @@ export default function ReplayClient() {
|
|
|
225
222
|
)}
|
|
226
223
|
</div>
|
|
227
224
|
<div className="mt-1 text-sm text-gray-700">
|
|
228
|
-
{event.eventType ===
|
|
225
|
+
{event.eventType === "navigation" ? (
|
|
229
226
|
<span>→ {event.url}</span>
|
|
230
|
-
) : event.type ===
|
|
231
|
-
<span>
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
) : event.type ===
|
|
235
|
-
<span>
|
|
227
|
+
) : event.type === "CLICK" || event.type === "TAP" ? (
|
|
228
|
+
<span>
|
|
229
|
+
({event.x}, {event.y}) on {event.target}
|
|
230
|
+
</span>
|
|
231
|
+
) : event.type === "SCROLL" ? (
|
|
232
|
+
<span>
|
|
233
|
+
{event.direction} {event.distance}px to ({event.x}, {event.y})
|
|
234
|
+
</span>
|
|
235
|
+
) : event.type === "KEY" ? (
|
|
236
|
+
<span>
|
|
237
|
+
"{event.key}" in {event.target}
|
|
238
|
+
</span>
|
|
236
239
|
) : (
|
|
237
240
|
<span>{JSON.stringify(event)}</span>
|
|
238
241
|
)}
|
|
@@ -251,16 +254,14 @@ export default function ReplayClient() {
|
|
|
251
254
|
{replayData.screenshots.map((screenshot, index) => (
|
|
252
255
|
<div key={index} className="px-4 py-2 border-b last:border-b-0">
|
|
253
256
|
<div className="flex items-center justify-between mb-2">
|
|
254
|
-
<span className="text-xs font-mono text-gray-500">
|
|
255
|
-
{formatTimestamp(screenshot.timestamp)}
|
|
256
|
-
</span>
|
|
257
|
+
<span className="text-xs font-mono text-gray-500">{formatTimestamp(screenshot.timestamp)}</span>
|
|
257
258
|
<span className="text-xs text-gray-600">{screenshot.event}</span>
|
|
258
259
|
</div>
|
|
259
|
-
<img
|
|
260
|
-
src={screenshot.url}
|
|
260
|
+
<img
|
|
261
|
+
src={screenshot.url}
|
|
261
262
|
alt={`Screenshot: ${screenshot.event}`}
|
|
262
263
|
className="w-full rounded border"
|
|
263
|
-
style={{ maxHeight:
|
|
264
|
+
style={{ maxHeight: "200px", objectFit: "contain" }}
|
|
264
265
|
/>
|
|
265
266
|
</div>
|
|
266
267
|
))}
|
|
@@ -270,5 +271,5 @@ export default function ReplayClient() {
|
|
|
270
271
|
)}
|
|
271
272
|
</div>
|
|
272
273
|
</div>
|
|
273
|
-
)
|
|
274
|
-
}
|
|
274
|
+
)
|
|
275
|
+
}
|
package/mcp-server/package.json
CHANGED
|
@@ -5,7 +5,9 @@
|
|
|
5
5
|
"scripts": {
|
|
6
6
|
"dev": "next dev --turbopack",
|
|
7
7
|
"build": "next build --turbopack",
|
|
8
|
-
"start": "next start"
|
|
8
|
+
"start": "next start",
|
|
9
|
+
"typegen": "next typegen",
|
|
10
|
+
"typecheck": "tsc --noEmit"
|
|
9
11
|
},
|
|
10
12
|
"dependencies": {
|
|
11
13
|
"mcp-handler": "^1.0.2",
|
|
@@ -20,6 +22,7 @@
|
|
|
20
22
|
"@types/react": "^18.0.0",
|
|
21
23
|
"@types/react-dom": "^18.0.0",
|
|
22
24
|
"@types/ws": "^8.5.12",
|
|
25
|
+
"babel-plugin-react-compiler": "19.1.0-rc.3",
|
|
23
26
|
"typescript": "^5.0.0"
|
|
24
27
|
}
|
|
25
|
-
}
|
|
28
|
+
}
|
|
@@ -10,10 +10,10 @@ importers:
|
|
|
10
10
|
dependencies:
|
|
11
11
|
mcp-handler:
|
|
12
12
|
specifier: ^1.0.2
|
|
13
|
-
version: 1.0.2(@modelcontextprotocol/sdk@1.17.5)(next@15.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
|
|
13
|
+
version: 1.0.2(@modelcontextprotocol/sdk@1.17.5)(next@15.5.2(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))
|
|
14
14
|
next:
|
|
15
15
|
specifier: ^15.5.1-canary.13
|
|
16
|
-
version: 15.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
|
16
|
+
version: 15.5.2(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
|
17
17
|
react:
|
|
18
18
|
specifier: ^18.0.0
|
|
19
19
|
version: 18.3.1
|
|
@@ -39,12 +39,27 @@ importers:
|
|
|
39
39
|
'@types/ws':
|
|
40
40
|
specifier: ^8.5.12
|
|
41
41
|
version: 8.18.1
|
|
42
|
+
babel-plugin-react-compiler:
|
|
43
|
+
specifier: 19.1.0-rc.3
|
|
44
|
+
version: 19.1.0-rc.3
|
|
42
45
|
typescript:
|
|
43
46
|
specifier: ^5.0.0
|
|
44
47
|
version: 5.9.2
|
|
45
48
|
|
|
46
49
|
packages:
|
|
47
50
|
|
|
51
|
+
'@babel/helper-string-parser@7.27.1':
|
|
52
|
+
resolution: {integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==}
|
|
53
|
+
engines: {node: '>=6.9.0'}
|
|
54
|
+
|
|
55
|
+
'@babel/helper-validator-identifier@7.27.1':
|
|
56
|
+
resolution: {integrity: sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==}
|
|
57
|
+
engines: {node: '>=6.9.0'}
|
|
58
|
+
|
|
59
|
+
'@babel/types@7.28.4':
|
|
60
|
+
resolution: {integrity: sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==}
|
|
61
|
+
engines: {node: '>=6.9.0'}
|
|
62
|
+
|
|
48
63
|
'@emnapi/runtime@1.5.0':
|
|
49
64
|
resolution: {integrity: sha512-97/BJ3iXHww3djw6hYIfErCZFee7qCtrneuLa20UXFCOTCfBM2cvQHjWJ2EG0s0MtdNwInarqCTz35i4wWXHsQ==}
|
|
50
65
|
|
|
@@ -281,6 +296,9 @@ packages:
|
|
|
281
296
|
ajv@6.12.6:
|
|
282
297
|
resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
|
|
283
298
|
|
|
299
|
+
babel-plugin-react-compiler@19.1.0-rc.3:
|
|
300
|
+
resolution: {integrity: sha512-mjRn69WuTz4adL0bXGx8Rsyk1086zFJeKmes6aK0xPuK3aaXmDJdLHqwKKMrpm6KAI1MCoUK72d2VeqQbu8YIA==}
|
|
301
|
+
|
|
284
302
|
body-parser@2.2.0:
|
|
285
303
|
resolution: {integrity: sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==}
|
|
286
304
|
engines: {node: '>=18'}
|
|
@@ -780,6 +798,15 @@ packages:
|
|
|
780
798
|
|
|
781
799
|
snapshots:
|
|
782
800
|
|
|
801
|
+
'@babel/helper-string-parser@7.27.1': {}
|
|
802
|
+
|
|
803
|
+
'@babel/helper-validator-identifier@7.27.1': {}
|
|
804
|
+
|
|
805
|
+
'@babel/types@7.28.4':
|
|
806
|
+
dependencies:
|
|
807
|
+
'@babel/helper-string-parser': 7.27.1
|
|
808
|
+
'@babel/helper-validator-identifier': 7.27.1
|
|
809
|
+
|
|
783
810
|
'@emnapi/runtime@1.5.0':
|
|
784
811
|
dependencies:
|
|
785
812
|
tslib: 2.8.1
|
|
@@ -975,6 +1002,10 @@ snapshots:
|
|
|
975
1002
|
json-schema-traverse: 0.4.1
|
|
976
1003
|
uri-js: 4.4.1
|
|
977
1004
|
|
|
1005
|
+
babel-plugin-react-compiler@19.1.0-rc.3:
|
|
1006
|
+
dependencies:
|
|
1007
|
+
'@babel/types': 7.28.4
|
|
1008
|
+
|
|
978
1009
|
body-parser@2.2.0:
|
|
979
1010
|
dependencies:
|
|
980
1011
|
bytes: 3.1.2
|
|
@@ -1209,14 +1240,14 @@ snapshots:
|
|
|
1209
1240
|
|
|
1210
1241
|
math-intrinsics@1.1.0: {}
|
|
1211
1242
|
|
|
1212
|
-
mcp-handler@1.0.2(@modelcontextprotocol/sdk@1.17.5)(next@15.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)):
|
|
1243
|
+
mcp-handler@1.0.2(@modelcontextprotocol/sdk@1.17.5)(next@15.5.2(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)):
|
|
1213
1244
|
dependencies:
|
|
1214
1245
|
'@modelcontextprotocol/sdk': 1.17.5
|
|
1215
1246
|
chalk: 5.6.0
|
|
1216
1247
|
commander: 11.1.0
|
|
1217
1248
|
redis: 4.7.1
|
|
1218
1249
|
optionalDependencies:
|
|
1219
|
-
next: 15.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
|
1250
|
+
next: 15.5.2(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
|
|
1220
1251
|
|
|
1221
1252
|
media-typer@1.1.0: {}
|
|
1222
1253
|
|
|
@@ -1234,7 +1265,7 @@ snapshots:
|
|
|
1234
1265
|
|
|
1235
1266
|
negotiator@1.0.0: {}
|
|
1236
1267
|
|
|
1237
|
-
next@15.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
|
|
1268
|
+
next@15.5.2(babel-plugin-react-compiler@19.1.0-rc.3)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
|
|
1238
1269
|
dependencies:
|
|
1239
1270
|
'@next/env': 15.5.2
|
|
1240
1271
|
'@swc/helpers': 0.5.15
|
|
@@ -1252,6 +1283,7 @@ snapshots:
|
|
|
1252
1283
|
'@next/swc-linux-x64-musl': 15.5.2
|
|
1253
1284
|
'@next/swc-win32-arm64-msvc': 15.5.2
|
|
1254
1285
|
'@next/swc-win32-x64-msvc': 15.5.2
|
|
1286
|
+
babel-plugin-react-compiler: 19.1.0-rc.3
|
|
1255
1287
|
sharp: 0.34.3
|
|
1256
1288
|
transitivePeerDependencies:
|
|
1257
1289
|
- '@babel/core'
|
package/mcp-server/tsconfig.json
CHANGED
|
@@ -1,10 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"compilerOptions": {
|
|
3
|
-
"lib": [
|
|
4
|
-
"dom",
|
|
5
|
-
"dom.iterable",
|
|
6
|
-
"es6"
|
|
7
|
-
],
|
|
3
|
+
"lib": ["dom", "dom.iterable", "es6"],
|
|
8
4
|
"allowJs": true,
|
|
9
5
|
"skipLibCheck": true,
|
|
10
6
|
"strict": true,
|
|
@@ -22,19 +18,10 @@
|
|
|
22
18
|
}
|
|
23
19
|
],
|
|
24
20
|
"paths": {
|
|
25
|
-
"@/*": [
|
|
26
|
-
"./*"
|
|
27
|
-
]
|
|
21
|
+
"@/*": ["./*"]
|
|
28
22
|
},
|
|
29
23
|
"target": "ES2018"
|
|
30
24
|
},
|
|
31
|
-
"include": [
|
|
32
|
-
|
|
33
|
-
"**/*.ts",
|
|
34
|
-
"**/*.tsx",
|
|
35
|
-
".next/types/**/*.ts"
|
|
36
|
-
],
|
|
37
|
-
"exclude": [
|
|
38
|
-
"node_modules"
|
|
39
|
-
]
|
|
25
|
+
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
|
26
|
+
"exclude": ["node_modules"]
|
|
40
27
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dev3000",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.51",
|
|
4
4
|
"description": "AI-powered development tools with browser monitoring and MCP server integration",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -18,6 +18,19 @@
|
|
|
18
18
|
"mcp-server/next-env.d.ts",
|
|
19
19
|
"README.md"
|
|
20
20
|
],
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsc && mkdir -p dist/src && cp src/loading.html dist/src/",
|
|
23
|
+
"dev": "tsc --watch",
|
|
24
|
+
"format": "biome format --write .",
|
|
25
|
+
"lint": "biome check .",
|
|
26
|
+
"lint:fix": "biome check --write .",
|
|
27
|
+
"test": "vitest run",
|
|
28
|
+
"test-postinstall": "tsx scripts/test-postinstall.ts",
|
|
29
|
+
"prepare": "husky",
|
|
30
|
+
"postinstall": "echo 'Starting postinstall...' && cd mcp-server && echo 'Installing mcp-server dependencies...' && timeout 30s pnpm install --no-frozen-lockfile --ignore-scripts && echo 'Postinstall completed successfully!' || echo 'Postinstall failed or timed out, but continuing...'",
|
|
31
|
+
"release": "./scripts/release.sh",
|
|
32
|
+
"canary": "./scripts/canary.sh"
|
|
33
|
+
},
|
|
21
34
|
"keywords": [
|
|
22
35
|
"nextjs",
|
|
23
36
|
"ai",
|
|
@@ -56,15 +69,5 @@
|
|
|
56
69
|
"url": "git+https://github.com/vercel-labs/dev3000.git"
|
|
57
70
|
},
|
|
58
71
|
"author": "Lindsey Simon <lindsey@vercel.com>",
|
|
59
|
-
"license": "MIT"
|
|
60
|
-
|
|
61
|
-
"build": "tsc && mkdir -p dist/src && cp src/loading.html dist/src/",
|
|
62
|
-
"dev": "tsc --watch",
|
|
63
|
-
"format": "biome format --write .",
|
|
64
|
-
"test": "vitest run",
|
|
65
|
-
"test-postinstall": "tsx scripts/test-postinstall.ts",
|
|
66
|
-
"postinstall": "echo 'Starting postinstall...' && cd mcp-server && echo 'Installing mcp-server dependencies...' && timeout 30s pnpm install --no-frozen-lockfile --ignore-scripts && echo 'Postinstall completed successfully!' || echo 'Postinstall failed or timed out, but continuing...'",
|
|
67
|
-
"release": "./scripts/release.sh",
|
|
68
|
-
"test-canary": "./scripts/test-canary.sh"
|
|
69
|
-
}
|
|
70
|
-
}
|
|
72
|
+
"license": "MIT"
|
|
73
|
+
}
|