@gxp-dev/tools 2.0.63 → 2.0.64
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -31
- package/bin/gx-devtools.js +74 -54
- package/bin/lib/cli.js +23 -21
- package/bin/lib/commands/add-dependency.js +366 -325
- package/bin/lib/commands/assets.js +137 -139
- package/bin/lib/commands/build.js +169 -174
- package/bin/lib/commands/datastore.js +181 -183
- package/bin/lib/commands/dev.js +127 -131
- package/bin/lib/commands/extensions.js +147 -149
- package/bin/lib/commands/extract-config.js +73 -67
- package/bin/lib/commands/index.js +12 -12
- package/bin/lib/commands/init.js +342 -240
- package/bin/lib/commands/publish.js +69 -75
- package/bin/lib/commands/socket.js +69 -69
- package/bin/lib/commands/ssl.js +14 -14
- package/bin/lib/constants.js +10 -24
- package/bin/lib/tui/App.tsx +761 -705
- package/bin/lib/tui/components/AIPanel.tsx +191 -171
- package/bin/lib/tui/components/CommandInput.tsx +394 -343
- package/bin/lib/tui/components/GeminiPanel.tsx +175 -151
- package/bin/lib/tui/components/Header.tsx +23 -21
- package/bin/lib/tui/components/LogPanel.tsx +244 -220
- package/bin/lib/tui/components/TabBar.tsx +50 -48
- package/bin/lib/tui/components/WelcomeScreen.tsx +126 -71
- package/bin/lib/tui/index.tsx +37 -39
- package/bin/lib/tui/services/AIService.ts +518 -462
- package/bin/lib/tui/services/ExtensionService.ts +140 -129
- package/bin/lib/tui/services/GeminiService.ts +367 -337
- package/bin/lib/tui/services/ServiceManager.ts +344 -322
- package/bin/lib/tui/services/SocketService.ts +168 -168
- package/bin/lib/tui/services/ViteService.ts +88 -88
- package/bin/lib/tui/services/index.ts +47 -22
- package/bin/lib/utils/ai-scaffold.js +291 -280
- package/bin/lib/utils/extract-config.js +157 -140
- package/bin/lib/utils/files.js +82 -86
- package/bin/lib/utils/index.js +7 -7
- package/bin/lib/utils/paths.js +34 -34
- package/bin/lib/utils/prompts.js +194 -169
- package/bin/lib/utils/ssl.js +79 -81
- package/browser-extensions/README.md +0 -1
- package/browser-extensions/chrome/background.js +244 -237
- package/browser-extensions/chrome/content.js +32 -29
- package/browser-extensions/chrome/devtools.html +7 -7
- package/browser-extensions/chrome/devtools.js +19 -19
- package/browser-extensions/chrome/inspector.js +802 -767
- package/browser-extensions/chrome/manifest.json +71 -63
- package/browser-extensions/chrome/panel.html +674 -636
- package/browser-extensions/chrome/panel.js +722 -712
- package/browser-extensions/chrome/popup.html +586 -543
- package/browser-extensions/chrome/popup.js +282 -244
- package/browser-extensions/chrome/rules.json +1 -1
- package/browser-extensions/chrome/test-chrome.html +216 -136
- package/browser-extensions/chrome/test-mixed-content.html +284 -189
- package/browser-extensions/chrome/test-uri-pattern.html +221 -198
- package/browser-extensions/firefox/README.md +9 -6
- package/browser-extensions/firefox/background.js +221 -218
- package/browser-extensions/firefox/content.js +55 -52
- package/browser-extensions/firefox/debug-errors.html +386 -228
- package/browser-extensions/firefox/debug-https.html +153 -105
- package/browser-extensions/firefox/devtools.html +7 -7
- package/browser-extensions/firefox/devtools.js +23 -20
- package/browser-extensions/firefox/inspector.js +802 -767
- package/browser-extensions/firefox/manifest.json +68 -68
- package/browser-extensions/firefox/panel.html +674 -636
- package/browser-extensions/firefox/panel.js +722 -712
- package/browser-extensions/firefox/popup.html +572 -535
- package/browser-extensions/firefox/popup.js +281 -236
- package/browser-extensions/firefox/test-gramercy.html +170 -125
- package/browser-extensions/firefox/test-imports.html +59 -55
- package/browser-extensions/firefox/test-masking.html +231 -140
- package/browser-extensions/firefox/test-uri-pattern.html +221 -198
- package/dist/tui/App.d.ts +1 -1
- package/dist/tui/App.d.ts.map +1 -1
- package/dist/tui/App.js +154 -150
- package/dist/tui/App.js.map +1 -1
- package/dist/tui/components/AIPanel.d.ts.map +1 -1
- package/dist/tui/components/AIPanel.js +42 -35
- package/dist/tui/components/AIPanel.js.map +1 -1
- package/dist/tui/components/CommandInput.d.ts +1 -1
- package/dist/tui/components/CommandInput.d.ts.map +1 -1
- package/dist/tui/components/CommandInput.js +92 -62
- package/dist/tui/components/CommandInput.js.map +1 -1
- package/dist/tui/components/GeminiPanel.d.ts.map +1 -1
- package/dist/tui/components/GeminiPanel.js +37 -30
- package/dist/tui/components/GeminiPanel.js.map +1 -1
- package/dist/tui/components/Header.d.ts.map +1 -1
- package/dist/tui/components/Header.js +1 -1
- package/dist/tui/components/Header.js.map +1 -1
- package/dist/tui/components/LogPanel.d.ts +1 -1
- package/dist/tui/components/LogPanel.d.ts.map +1 -1
- package/dist/tui/components/LogPanel.js +26 -24
- package/dist/tui/components/LogPanel.js.map +1 -1
- package/dist/tui/components/TabBar.d.ts +2 -2
- package/dist/tui/components/TabBar.d.ts.map +1 -1
- package/dist/tui/components/TabBar.js +11 -11
- package/dist/tui/components/TabBar.js.map +1 -1
- package/dist/tui/components/WelcomeScreen.d.ts.map +1 -1
- package/dist/tui/components/WelcomeScreen.js +6 -6
- package/dist/tui/components/WelcomeScreen.js.map +1 -1
- package/dist/tui/index.d.ts.map +1 -1
- package/dist/tui/index.js +8 -8
- package/dist/tui/index.js.map +1 -1
- package/dist/tui/services/AIService.d.ts +2 -2
- package/dist/tui/services/AIService.d.ts.map +1 -1
- package/dist/tui/services/AIService.js +165 -125
- package/dist/tui/services/AIService.js.map +1 -1
- package/dist/tui/services/ExtensionService.d.ts +1 -1
- package/dist/tui/services/ExtensionService.d.ts.map +1 -1
- package/dist/tui/services/ExtensionService.js +33 -26
- package/dist/tui/services/ExtensionService.js.map +1 -1
- package/dist/tui/services/GeminiService.d.ts +1 -1
- package/dist/tui/services/GeminiService.d.ts.map +1 -1
- package/dist/tui/services/GeminiService.js +87 -76
- package/dist/tui/services/GeminiService.js.map +1 -1
- package/dist/tui/services/ServiceManager.d.ts +3 -3
- package/dist/tui/services/ServiceManager.d.ts.map +1 -1
- package/dist/tui/services/ServiceManager.js +72 -58
- package/dist/tui/services/ServiceManager.js.map +1 -1
- package/dist/tui/services/SocketService.d.ts.map +1 -1
- package/dist/tui/services/SocketService.js +32 -32
- package/dist/tui/services/SocketService.js.map +1 -1
- package/dist/tui/services/ViteService.d.ts.map +1 -1
- package/dist/tui/services/ViteService.js +26 -28
- package/dist/tui/services/ViteService.js.map +1 -1
- package/dist/tui/services/index.d.ts +6 -6
- package/dist/tui/services/index.d.ts.map +1 -1
- package/dist/tui/services/index.js +6 -6
- package/dist/tui/services/index.js.map +1 -1
- package/mcp/gxp-api-server.js +83 -81
- package/package.json +109 -93
- package/runtime/PortalContainer.vue +258 -234
- package/runtime/dev-tools/DevToolsModal.vue +153 -155
- package/runtime/dev-tools/LayoutSwitcher.vue +144 -140
- package/runtime/dev-tools/MockDataEditor.vue +456 -433
- package/runtime/dev-tools/SocketSimulator.vue +379 -371
- package/runtime/dev-tools/StoreInspector.vue +517 -455
- package/runtime/dev-tools/index.js +5 -5
- package/runtime/fallback-layouts/PrivateLayout.vue +2 -2
- package/runtime/fallback-layouts/PublicLayout.vue +2 -2
- package/runtime/fallback-layouts/SystemLayout.vue +2 -2
- package/runtime/gxpStringsPlugin.js +159 -134
- package/runtime/index.html +17 -19
- package/runtime/main.js +24 -22
- package/runtime/mock-api/auth-middleware.js +15 -15
- package/runtime/mock-api/image-generator.js +46 -46
- package/runtime/mock-api/index.js +55 -55
- package/runtime/mock-api/response-generator.js +116 -105
- package/runtime/mock-api/route-generator.js +107 -84
- package/runtime/mock-api/socket-triggers.js +94 -93
- package/runtime/mock-api/spec-loader.js +79 -80
- package/runtime/package.json +3 -0
- package/runtime/server.js +68 -68
- package/runtime/stores/gxpPortalConfigStore.js +204 -186
- package/runtime/stores/index.js +2 -2
- package/runtime/vite-inspector-plugin.js +858 -707
- package/runtime/vite-source-tracker-plugin.js +132 -113
- package/runtime/vite.config.js +191 -139
- package/scripts/launch-chrome.js +41 -41
- package/scripts/pack-chrome.js +38 -39
- package/socket-events/AiSessionMessageCreated.json +17 -17
- package/socket-events/SocialStreamPostCreated.json +23 -23
- package/socket-events/SocialStreamPostVariantCompleted.json +22 -22
- package/template/.claude/agents/gxp-developer.md +100 -99
- package/template/.claude/settings.json +7 -7
- package/template/AGENTS.md +30 -23
- package/template/GEMINI.md +20 -20
- package/template/README.md +70 -53
- package/template/app-manifest.json +2 -4
- package/template/configuration.json +10 -10
- package/template/default-styling.css +1 -1
- package/template/index.html +18 -20
- package/template/main.js +24 -22
- package/template/src/DemoPage.vue +415 -362
- package/template/src/Plugin.vue +76 -85
- package/template/src/stores/index.js +3 -3
- package/template/src/stores/test-data.json +164 -172
- package/template/theme-layouts/AdditionalStyling.css +50 -50
- package/template/theme-layouts/PrivateLayout.vue +8 -12
- package/template/theme-layouts/PublicLayout.vue +8 -12
- package/template/theme-layouts/SystemLayout.vue +8 -12
- package/template/vite.extend.js +45 -0
- package/template/vite.config.js +0 -409
package/dist/tui/App.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import { useState, useEffect, useCallback } from
|
|
3
|
-
import { Box, useApp, useInput, useStdout } from
|
|
4
|
-
import WelcomeScreen from
|
|
5
|
-
import Header from
|
|
6
|
-
import TabBar from
|
|
7
|
-
import LogPanel from
|
|
8
|
-
import CommandInput from
|
|
9
|
-
import AIPanel from
|
|
10
|
-
import { serviceManager, startVite, stopVite, startSocket, stopSocket, startExtension, stopExtension, listSocketEvents, sendSocketEvent, aiService, getAvailableProviders, getProviderStatus, } from
|
|
2
|
+
import { useState, useEffect, useCallback } from "react";
|
|
3
|
+
import { Box, useApp, useInput, useStdout } from "ink";
|
|
4
|
+
import WelcomeScreen from "./components/WelcomeScreen.js";
|
|
5
|
+
import Header from "./components/Header.js";
|
|
6
|
+
import TabBar from "./components/TabBar.js";
|
|
7
|
+
import LogPanel from "./components/LogPanel.js";
|
|
8
|
+
import CommandInput from "./components/CommandInput.js";
|
|
9
|
+
import AIPanel from "./components/AIPanel.js";
|
|
10
|
+
import { serviceManager, startVite, stopVite, startSocket, stopSocket, startExtension, stopExtension, listSocketEvents, sendSocketEvent, aiService, getAvailableProviders, getProviderStatus, } from "./services/index.js";
|
|
11
11
|
export default function App({ autoStart, args }) {
|
|
12
12
|
const { exit } = useApp();
|
|
13
13
|
const { stdout } = useStdout();
|
|
@@ -24,7 +24,7 @@ export default function App({ autoStart, args }) {
|
|
|
24
24
|
// Sync services from ServiceManager
|
|
25
25
|
const syncServices = useCallback(() => {
|
|
26
26
|
const managerServices = serviceManager.getAllServices();
|
|
27
|
-
setServices(managerServices.map(s => ({
|
|
27
|
+
setServices(managerServices.map((s) => ({
|
|
28
28
|
id: s.id,
|
|
29
29
|
name: s.name,
|
|
30
30
|
status: s.status,
|
|
@@ -34,21 +34,21 @@ export default function App({ autoStart, args }) {
|
|
|
34
34
|
// Set up ServiceManager event listeners
|
|
35
35
|
useEffect(() => {
|
|
36
36
|
const onLog = (id, message) => {
|
|
37
|
-
setServices(prev => prev.map(s => s.id === id ? { ...s, logs: [...s.logs, message] } : s));
|
|
37
|
+
setServices((prev) => prev.map((s) => s.id === id ? { ...s, logs: [...s.logs, message] } : s));
|
|
38
38
|
};
|
|
39
39
|
const onStatusChange = (id, status) => {
|
|
40
|
-
setServices(prev => prev.map(s => s.id === id ? { ...s, status } : s));
|
|
40
|
+
setServices((prev) => prev.map((s) => (s.id === id ? { ...s, status } : s)));
|
|
41
41
|
};
|
|
42
42
|
const onLogsCleared = (id) => {
|
|
43
|
-
setServices(prev => prev.map(s => s.id === id ? { ...s, logs: [] } : s));
|
|
43
|
+
setServices((prev) => prev.map((s) => (s.id === id ? { ...s, logs: [] } : s)));
|
|
44
44
|
};
|
|
45
|
-
serviceManager.on(
|
|
46
|
-
serviceManager.on(
|
|
47
|
-
serviceManager.on(
|
|
45
|
+
serviceManager.on("log", onLog);
|
|
46
|
+
serviceManager.on("statusChange", onStatusChange);
|
|
47
|
+
serviceManager.on("logsCleared", onLogsCleared);
|
|
48
48
|
return () => {
|
|
49
|
-
serviceManager.off(
|
|
50
|
-
serviceManager.off(
|
|
51
|
-
serviceManager.off(
|
|
49
|
+
serviceManager.off("log", onLog);
|
|
50
|
+
serviceManager.off("statusChange", onStatusChange);
|
|
51
|
+
serviceManager.off("logsCleared", onLogsCleared);
|
|
52
52
|
};
|
|
53
53
|
}, []);
|
|
54
54
|
// Cleanup on exit
|
|
@@ -56,32 +56,32 @@ export default function App({ autoStart, args }) {
|
|
|
56
56
|
const cleanup = () => {
|
|
57
57
|
serviceManager.forceStopAll();
|
|
58
58
|
};
|
|
59
|
-
process.on(
|
|
60
|
-
process.on(
|
|
59
|
+
process.on("SIGINT", cleanup);
|
|
60
|
+
process.on("SIGTERM", cleanup);
|
|
61
61
|
return () => {
|
|
62
62
|
cleanup();
|
|
63
|
-
process.off(
|
|
64
|
-
process.off(
|
|
63
|
+
process.off("SIGINT", cleanup);
|
|
64
|
+
process.off("SIGTERM", cleanup);
|
|
65
65
|
};
|
|
66
66
|
}, []);
|
|
67
67
|
// Handle keyboard shortcuts
|
|
68
68
|
useInput((input, key) => {
|
|
69
69
|
// Ctrl+C to exit
|
|
70
|
-
if (key.ctrl && input ===
|
|
70
|
+
if (key.ctrl && input === "c") {
|
|
71
71
|
serviceManager.forceStopAll();
|
|
72
72
|
exit();
|
|
73
73
|
return;
|
|
74
74
|
}
|
|
75
75
|
// Ctrl+L to clear current log
|
|
76
|
-
if (key.ctrl && input ===
|
|
76
|
+
if (key.ctrl && input === "l") {
|
|
77
77
|
if (services[activeTab]) {
|
|
78
78
|
serviceManager.clearLogs(services[activeTab].id);
|
|
79
79
|
}
|
|
80
80
|
return;
|
|
81
81
|
}
|
|
82
82
|
// Ctrl+K to stop current service
|
|
83
|
-
if (key.ctrl && input ===
|
|
84
|
-
if (services[activeTab] && services[activeTab].id !==
|
|
83
|
+
if (key.ctrl && input === "k") {
|
|
84
|
+
if (services[activeTab] && services[activeTab].id !== "system") {
|
|
85
85
|
stopService(services[activeTab].id);
|
|
86
86
|
}
|
|
87
87
|
return;
|
|
@@ -108,7 +108,7 @@ export default function App({ autoStart, args }) {
|
|
|
108
108
|
useEffect(() => {
|
|
109
109
|
if (autoStart?.length) {
|
|
110
110
|
setTimeout(() => {
|
|
111
|
-
autoStart.forEach(cmd => {
|
|
111
|
+
autoStart.forEach((cmd) => {
|
|
112
112
|
handleCommand(`/${cmd}`);
|
|
113
113
|
});
|
|
114
114
|
}, 100);
|
|
@@ -116,62 +116,62 @@ export default function App({ autoStart, args }) {
|
|
|
116
116
|
}, []);
|
|
117
117
|
const handleCommand = (input) => {
|
|
118
118
|
const trimmed = input.trim();
|
|
119
|
-
if (!trimmed.startsWith(
|
|
119
|
+
if (!trimmed.startsWith("/"))
|
|
120
120
|
return;
|
|
121
|
-
const parts = trimmed.slice(1).split(
|
|
121
|
+
const parts = trimmed.slice(1).split(" ");
|
|
122
122
|
const command = parts[0];
|
|
123
123
|
const cmdArgs = parts.slice(1);
|
|
124
124
|
switch (command) {
|
|
125
|
-
case
|
|
125
|
+
case "help":
|
|
126
126
|
addSystemLog(getHelpText());
|
|
127
127
|
break;
|
|
128
|
-
case
|
|
128
|
+
case "dev":
|
|
129
129
|
startDevServer(cmdArgs);
|
|
130
130
|
break;
|
|
131
|
-
case
|
|
132
|
-
if (cmdArgs[0] ===
|
|
131
|
+
case "socket":
|
|
132
|
+
if (cmdArgs[0] === "send") {
|
|
133
133
|
handleSocketSend(cmdArgs.slice(1));
|
|
134
134
|
}
|
|
135
|
-
else if (cmdArgs[0] ===
|
|
135
|
+
else if (cmdArgs[0] === "list") {
|
|
136
136
|
handleSocketList();
|
|
137
137
|
}
|
|
138
138
|
else {
|
|
139
|
-
const socketWithMock = cmdArgs.includes(
|
|
139
|
+
const socketWithMock = cmdArgs.includes("--with-mock") || args?.withMock === true;
|
|
140
140
|
startSocketServer(socketWithMock);
|
|
141
141
|
}
|
|
142
142
|
break;
|
|
143
|
-
case
|
|
143
|
+
case "mock":
|
|
144
144
|
// Shorthand for /socket --with-mock
|
|
145
145
|
startSocketServer(true);
|
|
146
146
|
break;
|
|
147
|
-
case
|
|
148
|
-
const browser = cmdArgs[0] ||
|
|
147
|
+
case "ext":
|
|
148
|
+
const browser = cmdArgs[0] || "chrome";
|
|
149
149
|
launchExtension(browser);
|
|
150
150
|
break;
|
|
151
|
-
case
|
|
151
|
+
case "stop":
|
|
152
152
|
stopService(cmdArgs[0]);
|
|
153
153
|
break;
|
|
154
|
-
case
|
|
154
|
+
case "restart":
|
|
155
155
|
restartService(cmdArgs[0]);
|
|
156
156
|
break;
|
|
157
|
-
case
|
|
157
|
+
case "clear":
|
|
158
158
|
if (services[activeTab]) {
|
|
159
159
|
serviceManager.clearLogs(services[activeTab].id);
|
|
160
160
|
}
|
|
161
161
|
break;
|
|
162
|
-
case
|
|
163
|
-
case
|
|
162
|
+
case "quit":
|
|
163
|
+
case "exit":
|
|
164
164
|
serviceManager.forceStopAll();
|
|
165
165
|
exit();
|
|
166
166
|
break;
|
|
167
|
-
case
|
|
167
|
+
case "ai":
|
|
168
168
|
handleAICommand(cmdArgs);
|
|
169
169
|
break;
|
|
170
|
-
case
|
|
171
|
-
case
|
|
170
|
+
case "extract-config":
|
|
171
|
+
case "extract":
|
|
172
172
|
handleExtractConfig(cmdArgs);
|
|
173
173
|
break;
|
|
174
|
-
case
|
|
174
|
+
case "add-dependency":
|
|
175
175
|
handleAddDependency(cmdArgs);
|
|
176
176
|
break;
|
|
177
177
|
default:
|
|
@@ -179,41 +179,41 @@ export default function App({ autoStart, args }) {
|
|
|
179
179
|
}
|
|
180
180
|
};
|
|
181
181
|
const startDevServer = (cmdArgs) => {
|
|
182
|
-
const noHttps = cmdArgs.includes(
|
|
183
|
-
const noSocket = cmdArgs.includes(
|
|
184
|
-
const withMock = cmdArgs.includes(
|
|
185
|
-
const withFirefox = cmdArgs.includes(
|
|
186
|
-
const withChrome = cmdArgs.includes(
|
|
182
|
+
const noHttps = cmdArgs.includes("--no-https") || args?.noHttps === true;
|
|
183
|
+
const noSocket = cmdArgs.includes("--no-socket") || args?.noSocket === true;
|
|
184
|
+
const withMock = cmdArgs.includes("--with-mock") || args?.withMock === true;
|
|
185
|
+
const withFirefox = cmdArgs.includes("--firefox") || args?.firefox === true;
|
|
186
|
+
const withChrome = cmdArgs.includes("--chrome") || args?.chrome === true;
|
|
187
187
|
// Determine port from env or default
|
|
188
188
|
const port = process.env.NODE_PORT || 3060;
|
|
189
189
|
const useHttps = !noHttps;
|
|
190
190
|
// Socket server starts by default unless --no-socket is passed
|
|
191
191
|
const shouldStartSocket = !noSocket;
|
|
192
192
|
// Check if already running
|
|
193
|
-
if (serviceManager.isRunning(
|
|
194
|
-
addSystemLog(
|
|
193
|
+
if (serviceManager.isRunning("vite")) {
|
|
194
|
+
addSystemLog("Vite dev server is already running.");
|
|
195
195
|
// Switch to vite tab
|
|
196
|
-
const viteIdx = services.findIndex(s => s.id ===
|
|
196
|
+
const viteIdx = services.findIndex((s) => s.id === "vite");
|
|
197
197
|
if (viteIdx >= 0)
|
|
198
198
|
setActiveTab(viteIdx);
|
|
199
199
|
return;
|
|
200
200
|
}
|
|
201
201
|
startVite({ noHttps });
|
|
202
202
|
// Also start socket server based on flags/env (with mock if requested)
|
|
203
|
-
if (shouldStartSocket && !serviceManager.isRunning(
|
|
203
|
+
if (shouldStartSocket && !serviceManager.isRunning("socket")) {
|
|
204
204
|
startSocket({ withMock });
|
|
205
205
|
}
|
|
206
206
|
// Launch browser extensions if requested (pass URL options)
|
|
207
|
-
if (withFirefox && !serviceManager.isRunning(
|
|
208
|
-
startExtension({ browser:
|
|
207
|
+
if (withFirefox && !serviceManager.isRunning("ext-firefox")) {
|
|
208
|
+
startExtension({ browser: "firefox", useHttps, port });
|
|
209
209
|
}
|
|
210
|
-
if (withChrome && !serviceManager.isRunning(
|
|
211
|
-
startExtension({ browser:
|
|
210
|
+
if (withChrome && !serviceManager.isRunning("ext-chrome")) {
|
|
211
|
+
startExtension({ browser: "chrome", useHttps, port });
|
|
212
212
|
}
|
|
213
213
|
// Sync and switch to the new vite tab
|
|
214
214
|
const updatedServices = serviceManager.getAllServices();
|
|
215
|
-
const viteIdx = updatedServices.findIndex(s => s.id ===
|
|
216
|
-
setServices(updatedServices.map(s => ({
|
|
215
|
+
const viteIdx = updatedServices.findIndex((s) => s.id === "vite");
|
|
216
|
+
setServices(updatedServices.map((s) => ({
|
|
217
217
|
id: s.id,
|
|
218
218
|
name: s.name,
|
|
219
219
|
status: s.status,
|
|
@@ -222,9 +222,9 @@ export default function App({ autoStart, args }) {
|
|
|
222
222
|
setActiveTab(viteIdx >= 0 ? viteIdx : Math.max(0, updatedServices.length - 1));
|
|
223
223
|
};
|
|
224
224
|
const startSocketServer = (withMock = false) => {
|
|
225
|
-
if (serviceManager.isRunning(
|
|
226
|
-
addSystemLog(
|
|
227
|
-
const socketIdx = services.findIndex(s => s.id ===
|
|
225
|
+
if (serviceManager.isRunning("socket")) {
|
|
226
|
+
addSystemLog("Socket.IO server is already running.");
|
|
227
|
+
const socketIdx = services.findIndex((s) => s.id === "socket");
|
|
228
228
|
if (socketIdx >= 0)
|
|
229
229
|
setActiveTab(socketIdx);
|
|
230
230
|
return;
|
|
@@ -232,8 +232,8 @@ export default function App({ autoStart, args }) {
|
|
|
232
232
|
startSocket({ withMock });
|
|
233
233
|
// Sync and switch to the new socket tab
|
|
234
234
|
const updatedServices = serviceManager.getAllServices();
|
|
235
|
-
const socketIdx = updatedServices.findIndex(s => s.id ===
|
|
236
|
-
setServices(updatedServices.map(s => ({
|
|
235
|
+
const socketIdx = updatedServices.findIndex((s) => s.id === "socket");
|
|
236
|
+
setServices(updatedServices.map((s) => ({
|
|
237
237
|
id: s.id,
|
|
238
238
|
name: s.name,
|
|
239
239
|
status: s.status,
|
|
@@ -243,14 +243,14 @@ export default function App({ autoStart, args }) {
|
|
|
243
243
|
};
|
|
244
244
|
const launchExtension = (browser) => {
|
|
245
245
|
const browserType = browser.toLowerCase();
|
|
246
|
-
if (browserType !==
|
|
246
|
+
if (browserType !== "chrome" && browserType !== "firefox") {
|
|
247
247
|
addSystemLog(`Invalid browser: ${browser}. Use 'chrome' or 'firefox'.`);
|
|
248
248
|
return;
|
|
249
249
|
}
|
|
250
250
|
const serviceId = `ext-${browserType}`;
|
|
251
251
|
if (serviceManager.isRunning(serviceId)) {
|
|
252
252
|
addSystemLog(`${browser} extension is already running.`);
|
|
253
|
-
const extIdx = services.findIndex(s => s.id === serviceId);
|
|
253
|
+
const extIdx = services.findIndex((s) => s.id === serviceId);
|
|
254
254
|
if (extIdx >= 0)
|
|
255
255
|
setActiveTab(extIdx);
|
|
256
256
|
return;
|
|
@@ -258,8 +258,8 @@ export default function App({ autoStart, args }) {
|
|
|
258
258
|
startExtension({ browser: browserType });
|
|
259
259
|
// Sync and switch to the new extension tab
|
|
260
260
|
const updatedServices = serviceManager.getAllServices();
|
|
261
|
-
const extIdx = updatedServices.findIndex(s => s.id === serviceId);
|
|
262
|
-
setServices(updatedServices.map(s => ({
|
|
261
|
+
const extIdx = updatedServices.findIndex((s) => s.id === serviceId);
|
|
262
|
+
setServices(updatedServices.map((s) => ({
|
|
263
263
|
id: s.id,
|
|
264
264
|
name: s.name,
|
|
265
265
|
status: s.status,
|
|
@@ -270,17 +270,17 @@ export default function App({ autoStart, args }) {
|
|
|
270
270
|
const stopService = (serviceId) => {
|
|
271
271
|
const targetId = serviceId || services[activeTab]?.id;
|
|
272
272
|
if (!targetId) {
|
|
273
|
-
addSystemLog(
|
|
273
|
+
addSystemLog("No service specified. Usage: /stop <service-id>");
|
|
274
274
|
return;
|
|
275
275
|
}
|
|
276
|
-
if (targetId ===
|
|
276
|
+
if (targetId === "vite") {
|
|
277
277
|
stopVite();
|
|
278
278
|
}
|
|
279
|
-
else if (targetId ===
|
|
279
|
+
else if (targetId === "socket") {
|
|
280
280
|
stopSocket();
|
|
281
281
|
}
|
|
282
|
-
else if (targetId.startsWith(
|
|
283
|
-
const browser = targetId.replace(
|
|
282
|
+
else if (targetId.startsWith("ext-")) {
|
|
283
|
+
const browser = targetId.replace("ext-", "");
|
|
284
284
|
stopExtension(browser);
|
|
285
285
|
}
|
|
286
286
|
else {
|
|
@@ -291,11 +291,11 @@ export default function App({ autoStart, args }) {
|
|
|
291
291
|
const restartService = (serviceId) => {
|
|
292
292
|
const targetId = serviceId || services[activeTab]?.id;
|
|
293
293
|
if (!targetId) {
|
|
294
|
-
addSystemLog(
|
|
294
|
+
addSystemLog("No service to restart. Usage: /restart [service-id]");
|
|
295
295
|
return;
|
|
296
296
|
}
|
|
297
|
-
if (targetId ===
|
|
298
|
-
addSystemLog(
|
|
297
|
+
if (targetId === "system") {
|
|
298
|
+
addSystemLog("Cannot restart the system service.");
|
|
299
299
|
return;
|
|
300
300
|
}
|
|
301
301
|
const success = serviceManager.restart(targetId);
|
|
@@ -307,7 +307,7 @@ export default function App({ autoStart, args }) {
|
|
|
307
307
|
const handleAICommand = async (cmdArgs) => {
|
|
308
308
|
const subCommand = cmdArgs[0];
|
|
309
309
|
switch (subCommand) {
|
|
310
|
-
case
|
|
310
|
+
case "model":
|
|
311
311
|
// Set or show current AI provider
|
|
312
312
|
const providerArg = cmdArgs[1];
|
|
313
313
|
if (providerArg) {
|
|
@@ -323,27 +323,29 @@ export default function App({ autoStart, args }) {
|
|
|
323
323
|
// Show current provider and available providers
|
|
324
324
|
const current = aiService.getProviderInfo();
|
|
325
325
|
const providers = getAvailableProviders();
|
|
326
|
-
let message = `Current AI provider: ${current ? getProviderStatus(current) :
|
|
326
|
+
let message = `Current AI provider: ${current ? getProviderStatus(current) : "None"}\n\nAvailable providers:`;
|
|
327
327
|
for (const p of providers) {
|
|
328
|
-
const status = p.available
|
|
329
|
-
|
|
328
|
+
const status = p.available
|
|
329
|
+
? getProviderStatus(p)
|
|
330
|
+
: `${p.name} (not available)`;
|
|
331
|
+
const marker = p.id === current?.id ? " ← current" : "";
|
|
330
332
|
message += `\n ${p.id}: ${status}${marker}`;
|
|
331
333
|
if (!p.available && p.reason) {
|
|
332
334
|
message += `\n ${p.reason}`;
|
|
333
335
|
}
|
|
334
336
|
}
|
|
335
|
-
message +=
|
|
337
|
+
message += "\n\nUsage: /ai model <claude|codex|gemini>";
|
|
336
338
|
addSystemLog(message);
|
|
337
339
|
}
|
|
338
340
|
break;
|
|
339
|
-
case
|
|
341
|
+
case "status":
|
|
340
342
|
// Show detailed status of all providers
|
|
341
343
|
const providers = getAvailableProviders();
|
|
342
344
|
const currentProvider = aiService.getProvider();
|
|
343
|
-
let statusMsg =
|
|
345
|
+
let statusMsg = "AI Provider Status:\n";
|
|
344
346
|
for (const p of providers) {
|
|
345
|
-
const icon = p.available ?
|
|
346
|
-
const current = p.id === currentProvider ?
|
|
347
|
+
const icon = p.available ? "✅" : "❌";
|
|
348
|
+
const current = p.id === currentProvider ? " (current)" : "";
|
|
347
349
|
statusMsg += `\n ${icon} ${getProviderStatus(p)}${current}`;
|
|
348
350
|
if (!p.available && p.reason) {
|
|
349
351
|
statusMsg += `\n ${p.reason}`;
|
|
@@ -351,18 +353,18 @@ export default function App({ autoStart, args }) {
|
|
|
351
353
|
}
|
|
352
354
|
addSystemLog(statusMsg);
|
|
353
355
|
break;
|
|
354
|
-
case
|
|
356
|
+
case "ask":
|
|
355
357
|
// Quick question without opening panel
|
|
356
|
-
const question = cmdArgs.slice(1).join(
|
|
358
|
+
const question = cmdArgs.slice(1).join(" ");
|
|
357
359
|
if (!question) {
|
|
358
|
-
addSystemLog(
|
|
360
|
+
addSystemLog("Usage: /ai ask <your question>");
|
|
359
361
|
return;
|
|
360
362
|
}
|
|
361
363
|
if (!aiService.isAvailable()) {
|
|
362
364
|
addSystemLog(`Current provider (${aiService.getProvider()}) is not available. Run /ai model to select a different provider.`);
|
|
363
365
|
return;
|
|
364
366
|
}
|
|
365
|
-
const providerName = aiService.getProviderInfo()?.name ||
|
|
367
|
+
const providerName = aiService.getProviderInfo()?.name || "AI";
|
|
366
368
|
addSystemLog(`Asking ${providerName}: ${question}`);
|
|
367
369
|
try {
|
|
368
370
|
aiService.loadProjectContext(process.cwd());
|
|
@@ -370,14 +372,14 @@ export default function App({ autoStart, args }) {
|
|
|
370
372
|
addSystemLog(`${providerName}: ${response}`);
|
|
371
373
|
}
|
|
372
374
|
catch (err) {
|
|
373
|
-
addSystemLog(`Error: ${err instanceof Error ? err.message :
|
|
375
|
+
addSystemLog(`Error: ${err instanceof Error ? err.message : "Unknown error"}`);
|
|
374
376
|
}
|
|
375
377
|
break;
|
|
376
|
-
case
|
|
378
|
+
case "clear":
|
|
377
379
|
aiService.clearConversation();
|
|
378
|
-
addSystemLog(
|
|
380
|
+
addSystemLog("Conversation history cleared.");
|
|
379
381
|
break;
|
|
380
|
-
case
|
|
382
|
+
case "chat":
|
|
381
383
|
default:
|
|
382
384
|
// Open AI chat panel
|
|
383
385
|
if (!aiService.isAvailable()) {
|
|
@@ -389,18 +391,18 @@ export default function App({ autoStart, args }) {
|
|
|
389
391
|
};
|
|
390
392
|
const addSystemLog = (message) => {
|
|
391
393
|
// Use functional update to properly handle rapid successive calls
|
|
392
|
-
setServices(prev => {
|
|
393
|
-
const existingSystem = prev.find(s => s.id ===
|
|
394
|
+
setServices((prev) => {
|
|
395
|
+
const existingSystem = prev.find((s) => s.id === "system");
|
|
394
396
|
if (existingSystem) {
|
|
395
397
|
// Add message to existing system service
|
|
396
|
-
return prev.map(s => s.id ===
|
|
398
|
+
return prev.map((s) => s.id === "system" ? { ...s, logs: [...s.logs, message] } : s);
|
|
397
399
|
}
|
|
398
400
|
else {
|
|
399
401
|
// Create new system service with the message
|
|
400
402
|
const newService = {
|
|
401
|
-
id:
|
|
402
|
-
name:
|
|
403
|
-
status:
|
|
403
|
+
id: "system",
|
|
404
|
+
name: "System",
|
|
405
|
+
status: "running",
|
|
404
406
|
logs: [message],
|
|
405
407
|
};
|
|
406
408
|
return [...prev, newService];
|
|
@@ -408,8 +410,8 @@ export default function App({ autoStart, args }) {
|
|
|
408
410
|
});
|
|
409
411
|
// Switch to system tab
|
|
410
412
|
setTimeout(() => {
|
|
411
|
-
setServices(current => {
|
|
412
|
-
const sysIdx = current.findIndex(s => s.id ===
|
|
413
|
+
setServices((current) => {
|
|
414
|
+
const sysIdx = current.findIndex((s) => s.id === "system");
|
|
413
415
|
if (sysIdx >= 0)
|
|
414
416
|
setActiveTab(sysIdx);
|
|
415
417
|
return current; // Don't modify, just read
|
|
@@ -418,7 +420,7 @@ export default function App({ autoStart, args }) {
|
|
|
418
420
|
};
|
|
419
421
|
const handleSocketSend = async (eventArgs) => {
|
|
420
422
|
if (!eventArgs.length) {
|
|
421
|
-
addSystemLog(
|
|
423
|
+
addSystemLog("Usage: /socket send <event-name> [identifier]");
|
|
422
424
|
return;
|
|
423
425
|
}
|
|
424
426
|
const eventName = eventArgs[0];
|
|
@@ -435,44 +437,44 @@ export default function App({ autoStart, args }) {
|
|
|
435
437
|
const handleSocketList = () => {
|
|
436
438
|
const events = listSocketEvents();
|
|
437
439
|
if (events.length === 0) {
|
|
438
|
-
addSystemLog(
|
|
440
|
+
addSystemLog("No socket events found. Check your socket-events directory.");
|
|
439
441
|
return;
|
|
440
442
|
}
|
|
441
|
-
let message =
|
|
443
|
+
let message = "Available socket events:\n";
|
|
442
444
|
for (const event of events) {
|
|
443
445
|
message += `\n ${event.name}\n`;
|
|
444
446
|
message += ` Event: ${event.event}\n`;
|
|
445
447
|
message += ` Channel: ${event.channel}`;
|
|
446
448
|
}
|
|
447
|
-
message +=
|
|
449
|
+
message += "\n\nUsage: /socket send <event-name> [identifier]";
|
|
448
450
|
addSystemLog(message);
|
|
449
451
|
};
|
|
450
452
|
const handleExtractConfig = async (cmdArgs) => {
|
|
451
|
-
const dryRun = cmdArgs.includes(
|
|
452
|
-
const overwrite = cmdArgs.includes(
|
|
453
|
-
addSystemLog(
|
|
453
|
+
const dryRun = cmdArgs.includes("--dry-run") || cmdArgs.includes("-d");
|
|
454
|
+
const overwrite = cmdArgs.includes("--overwrite") || cmdArgs.includes("-o");
|
|
455
|
+
addSystemLog("Scanning source files for GxP configuration...");
|
|
454
456
|
try {
|
|
455
457
|
// Use dynamic imports for ES modules
|
|
456
|
-
const path = await import(
|
|
457
|
-
const fs = await import(
|
|
458
|
-
const url = await import(
|
|
459
|
-
const { createRequire } = await import(
|
|
458
|
+
const path = await import("path");
|
|
459
|
+
const fs = await import("fs");
|
|
460
|
+
const url = await import("url");
|
|
461
|
+
const { createRequire } = await import("module");
|
|
460
462
|
// Get the directory of this file and resolve to the utils directory
|
|
461
463
|
const __filename = url.fileURLToPath(import.meta.url);
|
|
462
464
|
const __dirname = path.dirname(__filename);
|
|
463
465
|
// The compiled JS is in dist/tui/, utils is in bin/lib/utils/
|
|
464
466
|
// From dist/tui/ we need to go up to package root, then into bin/lib/utils/
|
|
465
|
-
const packageRoot = path.resolve(__dirname,
|
|
466
|
-
const utilsPath = path.join(packageRoot,
|
|
467
|
+
const packageRoot = path.resolve(__dirname, "..", "..");
|
|
468
|
+
const utilsPath = path.join(packageRoot, "bin", "lib", "utils", "extract-config.js");
|
|
467
469
|
// Create a require function to load CommonJS modules
|
|
468
470
|
const requireCjs = createRequire(import.meta.url);
|
|
469
471
|
const extractConfigUtils = requireCjs(utilsPath);
|
|
470
472
|
const projectPath = process.cwd();
|
|
471
|
-
const srcDir = path.join(projectPath,
|
|
472
|
-
const manifestPath = path.join(projectPath,
|
|
473
|
+
const srcDir = path.join(projectPath, "src");
|
|
474
|
+
const manifestPath = path.join(projectPath, "app-manifest.json");
|
|
473
475
|
// Check if src directory exists
|
|
474
476
|
if (!fs.existsSync(srcDir)) {
|
|
475
|
-
addSystemLog(
|
|
477
|
+
addSystemLog("Source directory not found: src/");
|
|
476
478
|
return;
|
|
477
479
|
}
|
|
478
480
|
// Extract configuration
|
|
@@ -486,60 +488,60 @@ export default function App({ autoStart, args }) {
|
|
|
486
488
|
Object.keys(extractedConfig.triggerState).length +
|
|
487
489
|
extractedConfig.dependencies.length;
|
|
488
490
|
if (totalItems === 0) {
|
|
489
|
-
addSystemLog(
|
|
491
|
+
addSystemLog("No GxP configuration found in source files.");
|
|
490
492
|
return;
|
|
491
493
|
}
|
|
492
494
|
if (dryRun) {
|
|
493
|
-
addSystemLog(
|
|
494
|
-
addSystemLog(
|
|
495
|
+
addSystemLog("Dry run mode - no changes made.");
|
|
496
|
+
addSystemLog("Run /extract-config without --dry-run to apply changes.");
|
|
495
497
|
return;
|
|
496
498
|
}
|
|
497
499
|
// Load or create manifest
|
|
498
500
|
let existingManifest = {};
|
|
499
501
|
if (fs.existsSync(manifestPath)) {
|
|
500
502
|
try {
|
|
501
|
-
existingManifest = JSON.parse(fs.readFileSync(manifestPath,
|
|
503
|
+
existingManifest = JSON.parse(fs.readFileSync(manifestPath, "utf-8"));
|
|
502
504
|
}
|
|
503
505
|
catch {
|
|
504
|
-
addSystemLog(
|
|
506
|
+
addSystemLog("Could not parse existing manifest, creating new one.");
|
|
505
507
|
existingManifest = getDefaultManifest();
|
|
506
508
|
}
|
|
507
509
|
}
|
|
508
510
|
else {
|
|
509
|
-
addSystemLog(
|
|
511
|
+
addSystemLog("Creating new app-manifest.json");
|
|
510
512
|
existingManifest = getDefaultManifest();
|
|
511
513
|
}
|
|
512
514
|
// Merge and write
|
|
513
515
|
const mergedManifest = extractConfigUtils.mergeConfig(existingManifest, extractedConfig, { overwrite });
|
|
514
|
-
fs.writeFileSync(manifestPath, JSON.stringify(mergedManifest, null,
|
|
515
|
-
addSystemLog(
|
|
516
|
+
fs.writeFileSync(manifestPath, JSON.stringify(mergedManifest, null, "\t"));
|
|
517
|
+
addSystemLog("Updated app-manifest.json");
|
|
516
518
|
}
|
|
517
519
|
catch (err) {
|
|
518
|
-
addSystemLog(`Error: ${err instanceof Error ? err.message :
|
|
520
|
+
addSystemLog(`Error: ${err instanceof Error ? err.message : "Unknown error"}`);
|
|
519
521
|
}
|
|
520
522
|
};
|
|
521
523
|
const handleAddDependency = async (cmdArgs) => {
|
|
522
524
|
// The add-dependency wizard requires interactive terminal access (raw stdin)
|
|
523
525
|
// which conflicts with Ink's own stdin handling. Run it in a separate terminal.
|
|
524
|
-
const envFlag = cmdArgs.find(a => a ===
|
|
525
|
-
const envVal = envFlag ? cmdArgs[cmdArgs.indexOf(envFlag) + 1] :
|
|
526
|
-
const cmd = `gxdev add-dependency${envVal ? ` -e ${envVal}` :
|
|
527
|
-
addSystemLog(
|
|
528
|
-
addSystemLog(
|
|
529
|
-
addSystemLog(
|
|
530
|
-
addSystemLog(
|
|
526
|
+
const envFlag = cmdArgs.find((a) => a === "-e" || a === "--env");
|
|
527
|
+
const envVal = envFlag ? cmdArgs[cmdArgs.indexOf(envFlag) + 1] : "";
|
|
528
|
+
const cmd = `gxdev add-dependency${envVal ? ` -e ${envVal}` : ""}`;
|
|
529
|
+
addSystemLog("");
|
|
530
|
+
addSystemLog("The Add Dependency wizard requires interactive terminal access.");
|
|
531
|
+
addSystemLog("Run this command in a separate terminal:");
|
|
532
|
+
addSystemLog("");
|
|
531
533
|
addSystemLog(` \x1B[36m${cmd}\x1B[0m`);
|
|
532
|
-
addSystemLog(
|
|
534
|
+
addSystemLog("");
|
|
533
535
|
};
|
|
534
536
|
const getDefaultManifest = () => ({
|
|
535
|
-
name:
|
|
536
|
-
version:
|
|
537
|
-
description:
|
|
537
|
+
name: "GxToolkit",
|
|
538
|
+
version: "1.0.0",
|
|
539
|
+
description: "GxToolkit Plugin",
|
|
538
540
|
manifest_version: 3,
|
|
539
|
-
asset_dir:
|
|
540
|
-
configurationFile:
|
|
541
|
-
appInstructionsFile:
|
|
542
|
-
defaultStylingFile:
|
|
541
|
+
asset_dir: "/src/assets/",
|
|
542
|
+
configurationFile: "configuration.json",
|
|
543
|
+
appInstructionsFile: "app-instructions.md",
|
|
544
|
+
defaultStylingFile: "default-styling.css",
|
|
543
545
|
settings: {},
|
|
544
546
|
strings: { default: {} },
|
|
545
547
|
assets: {},
|
|
@@ -615,10 +617,12 @@ Keyboard shortcuts:
|
|
|
615
617
|
const fixedRows = 10;
|
|
616
618
|
const availableForLog = terminalHeight - fixedRows - suggestionRows;
|
|
617
619
|
const logPanelHeight = Math.max(3, availableForLog); // Minimum 3 rows for log panel
|
|
618
|
-
return (_jsxs(Box, { flexDirection: "column", height: terminalHeight, children: [_jsx(Header, { projectName: process.cwd().split(
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
620
|
+
return (_jsxs(Box, { flexDirection: "column", height: terminalHeight, children: [_jsx(Header, { projectName: process.cwd().split("/").pop() || "gxdev" }), services.length > 0 && (_jsx(TabBar, { services: services, activeTab: activeTab, onTabChange: setActiveTab })), _jsx(Box, { height: logPanelHeight, flexDirection: "column", borderStyle: "single", borderColor: "gray", overflow: "hidden", children: currentService ? (_jsx(LogPanel, { logs: currentService.logs, maxHeight: logPanelHeight })) : (_jsx(WelcomeScreen, {})) }), _jsx(CommandInput, { onSubmit: handleCommand, activeService: currentService
|
|
621
|
+
? {
|
|
622
|
+
id: currentService.id,
|
|
623
|
+
name: currentService.name,
|
|
624
|
+
status: currentService.status,
|
|
625
|
+
}
|
|
626
|
+
: null, onSuggestionsChange: handleSuggestionsChange })] }));
|
|
623
627
|
}
|
|
624
628
|
//# sourceMappingURL=App.js.map
|