dev3000 0.0.76 → 0.0.78
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 +107 -27
- package/dist/cdp-monitor.d.ts.map +1 -1
- package/dist/cdp-monitor.js +33 -10
- package/dist/cdp-monitor.js.map +1 -1
- package/dist/dev-environment.d.ts +1 -1
- package/dist/dev-environment.d.ts.map +1 -1
- package/dist/dev-environment.js +201 -268
- package/dist/dev-environment.js.map +1 -1
- package/dist/src/tui-interface-impl.tsx +110 -59
- package/dist/tui-interface-impl.d.ts +1 -0
- package/dist/tui-interface-impl.d.ts.map +1 -1
- package/dist/tui-interface-impl.js +63 -14
- package/dist/tui-interface-impl.js.map +1 -1
- package/dist/tui-interface.d.ts +2 -0
- package/dist/tui-interface.d.ts.map +1 -1
- package/dist/tui-interface.js +8 -1
- package/dist/tui-interface.js.map +1 -1
- package/mcp-server/.next/BUILD_ID +1 -1
- package/mcp-server/.next/build-manifest.json +2 -2
- package/mcp-server/.next/fallback-build-manifest.json +2 -2
- package/mcp-server/.next/prerender-manifest.json +3 -3
- package/mcp-server/.next/server/app/_global-error.html +2 -2
- package/mcp-server/.next/server/app/_global-error.rsc +1 -1
- package/mcp-server/.next/server/app/_not-found.html +1 -1
- package/mcp-server/.next/server/app/_not-found.rsc +1 -1
- package/mcp-server/.next/server/app/index.html +1 -1
- package/mcp-server/.next/server/app/index.rsc +1 -1
- package/mcp-server/.next/server/chunks/[root-of-the-server]__270b33b7._.js +13 -23
- package/mcp-server/.next/server/chunks/[root-of-the-server]__270b33b7._.js.map +1 -1
- package/mcp-server/.next/server/chunks/ssr/_62451611._.js.map +1 -1
- package/mcp-server/.next/server/chunks/ssr/_b15f05ee._.js.map +1 -1
- package/mcp-server/.next/server/server-reference-manifest.js +1 -1
- package/mcp-server/.next/server/server-reference-manifest.json +1 -1
- package/mcp-server/app/mcp/tools.ts +686 -151
- package/mcp-server/package.json +0 -6
- package/package.json +7 -1
- package/src/tui-interface-impl.tsx +110 -59
- /package/mcp-server/.next/static/{SDKkQ5XdHwJr8jB5PJj7F → GE4QeOWMVNF-ly63PtQFE}/_buildManifest.js +0 -0
- /package/mcp-server/.next/static/{SDKkQ5XdHwJr8jB5PJj7F → GE4QeOWMVNF-ly63PtQFE}/_clientMiddlewareManifest.json +0 -0
- /package/mcp-server/.next/static/{SDKkQ5XdHwJr8jB5PJj7F → GE4QeOWMVNF-ly63PtQFE}/_ssgManifest.js +0 -0
package/mcp-server/package.json
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dev3000",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.78",
|
|
4
4
|
"description": "AI-powered development tools with browser monitoring and MCP server integration",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -85,6 +85,12 @@
|
|
|
85
85
|
"tsx": "^4.20.3",
|
|
86
86
|
"vitest": "^3.2.4"
|
|
87
87
|
},
|
|
88
|
+
"pnpm": {
|
|
89
|
+
"overrides": {
|
|
90
|
+
"@types/react": "19.1.17",
|
|
91
|
+
"@types/react-dom": "19.1.11"
|
|
92
|
+
}
|
|
93
|
+
},
|
|
88
94
|
"engines": {
|
|
89
95
|
"node": ">=18.0.0"
|
|
90
96
|
},
|
|
@@ -27,22 +27,27 @@ const COMPACT_LOGO = "d3k"
|
|
|
27
27
|
const FULL_LOGO = [" ▐▌▄▄▄▄ █ ▄ ", " ▐▌ █ █▄▀ ", "▗▞▀▜▌▀▀▀█ █ ▀▄ ", "▝▚▄▟▌▄▄▄█ █ █ "]
|
|
28
28
|
|
|
29
29
|
const TUIApp = ({
|
|
30
|
-
appPort,
|
|
30
|
+
appPort: initialAppPort,
|
|
31
31
|
mcpPort,
|
|
32
32
|
logFile,
|
|
33
33
|
commandName,
|
|
34
34
|
serversOnly,
|
|
35
35
|
version,
|
|
36
36
|
projectName,
|
|
37
|
-
onStatusUpdate
|
|
38
|
-
|
|
37
|
+
onStatusUpdate,
|
|
38
|
+
onAppPortUpdate
|
|
39
|
+
}: TUIOptions & {
|
|
40
|
+
onStatusUpdate: (fn: (status: string | null) => void) => void
|
|
41
|
+
onAppPortUpdate: (fn: (port: string) => void) => void
|
|
42
|
+
}) => {
|
|
39
43
|
const [logs, setLogs] = useState<LogEntry[]>([])
|
|
40
44
|
const [scrollOffset, setScrollOffset] = useState(0)
|
|
41
45
|
const [initStatus, setInitStatus] = useState<string | null>("Initializing...")
|
|
46
|
+
const [appPort, setAppPort] = useState<string>(initialAppPort)
|
|
42
47
|
const logIdCounter = useRef(0)
|
|
43
48
|
const { stdout } = useStdout()
|
|
44
49
|
const ctrlCMessageDefault = "^C quit"
|
|
45
|
-
const [ctrlCMessage] = useState(ctrlCMessageDefault)
|
|
50
|
+
const [ctrlCMessage, setCtrlCMessage] = useState(ctrlCMessageDefault)
|
|
46
51
|
|
|
47
52
|
const [terminalSize, setTerminalSize] = useState(() => ({
|
|
48
53
|
width: stdout?.columns || 80,
|
|
@@ -82,9 +87,30 @@ const TUIApp = ({
|
|
|
82
87
|
|
|
83
88
|
// Provide status update function to parent
|
|
84
89
|
useEffect(() => {
|
|
85
|
-
onStatusUpdate(
|
|
90
|
+
onStatusUpdate((status: string | null) => {
|
|
91
|
+
// Check if this is the "Press Ctrl+C again" warning
|
|
92
|
+
if (status?.includes("Press Ctrl+C again")) {
|
|
93
|
+
// Update the bottom Ctrl+C message with warning emoji
|
|
94
|
+
setCtrlCMessage("⚠️ ^C again to quit")
|
|
95
|
+
// Clear the init status since we don't want it in the header anymore
|
|
96
|
+
setInitStatus(null)
|
|
97
|
+
// Reset after 3 seconds
|
|
98
|
+
setTimeout(() => {
|
|
99
|
+
setCtrlCMessage(ctrlCMessageDefault)
|
|
100
|
+
}, 3000)
|
|
101
|
+
} else {
|
|
102
|
+
setInitStatus(status)
|
|
103
|
+
}
|
|
104
|
+
})
|
|
86
105
|
}, [onStatusUpdate])
|
|
87
106
|
|
|
107
|
+
// Provide app port update function to parent
|
|
108
|
+
useEffect(() => {
|
|
109
|
+
onAppPortUpdate((port: string) => {
|
|
110
|
+
setAppPort(port)
|
|
111
|
+
})
|
|
112
|
+
}, [onAppPortUpdate])
|
|
113
|
+
|
|
88
114
|
// Calculate available lines for logs dynamically based on terminal height and mode
|
|
89
115
|
const calculateMaxVisibleLogs = () => {
|
|
90
116
|
if (isVeryCompact) {
|
|
@@ -94,13 +120,22 @@ const TUIApp = ({
|
|
|
94
120
|
// In compact mode, reduce header size, account for bottom status line
|
|
95
121
|
return Math.max(3, termHeight - 10)
|
|
96
122
|
} else {
|
|
97
|
-
// Normal mode calculation -
|
|
98
|
-
const
|
|
99
|
-
const
|
|
100
|
-
const
|
|
101
|
-
const
|
|
102
|
-
const
|
|
103
|
-
const
|
|
123
|
+
// Normal mode calculation - account for all UI elements
|
|
124
|
+
const headerBorderLines = 2 // Top border (with title) + bottom border
|
|
125
|
+
const headerContentLines = 5 // Logo is 4 lines tall, +1 for padding
|
|
126
|
+
const logBoxBorderLines = 2 // Top and bottom border of log box
|
|
127
|
+
const logBoxHeaderLines = 2 // "Logs (X total)" text (no blank line after)
|
|
128
|
+
const logBoxFooterLines = scrollOffset > 0 ? 2 : 0 // "(X lines below)" when scrolled
|
|
129
|
+
const bottomStatusLine = 1 // Log path and quit message
|
|
130
|
+
const safetyBuffer = 1 // Small buffer to prevent header from being pushed up
|
|
131
|
+
const totalReservedLines =
|
|
132
|
+
headerBorderLines +
|
|
133
|
+
headerContentLines +
|
|
134
|
+
logBoxBorderLines +
|
|
135
|
+
logBoxHeaderLines +
|
|
136
|
+
logBoxFooterLines +
|
|
137
|
+
bottomStatusLine +
|
|
138
|
+
safetyBuffer
|
|
104
139
|
return Math.max(3, termHeight - totalReservedLines)
|
|
105
140
|
}
|
|
106
141
|
}
|
|
@@ -237,41 +272,52 @@ const TUIApp = ({
|
|
|
237
272
|
)
|
|
238
273
|
|
|
239
274
|
// Render normal header
|
|
240
|
-
const renderNormalHeader = () =>
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
<
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
275
|
+
const renderNormalHeader = () => {
|
|
276
|
+
// Create custom top border with title embedded (like Claude Code)
|
|
277
|
+
const title = ` ${commandName} v${version} ${initStatus ? `- ${initStatus} ` : ""}`
|
|
278
|
+
const borderChar = "─"
|
|
279
|
+
const leftPadding = 2
|
|
280
|
+
// Account for border characters and padding
|
|
281
|
+
const availableWidth = termWidth - 2 // -2 for corner characters
|
|
282
|
+
const titleLength = title.length
|
|
283
|
+
const rightBorderLength = Math.max(0, availableWidth - titleLength - leftPadding)
|
|
284
|
+
const topBorderLine = `╭${borderChar.repeat(leftPadding)}${title}${borderChar.repeat(rightBorderLength)}╮`
|
|
285
|
+
|
|
286
|
+
return (
|
|
287
|
+
<Box flexDirection="column">
|
|
288
|
+
{/* Custom top border with embedded title */}
|
|
289
|
+
<Text color="#A18CE5">{topBorderLine}</Text>
|
|
290
|
+
|
|
291
|
+
{/* Content with side borders only */}
|
|
292
|
+
<Box borderStyle="round" borderColor="#A18CE5" borderTop={false} paddingX={2} paddingY={1}>
|
|
293
|
+
<Box flexDirection="row" gap={3}>
|
|
294
|
+
{/* ASCII Logo on the left */}
|
|
295
|
+
{/* biome-ignore format: preserve ASCII art alignment */}
|
|
296
|
+
<Box flexDirection="column" alignItems="flex-start">
|
|
297
|
+
{FULL_LOGO.map((line) => (
|
|
298
|
+
<Text key={line} color="#A18CE5" bold>
|
|
299
|
+
{line}
|
|
300
|
+
</Text>
|
|
301
|
+
))}
|
|
302
|
+
</Box>
|
|
303
|
+
|
|
304
|
+
{/* Info on the right */}
|
|
305
|
+
<Box flexDirection="column" flexGrow={1}>
|
|
306
|
+
<Text color="cyan">🌐 Your App: http://localhost:{appPort}</Text>
|
|
307
|
+
<Text color="cyan">🤖 MCP Server: http://localhost:{mcpPort}/mcp</Text>
|
|
308
|
+
<Text color="cyan">
|
|
309
|
+
📸 Visual Timeline: http://localhost:{mcpPort}/logs
|
|
310
|
+
{projectName ? `?project=${encodeURIComponent(projectName)}` : ""}
|
|
311
|
+
</Text>
|
|
312
|
+
{serversOnly && (
|
|
313
|
+
<Text color="cyan">🖥️ Servers-only mode - use Chrome extension for browser monitoring</Text>
|
|
314
|
+
)}
|
|
315
|
+
</Box>
|
|
316
|
+
</Box>
|
|
264
317
|
</Box>
|
|
265
318
|
</Box>
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
{/*
|
|
269
|
-
<Box marginTop={1}>
|
|
270
|
-
<Text dimColor>💡 Controls: ↑/↓ scroll | PgUp/PgDn page | g/G start/end | Ctrl-C quit</Text>
|
|
271
|
-
</Box>
|
|
272
|
-
*/}
|
|
273
|
-
</Box>
|
|
274
|
-
)
|
|
319
|
+
)
|
|
320
|
+
}
|
|
275
321
|
|
|
276
322
|
return (
|
|
277
323
|
<Box flexDirection="column" height="100%">
|
|
@@ -281,12 +327,9 @@ const TUIApp = ({
|
|
|
281
327
|
{/* Logs Box - flexGrow makes it expand to fill available height */}
|
|
282
328
|
<Box flexDirection="column" borderStyle="single" borderColor="gray" paddingX={1} flexGrow={1} minHeight={0}>
|
|
283
329
|
{!isVeryCompact && (
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
</Text>
|
|
288
|
-
<Text> </Text>
|
|
289
|
-
</>
|
|
330
|
+
<Text color="gray" dimColor>
|
|
331
|
+
Logs ({logs.length} total{scrollOffset > 0 && `, scrolled up ${scrollOffset} lines`})
|
|
332
|
+
</Text>
|
|
290
333
|
)}
|
|
291
334
|
|
|
292
335
|
{/* Logs content area - also uses flexGrow to expand */}
|
|
@@ -401,10 +444,7 @@ const TUIApp = ({
|
|
|
401
444
|
|
|
402
445
|
{/* Scroll indicator - only show when scrolled up and not in very compact mode */}
|
|
403
446
|
{!isVeryCompact && logs.length > maxVisibleLogs && scrollOffset > 0 && (
|
|
404
|
-
|
|
405
|
-
<Text> </Text>
|
|
406
|
-
<Text dimColor>({scrollOffset} lines below)</Text>
|
|
407
|
-
</>
|
|
447
|
+
<Text dimColor>({scrollOffset} lines below)</Text>
|
|
408
448
|
)}
|
|
409
449
|
</Box>
|
|
410
450
|
|
|
@@ -417,12 +457,15 @@ const TUIApp = ({
|
|
|
417
457
|
)
|
|
418
458
|
}
|
|
419
459
|
|
|
420
|
-
export async function runTUI(
|
|
421
|
-
|
|
422
|
-
|
|
460
|
+
export async function runTUI(options: TUIOptions): Promise<{
|
|
461
|
+
app: { unmount: () => void }
|
|
462
|
+
updateStatus: (status: string | null) => void
|
|
463
|
+
updateAppPort: (port: string) => void
|
|
464
|
+
}> {
|
|
423
465
|
return new Promise((resolve, reject) => {
|
|
424
466
|
try {
|
|
425
467
|
let statusUpdater: ((status: string | null) => void) | null = null
|
|
468
|
+
let appPortUpdater: ((port: string) => void) | null = null
|
|
426
469
|
|
|
427
470
|
const app = render(
|
|
428
471
|
<TUIApp
|
|
@@ -430,11 +473,14 @@ export async function runTUI(
|
|
|
430
473
|
onStatusUpdate={(fn) => {
|
|
431
474
|
statusUpdater = fn
|
|
432
475
|
}}
|
|
476
|
+
onAppPortUpdate={(fn) => {
|
|
477
|
+
appPortUpdater = fn
|
|
478
|
+
}}
|
|
433
479
|
/>,
|
|
434
480
|
{ exitOnCtrlC: false }
|
|
435
481
|
)
|
|
436
482
|
|
|
437
|
-
// Give React time to set up the
|
|
483
|
+
// Give React time to set up the updaters
|
|
438
484
|
setTimeout(() => {
|
|
439
485
|
resolve({
|
|
440
486
|
app,
|
|
@@ -442,6 +488,11 @@ export async function runTUI(
|
|
|
442
488
|
if (statusUpdater) {
|
|
443
489
|
statusUpdater(status)
|
|
444
490
|
}
|
|
491
|
+
},
|
|
492
|
+
updateAppPort: (port: string) => {
|
|
493
|
+
if (appPortUpdater) {
|
|
494
|
+
appPortUpdater(port)
|
|
495
|
+
}
|
|
445
496
|
}
|
|
446
497
|
})
|
|
447
498
|
}, 100)
|
/package/mcp-server/.next/static/{SDKkQ5XdHwJr8jB5PJj7F → GE4QeOWMVNF-ly63PtQFE}/_buildManifest.js
RENAMED
|
File without changes
|
|
File without changes
|
/package/mcp-server/.next/static/{SDKkQ5XdHwJr8jB5PJj7F → GE4QeOWMVNF-ly63PtQFE}/_ssgManifest.js
RENAMED
|
File without changes
|