@openbuilder/cli 0.31.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1053 -0
- package/bin/openbuilder.js +31 -0
- package/dist/chunks/Banner-D4tqKfzA.js +113 -0
- package/dist/chunks/Banner-D4tqKfzA.js.map +1 -0
- package/dist/chunks/auto-update-Dj3lWPWO.js +350 -0
- package/dist/chunks/auto-update-Dj3lWPWO.js.map +1 -0
- package/dist/chunks/build-D0qYqIq0.js +116 -0
- package/dist/chunks/build-D0qYqIq0.js.map +1 -0
- package/dist/chunks/cleanup-qVTsA3tk.js +141 -0
- package/dist/chunks/cleanup-qVTsA3tk.js.map +1 -0
- package/dist/chunks/cli-error-BjQwvWtK.js +140 -0
- package/dist/chunks/cli-error-BjQwvWtK.js.map +1 -0
- package/dist/chunks/config-BGP1jZJ4.js +167 -0
- package/dist/chunks/config-BGP1jZJ4.js.map +1 -0
- package/dist/chunks/config-manager-BkbjtN-H.js +133 -0
- package/dist/chunks/config-manager-BkbjtN-H.js.map +1 -0
- package/dist/chunks/database-BvAbD4sP.js +68 -0
- package/dist/chunks/database-BvAbD4sP.js.map +1 -0
- package/dist/chunks/database-setup-BYjIRAmT.js +253 -0
- package/dist/chunks/database-setup-BYjIRAmT.js.map +1 -0
- package/dist/chunks/exports-ij9sv4UM.js +7793 -0
- package/dist/chunks/exports-ij9sv4UM.js.map +1 -0
- package/dist/chunks/init-CZoN6soU.js +468 -0
- package/dist/chunks/init-CZoN6soU.js.map +1 -0
- package/dist/chunks/init-tui-BNzk_7Yx.js +1127 -0
- package/dist/chunks/init-tui-BNzk_7Yx.js.map +1 -0
- package/dist/chunks/logger-ZpJi7chw.js +38 -0
- package/dist/chunks/logger-ZpJi7chw.js.map +1 -0
- package/dist/chunks/main-tui-Cq1hLCx-.js +644 -0
- package/dist/chunks/main-tui-Cq1hLCx-.js.map +1 -0
- package/dist/chunks/manager-CvGX9qqe.js +1161 -0
- package/dist/chunks/manager-CvGX9qqe.js.map +1 -0
- package/dist/chunks/port-allocator-BRFzgH9b.js +749 -0
- package/dist/chunks/port-allocator-BRFzgH9b.js.map +1 -0
- package/dist/chunks/process-killer-CaUL7Kpl.js +87 -0
- package/dist/chunks/process-killer-CaUL7Kpl.js.map +1 -0
- package/dist/chunks/prompts-1QbE_bRr.js +128 -0
- package/dist/chunks/prompts-1QbE_bRr.js.map +1 -0
- package/dist/chunks/repo-cloner-CpOQjFSo.js +219 -0
- package/dist/chunks/repo-cloner-CpOQjFSo.js.map +1 -0
- package/dist/chunks/repo-detector-B_oj696o.js +66 -0
- package/dist/chunks/repo-detector-B_oj696o.js.map +1 -0
- package/dist/chunks/run-D23hg4xy.js +630 -0
- package/dist/chunks/run-D23hg4xy.js.map +1 -0
- package/dist/chunks/runner-logger-instance-nDWv2h2T.js +899 -0
- package/dist/chunks/runner-logger-instance-nDWv2h2T.js.map +1 -0
- package/dist/chunks/spinner-BJL9zWAJ.js +53 -0
- package/dist/chunks/spinner-BJL9zWAJ.js.map +1 -0
- package/dist/chunks/start-BygPCbvw.js +1708 -0
- package/dist/chunks/start-BygPCbvw.js.map +1 -0
- package/dist/chunks/start-traditional-uoLZXdxm.js +255 -0
- package/dist/chunks/start-traditional-uoLZXdxm.js.map +1 -0
- package/dist/chunks/status-cS8YwtUx.js +97 -0
- package/dist/chunks/status-cS8YwtUx.js.map +1 -0
- package/dist/chunks/theme-DhorI2Hb.js +44 -0
- package/dist/chunks/theme-DhorI2Hb.js.map +1 -0
- package/dist/chunks/upgrade-CT6w0lKp.js +323 -0
- package/dist/chunks/upgrade-CT6w0lKp.js.map +1 -0
- package/dist/chunks/useBuildState-CdBSu9y_.js +331 -0
- package/dist/chunks/useBuildState-CdBSu9y_.js.map +1 -0
- package/dist/cli/index.js +694 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.js +14358 -0
- package/dist/index.js.map +1 -0
- package/dist/instrument.js +64226 -0
- package/dist/instrument.js.map +1 -0
- package/dist/templates.json +295 -0
- package/package.json +98 -0
- package/scripts/install-vendor-deps.js +34 -0
- package/scripts/install-vendor.js +167 -0
- package/scripts/prepare-release.js +71 -0
- package/templates/config.template.json +18 -0
- package/templates.json +295 -0
- package/vendor/ai-sdk-provider-claude-code-LOCAL.tgz +0 -0
- package/vendor/sentry-core-LOCAL.tgz +0 -0
- package/vendor/sentry-nextjs-LOCAL.tgz +0 -0
- package/vendor/sentry-node-LOCAL.tgz +0 -0
- package/vendor/sentry-node-core-LOCAL.tgz +0 -0
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
// OpenBuilder CLI - Built with Rollup
|
|
2
|
+
import { spawn } from 'node:child_process';
|
|
3
|
+
import { existsSync } from 'node:fs';
|
|
4
|
+
import * as p from '@clack/prompts';
|
|
5
|
+
import pc from 'picocolors';
|
|
6
|
+
import { c as configManager } from './config-manager-BkbjtN-H.js';
|
|
7
|
+
import { i as isInsideMonorepo } from './repo-detector-B_oj696o.js';
|
|
8
|
+
import { e as errors, C as CLIError } from './cli-error-BjQwvWtK.js';
|
|
9
|
+
import 'conf';
|
|
10
|
+
import 'node:os';
|
|
11
|
+
import 'node:path';
|
|
12
|
+
import 'node:fs/promises';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Build command - rebuild all services without starting them
|
|
16
|
+
* Useful for rebuilding while services are already running
|
|
17
|
+
*/
|
|
18
|
+
async function buildCommand(options) {
|
|
19
|
+
const s = p.spinner();
|
|
20
|
+
// Step 1: Find monorepo
|
|
21
|
+
s.start('Locating OpenBuilder repository');
|
|
22
|
+
let monorepoRoot;
|
|
23
|
+
const config = configManager.get();
|
|
24
|
+
if (config.monorepoPath && existsSync(config.monorepoPath)) {
|
|
25
|
+
monorepoRoot = config.monorepoPath;
|
|
26
|
+
}
|
|
27
|
+
if (!monorepoRoot) {
|
|
28
|
+
const repoCheck = await isInsideMonorepo();
|
|
29
|
+
if (repoCheck.inside && repoCheck.root) {
|
|
30
|
+
monorepoRoot = repoCheck.root;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
if (!monorepoRoot) {
|
|
34
|
+
s.stop(pc.red('✗') + ' Repository not found');
|
|
35
|
+
throw errors.monorepoNotFound([
|
|
36
|
+
config.monorepoPath || 'none',
|
|
37
|
+
process.cwd(),
|
|
38
|
+
]);
|
|
39
|
+
}
|
|
40
|
+
s.stop(pc.green('✓') + ' Repository found');
|
|
41
|
+
// Step 2: Build services
|
|
42
|
+
if (options.watch) {
|
|
43
|
+
console.log();
|
|
44
|
+
console.log(pc.cyan('Building services in watch mode...'));
|
|
45
|
+
console.log(pc.dim('Press Ctrl+C to stop'));
|
|
46
|
+
console.log();
|
|
47
|
+
// Use turbo watch mode
|
|
48
|
+
const watchProcess = spawn('pnpm', ['build:all', '--watch'], {
|
|
49
|
+
cwd: monorepoRoot,
|
|
50
|
+
stdio: 'inherit',
|
|
51
|
+
shell: true,
|
|
52
|
+
});
|
|
53
|
+
// Handle Ctrl+C gracefully
|
|
54
|
+
process.on('SIGINT', () => {
|
|
55
|
+
console.log();
|
|
56
|
+
console.log(pc.yellow('⚠'), 'Stopping watch mode...');
|
|
57
|
+
watchProcess.kill('SIGTERM');
|
|
58
|
+
process.exit(0);
|
|
59
|
+
});
|
|
60
|
+
watchProcess.on('error', (error) => {
|
|
61
|
+
throw new CLIError({
|
|
62
|
+
code: 'BUILD_FAILED',
|
|
63
|
+
message: 'Watch mode failed',
|
|
64
|
+
cause: error,
|
|
65
|
+
suggestions: [
|
|
66
|
+
'Check that all dependencies are installed',
|
|
67
|
+
'Try running: pnpm install',
|
|
68
|
+
],
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
// Wait for process to exit
|
|
72
|
+
await new Promise((resolve) => {
|
|
73
|
+
watchProcess.on('close', () => resolve());
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
s.start('Building all services');
|
|
78
|
+
try {
|
|
79
|
+
await new Promise((resolve, reject) => {
|
|
80
|
+
const buildProcess = spawn('pnpm', ['build:all'], {
|
|
81
|
+
cwd: monorepoRoot,
|
|
82
|
+
stdio: 'inherit', // Show build output
|
|
83
|
+
shell: true,
|
|
84
|
+
});
|
|
85
|
+
buildProcess.on('close', (code) => {
|
|
86
|
+
if (code === 0) {
|
|
87
|
+
resolve();
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
reject(new Error(`Build failed with code ${code}`));
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
buildProcess.on('error', reject);
|
|
94
|
+
});
|
|
95
|
+
s.stop(pc.green('✓') + ' Build complete');
|
|
96
|
+
console.log();
|
|
97
|
+
console.log(pc.dim('Tip: Restart services to use the new build'));
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
s.stop(pc.red('✗') + ' Build failed');
|
|
101
|
+
throw new CLIError({
|
|
102
|
+
code: 'BUILD_FAILED',
|
|
103
|
+
message: 'Failed to build services',
|
|
104
|
+
cause: error instanceof Error ? error : new Error(String(error)),
|
|
105
|
+
suggestions: [
|
|
106
|
+
'Check that all dependencies are installed',
|
|
107
|
+
'Try running: pnpm install',
|
|
108
|
+
'Check for TypeScript errors in your code',
|
|
109
|
+
],
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export { buildCommand };
|
|
116
|
+
//# sourceMappingURL=build-D0qYqIq0.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"build-D0qYqIq0.js","sources":["../../src/cli/commands/build.ts"],"sourcesContent":["/**\n * Build command - rebuild all services without starting them\n * Useful for rebuilding while services are already running\n */\n\nimport { spawn } from 'node:child_process';\nimport { existsSync } from 'node:fs';\nimport * as p from '@clack/prompts';\nimport pc from 'picocolors';\nimport { configManager } from '../utils/config-manager.js';\nimport { isInsideMonorepo } from '../utils/repo-detector.js';\nimport { CLIError, errors } from '../utils/cli-error.js';\n\ninterface BuildOptions {\n watch?: boolean; // Watch mode for continuous rebuilds\n}\n\nexport async function buildCommand(options: BuildOptions) {\n const s = p.spinner();\n\n // Step 1: Find monorepo\n s.start('Locating OpenBuilder repository');\n\n let monorepoRoot: string | undefined;\n const config = configManager.get();\n\n if (config.monorepoPath && existsSync(config.monorepoPath)) {\n monorepoRoot = config.monorepoPath;\n }\n\n if (!monorepoRoot) {\n const repoCheck = await isInsideMonorepo();\n if (repoCheck.inside && repoCheck.root) {\n monorepoRoot = repoCheck.root;\n }\n }\n\n if (!monorepoRoot) {\n s.stop(pc.red('✗') + ' Repository not found');\n throw errors.monorepoNotFound([\n config.monorepoPath || 'none',\n process.cwd(),\n ]);\n }\n\n s.stop(pc.green('✓') + ' Repository found');\n\n // Step 2: Build services\n if (options.watch) {\n console.log();\n console.log(pc.cyan('Building services in watch mode...'));\n console.log(pc.dim('Press Ctrl+C to stop'));\n console.log();\n\n // Use turbo watch mode\n const watchProcess = spawn('pnpm', ['build:all', '--watch'], {\n cwd: monorepoRoot,\n stdio: 'inherit',\n shell: true,\n });\n\n // Handle Ctrl+C gracefully\n process.on('SIGINT', () => {\n console.log();\n console.log(pc.yellow('⚠'), 'Stopping watch mode...');\n watchProcess.kill('SIGTERM');\n process.exit(0);\n });\n\n watchProcess.on('error', (error) => {\n throw new CLIError({\n code: 'BUILD_FAILED',\n message: 'Watch mode failed',\n cause: error,\n suggestions: [\n 'Check that all dependencies are installed',\n 'Try running: pnpm install',\n ],\n });\n });\n\n // Wait for process to exit\n await new Promise<void>((resolve) => {\n watchProcess.on('close', () => resolve());\n });\n } else {\n s.start('Building all services');\n\n try {\n await new Promise<void>((resolve, reject) => {\n const buildProcess = spawn('pnpm', ['build:all'], {\n cwd: monorepoRoot,\n stdio: 'inherit', // Show build output\n shell: true,\n });\n\n buildProcess.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Build failed with code ${code}`));\n }\n });\n\n buildProcess.on('error', reject);\n });\n\n s.stop(pc.green('✓') + ' Build complete');\n\n console.log();\n console.log(pc.dim('Tip: Restart services to use the new build'));\n } catch (error) {\n s.stop(pc.red('✗') + ' Build failed');\n throw new CLIError({\n code: 'BUILD_FAILED',\n message: 'Failed to build services',\n cause: error instanceof Error ? error : new Error(String(error)),\n suggestions: [\n 'Check that all dependencies are installed',\n 'Try running: pnpm install',\n 'Check for TypeScript errors in your code',\n ],\n });\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
// OpenBuilder CLI - Built with Rollup
|
|
2
|
+
import { stat, rm, readdir } from 'node:fs/promises';
|
|
3
|
+
import { existsSync } from 'node:fs';
|
|
4
|
+
import { join } from 'node:path';
|
|
5
|
+
import chalk from 'chalk';
|
|
6
|
+
import { l as logger } from './logger-ZpJi7chw.js';
|
|
7
|
+
import { p as prompts } from './prompts-1QbE_bRr.js';
|
|
8
|
+
import { c as configManager } from './config-manager-BkbjtN-H.js';
|
|
9
|
+
import { s as spinner } from './spinner-BJL9zWAJ.js';
|
|
10
|
+
import 'inquirer';
|
|
11
|
+
import 'node:os';
|
|
12
|
+
import 'conf';
|
|
13
|
+
import 'ora';
|
|
14
|
+
|
|
15
|
+
async function cleanupCommand(options) {
|
|
16
|
+
const config = configManager.get();
|
|
17
|
+
const workspace = config.workspace;
|
|
18
|
+
if (!workspace || !existsSync(workspace)) {
|
|
19
|
+
logger.error('Workspace not found');
|
|
20
|
+
logger.info(`Expected: ${workspace}`);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
// Handle specific cleanup actions
|
|
24
|
+
if (options.project) {
|
|
25
|
+
await cleanupProject(workspace, options.project);
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
if (options.all) {
|
|
29
|
+
await cleanupAllProjects(workspace);
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
if (options.tunnels) {
|
|
33
|
+
logger.warn('Tunnel cleanup requires the runner to be running');
|
|
34
|
+
logger.info('Tunnels are managed by the active runner process');
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (options.processes) {
|
|
38
|
+
logger.warn('Process cleanup requires the runner to be running');
|
|
39
|
+
logger.info('Dev servers are managed by the active runner process');
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
// No specific action - show help
|
|
43
|
+
logger.info('Cleanup options:');
|
|
44
|
+
logger.log(` ${chalk.cyan('--project <slug>')} Delete specific project`);
|
|
45
|
+
logger.log(` ${chalk.cyan('--all')} Delete all projects`);
|
|
46
|
+
logger.log(` ${chalk.cyan('--tunnels')} Close all tunnels (requires running runner)`);
|
|
47
|
+
logger.log(` ${chalk.cyan('--processes')} Kill all dev servers (requires running runner)`);
|
|
48
|
+
logger.log('');
|
|
49
|
+
logger.info('Examples:');
|
|
50
|
+
logger.log(` openbuilder cleanup --project my-project`);
|
|
51
|
+
logger.log(` openbuilder cleanup --all`);
|
|
52
|
+
}
|
|
53
|
+
async function cleanupProject(workspace, slug) {
|
|
54
|
+
const projectPath = join(workspace, slug);
|
|
55
|
+
if (!existsSync(projectPath)) {
|
|
56
|
+
logger.error(`Project not found: ${slug}`);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
// Get project size
|
|
60
|
+
let size = 'unknown';
|
|
61
|
+
try {
|
|
62
|
+
const stats = await stat(projectPath);
|
|
63
|
+
if (stats.isDirectory()) {
|
|
64
|
+
// Estimate size (this is approximate)
|
|
65
|
+
size = `${Math.round(stats.size / 1024)}KB+`;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
// Ignore size calculation errors
|
|
70
|
+
}
|
|
71
|
+
logger.warn(`This will permanently delete project: ${chalk.cyan(slug)}`);
|
|
72
|
+
logger.log(`Path: ${projectPath}`);
|
|
73
|
+
logger.log(`Size: ${size}`);
|
|
74
|
+
logger.log('');
|
|
75
|
+
const confirmed = await prompts.confirm('Are you sure?', false);
|
|
76
|
+
if (!confirmed) {
|
|
77
|
+
logger.info('Cleanup cancelled');
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
spinner.start(`Deleting project: ${slug}`);
|
|
81
|
+
try {
|
|
82
|
+
await rm(projectPath, { recursive: true, force: true, maxRetries: 3 });
|
|
83
|
+
spinner.succeed(`Deleted project: ${chalk.cyan(slug)}`);
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
spinner.fail('Failed to delete project');
|
|
87
|
+
logger.error(error instanceof Error ? error.message : 'Unknown error');
|
|
88
|
+
process.exit(1);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async function cleanupAllProjects(workspace) {
|
|
92
|
+
logger.warn(`This will permanently delete ALL projects in workspace`);
|
|
93
|
+
logger.log(`Workspace: ${workspace}`);
|
|
94
|
+
logger.log('');
|
|
95
|
+
// List projects
|
|
96
|
+
const entries = await readdir(workspace);
|
|
97
|
+
const projects = [];
|
|
98
|
+
for (const entry of entries) {
|
|
99
|
+
const entryPath = join(workspace, entry);
|
|
100
|
+
const stats = await stat(entryPath);
|
|
101
|
+
if (stats.isDirectory()) {
|
|
102
|
+
projects.push(entry);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (projects.length === 0) {
|
|
106
|
+
logger.info('No projects found to delete');
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
logger.log(`Found ${projects.length} project(s):`);
|
|
110
|
+
projects.forEach(p => logger.log(` - ${p}`));
|
|
111
|
+
logger.log('');
|
|
112
|
+
const confirmed = await prompts.confirm(`Delete all ${projects.length} projects?`, false);
|
|
113
|
+
if (!confirmed) {
|
|
114
|
+
logger.info('Cleanup cancelled');
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
spinner.start(`Deleting ${projects.length} projects...`);
|
|
118
|
+
let deleted = 0;
|
|
119
|
+
const errors = [];
|
|
120
|
+
for (const project of projects) {
|
|
121
|
+
try {
|
|
122
|
+
await rm(join(workspace, project), { recursive: true, force: true, maxRetries: 3 });
|
|
123
|
+
deleted++;
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
errors.push(`${project}: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (errors.length === 0) {
|
|
130
|
+
spinner.succeed(`Deleted ${deleted} projects`);
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
spinner.warn(`Deleted ${deleted}/${projects.length} projects`);
|
|
134
|
+
logger.log('');
|
|
135
|
+
logger.error('Errors:');
|
|
136
|
+
errors.forEach(err => logger.error(` ${err}`));
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
export { cleanupCommand };
|
|
141
|
+
//# sourceMappingURL=cleanup-qVTsA3tk.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanup-qVTsA3tk.js","sources":["../../src/cli/commands/cleanup.ts"],"sourcesContent":["import { rm, readdir, stat } from 'node:fs/promises';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\nimport chalk from 'chalk';\nimport { logger } from '../utils/logger.js';\nimport { prompts } from '../utils/prompts.js';\nimport { configManager } from '../utils/config-manager.js';\nimport { spinner } from '../utils/spinner.js';\n\ninterface CleanupOptions {\n project?: string;\n all?: boolean;\n tunnels?: boolean;\n processes?: boolean;\n}\n\nexport async function cleanupCommand(options: CleanupOptions) {\n const config = configManager.get();\n const workspace = config.workspace;\n\n if (!workspace || !existsSync(workspace)) {\n logger.error('Workspace not found');\n logger.info(`Expected: ${workspace}`);\n return;\n }\n\n // Handle specific cleanup actions\n if (options.project) {\n await cleanupProject(workspace, options.project);\n return;\n }\n\n if (options.all) {\n await cleanupAllProjects(workspace);\n return;\n }\n\n if (options.tunnels) {\n logger.warn('Tunnel cleanup requires the runner to be running');\n logger.info('Tunnels are managed by the active runner process');\n return;\n }\n\n if (options.processes) {\n logger.warn('Process cleanup requires the runner to be running');\n logger.info('Dev servers are managed by the active runner process');\n return;\n }\n\n // No specific action - show help\n logger.info('Cleanup options:');\n logger.log(` ${chalk.cyan('--project <slug>')} Delete specific project`);\n logger.log(` ${chalk.cyan('--all')} Delete all projects`);\n logger.log(` ${chalk.cyan('--tunnels')} Close all tunnels (requires running runner)`);\n logger.log(` ${chalk.cyan('--processes')} Kill all dev servers (requires running runner)`);\n logger.log('');\n logger.info('Examples:');\n logger.log(` openbuilder cleanup --project my-project`);\n logger.log(` openbuilder cleanup --all`);\n}\n\nasync function cleanupProject(workspace: string, slug: string) {\n const projectPath = join(workspace, slug);\n\n if (!existsSync(projectPath)) {\n logger.error(`Project not found: ${slug}`);\n return;\n }\n\n // Get project size\n let size = 'unknown';\n try {\n const stats = await stat(projectPath);\n if (stats.isDirectory()) {\n // Estimate size (this is approximate)\n size = `${Math.round(stats.size / 1024)}KB+`;\n }\n } catch {\n // Ignore size calculation errors\n }\n\n logger.warn(`This will permanently delete project: ${chalk.cyan(slug)}`);\n logger.log(`Path: ${projectPath}`);\n logger.log(`Size: ${size}`);\n logger.log('');\n\n const confirmed = await prompts.confirm('Are you sure?', false);\n\n if (!confirmed) {\n logger.info('Cleanup cancelled');\n return;\n }\n\n spinner.start(`Deleting project: ${slug}`);\n\n try {\n await rm(projectPath, { recursive: true, force: true, maxRetries: 3 });\n spinner.succeed(`Deleted project: ${chalk.cyan(slug)}`);\n } catch (error) {\n spinner.fail('Failed to delete project');\n logger.error(error instanceof Error ? error.message : 'Unknown error');\n process.exit(1);\n }\n}\n\nasync function cleanupAllProjects(workspace: string) {\n logger.warn(`This will permanently delete ALL projects in workspace`);\n logger.log(`Workspace: ${workspace}`);\n logger.log('');\n\n // List projects\n const entries = await readdir(workspace);\n const projects = [];\n\n for (const entry of entries) {\n const entryPath = join(workspace, entry);\n const stats = await stat(entryPath);\n if (stats.isDirectory()) {\n projects.push(entry);\n }\n }\n\n if (projects.length === 0) {\n logger.info('No projects found to delete');\n return;\n }\n\n logger.log(`Found ${projects.length} project(s):`);\n projects.forEach(p => logger.log(` - ${p}`));\n logger.log('');\n\n const confirmed = await prompts.confirm(\n `Delete all ${projects.length} projects?`,\n false\n );\n\n if (!confirmed) {\n logger.info('Cleanup cancelled');\n return;\n }\n\n spinner.start(`Deleting ${projects.length} projects...`);\n\n let deleted = 0;\n const errors: string[] = [];\n\n for (const project of projects) {\n try {\n await rm(join(workspace, project), { recursive: true, force: true, maxRetries: 3 });\n deleted++;\n } catch (error) {\n errors.push(`${project}: ${error instanceof Error ? error.message : 'Unknown error'}`);\n }\n }\n\n if (errors.length === 0) {\n spinner.succeed(`Deleted ${deleted} projects`);\n } else {\n spinner.warn(`Deleted ${deleted}/${projects.length} projects`);\n logger.log('');\n logger.error('Errors:');\n errors.forEach(err => logger.error(` ${err}`));\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
// OpenBuilder CLI - Built with Rollup
|
|
2
|
+
/**
|
|
3
|
+
* CLI Error handling with context and actionable suggestions
|
|
4
|
+
* Replaces scattered process.exit() calls throughout the codebase
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Custom error class for CLI operations
|
|
8
|
+
* Provides context, suggestions, and proper exit codes
|
|
9
|
+
*/
|
|
10
|
+
class CLIError extends Error {
|
|
11
|
+
constructor(options) {
|
|
12
|
+
super(options.message);
|
|
13
|
+
this.name = 'CLIError';
|
|
14
|
+
this.code = options.code;
|
|
15
|
+
this.context = options.context;
|
|
16
|
+
this.suggestions = options.suggestions || [];
|
|
17
|
+
this.fatal = options.fatal !== false; // Default true
|
|
18
|
+
this.cause = options.cause;
|
|
19
|
+
this.docs = options.docs;
|
|
20
|
+
// Maintains proper stack trace for where error was thrown
|
|
21
|
+
Error.captureStackTrace(this, this.constructor);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Get exit code based on error type
|
|
25
|
+
*/
|
|
26
|
+
getExitCode() {
|
|
27
|
+
// Map error codes to exit codes
|
|
28
|
+
const exitCodes = {
|
|
29
|
+
'CONFIG_INVALID': 78, // EX_CONFIG
|
|
30
|
+
'CONFIG_NOT_FOUND': 78,
|
|
31
|
+
'PERMISSION_DENIED': 77, // EX_NOPERM
|
|
32
|
+
'INVALID_ARGUMENT': 64, // EX_USAGE
|
|
33
|
+
'DB_CONNECTION_FAILED': 69, // EX_UNAVAILABLE
|
|
34
|
+
'BROKER_CONNECTION_FAILED': 69,
|
|
35
|
+
'PORT_IN_USE': 69,
|
|
36
|
+
};
|
|
37
|
+
return exitCodes[this.code] || 1; // Default generic error
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Common error factory functions
|
|
42
|
+
* Use these instead of throwing raw CLIError
|
|
43
|
+
*/
|
|
44
|
+
const errors = {
|
|
45
|
+
portInUse: (port, process) => {
|
|
46
|
+
return new CLIError({
|
|
47
|
+
code: 'PORT_IN_USE',
|
|
48
|
+
message: `Port ${port} is already in use`,
|
|
49
|
+
context: { port, process },
|
|
50
|
+
suggestions: [
|
|
51
|
+
`Stop the existing process: lsof -ti:${port} | xargs kill`,
|
|
52
|
+
`Or let OpenBuilder kill it: openbuilder run --force`,
|
|
53
|
+
process ? `The port is being used by: ${process}` : 'Check what process is using the port: lsof -i:' + port,
|
|
54
|
+
],
|
|
55
|
+
});
|
|
56
|
+
},
|
|
57
|
+
databaseConnectionFailed: (url, cause) => {
|
|
58
|
+
// Parse URL to get host (safely)
|
|
59
|
+
let host = 'database server';
|
|
60
|
+
try {
|
|
61
|
+
const parsed = new URL(url);
|
|
62
|
+
host = parsed.host;
|
|
63
|
+
}
|
|
64
|
+
catch {
|
|
65
|
+
// URL might be invalid
|
|
66
|
+
}
|
|
67
|
+
return new CLIError({
|
|
68
|
+
code: 'DB_CONNECTION_FAILED',
|
|
69
|
+
message: 'Could not connect to database',
|
|
70
|
+
context: { host, error: cause.message },
|
|
71
|
+
cause,
|
|
72
|
+
suggestions: [
|
|
73
|
+
'Verify your connection string: openbuilder config get databaseUrl',
|
|
74
|
+
'Test the connection manually: psql <connection-string>',
|
|
75
|
+
'Reset database setup: openbuilder db setup --force',
|
|
76
|
+
],
|
|
77
|
+
docs: 'https://github.com/codyde/openbuilder#database-setup',
|
|
78
|
+
});
|
|
79
|
+
},
|
|
80
|
+
monorepoNotFound: (searchedPaths) => {
|
|
81
|
+
return new CLIError({
|
|
82
|
+
code: 'MONOREPO_NOT_FOUND',
|
|
83
|
+
message: 'OpenBuilder monorepo not found',
|
|
84
|
+
context: { searchedPaths },
|
|
85
|
+
suggestions: [
|
|
86
|
+
'Run initialization: openbuilder init',
|
|
87
|
+
'Or specify path: openbuilder run --monorepo ~/openbuilder',
|
|
88
|
+
],
|
|
89
|
+
});
|
|
90
|
+
},
|
|
91
|
+
configNotFound: () => {
|
|
92
|
+
return new CLIError({
|
|
93
|
+
code: 'CONFIG_NOT_FOUND',
|
|
94
|
+
message: 'Configuration not found',
|
|
95
|
+
suggestions: [
|
|
96
|
+
'Initialize OpenBuilder: openbuilder init',
|
|
97
|
+
'This will create your configuration file',
|
|
98
|
+
],
|
|
99
|
+
docs: 'https://github.com/codyde/openbuilder#getting-started',
|
|
100
|
+
});
|
|
101
|
+
},
|
|
102
|
+
workspaceNotFound: (path) => {
|
|
103
|
+
return new CLIError({
|
|
104
|
+
code: 'WORKSPACE_NOT_FOUND',
|
|
105
|
+
message: `Workspace directory does not exist: ${path}`,
|
|
106
|
+
context: { path },
|
|
107
|
+
suggestions: [
|
|
108
|
+
'Create the directory: mkdir -p ' + path,
|
|
109
|
+
'Or reconfigure workspace: openbuilder config set workspace <path>',
|
|
110
|
+
'Or re-run init: openbuilder init',
|
|
111
|
+
],
|
|
112
|
+
});
|
|
113
|
+
},
|
|
114
|
+
serviceStartFailed: (service, cause) => {
|
|
115
|
+
return new CLIError({
|
|
116
|
+
code: 'SERVICE_START_FAILED',
|
|
117
|
+
message: `Failed to start ${service}`,
|
|
118
|
+
context: { service },
|
|
119
|
+
cause,
|
|
120
|
+
suggestions: [
|
|
121
|
+
'Check if dependencies are installed: cd ~/.openbuilder-monorepo && pnpm install',
|
|
122
|
+
'Check if ports are available: lsof -i:3000 -i:4000',
|
|
123
|
+
'Try restarting: openbuilder run --force',
|
|
124
|
+
],
|
|
125
|
+
});
|
|
126
|
+
},
|
|
127
|
+
invalidArgument: (arg, reason) => {
|
|
128
|
+
return new CLIError({
|
|
129
|
+
code: 'INVALID_ARGUMENT',
|
|
130
|
+
message: `Invalid argument: ${arg}`,
|
|
131
|
+
context: { argument: arg, reason },
|
|
132
|
+
suggestions: [
|
|
133
|
+
'Check the command usage: openbuilder --help',
|
|
134
|
+
],
|
|
135
|
+
});
|
|
136
|
+
},
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
export { CLIError as C, errors as e };
|
|
140
|
+
//# sourceMappingURL=cli-error-BjQwvWtK.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-error-BjQwvWtK.js","sources":["../../src/cli/utils/cli-error.ts"],"sourcesContent":["/**\n * CLI Error handling with context and actionable suggestions\n * Replaces scattered process.exit() calls throughout the codebase\n */\n\nexport type ErrorCode =\n // Initialization errors\n | 'INIT_FAILED'\n | 'MONOREPO_NOT_FOUND'\n | 'MONOREPO_CLONE_FAILED'\n | 'DEPENDENCIES_INSTALL_FAILED'\n | 'BUILD_FAILED'\n\n // Configuration errors\n | 'CONFIG_INVALID'\n | 'CONFIG_NOT_FOUND'\n | 'WORKSPACE_NOT_FOUND'\n | 'WORKSPACE_CREATE_FAILED'\n\n // Database errors\n | 'DB_CONNECTION_FAILED'\n | 'DB_MIGRATION_FAILED'\n | 'DB_URL_INVALID'\n\n // Network/Port errors\n | 'PORT_IN_USE'\n | 'BROKER_CONNECTION_FAILED'\n | 'TUNNEL_CREATION_FAILED'\n\n // Runtime errors\n | 'SERVICE_START_FAILED'\n | 'SERVICE_CRASHED'\n | 'PROCESS_KILL_FAILED'\n\n // User errors\n | 'INVALID_ARGUMENT'\n | 'MISSING_REQUIRED_CONFIG'\n | 'PERMISSION_DENIED'\n\n // Upgrade errors\n | 'UPGRADE_NOT_IN_REPO'\n | 'UPGRADE_CLONE_FAILED'\n | 'UPGRADE_INSTALL_FAILED'\n | 'UPGRADE_BUILD_FAILED'\n\n // Unknown\n | 'UNKNOWN_ERROR';\n\nexport interface CLIErrorOptions {\n code: ErrorCode;\n message: string;\n context?: Record<string, unknown>;\n suggestions?: string[];\n fatal?: boolean;\n cause?: Error;\n docs?: string; // Link to documentation\n}\n\n/**\n * Custom error class for CLI operations\n * Provides context, suggestions, and proper exit codes\n */\nexport class CLIError extends Error {\n public readonly code: ErrorCode;\n public readonly context?: Record<string, unknown>;\n public readonly suggestions: string[];\n public readonly fatal: boolean;\n public readonly cause?: Error;\n public readonly docs?: string;\n\n constructor(options: CLIErrorOptions) {\n super(options.message);\n this.name = 'CLIError';\n this.code = options.code;\n this.context = options.context;\n this.suggestions = options.suggestions || [];\n this.fatal = options.fatal !== false; // Default true\n this.cause = options.cause;\n this.docs = options.docs;\n\n // Maintains proper stack trace for where error was thrown\n Error.captureStackTrace(this, this.constructor);\n }\n\n /**\n * Get exit code based on error type\n */\n getExitCode(): number {\n // Map error codes to exit codes\n const exitCodes: Partial<Record<ErrorCode, number>> = {\n 'CONFIG_INVALID': 78, // EX_CONFIG\n 'CONFIG_NOT_FOUND': 78,\n 'PERMISSION_DENIED': 77, // EX_NOPERM\n 'INVALID_ARGUMENT': 64, // EX_USAGE\n 'DB_CONNECTION_FAILED': 69, // EX_UNAVAILABLE\n 'BROKER_CONNECTION_FAILED': 69,\n 'PORT_IN_USE': 69,\n };\n\n return exitCodes[this.code] || 1; // Default generic error\n }\n}\n\n/**\n * Common error factory functions\n * Use these instead of throwing raw CLIError\n */\nexport const errors = {\n portInUse: (port: number, process?: string): CLIError => {\n return new CLIError({\n code: 'PORT_IN_USE',\n message: `Port ${port} is already in use`,\n context: { port, process },\n suggestions: [\n `Stop the existing process: lsof -ti:${port} | xargs kill`,\n `Or let OpenBuilder kill it: openbuilder run --force`,\n process ? `The port is being used by: ${process}` : 'Check what process is using the port: lsof -i:' + port,\n ],\n });\n },\n\n databaseConnectionFailed: (url: string, cause: Error): CLIError => {\n // Parse URL to get host (safely)\n let host = 'database server';\n try {\n const parsed = new URL(url);\n host = parsed.host;\n } catch {\n // URL might be invalid\n }\n\n return new CLIError({\n code: 'DB_CONNECTION_FAILED',\n message: 'Could not connect to database',\n context: { host, error: cause.message },\n cause,\n suggestions: [\n 'Verify your connection string: openbuilder config get databaseUrl',\n 'Test the connection manually: psql <connection-string>',\n 'Reset database setup: openbuilder db setup --force',\n ],\n docs: 'https://github.com/codyde/openbuilder#database-setup',\n });\n },\n\n monorepoNotFound: (searchedPaths: string[]): CLIError => {\n return new CLIError({\n code: 'MONOREPO_NOT_FOUND',\n message: 'OpenBuilder monorepo not found',\n context: { searchedPaths },\n suggestions: [\n 'Run initialization: openbuilder init',\n 'Or specify path: openbuilder run --monorepo ~/openbuilder',\n ],\n });\n },\n\n configNotFound: (): CLIError => {\n return new CLIError({\n code: 'CONFIG_NOT_FOUND',\n message: 'Configuration not found',\n suggestions: [\n 'Initialize OpenBuilder: openbuilder init',\n 'This will create your configuration file',\n ],\n docs: 'https://github.com/codyde/openbuilder#getting-started',\n });\n },\n\n workspaceNotFound: (path: string): CLIError => {\n return new CLIError({\n code: 'WORKSPACE_NOT_FOUND',\n message: `Workspace directory does not exist: ${path}`,\n context: { path },\n suggestions: [\n 'Create the directory: mkdir -p ' + path,\n 'Or reconfigure workspace: openbuilder config set workspace <path>',\n 'Or re-run init: openbuilder init',\n ],\n });\n },\n\n serviceStartFailed: (service: string, cause: Error): CLIError => {\n return new CLIError({\n code: 'SERVICE_START_FAILED',\n message: `Failed to start ${service}`,\n context: { service },\n cause,\n suggestions: [\n 'Check if dependencies are installed: cd ~/.openbuilder-monorepo && pnpm install',\n 'Check if ports are available: lsof -i:3000 -i:4000',\n 'Try restarting: openbuilder run --force',\n ],\n });\n },\n\n invalidArgument: (arg: string, reason: string): CLIError => {\n return new CLIError({\n code: 'INVALID_ARGUMENT',\n message: `Invalid argument: ${arg}`,\n context: { argument: arg, reason },\n suggestions: [\n 'Check the command usage: openbuilder --help',\n ],\n });\n },\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
// OpenBuilder CLI - Built with Rollup
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
import { l as logger } from './logger-ZpJi7chw.js';
|
|
4
|
+
import { c as configManager } from './config-manager-BkbjtN-H.js';
|
|
5
|
+
import { p as prompts } from './prompts-1QbE_bRr.js';
|
|
6
|
+
import 'conf';
|
|
7
|
+
import 'node:os';
|
|
8
|
+
import 'node:path';
|
|
9
|
+
import 'node:fs';
|
|
10
|
+
import 'inquirer';
|
|
11
|
+
|
|
12
|
+
async function configCommand(action, key, value) {
|
|
13
|
+
switch (action) {
|
|
14
|
+
case 'get':
|
|
15
|
+
if (!key) {
|
|
16
|
+
logger.error('Key is required for get action');
|
|
17
|
+
logger.info('Usage: openbuilder config get <key>');
|
|
18
|
+
process.exit(1);
|
|
19
|
+
}
|
|
20
|
+
handleGet(key);
|
|
21
|
+
break;
|
|
22
|
+
case 'set':
|
|
23
|
+
if (!key || !value) {
|
|
24
|
+
logger.error('Key and value are required for set action');
|
|
25
|
+
logger.info('Usage: openbuilder config set <key> <value>');
|
|
26
|
+
process.exit(1);
|
|
27
|
+
}
|
|
28
|
+
handleSet(key, value);
|
|
29
|
+
break;
|
|
30
|
+
case 'list':
|
|
31
|
+
handleList();
|
|
32
|
+
break;
|
|
33
|
+
case 'path':
|
|
34
|
+
handlePath();
|
|
35
|
+
break;
|
|
36
|
+
case 'validate':
|
|
37
|
+
handleValidate();
|
|
38
|
+
break;
|
|
39
|
+
case 'reset':
|
|
40
|
+
await handleReset();
|
|
41
|
+
break;
|
|
42
|
+
default:
|
|
43
|
+
logger.error(`Unknown action: ${action}`);
|
|
44
|
+
logger.info('Available actions: get, set, list, path, validate, reset');
|
|
45
|
+
process.exit(1);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function handleGet(key) {
|
|
49
|
+
try {
|
|
50
|
+
const value = configManager.get(key);
|
|
51
|
+
if (value === undefined) {
|
|
52
|
+
logger.warn(`Key not found: ${key}`);
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
if (typeof value === 'object') {
|
|
56
|
+
logger.log(JSON.stringify(value, null, 2));
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
logger.log(String(value));
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
logger.error('Failed to get config value');
|
|
64
|
+
logger.error(error instanceof Error ? error.message : 'Unknown error');
|
|
65
|
+
process.exit(1);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
function handleSet(key, value) {
|
|
69
|
+
try {
|
|
70
|
+
// Try to parse as JSON for objects/arrays
|
|
71
|
+
let parsedValue = value;
|
|
72
|
+
if (value.startsWith('{') || value.startsWith('[')) {
|
|
73
|
+
try {
|
|
74
|
+
parsedValue = JSON.parse(value);
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// Keep as string if not valid JSON
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
configManager.set(key, parsedValue);
|
|
81
|
+
logger.success(`Set ${chalk.cyan(key)} = ${chalk.green(value)}`);
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
logger.error('Failed to set config value');
|
|
85
|
+
logger.error(error instanceof Error ? error.message : 'Unknown error');
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
function handleList() {
|
|
90
|
+
const config = configManager.get();
|
|
91
|
+
logger.section('Current Configuration');
|
|
92
|
+
logger.log('');
|
|
93
|
+
// Workspace
|
|
94
|
+
logger.info(`${chalk.bold('Workspace:')}`);
|
|
95
|
+
logger.log(` ${config.workspace}`);
|
|
96
|
+
logger.log('');
|
|
97
|
+
// API
|
|
98
|
+
logger.info(`${chalk.bold('API:')}`);
|
|
99
|
+
logger.log(` URL: ${config.apiUrl || 'not set'}`);
|
|
100
|
+
logger.log('');
|
|
101
|
+
// Broker
|
|
102
|
+
logger.info(`${chalk.bold('Broker:')}`);
|
|
103
|
+
logger.log(` WebSocket URL: ${config.broker?.url || 'not set'}`);
|
|
104
|
+
logger.log(` HTTP URL: ${config.broker?.httpUrl || 'not set'}`);
|
|
105
|
+
logger.log(` Secret: ${config.broker?.secret ? '***' : 'not set'}`);
|
|
106
|
+
logger.log('');
|
|
107
|
+
// Runner
|
|
108
|
+
logger.info(`${chalk.bold('Runner:')}`);
|
|
109
|
+
logger.log(` ID: ${config.runner?.id || 'not set'}`);
|
|
110
|
+
logger.log(` Reconnect Attempts: ${config.runner?.reconnectAttempts || 5}`);
|
|
111
|
+
logger.log(` Heartbeat Interval: ${config.runner?.heartbeatInterval || 15000}ms`);
|
|
112
|
+
logger.log('');
|
|
113
|
+
// Database
|
|
114
|
+
if (config.databaseUrl) {
|
|
115
|
+
logger.info(`${chalk.bold('Database:')}`);
|
|
116
|
+
logger.log(` URL: ${config.databaseUrl.replace(/:[^:@]+@/, ':***@')}`); // Mask password
|
|
117
|
+
logger.log('');
|
|
118
|
+
}
|
|
119
|
+
// Monorepo
|
|
120
|
+
if (config.monorepoPath) {
|
|
121
|
+
logger.info(`${chalk.bold('Monorepo:')}`);
|
|
122
|
+
logger.log(` Path: ${config.monorepoPath}`);
|
|
123
|
+
logger.log('');
|
|
124
|
+
}
|
|
125
|
+
// Tunnel
|
|
126
|
+
if (config.tunnel) {
|
|
127
|
+
logger.info(`${chalk.bold('Tunnel:')}`);
|
|
128
|
+
logger.log(` Provider: ${config.tunnel.provider}`);
|
|
129
|
+
logger.log(` Auto Create: ${config.tunnel.autoCreate}`);
|
|
130
|
+
logger.log('');
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
function handlePath() {
|
|
134
|
+
logger.info(`Config file: ${chalk.cyan(configManager.path)}`);
|
|
135
|
+
}
|
|
136
|
+
function handleValidate() {
|
|
137
|
+
const validation = configManager.validate();
|
|
138
|
+
if (validation.valid) {
|
|
139
|
+
logger.success('Configuration is valid');
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
logger.error('Configuration validation failed:');
|
|
143
|
+
validation.errors.forEach((err) => logger.error(` - ${err}`));
|
|
144
|
+
process.exit(1);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
async function handleReset() {
|
|
148
|
+
logger.warn('This will delete all configuration and reset to defaults');
|
|
149
|
+
const confirmed = await prompts.confirm('Are you sure?', false);
|
|
150
|
+
if (!confirmed) {
|
|
151
|
+
logger.info('Reset cancelled');
|
|
152
|
+
return;
|
|
153
|
+
}
|
|
154
|
+
try {
|
|
155
|
+
configManager.reset();
|
|
156
|
+
logger.success('Configuration reset to defaults');
|
|
157
|
+
logger.info('Run "openbuilder init" to reconfigure');
|
|
158
|
+
}
|
|
159
|
+
catch (error) {
|
|
160
|
+
logger.error('Failed to reset configuration');
|
|
161
|
+
logger.error(error instanceof Error ? error.message : 'Unknown error');
|
|
162
|
+
process.exit(1);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export { configCommand };
|
|
167
|
+
//# sourceMappingURL=config-BGP1jZJ4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-BGP1jZJ4.js","sources":["../../src/cli/commands/config.ts"],"sourcesContent":["import chalk from 'chalk';\nimport { logger } from '../utils/logger.js';\nimport { configManager } from '../utils/config-manager.js';\nimport { prompts } from '../utils/prompts.js';\n\nexport async function configCommand(action: string, key?: string, value?: string) {\n switch (action) {\n case 'get':\n if (!key) {\n logger.error('Key is required for get action');\n logger.info('Usage: openbuilder config get <key>');\n process.exit(1);\n }\n handleGet(key);\n break;\n\n case 'set':\n if (!key || !value) {\n logger.error('Key and value are required for set action');\n logger.info('Usage: openbuilder config set <key> <value>');\n process.exit(1);\n }\n handleSet(key, value);\n break;\n\n case 'list':\n handleList();\n break;\n\n case 'path':\n handlePath();\n break;\n\n case 'validate':\n handleValidate();\n break;\n\n case 'reset':\n await handleReset();\n break;\n\n default:\n logger.error(`Unknown action: ${action}`);\n logger.info('Available actions: get, set, list, path, validate, reset');\n process.exit(1);\n }\n}\n\nfunction handleGet(key: string) {\n try {\n const value = configManager.get(key as any);\n if (value === undefined) {\n logger.warn(`Key not found: ${key}`);\n process.exit(1);\n }\n\n if (typeof value === 'object') {\n logger.log(JSON.stringify(value, null, 2));\n } else {\n logger.log(String(value));\n }\n } catch (error) {\n logger.error('Failed to get config value');\n logger.error(error instanceof Error ? error.message : 'Unknown error');\n process.exit(1);\n }\n}\n\nfunction handleSet(key: string, value: string) {\n try {\n // Try to parse as JSON for objects/arrays\n let parsedValue: any = value;\n if (value.startsWith('{') || value.startsWith('[')) {\n try {\n parsedValue = JSON.parse(value);\n } catch {\n // Keep as string if not valid JSON\n }\n }\n\n configManager.set(key as any, parsedValue);\n logger.success(`Set ${chalk.cyan(key)} = ${chalk.green(value)}`);\n } catch (error) {\n logger.error('Failed to set config value');\n logger.error(error instanceof Error ? error.message : 'Unknown error');\n process.exit(1);\n }\n}\n\nfunction handleList() {\n const config = configManager.get();\n\n logger.section('Current Configuration');\n logger.log('');\n\n // Workspace\n logger.info(`${chalk.bold('Workspace:')}`);\n logger.log(` ${config.workspace}`);\n logger.log('');\n\n // API\n logger.info(`${chalk.bold('API:')}`);\n logger.log(` URL: ${config.apiUrl || 'not set'}`);\n logger.log('');\n\n // Broker\n logger.info(`${chalk.bold('Broker:')}`);\n logger.log(` WebSocket URL: ${config.broker?.url || 'not set'}`);\n logger.log(` HTTP URL: ${config.broker?.httpUrl || 'not set'}`);\n logger.log(` Secret: ${config.broker?.secret ? '***' : 'not set'}`);\n logger.log('');\n\n // Runner\n logger.info(`${chalk.bold('Runner:')}`);\n logger.log(` ID: ${config.runner?.id || 'not set'}`);\n logger.log(` Reconnect Attempts: ${config.runner?.reconnectAttempts || 5}`);\n logger.log(` Heartbeat Interval: ${config.runner?.heartbeatInterval || 15000}ms`);\n logger.log('');\n\n // Database\n if (config.databaseUrl) {\n logger.info(`${chalk.bold('Database:')}`);\n logger.log(` URL: ${config.databaseUrl.replace(/:[^:@]+@/, ':***@')}`); // Mask password\n logger.log('');\n }\n\n // Monorepo\n if (config.monorepoPath) {\n logger.info(`${chalk.bold('Monorepo:')}`);\n logger.log(` Path: ${config.monorepoPath}`);\n logger.log('');\n }\n\n // Tunnel\n if (config.tunnel) {\n logger.info(`${chalk.bold('Tunnel:')}`);\n logger.log(` Provider: ${config.tunnel.provider}`);\n logger.log(` Auto Create: ${config.tunnel.autoCreate}`);\n logger.log('');\n }\n}\n\nfunction handlePath() {\n logger.info(`Config file: ${chalk.cyan(configManager.path)}`);\n}\n\nfunction handleValidate() {\n const validation = configManager.validate();\n\n if (validation.valid) {\n logger.success('Configuration is valid');\n } else {\n logger.error('Configuration validation failed:');\n validation.errors.forEach((err) => logger.error(` - ${err}`));\n process.exit(1);\n }\n}\n\nasync function handleReset() {\n logger.warn('This will delete all configuration and reset to defaults');\n const confirmed = await prompts.confirm('Are you sure?', false);\n\n if (!confirmed) {\n logger.info('Reset cancelled');\n return;\n }\n\n try {\n configManager.reset();\n logger.success('Configuration reset to defaults');\n logger.info('Run \"openbuilder init\" to reconfigure');\n } catch (error) {\n logger.error('Failed to reset configuration');\n logger.error(error instanceof Error ? error.message : 'Unknown error');\n process.exit(1);\n }\n}\n"],"names":[],"mappings":"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"}
|