@friggframework/devtools 2.0.0-next.4 → 2.0.0-next.40
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/frigg-cli/.eslintrc.js +141 -0
- package/frigg-cli/__tests__/jest.config.js +102 -0
- package/frigg-cli/__tests__/unit/commands/build.test.js +483 -0
- package/frigg-cli/__tests__/unit/commands/install.test.js +418 -0
- package/frigg-cli/__tests__/unit/commands/ui.test.js +592 -0
- package/frigg-cli/__tests__/utils/command-tester.js +170 -0
- package/frigg-cli/__tests__/utils/mock-factory.js +270 -0
- package/frigg-cli/__tests__/utils/test-fixtures.js +463 -0
- package/frigg-cli/__tests__/utils/test-setup.js +286 -0
- package/frigg-cli/build-command/index.js +54 -0
- package/frigg-cli/deploy-command/index.js +175 -0
- package/frigg-cli/generate-command/__tests__/generate-command.test.js +312 -0
- package/frigg-cli/generate-command/azure-generator.js +43 -0
- package/frigg-cli/generate-command/gcp-generator.js +47 -0
- package/frigg-cli/generate-command/index.js +332 -0
- package/frigg-cli/generate-command/terraform-generator.js +555 -0
- package/frigg-cli/generate-iam-command.js +115 -0
- package/frigg-cli/index.js +47 -1
- package/frigg-cli/index.test.js +1 -4
- package/frigg-cli/init-command/backend-first-handler.js +756 -0
- package/frigg-cli/init-command/index.js +93 -0
- package/frigg-cli/init-command/template-handler.js +143 -0
- package/frigg-cli/install-command/index.js +1 -4
- package/frigg-cli/package.json +51 -0
- package/frigg-cli/start-command/index.js +24 -4
- package/frigg-cli/test/init-command.test.js +180 -0
- package/frigg-cli/test/npm-registry.test.js +319 -0
- package/frigg-cli/ui-command/index.js +154 -0
- package/frigg-cli/utils/app-resolver.js +319 -0
- package/frigg-cli/utils/backend-path.js +16 -17
- package/frigg-cli/utils/npm-registry.js +167 -0
- package/frigg-cli/utils/process-manager.js +199 -0
- package/frigg-cli/utils/repo-detection.js +405 -0
- package/infrastructure/DEPLOYMENT-INSTRUCTIONS.md +268 -0
- package/infrastructure/GENERATE-IAM-DOCS.md +278 -0
- package/infrastructure/IAM-POLICY-TEMPLATES.md +176 -0
- package/infrastructure/README.md +443 -0
- package/infrastructure/WEBSOCKET-CONFIGURATION.md +105 -0
- package/infrastructure/__tests__/fixtures/mock-aws-resources.js +391 -0
- package/infrastructure/__tests__/helpers/test-utils.js +277 -0
- package/infrastructure/aws-discovery.js +1176 -0
- package/infrastructure/aws-discovery.test.js +1220 -0
- package/infrastructure/build-time-discovery.js +206 -0
- package/infrastructure/build-time-discovery.test.js +378 -0
- package/infrastructure/create-frigg-infrastructure.js +3 -5
- package/infrastructure/env-validator.js +77 -0
- package/infrastructure/frigg-deployment-iam-stack.yaml +401 -0
- package/infrastructure/iam-generator.js +836 -0
- package/infrastructure/iam-generator.test.js +172 -0
- package/infrastructure/iam-policy-basic.json +218 -0
- package/infrastructure/iam-policy-full.json +288 -0
- package/infrastructure/integration.test.js +383 -0
- package/infrastructure/run-discovery.js +110 -0
- package/infrastructure/serverless-template.js +1472 -138
- package/infrastructure/serverless-template.test.js +1759 -0
- package/management-ui/.eslintrc.js +22 -0
- package/management-ui/README.md +203 -0
- package/management-ui/components.json +21 -0
- package/management-ui/docs/phase2-integration-guide.md +320 -0
- package/management-ui/index.html +13 -0
- package/management-ui/package-lock.json +16517 -0
- package/management-ui/package.json +76 -0
- package/management-ui/packages/devtools/frigg-cli/ui-command/index.js +302 -0
- package/management-ui/postcss.config.js +6 -0
- package/management-ui/server/api/backend.js +256 -0
- package/management-ui/server/api/cli.js +315 -0
- package/management-ui/server/api/codegen.js +663 -0
- package/management-ui/server/api/connections.js +857 -0
- package/management-ui/server/api/discovery.js +185 -0
- package/management-ui/server/api/environment/index.js +1 -0
- package/management-ui/server/api/environment/router.js +378 -0
- package/management-ui/server/api/environment.js +328 -0
- package/management-ui/server/api/integrations.js +876 -0
- package/management-ui/server/api/logs.js +248 -0
- package/management-ui/server/api/monitoring.js +282 -0
- package/management-ui/server/api/open-ide.js +31 -0
- package/management-ui/server/api/project.js +1029 -0
- package/management-ui/server/api/users/sessions.js +371 -0
- package/management-ui/server/api/users/simulation.js +254 -0
- package/management-ui/server/api/users.js +362 -0
- package/management-ui/server/api-contract.md +275 -0
- package/management-ui/server/index.js +873 -0
- package/management-ui/server/middleware/errorHandler.js +93 -0
- package/management-ui/server/middleware/security.js +32 -0
- package/management-ui/server/processManager.js +296 -0
- package/management-ui/server/server.js +346 -0
- package/management-ui/server/services/aws-monitor.js +413 -0
- package/management-ui/server/services/npm-registry.js +347 -0
- package/management-ui/server/services/template-engine.js +538 -0
- package/management-ui/server/utils/cliIntegration.js +220 -0
- package/management-ui/server/utils/environment/auditLogger.js +471 -0
- package/management-ui/server/utils/environment/awsParameterStore.js +264 -0
- package/management-ui/server/utils/environment/encryption.js +278 -0
- package/management-ui/server/utils/environment/envFileManager.js +286 -0
- package/management-ui/server/utils/import-commonjs.js +28 -0
- package/management-ui/server/utils/response.js +83 -0
- package/management-ui/server/websocket/handler.js +325 -0
- package/management-ui/src/App.jsx +109 -0
- package/management-ui/src/assets/FriggLogo.svg +1 -0
- package/management-ui/src/components/AppRouter.jsx +65 -0
- package/management-ui/src/components/Button.jsx +70 -0
- package/management-ui/src/components/Card.jsx +97 -0
- package/management-ui/src/components/EnvironmentCompare.jsx +400 -0
- package/management-ui/src/components/EnvironmentEditor.jsx +372 -0
- package/management-ui/src/components/EnvironmentImportExport.jsx +469 -0
- package/management-ui/src/components/EnvironmentSchema.jsx +491 -0
- package/management-ui/src/components/EnvironmentSecurity.jsx +463 -0
- package/management-ui/src/components/ErrorBoundary.jsx +73 -0
- package/management-ui/src/components/IntegrationCard.jsx +481 -0
- package/management-ui/src/components/IntegrationCardEnhanced.jsx +770 -0
- package/management-ui/src/components/IntegrationExplorer.jsx +379 -0
- package/management-ui/src/components/IntegrationStatus.jsx +336 -0
- package/management-ui/src/components/Layout.jsx +716 -0
- package/management-ui/src/components/LoadingSpinner.jsx +113 -0
- package/management-ui/src/components/RepositoryPicker.jsx +248 -0
- package/management-ui/src/components/SessionMonitor.jsx +350 -0
- package/management-ui/src/components/StatusBadge.jsx +208 -0
- package/management-ui/src/components/UserContextSwitcher.jsx +212 -0
- package/management-ui/src/components/UserSimulation.jsx +327 -0
- package/management-ui/src/components/Welcome.jsx +434 -0
- package/management-ui/src/components/codegen/APIEndpointGenerator.jsx +637 -0
- package/management-ui/src/components/codegen/APIModuleSelector.jsx +227 -0
- package/management-ui/src/components/codegen/CodeGenerationWizard.jsx +247 -0
- package/management-ui/src/components/codegen/CodePreviewEditor.jsx +316 -0
- package/management-ui/src/components/codegen/DynamicModuleForm.jsx +271 -0
- package/management-ui/src/components/codegen/FormBuilder.jsx +737 -0
- package/management-ui/src/components/codegen/IntegrationGenerator.jsx +855 -0
- package/management-ui/src/components/codegen/ProjectScaffoldWizard.jsx +797 -0
- package/management-ui/src/components/codegen/SchemaBuilder.jsx +303 -0
- package/management-ui/src/components/codegen/TemplateSelector.jsx +586 -0
- package/management-ui/src/components/codegen/index.js +10 -0
- package/management-ui/src/components/connections/ConnectionConfigForm.jsx +362 -0
- package/management-ui/src/components/connections/ConnectionHealthMonitor.jsx +182 -0
- package/management-ui/src/components/connections/ConnectionTester.jsx +200 -0
- package/management-ui/src/components/connections/EntityRelationshipMapper.jsx +292 -0
- package/management-ui/src/components/connections/OAuthFlow.jsx +204 -0
- package/management-ui/src/components/connections/index.js +5 -0
- package/management-ui/src/components/index.js +21 -0
- package/management-ui/src/components/monitoring/APIGatewayMetrics.jsx +222 -0
- package/management-ui/src/components/monitoring/LambdaMetrics.jsx +169 -0
- package/management-ui/src/components/monitoring/MetricsChart.jsx +197 -0
- package/management-ui/src/components/monitoring/MonitoringDashboard.jsx +393 -0
- package/management-ui/src/components/monitoring/SQSMetrics.jsx +246 -0
- package/management-ui/src/components/monitoring/index.js +6 -0
- package/management-ui/src/components/monitoring/monitoring.css +218 -0
- package/management-ui/src/components/theme-provider.jsx +52 -0
- package/management-ui/src/components/theme-toggle.jsx +39 -0
- package/management-ui/src/components/ui/badge.tsx +36 -0
- package/management-ui/src/components/ui/button.test.jsx +56 -0
- package/management-ui/src/components/ui/button.tsx +57 -0
- package/management-ui/src/components/ui/card.tsx +76 -0
- package/management-ui/src/components/ui/dropdown-menu.tsx +199 -0
- package/management-ui/src/components/ui/select.tsx +157 -0
- package/management-ui/src/components/ui/skeleton.jsx +15 -0
- package/management-ui/src/hooks/useFrigg.jsx +601 -0
- package/management-ui/src/hooks/useSocket.jsx +58 -0
- package/management-ui/src/index.css +193 -0
- package/management-ui/src/lib/utils.ts +6 -0
- package/management-ui/src/main.jsx +10 -0
- package/management-ui/src/pages/CodeGeneration.jsx +14 -0
- package/management-ui/src/pages/Connections.jsx +252 -0
- package/management-ui/src/pages/ConnectionsEnhanced.jsx +633 -0
- package/management-ui/src/pages/Dashboard.jsx +311 -0
- package/management-ui/src/pages/Environment.jsx +314 -0
- package/management-ui/src/pages/IntegrationConfigure.jsx +669 -0
- package/management-ui/src/pages/IntegrationDiscovery.jsx +567 -0
- package/management-ui/src/pages/IntegrationTest.jsx +742 -0
- package/management-ui/src/pages/Integrations.jsx +253 -0
- package/management-ui/src/pages/Monitoring.jsx +17 -0
- package/management-ui/src/pages/Simulation.jsx +155 -0
- package/management-ui/src/pages/Users.jsx +492 -0
- package/management-ui/src/services/api.js +41 -0
- package/management-ui/src/services/apiModuleService.js +193 -0
- package/management-ui/src/services/websocket-handlers.js +120 -0
- package/management-ui/src/test/api/project.test.js +273 -0
- package/management-ui/src/test/components/Welcome.test.jsx +378 -0
- package/management-ui/src/test/mocks/server.js +178 -0
- package/management-ui/src/test/setup.js +61 -0
- package/management-ui/src/test/utils/test-utils.jsx +134 -0
- package/management-ui/src/utils/repository.js +98 -0
- package/management-ui/src/utils/repository.test.js +118 -0
- package/management-ui/src/workflows/phase2-integration-workflows.js +884 -0
- package/management-ui/tailwind.config.js +63 -0
- package/management-ui/tsconfig.json +37 -0
- package/management-ui/tsconfig.node.json +10 -0
- package/management-ui/vite.config.js +26 -0
- package/management-ui/vitest.config.js +38 -0
- package/package.json +20 -9
- package/infrastructure/app-handler-helpers.js +0 -57
- package/infrastructure/backend-utils.js +0 -90
- package/infrastructure/routers/auth.js +0 -26
- package/infrastructure/routers/integration-defined-routers.js +0 -37
- package/infrastructure/routers/middleware/loadUser.js +0 -15
- package/infrastructure/routers/middleware/requireLoggedInUser.js +0 -12
- package/infrastructure/routers/user.js +0 -41
- package/infrastructure/routers/websocket.js +0 -55
- package/infrastructure/workers/integration-defined-workers.js +0 -24
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
import { EventEmitter } from 'events'
|
|
2
|
+
|
|
3
|
+
class WebSocketHandler extends EventEmitter {
|
|
4
|
+
constructor() {
|
|
5
|
+
super();
|
|
6
|
+
this.clients = new Map();
|
|
7
|
+
this.subscriptions = new Map();
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
setupWebSocket(wss) {
|
|
11
|
+
wss.on('connection', (ws, req) => {
|
|
12
|
+
const clientId = this.generateClientId();
|
|
13
|
+
|
|
14
|
+
console.log(`New WebSocket connection: ${clientId}`);
|
|
15
|
+
|
|
16
|
+
// Store client connection
|
|
17
|
+
this.clients.set(clientId, {
|
|
18
|
+
ws,
|
|
19
|
+
subscriptions: new Set(),
|
|
20
|
+
connectedAt: new Date()
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
// Send welcome message
|
|
24
|
+
this.sendToClient(clientId, {
|
|
25
|
+
type: 'connection',
|
|
26
|
+
data: {
|
|
27
|
+
clientId,
|
|
28
|
+
message: 'Connected to Frigg Management Server',
|
|
29
|
+
timestamp: new Date().toISOString()
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
// Handle incoming messages
|
|
34
|
+
ws.on('message', (message) => {
|
|
35
|
+
try {
|
|
36
|
+
const data = JSON.parse(message.toString());
|
|
37
|
+
this.handleMessage(clientId, data);
|
|
38
|
+
} catch (error) {
|
|
39
|
+
console.error('Invalid WebSocket message:', error);
|
|
40
|
+
this.sendToClient(clientId, {
|
|
41
|
+
type: 'error',
|
|
42
|
+
data: {
|
|
43
|
+
message: 'Invalid message format',
|
|
44
|
+
timestamp: new Date().toISOString()
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// Handle client disconnect
|
|
51
|
+
ws.on('close', () => {
|
|
52
|
+
console.log(`Client disconnected: ${clientId}`);
|
|
53
|
+
this.handleDisconnect(clientId);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// Handle errors
|
|
57
|
+
ws.on('error', (error) => {
|
|
58
|
+
console.error(`WebSocket error for client ${clientId}:`, error);
|
|
59
|
+
this.handleDisconnect(clientId);
|
|
60
|
+
});
|
|
61
|
+
|
|
62
|
+
// Ping to keep connection alive
|
|
63
|
+
const pingInterval = setInterval(() => {
|
|
64
|
+
if (ws.readyState === ws.OPEN) {
|
|
65
|
+
ws.ping();
|
|
66
|
+
} else {
|
|
67
|
+
clearInterval(pingInterval);
|
|
68
|
+
}
|
|
69
|
+
}, 30000);
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
handleMessage(clientId, message) {
|
|
74
|
+
const { type, data } = message;
|
|
75
|
+
|
|
76
|
+
switch (type) {
|
|
77
|
+
case 'subscribe':
|
|
78
|
+
this.handleSubscribe(clientId, data);
|
|
79
|
+
break;
|
|
80
|
+
case 'unsubscribe':
|
|
81
|
+
this.handleUnsubscribe(clientId, data);
|
|
82
|
+
break;
|
|
83
|
+
case 'ping':
|
|
84
|
+
this.sendToClient(clientId, { type: 'pong', data: { timestamp: new Date().toISOString() } });
|
|
85
|
+
break;
|
|
86
|
+
default:
|
|
87
|
+
// Emit custom events for other components to handle
|
|
88
|
+
this.emit(type, { clientId, data });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
handleSubscribe(clientId, data) {
|
|
93
|
+
const { topics } = data;
|
|
94
|
+
const client = this.clients.get(clientId);
|
|
95
|
+
|
|
96
|
+
if (!client) return;
|
|
97
|
+
|
|
98
|
+
topics.forEach(topic => {
|
|
99
|
+
client.subscriptions.add(topic);
|
|
100
|
+
|
|
101
|
+
if (!this.subscriptions.has(topic)) {
|
|
102
|
+
this.subscriptions.set(topic, new Set());
|
|
103
|
+
}
|
|
104
|
+
this.subscriptions.get(topic).add(clientId);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
this.sendToClient(clientId, {
|
|
108
|
+
type: 'subscribed',
|
|
109
|
+
data: {
|
|
110
|
+
topics,
|
|
111
|
+
timestamp: new Date().toISOString()
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
handleUnsubscribe(clientId, data) {
|
|
117
|
+
const { topics } = data;
|
|
118
|
+
const client = this.clients.get(clientId);
|
|
119
|
+
|
|
120
|
+
if (!client) return;
|
|
121
|
+
|
|
122
|
+
topics.forEach(topic => {
|
|
123
|
+
client.subscriptions.delete(topic);
|
|
124
|
+
|
|
125
|
+
const topicSubscribers = this.subscriptions.get(topic);
|
|
126
|
+
if (topicSubscribers) {
|
|
127
|
+
topicSubscribers.delete(clientId);
|
|
128
|
+
if (topicSubscribers.size === 0) {
|
|
129
|
+
this.subscriptions.delete(topic);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
this.sendToClient(clientId, {
|
|
135
|
+
type: 'unsubscribed',
|
|
136
|
+
data: {
|
|
137
|
+
topics,
|
|
138
|
+
timestamp: new Date().toISOString()
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
handleDisconnect(clientId) {
|
|
144
|
+
const client = this.clients.get(clientId);
|
|
145
|
+
|
|
146
|
+
if (!client) return;
|
|
147
|
+
|
|
148
|
+
// Remove from all topic subscriptions
|
|
149
|
+
client.subscriptions.forEach(topic => {
|
|
150
|
+
const topicSubscribers = this.subscriptions.get(topic);
|
|
151
|
+
if (topicSubscribers) {
|
|
152
|
+
topicSubscribers.delete(clientId);
|
|
153
|
+
if (topicSubscribers.size === 0) {
|
|
154
|
+
this.subscriptions.delete(topic);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
// Remove client
|
|
160
|
+
this.clients.delete(clientId);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
sendToClient(clientId, message) {
|
|
164
|
+
const client = this.clients.get(clientId);
|
|
165
|
+
|
|
166
|
+
if (client && client.ws.readyState === client.ws.OPEN) {
|
|
167
|
+
client.ws.send(JSON.stringify(message));
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
broadcast(topic, message) {
|
|
172
|
+
const subscribers = this.subscriptions.get(topic);
|
|
173
|
+
|
|
174
|
+
if (!subscribers) return;
|
|
175
|
+
|
|
176
|
+
const broadcastMessage = {
|
|
177
|
+
type: 'broadcast',
|
|
178
|
+
topic,
|
|
179
|
+
data: message,
|
|
180
|
+
timestamp: new Date().toISOString()
|
|
181
|
+
};
|
|
182
|
+
|
|
183
|
+
subscribers.forEach(clientId => {
|
|
184
|
+
this.sendToClient(clientId, broadcastMessage);
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
broadcastToAll(message) {
|
|
189
|
+
const broadcastMessage = {
|
|
190
|
+
type: 'broadcast',
|
|
191
|
+
data: message,
|
|
192
|
+
timestamp: new Date().toISOString()
|
|
193
|
+
};
|
|
194
|
+
|
|
195
|
+
this.clients.forEach((client, clientId) => {
|
|
196
|
+
this.sendToClient(clientId, broadcastMessage);
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
generateClientId() {
|
|
201
|
+
return `client_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Create singleton instance
|
|
206
|
+
const wsHandler = new WebSocketHandler()
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Setup WebSocket handling for Socket.IO server
|
|
210
|
+
* @param {Server} io - Socket.IO server instance
|
|
211
|
+
*/
|
|
212
|
+
function setupWebSocket(io) {
|
|
213
|
+
io.on('connection', (socket) => {
|
|
214
|
+
const clientId = wsHandler.generateClientId()
|
|
215
|
+
|
|
216
|
+
console.log(`New WebSocket connection: ${clientId}`)
|
|
217
|
+
|
|
218
|
+
// Store client connection
|
|
219
|
+
wsHandler.clients.set(clientId, {
|
|
220
|
+
socket,
|
|
221
|
+
subscriptions: new Set(),
|
|
222
|
+
connectedAt: new Date()
|
|
223
|
+
})
|
|
224
|
+
|
|
225
|
+
// Send welcome message
|
|
226
|
+
socket.emit('connection', {
|
|
227
|
+
clientId,
|
|
228
|
+
message: 'Connected to Frigg Management Server',
|
|
229
|
+
timestamp: new Date().toISOString()
|
|
230
|
+
})
|
|
231
|
+
|
|
232
|
+
// Handle incoming messages
|
|
233
|
+
socket.on('message', (data) => {
|
|
234
|
+
try {
|
|
235
|
+
wsHandler.handleMessage(clientId, data)
|
|
236
|
+
} catch (error) {
|
|
237
|
+
console.error('Invalid WebSocket message:', error)
|
|
238
|
+
socket.emit('error', {
|
|
239
|
+
message: 'Invalid message format',
|
|
240
|
+
timestamp: new Date().toISOString()
|
|
241
|
+
})
|
|
242
|
+
}
|
|
243
|
+
})
|
|
244
|
+
|
|
245
|
+
// Handle subscriptions
|
|
246
|
+
socket.on('subscribe', (data) => {
|
|
247
|
+
wsHandler.handleSubscribe(clientId, data)
|
|
248
|
+
})
|
|
249
|
+
|
|
250
|
+
socket.on('unsubscribe', (data) => {
|
|
251
|
+
wsHandler.handleUnsubscribe(clientId, data)
|
|
252
|
+
})
|
|
253
|
+
|
|
254
|
+
// Handle ping
|
|
255
|
+
socket.on('ping', () => {
|
|
256
|
+
socket.emit('pong', { timestamp: new Date().toISOString() })
|
|
257
|
+
})
|
|
258
|
+
|
|
259
|
+
// Handle client disconnect
|
|
260
|
+
socket.on('disconnect', () => {
|
|
261
|
+
console.log(`Client disconnected: ${clientId}`)
|
|
262
|
+
wsHandler.handleDisconnect(clientId)
|
|
263
|
+
})
|
|
264
|
+
|
|
265
|
+
// Handle errors
|
|
266
|
+
socket.on('error', (error) => {
|
|
267
|
+
console.error(`WebSocket error for client ${clientId}:`, error)
|
|
268
|
+
wsHandler.handleDisconnect(clientId)
|
|
269
|
+
})
|
|
270
|
+
|
|
271
|
+
// Keep-alive ping
|
|
272
|
+
const pingInterval = setInterval(() => {
|
|
273
|
+
if (socket.connected) {
|
|
274
|
+
socket.emit('ping', { timestamp: new Date().toISOString() })
|
|
275
|
+
} else {
|
|
276
|
+
clearInterval(pingInterval)
|
|
277
|
+
}
|
|
278
|
+
}, 30000)
|
|
279
|
+
})
|
|
280
|
+
|
|
281
|
+
// Store io instance for broadcasting
|
|
282
|
+
wsHandler.io = io
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// Enhanced handler methods
|
|
286
|
+
WebSocketHandler.prototype.sendToClient = function(clientId, message) {
|
|
287
|
+
const client = this.clients.get(clientId)
|
|
288
|
+
|
|
289
|
+
if (client && client.socket.connected) {
|
|
290
|
+
client.socket.emit('message', message)
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
WebSocketHandler.prototype.broadcast = function(topic, message) {
|
|
295
|
+
const subscribers = this.subscriptions.get(topic)
|
|
296
|
+
|
|
297
|
+
if (!subscribers) {
|
|
298
|
+
// If no specific subscribers, broadcast to all connected clients
|
|
299
|
+
this.broadcastToAll({ topic, ...message })
|
|
300
|
+
return
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
const broadcastMessage = {
|
|
304
|
+
type: 'broadcast',
|
|
305
|
+
topic,
|
|
306
|
+
data: message,
|
|
307
|
+
timestamp: new Date().toISOString()
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
subscribers.forEach(clientId => {
|
|
311
|
+
this.sendToClient(clientId, broadcastMessage)
|
|
312
|
+
})
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
WebSocketHandler.prototype.broadcastToAll = function(message) {
|
|
316
|
+
if (this.io) {
|
|
317
|
+
this.io.emit('broadcast', {
|
|
318
|
+
data: message,
|
|
319
|
+
timestamp: new Date().toISOString()
|
|
320
|
+
})
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
// Export setup function and handler instance
|
|
325
|
+
export { setupWebSocket, wsHandler }
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
<<<<<<< HEAD
|
|
3
|
+
<<<<<<< HEAD
|
|
4
|
+
import { BrowserRouter as Router } from 'react-router-dom'
|
|
5
|
+
import AppRouter from './components/AppRouter'
|
|
6
|
+
=======
|
|
7
|
+
<<<<<<< HEAD
|
|
8
|
+
import { BrowserRouter as Router, Routes, Route, Navigate } from 'react-router-dom'
|
|
9
|
+
import Layout from './components/Layout'
|
|
10
|
+
import Dashboard from './pages/Dashboard'
|
|
11
|
+
import Integrations from './pages/Integrations'
|
|
12
|
+
import IntegrationDiscovery from './pages/IntegrationDiscovery'
|
|
13
|
+
import IntegrationConfigure from './pages/IntegrationConfigure'
|
|
14
|
+
import IntegrationTest from './pages/IntegrationTest'
|
|
15
|
+
import Environment from './pages/Environment'
|
|
16
|
+
import Users from './pages/Users'
|
|
17
|
+
import ConnectionsEnhanced from './pages/ConnectionsEnhanced'
|
|
18
|
+
import Simulation from './pages/Simulation'
|
|
19
|
+
<<<<<<< HEAD
|
|
20
|
+
<<<<<<< HEAD
|
|
21
|
+
=======
|
|
22
|
+
>>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
|
|
23
|
+
import Monitoring from './pages/Monitoring'
|
|
24
|
+
import CodeGeneration from './pages/CodeGeneration'
|
|
25
|
+
=======
|
|
26
|
+
import { BrowserRouter as Router } from 'react-router-dom'
|
|
27
|
+
import AppRouter from './components/AppRouter'
|
|
28
|
+
>>>>>>> d6114470 (feat: add comprehensive DDD/Hexagonal architecture RFC series)
|
|
29
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
30
|
+
=======
|
|
31
|
+
import { BrowserRouter as Router } from 'react-router-dom'
|
|
32
|
+
import AppRouter from './components/AppRouter'
|
|
33
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
34
|
+
import ErrorBoundary from './components/ErrorBoundary'
|
|
35
|
+
import { SocketProvider } from './hooks/useSocket'
|
|
36
|
+
import { FriggProvider } from './hooks/useFrigg'
|
|
37
|
+
import { ThemeProvider } from './components/theme-provider'
|
|
38
|
+
<<<<<<< HEAD
|
|
39
|
+
<<<<<<< HEAD
|
|
40
|
+
=======
|
|
41
|
+
<<<<<<< HEAD
|
|
42
|
+
=======
|
|
43
|
+
import ErrorBoundary from './components/ErrorBoundary'
|
|
44
|
+
import { SocketProvider } from './hooks/useSocket'
|
|
45
|
+
import { FriggProvider } from './hooks/useFrigg'
|
|
46
|
+
>>>>>>> 652520a5 (Claude Flow RFC related development)
|
|
47
|
+
=======
|
|
48
|
+
>>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
|
|
49
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
50
|
+
=======
|
|
51
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
52
|
+
|
|
53
|
+
function App() {
|
|
54
|
+
return (
|
|
55
|
+
<ErrorBoundary>
|
|
56
|
+
<<<<<<< HEAD
|
|
57
|
+
<<<<<<< HEAD
|
|
58
|
+
=======
|
|
59
|
+
<<<<<<< HEAD
|
|
60
|
+
<<<<<<< HEAD
|
|
61
|
+
=======
|
|
62
|
+
>>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
|
|
63
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
64
|
+
=======
|
|
65
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
66
|
+
<ThemeProvider defaultTheme="system">
|
|
67
|
+
<SocketProvider>
|
|
68
|
+
<FriggProvider>
|
|
69
|
+
<Router>
|
|
70
|
+
<AppRouter />
|
|
71
|
+
</Router>
|
|
72
|
+
</FriggProvider>
|
|
73
|
+
</SocketProvider>
|
|
74
|
+
</ThemeProvider>
|
|
75
|
+
<<<<<<< HEAD
|
|
76
|
+
<<<<<<< HEAD
|
|
77
|
+
=======
|
|
78
|
+
<<<<<<< HEAD
|
|
79
|
+
=======
|
|
80
|
+
<SocketProvider>
|
|
81
|
+
<FriggProvider>
|
|
82
|
+
<Router>
|
|
83
|
+
<Layout>
|
|
84
|
+
<Routes>
|
|
85
|
+
<Route path="/" element={<Navigate to="/dashboard" />} />
|
|
86
|
+
<Route path="/dashboard" element={<Dashboard />} />
|
|
87
|
+
<Route path="/integrations" element={<IntegrationDiscovery />} />
|
|
88
|
+
<Route path="/integrations/:integrationName/configure" element={<IntegrationConfigure />} />
|
|
89
|
+
<Route path="/integrations/:integrationName/test" element={<IntegrationTest />} />
|
|
90
|
+
<Route path="/environment" element={<Environment />} />
|
|
91
|
+
<Route path="/users" element={<Users />} />
|
|
92
|
+
<Route path="/connections" element={<ConnectionsEnhanced />} />
|
|
93
|
+
<Route path="/simulation" element={<Simulation />} />
|
|
94
|
+
</Routes>
|
|
95
|
+
</Layout>
|
|
96
|
+
</Router>
|
|
97
|
+
</FriggProvider>
|
|
98
|
+
</SocketProvider>
|
|
99
|
+
>>>>>>> 652520a5 (Claude Flow RFC related development)
|
|
100
|
+
=======
|
|
101
|
+
>>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
|
|
102
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
103
|
+
=======
|
|
104
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
105
|
+
</ErrorBoundary>
|
|
106
|
+
)
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
export default App
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?><svg id="Layer_2" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 400 201.65"><defs><style>.cls-1,.cls-2{fill:#71a087;}.cls-3{letter-spacing:.02em;}.cls-3,.cls-4,.cls-5{font-family:DINCondensed-Bold, 'DIN Condensed';}.cls-3,.cls-5{fill:#fff;font-size:56.17px;}.cls-4{font-size:114.37px;}.cls-4,.cls-6{stroke:#616061;stroke-miterlimit:10;}.cls-4,.cls-6,.cls-7{fill:#565859;}.cls-5{letter-spacing:.03em;}.cls-7,.cls-2{fill-rule:evenodd;}</style></defs><g id="BADGE"><rect class="cls-1" x="0" y="121.65" width="400" height="80" rx="13" ry="13"/><g><text class="cls-5" transform="translate(132.49 179.9)"><tspan x="0" y="0">LEFT</tspan></text><text class="cls-5" transform="translate(235.62 179.14)"><tspan x="0" y="0">HOOK</tspan></text><text class="cls-3" transform="translate(64.35 179.9)"><tspan x="0" y="0">BY</tspan></text></g></g><g id="FRIGG"><path class="cls-6" d="M147.74,16.97h35.79v11.06h-23.78v24.89h20.72v11.06h-20.72v35.04h-12.01V16.97Z"/><path class="cls-6" d="M193.68,16.97h19.31c14.13,0,21.19,8.03,21.19,24.09,0,4.76-.77,8.86-2.3,12.27-1.53,3.42-4.22,6.17-8.06,8.24l12.95,37.46h-12.71l-11.18-35.04h-7.18v35.04h-12.01V16.97Zm12.01,36.65h6.83c2.12,0,3.81-.29,5.06-.87,1.25-.58,2.22-1.4,2.88-2.48,.67-1.08,1.12-2.4,1.35-3.98,.23-1.57,.35-3.4,.35-5.47s-.12-3.9-.35-5.47c-.24-1.57-.73-2.92-1.47-4.03-.75-1.11-1.79-1.94-3.12-2.48-1.34-.54-3.1-.81-5.3-.81h-6.24v25.59Z"/><path class="cls-6" d="M278.29,36.69c0-3.25,.58-6.12,1.74-8.61,1.16-2.49,2.68-4.55,4.57-6.18,1.89-1.62,4.01-2.85,6.37-3.68,2.35-.83,4.73-1.25,7.12-1.25s4.76,.42,7.12,1.25c2.35,.83,4.48,2.06,6.37,3.68,1.89,1.63,3.41,3.68,4.57,6.18,1.16,2.49,1.74,5.37,1.74,8.61v4.08h-11.81v-4.08c0-2.79-.79-4.85-2.37-6.18-1.58-1.32-3.45-1.98-5.61-1.98s-4.03,.66-5.61,1.98c-1.58,1.32-2.37,3.38-2.37,6.18v42.61c0,2.8,.79,4.86,2.37,6.18,1.58,1.32,3.45,1.98,5.61,1.98s4.03-.66,5.61-1.98c1.58-1.32,2.37-3.38,2.37-6.18v-15.19h-9.38v-10.2h21.19v25.39c0,3.33-.58,6.22-1.74,8.67-1.16,2.46-2.68,4.5-4.57,6.12-1.89,1.63-4.01,2.85-6.37,3.68-2.35,.83-4.73,1.25-7.12,1.25s-4.77-.42-7.12-1.25c-2.35-.83-4.48-2.06-6.37-3.68-1.89-1.62-3.41-3.66-4.57-6.12-1.16-2.45-1.74-5.34-1.74-8.67V36.69Z"/><path class="cls-6" d="M329.06,36.69c0-3.25,.58-6.12,1.74-8.61s2.68-4.55,4.57-6.18c1.89-1.62,4.01-2.85,6.37-3.68,2.35-.83,4.73-1.25,7.12-1.25s4.76,.42,7.12,1.25c2.35,.83,4.48,2.06,6.37,3.68,1.89,1.63,3.41,3.68,4.57,6.18,1.16,2.49,1.74,5.37,1.74,8.61v4.08h-11.81v-4.08c0-2.79-.79-4.85-2.37-6.18-1.58-1.32-3.45-1.98-5.61-1.98s-4.03,.66-5.61,1.98c-1.58,1.32-2.37,3.38-2.37,6.18v42.61c0,2.8,.79,4.86,2.37,6.18,1.58,1.32,3.45,1.98,5.61,1.98s4.03-.66,5.61-1.98c1.58-1.32,2.37-3.38,2.37-6.18v-15.19h-9.38v-10.2h21.19v25.39c0,3.33-.58,6.22-1.74,8.67-1.16,2.46-2.68,4.5-4.57,6.12-1.89,1.63-4.01,2.85-6.37,3.68-2.35,.83-4.73,1.25-7.12,1.25s-4.77-.42-7.12-1.25c-2.35-.83-4.48-2.06-6.37-3.68-1.89-1.62-3.41-3.66-4.57-6.12-1.16-2.45-1.74-5.34-1.74-8.67V36.69Z"/><text class="cls-4" transform="translate(243.51 98.4) scale(1.02 1)"><tspan x="0" y="0">I</tspan></text></g><g id="ICON"><path class="cls-2" d="M93.72,73.79c7.86-7.18,14-7.02,20.8,.72,2.94,4.35,.48,8.46-1.78,10.48-.02,.02-.04,.03-.05,.05l-2.28,1.92c2.32-4.48-1.91-5.1-3.52-4.05-.12,.08-.23,.16-.34,.26l-.03,.03-34.94,30.92c-.18,.15-.45,.13-.6-.04l-10.23-11.58c-.16-.18-.14-.45,.04-.61l32.94-28.1Z"/><path class="cls-7" d="M125.17,11.41l.32-8.7c.04-1.23-.41-1.26-1.85-.05l-42.08,35.62,7.98,7.85,33.42-29.03c1.42-1.25,2.16-4.16,2.21-5.69h0Z"/><path class="cls-2" d="M124.79,32.92l.32-8.7c.04-1.23-.41-1.26-1.85-.05l-30.28,25.64,8.05,7.51,21.54-18.71c1.42-1.25,2.16-4.16,2.21-5.69h0Z"/><path class="cls-7" d="M124.96,54.26l.32-8.7c.04-1.23-.41-1.26-1.85-.05l-18.01,15.24,7.88,7.37,9.43-8.17c1.42-1.25,2.16-4.16,2.23-5.69h0Z"/><path class="cls-2" d="M88.65,69.04L35.29,21.17c-3.14-2.81-3.26-5.55-3.12-8.58l.38-9.17L97.11,61.67l-8.46,7.37Z"/><path class="cls-7" d="M76.09,79.78L34.75,42.73c-1.65-1.49-2.15-6.15-2.08-7.85l.65-8.58,51.14,46.26-8.37,7.23Z"/><path class="cls-2" d="M62.39,91.85l-27.96-26.7c-1.93-1.84-3.17-4.71-3.07-6.67l.56-9.77,39.27,35.47-8.79,7.66Z"/></g></svg>
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import React from 'react'
|
|
2
|
+
import { Routes, Route, Navigate, useLocation } from 'react-router-dom'
|
|
3
|
+
import { useFrigg } from '../hooks/useFrigg'
|
|
4
|
+
import Layout from './Layout'
|
|
5
|
+
import Welcome from './Welcome'
|
|
6
|
+
import Dashboard from '../pages/Dashboard'
|
|
7
|
+
import Integrations from '../pages/Integrations'
|
|
8
|
+
import IntegrationDiscovery from '../pages/IntegrationDiscovery'
|
|
9
|
+
import IntegrationConfigure from '../pages/IntegrationConfigure'
|
|
10
|
+
import IntegrationTest from '../pages/IntegrationTest'
|
|
11
|
+
import Environment from '../pages/Environment'
|
|
12
|
+
import Users from '../pages/Users'
|
|
13
|
+
import ConnectionsEnhanced from '../pages/ConnectionsEnhanced'
|
|
14
|
+
import Simulation from '../pages/Simulation'
|
|
15
|
+
import Monitoring from '../pages/Monitoring'
|
|
16
|
+
import CodeGeneration from '../pages/CodeGeneration'
|
|
17
|
+
|
|
18
|
+
export default function AppRouter() {
|
|
19
|
+
const { currentRepository, isLoading } = useFrigg()
|
|
20
|
+
const location = useLocation()
|
|
21
|
+
|
|
22
|
+
// Show loading screen while initializing
|
|
23
|
+
if (isLoading) {
|
|
24
|
+
return (
|
|
25
|
+
<div className="min-h-screen bg-background flex items-center justify-center">
|
|
26
|
+
<div className="text-center">
|
|
27
|
+
<div className="animate-spin rounded-full h-12 w-12 border-b-2 border-primary mx-auto mb-4"></div>
|
|
28
|
+
<p className="text-muted-foreground">Initializing Frigg Management UI...</p>
|
|
29
|
+
</div>
|
|
30
|
+
</div>
|
|
31
|
+
)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Always show welcome screen if no repository is selected
|
|
35
|
+
if (!currentRepository) {
|
|
36
|
+
return <Welcome />
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// If we have a repository and we're still on welcome (shouldn't happen with new flow)
|
|
40
|
+
// or we're on root, redirect to dashboard
|
|
41
|
+
if (currentRepository && (location.pathname === '/welcome' || location.pathname === '/')) {
|
|
42
|
+
return <Navigate to="/dashboard" replace />
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Normal routing with Layout for all other cases
|
|
46
|
+
return (
|
|
47
|
+
<Layout>
|
|
48
|
+
<Routes>
|
|
49
|
+
<Route path="/welcome" element={<Welcome />} />
|
|
50
|
+
<Route path="/" element={<Navigate to="/dashboard" />} />
|
|
51
|
+
<Route path="/dashboard" element={<Dashboard />} />
|
|
52
|
+
<Route path="/integrations" element={<Integrations />} />
|
|
53
|
+
<Route path="/integrations/discover" element={<IntegrationDiscovery />} />
|
|
54
|
+
<Route path="/integrations/:integrationName/configure" element={<IntegrationConfigure />} />
|
|
55
|
+
<Route path="/integrations/:integrationName/test" element={<IntegrationTest />} />
|
|
56
|
+
<Route path="/environment" element={<Environment />} />
|
|
57
|
+
<Route path="/users" element={<Users />} />
|
|
58
|
+
<Route path="/connections" element={<ConnectionsEnhanced />} />
|
|
59
|
+
<Route path="/simulation" element={<Simulation />} />
|
|
60
|
+
<Route path="/monitoring" element={<Monitoring />} />
|
|
61
|
+
<Route path="/code-generation" element={<CodeGeneration />} />
|
|
62
|
+
</Routes>
|
|
63
|
+
</Layout>
|
|
64
|
+
)
|
|
65
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
<<<<<<< HEAD
|
|
2
|
+
<<<<<<< HEAD
|
|
3
|
+
// Re-export shadcn Button component
|
|
4
|
+
export { Button } from './ui/button'
|
|
5
|
+
=======
|
|
6
|
+
<<<<<<< HEAD
|
|
7
|
+
<<<<<<< HEAD
|
|
8
|
+
// Re-export shadcn Button component
|
|
9
|
+
export { Button } from './ui/button'
|
|
10
|
+
=======
|
|
11
|
+
import React from 'react';
|
|
12
|
+
import { cn } from '../utils/cn';
|
|
13
|
+
|
|
14
|
+
const Button = React.forwardRef(({
|
|
15
|
+
className,
|
|
16
|
+
variant = 'default',
|
|
17
|
+
size = 'default',
|
|
18
|
+
children,
|
|
19
|
+
disabled,
|
|
20
|
+
...props
|
|
21
|
+
}, ref) => {
|
|
22
|
+
const variants = {
|
|
23
|
+
default: 'bg-blue-600 text-white hover:bg-blue-700 border-transparent',
|
|
24
|
+
destructive: 'bg-red-600 text-white hover:bg-red-700 border-transparent',
|
|
25
|
+
outline: 'border-gray-300 bg-white text-gray-700 hover:bg-gray-50',
|
|
26
|
+
secondary: 'bg-gray-100 text-gray-900 hover:bg-gray-200 border-transparent',
|
|
27
|
+
ghost: 'hover:bg-gray-100 text-gray-700 border-transparent',
|
|
28
|
+
link: 'underline-offset-4 hover:underline text-blue-600 border-transparent bg-transparent p-0 h-auto',
|
|
29
|
+
success: 'bg-green-600 text-white hover:bg-green-700 border-transparent',
|
|
30
|
+
warning: 'bg-orange-600 text-white hover:bg-orange-700 border-transparent',
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const sizes = {
|
|
34
|
+
default: 'h-10 px-4 py-2',
|
|
35
|
+
sm: 'h-9 px-3 text-sm',
|
|
36
|
+
lg: 'h-11 px-8',
|
|
37
|
+
icon: 'h-10 w-10',
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
return (
|
|
41
|
+
<button
|
|
42
|
+
className={cn(
|
|
43
|
+
'inline-flex items-center justify-center rounded-md text-sm font-medium transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-blue-500 focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50 border',
|
|
44
|
+
variants[variant],
|
|
45
|
+
sizes[size],
|
|
46
|
+
disabled && 'opacity-50 cursor-not-allowed',
|
|
47
|
+
className
|
|
48
|
+
)}
|
|
49
|
+
ref={ref}
|
|
50
|
+
disabled={disabled}
|
|
51
|
+
{...props}
|
|
52
|
+
>
|
|
53
|
+
{children}
|
|
54
|
+
</button>
|
|
55
|
+
);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
Button.displayName = 'Button';
|
|
59
|
+
|
|
60
|
+
export { Button };
|
|
61
|
+
>>>>>>> 652520a5 (Claude Flow RFC related development)
|
|
62
|
+
=======
|
|
63
|
+
// Re-export shadcn Button component
|
|
64
|
+
export { Button } from './ui/button'
|
|
65
|
+
>>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
|
|
66
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
67
|
+
=======
|
|
68
|
+
// Re-export shadcn Button component
|
|
69
|
+
export { Button } from './ui/button'
|
|
70
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
<<<<<<< HEAD
|
|
2
|
+
<<<<<<< HEAD
|
|
3
|
+
=======
|
|
4
|
+
<<<<<<< HEAD
|
|
5
|
+
<<<<<<< HEAD
|
|
6
|
+
// Re-export shadcn Card components with filtered props
|
|
7
|
+
export {
|
|
8
|
+
Card,
|
|
9
|
+
CardHeader,
|
|
10
|
+
CardContent,
|
|
11
|
+
CardTitle,
|
|
12
|
+
CardDescription,
|
|
13
|
+
CardFooter
|
|
14
|
+
} from './ui/card'
|
|
15
|
+
=======
|
|
16
|
+
import React from 'react'
|
|
17
|
+
import { cn } from '../utils/cn'
|
|
18
|
+
|
|
19
|
+
const Card = ({ children, className, ...props }) => {
|
|
20
|
+
return (
|
|
21
|
+
<div
|
|
22
|
+
className={cn(
|
|
23
|
+
'bg-white shadow-sm rounded-lg border border-gray-200',
|
|
24
|
+
className
|
|
25
|
+
)}
|
|
26
|
+
{...props}
|
|
27
|
+
>
|
|
28
|
+
{children}
|
|
29
|
+
</div>
|
|
30
|
+
)
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const CardHeader = ({ children, className, ...props }) => {
|
|
34
|
+
return (
|
|
35
|
+
<div
|
|
36
|
+
className={cn('px-6 py-4 border-b border-gray-200', className)}
|
|
37
|
+
{...props}
|
|
38
|
+
>
|
|
39
|
+
{children}
|
|
40
|
+
</div>
|
|
41
|
+
)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
const CardContent = ({ children, className, ...props }) => {
|
|
45
|
+
return (
|
|
46
|
+
<div className={cn('px-6 py-4', className)} {...props}>
|
|
47
|
+
{children}
|
|
48
|
+
</div>
|
|
49
|
+
)
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
const CardTitle = ({ children, className, ...props }) => {
|
|
53
|
+
return (
|
|
54
|
+
<h3
|
|
55
|
+
className={cn('text-lg font-medium text-gray-900', className)}
|
|
56
|
+
{...props}
|
|
57
|
+
>
|
|
58
|
+
{children}
|
|
59
|
+
</h3>
|
|
60
|
+
)
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
const CardDescription = ({ children, className, ...props }) => {
|
|
64
|
+
return (
|
|
65
|
+
<p
|
|
66
|
+
className={cn('text-sm text-gray-600 mt-1', className)}
|
|
67
|
+
{...props}
|
|
68
|
+
>
|
|
69
|
+
{children}
|
|
70
|
+
</p>
|
|
71
|
+
)
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export { Card, CardHeader, CardContent, CardTitle, CardDescription }
|
|
75
|
+
>>>>>>> 652520a5 (Claude Flow RFC related development)
|
|
76
|
+
=======
|
|
77
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
78
|
+
=======
|
|
79
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
80
|
+
// Re-export shadcn Card components with filtered props
|
|
81
|
+
export {
|
|
82
|
+
Card,
|
|
83
|
+
CardHeader,
|
|
84
|
+
CardContent,
|
|
85
|
+
CardTitle,
|
|
86
|
+
CardDescription,
|
|
87
|
+
CardFooter
|
|
88
|
+
<<<<<<< HEAD
|
|
89
|
+
<<<<<<< HEAD
|
|
90
|
+
} from './ui/card'
|
|
91
|
+
=======
|
|
92
|
+
} from './ui/card'
|
|
93
|
+
>>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
|
|
94
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
95
|
+
=======
|
|
96
|
+
} from './ui/card'
|
|
97
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|