@daileyos/cli 0.1.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 (70) hide show
  1. package/dist/api.d.ts +12 -0
  2. package/dist/api.js +98 -0
  3. package/dist/api.js.map +1 -0
  4. package/dist/auth.d.ts +10 -0
  5. package/dist/auth.js +40 -0
  6. package/dist/auth.js.map +1 -0
  7. package/dist/commands/auth.d.ts +2 -0
  8. package/dist/commands/auth.js +106 -0
  9. package/dist/commands/auth.js.map +1 -0
  10. package/dist/commands/billing.d.ts +2 -0
  11. package/dist/commands/billing.js +58 -0
  12. package/dist/commands/billing.js.map +1 -0
  13. package/dist/commands/db.d.ts +2 -0
  14. package/dist/commands/db.js +191 -0
  15. package/dist/commands/db.js.map +1 -0
  16. package/dist/commands/deploy.d.ts +2 -0
  17. package/dist/commands/deploy.js +72 -0
  18. package/dist/commands/deploy.js.map +1 -0
  19. package/dist/commands/domains.d.ts +2 -0
  20. package/dist/commands/domains.js +48 -0
  21. package/dist/commands/domains.js.map +1 -0
  22. package/dist/commands/env.d.ts +2 -0
  23. package/dist/commands/env.js +54 -0
  24. package/dist/commands/env.js.map +1 -0
  25. package/dist/commands/jobs.d.ts +2 -0
  26. package/dist/commands/jobs.js +160 -0
  27. package/dist/commands/jobs.js.map +1 -0
  28. package/dist/commands/open.d.ts +2 -0
  29. package/dist/commands/open.js +19 -0
  30. package/dist/commands/open.js.map +1 -0
  31. package/dist/commands/platform.d.ts +2 -0
  32. package/dist/commands/platform.js +57 -0
  33. package/dist/commands/platform.js.map +1 -0
  34. package/dist/commands/projects.d.ts +2 -0
  35. package/dist/commands/projects.js +91 -0
  36. package/dist/commands/projects.js.map +1 -0
  37. package/dist/commands/scale.d.ts +2 -0
  38. package/dist/commands/scale.js +39 -0
  39. package/dist/commands/scale.js.map +1 -0
  40. package/dist/commands/storage.d.ts +2 -0
  41. package/dist/commands/storage.js +128 -0
  42. package/dist/commands/storage.js.map +1 -0
  43. package/dist/commands/usage.d.ts +2 -0
  44. package/dist/commands/usage.js +25 -0
  45. package/dist/commands/usage.js.map +1 -0
  46. package/dist/index.d.ts +2 -0
  47. package/dist/index.js +35 -0
  48. package/dist/index.js.map +1 -0
  49. package/dist/util.d.ts +26 -0
  50. package/dist/util.js +72 -0
  51. package/dist/util.js.map +1 -0
  52. package/package.json +27 -0
  53. package/src/api.ts +124 -0
  54. package/src/auth.ts +53 -0
  55. package/src/commands/auth.ts +117 -0
  56. package/src/commands/billing.ts +75 -0
  57. package/src/commands/db.ts +237 -0
  58. package/src/commands/deploy.ts +91 -0
  59. package/src/commands/domains.ts +62 -0
  60. package/src/commands/env.ts +69 -0
  61. package/src/commands/jobs.ts +287 -0
  62. package/src/commands/open.ts +22 -0
  63. package/src/commands/platform.ts +88 -0
  64. package/src/commands/projects.ts +115 -0
  65. package/src/commands/scale.ts +48 -0
  66. package/src/commands/storage.ts +214 -0
  67. package/src/commands/usage.ts +30 -0
  68. package/src/index.ts +39 -0
  69. package/src/util.ts +92 -0
  70. package/tsconfig.json +18 -0
package/dist/api.d.ts ADDED
@@ -0,0 +1,12 @@
1
+ interface ApiOptions {
2
+ method?: string;
3
+ body?: Record<string, unknown>;
4
+ params?: Record<string, string>;
5
+ requireAuth?: boolean;
6
+ }
7
+ export declare class ApiError extends Error {
8
+ status: number;
9
+ constructor(message: string, status: number);
10
+ }
11
+ export declare function api<T = unknown>(path: string, opts?: ApiOptions): Promise<T>;
12
+ export {};
package/dist/api.js ADDED
@@ -0,0 +1,98 @@
1
+ import chalk from 'chalk';
2
+ import { getCredentialAuth, getToken } from './auth.js';
3
+ const BASE_URL = process.env.DAILEY_API_URL || 'https://os.dailey.cloud/api';
4
+ const AUTH_HINT = 'Run `dailey login`, or set `DAILEY_EMAIL` + `DAILEY_PASSWORD`, or set `DAILEY_API_TOKEN`.';
5
+ let currentToken = getToken();
6
+ export class ApiError extends Error {
7
+ status;
8
+ constructor(message, status) {
9
+ super(message);
10
+ this.status = status;
11
+ this.name = 'ApiError';
12
+ }
13
+ }
14
+ async function refreshToken() {
15
+ const credentials = getCredentialAuth();
16
+ if (!credentials) {
17
+ throw new Error('Cannot refresh token: `DAILEY_EMAIL` and `DAILEY_PASSWORD` are not both set.');
18
+ }
19
+ const res = await fetch(`${BASE_URL}/customers/login`, {
20
+ method: 'POST',
21
+ headers: { 'Content-Type': 'application/json' },
22
+ body: JSON.stringify(credentials),
23
+ });
24
+ if (!res.ok) {
25
+ throw new Error(`Token refresh failed (${res.status}): ${await res.text()}`);
26
+ }
27
+ const data = await res.json();
28
+ currentToken = data.access_token || data.token || '';
29
+ if (!currentToken) {
30
+ throw new Error('Token refresh succeeded but no access token was returned.');
31
+ }
32
+ return currentToken;
33
+ }
34
+ export async function api(path, opts = {}) {
35
+ const { method = 'GET', body, params, requireAuth = true } = opts;
36
+ let url = `${BASE_URL}${path}`;
37
+ if (params) {
38
+ const qs = new URLSearchParams(params).toString();
39
+ url += `?${qs}`;
40
+ }
41
+ const makeRequest = async (token) => {
42
+ const headers = {
43
+ 'Content-Type': 'application/json',
44
+ };
45
+ if (requireAuth && token) {
46
+ headers.Authorization = `Bearer ${token}`;
47
+ }
48
+ return fetch(url, {
49
+ method,
50
+ headers,
51
+ body: body ? JSON.stringify(body) : undefined,
52
+ });
53
+ };
54
+ if (requireAuth && !currentToken && getCredentialAuth()) {
55
+ try {
56
+ await refreshToken();
57
+ }
58
+ catch (err) {
59
+ const message = err instanceof Error ? err.message : String(err);
60
+ console.error(chalk.red(`${message} ${AUTH_HINT}`));
61
+ process.exit(1);
62
+ }
63
+ }
64
+ if (requireAuth && !currentToken) {
65
+ console.error(chalk.red(`Not logged in. ${AUTH_HINT}`));
66
+ process.exit(1);
67
+ }
68
+ let res = await makeRequest(currentToken);
69
+ if (requireAuth && res.status === 401 && getCredentialAuth()) {
70
+ try {
71
+ await refreshToken();
72
+ res = await makeRequest(currentToken);
73
+ }
74
+ catch {
75
+ // If refresh fails, fall through to the normal expired-session path below.
76
+ }
77
+ }
78
+ if (requireAuth && res.status === 401) {
79
+ console.error(chalk.red(`Session expired. ${AUTH_HINT}`));
80
+ process.exit(1);
81
+ }
82
+ const text = await res.text();
83
+ let data;
84
+ try {
85
+ data = text ? JSON.parse(text) : {};
86
+ }
87
+ catch {
88
+ data = { message: text };
89
+ }
90
+ if (!res.ok) {
91
+ const msg = data?.error ||
92
+ data?.message ||
93
+ `HTTP ${res.status}`;
94
+ throw new ApiError(String(msg), res.status);
95
+ }
96
+ return data;
97
+ }
98
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sourceRoot":"","sources":["../src/api.ts"],"names":[],"mappings":"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"}
package/dist/auth.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ export declare function getToken(): string | undefined;
2
+ export declare function getStoredToken(): string | undefined;
3
+ export declare function setToken(token: string): void;
4
+ export declare function clearToken(): void;
5
+ export declare function isLoggedIn(): boolean;
6
+ export declare function getCredentialAuth(): {
7
+ email: string;
8
+ password: string;
9
+ } | undefined;
10
+ export declare function hasEnvironmentAuth(): boolean;
package/dist/auth.js ADDED
@@ -0,0 +1,40 @@
1
+ import Conf from 'conf';
2
+ const config = new Conf({
3
+ projectName: 'dailey',
4
+ schema: {
5
+ token: {
6
+ type: 'string',
7
+ },
8
+ },
9
+ });
10
+ const ENV_TOKEN = process.env.DAILEY_API_TOKEN?.trim() || undefined;
11
+ const ENV_EMAIL = process.env.DAILEY_EMAIL?.trim() || undefined;
12
+ const ENV_PASSWORD = process.env.DAILEY_PASSWORD || undefined;
13
+ export function getToken() {
14
+ return ENV_TOKEN || config.get('token');
15
+ }
16
+ export function getStoredToken() {
17
+ return config.get('token');
18
+ }
19
+ export function setToken(token) {
20
+ config.set('token', token);
21
+ }
22
+ export function clearToken() {
23
+ config.delete('token');
24
+ }
25
+ export function isLoggedIn() {
26
+ return !!(getToken() || getCredentialAuth());
27
+ }
28
+ export function getCredentialAuth() {
29
+ if (!ENV_EMAIL || !ENV_PASSWORD) {
30
+ return undefined;
31
+ }
32
+ return {
33
+ email: ENV_EMAIL,
34
+ password: ENV_PASSWORD,
35
+ };
36
+ }
37
+ export function hasEnvironmentAuth() {
38
+ return !!(ENV_TOKEN || getCredentialAuth());
39
+ }
40
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,MAAM,CAAC;AAMxB,MAAM,MAAM,GAAG,IAAI,IAAI,CAAa;IAClC,WAAW,EAAE,QAAQ;IACrB,MAAM,EAAE;QACN,KAAK,EAAE;YACL,IAAI,EAAE,QAAQ;SACf;KACF;CACF,CAAC,CAAC;AAEH,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;AACpE,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;AAChE,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,SAAS,CAAC;AAE9D,MAAM,UAAU,QAAQ;IACtB,OAAO,SAAS,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,UAAU;IACxB,OAAO,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,iBAAiB,EAAE,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,IAAI,CAAC,SAAS,IAAI,CAAC,YAAY,EAAE,CAAC;QAChC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,KAAK,EAAE,SAAS;QAChB,QAAQ,EAAE,YAAY;KACvB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB;IAChC,OAAO,CAAC,CAAC,CAAC,SAAS,IAAI,iBAAiB,EAAE,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerAuthCommands(program: Command): void;
@@ -0,0 +1,106 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { createInterface } from 'node:readline';
4
+ import { api } from '../api.js';
5
+ import { clearToken, hasEnvironmentAuth, isLoggedIn, setToken } from '../auth.js';
6
+ import { handleJson, withErrorHandler } from '../util.js';
7
+ function prompt(question, hidden = false) {
8
+ return new Promise((resolve) => {
9
+ const rl = createInterface({
10
+ input: process.stdin,
11
+ output: process.stdout,
12
+ });
13
+ if (hidden) {
14
+ // For password input, write prompt manually and mute output
15
+ process.stdout.write(question);
16
+ const stdin = process.stdin;
17
+ const wasRaw = stdin.isRaw;
18
+ if (stdin.isTTY) {
19
+ stdin.setRawMode(true);
20
+ }
21
+ let input = '';
22
+ const onData = (ch) => {
23
+ const c = ch.toString();
24
+ if (c === '\n' || c === '\r') {
25
+ stdin.removeListener('data', onData);
26
+ if (stdin.isTTY && wasRaw !== undefined) {
27
+ stdin.setRawMode(wasRaw);
28
+ }
29
+ process.stdout.write('\n');
30
+ rl.close();
31
+ resolve(input);
32
+ }
33
+ else if (c === '\u0003') {
34
+ process.exit(0);
35
+ }
36
+ else if (c === '\u007f' || c === '\b') {
37
+ input = input.slice(0, -1);
38
+ }
39
+ else {
40
+ input += c;
41
+ }
42
+ };
43
+ stdin.on('data', onData);
44
+ }
45
+ else {
46
+ rl.question(question, (answer) => {
47
+ rl.close();
48
+ resolve(answer);
49
+ });
50
+ }
51
+ });
52
+ }
53
+ export function registerAuthCommands(program) {
54
+ program
55
+ .command('login')
56
+ .description('Authenticate with email and password')
57
+ .action(withErrorHandler(async () => {
58
+ const email = await prompt('Email: ');
59
+ const password = await prompt('Password: ', true);
60
+ const spinner = ora('Logging in...').start();
61
+ try {
62
+ const data = await api('/customers/login', {
63
+ method: 'POST',
64
+ body: { email, password },
65
+ requireAuth: false,
66
+ });
67
+ setToken(data.access_token || data.token || '');
68
+ spinner.succeed(chalk.green('Logged in successfully.'));
69
+ }
70
+ catch (err) {
71
+ spinner.fail(chalk.red('Login failed.'));
72
+ throw err;
73
+ }
74
+ }));
75
+ program
76
+ .command('logout')
77
+ .description('Clear stored credentials')
78
+ .action(withErrorHandler(async () => {
79
+ clearToken();
80
+ if (hasEnvironmentAuth()) {
81
+ console.log(chalk.yellow('Stored token cleared. Environment-based auth is still configured.'));
82
+ console.log(chalk.gray('Unset `DAILEY_API_TOKEN` or `DAILEY_EMAIL` + `DAILEY_PASSWORD` to fully disable CLI auth.'));
83
+ return;
84
+ }
85
+ console.log(chalk.green('Logged out.'));
86
+ }));
87
+ program
88
+ .command('whoami')
89
+ .description('Show current user info')
90
+ .option('--json', 'Output as JSON')
91
+ .action(withErrorHandler(async (opts) => {
92
+ if (!isLoggedIn()) {
93
+ console.error(chalk.red('Not logged in. Run `dailey login`, or set `DAILEY_EMAIL` + `DAILEY_PASSWORD`, or set `DAILEY_API_TOKEN`.'));
94
+ process.exit(1);
95
+ }
96
+ const spinner = ora('Fetching profile...').start();
97
+ const user = await api('/customers/me');
98
+ spinner.stop();
99
+ handleJson(opts.json, user);
100
+ console.log(chalk.bold('Logged in as:'));
101
+ console.log(` ${chalk.blue('Name:')} ${user.name}`);
102
+ console.log(` ${chalk.blue('Email:')} ${user.email}`);
103
+ console.log(` ${chalk.blue('Plan:')} ${user.plan}`);
104
+ }));
105
+ }
106
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/commands/auth.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerBillingCommands(program: Command): void;
@@ -0,0 +1,58 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { api } from '../api.js';
4
+ import { formatTable, handleJson, withErrorHandler } from '../util.js';
5
+ export function registerBillingCommands(program) {
6
+ const billing = program
7
+ .command('billing')
8
+ .description('Show current plan and usage')
9
+ .option('--json', 'Output as JSON')
10
+ .action(withErrorHandler(async (opts) => {
11
+ const spinner = ora('Fetching billing info...').start();
12
+ const data = await api('/billing');
13
+ spinner.stop();
14
+ handleJson(opts.json, data);
15
+ console.log(chalk.bold('Billing Overview:'));
16
+ for (const [key, value] of Object.entries(data)) {
17
+ if (typeof value !== 'object') {
18
+ console.log(` ${chalk.blue(key + ':')} ${value}`);
19
+ }
20
+ }
21
+ }));
22
+ billing
23
+ .command('invoices')
24
+ .description('List invoice history')
25
+ .option('--json', 'Output as JSON')
26
+ .action(withErrorHandler(async (opts) => {
27
+ const spinner = ora('Fetching invoices...').start();
28
+ const data = await api('/billing/invoices');
29
+ spinner.stop();
30
+ handleJson(opts.json, data.invoices);
31
+ console.log(chalk.bold('Invoices:'));
32
+ console.log(formatTable(data.invoices ?? [], [
33
+ { key: 'id', label: 'ID' },
34
+ { key: 'date', label: 'Date' },
35
+ { key: 'amount', label: 'Amount' },
36
+ { key: 'status', label: 'Status' },
37
+ ]));
38
+ }));
39
+ billing
40
+ .command('estimate')
41
+ .description('Estimate cost for scaling')
42
+ .option('--action <action>', 'Action to estimate', 'scale')
43
+ .option('--replicas <n>', 'Number of replicas', '3')
44
+ .option('--json', 'Output as JSON')
45
+ .action(withErrorHandler(async (opts) => {
46
+ const spinner = ora('Calculating estimate...').start();
47
+ const data = await api('/billing/estimate', {
48
+ params: { action: opts.action, replicas: opts.replicas },
49
+ });
50
+ spinner.stop();
51
+ handleJson(opts.json, data);
52
+ console.log(chalk.bold('Cost Estimate:'));
53
+ for (const [key, value] of Object.entries(data)) {
54
+ console.log(` ${chalk.blue(key + ':')} ${value}`);
55
+ }
56
+ }));
57
+ }
58
+ //# sourceMappingURL=billing.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"billing.js","sourceRoot":"","sources":["../../src/commands/billing.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerDbCommands(program: Command): void;
@@ -0,0 +1,191 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { api } from '../api.js';
4
+ import { resolveProject, handleJson, withErrorHandler } from '../util.js';
5
+ function printQueryRows(data) {
6
+ console.log(chalk.gray(`${data.row_count} row(s) in ${data.duration_ms}ms`));
7
+ if (data.read_only) {
8
+ const note = data.auto_limited ? 'read-only mode, limit applied automatically' : 'read-only mode';
9
+ console.log(chalk.gray(`${note}\n`));
10
+ }
11
+ else {
12
+ console.log();
13
+ }
14
+ if (!data.rows || data.rows.length === 0) {
15
+ return;
16
+ }
17
+ const keys = Object.keys(data.rows[0]);
18
+ const widths = keys.map((k) => Math.max(k.length, ...data.rows.map((r) => String(r[k] ?? 'NULL').length)));
19
+ console.log(keys.map((k, i) => chalk.bold(k.padEnd(widths[i]))).join(' '));
20
+ console.log(keys.map((_k, i) => '─'.repeat(widths[i])).join(' '));
21
+ for (const row of data.rows.slice(0, 50)) {
22
+ console.log(keys.map((k, i) => String(row[k] ?? chalk.gray('NULL')).padEnd(widths[i])).join(' '));
23
+ }
24
+ if (data.rows.length > 50) {
25
+ console.log(chalk.gray(`\n... and ${data.rows.length - 50} more rows`));
26
+ }
27
+ }
28
+ export function registerDbCommands(program) {
29
+ const db = program.command('db').description('Database management');
30
+ db.command('info <idOrName>')
31
+ .description('Show database connection info')
32
+ .option('--json', 'Output as JSON')
33
+ .action(withErrorHandler(async (idOrName, opts) => {
34
+ const project = await resolveProject(String(idOrName));
35
+ const spinner = ora('Fetching database info...').start();
36
+ const data = await api(`/projects/${project.id}/database`);
37
+ spinner.stop();
38
+ handleJson(opts.json, data);
39
+ console.log(chalk.bold(`Database for ${project.name}:`));
40
+ const fields = ['host', 'port', 'database', 'username', 'status', 'size'];
41
+ for (const f of fields) {
42
+ if (data[f] !== undefined) {
43
+ console.log(` ${chalk.blue(f + ':')} ${data[f]}`);
44
+ }
45
+ }
46
+ }));
47
+ db.command('schema <idOrName>')
48
+ .description('Show database schema — tables, columns, indexes')
49
+ .option('--json', 'Output as JSON')
50
+ .action(withErrorHandler(async (idOrName, opts) => {
51
+ const project = await resolveProject(String(idOrName));
52
+ const spinner = ora('Fetching schema...').start();
53
+ const data = await api(`/projects/${project.id}/database/schema`);
54
+ spinner.stop();
55
+ handleJson(opts.json, data);
56
+ console.log(chalk.bold(`Schema: ${data.database}`));
57
+ console.log(chalk.gray(`${data.tables?.length || 0} tables, ${data.total_rows || 0} rows, ${data.total_size_kb || 0} KB\n`));
58
+ for (const table of data.tables || []) {
59
+ console.log(chalk.bold.blue(` ${table.name}`) + chalk.gray(` (${table.rows} rows, ${table.size_kb} KB)`));
60
+ for (const col of table.columns || []) {
61
+ const keyBadge = col.key === 'PRI' ? chalk.yellow(' PK') : col.key === 'UNI' ? chalk.cyan(' UQ') : col.key === 'MUL' ? chalk.gray(' IDX') : '';
62
+ const nullable = col.nullable ? chalk.gray(' NULL') : '';
63
+ const extra = col.extra ? chalk.gray(` ${col.extra}`) : '';
64
+ console.log(` ${chalk.white(col.name.padEnd(25))} ${chalk.gray(col.type)}${keyBadge}${nullable}${extra}`);
65
+ }
66
+ console.log();
67
+ }
68
+ }));
69
+ db.command('query <idOrName> <sql>')
70
+ .description('Run a read-only SQL query against the project database')
71
+ .option('--json', 'Output as JSON')
72
+ .action(withErrorHandler(async (idOrName, sql, opts) => {
73
+ const project = await resolveProject(String(idOrName));
74
+ const spinner = ora('Executing query...').start();
75
+ const data = await api(`/projects/${project.id}/database/query`, {
76
+ method: 'POST',
77
+ body: { sql: String(sql) },
78
+ });
79
+ spinner.stop();
80
+ if (data.error) {
81
+ console.error(chalk.red(`Error: ${data.error}`));
82
+ return;
83
+ }
84
+ handleJson(opts.json, data);
85
+ printQueryRows(data);
86
+ }));
87
+ db.command('recall <idOrName> <sql>')
88
+ .description('Recall records with an explicitly read-only SQL query')
89
+ .option('--limit <n>', 'Auto-limit SELECT/WITH queries without LIMIT (default: 100)')
90
+ .option('--json', 'Output as JSON')
91
+ .action(withErrorHandler(async (idOrName, sql, opts) => {
92
+ const project = await resolveProject(String(idOrName));
93
+ const spinner = ora('Recalling records...').start();
94
+ const body = { sql: String(sql) };
95
+ if (opts.limit)
96
+ body.limit = Number(opts.limit);
97
+ const data = await api(`/projects/${project.id}/database/recall`, {
98
+ method: 'POST',
99
+ body,
100
+ });
101
+ spinner.stop();
102
+ if (data.error) {
103
+ console.error(chalk.red(`Error: ${data.error}`));
104
+ return;
105
+ }
106
+ handleJson(opts.json, data);
107
+ printQueryRows(data);
108
+ }));
109
+ db.command('migrations <idOrName>')
110
+ .description('Show migration status for a project')
111
+ .option('--json', 'Output as JSON')
112
+ .action(withErrorHandler(async (idOrName, opts) => {
113
+ const project = await resolveProject(String(idOrName));
114
+ const spinner = ora('Checking migrations...').start();
115
+ const data = await api(`/projects/${project.id}/database/migrations`);
116
+ spinner.stop();
117
+ handleJson(opts.json, data);
118
+ if (!data.has_migration_table) {
119
+ console.log(chalk.yellow('No _migrations table found.'));
120
+ console.log(chalk.gray('This project may not use the auto-migration pattern.'));
121
+ console.log(chalk.gray('Add a migrations/ directory with SQL files to enable auto-migrations.'));
122
+ return;
123
+ }
124
+ console.log(chalk.bold(`Migrations for ${project.name}:`));
125
+ console.log(chalk.gray(`${data.total_applied} applied\n`));
126
+ for (const m of data.applied || []) {
127
+ const date = m.applied_at ? new Date(m.applied_at).toLocaleString() : 'unknown';
128
+ console.log(` ${chalk.green('✓')} ${m.name} ${chalk.gray(date)}`);
129
+ }
130
+ }));
131
+ db.command('validate <idOrName> <sqlFile>')
132
+ .description('Validate a migration SQL file against the current schema')
133
+ .option('--json', 'Output as JSON')
134
+ .action(withErrorHandler(async (idOrName, sqlFile, opts) => {
135
+ const fs = await import('fs');
136
+ const filePath = String(sqlFile);
137
+ if (!fs.existsSync(filePath)) {
138
+ console.error(chalk.red(`File not found: ${filePath}`));
139
+ process.exit(1);
140
+ }
141
+ const sql = fs.readFileSync(filePath, 'utf8');
142
+ const project = await resolveProject(String(idOrName));
143
+ const spinner = ora('Validating migration...').start();
144
+ const data = await api(`/projects/${project.id}/database/validate`, {
145
+ method: 'POST',
146
+ body: { sql },
147
+ });
148
+ spinner.stop();
149
+ handleJson(opts.json, data);
150
+ console.log(chalk.bold(data.summary));
151
+ console.log();
152
+ for (const stmt of data.statements || []) {
153
+ const icon = !stmt.valid ? chalk.red('✗') : stmt.warning ? chalk.yellow('⚠') : chalk.green('✓');
154
+ console.log(` ${icon} ${chalk.gray(stmt.sql)}`);
155
+ if (stmt.error)
156
+ console.log(` ${chalk.red(stmt.error)}`);
157
+ if (stmt.warning)
158
+ console.log(` ${chalk.yellow(stmt.warning)}`);
159
+ if (stmt.info)
160
+ console.log(` ${chalk.gray(stmt.info)}`);
161
+ }
162
+ }));
163
+ db.command('connect <idOrName>')
164
+ .description('Show connection details for external database tools')
165
+ .action(withErrorHandler(async (idOrName) => {
166
+ const project = await resolveProject(String(idOrName));
167
+ const spinner = ora('Fetching connection info...').start();
168
+ const data = await api(`/projects/${project.id}/database`);
169
+ spinner.stop();
170
+ if (!data.database) {
171
+ console.log(chalk.yellow('This project does not have a database.'));
172
+ return;
173
+ }
174
+ console.log(chalk.bold('Database Connection Details'));
175
+ console.log(chalk.gray('Use these with Sequel Ace, TablePlus, DBeaver, or any MySQL client.\n'));
176
+ console.log(` ${chalk.blue('Host:')} ${data.host || 'auto-injected'}`);
177
+ console.log(` ${chalk.blue('Port:')} ${data.port || 3306}`);
178
+ console.log(` ${chalk.blue('Database:')} ${data.database}`);
179
+ console.log(` ${chalk.blue('User:')} ${data.username || data.user || 'see env vars'}`);
180
+ console.log(` ${chalk.blue('Password:')} ${chalk.gray('(available in your app as DB_PASSWORD env var)')}`);
181
+ console.log(chalk.gray('\nNote: Direct database access requires network connectivity'));
182
+ console.log(chalk.gray('to the Dailey infrastructure. Use the web console in the'));
183
+ console.log(chalk.gray('dashboard for browser-based access, or `dailey db query`'));
184
+ console.log(chalk.gray('for quick queries from the CLI.'));
185
+ console.log(chalk.bold('\nQuick queries:'));
186
+ console.log(chalk.gray(` dailey db query ${String(idOrName)} "SELECT * FROM users LIMIT 10"`));
187
+ console.log(chalk.gray(` dailey db schema ${String(idOrName)}`));
188
+ console.log(chalk.gray(` dailey db migrations ${String(idOrName)}`));
189
+ }));
190
+ }
191
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/commands/db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerDeployCommands(program: Command): void;