@friggframework/devtools 2.0.0--canary.522.cbd3d5a.0 → 2.0.0--canary.517.21b69ac.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (247) hide show
  1. package/.eslintrc.json +3 -0
  2. package/CHANGELOG.md +132 -0
  3. package/frigg-cli/README.md +1 -1
  4. package/frigg-cli/__tests__/unit/commands/doctor.test.js +2 -0
  5. package/frigg-cli/__tests__/unit/commands/install.test.js +17 -21
  6. package/frigg-cli/doctor-command/index.js +16 -17
  7. package/frigg-cli/index.js +6 -21
  8. package/frigg-cli/index.test.js +1 -7
  9. package/frigg-cli/init-command/backend-first-handler.js +42 -124
  10. package/frigg-cli/init-command/index.js +1 -2
  11. package/frigg-cli/init-command/template-handler.js +3 -13
  12. package/frigg-cli/install-command/backend-js.js +3 -3
  13. package/frigg-cli/install-command/environment-variables.js +19 -16
  14. package/frigg-cli/install-command/environment-variables.test.js +13 -12
  15. package/frigg-cli/install-command/index.js +9 -14
  16. package/frigg-cli/install-command/integration-file.js +3 -3
  17. package/frigg-cli/install-command/logger.js +12 -0
  18. package/frigg-cli/install-command/validate-package.js +9 -5
  19. package/frigg-cli/jest.config.js +1 -4
  20. package/frigg-cli/repair-command/index.js +128 -101
  21. package/frigg-cli/start-command/index.js +2 -246
  22. package/frigg-cli/ui-command/index.js +36 -58
  23. package/frigg-cli/utils/repo-detection.js +37 -85
  24. package/infrastructure/docs/iam-policy-templates.md +1 -1
  25. package/infrastructure/domains/networking/vpc-builder.test.js +4 -2
  26. package/infrastructure/domains/networking/vpc-resolver.test.js +1 -1
  27. package/infrastructure/domains/shared/cloudformation-discovery.test.js +7 -4
  28. package/infrastructure/domains/shared/resource-discovery.js +5 -5
  29. package/infrastructure/domains/shared/types/discovery-result.test.js +1 -1
  30. package/infrastructure/domains/shared/utilities/base-definition-factory.js +2 -25
  31. package/infrastructure/domains/shared/utilities/base-definition-factory.test.js +2 -2
  32. package/infrastructure/infrastructure-composer.test.js +2 -2
  33. package/layers/prisma/.build-complete +3 -0
  34. package/layers/prisma/nodejs/package.json +8 -0
  35. package/management-ui/.eslintrc.js +22 -0
  36. package/management-ui/README.md +109 -245
  37. package/management-ui/components.json +21 -0
  38. package/management-ui/docs/phase2-integration-guide.md +320 -0
  39. package/management-ui/index.html +13 -0
  40. package/management-ui/package.json +76 -0
  41. package/management-ui/packages/devtools/frigg-cli/ui-command/index.js +302 -0
  42. package/management-ui/postcss.config.js +6 -0
  43. package/management-ui/server/api/backend.js +256 -0
  44. package/management-ui/server/api/cli.js +315 -0
  45. package/management-ui/server/api/codegen.js +663 -0
  46. package/management-ui/server/api/connections.js +857 -0
  47. package/management-ui/server/api/discovery.js +185 -0
  48. package/management-ui/server/api/environment/index.js +1 -0
  49. package/management-ui/server/api/environment/router.js +378 -0
  50. package/management-ui/server/api/environment.js +328 -0
  51. package/management-ui/server/api/integrations.js +876 -0
  52. package/management-ui/server/api/logs.js +248 -0
  53. package/management-ui/server/api/monitoring.js +282 -0
  54. package/management-ui/server/api/open-ide.js +31 -0
  55. package/management-ui/server/api/project.js +1029 -0
  56. package/management-ui/server/api/users/sessions.js +371 -0
  57. package/management-ui/server/api/users/simulation.js +254 -0
  58. package/management-ui/server/api/users.js +362 -0
  59. package/management-ui/server/api-contract.md +275 -0
  60. package/management-ui/server/index.js +873 -0
  61. package/management-ui/server/middleware/errorHandler.js +93 -0
  62. package/management-ui/server/middleware/security.js +32 -0
  63. package/management-ui/server/processManager.js +296 -0
  64. package/management-ui/server/server.js +346 -0
  65. package/management-ui/server/services/aws-monitor.js +413 -0
  66. package/management-ui/server/services/npm-registry.js +347 -0
  67. package/management-ui/server/services/template-engine.js +538 -0
  68. package/management-ui/server/utils/cliIntegration.js +220 -0
  69. package/management-ui/server/utils/environment/auditLogger.js +471 -0
  70. package/management-ui/server/utils/environment/awsParameterStore.js +275 -0
  71. package/management-ui/server/utils/environment/encryption.js +278 -0
  72. package/management-ui/server/utils/environment/envFileManager.js +286 -0
  73. package/management-ui/server/utils/import-commonjs.js +28 -0
  74. package/management-ui/server/utils/response.js +83 -0
  75. package/management-ui/server/websocket/handler.js +325 -0
  76. package/management-ui/src/App.jsx +25 -0
  77. package/management-ui/src/assets/FriggLogo.svg +1 -0
  78. package/management-ui/src/components/AppRouter.jsx +65 -0
  79. package/management-ui/src/components/Button.jsx +70 -0
  80. package/management-ui/src/components/Card.jsx +97 -0
  81. package/management-ui/src/components/EnvironmentCompare.jsx +400 -0
  82. package/management-ui/src/components/EnvironmentEditor.jsx +372 -0
  83. package/management-ui/src/components/EnvironmentImportExport.jsx +469 -0
  84. package/management-ui/src/components/EnvironmentSchema.jsx +491 -0
  85. package/management-ui/src/components/EnvironmentSecurity.jsx +463 -0
  86. package/management-ui/src/components/ErrorBoundary.jsx +73 -0
  87. package/management-ui/src/components/IntegrationCard.jsx +481 -0
  88. package/management-ui/src/components/IntegrationCardEnhanced.jsx +770 -0
  89. package/management-ui/src/components/IntegrationExplorer.jsx +379 -0
  90. package/management-ui/src/components/IntegrationStatus.jsx +336 -0
  91. package/management-ui/src/components/Layout.jsx +716 -0
  92. package/management-ui/src/components/LoadingSpinner.jsx +113 -0
  93. package/management-ui/src/components/RepositoryPicker.jsx +248 -0
  94. package/management-ui/src/components/SessionMonitor.jsx +350 -0
  95. package/management-ui/src/components/StatusBadge.jsx +208 -0
  96. package/management-ui/src/components/UserContextSwitcher.jsx +212 -0
  97. package/management-ui/src/components/UserSimulation.jsx +327 -0
  98. package/management-ui/src/components/Welcome.jsx +434 -0
  99. package/management-ui/src/components/codegen/APIEndpointGenerator.jsx +637 -0
  100. package/management-ui/src/components/codegen/APIModuleSelector.jsx +227 -0
  101. package/management-ui/src/components/codegen/CodeGenerationWizard.jsx +247 -0
  102. package/management-ui/src/components/codegen/CodePreviewEditor.jsx +316 -0
  103. package/management-ui/src/components/codegen/DynamicModuleForm.jsx +271 -0
  104. package/management-ui/src/components/codegen/FormBuilder.jsx +737 -0
  105. package/management-ui/src/components/codegen/IntegrationGenerator.jsx +855 -0
  106. package/management-ui/src/components/codegen/ProjectScaffoldWizard.jsx +797 -0
  107. package/management-ui/src/components/codegen/SchemaBuilder.jsx +303 -0
  108. package/management-ui/src/components/codegen/TemplateSelector.jsx +586 -0
  109. package/management-ui/src/components/codegen/index.js +10 -0
  110. package/management-ui/src/components/connections/ConnectionConfigForm.jsx +362 -0
  111. package/management-ui/src/components/connections/ConnectionHealthMonitor.jsx +182 -0
  112. package/management-ui/src/components/connections/ConnectionTester.jsx +200 -0
  113. package/management-ui/src/components/connections/EntityRelationshipMapper.jsx +292 -0
  114. package/management-ui/src/components/connections/OAuthFlow.jsx +204 -0
  115. package/management-ui/src/components/connections/index.js +5 -0
  116. package/management-ui/src/components/index.js +21 -0
  117. package/management-ui/src/components/monitoring/APIGatewayMetrics.jsx +222 -0
  118. package/management-ui/src/components/monitoring/LambdaMetrics.jsx +169 -0
  119. package/management-ui/src/components/monitoring/MetricsChart.jsx +197 -0
  120. package/management-ui/src/components/monitoring/MonitoringDashboard.jsx +393 -0
  121. package/management-ui/src/components/monitoring/SQSMetrics.jsx +246 -0
  122. package/management-ui/src/components/monitoring/index.js +6 -0
  123. package/management-ui/src/components/monitoring/monitoring.css +218 -0
  124. package/management-ui/src/components/theme-provider.jsx +52 -0
  125. package/management-ui/src/components/theme-toggle.jsx +39 -0
  126. package/management-ui/src/components/ui/badge.tsx +36 -0
  127. package/management-ui/src/components/ui/button.test.jsx +56 -0
  128. package/management-ui/src/components/ui/button.tsx +57 -0
  129. package/management-ui/src/components/ui/card.tsx +76 -0
  130. package/management-ui/src/components/ui/dropdown-menu.tsx +199 -0
  131. package/management-ui/src/components/ui/select.tsx +157 -0
  132. package/management-ui/src/components/ui/skeleton.jsx +15 -0
  133. package/management-ui/src/hooks/useFrigg.jsx +387 -0
  134. package/management-ui/src/hooks/useSocket.jsx +58 -0
  135. package/management-ui/src/index.css +193 -0
  136. package/management-ui/src/lib/utils.ts +6 -0
  137. package/management-ui/src/main.jsx +10 -0
  138. package/management-ui/src/pages/CodeGeneration.jsx +14 -0
  139. package/management-ui/src/pages/Connections.jsx +252 -0
  140. package/management-ui/src/pages/ConnectionsEnhanced.jsx +633 -0
  141. package/management-ui/src/pages/Dashboard.jsx +311 -0
  142. package/management-ui/src/pages/Environment.jsx +314 -0
  143. package/management-ui/src/pages/IntegrationConfigure.jsx +669 -0
  144. package/management-ui/src/pages/IntegrationDiscovery.jsx +567 -0
  145. package/management-ui/src/pages/IntegrationTest.jsx +742 -0
  146. package/management-ui/src/pages/Integrations.jsx +253 -0
  147. package/management-ui/src/pages/Monitoring.jsx +17 -0
  148. package/management-ui/src/pages/Simulation.jsx +155 -0
  149. package/management-ui/src/pages/Users.jsx +492 -0
  150. package/management-ui/src/services/api.js +41 -0
  151. package/management-ui/src/services/apiModuleService.js +193 -0
  152. package/management-ui/src/services/websocket-handlers.js +120 -0
  153. package/management-ui/src/test/api/project.test.js +273 -0
  154. package/management-ui/src/test/components/Welcome.test.jsx +378 -0
  155. package/management-ui/src/test/mocks/server.js +178 -0
  156. package/management-ui/src/test/setup.js +61 -0
  157. package/management-ui/src/test/utils/test-utils.jsx +134 -0
  158. package/management-ui/src/utils/repository.js +98 -0
  159. package/management-ui/src/utils/repository.test.js +118 -0
  160. package/management-ui/src/workflows/phase2-integration-workflows.js +884 -0
  161. package/management-ui/tailwind.config.js +63 -0
  162. package/management-ui/tsconfig.json +37 -0
  163. package/management-ui/tsconfig.node.json +10 -0
  164. package/management-ui/vite.config.js +26 -0
  165. package/management-ui/vitest.config.js +38 -0
  166. package/package.json +7 -17
  167. package/frigg-cli/__tests__/application/use-cases/AddApiModuleToIntegrationUseCase.test.js +0 -326
  168. package/frigg-cli/__tests__/application/use-cases/CreateApiModuleUseCase.test.js +0 -337
  169. package/frigg-cli/__tests__/domain/entities/ApiModule.test.js +0 -373
  170. package/frigg-cli/__tests__/domain/entities/AppDefinition.test.js +0 -313
  171. package/frigg-cli/__tests__/domain/services/IntegrationValidator.test.js +0 -269
  172. package/frigg-cli/__tests__/domain/value-objects/IntegrationName.test.js +0 -82
  173. package/frigg-cli/__tests__/infrastructure/adapters/IntegrationJsUpdater.test.js +0 -408
  174. package/frigg-cli/__tests__/infrastructure/repositories/FileSystemApiModuleRepository.test.js +0 -583
  175. package/frigg-cli/__tests__/infrastructure/repositories/FileSystemAppDefinitionRepository.test.js +0 -314
  176. package/frigg-cli/__tests__/infrastructure/repositories/FileSystemIntegrationRepository.test.js +0 -430
  177. package/frigg-cli/__tests__/unit/commands/init.test.js +0 -406
  178. package/frigg-cli/__tests__/unit/commands/repair.test.js +0 -275
  179. package/frigg-cli/__tests__/unit/start-command/application/RunPreflightChecksUseCase.test.js +0 -411
  180. package/frigg-cli/__tests__/unit/start-command/infrastructure/DatabaseAdapter.test.js +0 -405
  181. package/frigg-cli/__tests__/unit/start-command/infrastructure/DockerAdapter.test.js +0 -496
  182. package/frigg-cli/__tests__/unit/start-command/presentation/InteractivePromptAdapter.test.js +0 -474
  183. package/frigg-cli/__tests__/unit/utils/output.test.js +0 -196
  184. package/frigg-cli/application/use-cases/AddApiModuleToIntegrationUseCase.js +0 -93
  185. package/frigg-cli/application/use-cases/CreateApiModuleUseCase.js +0 -93
  186. package/frigg-cli/application/use-cases/CreateIntegrationUseCase.js +0 -103
  187. package/frigg-cli/container.js +0 -172
  188. package/frigg-cli/docs/OUTPUT_MIGRATION_GUIDE.md +0 -286
  189. package/frigg-cli/domain/entities/ApiModule.js +0 -272
  190. package/frigg-cli/domain/entities/AppDefinition.js +0 -227
  191. package/frigg-cli/domain/entities/Integration.js +0 -198
  192. package/frigg-cli/domain/exceptions/DomainException.js +0 -24
  193. package/frigg-cli/domain/ports/IApiModuleRepository.js +0 -53
  194. package/frigg-cli/domain/ports/IAppDefinitionRepository.js +0 -43
  195. package/frigg-cli/domain/ports/IIntegrationRepository.js +0 -61
  196. package/frigg-cli/domain/services/IntegrationValidator.js +0 -185
  197. package/frigg-cli/domain/value-objects/IntegrationId.js +0 -42
  198. package/frigg-cli/domain/value-objects/IntegrationName.js +0 -60
  199. package/frigg-cli/domain/value-objects/SemanticVersion.js +0 -70
  200. package/frigg-cli/infrastructure/UnitOfWork.js +0 -46
  201. package/frigg-cli/infrastructure/adapters/BackendJsUpdater.js +0 -197
  202. package/frigg-cli/infrastructure/adapters/FileSystemAdapter.js +0 -224
  203. package/frigg-cli/infrastructure/adapters/IntegrationJsUpdater.js +0 -249
  204. package/frigg-cli/infrastructure/adapters/SchemaValidator.js +0 -92
  205. package/frigg-cli/infrastructure/repositories/FileSystemApiModuleRepository.js +0 -373
  206. package/frigg-cli/infrastructure/repositories/FileSystemAppDefinitionRepository.js +0 -116
  207. package/frigg-cli/infrastructure/repositories/FileSystemIntegrationRepository.js +0 -277
  208. package/frigg-cli/package-lock.json +0 -16226
  209. package/frigg-cli/start-command/application/RunPreflightChecksUseCase.js +0 -376
  210. package/frigg-cli/start-command/infrastructure/DatabaseAdapter.js +0 -591
  211. package/frigg-cli/start-command/infrastructure/DockerAdapter.js +0 -306
  212. package/frigg-cli/start-command/presentation/InteractivePromptAdapter.js +0 -329
  213. package/frigg-cli/templates/backend/.env.example +0 -62
  214. package/frigg-cli/templates/backend/.eslintrc.json +0 -12
  215. package/frigg-cli/templates/backend/.prettierrc +0 -6
  216. package/frigg-cli/templates/backend/docker-compose.yml +0 -22
  217. package/frigg-cli/templates/backend/index.js +0 -96
  218. package/frigg-cli/templates/backend/infrastructure.js +0 -12
  219. package/frigg-cli/templates/backend/jest.config.js +0 -17
  220. package/frigg-cli/templates/backend/package.json +0 -50
  221. package/frigg-cli/templates/backend/src/api-modules/.gitkeep +0 -10
  222. package/frigg-cli/templates/backend/src/base/.gitkeep +0 -7
  223. package/frigg-cli/templates/backend/src/integrations/.gitkeep +0 -10
  224. package/frigg-cli/templates/backend/src/integrations/ExampleIntegration.js +0 -65
  225. package/frigg-cli/templates/backend/src/utils/.gitkeep +0 -7
  226. package/frigg-cli/templates/backend/test/setup.js +0 -30
  227. package/frigg-cli/templates/backend/ui-extensions/.gitkeep +0 -0
  228. package/frigg-cli/templates/backend/ui-extensions/README.md +0 -77
  229. package/frigg-cli/utils/__tests__/repo-detection.test.js +0 -436
  230. package/frigg-cli/utils/output.js +0 -382
  231. package/frigg-cli/validate-command/__tests__/adapters/validate-command.test.js +0 -205
  232. package/frigg-cli/validate-command/__tests__/application/validate-app-use-case.test.js +0 -104
  233. package/frigg-cli/validate-command/__tests__/domain/fix-suggestion.test.js +0 -153
  234. package/frigg-cli/validate-command/__tests__/domain/validation-error.test.js +0 -162
  235. package/frigg-cli/validate-command/__tests__/domain/validation-result.test.js +0 -152
  236. package/frigg-cli/validate-command/__tests__/infrastructure/api-module-validator.test.js +0 -332
  237. package/frigg-cli/validate-command/__tests__/infrastructure/app-definition-validator.test.js +0 -191
  238. package/frigg-cli/validate-command/__tests__/infrastructure/integration-class-validator.test.js +0 -146
  239. package/frigg-cli/validate-command/__tests__/infrastructure/template-validation.test.js +0 -155
  240. package/frigg-cli/validate-command/adapters/cli/validate-command.js +0 -199
  241. package/frigg-cli/validate-command/application/use-cases/validate-app-use-case.js +0 -35
  242. package/frigg-cli/validate-command/domain/entities/validation-result.js +0 -74
  243. package/frigg-cli/validate-command/domain/value-objects/fix-suggestion.js +0 -74
  244. package/frigg-cli/validate-command/domain/value-objects/validation-error.js +0 -68
  245. package/frigg-cli/validate-command/infrastructure/validators/api-module-validator.js +0 -181
  246. package/frigg-cli/validate-command/infrastructure/validators/app-definition-validator.js +0 -128
  247. package/frigg-cli/validate-command/infrastructure/validators/integration-class-validator.js +0 -113
@@ -1,376 +0,0 @@
1
- /**
2
- * RunPreflightChecksUseCase - Orchestrates pre-flight checks before starting Frigg
3
- *
4
- * Application Layer - Use Case that coordinates multiple infrastructure adapters
5
- * to verify the environment is ready for Frigg to start.
6
- *
7
- * Checks performed:
8
- * 1. DATABASE_URL environment variable exists
9
- * 2. Docker is installed
10
- * 3. Docker daemon is running
11
- * 4. Database is reachable
12
- */
13
-
14
- class RunPreflightChecksUseCase {
15
- constructor({ dockerAdapter, databaseAdapter }) {
16
- this.dockerAdapter = dockerAdapter;
17
- this.databaseAdapter = databaseAdapter;
18
- }
19
-
20
- /**
21
- * Execute all pre-flight checks
22
- * @param {object} options - Options
23
- * @param {string} options.projectPath - Path to the Frigg project
24
- * @returns {Promise<{allPassed: boolean, checks: Array}>}
25
- */
26
- async execute({ projectPath }) {
27
- const checks = [];
28
-
29
- // Check 1: DATABASE_URL exists
30
- const dbUrlCheck = this._checkDatabaseUrl();
31
- checks.push(dbUrlCheck);
32
-
33
- // Short-circuit if DATABASE_URL is missing
34
- if (dbUrlCheck.status === 'failed') {
35
- return { allPassed: false, checks };
36
- }
37
-
38
- // Check 2: Docker is installed
39
- const dockerInstalledCheck = await this._checkDockerInstalled();
40
- checks.push(dockerInstalledCheck);
41
-
42
- // Short-circuit if Docker is not installed
43
- if (dockerInstalledCheck.status === 'failed') {
44
- return { allPassed: false, checks };
45
- }
46
-
47
- // Check 3: Docker is running
48
- const dockerRunningCheck = await this._checkDockerRunning();
49
- checks.push(dockerRunningCheck);
50
-
51
- // Short-circuit if Docker is not running
52
- if (dockerRunningCheck.status === 'failed') {
53
- return { allPassed: false, checks };
54
- }
55
-
56
- // Check 4: Database is reachable
57
- const dbReachableCheck = await this._checkDatabaseReachable(projectPath);
58
- checks.push(dbReachableCheck);
59
-
60
- // Short-circuit if database is not reachable
61
- if (dbReachableCheck.status === 'failed') {
62
- return { allPassed: false, checks };
63
- }
64
-
65
- // Check 5: PostgreSQL migrations (only for PostgreSQL databases)
66
- const dbType = this.databaseAdapter.getDatabaseType(process.env.DATABASE_URL);
67
- if (dbType === 'postgresql') {
68
- const migrationCheck = await this._checkPostgresMigrations(projectPath);
69
- checks.push(migrationCheck);
70
- }
71
-
72
- // Check 6: LocalStack is reachable (only if AWS_ENDPOINT is configured for local)
73
- const localstackCheck = await this._checkLocalStackReachable(projectPath);
74
- if (localstackCheck) {
75
- checks.push(localstackCheck);
76
- }
77
-
78
- const allPassed = checks.every(check => check.status === 'passed');
79
- return { allPassed, checks };
80
- }
81
-
82
- /**
83
- * Check if DATABASE_URL environment variable is set
84
- * @returns {object} Check result
85
- */
86
- _checkDatabaseUrl() {
87
- const databaseUrl = process.env.DATABASE_URL;
88
-
89
- if (!databaseUrl || databaseUrl.trim() === '') {
90
- return {
91
- name: 'database_url',
92
- status: 'failed',
93
- message: 'DATABASE_URL environment variable is not set',
94
- canResolve: true,
95
- resolution: {
96
- type: 'create_env',
97
- prompt: 'Would you like to create a .env file from the template?',
98
- action: 'copy_env_template'
99
- }
100
- };
101
- }
102
-
103
- const dbType = this.databaseAdapter.getDatabaseType(databaseUrl);
104
-
105
- return {
106
- name: 'database_url',
107
- status: 'passed',
108
- message: `DATABASE_URL is configured (${dbType || 'unknown'} database)`,
109
- canResolve: false,
110
- resolution: null
111
- };
112
- }
113
-
114
- /**
115
- * Check if Docker is installed
116
- * @returns {Promise<object>} Check result
117
- */
118
- async _checkDockerInstalled() {
119
- const isInstalled = await this.dockerAdapter.isDockerInstalled();
120
-
121
- if (!isInstalled) {
122
- return {
123
- name: 'docker_installed',
124
- status: 'failed',
125
- message: 'Docker is not installed',
126
- canResolve: false,
127
- resolution: {
128
- type: 'manual',
129
- instructions: 'Please install Docker Desktop from https://www.docker.com/products/docker-desktop'
130
- }
131
- };
132
- }
133
-
134
- return {
135
- name: 'docker_installed',
136
- status: 'passed',
137
- message: 'Docker is installed',
138
- canResolve: false,
139
- resolution: null
140
- };
141
- }
142
-
143
- /**
144
- * Check if Docker daemon is running
145
- * @returns {Promise<object>} Check result
146
- */
147
- async _checkDockerRunning() {
148
- const isRunning = await this.dockerAdapter.isDockerRunning();
149
-
150
- if (!isRunning) {
151
- return {
152
- name: 'docker_running',
153
- status: 'failed',
154
- message: 'Docker is not running. Please start Docker Desktop.',
155
- canResolve: true,
156
- resolution: {
157
- type: 'start_docker',
158
- prompt: 'Would you like to start Docker Desktop?',
159
- action: 'start_docker_desktop'
160
- }
161
- };
162
- }
163
-
164
- return {
165
- name: 'docker_running',
166
- status: 'passed',
167
- message: 'Docker daemon is running',
168
- canResolve: false,
169
- resolution: null
170
- };
171
- }
172
-
173
- /**
174
- * Check if database is reachable
175
- * @param {string} projectPath - Path to project
176
- * @returns {Promise<object>} Check result
177
- */
178
- async _checkDatabaseReachable(projectPath) {
179
- const databaseUrl = process.env.DATABASE_URL;
180
- const result = await this.databaseAdapter.isDatabaseReachable(databaseUrl);
181
-
182
- if (!result.reachable) {
183
- // Check for docker-compose file
184
- const composePath = await this.dockerAdapter.findDockerComposeFile(projectPath);
185
-
186
- if (composePath) {
187
- return {
188
- name: 'database_reachable',
189
- status: 'failed',
190
- message: `Database is not reachable: ${result.error || 'Connection failed'}`,
191
- canResolve: true,
192
- resolution: {
193
- type: 'start_docker_compose',
194
- prompt: 'Would you like to start the database using docker-compose?',
195
- composePath,
196
- action: 'docker_compose_up'
197
- }
198
- };
199
- }
200
-
201
- return {
202
- name: 'database_reachable',
203
- status: 'failed',
204
- message: `Database is not reachable: ${result.error || 'Connection failed'}`,
205
- canResolve: false,
206
- resolution: {
207
- type: 'manual',
208
- instructions: 'Please ensure your database server is running and accessible at the configured DATABASE_URL.'
209
- }
210
- };
211
- }
212
-
213
- return {
214
- name: 'database_reachable',
215
- status: 'passed',
216
- message: `Database is reachable at ${result.host}:${result.port}`,
217
- canResolve: false,
218
- resolution: null
219
- };
220
- }
221
-
222
- /**
223
- * Check if LocalStack is reachable (for local development)
224
- *
225
- * The serverless plugin defaults to http://localhost:4566 for LocalStack
226
- * even if AWS_ENDPOINT isn't set. So we check LocalStack in local dev
227
- * mode by default.
228
- *
229
- * @param {string} projectPath - Path to project
230
- * @returns {Promise<object|null>} Check result, or null if LocalStack check is not applicable
231
- */
232
- async _checkLocalStackReachable(projectPath) {
233
- // Default LocalStack endpoint - same as serverless plugin default
234
- const defaultEndpoint = 'http://localhost:4566';
235
- const awsEndpoint = process.env.AWS_ENDPOINT;
236
-
237
- // If AWS_ENDPOINT is set to a non-local address, skip LocalStack check
238
- if (awsEndpoint) {
239
- const isLocalEndpoint = awsEndpoint.includes('localhost') ||
240
- awsEndpoint.includes('127.0.0.1') ||
241
- awsEndpoint.includes('localstack');
242
-
243
- if (!isLocalEndpoint) {
244
- // Using real AWS, not LocalStack
245
- return null;
246
- }
247
- }
248
-
249
- // Use configured endpoint or default LocalStack endpoint
250
- const endpoint = awsEndpoint || defaultEndpoint;
251
-
252
- // Try to reach LocalStack health endpoint
253
- const result = await this.dockerAdapter.waitForLocalStack({
254
- maxAttempts: 1, // Just one check, not waiting
255
- intervalMs: 0,
256
- endpoint: endpoint
257
- });
258
-
259
- if (!result.ready) {
260
- // Check for docker-compose file
261
- const composePath = await this.dockerAdapter.findDockerComposeFile(projectPath);
262
-
263
- if (composePath) {
264
- return {
265
- name: 'localstack_reachable',
266
- status: 'failed',
267
- message: `LocalStack is not reachable at ${endpoint}`,
268
- canResolve: true,
269
- resolution: {
270
- type: 'start_docker_compose',
271
- prompt: 'Would you like to start LocalStack using docker-compose?',
272
- composePath,
273
- action: 'docker_compose_up'
274
- }
275
- };
276
- }
277
-
278
- return {
279
- name: 'localstack_reachable',
280
- status: 'failed',
281
- message: `LocalStack is not reachable at ${endpoint}`,
282
- canResolve: false,
283
- resolution: {
284
- type: 'manual',
285
- instructions: `Please ensure LocalStack is running at ${endpoint}. You can start it with: docker-compose up -d`
286
- }
287
- };
288
- }
289
-
290
- return {
291
- name: 'localstack_reachable',
292
- status: 'passed',
293
- message: `LocalStack is reachable at ${endpoint}`,
294
- canResolve: false,
295
- resolution: null
296
- };
297
- }
298
-
299
- /**
300
- * Check if PostgreSQL migrations have been applied
301
- * @param {string} projectPath - Path to project
302
- * @returns {Promise<object>} Check result
303
- */
304
- async _checkPostgresMigrations(projectPath) {
305
- const result = await this.databaseAdapter.checkMigrationStatus(projectPath);
306
-
307
- if (result.migrated) {
308
- return {
309
- name: 'postgres_migrations',
310
- status: 'passed',
311
- message: 'PostgreSQL database schema is up to date',
312
- canResolve: false,
313
- resolution: null
314
- };
315
- }
316
-
317
- // Handle Prisma not installed case
318
- if (result.needsInstall) {
319
- return {
320
- name: 'postgres_migrations',
321
- status: 'failed',
322
- message: result.error,
323
- canResolve: false,
324
- resolution: {
325
- type: 'manual',
326
- instructions: 'Run "npm install" or "pnpm install" to properly install Prisma, then try again.'
327
- }
328
- };
329
- }
330
-
331
- // Determine if this is auto-resolvable
332
- const canResolve = result.needsSetup || result.pendingMigrations?.length > 0;
333
-
334
- let message = result.error || 'PostgreSQL migrations have not been applied';
335
- if (result.pendingMigrations?.length > 0) {
336
- message = `${result.pendingMigrations.length} pending migration(s) need to be applied`;
337
- }
338
-
339
- return {
340
- name: 'postgres_migrations',
341
- status: 'failed',
342
- message,
343
- canResolve,
344
- resolution: canResolve ? {
345
- type: 'run_migrations',
346
- prompt: 'Would you like to run database migrations now?',
347
- action: 'prisma_migrate',
348
- pendingMigrations: result.pendingMigrations,
349
- needsSetup: result.needsSetup
350
- } : {
351
- type: 'manual',
352
- instructions: 'Run "frigg db:setup" or "npx prisma migrate dev" to apply database migrations.'
353
- }
354
- };
355
- }
356
-
357
- /**
358
- * Get only the failed checks from a result
359
- * @param {object} result - Result from execute()
360
- * @returns {Array} Failed checks
361
- */
362
- getFailedChecks(result) {
363
- return result.checks.filter(check => check.status === 'failed');
364
- }
365
-
366
- /**
367
- * Get only the checks that can be auto-resolved
368
- * @param {object} result - Result from execute()
369
- * @returns {Array} Resolvable failed checks
370
- */
371
- getResolvableChecks(result) {
372
- return result.checks.filter(check => check.status === 'failed' && check.canResolve);
373
- }
374
- }
375
-
376
- module.exports = { RunPreflightChecksUseCase };