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.
Files changed (40) hide show
  1. package/README.md +107 -27
  2. package/dist/cdp-monitor.d.ts.map +1 -1
  3. package/dist/cdp-monitor.js +33 -10
  4. package/dist/cdp-monitor.js.map +1 -1
  5. package/dist/dev-environment.d.ts +1 -1
  6. package/dist/dev-environment.d.ts.map +1 -1
  7. package/dist/dev-environment.js +201 -268
  8. package/dist/dev-environment.js.map +1 -1
  9. package/dist/src/tui-interface-impl.tsx +110 -59
  10. package/dist/tui-interface-impl.d.ts +1 -0
  11. package/dist/tui-interface-impl.d.ts.map +1 -1
  12. package/dist/tui-interface-impl.js +63 -14
  13. package/dist/tui-interface-impl.js.map +1 -1
  14. package/dist/tui-interface.d.ts +2 -0
  15. package/dist/tui-interface.d.ts.map +1 -1
  16. package/dist/tui-interface.js +8 -1
  17. package/dist/tui-interface.js.map +1 -1
  18. package/mcp-server/.next/BUILD_ID +1 -1
  19. package/mcp-server/.next/build-manifest.json +2 -2
  20. package/mcp-server/.next/fallback-build-manifest.json +2 -2
  21. package/mcp-server/.next/prerender-manifest.json +3 -3
  22. package/mcp-server/.next/server/app/_global-error.html +2 -2
  23. package/mcp-server/.next/server/app/_global-error.rsc +1 -1
  24. package/mcp-server/.next/server/app/_not-found.html +1 -1
  25. package/mcp-server/.next/server/app/_not-found.rsc +1 -1
  26. package/mcp-server/.next/server/app/index.html +1 -1
  27. package/mcp-server/.next/server/app/index.rsc +1 -1
  28. package/mcp-server/.next/server/chunks/[root-of-the-server]__270b33b7._.js +13 -23
  29. package/mcp-server/.next/server/chunks/[root-of-the-server]__270b33b7._.js.map +1 -1
  30. package/mcp-server/.next/server/chunks/ssr/_62451611._.js.map +1 -1
  31. package/mcp-server/.next/server/chunks/ssr/_b15f05ee._.js.map +1 -1
  32. package/mcp-server/.next/server/server-reference-manifest.js +1 -1
  33. package/mcp-server/.next/server/server-reference-manifest.json +1 -1
  34. package/mcp-server/app/mcp/tools.ts +686 -151
  35. package/mcp-server/package.json +0 -6
  36. package/package.json +7 -1
  37. package/src/tui-interface-impl.tsx +110 -59
  38. /package/mcp-server/.next/static/{SDKkQ5XdHwJr8jB5PJj7F → GE4QeOWMVNF-ly63PtQFE}/_buildManifest.js +0 -0
  39. /package/mcp-server/.next/static/{SDKkQ5XdHwJr8jB5PJj7F → GE4QeOWMVNF-ly63PtQFE}/_clientMiddlewareManifest.json +0 -0
  40. /package/mcp-server/.next/static/{SDKkQ5XdHwJr8jB5PJj7F → GE4QeOWMVNF-ly63PtQFE}/_ssgManifest.js +0 -0
@@ -37,11 +37,5 @@
37
37
  "tailwindcss": "^4.1.9",
38
38
  "tw-animate-css": "^1.3.8",
39
39
  "typescript": "^5.0.0"
40
- },
41
- "pnpm": {
42
- "overrides": {
43
- "@types/react": "19.1.13",
44
- "@types/react-dom": "19.1.9"
45
- }
46
40
  }
47
41
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dev3000",
3
- "version": "0.0.76",
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
- }: TUIOptions & { onStatusUpdate: (fn: (status: string | null) => void) => void }) => {
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(setInitStatus)
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 - reduced header lines since we removed Controls section
98
- const headerLines = 10 // Reduced from 12 since Controls section is commented out
99
- const logBoxHeaderLines = 3
100
- const logBoxFooterLines = scrollOffset > 0 ? 3 : 1
101
- const bottomStatusLine = 1 // Just one line for the log path
102
- const safetyBuffer = 0 // Removed safety buffer to use more space
103
- const totalReservedLines = headerLines + logBoxHeaderLines + logBoxFooterLines + bottomStatusLine + safetyBuffer
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
- <Box borderStyle="round" borderColor="#A18CE5" paddingX={2} paddingY={1} marginBottom={1} flexDirection="column">
242
- <Box flexDirection="row" gap={3}>
243
- {/* ASCII Logo on the left */}
244
- {/* biome-ignore format: preserve ASCII art alignment */}
245
- <Box flexDirection="column" alignItems="flex-start">
246
- {FULL_LOGO.map((line) => (
247
- <Text key={line} color="#A18CE5" bold>{line}</Text>
248
- ))}
249
- </Box>
250
-
251
- {/* Info on the right */}
252
- <Box flexDirection="column" flexGrow={1}>
253
- <Text color="#A18CE5" bold>
254
- {commandName} v{version} {initStatus ? `- ${initStatus}` : "is running!"}
255
- </Text>
256
- <Text> </Text>
257
- <Text color="cyan">🌐 Your App: http://localhost:{appPort}</Text>
258
- <Text color="cyan">🤖 MCP Server: http://localhost:{mcpPort}/mcp</Text>
259
- <Text color="cyan">
260
- 📸 Visual Timeline: http://localhost:{mcpPort}/logs
261
- {projectName ? `?project=${encodeURIComponent(projectName)}` : ""}
262
- </Text>
263
- {serversOnly && <Text color="cyan">🖥️ Servers-only mode - use Chrome extension for browser monitoring</Text>}
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
- {/* Controls at the bottom of header box */}
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
- <Text color="gray" dimColor>
286
- Logs ({logs.length} total{scrollOffset > 0 && `, scrolled up ${scrollOffset} lines`})
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
- options: TUIOptions
422
- ): Promise<{ app: { unmount: () => void }; updateStatus: (status: string | null) => void }> {
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 status updater
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)