@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,161 +1,185 @@
1
- import React, { useState, useEffect } from 'react';
2
- import { Box, Text, useInput, useStdout } from 'ink';
3
- import TextInput from 'ink-text-input';
1
+ import React, { useState, useEffect } from "react"
2
+ import { Box, Text, useInput, useStdout } from "ink"
3
+ import TextInput from "ink-text-input"
4
4
  import {
5
- geminiService,
6
- isAuthenticated,
7
- loadGeminiConfig,
8
- } from '../services/index.js';
5
+ geminiService,
6
+ isAuthenticated,
7
+ loadGeminiConfig,
8
+ } from "../services/index.js"
9
9
 
10
10
  interface GeminiPanelProps {
11
- onClose: () => void;
12
- onLog: (message: string) => void;
11
+ onClose: () => void
12
+ onLog: (message: string) => void
13
13
  }
14
14
 
15
15
  interface Message {
16
- role: 'user' | 'assistant' | 'system';
17
- content: string;
16
+ role: "user" | "assistant" | "system"
17
+ content: string
18
18
  }
19
19
 
20
20
  export default function GeminiPanel({ onClose, onLog }: GeminiPanelProps) {
21
- const { stdout } = useStdout();
22
- const [input, setInput] = useState('');
23
- const [messages, setMessages] = useState<Message[]>([]);
24
- const [isLoading, setIsLoading] = useState(false);
25
- const [scrollOffset, setScrollOffset] = useState(0);
26
-
27
- // Calculate available height for messages
28
- const maxMessageLines = stdout ? Math.max(5, stdout.rows - 8) : 10;
29
-
30
- // Check authentication on mount
31
- useEffect(() => {
32
- if (!isAuthenticated()) {
33
- setMessages([{
34
- role: 'system',
35
- content: 'Not authenticated. Run /gemini enable to set up Google authentication.',
36
- }]);
37
- } else {
38
- const config = loadGeminiConfig();
39
- setMessages([{
40
- role: 'system',
41
- content: `Gemini AI ready. ${config.projectContext ? 'Project context loaded.' : ''}\nType your message and press Enter. Press Escape to close.`,
42
- }]);
43
- // Load project context
44
- geminiService.loadProjectContext(process.cwd());
45
- }
46
- }, []);
47
-
48
- // Handle keyboard input
49
- useInput((char, key) => {
50
- if (key.escape) {
51
- onClose();
52
- return;
53
- }
54
-
55
- // Scroll with Shift+Up/Down
56
- if (key.shift && key.upArrow) {
57
- setScrollOffset(prev => Math.min(prev + 1, Math.max(0, messages.length - maxMessageLines)));
58
- return;
59
- }
60
- if (key.shift && key.downArrow) {
61
- setScrollOffset(prev => Math.max(0, prev - 1));
62
- return;
63
- }
64
- });
65
-
66
- const handleSubmit = async (value: string) => {
67
- if (!value.trim() || isLoading) return;
68
-
69
- const userMessage = value.trim();
70
- setInput('');
71
-
72
- // Add user message
73
- setMessages(prev => [...prev, { role: 'user', content: userMessage }]);
74
- setIsLoading(true);
75
-
76
- try {
77
- const response = await geminiService.sendMessage(userMessage);
78
- setMessages(prev => [...prev, { role: 'assistant', content: response }]);
79
- setScrollOffset(0); // Auto-scroll to bottom
80
- } catch (err) {
81
- const errorMessage = err instanceof Error ? err.message : 'Unknown error';
82
- setMessages(prev => [...prev, {
83
- role: 'system',
84
- content: `Error: ${errorMessage}`,
85
- }]);
86
- onLog(`Gemini error: ${errorMessage}`);
87
- } finally {
88
- setIsLoading(false);
89
- }
90
- };
91
-
92
- // Render messages with scrolling
93
- const renderMessages = () => {
94
- const start = Math.max(0, messages.length - maxMessageLines - scrollOffset);
95
- const end = messages.length - scrollOffset;
96
- const visibleMessages = messages.slice(start, end);
97
-
98
- return visibleMessages.map((msg, idx) => {
99
- let color: string;
100
- let prefix: string;
101
-
102
- switch (msg.role) {
103
- case 'user':
104
- color = 'cyan';
105
- prefix = 'You: ';
106
- break;
107
- case 'assistant':
108
- color = 'green';
109
- prefix = 'Gemini: ';
110
- break;
111
- default:
112
- color = 'yellow';
113
- prefix = '';
114
- }
115
-
116
- return (
117
- <Box key={start + idx} flexDirection="column" marginBottom={1}>
118
- <Text color={color} bold>{prefix}</Text>
119
- <Text wrap="wrap">{msg.content}</Text>
120
- </Box>
121
- );
122
- });
123
- };
124
-
125
- return (
126
- <Box flexDirection="column" height="100%" borderStyle="double" borderColor="magenta">
127
- <Box paddingX={1} justifyContent="space-between">
128
- <Text bold color="magenta">Gemini AI Assistant</Text>
129
- <Text color="gray" dimColor>Esc to close</Text>
130
- </Box>
131
-
132
- <Box flexDirection="column" flexGrow={1} paddingX={1} overflow="hidden">
133
- {messages.length > maxMessageLines + scrollOffset && (
134
- <Text color="gray" dimColor>
135
- ... {messages.length - maxMessageLines - scrollOffset} earlier messages
136
- </Text>
137
- )}
138
- {renderMessages()}
139
- {scrollOffset > 0 && (
140
- <Text color="gray" dimColor>... {scrollOffset} newer messages below</Text>
141
- )}
142
- </Box>
143
-
144
- <Box borderStyle="single" borderColor="gray" paddingX={1}>
145
- {isLoading ? (
146
- <Text color="yellow">Thinking...</Text>
147
- ) : (
148
- <Box>
149
- <Text color="magenta">&gt; </Text>
150
- <TextInput
151
- value={input}
152
- onChange={setInput}
153
- onSubmit={handleSubmit}
154
- placeholder="Ask Gemini something..."
155
- />
156
- </Box>
157
- )}
158
- </Box>
159
- </Box>
160
- );
21
+ const { stdout } = useStdout()
22
+ const [input, setInput] = useState("")
23
+ const [messages, setMessages] = useState<Message[]>([])
24
+ const [isLoading, setIsLoading] = useState(false)
25
+ const [scrollOffset, setScrollOffset] = useState(0)
26
+
27
+ // Calculate available height for messages
28
+ const maxMessageLines = stdout ? Math.max(5, stdout.rows - 8) : 10
29
+
30
+ // Check authentication on mount
31
+ useEffect(() => {
32
+ if (!isAuthenticated()) {
33
+ setMessages([
34
+ {
35
+ role: "system",
36
+ content:
37
+ "Not authenticated. Run /gemini enable to set up Google authentication.",
38
+ },
39
+ ])
40
+ } else {
41
+ const config = loadGeminiConfig()
42
+ setMessages([
43
+ {
44
+ role: "system",
45
+ content: `Gemini AI ready. ${config.projectContext ? "Project context loaded." : ""}\nType your message and press Enter. Press Escape to close.`,
46
+ },
47
+ ])
48
+ // Load project context
49
+ geminiService.loadProjectContext(process.cwd())
50
+ }
51
+ }, [])
52
+
53
+ // Handle keyboard input
54
+ useInput((char, key) => {
55
+ if (key.escape) {
56
+ onClose()
57
+ return
58
+ }
59
+
60
+ // Scroll with Shift+Up/Down
61
+ if (key.shift && key.upArrow) {
62
+ setScrollOffset((prev) =>
63
+ Math.min(prev + 1, Math.max(0, messages.length - maxMessageLines)),
64
+ )
65
+ return
66
+ }
67
+ if (key.shift && key.downArrow) {
68
+ setScrollOffset((prev) => Math.max(0, prev - 1))
69
+ return
70
+ }
71
+ })
72
+
73
+ const handleSubmit = async (value: string) => {
74
+ if (!value.trim() || isLoading) return
75
+
76
+ const userMessage = value.trim()
77
+ setInput("")
78
+
79
+ // Add user message
80
+ setMessages((prev) => [...prev, { role: "user", content: userMessage }])
81
+ setIsLoading(true)
82
+
83
+ try {
84
+ const response = await geminiService.sendMessage(userMessage)
85
+ setMessages((prev) => [...prev, { role: "assistant", content: response }])
86
+ setScrollOffset(0) // Auto-scroll to bottom
87
+ } catch (err) {
88
+ const errorMessage = err instanceof Error ? err.message : "Unknown error"
89
+ setMessages((prev) => [
90
+ ...prev,
91
+ {
92
+ role: "system",
93
+ content: `Error: ${errorMessage}`,
94
+ },
95
+ ])
96
+ onLog(`Gemini error: ${errorMessage}`)
97
+ } finally {
98
+ setIsLoading(false)
99
+ }
100
+ }
101
+
102
+ // Render messages with scrolling
103
+ const renderMessages = () => {
104
+ const start = Math.max(0, messages.length - maxMessageLines - scrollOffset)
105
+ const end = messages.length - scrollOffset
106
+ const visibleMessages = messages.slice(start, end)
107
+
108
+ return visibleMessages.map((msg, idx) => {
109
+ let color: string
110
+ let prefix: string
111
+
112
+ switch (msg.role) {
113
+ case "user":
114
+ color = "cyan"
115
+ prefix = "You: "
116
+ break
117
+ case "assistant":
118
+ color = "green"
119
+ prefix = "Gemini: "
120
+ break
121
+ default:
122
+ color = "yellow"
123
+ prefix = ""
124
+ }
125
+
126
+ return (
127
+ <Box key={start + idx} flexDirection="column" marginBottom={1}>
128
+ <Text color={color} bold>
129
+ {prefix}
130
+ </Text>
131
+ <Text wrap="wrap">{msg.content}</Text>
132
+ </Box>
133
+ )
134
+ })
135
+ }
136
+
137
+ return (
138
+ <Box
139
+ flexDirection="column"
140
+ height="100%"
141
+ borderStyle="double"
142
+ borderColor="magenta"
143
+ >
144
+ <Box paddingX={1} justifyContent="space-between">
145
+ <Text bold color="magenta">
146
+ Gemini AI Assistant
147
+ </Text>
148
+ <Text color="gray" dimColor>
149
+ Esc to close
150
+ </Text>
151
+ </Box>
152
+
153
+ <Box flexDirection="column" flexGrow={1} paddingX={1} overflow="hidden">
154
+ {messages.length > maxMessageLines + scrollOffset && (
155
+ <Text color="gray" dimColor>
156
+ ... {messages.length - maxMessageLines - scrollOffset} earlier
157
+ messages
158
+ </Text>
159
+ )}
160
+ {renderMessages()}
161
+ {scrollOffset > 0 && (
162
+ <Text color="gray" dimColor>
163
+ ... {scrollOffset} newer messages below
164
+ </Text>
165
+ )}
166
+ </Box>
167
+
168
+ <Box borderStyle="single" borderColor="gray" paddingX={1}>
169
+ {isLoading ? (
170
+ <Text color="yellow">Thinking...</Text>
171
+ ) : (
172
+ <Box>
173
+ <Text color="magenta">&gt; </Text>
174
+ <TextInput
175
+ value={input}
176
+ onChange={setInput}
177
+ onSubmit={handleSubmit}
178
+ placeholder="Ask Gemini something..."
179
+ />
180
+ </Box>
181
+ )}
182
+ </Box>
183
+ </Box>
184
+ )
161
185
  }
@@ -1,27 +1,29 @@
1
- import React from 'react';
2
- import { Box, Text } from 'ink';
1
+ import React from "react"
2
+ import { Box, Text } from "ink"
3
3
 
4
4
  interface HeaderProps {
5
- projectName: string;
5
+ projectName: string
6
6
  }
7
7
 
8
8
  export default function Header({ projectName }: HeaderProps) {
9
- return (
10
- <Box
11
- borderStyle="single"
12
- borderColor="blue"
13
- paddingX={1}
14
- justifyContent="space-between"
15
- >
16
- <Box>
17
- <Text color="blue" bold>GxP</Text>
18
- <Text color="white"> DevStudio</Text>
19
- <Text color="gray"> - </Text>
20
- <Text color="cyan">{projectName}</Text>
21
- </Box>
22
- <Box>
23
- <Text color="gray">Ctrl+C to quit</Text>
24
- </Box>
25
- </Box>
26
- );
9
+ return (
10
+ <Box
11
+ borderStyle="single"
12
+ borderColor="blue"
13
+ paddingX={1}
14
+ justifyContent="space-between"
15
+ >
16
+ <Box>
17
+ <Text color="blue" bold>
18
+ GxP
19
+ </Text>
20
+ <Text color="white"> DevStudio</Text>
21
+ <Text color="gray"> - </Text>
22
+ <Text color="cyan">{projectName}</Text>
23
+ </Box>
24
+ <Box>
25
+ <Text color="gray">Ctrl+C to quit</Text>
26
+ </Box>
27
+ </Box>
28
+ )
27
29
  }