@friggframework/devtools 2.0.0-next.3 → 2.0.0-next.31
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 +36 -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/AWS-DISCOVERY-TROUBLESHOOTING.md +245 -0
- package/infrastructure/AWS-IAM-CREDENTIAL-NEEDS.md +596 -0
- package/infrastructure/DEPLOYMENT-INSTRUCTIONS.md +268 -0
- package/infrastructure/GENERATE-IAM-DOCS.md +253 -0
- package/infrastructure/IAM-POLICY-TEMPLATES.md +176 -0
- package/infrastructure/README-TESTING.md +332 -0
- package/infrastructure/README.md +421 -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 +568 -0
- package/infrastructure/aws-discovery.test.js +373 -0
- package/infrastructure/build-time-discovery.js +206 -0
- package/infrastructure/build-time-discovery.test.js +375 -0
- package/infrastructure/create-frigg-infrastructure.js +3 -5
- package/infrastructure/frigg-deployment-iam-stack.yaml +379 -0
- package/infrastructure/iam-generator.js +687 -0
- package/infrastructure/iam-generator.test.js +169 -0
- package/infrastructure/iam-policy-basic.json +212 -0
- package/infrastructure/iam-policy-full.json +282 -0
- package/infrastructure/integration.test.js +383 -0
- package/infrastructure/run-discovery.js +110 -0
- package/infrastructure/serverless-template.js +923 -113
- package/infrastructure/serverless-template.test.js +541 -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 +17 -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,1029 @@
|
|
|
1
|
+
import express from 'express'
|
|
2
|
+
<<<<<<< HEAD
|
|
3
|
+
<<<<<<< HEAD
|
|
4
|
+
=======
|
|
5
|
+
<<<<<<< HEAD
|
|
6
|
+
<<<<<<< HEAD
|
|
7
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
8
|
+
=======
|
|
9
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
10
|
+
import { spawn, exec } from 'child_process'
|
|
11
|
+
import { promisify } from 'util'
|
|
12
|
+
import path from 'path'
|
|
13
|
+
import fs from 'fs/promises'
|
|
14
|
+
import { fileURLToPath } from 'url'
|
|
15
|
+
import { createStandardResponse, createErrorResponse, ERROR_CODES, asyncHandler } from '../utils/response.js'
|
|
16
|
+
import { analyzeIntegrations } from '../../../frigg-cli/utils/integration-analyzer.js'
|
|
17
|
+
|
|
18
|
+
const __filename = fileURLToPath(import.meta.url)
|
|
19
|
+
const __dirname = path.dirname(__filename)
|
|
20
|
+
const execAsync = promisify(exec)
|
|
21
|
+
<<<<<<< HEAD
|
|
22
|
+
<<<<<<< HEAD
|
|
23
|
+
=======
|
|
24
|
+
=======
|
|
25
|
+
import { spawn } from 'child_process'
|
|
26
|
+
=======
|
|
27
|
+
import { spawn, exec } from 'child_process'
|
|
28
|
+
import { promisify } from 'util'
|
|
29
|
+
>>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
|
|
30
|
+
import path from 'path'
|
|
31
|
+
import fs from 'fs/promises'
|
|
32
|
+
import { fileURLToPath } from 'url'
|
|
33
|
+
import { createStandardResponse, createErrorResponse, ERROR_CODES, asyncHandler } from '../utils/response.js'
|
|
34
|
+
|
|
35
|
+
<<<<<<< HEAD
|
|
36
|
+
>>>>>>> 652520a5 (Claude Flow RFC related development)
|
|
37
|
+
=======
|
|
38
|
+
const __filename = fileURLToPath(import.meta.url)
|
|
39
|
+
const __dirname = path.dirname(__filename)
|
|
40
|
+
const execAsync = promisify(exec)
|
|
41
|
+
>>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
|
|
42
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
43
|
+
=======
|
|
44
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
45
|
+
const router = express.Router()
|
|
46
|
+
|
|
47
|
+
// Track project process state
|
|
48
|
+
let projectProcess = null
|
|
49
|
+
let projectStatus = 'stopped'
|
|
50
|
+
let projectLogs = []
|
|
51
|
+
let projectStartTime = null
|
|
52
|
+
const MAX_LOGS = 1000
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Get current project status and configuration
|
|
56
|
+
*/
|
|
57
|
+
router.get('/status', asyncHandler(async (req, res) => {
|
|
58
|
+
const cwd = process.cwd()
|
|
59
|
+
let projectInfo = {
|
|
60
|
+
name: 'unknown',
|
|
61
|
+
version: '0.0.0',
|
|
62
|
+
friggVersion: 'unknown'
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
try {
|
|
66
|
+
// Try to read package.json for project info
|
|
67
|
+
const packageJsonPath = path.join(cwd, 'package.json')
|
|
68
|
+
const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf8'))
|
|
69
|
+
<<<<<<< HEAD
|
|
70
|
+
<<<<<<< HEAD
|
|
71
|
+
|
|
72
|
+
=======
|
|
73
|
+
<<<<<<< HEAD
|
|
74
|
+
|
|
75
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
76
|
+
=======
|
|
77
|
+
|
|
78
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
79
|
+
projectInfo = {
|
|
80
|
+
name: packageJson.name || 'frigg-project',
|
|
81
|
+
version: packageJson.version || '0.0.0',
|
|
82
|
+
friggVersion: packageJson.dependencies?.['@friggframework/core'] ||
|
|
83
|
+
packageJson.devDependencies?.['@friggframework/core'] || 'unknown'
|
|
84
|
+
<<<<<<< HEAD
|
|
85
|
+
<<<<<<< HEAD
|
|
86
|
+
=======
|
|
87
|
+
=======
|
|
88
|
+
|
|
89
|
+
projectInfo = {
|
|
90
|
+
name: packageJson.name || 'frigg-project',
|
|
91
|
+
version: packageJson.version || '0.0.0',
|
|
92
|
+
friggVersion: packageJson.dependencies?.['@friggframework/core'] ||
|
|
93
|
+
packageJson.devDependencies?.['@friggframework/core'] || 'unknown'
|
|
94
|
+
>>>>>>> 652520a5 (Claude Flow RFC related development)
|
|
95
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
96
|
+
=======
|
|
97
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
98
|
+
}
|
|
99
|
+
} catch (error) {
|
|
100
|
+
console.warn('Could not read package.json:', error.message)
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const statusData = {
|
|
104
|
+
...projectInfo,
|
|
105
|
+
status: projectStatus,
|
|
106
|
+
pid: projectProcess?.pid || null,
|
|
107
|
+
uptime: projectStartTime ? Math.floor((Date.now() - projectStartTime) / 1000) : 0,
|
|
108
|
+
port: process.env.PORT || 3000,
|
|
109
|
+
environment: process.env.NODE_ENV || 'development',
|
|
110
|
+
lastStarted: projectStartTime ? new Date(projectStartTime).toISOString() : null
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
res.json(createStandardResponse(statusData))
|
|
114
|
+
}))
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Start the Frigg project
|
|
118
|
+
*/
|
|
119
|
+
router.post('/start', asyncHandler(async (req, res) => {
|
|
120
|
+
if (projectProcess && projectStatus === 'running') {
|
|
121
|
+
return res.status(400).json(
|
|
122
|
+
createErrorResponse(ERROR_CODES.PROJECT_ALREADY_RUNNING, 'Project is already running')
|
|
123
|
+
)
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
const { stage = 'dev', verbose = false, port = 3000 } = req.body
|
|
127
|
+
|
|
128
|
+
try {
|
|
129
|
+
projectStatus = 'starting'
|
|
130
|
+
projectLogs = []
|
|
131
|
+
<<<<<<< HEAD
|
|
132
|
+
<<<<<<< HEAD
|
|
133
|
+
|
|
134
|
+
=======
|
|
135
|
+
<<<<<<< HEAD
|
|
136
|
+
|
|
137
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
138
|
+
// Broadcast status update via WebSocket
|
|
139
|
+
const io = req.app.get('io')
|
|
140
|
+
if (io) {
|
|
141
|
+
io.emit('project:status', {
|
|
142
|
+
<<<<<<< HEAD
|
|
143
|
+
=======
|
|
144
|
+
=======
|
|
145
|
+
=======
|
|
146
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
147
|
+
|
|
148
|
+
// Broadcast status update via WebSocket
|
|
149
|
+
const io = req.app.get('io')
|
|
150
|
+
if (io) {
|
|
151
|
+
<<<<<<< HEAD
|
|
152
|
+
io.emit('project:status', {
|
|
153
|
+
>>>>>>> 652520a5 (Claude Flow RFC related development)
|
|
154
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
155
|
+
=======
|
|
156
|
+
io.emit('project:status', {
|
|
157
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
158
|
+
status: 'starting',
|
|
159
|
+
message: 'Starting Frigg project...'
|
|
160
|
+
})
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Find the project directory (current working directory)
|
|
164
|
+
const projectPath = process.cwd()
|
|
165
|
+
<<<<<<< HEAD
|
|
166
|
+
<<<<<<< HEAD
|
|
167
|
+
|
|
168
|
+
=======
|
|
169
|
+
<<<<<<< HEAD
|
|
170
|
+
|
|
171
|
+
=======
|
|
172
|
+
|
|
173
|
+
>>>>>>> 652520a5 (Claude Flow RFC related development)
|
|
174
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
175
|
+
=======
|
|
176
|
+
|
|
177
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
178
|
+
// Build command arguments
|
|
179
|
+
const args = ['run', 'start']
|
|
180
|
+
if (stage !== 'dev') {
|
|
181
|
+
args.push('--', '--stage', stage)
|
|
182
|
+
}
|
|
183
|
+
if (verbose) {
|
|
184
|
+
args.push('--', '--verbose')
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Set environment variables
|
|
188
|
+
const env = {
|
|
189
|
+
...process.env,
|
|
190
|
+
NODE_ENV: stage === 'production' ? 'production' : 'development',
|
|
191
|
+
PORT: port.toString()
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Start the project process
|
|
195
|
+
projectProcess = spawn('npm', args, {
|
|
196
|
+
cwd: projectPath,
|
|
197
|
+
env,
|
|
198
|
+
shell: true,
|
|
199
|
+
detached: false
|
|
200
|
+
})
|
|
201
|
+
|
|
202
|
+
projectStartTime = Date.now()
|
|
203
|
+
|
|
204
|
+
// Handle stdout
|
|
205
|
+
projectProcess.stdout?.on('data', (data) => {
|
|
206
|
+
const log = {
|
|
207
|
+
type: 'stdout',
|
|
208
|
+
message: data.toString(),
|
|
209
|
+
timestamp: new Date().toISOString()
|
|
210
|
+
}
|
|
211
|
+
projectLogs.push(log)
|
|
212
|
+
if (projectLogs.length > MAX_LOGS) {
|
|
213
|
+
projectLogs.shift()
|
|
214
|
+
}
|
|
215
|
+
<<<<<<< HEAD
|
|
216
|
+
<<<<<<< HEAD
|
|
217
|
+
|
|
218
|
+
=======
|
|
219
|
+
<<<<<<< HEAD
|
|
220
|
+
|
|
221
|
+
=======
|
|
222
|
+
|
|
223
|
+
>>>>>>> 652520a5 (Claude Flow RFC related development)
|
|
224
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
225
|
+
=======
|
|
226
|
+
|
|
227
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
228
|
+
// Broadcast log via WebSocket
|
|
229
|
+
if (io) {
|
|
230
|
+
io.emit('project:logs', log)
|
|
231
|
+
}
|
|
232
|
+
})
|
|
233
|
+
|
|
234
|
+
// Handle stderr
|
|
235
|
+
projectProcess.stderr?.on('data', (data) => {
|
|
236
|
+
const log = {
|
|
237
|
+
type: 'stderr',
|
|
238
|
+
message: data.toString(),
|
|
239
|
+
timestamp: new Date().toISOString()
|
|
240
|
+
}
|
|
241
|
+
projectLogs.push(log)
|
|
242
|
+
if (projectLogs.length > MAX_LOGS) {
|
|
243
|
+
projectLogs.shift()
|
|
244
|
+
}
|
|
245
|
+
<<<<<<< HEAD
|
|
246
|
+
<<<<<<< HEAD
|
|
247
|
+
|
|
248
|
+
=======
|
|
249
|
+
<<<<<<< HEAD
|
|
250
|
+
|
|
251
|
+
=======
|
|
252
|
+
|
|
253
|
+
>>>>>>> 652520a5 (Claude Flow RFC related development)
|
|
254
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
255
|
+
=======
|
|
256
|
+
|
|
257
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
258
|
+
// Broadcast log via WebSocket
|
|
259
|
+
if (io) {
|
|
260
|
+
io.emit('project:logs', log)
|
|
261
|
+
}
|
|
262
|
+
})
|
|
263
|
+
|
|
264
|
+
// Handle process exit
|
|
265
|
+
projectProcess.on('exit', (code, signal) => {
|
|
266
|
+
const wasRunning = projectStatus === 'running'
|
|
267
|
+
projectStatus = 'stopped'
|
|
268
|
+
projectProcess = null
|
|
269
|
+
projectStartTime = null
|
|
270
|
+
<<<<<<< HEAD
|
|
271
|
+
<<<<<<< HEAD
|
|
272
|
+
|
|
273
|
+
=======
|
|
274
|
+
<<<<<<< HEAD
|
|
275
|
+
|
|
276
|
+
=======
|
|
277
|
+
|
|
278
|
+
>>>>>>> 652520a5 (Claude Flow RFC related development)
|
|
279
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
280
|
+
=======
|
|
281
|
+
|
|
282
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
283
|
+
const statusUpdate = {
|
|
284
|
+
status: 'stopped',
|
|
285
|
+
code,
|
|
286
|
+
signal,
|
|
287
|
+
message: `Project process exited with code ${code}`
|
|
288
|
+
}
|
|
289
|
+
<<<<<<< HEAD
|
|
290
|
+
<<<<<<< HEAD
|
|
291
|
+
|
|
292
|
+
=======
|
|
293
|
+
<<<<<<< HEAD
|
|
294
|
+
|
|
295
|
+
=======
|
|
296
|
+
|
|
297
|
+
>>>>>>> 652520a5 (Claude Flow RFC related development)
|
|
298
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
299
|
+
=======
|
|
300
|
+
|
|
301
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
302
|
+
if (io) {
|
|
303
|
+
io.emit('project:status', statusUpdate)
|
|
304
|
+
if (wasRunning) {
|
|
305
|
+
io.emit('project:error', {
|
|
306
|
+
message: 'Project stopped unexpectedly',
|
|
307
|
+
code,
|
|
308
|
+
signal
|
|
309
|
+
})
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
})
|
|
313
|
+
|
|
314
|
+
// Handle process errors
|
|
315
|
+
projectProcess.on('error', (error) => {
|
|
316
|
+
projectStatus = 'stopped'
|
|
317
|
+
projectProcess = null
|
|
318
|
+
projectStartTime = null
|
|
319
|
+
<<<<<<< HEAD
|
|
320
|
+
<<<<<<< HEAD
|
|
321
|
+
|
|
322
|
+
=======
|
|
323
|
+
<<<<<<< HEAD
|
|
324
|
+
|
|
325
|
+
=======
|
|
326
|
+
|
|
327
|
+
>>>>>>> 652520a5 (Claude Flow RFC related development)
|
|
328
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
329
|
+
=======
|
|
330
|
+
|
|
331
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
332
|
+
if (io) {
|
|
333
|
+
io.emit('project:error', {
|
|
334
|
+
message: 'Failed to start project',
|
|
335
|
+
error: error.message
|
|
336
|
+
})
|
|
337
|
+
}
|
|
338
|
+
})
|
|
339
|
+
|
|
340
|
+
// Wait for process to stabilize
|
|
341
|
+
await new Promise(resolve => setTimeout(resolve, 2000))
|
|
342
|
+
|
|
343
|
+
if (projectProcess && !projectProcess.killed) {
|
|
344
|
+
projectStatus = 'running'
|
|
345
|
+
<<<<<<< HEAD
|
|
346
|
+
<<<<<<< HEAD
|
|
347
|
+
|
|
348
|
+
=======
|
|
349
|
+
<<<<<<< HEAD
|
|
350
|
+
|
|
351
|
+
=======
|
|
352
|
+
|
|
353
|
+
>>>>>>> 652520a5 (Claude Flow RFC related development)
|
|
354
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
355
|
+
=======
|
|
356
|
+
|
|
357
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
358
|
+
if (io) {
|
|
359
|
+
io.emit('project:status', {
|
|
360
|
+
status: 'running',
|
|
361
|
+
message: 'Project started successfully',
|
|
362
|
+
pid: projectProcess.pid
|
|
363
|
+
})
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
res.json(createStandardResponse({
|
|
367
|
+
message: 'Project started successfully',
|
|
368
|
+
pid: projectProcess.pid,
|
|
369
|
+
status: 'running'
|
|
370
|
+
}))
|
|
371
|
+
} else {
|
|
372
|
+
throw new Error('Failed to start project process')
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
} catch (error) {
|
|
376
|
+
projectStatus = 'stopped'
|
|
377
|
+
projectProcess = null
|
|
378
|
+
projectStartTime = null
|
|
379
|
+
<<<<<<< HEAD
|
|
380
|
+
<<<<<<< HEAD
|
|
381
|
+
|
|
382
|
+
=======
|
|
383
|
+
<<<<<<< HEAD
|
|
384
|
+
|
|
385
|
+
=======
|
|
386
|
+
|
|
387
|
+
>>>>>>> 652520a5 (Claude Flow RFC related development)
|
|
388
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
389
|
+
=======
|
|
390
|
+
|
|
391
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
392
|
+
const io = req.app.get('io')
|
|
393
|
+
if (io) {
|
|
394
|
+
io.emit('project:status', { status: 'stopped' })
|
|
395
|
+
io.emit('project:error', { message: error.message })
|
|
396
|
+
}
|
|
397
|
+
<<<<<<< HEAD
|
|
398
|
+
<<<<<<< HEAD
|
|
399
|
+
|
|
400
|
+
=======
|
|
401
|
+
<<<<<<< HEAD
|
|
402
|
+
|
|
403
|
+
=======
|
|
404
|
+
|
|
405
|
+
>>>>>>> 652520a5 (Claude Flow RFC related development)
|
|
406
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
407
|
+
=======
|
|
408
|
+
|
|
409
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
410
|
+
return res.status(500).json(
|
|
411
|
+
createErrorResponse(ERROR_CODES.PROJECT_START_FAILED, error.message)
|
|
412
|
+
)
|
|
413
|
+
}
|
|
414
|
+
}))
|
|
415
|
+
|
|
416
|
+
/**
|
|
417
|
+
* Stop the Frigg project
|
|
418
|
+
*/
|
|
419
|
+
router.post('/stop', asyncHandler(async (req, res) => {
|
|
420
|
+
if (!projectProcess || projectStatus !== 'running') {
|
|
421
|
+
return res.status(400).json(
|
|
422
|
+
createErrorResponse(ERROR_CODES.PROJECT_NOT_RUNNING, 'Project is not running')
|
|
423
|
+
)
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
try {
|
|
427
|
+
projectStatus = 'stopping'
|
|
428
|
+
<<<<<<< HEAD
|
|
429
|
+
<<<<<<< HEAD
|
|
430
|
+
|
|
431
|
+
=======
|
|
432
|
+
<<<<<<< HEAD
|
|
433
|
+
|
|
434
|
+
=======
|
|
435
|
+
|
|
436
|
+
>>>>>>> 652520a5 (Claude Flow RFC related development)
|
|
437
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
438
|
+
=======
|
|
439
|
+
|
|
440
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
441
|
+
const io = req.app.get('io')
|
|
442
|
+
if (io) {
|
|
443
|
+
io.emit('project:status', {
|
|
444
|
+
status: 'stopping',
|
|
445
|
+
message: 'Stopping project...'
|
|
446
|
+
})
|
|
447
|
+
}
|
|
448
|
+
|
|
449
|
+
// Gracefully terminate the process
|
|
450
|
+
projectProcess.kill('SIGTERM')
|
|
451
|
+
|
|
452
|
+
// Force kill after 5 seconds if still running
|
|
453
|
+
setTimeout(() => {
|
|
454
|
+
if (projectProcess && !projectProcess.killed) {
|
|
455
|
+
projectProcess.kill('SIGKILL')
|
|
456
|
+
}
|
|
457
|
+
}, 5000)
|
|
458
|
+
|
|
459
|
+
res.json(createStandardResponse({
|
|
460
|
+
message: 'Project is stopping',
|
|
461
|
+
status: 'stopping'
|
|
462
|
+
}))
|
|
463
|
+
|
|
464
|
+
} catch (error) {
|
|
465
|
+
return res.status(500).json(
|
|
466
|
+
createErrorResponse(ERROR_CODES.PROJECT_STOP_FAILED, error.message)
|
|
467
|
+
)
|
|
468
|
+
}
|
|
469
|
+
}))
|
|
470
|
+
|
|
471
|
+
/**
|
|
472
|
+
* Restart the Frigg project
|
|
473
|
+
*/
|
|
474
|
+
router.post('/restart', asyncHandler(async (req, res) => {
|
|
475
|
+
try {
|
|
476
|
+
// Stop if running
|
|
477
|
+
if (projectProcess && projectStatus === 'running') {
|
|
478
|
+
projectProcess.kill('SIGTERM')
|
|
479
|
+
<<<<<<< HEAD
|
|
480
|
+
<<<<<<< HEAD
|
|
481
|
+
|
|
482
|
+
=======
|
|
483
|
+
<<<<<<< HEAD
|
|
484
|
+
|
|
485
|
+
=======
|
|
486
|
+
|
|
487
|
+
>>>>>>> 652520a5 (Claude Flow RFC related development)
|
|
488
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
489
|
+
=======
|
|
490
|
+
|
|
491
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
492
|
+
// Wait for process to exit
|
|
493
|
+
await new Promise((resolve) => {
|
|
494
|
+
if (projectProcess) {
|
|
495
|
+
projectProcess.on('exit', resolve)
|
|
496
|
+
} else {
|
|
497
|
+
resolve()
|
|
498
|
+
}
|
|
499
|
+
})
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
// Wait a moment
|
|
503
|
+
await new Promise(resolve => setTimeout(resolve, 1000))
|
|
504
|
+
|
|
505
|
+
// Start again - we'll simulate calling the start endpoint
|
|
506
|
+
const startResponse = await fetch(`http://localhost:${process.env.PORT || 3001}/api/project/start`, {
|
|
507
|
+
method: 'POST',
|
|
508
|
+
headers: { 'Content-Type': 'application/json' },
|
|
509
|
+
body: JSON.stringify(req.body)
|
|
510
|
+
})
|
|
511
|
+
|
|
512
|
+
const result = await startResponse.json()
|
|
513
|
+
res.json(result)
|
|
514
|
+
|
|
515
|
+
} catch (error) {
|
|
516
|
+
return res.status(500).json(
|
|
517
|
+
createErrorResponse(ERROR_CODES.PROJECT_START_FAILED, error.message)
|
|
518
|
+
)
|
|
519
|
+
}
|
|
520
|
+
}))
|
|
521
|
+
|
|
522
|
+
/**
|
|
523
|
+
* Get project logs
|
|
524
|
+
*/
|
|
525
|
+
router.get('/logs', asyncHandler(async (req, res) => {
|
|
526
|
+
const { limit = 100, type } = req.query
|
|
527
|
+
<<<<<<< HEAD
|
|
528
|
+
<<<<<<< HEAD
|
|
529
|
+
=======
|
|
530
|
+
<<<<<<< HEAD
|
|
531
|
+
|
|
532
|
+
let logs = projectLogs
|
|
533
|
+
|
|
534
|
+
if (type && ['stdout', 'stderr'].includes(type)) {
|
|
535
|
+
logs = logs.filter(log => log.type === type)
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
=======
|
|
539
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
540
|
+
=======
|
|
541
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
542
|
+
|
|
543
|
+
let logs = projectLogs
|
|
544
|
+
|
|
545
|
+
if (type && ['stdout', 'stderr'].includes(type)) {
|
|
546
|
+
logs = logs.filter(log => log.type === type)
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
<<<<<<< HEAD
|
|
550
|
+
<<<<<<< HEAD
|
|
551
|
+
=======
|
|
552
|
+
>>>>>>> 652520a5 (Claude Flow RFC related development)
|
|
553
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
554
|
+
=======
|
|
555
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
556
|
+
res.json(createStandardResponse({
|
|
557
|
+
logs: logs.slice(-parseInt(limit)),
|
|
558
|
+
total: logs.length
|
|
559
|
+
}))
|
|
560
|
+
}))
|
|
561
|
+
|
|
562
|
+
/**
|
|
563
|
+
* Clear project logs
|
|
564
|
+
*/
|
|
565
|
+
router.delete('/logs', asyncHandler(async (req, res) => {
|
|
566
|
+
projectLogs = []
|
|
567
|
+
res.json(createStandardResponse({ message: 'Logs cleared' }))
|
|
568
|
+
}))
|
|
569
|
+
|
|
570
|
+
<<<<<<< HEAD
|
|
571
|
+
<<<<<<< HEAD
|
|
572
|
+
=======
|
|
573
|
+
<<<<<<< HEAD
|
|
574
|
+
<<<<<<< HEAD
|
|
575
|
+
=======
|
|
576
|
+
>>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
|
|
577
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
578
|
+
=======
|
|
579
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
580
|
+
/**
|
|
581
|
+
* Get project metrics
|
|
582
|
+
*/
|
|
583
|
+
router.get('/metrics', asyncHandler(async (req, res) => {
|
|
584
|
+
const metrics = {
|
|
585
|
+
status: projectStatus,
|
|
586
|
+
uptime: projectStartTime ? Math.floor((Date.now() - projectStartTime) / 1000) : 0,
|
|
587
|
+
memory: process.memoryUsage(),
|
|
588
|
+
cpu: process.cpuUsage(),
|
|
589
|
+
logs: {
|
|
590
|
+
total: projectLogs.length,
|
|
591
|
+
errors: projectLogs.filter(log => log.type === 'stderr').length,
|
|
592
|
+
warnings: projectLogs.filter(log => log.message.toLowerCase().includes('warning')).length
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
<<<<<<< HEAD
|
|
596
|
+
<<<<<<< HEAD
|
|
597
|
+
|
|
598
|
+
=======
|
|
599
|
+
<<<<<<< HEAD
|
|
600
|
+
|
|
601
|
+
=======
|
|
602
|
+
|
|
603
|
+
>>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
|
|
604
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
605
|
+
=======
|
|
606
|
+
|
|
607
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
608
|
+
res.json(createStandardResponse(metrics))
|
|
609
|
+
}))
|
|
610
|
+
|
|
611
|
+
/**
|
|
612
|
+
* Get available Frigg repositories
|
|
613
|
+
*/
|
|
614
|
+
router.get('/repositories', asyncHandler(async (req, res) => {
|
|
615
|
+
try {
|
|
616
|
+
<<<<<<< HEAD
|
|
617
|
+
<<<<<<< HEAD
|
|
618
|
+
=======
|
|
619
|
+
<<<<<<< HEAD
|
|
620
|
+
// Execute the frigg CLI command directly
|
|
621
|
+
const friggPath = path.join(__dirname, '../../../frigg-cli/index.js')
|
|
622
|
+
const command = `node "${friggPath}" repos list --json`
|
|
623
|
+
console.log('Executing command:', command)
|
|
624
|
+
console.log('From directory:', process.cwd())
|
|
625
|
+
<<<<<<< HEAD
|
|
626
|
+
|
|
627
|
+
=======
|
|
628
|
+
|
|
629
|
+
>>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
|
|
630
|
+
const { stdout, stderr } = await execAsync(command, {
|
|
631
|
+
cwd: process.cwd(),
|
|
632
|
+
env: process.env,
|
|
633
|
+
maxBuffer: 1024 * 1024 * 10 // 10MB buffer for large repo lists
|
|
634
|
+
})
|
|
635
|
+
<<<<<<< HEAD
|
|
636
|
+
|
|
637
|
+
console.log('Command stdout length:', stdout.length)
|
|
638
|
+
console.log('Command stderr:', stderr)
|
|
639
|
+
|
|
640
|
+
if (stderr && !stderr.includes('DeprecationWarning') && !stderr.includes('NOTE: The AWS SDK')) {
|
|
641
|
+
console.error('Repository discovery stderr:', stderr)
|
|
642
|
+
}
|
|
643
|
+
|
|
644
|
+
=======
|
|
645
|
+
|
|
646
|
+
console.log('Command stdout length:', stdout.length)
|
|
647
|
+
console.log('Command stderr:', stderr)
|
|
648
|
+
|
|
649
|
+
if (stderr && !stderr.includes('DeprecationWarning') && !stderr.includes('NOTE: The AWS SDK')) {
|
|
650
|
+
console.error('Repository discovery stderr:', stderr)
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
>>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
|
|
654
|
+
// Parse the JSON output
|
|
655
|
+
let repositories = []
|
|
656
|
+
try {
|
|
657
|
+
// With the --json flag, we should get clean JSON output
|
|
658
|
+
repositories = JSON.parse(stdout)
|
|
659
|
+
console.log(`Found ${repositories.length} repositories`)
|
|
660
|
+
} catch (parseError) {
|
|
661
|
+
console.error('Failed to parse repository JSON:', parseError)
|
|
662
|
+
console.log('Raw output (first 500 chars):', stdout.substring(0, 500))
|
|
663
|
+
=======
|
|
664
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
665
|
+
=======
|
|
666
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
667
|
+
let repositories = []
|
|
668
|
+
|
|
669
|
+
// First, check if we have available repositories from the CLI
|
|
670
|
+
if (process.env.AVAILABLE_REPOSITORIES) {
|
|
671
|
+
try {
|
|
672
|
+
repositories = JSON.parse(process.env.AVAILABLE_REPOSITORIES)
|
|
673
|
+
console.log(`Using ${repositories.length} repositories from CLI discovery`)
|
|
674
|
+
} catch (parseError) {
|
|
675
|
+
console.error('Failed to parse AVAILABLE_REPOSITORIES:', parseError)
|
|
676
|
+
}
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
// If no repositories from CLI, fall back to direct discovery
|
|
680
|
+
if (repositories.length === 0) {
|
|
681
|
+
console.log('No repositories from CLI, executing discovery command...')
|
|
682
|
+
// Execute the frigg CLI command directly
|
|
683
|
+
const friggPath = path.join(__dirname, '../../../frigg-cli/index.js')
|
|
684
|
+
const command = `node "${friggPath}" repos list --json`
|
|
685
|
+
console.log('Executing command:', command)
|
|
686
|
+
console.log('From directory:', process.cwd())
|
|
687
|
+
|
|
688
|
+
const { stdout, stderr } = await execAsync(command, {
|
|
689
|
+
cwd: process.cwd(),
|
|
690
|
+
env: process.env,
|
|
691
|
+
maxBuffer: 1024 * 1024 * 10 // 10MB buffer for large repo lists
|
|
692
|
+
})
|
|
693
|
+
|
|
694
|
+
console.log('Command stdout length:', stdout.length)
|
|
695
|
+
console.log('Command stderr:', stderr)
|
|
696
|
+
|
|
697
|
+
if (stderr && !stderr.includes('DeprecationWarning') && !stderr.includes('NOTE: The AWS SDK')) {
|
|
698
|
+
console.error('Repository discovery stderr:', stderr)
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
// Parse the JSON output
|
|
702
|
+
try {
|
|
703
|
+
// With the --json flag, we should get clean JSON output
|
|
704
|
+
repositories = JSON.parse(stdout)
|
|
705
|
+
console.log(`Found ${repositories.length} repositories via command`)
|
|
706
|
+
} catch (parseError) {
|
|
707
|
+
console.error('Failed to parse repository JSON:', parseError)
|
|
708
|
+
console.log('Raw output (first 500 chars):', stdout.substring(0, 500))
|
|
709
|
+
}
|
|
710
|
+
<<<<<<< HEAD
|
|
711
|
+
<<<<<<< HEAD
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
=======
|
|
715
|
+
>>>>>>> 82b75ea9 (feat: major UI package reorganization and cleanup)
|
|
716
|
+
}
|
|
717
|
+
<<<<<<< HEAD
|
|
718
|
+
|
|
719
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
720
|
+
=======
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
724
|
+
// Get current repository info
|
|
725
|
+
const currentRepo = process.env.REPOSITORY_INFO ?
|
|
726
|
+
JSON.parse(process.env.REPOSITORY_INFO) :
|
|
727
|
+
await getCurrentRepositoryInfo()
|
|
728
|
+
<<<<<<< HEAD
|
|
729
|
+
<<<<<<< HEAD
|
|
730
|
+
|
|
731
|
+
=======
|
|
732
|
+
|
|
733
|
+
=======
|
|
734
|
+
|
|
735
|
+
// Get current repository info
|
|
736
|
+
const currentRepo = process.env.REPOSITORY_INFO ?
|
|
737
|
+
JSON.parse(process.env.REPOSITORY_INFO) :
|
|
738
|
+
await getCurrentRepositoryInfo()
|
|
739
|
+
|
|
740
|
+
>>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
|
|
741
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
742
|
+
=======
|
|
743
|
+
|
|
744
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
745
|
+
res.json(createStandardResponse({
|
|
746
|
+
repositories,
|
|
747
|
+
currentRepository: currentRepo,
|
|
748
|
+
isMultiRepo: currentRepo?.isMultiRepo || false
|
|
749
|
+
}))
|
|
750
|
+
} catch (error) {
|
|
751
|
+
console.error('Failed to get repositories:', error)
|
|
752
|
+
res.json(createStandardResponse({
|
|
753
|
+
repositories: [],
|
|
754
|
+
currentRepository: null,
|
|
755
|
+
isMultiRepo: false,
|
|
756
|
+
error: 'Failed to discover repositories: ' + error.message
|
|
757
|
+
}))
|
|
758
|
+
}
|
|
759
|
+
}))
|
|
760
|
+
|
|
761
|
+
/**
|
|
762
|
+
* Switch to a different repository
|
|
763
|
+
*/
|
|
764
|
+
router.post('/switch-repository', asyncHandler(async (req, res) => {
|
|
765
|
+
const { repositoryPath } = req.body
|
|
766
|
+
<<<<<<< HEAD
|
|
767
|
+
<<<<<<< HEAD
|
|
768
|
+
|
|
769
|
+
=======
|
|
770
|
+
<<<<<<< HEAD
|
|
771
|
+
|
|
772
|
+
=======
|
|
773
|
+
|
|
774
|
+
>>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
|
|
775
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
776
|
+
=======
|
|
777
|
+
|
|
778
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
779
|
+
if (!repositoryPath) {
|
|
780
|
+
return res.status(400).json(
|
|
781
|
+
createErrorResponse(ERROR_CODES.VALIDATION_ERROR, 'Repository path is required')
|
|
782
|
+
)
|
|
783
|
+
}
|
|
784
|
+
<<<<<<< HEAD
|
|
785
|
+
<<<<<<< HEAD
|
|
786
|
+
|
|
787
|
+
=======
|
|
788
|
+
<<<<<<< HEAD
|
|
789
|
+
|
|
790
|
+
=======
|
|
791
|
+
|
|
792
|
+
>>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
|
|
793
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
794
|
+
=======
|
|
795
|
+
|
|
796
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
797
|
+
try {
|
|
798
|
+
// Verify the repository exists and is valid
|
|
799
|
+
const stats = await fs.stat(repositoryPath)
|
|
800
|
+
if (!stats.isDirectory()) {
|
|
801
|
+
throw new Error('Invalid repository path')
|
|
802
|
+
}
|
|
803
|
+
<<<<<<< HEAD
|
|
804
|
+
<<<<<<< HEAD
|
|
805
|
+
=======
|
|
806
|
+
<<<<<<< HEAD
|
|
807
|
+
|
|
808
|
+
// Check if it's a valid Frigg repository
|
|
809
|
+
const packageJsonPath = path.join(repositoryPath, 'package.json')
|
|
810
|
+
const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf8'))
|
|
811
|
+
|
|
812
|
+
=======
|
|
813
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
814
|
+
=======
|
|
815
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
816
|
+
|
|
817
|
+
// Check if it's a valid Frigg repository
|
|
818
|
+
const packageJsonPath = path.join(repositoryPath, 'package.json')
|
|
819
|
+
const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf8'))
|
|
820
|
+
|
|
821
|
+
<<<<<<< HEAD
|
|
822
|
+
<<<<<<< HEAD
|
|
823
|
+
=======
|
|
824
|
+
>>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
|
|
825
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
826
|
+
=======
|
|
827
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
828
|
+
// Update environment variable
|
|
829
|
+
process.env.PROJECT_ROOT = repositoryPath
|
|
830
|
+
process.env.REPOSITORY_INFO = JSON.stringify({
|
|
831
|
+
name: packageJson.name || path.basename(repositoryPath),
|
|
832
|
+
path: repositoryPath,
|
|
833
|
+
version: packageJson.version
|
|
834
|
+
})
|
|
835
|
+
<<<<<<< HEAD
|
|
836
|
+
<<<<<<< HEAD
|
|
837
|
+
|
|
838
|
+
=======
|
|
839
|
+
<<<<<<< HEAD
|
|
840
|
+
|
|
841
|
+
=======
|
|
842
|
+
|
|
843
|
+
>>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
|
|
844
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
845
|
+
=======
|
|
846
|
+
|
|
847
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
848
|
+
// Stop any running processes
|
|
849
|
+
if (projectProcess && projectStatus === 'running') {
|
|
850
|
+
projectProcess.kill('SIGTERM')
|
|
851
|
+
projectStatus = 'stopped'
|
|
852
|
+
projectProcess = null
|
|
853
|
+
}
|
|
854
|
+
<<<<<<< HEAD
|
|
855
|
+
<<<<<<< HEAD
|
|
856
|
+
|
|
857
|
+
=======
|
|
858
|
+
<<<<<<< HEAD
|
|
859
|
+
|
|
860
|
+
=======
|
|
861
|
+
|
|
862
|
+
>>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
|
|
863
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
864
|
+
=======
|
|
865
|
+
|
|
866
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
867
|
+
// Notify via WebSocket
|
|
868
|
+
const io = req.app.get('io')
|
|
869
|
+
if (io) {
|
|
870
|
+
io.emit('repository:switched', {
|
|
871
|
+
repository: {
|
|
872
|
+
name: packageJson.name,
|
|
873
|
+
path: repositoryPath,
|
|
874
|
+
version: packageJson.version
|
|
875
|
+
}
|
|
876
|
+
})
|
|
877
|
+
}
|
|
878
|
+
<<<<<<< HEAD
|
|
879
|
+
<<<<<<< HEAD
|
|
880
|
+
|
|
881
|
+
=======
|
|
882
|
+
<<<<<<< HEAD
|
|
883
|
+
|
|
884
|
+
=======
|
|
885
|
+
|
|
886
|
+
>>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
|
|
887
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
888
|
+
=======
|
|
889
|
+
|
|
890
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
891
|
+
res.json(createStandardResponse({
|
|
892
|
+
message: 'Repository switched successfully',
|
|
893
|
+
repository: {
|
|
894
|
+
name: packageJson.name,
|
|
895
|
+
path: repositoryPath,
|
|
896
|
+
version: packageJson.version
|
|
897
|
+
}
|
|
898
|
+
}))
|
|
899
|
+
} catch (error) {
|
|
900
|
+
return res.status(500).json(
|
|
901
|
+
createErrorResponse(ERROR_CODES.INTERNAL_ERROR, 'Failed to switch repository: ' + error.message)
|
|
902
|
+
)
|
|
903
|
+
}
|
|
904
|
+
}))
|
|
905
|
+
|
|
906
|
+
/**
|
|
907
|
+
* Get current repository information
|
|
908
|
+
*/
|
|
909
|
+
async function getCurrentRepositoryInfo() {
|
|
910
|
+
try {
|
|
911
|
+
const cwd = process.env.PROJECT_ROOT || process.cwd()
|
|
912
|
+
const packageJsonPath = path.join(cwd, 'package.json')
|
|
913
|
+
const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf8'))
|
|
914
|
+
<<<<<<< HEAD
|
|
915
|
+
<<<<<<< HEAD
|
|
916
|
+
|
|
917
|
+
=======
|
|
918
|
+
<<<<<<< HEAD
|
|
919
|
+
|
|
920
|
+
=======
|
|
921
|
+
|
|
922
|
+
>>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
|
|
923
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
924
|
+
=======
|
|
925
|
+
|
|
926
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
927
|
+
return {
|
|
928
|
+
name: packageJson.name || path.basename(cwd),
|
|
929
|
+
path: cwd,
|
|
930
|
+
version: packageJson.version,
|
|
931
|
+
framework: detectFramework(packageJson),
|
|
932
|
+
hasBackend: await fs.access(path.join(cwd, 'backend')).then(() => true).catch(() => false)
|
|
933
|
+
}
|
|
934
|
+
} catch (error) {
|
|
935
|
+
return null
|
|
936
|
+
}
|
|
937
|
+
}
|
|
938
|
+
|
|
939
|
+
/**
|
|
940
|
+
* Detect framework from package.json
|
|
941
|
+
*/
|
|
942
|
+
function detectFramework(packageJson) {
|
|
943
|
+
<<<<<<< HEAD
|
|
944
|
+
<<<<<<< HEAD
|
|
945
|
+
=======
|
|
946
|
+
<<<<<<< HEAD
|
|
947
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
948
|
+
=======
|
|
949
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
950
|
+
const deps = {
|
|
951
|
+
...packageJson.dependencies,
|
|
952
|
+
...packageJson.devDependencies
|
|
953
|
+
}
|
|
954
|
+
<<<<<<< HEAD
|
|
955
|
+
<<<<<<< HEAD
|
|
956
|
+
|
|
957
|
+
=======
|
|
958
|
+
|
|
959
|
+
=======
|
|
960
|
+
const deps = {
|
|
961
|
+
...packageJson.dependencies,
|
|
962
|
+
...packageJson.devDependencies
|
|
963
|
+
}
|
|
964
|
+
|
|
965
|
+
>>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
|
|
966
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
967
|
+
=======
|
|
968
|
+
|
|
969
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
970
|
+
if (deps.react) return 'React'
|
|
971
|
+
if (deps.vue) return 'Vue'
|
|
972
|
+
if (deps.svelte) return 'Svelte'
|
|
973
|
+
if (deps['@angular/core']) return 'Angular'
|
|
974
|
+
<<<<<<< HEAD
|
|
975
|
+
<<<<<<< HEAD
|
|
976
|
+
=======
|
|
977
|
+
<<<<<<< HEAD
|
|
978
|
+
|
|
979
|
+
return 'Unknown'
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
=======
|
|
983
|
+
>>>>>>> 652520a5 (Claude Flow RFC related development)
|
|
984
|
+
=======
|
|
985
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
986
|
+
=======
|
|
987
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
988
|
+
|
|
989
|
+
return 'Unknown'
|
|
990
|
+
}
|
|
991
|
+
|
|
992
|
+
<<<<<<< HEAD
|
|
993
|
+
<<<<<<< HEAD
|
|
994
|
+
=======
|
|
995
|
+
<<<<<<< HEAD
|
|
996
|
+
>>>>>>> f153939e (refactor: clean up CLI help display and remove unused dependencies)
|
|
997
|
+
=======
|
|
998
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
999
|
+
=======
|
|
1000
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
1001
|
+
/**
|
|
1002
|
+
* Analyze project integrations
|
|
1003
|
+
*/
|
|
1004
|
+
router.get('/analyze-integrations', asyncHandler(async (req, res) => {
|
|
1005
|
+
try {
|
|
1006
|
+
const projectPath = process.env.PROJECT_ROOT || process.cwd()
|
|
1007
|
+
const analysis = await analyzeIntegrations(projectPath)
|
|
1008
|
+
|
|
1009
|
+
res.json(createStandardResponse({
|
|
1010
|
+
analysis,
|
|
1011
|
+
projectPath,
|
|
1012
|
+
timestamp: new Date().toISOString()
|
|
1013
|
+
}))
|
|
1014
|
+
} catch (error) {
|
|
1015
|
+
console.error('Integration analysis failed:', error)
|
|
1016
|
+
return res.status(500).json(
|
|
1017
|
+
createErrorResponse(ERROR_CODES.INTERNAL_ERROR, 'Failed to analyze integrations: ' + error.message)
|
|
1018
|
+
)
|
|
1019
|
+
}
|
|
1020
|
+
}))
|
|
1021
|
+
|
|
1022
|
+
<<<<<<< HEAD
|
|
1023
|
+
<<<<<<< HEAD
|
|
1024
|
+
=======
|
|
1025
|
+
>>>>>>> 82b75ea9 (feat: major UI package reorganization and cleanup)
|
|
1026
|
+
>>>>>>> 860052b4 (feat: integrate complete management-ui and additional features)
|
|
1027
|
+
=======
|
|
1028
|
+
>>>>>>> 7e97f01c (fix: resolve ui-command merge conflicts and update package.json)
|
|
1029
|
+
export default router
|