@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.
- package/dist/api.d.ts +12 -0
- package/dist/api.js +98 -0
- package/dist/api.js.map +1 -0
- package/dist/auth.d.ts +10 -0
- package/dist/auth.js +40 -0
- package/dist/auth.js.map +1 -0
- package/dist/commands/auth.d.ts +2 -0
- package/dist/commands/auth.js +106 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/billing.d.ts +2 -0
- package/dist/commands/billing.js +58 -0
- package/dist/commands/billing.js.map +1 -0
- package/dist/commands/db.d.ts +2 -0
- package/dist/commands/db.js +191 -0
- package/dist/commands/db.js.map +1 -0
- package/dist/commands/deploy.d.ts +2 -0
- package/dist/commands/deploy.js +72 -0
- package/dist/commands/deploy.js.map +1 -0
- package/dist/commands/domains.d.ts +2 -0
- package/dist/commands/domains.js +48 -0
- package/dist/commands/domains.js.map +1 -0
- package/dist/commands/env.d.ts +2 -0
- package/dist/commands/env.js +54 -0
- package/dist/commands/env.js.map +1 -0
- package/dist/commands/jobs.d.ts +2 -0
- package/dist/commands/jobs.js +160 -0
- package/dist/commands/jobs.js.map +1 -0
- package/dist/commands/open.d.ts +2 -0
- package/dist/commands/open.js +19 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/platform.d.ts +2 -0
- package/dist/commands/platform.js +57 -0
- package/dist/commands/platform.js.map +1 -0
- package/dist/commands/projects.d.ts +2 -0
- package/dist/commands/projects.js +91 -0
- package/dist/commands/projects.js.map +1 -0
- package/dist/commands/scale.d.ts +2 -0
- package/dist/commands/scale.js +39 -0
- package/dist/commands/scale.js.map +1 -0
- package/dist/commands/storage.d.ts +2 -0
- package/dist/commands/storage.js +128 -0
- package/dist/commands/storage.js.map +1 -0
- package/dist/commands/usage.d.ts +2 -0
- package/dist/commands/usage.js +25 -0
- package/dist/commands/usage.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/util.d.ts +26 -0
- package/dist/util.js +72 -0
- package/dist/util.js.map +1 -0
- package/package.json +27 -0
- package/src/api.ts +124 -0
- package/src/auth.ts +53 -0
- package/src/commands/auth.ts +117 -0
- package/src/commands/billing.ts +75 -0
- package/src/commands/db.ts +237 -0
- package/src/commands/deploy.ts +91 -0
- package/src/commands/domains.ts +62 -0
- package/src/commands/env.ts +69 -0
- package/src/commands/jobs.ts +287 -0
- package/src/commands/open.ts +22 -0
- package/src/commands/platform.ts +88 -0
- package/src/commands/projects.ts +115 -0
- package/src/commands/scale.ts +48 -0
- package/src/commands/storage.ts +214 -0
- package/src/commands/usage.ts +30 -0
- package/src/index.ts +39 -0
- package/src/util.ts +92 -0
- 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,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,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,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,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,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,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,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
|