@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
@@ -0,0 +1,72 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { api } from '../api.js';
4
+ import { resolveProject, formatTable, handleJson, withErrorHandler } from '../util.js';
5
+ export function registerDeployCommands(program) {
6
+ program
7
+ .command('deploy <idOrName>')
8
+ .description('Trigger a deploy (shows push instructions)')
9
+ .action(withErrorHandler(async (idOrName) => {
10
+ const project = await resolveProject(String(idOrName));
11
+ console.log(chalk.bold(`Deploy "${project.name}"`));
12
+ console.log();
13
+ console.log(chalk.gray('Deploys are triggered automatically when you push to the configured branch.'));
14
+ console.log(chalk.gray('Push your code to trigger a new deployment:'));
15
+ console.log();
16
+ console.log(chalk.blue(` git push origin ${project.branch || 'main'}`));
17
+ console.log();
18
+ console.log(chalk.gray(`View deploy history with: ${chalk.white(`dailey deploys ${project.name}`)}`));
19
+ }));
20
+ program
21
+ .command('logs <idOrName>')
22
+ .description('View pod logs')
23
+ .option('--tail <lines>', 'Number of lines to tail', '100')
24
+ .option('--json', 'Output as JSON')
25
+ .action(withErrorHandler(async (idOrName, opts) => {
26
+ const project = await resolveProject(String(idOrName));
27
+ const spinner = ora('Fetching logs...').start();
28
+ const data = await api(`/projects/${project.id}/logs`, {
29
+ params: { tail: opts.tail },
30
+ });
31
+ spinner.stop();
32
+ handleJson(opts.json, data.logs);
33
+ if (!data.logs || data.logs.length === 0) {
34
+ console.log(chalk.gray('No logs available.'));
35
+ return;
36
+ }
37
+ for (const line of data.logs) {
38
+ console.log(line);
39
+ }
40
+ }));
41
+ program
42
+ .command('deploys <idOrName>')
43
+ .description('List deploy history')
44
+ .option('--json', 'Output as JSON')
45
+ .action(withErrorHandler(async (idOrName, opts) => {
46
+ const project = await resolveProject(String(idOrName));
47
+ const spinner = ora('Fetching deploys...').start();
48
+ const data = await api(`/projects/${project.id}/deploys`);
49
+ spinner.stop();
50
+ handleJson(opts.json, data.builds);
51
+ console.log(chalk.bold(`Deploys for ${project.name}:`));
52
+ console.log(formatTable(data.builds, [
53
+ { key: 'id', label: 'Build ID' },
54
+ { key: 'status', label: 'Status' },
55
+ { key: 'commit', label: 'Commit' },
56
+ { key: 'created_at', label: 'Date' },
57
+ ]));
58
+ }));
59
+ program
60
+ .command('rollback <idOrName> <buildId>')
61
+ .description('Rollback to a previous build')
62
+ .action(withErrorHandler(async (idOrName, buildId) => {
63
+ const project = await resolveProject(String(idOrName));
64
+ const spinner = ora('Rolling back...').start();
65
+ await api(`/projects/${project.id}/rollback`, {
66
+ method: 'POST',
67
+ body: { build_id: String(buildId) },
68
+ });
69
+ spinner.succeed(chalk.green(`Rolled back "${project.name}" to build ${buildId}.`));
70
+ }));
71
+ }
72
+ //# sourceMappingURL=deploy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.js","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerDomainCommands(program: Command): void;
@@ -0,0 +1,48 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { api } from '../api.js';
4
+ import { resolveProject, formatTable, handleJson, withErrorHandler } from '../util.js';
5
+ export function registerDomainCommands(program) {
6
+ const domains = program.command('domains').description('Manage custom domains');
7
+ domains
8
+ .command('list <idOrName>')
9
+ .description('List custom domains')
10
+ .option('--json', 'Output as JSON')
11
+ .action(withErrorHandler(async (idOrName, opts) => {
12
+ const project = await resolveProject(String(idOrName));
13
+ const spinner = ora('Fetching domains...').start();
14
+ const data = await api(`/projects/${project.id}/domains`);
15
+ spinner.stop();
16
+ handleJson(opts.json, data.domains);
17
+ console.log(chalk.bold(`Domains for ${project.name}:`));
18
+ console.log(formatTable(data.domains, [
19
+ { key: 'domain', label: 'Domain' },
20
+ { key: 'status', label: 'Status' },
21
+ ]));
22
+ }));
23
+ domains
24
+ .command('add <idOrName> <domain>')
25
+ .description('Add a custom domain')
26
+ .action(withErrorHandler(async (idOrName, domain) => {
27
+ const project = await resolveProject(String(idOrName));
28
+ const spinner = ora(`Adding domain ${domain}...`).start();
29
+ await api(`/projects/${project.id}/domains`, {
30
+ method: 'POST',
31
+ body: { domain: String(domain) },
32
+ });
33
+ spinner.succeed(chalk.green(`Added domain "${domain}" to "${project.name}".`));
34
+ }));
35
+ domains
36
+ .command('remove <idOrName> <domain>')
37
+ .description('Remove a custom domain')
38
+ .action(withErrorHandler(async (idOrName, domain) => {
39
+ const project = await resolveProject(String(idOrName));
40
+ const spinner = ora(`Removing domain ${domain}...`).start();
41
+ await api(`/projects/${project.id}/domains`, {
42
+ method: 'DELETE',
43
+ body: { domain: String(domain) },
44
+ });
45
+ spinner.succeed(chalk.green(`Removed domain "${domain}" from "${project.name}".`));
46
+ }));
47
+ }
48
+ //# sourceMappingURL=domains.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domains.js","sourceRoot":"","sources":["../../src/commands/domains.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerEnvCommands(program: Command): void;
@@ -0,0 +1,54 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { api } from '../api.js';
4
+ import { resolveProject, formatTable, handleJson, withErrorHandler } from '../util.js';
5
+ export function registerEnvCommands(program) {
6
+ const env = program.command('env').description('Manage environment variables');
7
+ env
8
+ .command('list <idOrName>')
9
+ .description('List environment variables')
10
+ .option('--json', 'Output as JSON')
11
+ .action(withErrorHandler(async (idOrName, opts) => {
12
+ const project = await resolveProject(String(idOrName));
13
+ const spinner = ora('Fetching env vars...').start();
14
+ const data = await api(`/projects/${project.id}/env`);
15
+ spinner.stop();
16
+ handleJson(opts.json, data.env_vars);
17
+ console.log(chalk.bold(`Environment variables for ${project.name}:`));
18
+ console.log(formatTable(data.env_vars, [
19
+ { key: 'key', label: 'Key' },
20
+ { key: 'updated_at', label: 'Updated' },
21
+ ]));
22
+ console.log(chalk.gray('\nValues stay hidden here by design. Update them with `dailey env set`.'));
23
+ }));
24
+ env
25
+ .command('set <idOrName> <keyValue>')
26
+ .description('Set an environment variable (KEY=VALUE)')
27
+ .action(withErrorHandler(async (idOrName, keyValue) => {
28
+ const kv = String(keyValue);
29
+ const eqIdx = kv.indexOf('=');
30
+ if (eqIdx === -1) {
31
+ console.error(chalk.red('Format must be KEY=VALUE'));
32
+ process.exit(1);
33
+ }
34
+ const key = kv.slice(0, eqIdx);
35
+ const value = kv.slice(eqIdx + 1);
36
+ const project = await resolveProject(String(idOrName));
37
+ const spinner = ora(`Setting ${key}...`).start();
38
+ await api(`/projects/${project.id}/env`, {
39
+ method: 'POST',
40
+ body: { key, value },
41
+ });
42
+ spinner.succeed(chalk.green(`Set ${key} on "${project.name}".`));
43
+ }));
44
+ env
45
+ .command('unset <idOrName> <key>')
46
+ .description('Remove an environment variable')
47
+ .action(withErrorHandler(async (idOrName, key) => {
48
+ const project = await resolveProject(String(idOrName));
49
+ const spinner = ora(`Removing ${key}...`).start();
50
+ await api(`/projects/${project.id}/env/${String(key)}`, { method: 'DELETE' });
51
+ spinner.succeed(chalk.green(`Removed ${key} from "${project.name}".`));
52
+ }));
53
+ }
54
+ //# sourceMappingURL=env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.js","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerJobCommands(program: Command): void;
@@ -0,0 +1,160 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { api } from '../api.js';
4
+ import { formatTable, handleJson, resolveProject, withErrorHandler } from '../util.js';
5
+ function formatTime(value) {
6
+ if (!value)
7
+ return '-';
8
+ const date = new Date(value);
9
+ if (Number.isNaN(date.getTime()))
10
+ return value;
11
+ return date.toLocaleString();
12
+ }
13
+ function shortId(value) {
14
+ if (!value)
15
+ return '-';
16
+ return value.length > 12 ? value.slice(0, 12) : value;
17
+ }
18
+ function statusColor(status) {
19
+ switch (status) {
20
+ case 'success':
21
+ return chalk.green;
22
+ case 'running':
23
+ case 'queued':
24
+ return chalk.blue;
25
+ case 'failed':
26
+ case 'timed_out':
27
+ case 'canceled':
28
+ return chalk.red;
29
+ default:
30
+ return chalk.yellow;
31
+ }
32
+ }
33
+ export function registerJobCommands(program) {
34
+ const jobs = program.command('jobs').description('Project-scoped Burst and Cron visibility');
35
+ jobs
36
+ .command('list <idOrName>')
37
+ .description('List job contracts and recent executions for a project')
38
+ .option('--status <status>', 'Filter executions by status')
39
+ .option('--limit <n>', 'Maximum number of executions to return', '25')
40
+ .option('--json', 'Output as JSON')
41
+ .action(withErrorHandler(async (idOrName, opts) => {
42
+ const project = await resolveProject(String(idOrName));
43
+ const spinner = opts.json ? null : ora('Loading project jobs...').start();
44
+ const params = {
45
+ limit: String(opts.limit || '25'),
46
+ };
47
+ if (opts.status) {
48
+ params.status = opts.status;
49
+ }
50
+ const data = await api(`/projects/${project.id}/jobs`, { params });
51
+ spinner?.stop();
52
+ handleJson(opts.json, data);
53
+ console.log(chalk.bold(`Jobs: ${data.project.name}`));
54
+ console.log(chalk.gray(`${data.project.slug}${data.app_id ? ` • app ${data.app_id}` : ''}\n`));
55
+ if (!data.available) {
56
+ console.log(chalk.yellow(data.reason || 'Job history is not available for this project yet.'));
57
+ return;
58
+ }
59
+ console.log(chalk.bold('Contracts'));
60
+ console.log(formatTable(data.contracts.map((contract) => ({
61
+ slug: contract.slug,
62
+ enabled: contract.enabled ? 'yes' : 'no',
63
+ triggers: `${contract.enabled_trigger_count}/${contract.trigger_count}`,
64
+ updated: formatTime(contract.updated_at),
65
+ })), [
66
+ { key: 'slug', label: 'Contract' },
67
+ { key: 'enabled', label: 'Enabled' },
68
+ { key: 'triggers', label: 'Enabled/Total Triggers' },
69
+ { key: 'updated', label: 'Updated' },
70
+ ]));
71
+ console.log(`\n${chalk.bold('Executions')}`);
72
+ console.log(formatTable(data.executions.map((execution) => ({
73
+ id: shortId(execution.id),
74
+ contract: execution.contract_slug || execution.contract_name || '-',
75
+ status: execution.status,
76
+ pool: execution.pool_slug || '-',
77
+ attempt: `${execution.attempt}/${execution.max_attempts || execution.attempt || 1}`,
78
+ created: formatTime(execution.created_at),
79
+ })), [
80
+ { key: 'id', label: 'Execution' },
81
+ { key: 'contract', label: 'Contract' },
82
+ { key: 'status', label: 'Status' },
83
+ { key: 'pool', label: 'Pool' },
84
+ { key: 'attempt', label: 'Attempt' },
85
+ { key: 'created', label: 'Created' },
86
+ ]));
87
+ }));
88
+ jobs
89
+ .command('show <idOrName> <jobId>')
90
+ .description('Show detail for one execution')
91
+ .option('--json', 'Output as JSON')
92
+ .action(withErrorHandler(async (idOrName, jobId, opts) => {
93
+ const project = await resolveProject(String(idOrName));
94
+ const spinner = opts.json ? null : ora('Loading job detail...').start();
95
+ const data = await api(`/projects/${project.id}/jobs/${String(jobId)}`);
96
+ spinner?.stop();
97
+ handleJson(opts.json, data);
98
+ const statusPainter = statusColor(data.execution.status);
99
+ console.log(chalk.bold(`Job: ${data.project.name}`));
100
+ console.log(chalk.gray(`${data.project.slug} • ${data.execution.id}\n`));
101
+ console.log(` ${chalk.blue('Status:')} ${statusPainter(data.execution.status)}`);
102
+ console.log(` ${chalk.blue('Contract:')} ${data.contract?.slug || data.contract?.name || '-'}`);
103
+ console.log(` ${chalk.blue('Pool:')} ${data.execution.pool_slug || '-'}`);
104
+ console.log(` ${chalk.blue('Environment:')} ${data.execution.environment || '-'}`);
105
+ console.log(` ${chalk.blue('Attempt:')} ${data.execution.attempt}/${data.execution.max_attempts || data.execution.attempt || 1}`);
106
+ console.log(` ${chalk.blue('Created By:')} ${data.execution.created_by_principal || '-'}`);
107
+ console.log(` ${chalk.blue('Created:')} ${formatTime(data.execution.created_at)}`);
108
+ console.log(` ${chalk.blue('Started:')} ${formatTime(data.execution.started_at)}`);
109
+ console.log(` ${chalk.blue('Finished:')} ${formatTime(data.execution.finished_at)}`);
110
+ console.log(` ${chalk.blue('Exit Code:')} ${data.execution.exit_code === null ? '-' : data.execution.exit_code}`);
111
+ if (data.execution.error_summary) {
112
+ console.log(`\n${chalk.red('Error Summary')}`);
113
+ console.log(` ${data.execution.error_summary}`);
114
+ }
115
+ if (data.execution.metering) {
116
+ console.log(`\n${chalk.bold('Metering')}`);
117
+ console.log(JSON.stringify(data.execution.metering, null, 2));
118
+ }
119
+ if (data.contract?.spec) {
120
+ console.log(`\n${chalk.bold('Contract Spec')}`);
121
+ console.log(JSON.stringify(data.contract.spec, null, 2));
122
+ }
123
+ if (data.execution_spec?.execution) {
124
+ console.log(`\n${chalk.bold('Execution Spec')}`);
125
+ console.log(JSON.stringify(data.execution_spec.execution, null, 2));
126
+ }
127
+ }));
128
+ jobs
129
+ .command('logs <idOrName> <jobId>')
130
+ .description('Show logs for one execution')
131
+ .option('--limit <n>', 'Maximum number of log lines to return', '200')
132
+ .option('--since-ts <ts>', 'Only show logs after the given timestamp')
133
+ .option('--json', 'Output as JSON')
134
+ .action(withErrorHandler(async (idOrName, jobId, opts) => {
135
+ const project = await resolveProject(String(idOrName));
136
+ const spinner = opts.json ? null : ora('Loading job logs...').start();
137
+ const params = {
138
+ limit: String(opts.limit || '200'),
139
+ };
140
+ if (opts.sinceTs) {
141
+ params.since_ts = opts.sinceTs;
142
+ }
143
+ const data = await api(`/projects/${project.id}/jobs/${String(jobId)}/logs`, { params });
144
+ spinner?.stop();
145
+ handleJson(opts.json, data);
146
+ console.log(chalk.bold(`Logs: ${data.project.name}`));
147
+ console.log(chalk.gray(`${data.project.slug} • ${data.execution_id}\n`));
148
+ if (data.logs.length === 0) {
149
+ console.log(chalk.gray('No logs returned.'));
150
+ return;
151
+ }
152
+ for (const log of data.logs) {
153
+ const ts = formatTime(log.ts);
154
+ const stream = log.stream || 'log';
155
+ const line = log.line || '';
156
+ console.log(`${chalk.gray(ts)} ${chalk.blue(`[${stream}]`)} ${line}`);
157
+ }
158
+ }));
159
+ }
160
+ //# sourceMappingURL=jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/commands/jobs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerOpenCommand(program: Command): void;
@@ -0,0 +1,19 @@
1
+ import chalk from 'chalk';
2
+ import open from 'open';
3
+ import { resolveProject, withErrorHandler } from '../util.js';
4
+ export function registerOpenCommand(program) {
5
+ program
6
+ .command('open <idOrName>')
7
+ .description('Open project URL in browser')
8
+ .action(withErrorHandler(async (idOrName) => {
9
+ const project = await resolveProject(String(idOrName));
10
+ const url = project.url;
11
+ if (!url) {
12
+ console.error(chalk.red(`No URL found for project "${project.name}".`));
13
+ process.exit(1);
14
+ }
15
+ console.log(chalk.blue(`Opening ${url}...`));
16
+ await open(url);
17
+ }));
18
+ }
19
+ //# sourceMappingURL=open.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE9D,MAAM,UAAU,mBAAmB,CAAC,OAAgB;IAClD,OAAO;SACJ,OAAO,CAAC,iBAAiB,CAAC;SAC1B,WAAW,CAAC,6BAA6B,CAAC;SAC1C,MAAM,CACL,gBAAgB,CAAC,KAAK,EAAE,QAAiB,EAAE,EAAE;QAC3C,MAAM,OAAO,GAAG,MAAM,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAyB,CAAC;QAC9C,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,6BAA6B,OAAO,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC;YACxE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC;QAC7C,MAAM,IAAI,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC,CAAC,CACH,CAAC;AACN,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerPlatformCommands(program: Command): void;
@@ -0,0 +1,57 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { api } from '../api.js';
4
+ import { handleJson, resolveProject, withErrorHandler } from '../util.js';
5
+ function statusColor(status) {
6
+ if (status === 'configured')
7
+ return chalk.green;
8
+ if (status === 'available')
9
+ return chalk.blue;
10
+ return chalk.yellow;
11
+ }
12
+ export function registerPlatformCommands(program) {
13
+ const platform = program.command('platform').description('Project-scoped platform capabilities');
14
+ platform
15
+ .command('info <idOrName>')
16
+ .description('Show the safe platform capabilities available to a project')
17
+ .option('--json', 'Output as JSON')
18
+ .action(withErrorHandler(async (idOrName, opts) => {
19
+ const project = await resolveProject(String(idOrName));
20
+ const spinner = opts.json ? null : ora('Loading platform overview...').start();
21
+ const data = await api(`/projects/${project.id}/platform`);
22
+ spinner?.stop();
23
+ handleJson(opts.json, data);
24
+ console.log(chalk.bold(`Platform: ${data.project.name}`));
25
+ console.log(chalk.gray(`${data.project.slug} • ${data.project.status} • ${data.project.url}\n`));
26
+ console.log(chalk.bold('Safety Model'));
27
+ console.log(` ${chalk.blue('Mode:')} ${data.safety.model}`);
28
+ for (const line of data.safety.guarantees || []) {
29
+ console.log(` ${chalk.green('✓')} ${line}`);
30
+ }
31
+ for (const line of data.safety.restrictions || []) {
32
+ console.log(` ${chalk.yellow('!')} ${line}`);
33
+ }
34
+ console.log(`\n${chalk.bold('Capabilities')}`);
35
+ for (const capability of data.capabilities || []) {
36
+ const color = statusColor(capability.status);
37
+ console.log(` ${color(capability.label)} ${chalk.gray(`[${capability.status}]`)}`);
38
+ console.log(` ${capability.summary}`);
39
+ if (capability.interfaces && capability.interfaces.length > 0) {
40
+ console.log(` Interfaces: ${capability.interfaces.join(', ')}`);
41
+ }
42
+ const details = capability.details || {};
43
+ for (const [key, value] of Object.entries(details)) {
44
+ if (value === null || value === undefined || value === '')
45
+ continue;
46
+ if (Array.isArray(value) && value.length === 0)
47
+ continue;
48
+ console.log(` ${key}: ${Array.isArray(value) ? value.join(', ') : String(value)}`);
49
+ }
50
+ }
51
+ if (data.next_step) {
52
+ console.log(`\n${chalk.bold('Next Step')}`);
53
+ console.log(` ${data.next_step}`);
54
+ }
55
+ }));
56
+ }
57
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../src/commands/platform.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerProjectCommands(program: Command): void;
@@ -0,0 +1,91 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import { createInterface } from 'node:readline';
4
+ import { api } from '../api.js';
5
+ import { resolveProject, formatTable, handleJson, withErrorHandler } from '../util.js';
6
+ function ask(question) {
7
+ return new Promise((resolve) => {
8
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
9
+ rl.question(question, (answer) => {
10
+ rl.close();
11
+ resolve(answer);
12
+ });
13
+ });
14
+ }
15
+ export function registerProjectCommands(program) {
16
+ const projects = program
17
+ .command('projects')
18
+ .description('List all projects')
19
+ .option('--json', 'Output as JSON')
20
+ .action(withErrorHandler(async (opts) => {
21
+ const spinner = ora('Fetching projects...').start();
22
+ const data = await api('/projects');
23
+ spinner.stop();
24
+ handleJson(opts.json, data.projects);
25
+ if (data.projects.length === 0) {
26
+ console.log(chalk.gray('No projects yet. Create one with `dailey projects create <name>`.'));
27
+ return;
28
+ }
29
+ console.log(formatTable(data.projects, [
30
+ { key: 'id', label: 'ID' },
31
+ { key: 'name', label: 'Name' },
32
+ { key: 'status', label: 'Status' },
33
+ { key: 'replicas', label: 'Replicas' },
34
+ ]));
35
+ }));
36
+ projects
37
+ .command('create <name>')
38
+ .description('Create a new project')
39
+ .option('--json', 'Output as JSON')
40
+ .action(withErrorHandler(async (name, opts) => {
41
+ const repoUrl = await ask('Repository URL: ');
42
+ const branch = (await ask('Branch (main): ')) || 'main';
43
+ const dbAnswer = await ask('Needs database? (y/N): ');
44
+ const needsDatabase = dbAnswer.toLowerCase() === 'y';
45
+ const spinner = ora('Creating project...').start();
46
+ const data = await api('/projects', {
47
+ method: 'POST',
48
+ body: {
49
+ name: String(name),
50
+ repo_url: repoUrl,
51
+ branch,
52
+ needs_database: needsDatabase,
53
+ },
54
+ });
55
+ spinner.succeed(chalk.green(`Project "${name}" created.`));
56
+ handleJson(opts.json, data.project);
57
+ console.log(` ${chalk.blue('ID:')} ${data.project.id}`);
58
+ }));
59
+ projects
60
+ .command('info <idOrName>')
61
+ .description('Show project detail')
62
+ .option('--json', 'Output as JSON')
63
+ .action(withErrorHandler(async (idOrName, opts) => {
64
+ const spinner = ora('Fetching project...').start();
65
+ const project = await resolveProject(String(idOrName));
66
+ spinner.stop();
67
+ handleJson(opts.json, project);
68
+ console.log(chalk.bold(`Project: ${project.name}`));
69
+ const fields = ['id', 'slug', 'status', 'repo_url', 'branch', 'replicas', 'url', 'created_at'];
70
+ for (const f of fields) {
71
+ if (project[f] !== undefined) {
72
+ console.log(` ${chalk.blue(f + ':')} ${project[f]}`);
73
+ }
74
+ }
75
+ }));
76
+ projects
77
+ .command('delete <idOrName>')
78
+ .description('Delete a project')
79
+ .action(withErrorHandler(async (idOrName) => {
80
+ const project = await resolveProject(String(idOrName));
81
+ const confirm = await ask(`Delete project "${project.name}"? This cannot be undone. (yes/no): `);
82
+ if (confirm !== 'yes') {
83
+ console.log(chalk.yellow('Cancelled.'));
84
+ return;
85
+ }
86
+ const spinner = ora('Deleting project...').start();
87
+ await api(`/projects/${project.id}`, { method: 'DELETE' });
88
+ spinner.succeed(chalk.green(`Project "${project.name}" deleted.`));
89
+ }));
90
+ }
91
+ //# sourceMappingURL=projects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projects.js","sourceRoot":"","sources":["../../src/commands/projects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerScaleCommands(program: Command): void;
@@ -0,0 +1,39 @@
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
+ export function registerScaleCommands(program) {
6
+ program
7
+ .command('scale <idOrName> <replicas>')
8
+ .description('Scale replicas for a project')
9
+ .action(withErrorHandler(async (idOrName, replicas) => {
10
+ const project = await resolveProject(String(idOrName));
11
+ const count = parseInt(String(replicas), 10);
12
+ if (isNaN(count) || count < 0) {
13
+ console.error(chalk.red('Replicas must be a non-negative integer.'));
14
+ process.exit(1);
15
+ }
16
+ const spinner = ora(`Scaling "${project.name}" to ${count} replicas...`).start();
17
+ await api(`/projects/${project.id}/scale`, {
18
+ method: 'POST',
19
+ body: { replicas: count },
20
+ });
21
+ spinner.succeed(chalk.green(`Scaled "${project.name}" to ${count} replicas.`));
22
+ }));
23
+ program
24
+ .command('status <idOrName>')
25
+ .description('Show app status (pods, replicas, health)')
26
+ .option('--json', 'Output as JSON')
27
+ .action(withErrorHandler(async (idOrName, opts) => {
28
+ const project = await resolveProject(String(idOrName));
29
+ handleJson(opts.json, project);
30
+ console.log(chalk.bold(`Status: ${project.name}`));
31
+ console.log(` ${chalk.blue('Status:')} ${project.status ?? 'unknown'}`);
32
+ console.log(` ${chalk.blue('Replicas:')} ${project.replicas ?? 'N/A'}`);
33
+ console.log(` ${chalk.blue('URL:')} ${project.url ?? 'N/A'}`);
34
+ if (project.health) {
35
+ console.log(` ${chalk.blue('Health:')} ${project.health}`);
36
+ }
37
+ }));
38
+ }
39
+ //# sourceMappingURL=scale.js.map