@gxp-dev/tools 2.0.5 → 2.0.7

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 (71) hide show
  1. package/dist/tui/App.d.ts +13 -0
  2. package/dist/tui/App.d.ts.map +1 -0
  3. package/dist/tui/App.js +480 -0
  4. package/dist/tui/App.js.map +1 -0
  5. package/dist/tui/components/CommandInput.d.ts +13 -0
  6. package/dist/tui/components/CommandInput.d.ts.map +1 -0
  7. package/dist/tui/components/CommandInput.js +180 -0
  8. package/dist/tui/components/CommandInput.js.map +1 -0
  9. package/dist/tui/components/GeminiPanel.d.ts +7 -0
  10. package/dist/tui/components/GeminiPanel.d.ts.map +1 -0
  11. package/dist/tui/components/GeminiPanel.js +99 -0
  12. package/dist/tui/components/GeminiPanel.js.map +1 -0
  13. package/dist/tui/components/Header.d.ts +6 -0
  14. package/dist/tui/components/Header.d.ts.map +1 -0
  15. package/dist/tui/components/Header.js +6 -0
  16. package/dist/tui/components/Header.js.map +1 -0
  17. package/dist/tui/components/LogPanel.d.ts +8 -0
  18. package/dist/tui/components/LogPanel.d.ts.map +1 -0
  19. package/dist/tui/components/LogPanel.js +89 -0
  20. package/dist/tui/components/LogPanel.js.map +1 -0
  21. package/dist/tui/components/TabBar.d.ts +9 -0
  22. package/dist/tui/components/TabBar.d.ts.map +1 -0
  23. package/dist/tui/components/TabBar.js +23 -0
  24. package/dist/tui/components/TabBar.js.map +1 -0
  25. package/dist/tui/components/WelcomeScreen.d.ts +2 -0
  26. package/dist/tui/components/WelcomeScreen.d.ts.map +1 -0
  27. package/dist/tui/components/WelcomeScreen.js +14 -0
  28. package/dist/tui/components/WelcomeScreen.js.map +1 -0
  29. package/dist/tui/index.d.ts +8 -0
  30. package/dist/tui/index.d.ts.map +1 -0
  31. package/dist/tui/index.js +47 -0
  32. package/dist/tui/index.js.map +1 -0
  33. package/dist/tui/package.json +1 -0
  34. package/dist/tui/services/ExtensionService.d.ts +11 -0
  35. package/dist/tui/services/ExtensionService.d.ts.map +1 -0
  36. package/dist/tui/services/ExtensionService.js +101 -0
  37. package/dist/tui/services/ExtensionService.js.map +1 -0
  38. package/dist/tui/services/GeminiService.d.ts +40 -0
  39. package/dist/tui/services/GeminiService.d.ts.map +1 -0
  40. package/dist/tui/services/GeminiService.js +327 -0
  41. package/dist/tui/services/GeminiService.js.map +1 -0
  42. package/dist/tui/services/ServiceManager.d.ts +40 -0
  43. package/dist/tui/services/ServiceManager.d.ts.map +1 -0
  44. package/dist/tui/services/ServiceManager.js +283 -0
  45. package/dist/tui/services/ServiceManager.js.map +1 -0
  46. package/dist/tui/services/SocketService.d.ts +19 -0
  47. package/dist/tui/services/SocketService.d.ts.map +1 -0
  48. package/dist/tui/services/SocketService.js +163 -0
  49. package/dist/tui/services/SocketService.js.map +1 -0
  50. package/dist/tui/services/ViteService.d.ts +8 -0
  51. package/dist/tui/services/ViteService.d.ts.map +1 -0
  52. package/dist/tui/services/ViteService.js +89 -0
  53. package/dist/tui/services/ViteService.js.map +1 -0
  54. package/dist/tui/services/index.d.ts +6 -0
  55. package/dist/tui/services/index.d.ts.map +1 -0
  56. package/dist/tui/services/index.js +6 -0
  57. package/dist/tui/services/index.js.map +1 -0
  58. package/package.json +11 -1
  59. package/.github/workflows/npm-publish.yml +0 -48
  60. package/CLAUDE.md +0 -400
  61. package/REFACTOR_PLAN.md +0 -194
  62. package/docs/DOCUSAURUS_IMPORT.md +0 -378
  63. package/docs/_category_.json +0 -8
  64. package/docs/app-manifest.md +0 -272
  65. package/docs/building-for-platform.md +0 -315
  66. package/docs/dev-tools.md +0 -291
  67. package/docs/getting-started.md +0 -180
  68. package/docs/gxp-store.md +0 -305
  69. package/docs/index.md +0 -44
  70. package/tsconfig.tui.json +0 -21
  71. package/vite.config.js +0 -164
@@ -0,0 +1,180 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import React, { useState, useMemo, useEffect } from 'react';
3
+ import { Box, Text, useInput } from 'ink';
4
+ import TextInput from 'ink-text-input';
5
+ // Command definitions with descriptions
6
+ const COMMANDS = [
7
+ { cmd: '/dev', args: '', desc: 'Start Vite (+ Socket if SOCKET_IO_ENABLED)' },
8
+ { cmd: '/dev', args: '--with-socket', desc: 'Start Vite + Socket.IO' },
9
+ { cmd: '/dev', args: '--with-mock', desc: 'Start Vite + Socket.IO + Mock API server' },
10
+ { cmd: '/dev', args: '--firefox', desc: 'Start Vite + Firefox extension' },
11
+ { cmd: '/dev', args: '--chrome', desc: 'Start Vite + Chrome extension' },
12
+ { cmd: '/dev', args: '--no-socket', desc: 'Start Vite without Socket.IO' },
13
+ { cmd: '/dev', args: '--no-https', desc: 'Start Vite without SSL' },
14
+ { cmd: '/socket', args: '', desc: 'Start Socket.IO server' },
15
+ { cmd: '/socket', args: 'send <event>', desc: 'Send socket event' },
16
+ { cmd: '/socket', args: 'list', desc: 'List available events' },
17
+ { cmd: '/ext', args: 'chrome', desc: 'Launch Chrome extension' },
18
+ { cmd: '/ext', args: 'firefox', desc: 'Launch Firefox extension' },
19
+ { cmd: '/stop', args: '[service]', desc: 'Stop current/specified service' },
20
+ { cmd: '/restart', args: '[service]', desc: 'Restart current/specified service' },
21
+ { cmd: '/clear', args: '', desc: 'Clear current log panel' },
22
+ { cmd: '/gemini', args: '', desc: 'Open Gemini AI chat' },
23
+ { cmd: '/gemini', args: 'enable', desc: 'Set up Google auth' },
24
+ { cmd: '/gemini', args: 'ask <query>', desc: 'Quick AI question' },
25
+ { cmd: '/help', args: '', desc: 'Show all commands' },
26
+ { cmd: '/quit', args: '', desc: 'Exit application' },
27
+ ];
28
+ export default function CommandInput({ onSubmit, activeService, onSuggestionsChange }) {
29
+ const [value, setValue] = useState(''); // The actual typed value (for filtering)
30
+ const [displayValue, setDisplayValue] = useState(''); // What's shown in input (may differ when navigating)
31
+ const [isNavigating, setIsNavigating] = useState(false); // Track if user is arrowing through suggestions
32
+ const [history, setHistory] = useState([]);
33
+ const [historyIndex, setHistoryIndex] = useState(-1);
34
+ const [selectedSuggestion, setSelectedSuggestion] = useState(0);
35
+ // Key to force TextInput remount when value is set programmatically (resets cursor)
36
+ const [inputKey, setInputKey] = useState(0);
37
+ // Filter commands based on the TYPED value (not display value)
38
+ const suggestions = useMemo(() => {
39
+ if (!value.startsWith('/'))
40
+ return [];
41
+ const search = value.toLowerCase();
42
+ return COMMANDS.filter(c => {
43
+ const fullCmd = c.args ? `${c.cmd} ${c.args}` : c.cmd;
44
+ return fullCmd.toLowerCase().includes(search) ||
45
+ c.cmd.toLowerCase().startsWith(search);
46
+ });
47
+ }, [value]);
48
+ const showSuggestions = value.startsWith('/') && value.length >= 1 && suggestions.length > 0;
49
+ // Helper to build full command string from suggestion
50
+ const buildFullCommand = (suggestion) => {
51
+ if (suggestion.args) {
52
+ const hasPlaceholder = suggestion.args.includes('<') || suggestion.args.includes('[');
53
+ if (!hasPlaceholder) {
54
+ return `${suggestion.cmd} ${suggestion.args}`;
55
+ }
56
+ }
57
+ return suggestion.cmd;
58
+ };
59
+ // Notify parent when suggestions change (for layout adjustment)
60
+ useEffect(() => {
61
+ if (onSuggestionsChange) {
62
+ // +2 for border and help text row
63
+ onSuggestionsChange(showSuggestions ? suggestions.length + 2 : 0);
64
+ }
65
+ }, [showSuggestions, suggestions.length, onSuggestionsChange]);
66
+ useInput((input, key) => {
67
+ // Tab to autocomplete selected suggestion (commits the selection)
68
+ if (key.tab && showSuggestions && suggestions[selectedSuggestion]) {
69
+ const suggestion = suggestions[selectedSuggestion];
70
+ const fullCmd = buildFullCommand(suggestion);
71
+ // Commit to both value and displayValue
72
+ setValue(fullCmd);
73
+ setDisplayValue(fullCmd);
74
+ setSelectedSuggestion(0);
75
+ setIsNavigating(false);
76
+ // Increment key to force TextInput remount (resets cursor to end)
77
+ setInputKey(k => k + 1);
78
+ return;
79
+ }
80
+ // Up/Down to navigate suggestions when showing
81
+ if (showSuggestions) {
82
+ if (key.upArrow) {
83
+ const newIndex = Math.max(0, selectedSuggestion - 1);
84
+ setSelectedSuggestion(newIndex);
85
+ setIsNavigating(true);
86
+ // Update display value to show highlighted command
87
+ const suggestion = suggestions[newIndex];
88
+ if (suggestion) {
89
+ setDisplayValue(buildFullCommand(suggestion));
90
+ setInputKey(k => k + 1);
91
+ }
92
+ return;
93
+ }
94
+ if (key.downArrow) {
95
+ const newIndex = Math.min(suggestions.length - 1, selectedSuggestion + 1);
96
+ setSelectedSuggestion(newIndex);
97
+ setIsNavigating(true);
98
+ // Update display value to show highlighted command
99
+ const suggestion = suggestions[newIndex];
100
+ if (suggestion) {
101
+ setDisplayValue(buildFullCommand(suggestion));
102
+ setInputKey(k => k + 1);
103
+ }
104
+ return;
105
+ }
106
+ }
107
+ else {
108
+ // History navigation when not showing suggestions
109
+ if (key.upArrow && history.length > 0) {
110
+ const newIndex = Math.min(historyIndex + 1, history.length - 1);
111
+ setHistoryIndex(newIndex);
112
+ const histVal = history[history.length - 1 - newIndex] || '';
113
+ setValue(histVal);
114
+ setDisplayValue(histVal);
115
+ setInputKey(k => k + 1);
116
+ return;
117
+ }
118
+ if (key.downArrow) {
119
+ const newIndex = Math.max(historyIndex - 1, -1);
120
+ setHistoryIndex(newIndex);
121
+ if (newIndex < 0) {
122
+ setValue('');
123
+ setDisplayValue('');
124
+ }
125
+ else {
126
+ const histVal = history[history.length - 1 - newIndex] || '';
127
+ setValue(histVal);
128
+ setDisplayValue(histVal);
129
+ }
130
+ setInputKey(k => k + 1);
131
+ return;
132
+ }
133
+ }
134
+ });
135
+ const handleSubmit = (input) => {
136
+ if (!input.trim())
137
+ return;
138
+ // Add to history
139
+ if (input.trim()) {
140
+ setHistory(prev => [...prev.filter(h => h !== input.trim()), input.trim()]);
141
+ }
142
+ // Reset state
143
+ setValue('');
144
+ setDisplayValue('');
145
+ setHistoryIndex(-1);
146
+ setSelectedSuggestion(0);
147
+ setIsNavigating(false);
148
+ // Call handler
149
+ onSubmit(input);
150
+ };
151
+ // Handle text input changes
152
+ const handleChange = (v) => {
153
+ // User typed something, reset navigation state
154
+ setValue(v);
155
+ setDisplayValue(v);
156
+ setSelectedSuggestion(0);
157
+ setIsNavigating(false);
158
+ };
159
+ // Get context-specific hints for current tab
160
+ const getHints = () => {
161
+ const hints = [];
162
+ if (activeService) {
163
+ const isRunning = activeService.status === 'running' || activeService.status === 'starting';
164
+ if (isRunning) {
165
+ hints.push(`Ctrl+K stop ${activeService.name}`);
166
+ hints.push(`/restart to restart`);
167
+ }
168
+ if (activeService.id === 'vite') {
169
+ hints.push('r to refresh browser');
170
+ }
171
+ }
172
+ hints.push('Ctrl+L clear logs');
173
+ hints.push('Tab/Arrow switch tabs');
174
+ hints.push('Ctrl+C quit');
175
+ return hints;
176
+ };
177
+ const hints = getHints();
178
+ return (_jsxs(Box, { flexDirection: "column", children: [showSuggestions && (_jsxs(Box, { flexDirection: "column", borderStyle: "round", borderColor: "gray", marginBottom: 0, children: [suggestions.map((suggestion, index) => (_jsxs(Box, { paddingX: 1, children: [_jsx(Text, { backgroundColor: index === selectedSuggestion ? 'blue' : undefined, color: index === selectedSuggestion ? 'white' : 'cyan', bold: index === selectedSuggestion, children: suggestion.cmd }), suggestion.args && (_jsxs(Text, { color: index === selectedSuggestion ? 'white' : 'gray', backgroundColor: index === selectedSuggestion ? 'blue' : undefined, children: [' ', suggestion.args] })), _jsx(Text, { color: "gray", children: " - " }), _jsx(Text, { color: index === selectedSuggestion ? 'white' : 'gray', dimColor: index !== selectedSuggestion, children: suggestion.desc })] }, `${suggestion.cmd}-${suggestion.args}-${index}`))), _jsx(Box, { paddingX: 1, borderStyle: undefined, children: _jsx(Text, { dimColor: true, children: "Tab to complete \u00B7 Up/Down to select" }) })] })), _jsxs(Box, { borderStyle: "single", borderColor: "cyan", paddingX: 1, children: [_jsx(Text, { color: "cyan", bold: true, children: ">" }), _jsx(Text, { children: " " }), _jsx(TextInput, { value: displayValue, onChange: handleChange, onSubmit: () => handleSubmit(displayValue.startsWith('/') ? displayValue : '/' + displayValue), placeholder: "Type / to run a command..." }, inputKey)] }), _jsx(Box, { paddingX: 1, justifyContent: "space-between", children: _jsx(Box, { children: hints.slice(0, 4).map((hint, index) => (_jsxs(React.Fragment, { children: [index > 0 && _jsx(Text, { color: "gray", children: " \u00B7 " }), _jsx(Text, { dimColor: true, children: hint })] }, hint))) }) })] }));
179
+ }
180
+ //# sourceMappingURL=CommandInput.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CommandInput.js","sourceRoot":"","sources":["../../../bin/lib/tui/components/CommandInput.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ interface GeminiPanelProps {
2
+ onClose: () => void;
3
+ onLog: (message: string) => void;
4
+ }
5
+ export default function GeminiPanel({ onClose, onLog }: GeminiPanelProps): import("react/jsx-runtime").JSX.Element;
6
+ export {};
7
+ //# sourceMappingURL=GeminiPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GeminiPanel.d.ts","sourceRoot":"","sources":["../../../bin/lib/tui/components/GeminiPanel.tsx"],"names":[],"mappings":"AASA,UAAU,gBAAgB;IACxB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAOD,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,gBAAgB,2CA6IvE"}
@@ -0,0 +1,99 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect } from 'react';
3
+ import { Box, Text, useInput, useStdout } from 'ink';
4
+ import TextInput from 'ink-text-input';
5
+ import { geminiService, isAuthenticated, loadGeminiConfig, } from '../services/index.js';
6
+ export default function GeminiPanel({ onClose, onLog }) {
7
+ const { stdout } = useStdout();
8
+ const [input, setInput] = useState('');
9
+ const [messages, setMessages] = useState([]);
10
+ const [isLoading, setIsLoading] = useState(false);
11
+ const [scrollOffset, setScrollOffset] = useState(0);
12
+ // Calculate available height for messages
13
+ const maxMessageLines = stdout ? Math.max(5, stdout.rows - 8) : 10;
14
+ // Check authentication on mount
15
+ useEffect(() => {
16
+ if (!isAuthenticated()) {
17
+ setMessages([{
18
+ role: 'system',
19
+ content: 'Not authenticated. Run /gemini enable to set up Google authentication.',
20
+ }]);
21
+ }
22
+ else {
23
+ const config = loadGeminiConfig();
24
+ setMessages([{
25
+ role: 'system',
26
+ content: `Gemini AI ready. ${config.projectContext ? 'Project context loaded.' : ''}\nType your message and press Enter. Press Escape to close.`,
27
+ }]);
28
+ // Load project context
29
+ geminiService.loadProjectContext(process.cwd());
30
+ }
31
+ }, []);
32
+ // Handle keyboard input
33
+ useInput((char, key) => {
34
+ if (key.escape) {
35
+ onClose();
36
+ return;
37
+ }
38
+ // Scroll with Shift+Up/Down
39
+ if (key.shift && key.upArrow) {
40
+ setScrollOffset(prev => Math.min(prev + 1, Math.max(0, messages.length - maxMessageLines)));
41
+ return;
42
+ }
43
+ if (key.shift && key.downArrow) {
44
+ setScrollOffset(prev => Math.max(0, prev - 1));
45
+ return;
46
+ }
47
+ });
48
+ const handleSubmit = async (value) => {
49
+ if (!value.trim() || isLoading)
50
+ return;
51
+ const userMessage = value.trim();
52
+ setInput('');
53
+ // Add user message
54
+ setMessages(prev => [...prev, { role: 'user', content: userMessage }]);
55
+ setIsLoading(true);
56
+ try {
57
+ const response = await geminiService.sendMessage(userMessage);
58
+ setMessages(prev => [...prev, { role: 'assistant', content: response }]);
59
+ setScrollOffset(0); // Auto-scroll to bottom
60
+ }
61
+ catch (err) {
62
+ const errorMessage = err instanceof Error ? err.message : 'Unknown error';
63
+ setMessages(prev => [...prev, {
64
+ role: 'system',
65
+ content: `Error: ${errorMessage}`,
66
+ }]);
67
+ onLog(`Gemini error: ${errorMessage}`);
68
+ }
69
+ finally {
70
+ setIsLoading(false);
71
+ }
72
+ };
73
+ // Render messages with scrolling
74
+ const renderMessages = () => {
75
+ const start = Math.max(0, messages.length - maxMessageLines - scrollOffset);
76
+ const end = messages.length - scrollOffset;
77
+ const visibleMessages = messages.slice(start, end);
78
+ return visibleMessages.map((msg, idx) => {
79
+ let color;
80
+ let prefix;
81
+ switch (msg.role) {
82
+ case 'user':
83
+ color = 'cyan';
84
+ prefix = 'You: ';
85
+ break;
86
+ case 'assistant':
87
+ color = 'green';
88
+ prefix = 'Gemini: ';
89
+ break;
90
+ default:
91
+ color = 'yellow';
92
+ prefix = '';
93
+ }
94
+ return (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { color: color, bold: true, children: prefix }), _jsx(Text, { wrap: "wrap", children: msg.content })] }, start + idx));
95
+ });
96
+ };
97
+ return (_jsxs(Box, { flexDirection: "column", height: "100%", borderStyle: "double", borderColor: "magenta", children: [_jsxs(Box, { paddingX: 1, justifyContent: "space-between", children: [_jsx(Text, { bold: true, color: "magenta", children: "Gemini AI Assistant" }), _jsx(Text, { color: "gray", dimColor: true, children: "Esc to close" })] }), _jsxs(Box, { flexDirection: "column", flexGrow: 1, paddingX: 1, overflow: "hidden", children: [messages.length > maxMessageLines + scrollOffset && (_jsxs(Text, { color: "gray", dimColor: true, children: ["... ", messages.length - maxMessageLines - scrollOffset, " earlier messages"] })), renderMessages(), scrollOffset > 0 && (_jsxs(Text, { color: "gray", dimColor: true, children: ["... ", scrollOffset, " newer messages below"] }))] }), _jsx(Box, { borderStyle: "single", borderColor: "gray", paddingX: 1, children: isLoading ? (_jsx(Text, { color: "yellow", children: "Thinking..." })) : (_jsxs(Box, { children: [_jsx(Text, { color: "magenta", children: "> " }), _jsx(TextInput, { value: input, onChange: setInput, onSubmit: handleSubmit, placeholder: "Ask Gemini something..." })] })) })] }));
98
+ }
99
+ //# sourceMappingURL=GeminiPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GeminiPanel.js","sourceRoot":"","sources":["../../../bin/lib/tui/components/GeminiPanel.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACnD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AACrD,OAAO,SAAS,MAAM,gBAAgB,CAAC;AACvC,OAAO,EACL,aAAa,EACb,eAAe,EACf,gBAAgB,GACjB,MAAM,sBAAsB,CAAC;AAY9B,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAAE,OAAO,EAAE,KAAK,EAAoB;IACtE,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,CAAC;IAC/B,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IACvC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,QAAQ,CAAY,EAAE,CAAC,CAAC;IACxD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAClD,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAEpD,0CAA0C;IAC1C,MAAM,eAAe,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAEnE,gCAAgC;IAChC,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;YACvB,WAAW,CAAC,CAAC;oBACX,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,wEAAwE;iBAClF,CAAC,CAAC,CAAC;QACN,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAClC,WAAW,CAAC,CAAC;oBACX,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,oBAAoB,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,EAAE,6DAA6D;iBACjJ,CAAC,CAAC,CAAC;YACJ,uBAAuB;YACvB,aAAa,CAAC,kBAAkB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QAClD,CAAC;IACH,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,wBAAwB;IACxB,QAAQ,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QACrB,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,OAAO,EAAE,CAAC;YACV,OAAO;QACT,CAAC;QAED,4BAA4B;QAC5B,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAC7B,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;YAC5F,OAAO;QACT,CAAC;QACD,IAAI,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAC/B,eAAe,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;YAC/C,OAAO;QACT,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,YAAY,GAAG,KAAK,EAAE,KAAa,EAAE,EAAE;QAC3C,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,SAAS;YAAE,OAAO;QAEvC,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;QACjC,QAAQ,CAAC,EAAE,CAAC,CAAC;QAEb,mBAAmB;QACnB,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QACvE,YAAY,CAAC,IAAI,CAAC,CAAC;QAEnB,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;YAC9D,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC;YACzE,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,wBAAwB;QAC9C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,YAAY,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;YAC1E,WAAW,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE;oBAC5B,IAAI,EAAE,QAAQ;oBACd,OAAO,EAAE,UAAU,YAAY,EAAE;iBAClC,CAAC,CAAC,CAAC;YACJ,KAAK,CAAC,iBAAiB,YAAY,EAAE,CAAC,CAAC;QACzC,CAAC;gBAAS,CAAC;YACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACtB,CAAC;IACH,CAAC,CAAC;IAEF,iCAAiC;IACjC,MAAM,cAAc,GAAG,GAAG,EAAE;QAC1B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,eAAe,GAAG,YAAY,CAAC,CAAC;QAC5E,MAAM,GAAG,GAAG,QAAQ,CAAC,MAAM,GAAG,YAAY,CAAC;QAC3C,MAAM,eAAe,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAEnD,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACtC,IAAI,KAAa,CAAC;YAClB,IAAI,MAAc,CAAC;YAEnB,QAAQ,GAAG,CAAC,IAAI,EAAE,CAAC;gBACjB,KAAK,MAAM;oBACT,KAAK,GAAG,MAAM,CAAC;oBACf,MAAM,GAAG,OAAO,CAAC;oBACjB,MAAM;gBACR,KAAK,WAAW;oBACd,KAAK,GAAG,OAAO,CAAC;oBAChB,MAAM,GAAG,UAAU,CAAC;oBACpB,MAAM;gBACR;oBACE,KAAK,GAAG,QAAQ,CAAC;oBACjB,MAAM,GAAG,EAAE,CAAC;YAChB,CAAC;YAED,OAAO,CACL,MAAC,GAAG,IAAmB,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,aAC3D,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,EAAE,IAAI,kBAAE,MAAM,GAAQ,EACxC,KAAC,IAAI,IAAC,IAAI,EAAC,MAAM,YAAE,GAAG,CAAC,OAAO,GAAQ,KAF9B,KAAK,GAAG,GAAG,CAGf,CACP,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,WAAW,EAAC,QAAQ,EAAC,WAAW,EAAC,SAAS,aAClF,MAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,EAAE,cAAc,EAAC,eAAe,aAC9C,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,SAAS,oCAA2B,EACrD,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,mCAAoB,IAC3C,EAEN,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAC,QAAQ,aACpE,QAAQ,CAAC,MAAM,GAAG,eAAe,GAAG,YAAY,IAAI,CACnD,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,2BACpB,QAAQ,CAAC,MAAM,GAAG,eAAe,GAAG,YAAY,yBAChD,CACR,EACA,cAAc,EAAE,EAChB,YAAY,GAAG,CAAC,IAAI,CACnB,MAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,QAAQ,2BAAM,YAAY,6BAA6B,CAC3E,IACG,EAEN,KAAC,GAAG,IAAC,WAAW,EAAC,QAAQ,EAAC,WAAW,EAAC,MAAM,EAAC,QAAQ,EAAE,CAAC,YACrD,SAAS,CAAC,CAAC,CAAC,CACX,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,4BAAmB,CACxC,CAAC,CAAC,CAAC,CACF,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAC,SAAS,mBAAa,EAClC,KAAC,SAAS,IACR,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,EAClB,QAAQ,EAAE,YAAY,EACtB,WAAW,EAAC,yBAAyB,GACrC,IACE,CACP,GACG,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,6 @@
1
+ interface HeaderProps {
2
+ projectName: string;
3
+ }
4
+ export default function Header({ projectName }: HeaderProps): import("react/jsx-runtime").JSX.Element;
5
+ export {};
6
+ //# sourceMappingURL=Header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Header.d.ts","sourceRoot":"","sources":["../../../bin/lib/tui/components/Header.tsx"],"names":[],"mappings":"AAGA,UAAU,WAAW;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,WAAW,EAAE,EAAE,WAAW,2CAmB1D"}
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ export default function Header({ projectName }) {
4
+ return (_jsxs(Box, { borderStyle: "single", borderColor: "blue", paddingX: 1, justifyContent: "space-between", children: [_jsxs(Box, { children: [_jsx(Text, { color: "blue", bold: true, children: "GxP" }), _jsx(Text, { color: "white", children: " DevStudio" }), _jsx(Text, { color: "gray", children: " - " }), _jsx(Text, { color: "cyan", children: projectName })] }), _jsx(Box, { children: _jsx(Text, { color: "gray", children: "Ctrl+C to quit" }) })] }));
5
+ }
6
+ //# sourceMappingURL=Header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Header.js","sourceRoot":"","sources":["../../../bin/lib/tui/components/Header.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAMhC,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,WAAW,EAAe;IACzD,OAAO,CACL,MAAC,GAAG,IACF,WAAW,EAAC,QAAQ,EACpB,WAAW,EAAC,MAAM,EAClB,QAAQ,EAAE,CAAC,EACX,cAAc,EAAC,eAAe,aAE9B,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,EAAC,IAAI,0BAAW,EAClC,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,2BAAkB,EACrC,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,oBAAW,EAC7B,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,WAAW,GAAQ,IACnC,EACN,KAAC,GAAG,cACF,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,+BAAsB,GACpC,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ interface LogPanelProps {
2
+ logs: string[];
3
+ isActive?: boolean;
4
+ maxHeight?: number;
5
+ }
6
+ export default function LogPanel({ logs, isActive, maxHeight }: LogPanelProps): import("react/jsx-runtime").JSX.Element;
7
+ export {};
8
+ //# sourceMappingURL=LogPanel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogPanel.d.ts","sourceRoot":"","sources":["../../../bin/lib/tui/components/LogPanel.tsx"],"names":[],"mappings":"AAGA,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,EAAE,IAAI,EAAE,QAAe,EAAE,SAAS,EAAE,EAAE,aAAa,2CA4FnF"}
@@ -0,0 +1,89 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { useState, useEffect } from 'react';
3
+ import { Box, Text, useStdout, useInput } from 'ink';
4
+ export default function LogPanel({ logs, isActive = true, maxHeight }) {
5
+ const { stdout } = useStdout();
6
+ const [scrollOffset, setScrollOffset] = useState(0);
7
+ const [autoScroll, setAutoScroll] = useState(true);
8
+ // Calculate visible lines based on provided maxHeight or terminal height
9
+ // Subtract 2 for padding, 2 for border
10
+ const defaultMaxLines = stdout ? Math.max(5, stdout.rows - 10) : 15;
11
+ const maxLines = maxHeight ? Math.max(3, maxHeight - 4) : defaultMaxLines;
12
+ // Reset scroll when logs are cleared
13
+ useEffect(() => {
14
+ if (logs.length === 0) {
15
+ setScrollOffset(0);
16
+ setAutoScroll(true);
17
+ }
18
+ }, [logs.length === 0]);
19
+ // Auto-scroll to bottom when new logs arrive (if autoScroll is enabled)
20
+ useEffect(() => {
21
+ if (autoScroll) {
22
+ setScrollOffset(0);
23
+ }
24
+ }, [logs.length, autoScroll]);
25
+ // Handle keyboard input for scrolling
26
+ useInput((input, key) => {
27
+ if (!isActive)
28
+ return;
29
+ // Page Up - scroll up by half a page
30
+ if (key.pageUp || (key.shift && key.upArrow)) {
31
+ const maxOffset = Math.max(0, logs.length - maxLines);
32
+ setScrollOffset(prev => Math.min(prev + Math.floor(maxLines / 2), maxOffset));
33
+ setAutoScroll(false);
34
+ return;
35
+ }
36
+ // Page Down - scroll down by half a page
37
+ if (key.pageDown || (key.shift && key.downArrow)) {
38
+ setScrollOffset(prev => {
39
+ const newOffset = Math.max(prev - Math.floor(maxLines / 2), 0);
40
+ if (newOffset === 0)
41
+ setAutoScroll(true);
42
+ return newOffset;
43
+ });
44
+ return;
45
+ }
46
+ // Home - scroll to top
47
+ if (key.meta && key.upArrow) {
48
+ const maxOffset = Math.max(0, logs.length - maxLines);
49
+ setScrollOffset(maxOffset);
50
+ setAutoScroll(false);
51
+ return;
52
+ }
53
+ // End - scroll to bottom
54
+ if (key.meta && key.downArrow) {
55
+ setScrollOffset(0);
56
+ setAutoScroll(true);
57
+ return;
58
+ }
59
+ });
60
+ // Calculate visible logs with scroll offset
61
+ const totalLogs = logs.length;
62
+ const startIndex = Math.max(0, totalLogs - maxLines - scrollOffset);
63
+ const endIndex = Math.max(0, totalLogs - scrollOffset);
64
+ const visibleLogs = logs.slice(startIndex, endIndex);
65
+ // Show scroll indicator
66
+ const canScrollUp = startIndex > 0;
67
+ const canScrollDown = scrollOffset > 0;
68
+ return (_jsxs(Box, { flexDirection: "column", padding: 1, flexGrow: 1, overflow: "hidden", children: [canScrollUp && (_jsxs(Text, { color: "gray", dimColor: true, children: ["\u2191 ", startIndex, " more lines (Shift+\u2191 to scroll)"] })), visibleLogs.length === 0 ? (_jsx(Text, { color: "gray", dimColor: true, children: "No logs yet..." })) : (visibleLogs.map((log, index) => (_jsx(Text, { wrap: "wrap", children: formatLog(log) }, startIndex + index)))), canScrollDown && (_jsxs(Text, { color: "gray", dimColor: true, children: ["\u2193 ", scrollOffset, " more lines (Shift+\u2193 to scroll)"] }))] }));
69
+ }
70
+ function formatLog(log) {
71
+ // Color code different log types
72
+ if (log.startsWith('[VITE]') || log.includes('VITE')) {
73
+ return _jsx(Text, { color: "cyan", children: log });
74
+ }
75
+ if (log.startsWith('[SOCKET]') || log.includes('Socket')) {
76
+ return _jsx(Text, { color: "green", children: log });
77
+ }
78
+ if (log.includes('error') || log.includes('Error') || log.includes('ERROR')) {
79
+ return _jsx(Text, { color: "red", children: log });
80
+ }
81
+ if (log.includes('warning') || log.includes('Warning') || log.includes('WARN')) {
82
+ return _jsx(Text, { color: "yellow", children: log });
83
+ }
84
+ if (log.includes('Starting') || log.includes('started')) {
85
+ return _jsx(Text, { color: "blue", children: log });
86
+ }
87
+ return _jsx(Text, { children: log });
88
+ }
89
+ //# sourceMappingURL=LogPanel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LogPanel.js","sourceRoot":"","sources":["../../../bin/lib/tui/components/LogPanel.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { Service } from '../App.js';
2
+ interface TabBarProps {
3
+ services: Service[];
4
+ activeTab: number;
5
+ onTabChange: (index: number) => void;
6
+ }
7
+ export default function TabBar({ services, activeTab, onTabChange }: TabBarProps): import("react/jsx-runtime").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=TabBar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabBar.d.ts","sourceRoot":"","sources":["../../../bin/lib/tui/components/TabBar.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,UAAU,WAAW;IACnB,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAgBD,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAE,EAAE,WAAW,2CA+B/E"}
@@ -0,0 +1,23 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ const STATUS_COLORS = {
4
+ stopped: 'gray',
5
+ starting: 'yellow',
6
+ running: 'green',
7
+ error: 'red',
8
+ };
9
+ const STATUS_ICONS = {
10
+ stopped: '○',
11
+ starting: '◐',
12
+ running: '●',
13
+ error: '✖',
14
+ };
15
+ export default function TabBar({ services, activeTab, onTabChange }) {
16
+ return (_jsxs(Box, { paddingX: 1, gap: 2, justifyContent: "space-between", children: [_jsx(Box, { gap: 2, children: services.map((service, index) => {
17
+ const isActive = index === activeTab;
18
+ const statusColor = STATUS_COLORS[service.status];
19
+ const statusIcon = STATUS_ICONS[service.status];
20
+ return (_jsx(Box, { children: _jsxs(Text, { color: isActive ? 'white' : 'gray', backgroundColor: isActive ? 'blue' : undefined, bold: isActive, children: [' ', _jsx(Text, { color: statusColor, children: statusIcon }), ' ', service.name, ' '] }) }, service.id));
21
+ }) }), _jsx(Box, { children: _jsx(Text, { color: "gray", children: "Tab/\u2190\u2192 switch tabs" }) })] }));
22
+ }
23
+ //# sourceMappingURL=TabBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TabBar.js","sourceRoot":"","sources":["../../../bin/lib/tui/components/TabBar.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAShC,MAAM,aAAa,GAAsC;IACvD,OAAO,EAAE,MAAM;IACf,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,OAAO;IAChB,KAAK,EAAE,KAAK;CACb,CAAC;AAEF,MAAM,YAAY,GAAsC;IACtD,OAAO,EAAE,GAAG;IACZ,QAAQ,EAAE,GAAG;IACb,OAAO,EAAE,GAAG;IACZ,KAAK,EAAE,GAAG;CACX,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAW,EAAe;IAC9E,OAAO,CACL,MAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,cAAc,EAAC,eAAe,aACtD,KAAC,GAAG,IAAC,GAAG,EAAE,CAAC,YACR,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE;oBAC/B,MAAM,QAAQ,GAAG,KAAK,KAAK,SAAS,CAAC;oBACrC,MAAM,WAAW,GAAG,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBAClD,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBAEhD,OAAO,CACL,KAAC,GAAG,cACF,MAAC,IAAI,IACH,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAClC,eAAe,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAC9C,IAAI,EAAE,QAAQ,aAEb,GAAG,EACJ,KAAC,IAAI,IAAC,KAAK,EAAE,WAAW,YAAG,UAAU,GAAQ,EAC5C,GAAG,EACH,OAAO,CAAC,IAAI,EACZ,GAAG,IACC,IAXC,OAAO,CAAC,EAAE,CAYd,CACP,CAAC;gBACJ,CAAC,CAAC,GACE,EACN,KAAC,GAAG,cACF,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,6CAA0B,GACxC,IACF,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export default function WelcomeScreen(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=WelcomeScreen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WelcomeScreen.d.ts","sourceRoot":"","sources":["../../../bin/lib/tui/components/WelcomeScreen.tsx"],"names":[],"mappings":"AAYA,MAAM,CAAC,OAAO,UAAU,aAAa,4CAmEpC"}
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ const LOGO = `
4
+ ██████╗ ██╗ ██╗██████╗
5
+ ██╔════╝ ╚██╗██╔╝██╔══██╗
6
+ ██║ ███╗ ╚███╔╝ ██████╔╝
7
+ ██║ ██║ ██╔██╗ ██╔═══╝
8
+ ╚██████╔╝██╔╝ ██╗██║
9
+ ╚═════╝ ╚═╝ ╚═╝╚═╝
10
+ `;
11
+ export default function WelcomeScreen() {
12
+ return (_jsxs(Box, { flexDirection: "column", alignItems: "center", justifyContent: "center", flexGrow: 1, padding: 1, children: [_jsx(Text, { color: "blue", children: LOGO }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { bold: true, color: "white", children: "GxP DevStudio" }) }), _jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "gray", children: "Interactive development environment for GxP plugins" }) }), _jsxs(Box, { marginTop: 2, flexDirection: "row", justifyContent: "center", children: [_jsxs(Box, { flexDirection: "column", marginRight: 4, children: [_jsx(Text, { color: "cyan", bold: true, children: "Quick Start" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsxs(Text, { children: [" ", _jsx(Text, { color: "yellow", children: "/dev" }), " Start Vite dev server"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "yellow", children: "/dev --with-socket" }), " Start Vite + Socket.IO"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "yellow", children: "/dev --no-socket" }), " Start Vite only (no Socket)"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "yellow", children: "/socket" }), " Start Socket.IO server"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "yellow", children: "/ext chrome" }), " Launch Chrome extension"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "yellow", children: "/help" }), " Show all commands"] })] })] }), _jsxs(Box, { flexDirection: "column", marginLeft: 4, children: [_jsx(Text, { color: "cyan", bold: true, children: "Keyboard Shortcuts" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsxs(Text, { children: [" ", _jsx(Text, { color: "green", children: "Tab" }), " Cycle through tabs"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "green", children: "Left/Right" }), " Switch tabs"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "green", children: "Ctrl+K" }), " Stop current service"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "green", children: "Ctrl+L" }), " Clear current log"] }), _jsxs(Text, { children: [" ", _jsx(Text, { color: "green", children: "Ctrl+C" }), " Exit application"] })] })] })] }), _jsxs(Box, { marginTop: 2, flexDirection: "column", alignItems: "center", children: [_jsx(Text, { color: "cyan", bold: true, children: "Socket Events" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", alignItems: "center", children: [_jsxs(Text, { color: "gray", children: ["Use ", _jsx(Text, { color: "yellow", children: "/socket list" }), " to see available events"] }), _jsxs(Text, { color: "gray", children: ["Use ", _jsx(Text, { color: "yellow", children: "/socket send EventName" }), " to simulate events"] })] })] }), _jsxs(Box, { marginTop: 2, flexDirection: "column", alignItems: "center", children: [_jsx(Text, { color: "cyan", bold: true, children: "Browser Extensions" }), _jsxs(Box, { marginTop: 1, flexDirection: "column", alignItems: "center", children: [_jsx(Text, { color: "gray", children: "Test your plugin on live GxP pages with the browser extension" }), _jsx(Text, { color: "gray", children: "Open DevTools and use the \"GxP Inspector\" panel to select components" })] })] }), _jsx(Box, { marginTop: 2, children: _jsx(Text, { dimColor: true, children: "Type a command below to get started..." }) })] }));
13
+ }
14
+ //# sourceMappingURL=WelcomeScreen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"WelcomeScreen.js","sourceRoot":"","sources":["../../../bin/lib/tui/components/WelcomeScreen.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ interface TUIOptions {
3
+ autoStart?: string[];
4
+ args?: Record<string, unknown>;
5
+ }
6
+ export declare function startTUI(options?: TUIOptions): void;
7
+ export default startTUI;
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../bin/lib/tui/index.tsx"],"names":[],"mappings":";AAWA,UAAU,UAAU;IAClB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChC;AAED,wBAAgB,QAAQ,CAAC,OAAO,GAAE,UAAe,QAqChD;AASD,eAAe,QAAQ,CAAC"}
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env node
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { render } from 'ink';
4
+ import dotenv from 'dotenv';
5
+ import path from 'path';
6
+ import App from './App.js';
7
+ import { serviceManager } from './services/index.js';
8
+ // Load .env from the current working directory (project directory)
9
+ dotenv.config({ path: path.join(process.cwd(), '.env') });
10
+ export function startTUI(options = {}) {
11
+ // Check if stdin supports raw mode (required for Ink input handling)
12
+ // This can fail when:
13
+ // - Running in CI environments
14
+ // - Piped input (stdin is not a TTY)
15
+ // - Some terminal emulators
16
+ const stdin = process.stdin;
17
+ const stdinIsTTY = stdin.isTTY === true;
18
+ // If stdin doesn't support raw mode, we need to handle it gracefully
19
+ // Ink 5.x uses stdin by default and requires raw mode for input
20
+ if (!stdinIsTTY) {
21
+ console.error('Warning: Terminal does not support interactive mode.');
22
+ console.error('The TUI requires an interactive terminal (TTY) to function.');
23
+ console.error('');
24
+ console.error('Try running the command directly from your terminal, not from a script or pipe.');
25
+ console.error('');
26
+ console.error('Alternatively, use the non-TUI commands:');
27
+ console.error(' npm run dev # Start Vite dev server');
28
+ console.error(' npm run dev-http # Start HTTP dev server');
29
+ console.error(' gxdev socket list # List socket events');
30
+ process.exit(1);
31
+ return;
32
+ }
33
+ const { waitUntilExit } = render(_jsx(App, { autoStart: options.autoStart, args: options.args }));
34
+ waitUntilExit().then(() => {
35
+ // Ensure all services are stopped before exiting
36
+ serviceManager.forceStopAll();
37
+ process.exit(0);
38
+ });
39
+ }
40
+ // Check if run directly (ESM way)
41
+ import { fileURLToPath } from 'url';
42
+ const isMain = process.argv[1] && process.argv[1] === fileURLToPath(import.meta.url);
43
+ if (isMain) {
44
+ startTUI();
45
+ }
46
+ export default startTUI;
47
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../bin/lib/tui/index.tsx"],"names":[],"mappings":";;AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,GAAG,MAAM,UAAU,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,mEAAmE;AACnE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;AAO1D,MAAM,UAAU,QAAQ,CAAC,UAAsB,EAAE;IAC/C,qEAAqE;IACrE,sBAAsB;IACtB,+BAA+B;IAC/B,qCAAqC;IACrC,4BAA4B;IAC5B,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAC5B,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC;IAExC,qEAAqE;IACrE,gEAAgE;IAChE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACtE,OAAO,CAAC,KAAK,CAAC,6DAA6D,CAAC,CAAC;QAC7E,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,iFAAiF,CAAC,CAAC;QACjG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC1D,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC9D,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC9D,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAC;QAC5D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAChB,OAAO;IACT,CAAC;IAED,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,CAC9B,KAAC,GAAG,IACF,SAAS,EAAE,OAAO,CAAC,SAAS,EAC5B,IAAI,EAAE,OAAO,CAAC,IAAI,GAClB,CACH,CAAC;IAEF,aAAa,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE;QACxB,iDAAiD;QACjD,cAAc,CAAC,YAAY,EAAE,CAAC;QAC9B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,kCAAkC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACrF,IAAI,MAAM,EAAE,CAAC;IACX,QAAQ,EAAE,CAAC;AACb,CAAC;AAED,eAAe,QAAQ,CAAC"}
@@ -0,0 +1 @@
1
+ {"type":"module"}