@gxp-dev/tools 2.0.63 → 2.0.65

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 (182) hide show
  1. package/README.md +32 -31
  2. package/bin/gx-devtools.js +74 -54
  3. package/bin/lib/cli.js +23 -21
  4. package/bin/lib/commands/add-dependency.js +366 -325
  5. package/bin/lib/commands/assets.js +137 -139
  6. package/bin/lib/commands/build.js +169 -174
  7. package/bin/lib/commands/datastore.js +181 -183
  8. package/bin/lib/commands/dev.js +127 -131
  9. package/bin/lib/commands/extensions.js +147 -149
  10. package/bin/lib/commands/extract-config.js +73 -67
  11. package/bin/lib/commands/index.js +12 -12
  12. package/bin/lib/commands/init.js +342 -240
  13. package/bin/lib/commands/publish.js +69 -75
  14. package/bin/lib/commands/socket.js +69 -69
  15. package/bin/lib/commands/ssl.js +14 -14
  16. package/bin/lib/constants.js +10 -24
  17. package/bin/lib/tui/App.tsx +761 -705
  18. package/bin/lib/tui/components/AIPanel.tsx +191 -171
  19. package/bin/lib/tui/components/CommandInput.tsx +394 -343
  20. package/bin/lib/tui/components/GeminiPanel.tsx +175 -151
  21. package/bin/lib/tui/components/Header.tsx +23 -21
  22. package/bin/lib/tui/components/LogPanel.tsx +244 -220
  23. package/bin/lib/tui/components/TabBar.tsx +50 -48
  24. package/bin/lib/tui/components/WelcomeScreen.tsx +126 -71
  25. package/bin/lib/tui/index.tsx +37 -39
  26. package/bin/lib/tui/services/AIService.ts +518 -462
  27. package/bin/lib/tui/services/ExtensionService.ts +140 -129
  28. package/bin/lib/tui/services/GeminiService.ts +367 -337
  29. package/bin/lib/tui/services/ServiceManager.ts +344 -322
  30. package/bin/lib/tui/services/SocketService.ts +168 -168
  31. package/bin/lib/tui/services/ViteService.ts +88 -88
  32. package/bin/lib/tui/services/index.ts +47 -22
  33. package/bin/lib/utils/ai-scaffold.js +291 -280
  34. package/bin/lib/utils/extract-config.js +157 -140
  35. package/bin/lib/utils/files.js +82 -86
  36. package/bin/lib/utils/index.js +7 -7
  37. package/bin/lib/utils/paths.js +34 -34
  38. package/bin/lib/utils/prompts.js +194 -169
  39. package/bin/lib/utils/ssl.js +79 -81
  40. package/browser-extensions/README.md +0 -1
  41. package/browser-extensions/chrome/background.js +244 -237
  42. package/browser-extensions/chrome/content.js +32 -29
  43. package/browser-extensions/chrome/devtools.html +7 -7
  44. package/browser-extensions/chrome/devtools.js +19 -19
  45. package/browser-extensions/chrome/inspector.js +802 -767
  46. package/browser-extensions/chrome/manifest.json +71 -63
  47. package/browser-extensions/chrome/panel.html +674 -636
  48. package/browser-extensions/chrome/panel.js +722 -712
  49. package/browser-extensions/chrome/popup.html +586 -543
  50. package/browser-extensions/chrome/popup.js +282 -244
  51. package/browser-extensions/chrome/rules.json +1 -1
  52. package/browser-extensions/chrome/test-chrome.html +216 -136
  53. package/browser-extensions/chrome/test-mixed-content.html +284 -189
  54. package/browser-extensions/chrome/test-uri-pattern.html +221 -198
  55. package/browser-extensions/firefox/README.md +9 -6
  56. package/browser-extensions/firefox/background.js +221 -218
  57. package/browser-extensions/firefox/content.js +55 -52
  58. package/browser-extensions/firefox/debug-errors.html +386 -228
  59. package/browser-extensions/firefox/debug-https.html +153 -105
  60. package/browser-extensions/firefox/devtools.html +7 -7
  61. package/browser-extensions/firefox/devtools.js +23 -20
  62. package/browser-extensions/firefox/inspector.js +802 -767
  63. package/browser-extensions/firefox/manifest.json +68 -68
  64. package/browser-extensions/firefox/panel.html +674 -636
  65. package/browser-extensions/firefox/panel.js +722 -712
  66. package/browser-extensions/firefox/popup.html +572 -535
  67. package/browser-extensions/firefox/popup.js +281 -236
  68. package/browser-extensions/firefox/test-gramercy.html +170 -125
  69. package/browser-extensions/firefox/test-imports.html +59 -55
  70. package/browser-extensions/firefox/test-masking.html +231 -140
  71. package/browser-extensions/firefox/test-uri-pattern.html +221 -198
  72. package/dist/tui/App.d.ts +1 -1
  73. package/dist/tui/App.d.ts.map +1 -1
  74. package/dist/tui/App.js +154 -150
  75. package/dist/tui/App.js.map +1 -1
  76. package/dist/tui/components/AIPanel.d.ts.map +1 -1
  77. package/dist/tui/components/AIPanel.js +42 -35
  78. package/dist/tui/components/AIPanel.js.map +1 -1
  79. package/dist/tui/components/CommandInput.d.ts +1 -1
  80. package/dist/tui/components/CommandInput.d.ts.map +1 -1
  81. package/dist/tui/components/CommandInput.js +92 -62
  82. package/dist/tui/components/CommandInput.js.map +1 -1
  83. package/dist/tui/components/GeminiPanel.d.ts.map +1 -1
  84. package/dist/tui/components/GeminiPanel.js +37 -30
  85. package/dist/tui/components/GeminiPanel.js.map +1 -1
  86. package/dist/tui/components/Header.d.ts.map +1 -1
  87. package/dist/tui/components/Header.js +1 -1
  88. package/dist/tui/components/Header.js.map +1 -1
  89. package/dist/tui/components/LogPanel.d.ts +1 -1
  90. package/dist/tui/components/LogPanel.d.ts.map +1 -1
  91. package/dist/tui/components/LogPanel.js +26 -24
  92. package/dist/tui/components/LogPanel.js.map +1 -1
  93. package/dist/tui/components/TabBar.d.ts +2 -2
  94. package/dist/tui/components/TabBar.d.ts.map +1 -1
  95. package/dist/tui/components/TabBar.js +11 -11
  96. package/dist/tui/components/TabBar.js.map +1 -1
  97. package/dist/tui/components/WelcomeScreen.d.ts.map +1 -1
  98. package/dist/tui/components/WelcomeScreen.js +6 -6
  99. package/dist/tui/components/WelcomeScreen.js.map +1 -1
  100. package/dist/tui/index.d.ts.map +1 -1
  101. package/dist/tui/index.js +8 -8
  102. package/dist/tui/index.js.map +1 -1
  103. package/dist/tui/services/AIService.d.ts +2 -2
  104. package/dist/tui/services/AIService.d.ts.map +1 -1
  105. package/dist/tui/services/AIService.js +165 -125
  106. package/dist/tui/services/AIService.js.map +1 -1
  107. package/dist/tui/services/ExtensionService.d.ts +1 -1
  108. package/dist/tui/services/ExtensionService.d.ts.map +1 -1
  109. package/dist/tui/services/ExtensionService.js +33 -26
  110. package/dist/tui/services/ExtensionService.js.map +1 -1
  111. package/dist/tui/services/GeminiService.d.ts +1 -1
  112. package/dist/tui/services/GeminiService.d.ts.map +1 -1
  113. package/dist/tui/services/GeminiService.js +87 -76
  114. package/dist/tui/services/GeminiService.js.map +1 -1
  115. package/dist/tui/services/ServiceManager.d.ts +3 -3
  116. package/dist/tui/services/ServiceManager.d.ts.map +1 -1
  117. package/dist/tui/services/ServiceManager.js +72 -58
  118. package/dist/tui/services/ServiceManager.js.map +1 -1
  119. package/dist/tui/services/SocketService.d.ts.map +1 -1
  120. package/dist/tui/services/SocketService.js +32 -32
  121. package/dist/tui/services/SocketService.js.map +1 -1
  122. package/dist/tui/services/ViteService.d.ts.map +1 -1
  123. package/dist/tui/services/ViteService.js +26 -28
  124. package/dist/tui/services/ViteService.js.map +1 -1
  125. package/dist/tui/services/index.d.ts +6 -6
  126. package/dist/tui/services/index.d.ts.map +1 -1
  127. package/dist/tui/services/index.js +6 -6
  128. package/dist/tui/services/index.js.map +1 -1
  129. package/mcp/gxp-api-server.js +83 -81
  130. package/package.json +109 -93
  131. package/runtime/PortalContainer.vue +258 -234
  132. package/runtime/dev-tools/DevToolsModal.vue +153 -155
  133. package/runtime/dev-tools/LayoutSwitcher.vue +144 -140
  134. package/runtime/dev-tools/MockDataEditor.vue +456 -433
  135. package/runtime/dev-tools/SocketSimulator.vue +379 -371
  136. package/runtime/dev-tools/StoreInspector.vue +517 -455
  137. package/runtime/dev-tools/index.js +5 -5
  138. package/runtime/fallback-layouts/PrivateLayout.vue +2 -2
  139. package/runtime/fallback-layouts/PublicLayout.vue +2 -2
  140. package/runtime/fallback-layouts/SystemLayout.vue +2 -2
  141. package/runtime/gxpStringsPlugin.js +159 -134
  142. package/runtime/index.html +17 -19
  143. package/runtime/main.js +24 -22
  144. package/runtime/mock-api/auth-middleware.js +15 -15
  145. package/runtime/mock-api/image-generator.js +46 -46
  146. package/runtime/mock-api/index.js +55 -55
  147. package/runtime/mock-api/response-generator.js +116 -105
  148. package/runtime/mock-api/route-generator.js +107 -84
  149. package/runtime/mock-api/socket-triggers.js +94 -93
  150. package/runtime/mock-api/spec-loader.js +79 -80
  151. package/runtime/package.json +3 -0
  152. package/runtime/server.js +68 -68
  153. package/runtime/stores/gxpPortalConfigStore.js +204 -186
  154. package/runtime/stores/index.js +2 -2
  155. package/runtime/vite-inspector-plugin.js +858 -707
  156. package/runtime/vite-source-tracker-plugin.js +132 -113
  157. package/runtime/vite.config.js +191 -139
  158. package/scripts/launch-chrome.js +41 -41
  159. package/scripts/pack-chrome.js +38 -39
  160. package/socket-events/AiSessionMessageCreated.json +17 -17
  161. package/socket-events/SocialStreamPostCreated.json +23 -23
  162. package/socket-events/SocialStreamPostVariantCompleted.json +22 -22
  163. package/template/.claude/agents/gxp-developer.md +100 -99
  164. package/template/.claude/settings.json +7 -7
  165. package/template/AGENTS.md +30 -23
  166. package/template/GEMINI.md +20 -20
  167. package/template/README.md +70 -53
  168. package/template/app-manifest.json +2 -4
  169. package/template/configuration.json +10 -10
  170. package/template/default-styling.css +1 -1
  171. package/template/index.html +18 -20
  172. package/template/main.js +24 -22
  173. package/template/src/DemoPage.vue +415 -362
  174. package/template/src/Plugin.vue +76 -85
  175. package/template/src/stores/index.js +3 -3
  176. package/template/src/stores/test-data.json +164 -172
  177. package/template/theme-layouts/AdditionalStyling.css +50 -50
  178. package/template/theme-layouts/PrivateLayout.vue +8 -12
  179. package/template/theme-layouts/PublicLayout.vue +8 -12
  180. package/template/theme-layouts/SystemLayout.vue +8 -12
  181. package/template/vite.extend.js +45 -0
  182. package/template/vite.config.js +0 -409
@@ -1,180 +1,200 @@
1
- import React, { useState, useEffect } from 'react';
2
- import { Box, Text, useInput, useStdout } from 'ink';
3
- import TextInput from 'ink-text-input';
4
- import {
5
- aiService,
6
- getProviderStatus,
7
- } from '../services/index.js';
1
+ import React, { useState, useEffect } from "react"
2
+ import { Box, Text, useInput, useStdout } from "ink"
3
+ import TextInput from "ink-text-input"
4
+ import { aiService, getProviderStatus } from "../services/index.js"
8
5
 
9
6
  interface AIPanelProps {
10
- onClose: () => void;
11
- onLog: (message: string) => void;
7
+ onClose: () => void
8
+ onLog: (message: string) => void
12
9
  }
13
10
 
14
11
  interface Message {
15
- role: 'user' | 'assistant' | 'system';
16
- content: string;
12
+ role: "user" | "assistant" | "system"
13
+ content: string
17
14
  }
18
15
 
19
16
  export default function AIPanel({ onClose, onLog }: AIPanelProps) {
20
- const { stdout } = useStdout();
21
- const [input, setInput] = useState('');
22
- const [messages, setMessages] = useState<Message[]>([]);
23
- const [isLoading, setIsLoading] = useState(false);
24
- const [scrollOffset, setScrollOffset] = useState(0);
25
-
26
- // Calculate available height for messages
27
- const maxMessageLines = stdout ? Math.max(5, stdout.rows - 8) : 10;
28
-
29
- // Get provider info for display
30
- const providerInfo = aiService.getProviderInfo();
31
- const providerName = providerInfo?.name || 'AI';
32
-
33
- // Check provider availability on mount
34
- useEffect(() => {
35
- if (!aiService.isAvailable()) {
36
- setMessages([{
37
- role: 'system',
38
- content: `${providerName} is not available. Run /ai model to select a different provider, or install the required CLI.`,
39
- }]);
40
- } else {
41
- const status = getProviderStatus(providerInfo!);
42
- setMessages([{
43
- role: 'system',
44
- content: `${status} ready.\nType your message and press Enter. Press Escape to close.`,
45
- }]);
46
- // Load project context
47
- aiService.loadProjectContext(process.cwd());
48
- }
49
- }, []);
50
-
51
- // Handle keyboard input
52
- useInput((char, key) => {
53
- if (key.escape) {
54
- onClose();
55
- return;
56
- }
57
-
58
- // Scroll with Shift+Up/Down
59
- if (key.shift && key.upArrow) {
60
- setScrollOffset(prev => Math.min(prev + 1, Math.max(0, messages.length - maxMessageLines)));
61
- return;
62
- }
63
- if (key.shift && key.downArrow) {
64
- setScrollOffset(prev => Math.max(0, prev - 1));
65
- return;
66
- }
67
- });
68
-
69
- const handleSubmit = async (value: string) => {
70
- if (!value.trim() || isLoading) return;
71
-
72
- const userMessage = value.trim();
73
- setInput('');
74
-
75
- // Add user message
76
- setMessages(prev => [...prev, { role: 'user', content: userMessage }]);
77
- setIsLoading(true);
78
-
79
- try {
80
- const response = await aiService.sendMessage(userMessage);
81
- setMessages(prev => [...prev, { role: 'assistant', content: response }]);
82
- setScrollOffset(0); // Auto-scroll to bottom
83
- } catch (err) {
84
- const errorMessage = err instanceof Error ? err.message : 'Unknown error';
85
- setMessages(prev => [...prev, {
86
- role: 'system',
87
- content: `Error: ${errorMessage}`,
88
- }]);
89
- onLog(`${providerName} error: ${errorMessage}`);
90
- } finally {
91
- setIsLoading(false);
92
- }
93
- };
94
-
95
- // Render messages with scrolling
96
- const renderMessages = () => {
97
- const start = Math.max(0, messages.length - maxMessageLines - scrollOffset);
98
- const end = messages.length - scrollOffset;
99
- const visibleMessages = messages.slice(start, end);
100
-
101
- return visibleMessages.map((msg, idx) => {
102
- let color: string;
103
- let prefix: string;
104
-
105
- switch (msg.role) {
106
- case 'user':
107
- color = 'cyan';
108
- prefix = 'You: ';
109
- break;
110
- case 'assistant':
111
- color = 'green';
112
- prefix = `${providerName}: `;
113
- break;
114
- default:
115
- color = 'yellow';
116
- prefix = '';
117
- }
118
-
119
- return (
120
- <Box key={start + idx} flexDirection="column" marginBottom={1}>
121
- <Text color={color} bold>{prefix}</Text>
122
- <Text wrap="wrap">{msg.content}</Text>
123
- </Box>
124
- );
125
- });
126
- };
127
-
128
- // Get border color based on provider
129
- const getBorderColor = (): string => {
130
- switch (aiService.getProvider()) {
131
- case 'claude':
132
- return 'magenta';
133
- case 'codex':
134
- return 'green';
135
- case 'gemini':
136
- return 'blue';
137
- default:
138
- return 'gray';
139
- }
140
- };
141
-
142
- const borderColor = getBorderColor();
143
-
144
- return (
145
- <Box flexDirection="column" height="100%" borderStyle="double" borderColor={borderColor}>
146
- <Box paddingX={1} justifyContent="space-between">
147
- <Text bold color={borderColor}>{providerName} AI Assistant</Text>
148
- <Text color="gray" dimColor>Esc to close · /ai model to switch</Text>
149
- </Box>
150
-
151
- <Box flexDirection="column" flexGrow={1} paddingX={1} overflow="hidden">
152
- {messages.length > maxMessageLines + scrollOffset && (
153
- <Text color="gray" dimColor>
154
- ... {messages.length - maxMessageLines - scrollOffset} earlier messages
155
- </Text>
156
- )}
157
- {renderMessages()}
158
- {scrollOffset > 0 && (
159
- <Text color="gray" dimColor>... {scrollOffset} newer messages below</Text>
160
- )}
161
- </Box>
162
-
163
- <Box borderStyle="single" borderColor="gray" paddingX={1}>
164
- {isLoading ? (
165
- <Text color="yellow">Thinking...</Text>
166
- ) : (
167
- <Box>
168
- <Text color={borderColor}>&gt; </Text>
169
- <TextInput
170
- value={input}
171
- onChange={setInput}
172
- onSubmit={handleSubmit}
173
- placeholder={`Ask ${providerName} something...`}
174
- />
175
- </Box>
176
- )}
177
- </Box>
178
- </Box>
179
- );
17
+ const { stdout } = useStdout()
18
+ const [input, setInput] = useState("")
19
+ const [messages, setMessages] = useState<Message[]>([])
20
+ const [isLoading, setIsLoading] = useState(false)
21
+ const [scrollOffset, setScrollOffset] = useState(0)
22
+
23
+ // Calculate available height for messages
24
+ const maxMessageLines = stdout ? Math.max(5, stdout.rows - 8) : 10
25
+
26
+ // Get provider info for display
27
+ const providerInfo = aiService.getProviderInfo()
28
+ const providerName = providerInfo?.name || "AI"
29
+
30
+ // Check provider availability on mount
31
+ useEffect(() => {
32
+ if (!aiService.isAvailable()) {
33
+ setMessages([
34
+ {
35
+ role: "system",
36
+ content: `${providerName} is not available. Run /ai model to select a different provider, or install the required CLI.`,
37
+ },
38
+ ])
39
+ } else {
40
+ const status = getProviderStatus(providerInfo!)
41
+ setMessages([
42
+ {
43
+ role: "system",
44
+ content: `${status} ready.\nType your message and press Enter. Press Escape to close.`,
45
+ },
46
+ ])
47
+ // Load project context
48
+ aiService.loadProjectContext(process.cwd())
49
+ }
50
+ }, [])
51
+
52
+ // Handle keyboard input
53
+ useInput((char, key) => {
54
+ if (key.escape) {
55
+ onClose()
56
+ return
57
+ }
58
+
59
+ // Scroll with Shift+Up/Down
60
+ if (key.shift && key.upArrow) {
61
+ setScrollOffset((prev) =>
62
+ Math.min(prev + 1, Math.max(0, messages.length - maxMessageLines)),
63
+ )
64
+ return
65
+ }
66
+ if (key.shift && key.downArrow) {
67
+ setScrollOffset((prev) => Math.max(0, prev - 1))
68
+ return
69
+ }
70
+ })
71
+
72
+ const handleSubmit = async (value: string) => {
73
+ if (!value.trim() || isLoading) return
74
+
75
+ const userMessage = value.trim()
76
+ setInput("")
77
+
78
+ // Add user message
79
+ setMessages((prev) => [...prev, { role: "user", content: userMessage }])
80
+ setIsLoading(true)
81
+
82
+ try {
83
+ const response = await aiService.sendMessage(userMessage)
84
+ setMessages((prev) => [...prev, { role: "assistant", content: response }])
85
+ setScrollOffset(0) // Auto-scroll to bottom
86
+ } catch (err) {
87
+ const errorMessage = err instanceof Error ? err.message : "Unknown error"
88
+ setMessages((prev) => [
89
+ ...prev,
90
+ {
91
+ role: "system",
92
+ content: `Error: ${errorMessage}`,
93
+ },
94
+ ])
95
+ onLog(`${providerName} error: ${errorMessage}`)
96
+ } finally {
97
+ setIsLoading(false)
98
+ }
99
+ }
100
+
101
+ // Render messages with scrolling
102
+ const renderMessages = () => {
103
+ const start = Math.max(0, messages.length - maxMessageLines - scrollOffset)
104
+ const end = messages.length - scrollOffset
105
+ const visibleMessages = messages.slice(start, end)
106
+
107
+ return visibleMessages.map((msg, idx) => {
108
+ let color: string
109
+ let prefix: string
110
+
111
+ switch (msg.role) {
112
+ case "user":
113
+ color = "cyan"
114
+ prefix = "You: "
115
+ break
116
+ case "assistant":
117
+ color = "green"
118
+ prefix = `${providerName}: `
119
+ break
120
+ default:
121
+ color = "yellow"
122
+ prefix = ""
123
+ }
124
+
125
+ return (
126
+ <Box key={start + idx} flexDirection="column" marginBottom={1}>
127
+ <Text color={color} bold>
128
+ {prefix}
129
+ </Text>
130
+ <Text wrap="wrap">{msg.content}</Text>
131
+ </Box>
132
+ )
133
+ })
134
+ }
135
+
136
+ // Get border color based on provider
137
+ const getBorderColor = (): string => {
138
+ switch (aiService.getProvider()) {
139
+ case "claude":
140
+ return "magenta"
141
+ case "codex":
142
+ return "green"
143
+ case "gemini":
144
+ return "blue"
145
+ default:
146
+ return "gray"
147
+ }
148
+ }
149
+
150
+ const borderColor = getBorderColor()
151
+
152
+ return (
153
+ <Box
154
+ flexDirection="column"
155
+ height="100%"
156
+ borderStyle="double"
157
+ borderColor={borderColor}
158
+ >
159
+ <Box paddingX={1} justifyContent="space-between">
160
+ <Text bold color={borderColor}>
161
+ {providerName} AI Assistant
162
+ </Text>
163
+ <Text color="gray" dimColor>
164
+ Esc to close · /ai model to switch
165
+ </Text>
166
+ </Box>
167
+
168
+ <Box flexDirection="column" flexGrow={1} paddingX={1} overflow="hidden">
169
+ {messages.length > maxMessageLines + scrollOffset && (
170
+ <Text color="gray" dimColor>
171
+ ... {messages.length - maxMessageLines - scrollOffset} earlier
172
+ messages
173
+ </Text>
174
+ )}
175
+ {renderMessages()}
176
+ {scrollOffset > 0 && (
177
+ <Text color="gray" dimColor>
178
+ ... {scrollOffset} newer messages below
179
+ </Text>
180
+ )}
181
+ </Box>
182
+
183
+ <Box borderStyle="single" borderColor="gray" paddingX={1}>
184
+ {isLoading ? (
185
+ <Text color="yellow">Thinking...</Text>
186
+ ) : (
187
+ <Box>
188
+ <Text color={borderColor}>&gt; </Text>
189
+ <TextInput
190
+ value={input}
191
+ onChange={setInput}
192
+ onSubmit={handleSubmit}
193
+ placeholder={`Ask ${providerName} something...`}
194
+ />
195
+ </Box>
196
+ )}
197
+ </Box>
198
+ </Box>
199
+ )
180
200
  }