nexusapp-cli 1.0.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 (48) hide show
  1. package/bin/nexus +2 -0
  2. package/dist/client.d.ts +6 -0
  3. package/dist/client.d.ts.map +1 -0
  4. package/dist/client.js +63 -0
  5. package/dist/client.js.map +1 -0
  6. package/dist/commands/auth.d.ts +3 -0
  7. package/dist/commands/auth.d.ts.map +1 -0
  8. package/dist/commands/auth.js +159 -0
  9. package/dist/commands/auth.js.map +1 -0
  10. package/dist/commands/deploy.d.ts +3 -0
  11. package/dist/commands/deploy.d.ts.map +1 -0
  12. package/dist/commands/deploy.js +594 -0
  13. package/dist/commands/deploy.js.map +1 -0
  14. package/dist/commands/domain.d.ts +3 -0
  15. package/dist/commands/domain.d.ts.map +1 -0
  16. package/dist/commands/domain.js +174 -0
  17. package/dist/commands/domain.js.map +1 -0
  18. package/dist/commands/project.d.ts +3 -0
  19. package/dist/commands/project.d.ts.map +1 -0
  20. package/dist/commands/project.js +92 -0
  21. package/dist/commands/project.js.map +1 -0
  22. package/dist/commands/secret.d.ts +3 -0
  23. package/dist/commands/secret.d.ts.map +1 -0
  24. package/dist/commands/secret.js +121 -0
  25. package/dist/commands/secret.js.map +1 -0
  26. package/dist/config.d.ts +10 -0
  27. package/dist/config.d.ts.map +1 -0
  28. package/dist/config.js +53 -0
  29. package/dist/config.js.map +1 -0
  30. package/dist/index.d.ts +3 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +24 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/output.d.ts +9 -0
  35. package/dist/output.d.ts.map +1 -0
  36. package/dist/output.js +71 -0
  37. package/dist/output.js.map +1 -0
  38. package/package.json +29 -0
  39. package/src/client.ts +68 -0
  40. package/src/commands/auth.ts +166 -0
  41. package/src/commands/deploy.ts +534 -0
  42. package/src/commands/domain.ts +167 -0
  43. package/src/commands/project.ts +81 -0
  44. package/src/commands/secret.ts +117 -0
  45. package/src/config.ts +56 -0
  46. package/src/index.ts +25 -0
  47. package/src/output.ts +65 -0
  48. package/tsconfig.json +19 -0
@@ -0,0 +1,174 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerDomain = registerDomain;
7
+ const inquirer_1 = __importDefault(require("inquirer"));
8
+ const client_js_1 = require("../client.js");
9
+ const output_js_1 = require("../output.js");
10
+ const chalk_1 = __importDefault(require("chalk"));
11
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
12
+ async function resolveDeployment(nameOrId) {
13
+ if (UUID_RE.test(nameOrId)) {
14
+ try {
15
+ const res = await client_js_1.client.get(`/api/deployments/${nameOrId}`);
16
+ return (0, client_js_1.unwrap)(res.data);
17
+ }
18
+ catch { /* fall through */ }
19
+ }
20
+ const listRes = await client_js_1.client.get('/api/deployments');
21
+ const all = Array.isArray((0, client_js_1.unwrap)(listRes.data)) ? (0, client_js_1.unwrap)(listRes.data) : [];
22
+ const match = all.find((d) => d.name === nameOrId || d.displayName === nameOrId);
23
+ if (!match)
24
+ throw new Error(`Deployment not found: "${nameOrId}"`);
25
+ const res = await client_js_1.client.get(`/api/deployments/${match.id}`);
26
+ return (0, client_js_1.unwrap)(res.data);
27
+ }
28
+ function verificationBadge(status) {
29
+ switch ((status || '').toUpperCase()) {
30
+ case 'VERIFIED': return chalk_1.default.green('VERIFIED');
31
+ case 'PENDING': return chalk_1.default.yellow('PENDING');
32
+ case 'FAILED': return chalk_1.default.red('FAILED');
33
+ default: return chalk_1.default.gray(status || 'UNKNOWN');
34
+ }
35
+ }
36
+ function registerDomain(program) {
37
+ const domain = program.command('domain').description('Custom domain management');
38
+ // list
39
+ domain
40
+ .command('list <deployment>')
41
+ .description('List custom domains for a deployment')
42
+ .option('--json', 'Output raw JSON')
43
+ .action(async (nameOrId, opts) => {
44
+ try {
45
+ const d = await resolveDeployment(nameOrId);
46
+ const res = await client_js_1.client.get(`/api/deployments/${d.id}/domains`);
47
+ const domains = (0, client_js_1.unwrap)(res.data) || [];
48
+ if (opts.json) {
49
+ (0, output_js_1.printJson)(domains);
50
+ return;
51
+ }
52
+ if (!domains.length) {
53
+ console.log(`No custom domains on "${d.displayName || d.name}".`);
54
+ return;
55
+ }
56
+ (0, output_js_1.printTable)(['ID', 'DOMAIN', 'STATUS', 'SSL', 'ADDED'], domains.map((dom) => [
57
+ dom.id,
58
+ dom.domain,
59
+ verificationBadge(dom.verificationStatus),
60
+ dom.sslStatus ? chalk_1.default.green('✓') : chalk_1.default.gray('—'),
61
+ dom.createdAt ? (0, output_js_1.timeAgo)(dom.createdAt) : '—',
62
+ ]));
63
+ }
64
+ catch (err) {
65
+ (0, output_js_1.errorMsg)((0, client_js_1.apiError)(err));
66
+ process.exit(1);
67
+ }
68
+ });
69
+ // add
70
+ domain
71
+ .command('add <deployment> <domain>')
72
+ .description('Add a custom domain to a deployment')
73
+ .option('--json', 'Output raw JSON')
74
+ .action(async (nameOrId, domainName, opts) => {
75
+ try {
76
+ const d = await resolveDeployment(nameOrId);
77
+ const res = await client_js_1.client.post(`/api/deployments/${d.id}/domains`, { domain: domainName });
78
+ const dom = (0, client_js_1.unwrap)(res.data);
79
+ if (opts.json) {
80
+ (0, output_js_1.printJson)(dom);
81
+ return;
82
+ }
83
+ (0, output_js_1.success)(`Domain "${dom.domain}" added to "${d.displayName || d.name}"`);
84
+ console.log('');
85
+ console.log(' Next steps to verify ownership:');
86
+ if (dom.txtRecord || dom.verificationToken) {
87
+ console.log(` 1. Add a DNS TXT record:`);
88
+ console.log(` Name: ${chalk_1.default.cyan(dom.txtRecordName || `_nexusai-verify.${domainName}`)}`);
89
+ console.log(` Value: ${chalk_1.default.cyan(dom.txtRecord || dom.verificationToken)}`);
90
+ }
91
+ else {
92
+ console.log(` 1. Point your DNS to the deployment URL`);
93
+ }
94
+ console.log(` 2. Run: ${chalk_1.default.bold(`nexus domain verify ${nameOrId} ${dom.id}`)}`);
95
+ }
96
+ catch (err) {
97
+ (0, output_js_1.errorMsg)((0, client_js_1.apiError)(err));
98
+ process.exit(1);
99
+ }
100
+ });
101
+ // verify
102
+ domain
103
+ .command('verify <deployment> <domain-id>')
104
+ .description('Trigger DNS verification for a custom domain')
105
+ .option('--json', 'Output raw JSON')
106
+ .action(async (nameOrId, domainId, opts) => {
107
+ try {
108
+ const d = await resolveDeployment(nameOrId);
109
+ const res = await client_js_1.client.post(`/api/deployments/${d.id}/domains/${domainId}/verify`);
110
+ const result = (0, client_js_1.unwrap)(res.data);
111
+ if (opts.json) {
112
+ (0, output_js_1.printJson)(result);
113
+ return;
114
+ }
115
+ const dom = result.domain || result;
116
+ const status = (dom.verificationStatus || '').toUpperCase();
117
+ if (status === 'VERIFIED') {
118
+ (0, output_js_1.success)(`Domain "${dom.domain}" verified successfully`);
119
+ if (dom.sslStatus) {
120
+ console.log(` SSL: ${chalk_1.default.green('active')}`);
121
+ }
122
+ }
123
+ else {
124
+ console.log(` Status: ${verificationBadge(status)}`);
125
+ console.log('');
126
+ if (result.verificationResult?.error) {
127
+ console.log(` ${chalk_1.default.yellow('!')} ${result.verificationResult.error}`);
128
+ }
129
+ console.log(` DNS changes can take up to 48h to propagate.`);
130
+ console.log(` Run this command again once DNS has updated.`);
131
+ }
132
+ }
133
+ catch (err) {
134
+ (0, output_js_1.errorMsg)((0, client_js_1.apiError)(err));
135
+ process.exit(1);
136
+ }
137
+ });
138
+ // remove
139
+ domain
140
+ .command('remove <deployment> <domain-id>')
141
+ .description('Remove a custom domain from a deployment')
142
+ .option('--yes', 'Skip confirmation prompt')
143
+ .action(async (nameOrId, domainId, opts) => {
144
+ try {
145
+ const d = await resolveDeployment(nameOrId);
146
+ if (!opts.yes) {
147
+ // Show the domain name in the prompt
148
+ let domainName = domainId;
149
+ try {
150
+ const listRes = await client_js_1.client.get(`/api/deployments/${d.id}/domains`);
151
+ const domains = (0, client_js_1.unwrap)(listRes.data) || [];
152
+ const found = domains.find((dom) => dom.id === domainId);
153
+ if (found)
154
+ domainName = found.domain;
155
+ }
156
+ catch { /* use id */ }
157
+ const { confirm } = await inquirer_1.default.prompt([
158
+ { type: 'confirm', name: 'confirm', message: `Remove domain "${domainName}" from "${d.displayName || d.name}"?`, default: false },
159
+ ]);
160
+ if (!confirm) {
161
+ console.log('Cancelled.');
162
+ return;
163
+ }
164
+ }
165
+ await client_js_1.client.delete(`/api/deployments/${d.id}/domains/${domainId}`);
166
+ (0, output_js_1.success)(`Domain removed.`);
167
+ }
168
+ catch (err) {
169
+ (0, output_js_1.errorMsg)((0, client_js_1.apiError)(err));
170
+ process.exit(1);
171
+ }
172
+ });
173
+ }
174
+ //# sourceMappingURL=domain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain.js","sourceRoot":"","sources":["../../src/commands/domain.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerProject(program: Command): void;
3
+ //# sourceMappingURL=project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.d.ts","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,eAAe,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA2EtD"}
@@ -0,0 +1,92 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerProject = registerProject;
7
+ const inquirer_1 = __importDefault(require("inquirer"));
8
+ const client_js_1 = require("../client.js");
9
+ const output_js_1 = require("../output.js");
10
+ function registerProject(program) {
11
+ const project = program.command('project').description('Project management commands');
12
+ // list
13
+ project
14
+ .command('list')
15
+ .description('List projects')
16
+ .option('--json', 'Output raw JSON')
17
+ .action(async (opts) => {
18
+ try {
19
+ const res = await client_js_1.client.get('/api/projects');
20
+ const raw = (0, client_js_1.unwrap)(res.data);
21
+ const projects = Array.isArray(raw) ? raw : raw.projects || [];
22
+ if (opts.json) {
23
+ (0, output_js_1.printJson)(projects);
24
+ return;
25
+ }
26
+ if (!projects.length) {
27
+ console.log('No projects found.');
28
+ return;
29
+ }
30
+ (0, output_js_1.printTable)(['ID', 'NAME', 'CREATED'], projects.map((p) => [
31
+ p.id,
32
+ p.name,
33
+ p.createdAt ? (0, output_js_1.timeAgo)(p.createdAt) : '—',
34
+ ]));
35
+ }
36
+ catch (err) {
37
+ (0, output_js_1.errorMsg)((0, client_js_1.apiError)(err));
38
+ process.exit(1);
39
+ }
40
+ });
41
+ // create
42
+ project
43
+ .command('create')
44
+ .description('Create a new project')
45
+ .requiredOption('--name <name>', 'Project name')
46
+ .option('--json', 'Output raw JSON')
47
+ .action(async (opts) => {
48
+ try {
49
+ const res = await client_js_1.client.post('/api/projects', { name: opts.name });
50
+ const p = (0, client_js_1.unwrap)(res.data);
51
+ if (opts.json) {
52
+ (0, output_js_1.printJson)(p);
53
+ return;
54
+ }
55
+ (0, output_js_1.success)(`Project "${p.name}" created (${p.id})`);
56
+ }
57
+ catch (err) {
58
+ (0, output_js_1.errorMsg)((0, client_js_1.apiError)(err));
59
+ process.exit(1);
60
+ }
61
+ });
62
+ // delete
63
+ project
64
+ .command('delete <id>')
65
+ .description('Delete a project')
66
+ .option('--yes', 'Skip confirmation prompt')
67
+ .action(async (id, opts) => {
68
+ if (!opts.yes) {
69
+ const { confirm } = await inquirer_1.default.prompt([
70
+ {
71
+ type: 'confirm',
72
+ name: 'confirm',
73
+ message: `Delete project "${id}"? All deployments in this project will be removed.`,
74
+ default: false,
75
+ },
76
+ ]);
77
+ if (!confirm) {
78
+ console.log('Cancelled.');
79
+ return;
80
+ }
81
+ }
82
+ try {
83
+ await client_js_1.client.delete(`/api/projects/${id}`);
84
+ (0, output_js_1.success)(`Project ${id} deleted.`);
85
+ }
86
+ catch (err) {
87
+ (0, output_js_1.errorMsg)((0, client_js_1.apiError)(err));
88
+ process.exit(1);
89
+ }
90
+ });
91
+ }
92
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/commands/project.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerSecret(program: Command): void;
3
+ //# sourceMappingURL=secret.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret.d.ts","sourceRoot":"","sources":["../../src/commands/secret.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CA+GrD"}
@@ -0,0 +1,121 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.registerSecret = registerSecret;
7
+ const inquirer_1 = __importDefault(require("inquirer"));
8
+ const client_js_1 = require("../client.js");
9
+ const output_js_1 = require("../output.js");
10
+ function registerSecret(program) {
11
+ const secret = program.command('secret').description('Secret management commands');
12
+ // list
13
+ secret
14
+ .command('list')
15
+ .description('List secrets')
16
+ .option('--environment <env>', 'Filter by environment')
17
+ .option('--json', 'Output raw JSON')
18
+ .action(async (opts) => {
19
+ try {
20
+ const params = {};
21
+ if (opts.environment)
22
+ params.environment = opts.environment;
23
+ const res = await client_js_1.client.get('/api/secrets', { params });
24
+ const raw = (0, client_js_1.unwrap)(res.data);
25
+ const secrets = Array.isArray(raw) ? raw : raw.secrets || [];
26
+ if (opts.json) {
27
+ (0, output_js_1.printJson)(secrets);
28
+ return;
29
+ }
30
+ if (!secrets.length) {
31
+ console.log('No secrets found.');
32
+ return;
33
+ }
34
+ (0, output_js_1.printTable)(['ID', 'NAME', 'ENVIRONMENT', 'CREATED'], secrets.map((s) => [
35
+ s.id,
36
+ s.name,
37
+ s.environment || '—',
38
+ s.createdAt ? (0, output_js_1.timeAgo)(s.createdAt) : '—',
39
+ ]));
40
+ }
41
+ catch (err) {
42
+ (0, output_js_1.errorMsg)((0, client_js_1.apiError)(err));
43
+ process.exit(1);
44
+ }
45
+ });
46
+ // create
47
+ secret
48
+ .command('create')
49
+ .description('Create a new secret')
50
+ .requiredOption('--name <name>', 'Secret name')
51
+ .requiredOption('--environment <env>', 'Target environment')
52
+ .option('--value <value>', 'Secret value (prompt if omitted)')
53
+ .action(async (opts) => {
54
+ let value = opts.value;
55
+ if (!value) {
56
+ const ans = await inquirer_1.default.prompt([
57
+ { type: 'password', name: 'value', message: 'Value:', mask: '•' },
58
+ ]);
59
+ value = ans.value;
60
+ }
61
+ try {
62
+ await client_js_1.client.post('/api/secrets', {
63
+ name: opts.name,
64
+ environment: opts.environment,
65
+ value,
66
+ });
67
+ (0, output_js_1.success)(`Secret ${opts.name} created (${opts.environment})`);
68
+ }
69
+ catch (err) {
70
+ (0, output_js_1.errorMsg)((0, client_js_1.apiError)(err));
71
+ process.exit(1);
72
+ }
73
+ });
74
+ // update
75
+ secret
76
+ .command('update <id>')
77
+ .description('Update a secret value')
78
+ .option('--value <value>', 'New secret value (prompt if omitted)')
79
+ .action(async (id, opts) => {
80
+ let value = opts.value;
81
+ if (!value) {
82
+ const ans = await inquirer_1.default.prompt([
83
+ { type: 'password', name: 'value', message: 'New value:', mask: '•' },
84
+ ]);
85
+ value = ans.value;
86
+ }
87
+ try {
88
+ await client_js_1.client.put(`/api/secrets/${id}`, { value });
89
+ (0, output_js_1.success)(`Secret ${id} updated.`);
90
+ }
91
+ catch (err) {
92
+ (0, output_js_1.errorMsg)((0, client_js_1.apiError)(err));
93
+ process.exit(1);
94
+ }
95
+ });
96
+ // delete
97
+ secret
98
+ .command('delete <id>')
99
+ .description('Delete a secret')
100
+ .option('--yes', 'Skip confirmation prompt')
101
+ .action(async (id, opts) => {
102
+ if (!opts.yes) {
103
+ const { confirm } = await inquirer_1.default.prompt([
104
+ { type: 'confirm', name: 'confirm', message: `Delete secret "${id}"?`, default: false },
105
+ ]);
106
+ if (!confirm) {
107
+ console.log('Cancelled.');
108
+ return;
109
+ }
110
+ }
111
+ try {
112
+ await client_js_1.client.delete(`/api/secrets/${id}`);
113
+ (0, output_js_1.success)(`Secret ${id} deleted.`);
114
+ }
115
+ catch (err) {
116
+ (0, output_js_1.errorMsg)((0, client_js_1.apiError)(err));
117
+ process.exit(1);
118
+ }
119
+ });
120
+ }
121
+ //# sourceMappingURL=secret.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secret.js","sourceRoot":"","sources":["../../src/commands/secret.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export interface Config {
2
+ apiUrl: string;
3
+ token: string;
4
+ tokenId: string;
5
+ }
6
+ export declare function getConfig(): Partial<Config>;
7
+ export declare function saveConfig(config: Config): void;
8
+ export declare function clearConfig(): void;
9
+ export declare function requireToken(): string;
10
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,MAAM;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAOD,wBAAgB,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAkB3C;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAK/C;AAED,wBAAgB,WAAW,IAAI,IAAI,CAIlC;AAED,wBAAgB,YAAY,IAAI,MAAM,CAOrC"}
package/dist/config.js ADDED
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.getConfig = getConfig;
7
+ exports.saveConfig = saveConfig;
8
+ exports.clearConfig = clearConfig;
9
+ exports.requireToken = requireToken;
10
+ const fs_1 = __importDefault(require("fs"));
11
+ const path_1 = __importDefault(require("path"));
12
+ const os_1 = __importDefault(require("os"));
13
+ const CONFIG_DIR = path_1.default.join(os_1.default.homedir(), '.nexusai');
14
+ const CONFIG_PATH = path_1.default.join(CONFIG_DIR, 'config.json');
15
+ const DEFAULT_API_URL = 'https://api.nexusai.run';
16
+ function getConfig() {
17
+ const envToken = process.env.NEXUSAI_TOKEN;
18
+ const envApiUrl = process.env.NEXUSAI_API_URL;
19
+ let fileConfig = {};
20
+ if (fs_1.default.existsSync(CONFIG_PATH)) {
21
+ try {
22
+ fileConfig = JSON.parse(fs_1.default.readFileSync(CONFIG_PATH, 'utf8'));
23
+ }
24
+ catch {
25
+ // ignore malformed config
26
+ }
27
+ }
28
+ return {
29
+ apiUrl: envApiUrl || fileConfig.apiUrl || DEFAULT_API_URL,
30
+ token: envToken || fileConfig.token || '',
31
+ tokenId: fileConfig.tokenId || '',
32
+ };
33
+ }
34
+ function saveConfig(config) {
35
+ if (!fs_1.default.existsSync(CONFIG_DIR)) {
36
+ fs_1.default.mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });
37
+ }
38
+ fs_1.default.writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2), { mode: 0o600 });
39
+ }
40
+ function clearConfig() {
41
+ if (fs_1.default.existsSync(CONFIG_PATH)) {
42
+ fs_1.default.unlinkSync(CONFIG_PATH);
43
+ }
44
+ }
45
+ function requireToken() {
46
+ const config = getConfig();
47
+ if (!config.token) {
48
+ console.error("Not logged in. Run 'nexus auth login' first.");
49
+ process.exit(1);
50
+ }
51
+ return config.token;
52
+ }
53
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;AAeA,8BAkBC;AAED,gCAKC;AAED,kCAIC;AAED,oCAOC;AAvDD,4CAAoB;AACpB,gDAAwB;AACxB,4CAAoB;AAQpB,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,YAAE,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AACvD,MAAM,WAAW,GAAG,cAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AAEzD,MAAM,eAAe,GAAG,yBAAyB,CAAC;AAElD,SAAgB,SAAS;IACvB,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IAC3C,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC;IAE9C,IAAI,UAAU,GAAoB,EAAE,CAAC;IACrC,IAAI,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,YAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;QAChE,CAAC;QAAC,MAAM,CAAC;YACP,0BAA0B;QAC5B,CAAC;IACH,CAAC;IAED,OAAO;QACL,MAAM,EAAE,SAAS,IAAI,UAAU,CAAC,MAAM,IAAI,eAAe;QACzD,KAAK,EAAE,QAAQ,IAAI,UAAU,CAAC,KAAK,IAAI,EAAE;QACzC,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,EAAE;KAClC,CAAC;AACJ,CAAC;AAED,SAAgB,UAAU,CAAC,MAAc;IACvC,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC/B,YAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC7D,CAAC;IACD,YAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;AAClF,CAAC;AAED,SAAgB,WAAW;IACzB,IAAI,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,SAAgB,YAAY;IAC1B,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QAClB,OAAO,CAAC,KAAK,CAAC,8CAA8C,CAAC,CAAC;QAC9D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC;AACtB,CAAC"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,24 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ const commander_1 = require("commander");
5
+ const auth_js_1 = require("./commands/auth.js");
6
+ const deploy_js_1 = require("./commands/deploy.js");
7
+ const secret_js_1 = require("./commands/secret.js");
8
+ const project_js_1 = require("./commands/project.js");
9
+ const domain_js_1 = require("./commands/domain.js");
10
+ const program = new commander_1.Command();
11
+ program
12
+ .name('nexus')
13
+ .description('NEXUS AI command-line interface')
14
+ .version('1.0.0');
15
+ (0, auth_js_1.registerAuth)(program);
16
+ (0, deploy_js_1.registerDeploy)(program);
17
+ (0, secret_js_1.registerSecret)(program);
18
+ (0, project_js_1.registerProject)(program);
19
+ (0, domain_js_1.registerDomain)(program);
20
+ program.parseAsync(process.argv).catch((err) => {
21
+ console.error(err.message || String(err));
22
+ process.exit(1);
23
+ });
24
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AACA,yCAAoC;AACpC,gDAAkD;AAClD,oDAAsD;AACtD,oDAAsD;AACtD,sDAAwD;AACxD,oDAAsD;AAEtD,MAAM,OAAO,GAAG,IAAI,mBAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,OAAO,CAAC;KACb,WAAW,CAAC,iCAAiC,CAAC;KAC9C,OAAO,CAAC,OAAO,CAAC,CAAC;AAEpB,IAAA,sBAAY,EAAC,OAAO,CAAC,CAAC;AACtB,IAAA,0BAAc,EAAC,OAAO,CAAC,CAAC;AACxB,IAAA,0BAAc,EAAC,OAAO,CAAC,CAAC;AACxB,IAAA,4BAAe,EAAC,OAAO,CAAC,CAAC;AACzB,IAAA,0BAAc,EAAC,OAAO,CAAC,CAAC;AAExB,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IAC7C,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { Ora } from 'ora';
2
+ export declare function statusBadge(status: string): string;
3
+ export declare function printTable(headers: string[], rows: (string | undefined | null)[][]): void;
4
+ export declare function printJson(obj: unknown): void;
5
+ export declare function spinner(text: string): Ora;
6
+ export declare function timeAgo(dateStr: string): string;
7
+ export declare function success(msg: string): void;
8
+ export declare function errorMsg(msg: string): void;
9
+ //# sourceMappingURL=output.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.d.ts","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"AAEA,OAAY,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAa/B,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGlD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,EAAE,EAAE,GAAG,IAAI,CAiBzF;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,OAAO,GAAG,IAAI,CAE5C;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,CAEzC;AAED,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAS/C;AAED,wBAAgB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAEzC;AAED,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAE1C"}
package/dist/output.js ADDED
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.statusBadge = statusBadge;
7
+ exports.printTable = printTable;
8
+ exports.printJson = printJson;
9
+ exports.spinner = spinner;
10
+ exports.timeAgo = timeAgo;
11
+ exports.success = success;
12
+ exports.errorMsg = errorMsg;
13
+ const chalk_1 = __importDefault(require("chalk"));
14
+ const cli_table3_1 = __importDefault(require("cli-table3"));
15
+ const ora_1 = __importDefault(require("ora"));
16
+ const STATUS_COLORS = {
17
+ RUNNING: chalk_1.default.green,
18
+ BUILDING: chalk_1.default.yellow,
19
+ DEPLOYING: chalk_1.default.yellow,
20
+ FAILED: chalk_1.default.red,
21
+ STOPPED: chalk_1.default.gray,
22
+ PENDING: chalk_1.default.blue,
23
+ QUEUED: chalk_1.default.blue,
24
+ TERMINATED: chalk_1.default.gray,
25
+ };
26
+ function statusBadge(status) {
27
+ const colorFn = STATUS_COLORS[status?.toUpperCase()] || chalk_1.default.white;
28
+ return colorFn(status || 'UNKNOWN');
29
+ }
30
+ function printTable(headers, rows) {
31
+ const table = new cli_table3_1.default({
32
+ head: headers.map((h) => chalk_1.default.bold(h)),
33
+ style: { head: [], border: [] },
34
+ chars: {
35
+ top: '', 'top-mid': '', 'top-left': '', 'top-right': '',
36
+ bottom: '', 'bottom-mid': '', 'bottom-left': '', 'bottom-right': '',
37
+ left: '', 'left-mid': '', mid: '', 'mid-mid': '',
38
+ right: '', 'right-mid': '', middle: ' ',
39
+ },
40
+ });
41
+ for (const row of rows) {
42
+ table.push(row.map((cell) => cell ?? chalk_1.default.gray('—')));
43
+ }
44
+ console.log(table.toString());
45
+ }
46
+ function printJson(obj) {
47
+ console.log(JSON.stringify(obj, null, 2));
48
+ }
49
+ function spinner(text) {
50
+ return (0, ora_1.default)(text).start();
51
+ }
52
+ function timeAgo(dateStr) {
53
+ const diff = Date.now() - new Date(dateStr).getTime();
54
+ const s = Math.floor(diff / 1000);
55
+ if (s < 60)
56
+ return `${s}s ago`;
57
+ const m = Math.floor(s / 60);
58
+ if (m < 60)
59
+ return `${m}m ago`;
60
+ const h = Math.floor(m / 60);
61
+ if (h < 24)
62
+ return `${h}h ago`;
63
+ return `${Math.floor(h / 24)}d ago`;
64
+ }
65
+ function success(msg) {
66
+ console.log(chalk_1.default.green('✓') + ' ' + msg);
67
+ }
68
+ function errorMsg(msg) {
69
+ console.error(chalk_1.default.red('✗') + ' ' + msg);
70
+ }
71
+ //# sourceMappingURL=output.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}