forgestack-os-cli 0.3.5 → 0.3.6

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 (34) hide show
  1. package/README.md +338 -312
  2. package/dist/commands/doctor.d.ts +12 -0
  3. package/dist/commands/doctor.js +214 -0
  4. package/dist/commands/doctor.js.map +1 -0
  5. package/dist/index.js +16 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/utils/doctor/check-database.d.ts +8 -0
  8. package/dist/utils/doctor/check-database.js +271 -0
  9. package/dist/utils/doctor/check-database.js.map +1 -0
  10. package/dist/utils/doctor/check-docker.d.ts +8 -0
  11. package/dist/utils/doctor/check-docker.js +212 -0
  12. package/dist/utils/doctor/check-docker.js.map +1 -0
  13. package/dist/utils/doctor/check-env.d.ts +12 -0
  14. package/dist/utils/doctor/check-env.js +207 -0
  15. package/dist/utils/doctor/check-env.js.map +1 -0
  16. package/dist/utils/doctor/check-lint.d.ts +8 -0
  17. package/dist/utils/doctor/check-lint.js +225 -0
  18. package/dist/utils/doctor/check-lint.js.map +1 -0
  19. package/dist/utils/doctor/check-node.d.ts +20 -0
  20. package/dist/utils/doctor/check-node.js +172 -0
  21. package/dist/utils/doctor/check-node.js.map +1 -0
  22. package/dist/utils/doctor/check-ports.d.ts +15 -0
  23. package/dist/utils/doctor/check-ports.js +166 -0
  24. package/dist/utils/doctor/check-ports.js.map +1 -0
  25. package/dist/utils/doctor/check-prisma.d.ts +8 -0
  26. package/dist/utils/doctor/check-prisma.js +202 -0
  27. package/dist/utils/doctor/check-prisma.js.map +1 -0
  28. package/dist/utils/doctor/index.d.ts +14 -0
  29. package/dist/utils/doctor/index.js +15 -0
  30. package/dist/utils/doctor/index.js.map +1 -0
  31. package/dist/utils/doctor/types.d.ts +50 -0
  32. package/dist/utils/doctor/types.js +5 -0
  33. package/dist/utils/doctor/types.js.map +1 -0
  34. package/package.json +1 -1
@@ -0,0 +1,12 @@
1
+ /**
2
+ * ForgeStack Doctor Command
3
+ *
4
+ * Validates the generated SaaS project environment and dev setup.
5
+ * Helps developers quickly detect missing dependencies, configuration issues,
6
+ * and common setup problems before running the app.
7
+ */
8
+ import { DoctorOptions } from '../utils/doctor/index.js';
9
+ /**
10
+ * Main doctor command implementation
11
+ */
12
+ export declare function doctorCommand(options?: DoctorOptions): Promise<void>;
@@ -0,0 +1,214 @@
1
+ /**
2
+ * ForgeStack Doctor Command
3
+ *
4
+ * Validates the generated SaaS project environment and dev setup.
5
+ * Helps developers quickly detect missing dependencies, configuration issues,
6
+ * and common setup problems before running the app.
7
+ */
8
+ import chalk from 'chalk';
9
+ import path from 'path';
10
+ import { runNodeChecks, checkEnvVariables, checkDatabaseConnection, runPrismaChecks, runDockerChecks, checkAppPorts, runLintChecks, generateMissingEnvReport, } from '../utils/doctor/index.js';
11
+ import { logger } from '../utils/logger.js';
12
+ /**
13
+ * Status icons for console output
14
+ */
15
+ const STATUS_ICONS = {
16
+ pass: chalk.green('✅'),
17
+ warn: chalk.yellow('⚠️'),
18
+ fail: chalk.red('❌'),
19
+ skip: chalk.gray('⏭️'),
20
+ };
21
+ /**
22
+ * Format a check result for console output
23
+ */
24
+ function formatCheckResult(result) {
25
+ const icon = STATUS_ICONS[result.status];
26
+ let output = `${icon} ${result.name}: ${result.message}`;
27
+ if (result.details) {
28
+ output += chalk.gray(`\n └─ ${result.details}`);
29
+ }
30
+ if (result.fix && (result.status === 'fail' || result.status === 'warn')) {
31
+ output += chalk.cyan(`\n 💡 Fix: ${result.fix}`);
32
+ }
33
+ return output;
34
+ }
35
+ /**
36
+ * Create a summary from check results
37
+ */
38
+ function createSummary(checks) {
39
+ return {
40
+ total: checks.length,
41
+ passed: checks.filter(c => c.status === 'pass').length,
42
+ warnings: checks.filter(c => c.status === 'warn').length,
43
+ failed: checks.filter(c => c.status === 'fail').length,
44
+ skipped: checks.filter(c => c.status === 'skip').length,
45
+ };
46
+ }
47
+ /**
48
+ * Print the doctor report banner
49
+ */
50
+ function printBanner() {
51
+ console.log('');
52
+ console.log(chalk.bold.cyan('╔═══════════════════════════════════════════════════╗'));
53
+ console.log(chalk.bold.cyan('║ ║'));
54
+ console.log(chalk.bold.cyan('║ 🩺 ForgeStack Doctor Report ║'));
55
+ console.log(chalk.bold.cyan('║ ║'));
56
+ console.log(chalk.bold.cyan('╚═══════════════════════════════════════════════════╝'));
57
+ console.log('');
58
+ }
59
+ /**
60
+ * Print the summary section
61
+ */
62
+ function printSummary(summary) {
63
+ console.log('');
64
+ console.log(chalk.bold('─'.repeat(55)));
65
+ console.log(chalk.bold('\n📊 Summary:\n'));
66
+ const items = [
67
+ { label: 'Total Checks', value: summary.total, color: chalk.white },
68
+ { label: 'Passed', value: summary.passed, color: chalk.green },
69
+ { label: 'Warnings', value: summary.warnings, color: chalk.yellow },
70
+ { label: 'Failed', value: summary.failed, color: chalk.red },
71
+ { label: 'Skipped', value: summary.skipped, color: chalk.gray },
72
+ ];
73
+ for (const item of items) {
74
+ console.log(` ${item.color(`${item.label}:`)} ${item.value}`);
75
+ }
76
+ console.log('');
77
+ }
78
+ /**
79
+ * Print section header
80
+ */
81
+ function printSection(title) {
82
+ console.log(chalk.bold.blue(`\n📋 ${title}\n`));
83
+ }
84
+ /**
85
+ * Main doctor command implementation
86
+ */
87
+ export async function doctorCommand(options = {}) {
88
+ const cwd = options.cwd ? path.resolve(options.cwd) : process.cwd();
89
+ const allChecks = [];
90
+ // Print banner (unless JSON output)
91
+ if (!options.json) {
92
+ printBanner();
93
+ console.log(chalk.gray(`Working directory: ${cwd}\n`));
94
+ }
95
+ try {
96
+ // 1. Node & Package Manager Checks
97
+ if (!options.json) {
98
+ printSection('Node.js & Package Managers');
99
+ }
100
+ const nodeChecks = await runNodeChecks(cwd);
101
+ allChecks.push(...nodeChecks);
102
+ if (!options.json) {
103
+ nodeChecks.forEach(r => console.log(formatCheckResult(r)));
104
+ }
105
+ // 2. Environment Variable Checks
106
+ if (!options.json) {
107
+ printSection('Environment Variables');
108
+ }
109
+ const envChecks = await checkEnvVariables(cwd);
110
+ allChecks.push(...envChecks);
111
+ if (!options.json) {
112
+ envChecks.forEach(r => console.log(formatCheckResult(r)));
113
+ }
114
+ // Generate .env.missing report if requested
115
+ if (options.fix) {
116
+ const missingReportPath = await generateMissingEnvReport(cwd);
117
+ if (missingReportPath && !options.json) {
118
+ console.log(chalk.cyan(`\n 📝 Generated: ${missingReportPath}`));
119
+ }
120
+ }
121
+ // 3. Database Connectivity Checks
122
+ if (!options.json) {
123
+ printSection('Database Connectivity');
124
+ }
125
+ const dbChecks = await checkDatabaseConnection(cwd);
126
+ allChecks.push(...dbChecks);
127
+ if (!options.json) {
128
+ dbChecks.forEach(r => console.log(formatCheckResult(r)));
129
+ }
130
+ // 4. Prisma Checks
131
+ if (!options.json) {
132
+ printSection('Prisma ORM');
133
+ }
134
+ const prismaChecks = await runPrismaChecks(cwd);
135
+ allChecks.push(...prismaChecks);
136
+ if (!options.json) {
137
+ prismaChecks.forEach(r => console.log(formatCheckResult(r)));
138
+ }
139
+ // 5. Docker Checks
140
+ if (!options.json) {
141
+ printSection('Docker');
142
+ }
143
+ const dockerChecks = await runDockerChecks(cwd);
144
+ allChecks.push(...dockerChecks);
145
+ if (!options.json) {
146
+ dockerChecks.forEach(r => console.log(formatCheckResult(r)));
147
+ }
148
+ // 6. Port Availability Checks
149
+ if (!options.json) {
150
+ printSection('Port Availability');
151
+ }
152
+ const portChecks = await checkAppPorts();
153
+ allChecks.push(...portChecks);
154
+ if (!options.json) {
155
+ portChecks.forEach(r => console.log(formatCheckResult(r)));
156
+ }
157
+ // 7. Lint Checks (optional)
158
+ if (options.lint) {
159
+ if (!options.json) {
160
+ printSection('Code Quality (ESLint & TypeScript)');
161
+ }
162
+ const lintChecks = await runLintChecks(cwd);
163
+ allChecks.push(...lintChecks);
164
+ if (!options.json) {
165
+ lintChecks.forEach(r => console.log(formatCheckResult(r)));
166
+ }
167
+ }
168
+ // Create report
169
+ const summary = createSummary(allChecks);
170
+ const report = {
171
+ timestamp: new Date().toISOString(),
172
+ cwd,
173
+ checks: allChecks,
174
+ summary,
175
+ exitCode: summary.failed > 0 ? 1 : 0,
176
+ };
177
+ // Output
178
+ if (options.json) {
179
+ console.log(JSON.stringify(report, null, 2));
180
+ }
181
+ else {
182
+ printSummary(summary);
183
+ // Final status message
184
+ if (summary.failed > 0) {
185
+ logger.error(`Found ${summary.failed} critical issue(s) that need to be fixed.`);
186
+ }
187
+ else if (summary.warnings > 0) {
188
+ logger.warning(`Found ${summary.warnings} warning(s) to review.`);
189
+ }
190
+ else {
191
+ logger.success('All checks passed! Your environment is ready. 🚀');
192
+ }
193
+ console.log('');
194
+ }
195
+ // Exit with appropriate code
196
+ if (summary.failed > 0) {
197
+ process.exit(1);
198
+ }
199
+ }
200
+ catch (error) {
201
+ if (!options.json) {
202
+ logger.error('Doctor command failed unexpectedly');
203
+ console.error(error);
204
+ }
205
+ else {
206
+ console.log(JSON.stringify({
207
+ error: error instanceof Error ? error.message : String(error),
208
+ exitCode: 1,
209
+ }));
210
+ }
211
+ process.exit(1);
212
+ }
213
+ }
214
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -4,6 +4,7 @@ import { Command } from 'commander';
4
4
  import { createCommand } from './commands/create.js';
5
5
  import { organizeCommand } from './commands/organize.js';
6
6
  import { runTasksCommand } from './commands/run-tasks.js';
7
+ import { doctorCommand } from './commands/doctor.js';
7
8
  const pkgRequire = createRequire(import.meta.url);
8
9
  const { version: CLI_VERSION } = pkgRequire('../package.json');
9
10
  const program = new Command();
@@ -39,5 +40,20 @@ program
39
40
  .action(runTasksCommand)
40
41
  .option('--parallel', 'Run tasks in parallel instead of sequentially')
41
42
  .option('--stop-on-error', 'Stop execution if any task fails');
43
+ program
44
+ .command('doctor')
45
+ .description('Validate project environment and dev setup')
46
+ .action(async (options) => {
47
+ await doctorCommand({
48
+ lint: options.lint,
49
+ json: options.json,
50
+ fix: options.fix,
51
+ cwd: options.cwd,
52
+ });
53
+ })
54
+ .option('--lint', 'Run ESLint and TypeScript checks')
55
+ .option('--json', 'Output results as JSON for CI pipelines')
56
+ .option('--fix', 'Auto-generate missing .env report')
57
+ .option('--cwd <path>', 'Custom project directory to check');
42
58
  program.parse();
43
59
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,UAAU,CAAC,iBAAiB,CAAwB,CAAC;AAEtF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACF,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,4DAA4D,CAAC;KACzE,OAAO,CAAC,WAAW,CAAC,CAAC;AAE1B,OAAO;KACF,OAAO,CAAC,uBAAuB,CAAC;KAChC,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,aAAa,CAAC;KACrB,MAAM,CAAC,wBAAwB,EAAE,oBAAoB,CAAC;KACtD,MAAM,CAAC,uBAAuB,EAAE,mBAAmB,CAAC;KACpD,MAAM,CAAC,mBAAmB,EAAE,eAAe,CAAC;KAC5C,MAAM,CAAC,iBAAiB,EAAE,UAAU,CAAC;KACrC,MAAM,CAAC,eAAe,EAAE,WAAW,CAAC;KACpC,MAAM,CAAC,iBAAiB,EAAE,+BAA+B,CAAC;KAC1D,MAAM,CAAC,gBAAgB,EAAE,mCAAmC,CAAC;KAC7D,MAAM,CAAC,UAAU,EAAE,8BAA8B,CAAC;KAClD,MAAM,CAAC,aAAa,EAAE,2BAA2B,CAAC;KAClD,MAAM,CAAC,gBAAgB,EAAE,sBAAsB,CAAC;KAChD,MAAM,CAAC,gBAAgB,EAAE,8BAA8B,CAAC;KACxD,MAAM,CAAC,YAAY,EAAE,yBAAyB,CAAC,CAAC;AAErD,OAAO;KACF,OAAO,CAAC,wBAAwB,CAAC;KACjC,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,eAAe,CAAC;KACvB,MAAM,CAAC,mBAAmB,EAAE,qCAAqC,CAAC;KAClE,MAAM,CAAC,cAAc,EAAE,6CAA6C,CAAC,CAAC;AAE3E,OAAO;KACF,OAAO,CAAC,yBAAyB,CAAC;KAClC,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,eAAe,CAAC;KACvB,MAAM,CAAC,YAAY,EAAE,+CAA+C,CAAC;KACrE,MAAM,CAAC,iBAAiB,EAAE,kCAAkC,CAAC,CAAC;AAEnE,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,UAAU,CAAC,iBAAiB,CAAwB,CAAC;AAEtF,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACF,IAAI,CAAC,YAAY,CAAC;KAClB,WAAW,CAAC,4DAA4D,CAAC;KACzE,OAAO,CAAC,WAAW,CAAC,CAAC;AAE1B,OAAO;KACF,OAAO,CAAC,uBAAuB,CAAC;KAChC,WAAW,CAAC,0CAA0C,CAAC;KACvD,MAAM,CAAC,aAAa,CAAC;KACrB,MAAM,CAAC,wBAAwB,EAAE,oBAAoB,CAAC;KACtD,MAAM,CAAC,uBAAuB,EAAE,mBAAmB,CAAC;KACpD,MAAM,CAAC,mBAAmB,EAAE,eAAe,CAAC;KAC5C,MAAM,CAAC,iBAAiB,EAAE,UAAU,CAAC;KACrC,MAAM,CAAC,eAAe,EAAE,WAAW,CAAC;KACpC,MAAM,CAAC,iBAAiB,EAAE,+BAA+B,CAAC;KAC1D,MAAM,CAAC,gBAAgB,EAAE,mCAAmC,CAAC;KAC7D,MAAM,CAAC,UAAU,EAAE,8BAA8B,CAAC;KAClD,MAAM,CAAC,aAAa,EAAE,2BAA2B,CAAC;KAClD,MAAM,CAAC,gBAAgB,EAAE,sBAAsB,CAAC;KAChD,MAAM,CAAC,gBAAgB,EAAE,8BAA8B,CAAC;KACxD,MAAM,CAAC,YAAY,EAAE,yBAAyB,CAAC,CAAC;AAErD,OAAO;KACF,OAAO,CAAC,wBAAwB,CAAC;KACjC,WAAW,CAAC,gCAAgC,CAAC;KAC7C,MAAM,CAAC,eAAe,CAAC;KACvB,MAAM,CAAC,mBAAmB,EAAE,qCAAqC,CAAC;KAClE,MAAM,CAAC,cAAc,EAAE,6CAA6C,CAAC,CAAC;AAE3E,OAAO;KACF,OAAO,CAAC,yBAAyB,CAAC;KAClC,WAAW,CAAC,yCAAyC,CAAC;KACtD,MAAM,CAAC,eAAe,CAAC;KACvB,MAAM,CAAC,YAAY,EAAE,+CAA+C,CAAC;KACrE,MAAM,CAAC,iBAAiB,EAAE,kCAAkC,CAAC,CAAC;AAEnE,OAAO;KACF,OAAO,CAAC,QAAQ,CAAC;KACjB,WAAW,CAAC,4CAA4C,CAAC;KACzD,MAAM,CAAC,KAAK,EAAE,OAAgC,EAAE,EAAE;IAC/C,MAAM,aAAa,CAAC;QAChB,IAAI,EAAE,OAAO,CAAC,IAA2B;QACzC,IAAI,EAAE,OAAO,CAAC,IAA2B;QACzC,GAAG,EAAE,OAAO,CAAC,GAA0B;QACvC,GAAG,EAAE,OAAO,CAAC,GAAyB;KACzC,CAAC,CAAC;AACP,CAAC,CAAC;KACD,MAAM,CAAC,QAAQ,EAAE,kCAAkC,CAAC;KACpD,MAAM,CAAC,QAAQ,EAAE,yCAAyC,CAAC;KAC3D,MAAM,CAAC,OAAO,EAAE,mCAAmC,CAAC;KACpD,MAAM,CAAC,cAAc,EAAE,mCAAmC,CAAC,CAAC;AAEjE,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Database connectivity checks
3
+ */
4
+ import type { CheckResult } from './types.js';
5
+ /**
6
+ * Run database connectivity check
7
+ */
8
+ export declare function checkDatabaseConnection(cwd: string): Promise<CheckResult[]>;
@@ -0,0 +1,271 @@
1
+ /**
2
+ * Database connectivity checks
3
+ */
4
+ import { execSync } from 'child_process';
5
+ import fs from 'fs-extra';
6
+ import path from 'path';
7
+ /**
8
+ * Parse a database connection string to determine type
9
+ */
10
+ function parseDatabaseUrl(url) {
11
+ if (!url)
12
+ return null;
13
+ if (url.startsWith('postgres://') || url.startsWith('postgresql://')) {
14
+ return { type: 'postgresql', connectionString: url };
15
+ }
16
+ if (url.startsWith('mongodb://') || url.startsWith('mongodb+srv://')) {
17
+ return { type: 'mongodb', connectionString: url };
18
+ }
19
+ if (url.startsWith('mysql://')) {
20
+ return { type: 'mysql', connectionString: url };
21
+ }
22
+ if (url.includes('.sqlite') || url.includes('.db') || url.startsWith('file:')) {
23
+ return { type: 'sqlite', connectionString: url };
24
+ }
25
+ return null;
26
+ }
27
+ /**
28
+ * Read DATABASE_URL from .env file
29
+ */
30
+ async function getDatabaseUrl(cwd) {
31
+ const envPath = path.join(cwd, '.env');
32
+ if (!await fs.pathExists(envPath)) {
33
+ return null;
34
+ }
35
+ const content = await fs.readFile(envPath, 'utf-8');
36
+ const lines = content.split('\n');
37
+ for (const line of lines) {
38
+ const match = line.match(/^DATABASE_URL\s*=\s*["']?([^"'\s]+)["']?/);
39
+ if (match) {
40
+ return match[1];
41
+ }
42
+ }
43
+ return null;
44
+ }
45
+ /**
46
+ * Check PostgreSQL connectivity
47
+ */
48
+ async function checkPostgresConnection(connectionString) {
49
+ try {
50
+ // Try using psql to check connection
51
+ execSync(`psql "${connectionString}" -c "SELECT 1" 2>&1`, {
52
+ encoding: 'utf-8',
53
+ stdio: ['pipe', 'pipe', 'pipe'],
54
+ timeout: 10000,
55
+ });
56
+ return {
57
+ name: 'PostgreSQL Connection',
58
+ status: 'pass',
59
+ message: 'Successfully connected to PostgreSQL',
60
+ };
61
+ }
62
+ catch (error) {
63
+ // Check if psql is installed
64
+ try {
65
+ execSync('psql --version', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });
66
+ }
67
+ catch {
68
+ return {
69
+ name: 'PostgreSQL Connection',
70
+ status: 'warn',
71
+ message: 'Cannot verify connection (psql not installed)',
72
+ details: 'Install PostgreSQL client tools to enable connection verification',
73
+ fix: 'The connection will be verified when the app starts',
74
+ };
75
+ }
76
+ const errorMessage = error instanceof Error ? error.message : String(error);
77
+ if (errorMessage.includes('connection refused') || errorMessage.includes('ECONNREFUSED')) {
78
+ return {
79
+ name: 'PostgreSQL Connection',
80
+ status: 'fail',
81
+ message: 'PostgreSQL server is not running or unreachable',
82
+ fix: 'Start your PostgreSQL server or check the connection string',
83
+ };
84
+ }
85
+ if (errorMessage.includes('authentication failed') || errorMessage.includes('password')) {
86
+ return {
87
+ name: 'PostgreSQL Connection',
88
+ status: 'fail',
89
+ message: 'PostgreSQL authentication failed',
90
+ fix: 'Check your DATABASE_URL credentials in .env',
91
+ };
92
+ }
93
+ if (errorMessage.includes('does not exist')) {
94
+ return {
95
+ name: 'PostgreSQL Connection',
96
+ status: 'fail',
97
+ message: 'Database does not exist',
98
+ fix: 'Create the database or run migrations: npx prisma migrate dev',
99
+ };
100
+ }
101
+ return {
102
+ name: 'PostgreSQL Connection',
103
+ status: 'fail',
104
+ message: 'Failed to connect to PostgreSQL',
105
+ details: errorMessage.substring(0, 200),
106
+ fix: 'Check your DATABASE_URL in .env',
107
+ };
108
+ }
109
+ }
110
+ /**
111
+ * Check MongoDB connectivity
112
+ */
113
+ async function checkMongoConnection(connectionString) {
114
+ try {
115
+ // Try using mongosh or mongo to check connection
116
+ const mongoCmd = execSync('which mongosh 2>/dev/null || which mongo 2>/dev/null || echo mongosh', {
117
+ encoding: 'utf-8',
118
+ stdio: ['pipe', 'pipe', 'pipe'],
119
+ }).trim();
120
+ execSync(`${mongoCmd} "${connectionString}" --eval "db.runCommand({ping:1})" --quiet 2>&1`, {
121
+ encoding: 'utf-8',
122
+ stdio: ['pipe', 'pipe', 'pipe'],
123
+ timeout: 10000,
124
+ });
125
+ return {
126
+ name: 'MongoDB Connection',
127
+ status: 'pass',
128
+ message: 'Successfully connected to MongoDB',
129
+ };
130
+ }
131
+ catch (error) {
132
+ const errorMessage = error instanceof Error ? error.message : String(error);
133
+ // Check if mongo shell is not installed
134
+ if (errorMessage.includes('not found') || errorMessage.includes('not recognized')) {
135
+ return {
136
+ name: 'MongoDB Connection',
137
+ status: 'warn',
138
+ message: 'Cannot verify connection (mongosh not installed)',
139
+ details: 'Install MongoDB Shell to enable connection verification',
140
+ fix: 'The connection will be verified when the app starts',
141
+ };
142
+ }
143
+ return {
144
+ name: 'MongoDB Connection',
145
+ status: 'fail',
146
+ message: 'Failed to connect to MongoDB',
147
+ details: errorMessage.substring(0, 200),
148
+ fix: 'Check your DATABASE_URL in .env and ensure MongoDB is running',
149
+ };
150
+ }
151
+ }
152
+ /**
153
+ * Check MySQL connectivity
154
+ */
155
+ async function checkMysqlConnection(connectionString) {
156
+ try {
157
+ // Parse connection string
158
+ const url = new URL(connectionString);
159
+ const host = url.hostname;
160
+ const port = url.port || '3306';
161
+ const user = url.username;
162
+ const password = url.password;
163
+ const database = url.pathname.slice(1);
164
+ execSync(`mysql -h ${host} -P ${port} -u ${user} -p${password} ${database} -e "SELECT 1" 2>&1`, {
165
+ encoding: 'utf-8',
166
+ stdio: ['pipe', 'pipe', 'pipe'],
167
+ timeout: 10000,
168
+ });
169
+ return {
170
+ name: 'MySQL Connection',
171
+ status: 'pass',
172
+ message: 'Successfully connected to MySQL',
173
+ };
174
+ }
175
+ catch (error) {
176
+ const errorMessage = error instanceof Error ? error.message : String(error);
177
+ if (errorMessage.includes('not found') || errorMessage.includes('not recognized')) {
178
+ return {
179
+ name: 'MySQL Connection',
180
+ status: 'warn',
181
+ message: 'Cannot verify connection (mysql client not installed)',
182
+ fix: 'The connection will be verified when the app starts',
183
+ };
184
+ }
185
+ return {
186
+ name: 'MySQL Connection',
187
+ status: 'fail',
188
+ message: 'Failed to connect to MySQL',
189
+ details: errorMessage.substring(0, 200),
190
+ fix: 'Check your DATABASE_URL in .env and ensure MySQL is running',
191
+ };
192
+ }
193
+ }
194
+ /**
195
+ * Check SQLite file exists
196
+ */
197
+ async function checkSqliteConnection(connectionString) {
198
+ // Extract file path from connection string
199
+ let dbPath = connectionString.replace(/^file:/, '').replace(/\?.*$/, '');
200
+ // Handle relative paths
201
+ if (!path.isAbsolute(dbPath)) {
202
+ dbPath = path.join(process.cwd(), dbPath);
203
+ }
204
+ if (await fs.pathExists(dbPath)) {
205
+ return {
206
+ name: 'SQLite Database',
207
+ status: 'pass',
208
+ message: 'SQLite database file exists',
209
+ details: dbPath,
210
+ };
211
+ }
212
+ // Check if parent directory exists (database will be created on first run)
213
+ const dbDir = path.dirname(dbPath);
214
+ if (await fs.pathExists(dbDir)) {
215
+ return {
216
+ name: 'SQLite Database',
217
+ status: 'warn',
218
+ message: 'SQLite database file does not exist yet',
219
+ details: 'The file will be created when you run migrations',
220
+ fix: 'Run: npx prisma migrate dev',
221
+ };
222
+ }
223
+ return {
224
+ name: 'SQLite Database',
225
+ status: 'fail',
226
+ message: 'SQLite database directory does not exist',
227
+ fix: 'Create the directory or check the DATABASE_URL path',
228
+ };
229
+ }
230
+ /**
231
+ * Run database connectivity check
232
+ */
233
+ export async function checkDatabaseConnection(cwd) {
234
+ const results = [];
235
+ const databaseUrl = await getDatabaseUrl(cwd);
236
+ if (!databaseUrl) {
237
+ results.push({
238
+ name: 'Database Connection',
239
+ status: 'skip',
240
+ message: 'No DATABASE_URL configured',
241
+ details: 'Set DATABASE_URL in .env to enable database checks',
242
+ });
243
+ return results;
244
+ }
245
+ const dbConfig = parseDatabaseUrl(databaseUrl);
246
+ if (!dbConfig) {
247
+ results.push({
248
+ name: 'Database Connection',
249
+ status: 'warn',
250
+ message: 'Unknown database type in DATABASE_URL',
251
+ details: 'Supported: postgresql, mongodb, mysql, sqlite',
252
+ });
253
+ return results;
254
+ }
255
+ switch (dbConfig.type) {
256
+ case 'postgresql':
257
+ results.push(await checkPostgresConnection(databaseUrl));
258
+ break;
259
+ case 'mongodb':
260
+ results.push(await checkMongoConnection(databaseUrl));
261
+ break;
262
+ case 'mysql':
263
+ results.push(await checkMysqlConnection(databaseUrl));
264
+ break;
265
+ case 'sqlite':
266
+ results.push(await checkSqliteConnection(databaseUrl));
267
+ break;
268
+ }
269
+ return results;
270
+ }
271
+ //# sourceMappingURL=check-database.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"check-database.js","sourceRoot":"","sources":["../../../src/utils/doctor/check-database.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Docker installation and status checks
3
+ */
4
+ import type { CheckResult } from './types.js';
5
+ /**
6
+ * Run all Docker checks
7
+ */
8
+ export declare function runDockerChecks(cwd: string): Promise<CheckResult[]>;