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.
Files changed (36) hide show
  1. package/README.md +55 -6
  2. package/dist/cdp-monitor.d.ts.map +1 -1
  3. package/dist/cdp-monitor.js +54 -48
  4. package/dist/cdp-monitor.js.map +1 -1
  5. package/dist/cli.js +39 -33
  6. package/dist/cli.js.map +1 -1
  7. package/dist/dev-environment.d.ts +2 -0
  8. package/dist/dev-environment.d.ts.map +1 -1
  9. package/dist/dev-environment.js +212 -181
  10. package/dist/dev-environment.js.map +1 -1
  11. package/dist/index.d.ts +1 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +1 -1
  14. package/dist/index.js.map +1 -1
  15. package/mcp-server/app/api/config/route.ts +7 -7
  16. package/mcp-server/app/api/logs/append/route.ts +59 -51
  17. package/mcp-server/app/api/logs/head/route.ts +22 -22
  18. package/mcp-server/app/api/logs/list/route.ts +39 -42
  19. package/mcp-server/app/api/logs/rotate/route.ts +28 -38
  20. package/mcp-server/app/api/logs/stream/route.ts +35 -35
  21. package/mcp-server/app/api/logs/tail/route.ts +22 -22
  22. package/mcp-server/app/api/mcp/[transport]/route.ts +189 -188
  23. package/mcp-server/app/api/replay/route.ts +217 -202
  24. package/mcp-server/app/layout.tsx +9 -8
  25. package/mcp-server/app/logs/LogsClient.test.ts +123 -99
  26. package/mcp-server/app/logs/LogsClient.tsx +724 -562
  27. package/mcp-server/app/logs/page.tsx +71 -72
  28. package/mcp-server/app/logs/utils.ts +99 -28
  29. package/mcp-server/app/page.tsx +10 -14
  30. package/mcp-server/app/replay/ReplayClient.tsx +120 -119
  31. package/mcp-server/app/replay/page.tsx +3 -3
  32. package/mcp-server/next.config.ts +2 -0
  33. package/mcp-server/package.json +5 -2
  34. package/mcp-server/pnpm-lock.yaml +37 -5
  35. package/mcp-server/tsconfig.json +4 -17
  36. package/package.json +16 -13
@@ -1,122 +1,124 @@
1
- 'use client';
1
+ "use client"
2
2
 
3
- import { useState, useEffect } from 'react';
3
+ import { useEffect, useState } from "react"
4
4
 
5
5
  interface InteractionEvent {
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;
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, 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);
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: 'parse' });
50
+ const params = new URLSearchParams({ action: "parse" })
51
51
  if (selectedTimeRange) {
52
- params.set('startTime', selectedTimeRange.start);
53
- params.set('endTime', selectedTimeRange.end);
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('Failed to load replay data:', data.error);
62
+ console.error("Failed to load replay data:", data.error)
63
63
  }
64
64
  } catch (error) {
65
- console.error('Error loading replay data:', 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
- }, [selectedTimeRange]);
71
+ loadReplayData()
72
+ }, [loadReplayData])
73
73
 
74
- const allEvents = replayData ? [
75
- ...replayData.interactions.map(i => ({ ...i, eventType: 'interaction' as const })),
76
- ...replayData.navigations.map(n => ({ ...n, eventType: 'navigation' as const }))
77
- ].sort((a, b) => new Date(a.timestamp).getTime() - new Date(b.timestamp).getTime()) : [];
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))); // Cap at 5s
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 ? 'bg-blue-50 border-blue-200' : ''
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
- {formatTimestamp(event.timestamp)}
210
- </span>
211
- <span className={`px-2 py-1 rounded text-xs font-medium ${
212
- event.eventType === 'navigation'
213
- ? 'bg-purple-100 text-purple-800'
214
- : event.type === 'CLICK'
215
- ? 'bg-green-100 text-green-800'
216
- : event.type === 'SCROLL'
217
- ? 'bg-yellow-100 text-yellow-800'
218
- : 'bg-gray-100 text-gray-800'
219
- }`}>
220
- {event.eventType === 'navigation' ? 'NAV' : event.type}
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 === 'navigation' ? (
225
+ {event.eventType === "navigation" ? (
229
226
  <span>→ {event.url}</span>
230
- ) : event.type === 'CLICK' || event.type === 'TAP' ? (
231
- <span>({event.x}, {event.y}) on {event.target}</span>
232
- ) : event.type === 'SCROLL' ? (
233
- <span>{event.direction} {event.distance}px to ({event.x}, {event.y})</span>
234
- ) : event.type === 'KEY' ? (
235
- <span>"{event.key}" in {event.target}</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: '200px', objectFit: 'contain' }}
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
+ }
@@ -1,5 +1,5 @@
1
- import ReplayClient from './ReplayClient';
1
+ import ReplayClient from "./ReplayClient"
2
2
 
3
3
  export default function ReplayPage() {
4
- return <ReplayClient />;
5
- }
4
+ return <ReplayClient />
5
+ }
@@ -1,6 +1,8 @@
1
1
  import type { NextConfig } from "next";
2
2
 
3
3
  const nextConfig: NextConfig = {
4
+ reactStrictMode: true,
5
+ experimental: { reactCompiler: true },
4
6
  output: "standalone",
5
7
  devIndicators: false,
6
8
  turbopack: {
@@ -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'
@@ -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
- "next-env.d.ts",
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.49",
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
- "scripts": {
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
+ }