lobstercage-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 (58) hide show
  1. package/README.md +64 -0
  2. package/dist/commands/auth.d.ts +39 -0
  3. package/dist/commands/auth.d.ts.map +1 -0
  4. package/dist/commands/auth.js +393 -0
  5. package/dist/commands/auth.js.map +1 -0
  6. package/dist/commands/billing.d.ts +11 -0
  7. package/dist/commands/billing.d.ts.map +1 -0
  8. package/dist/commands/billing.js +181 -0
  9. package/dist/commands/billing.js.map +1 -0
  10. package/dist/commands/cages.d.ts +87 -0
  11. package/dist/commands/cages.d.ts.map +1 -0
  12. package/dist/commands/cages.js +603 -0
  13. package/dist/commands/cages.js.map +1 -0
  14. package/dist/commands/env.d.ts +42 -0
  15. package/dist/commands/env.d.ts.map +1 -0
  16. package/dist/commands/env.js +287 -0
  17. package/dist/commands/env.js.map +1 -0
  18. package/dist/commands/exec.d.ts +12 -0
  19. package/dist/commands/exec.d.ts.map +1 -0
  20. package/dist/commands/exec.js +127 -0
  21. package/dist/commands/exec.js.map +1 -0
  22. package/dist/commands/tunnel.d.ts +29 -0
  23. package/dist/commands/tunnel.d.ts.map +1 -0
  24. package/dist/commands/tunnel.js +232 -0
  25. package/dist/commands/tunnel.js.map +1 -0
  26. package/dist/index.d.ts +31 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +138 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/lib/api.d.ts +96 -0
  31. package/dist/lib/api.d.ts.map +1 -0
  32. package/dist/lib/api.js +348 -0
  33. package/dist/lib/api.js.map +1 -0
  34. package/dist/lib/config.d.ts +63 -0
  35. package/dist/lib/config.d.ts.map +1 -0
  36. package/dist/lib/config.js +193 -0
  37. package/dist/lib/config.js.map +1 -0
  38. package/dist/lib/docker.d.ts +52 -0
  39. package/dist/lib/docker.d.ts.map +1 -0
  40. package/dist/lib/docker.js +210 -0
  41. package/dist/lib/docker.js.map +1 -0
  42. package/dist/lib/error-handler.d.ts +30 -0
  43. package/dist/lib/error-handler.d.ts.map +1 -0
  44. package/dist/lib/error-handler.js +113 -0
  45. package/dist/lib/error-handler.js.map +1 -0
  46. package/dist/lib/output.d.ts +71 -0
  47. package/dist/lib/output.d.ts.map +1 -0
  48. package/dist/lib/output.js +237 -0
  49. package/dist/lib/output.js.map +1 -0
  50. package/dist/lib/utils.d.ts +17 -0
  51. package/dist/lib/utils.d.ts.map +1 -0
  52. package/dist/lib/utils.js +71 -0
  53. package/dist/lib/utils.js.map +1 -0
  54. package/dist/types/index.d.ts +158 -0
  55. package/dist/types/index.d.ts.map +1 -0
  56. package/dist/types/index.js +8 -0
  57. package/dist/types/index.js.map +1 -0
  58. package/package.json +63 -0
@@ -0,0 +1,287 @@
1
+ "use strict";
2
+ /**
3
+ * Environment Variable Commands
4
+ *
5
+ * env list, env set, env get, env delete, env scan
6
+ */
7
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
8
+ if (k2 === undefined) k2 = k;
9
+ var desc = Object.getOwnPropertyDescriptor(m, k);
10
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
11
+ desc = { enumerable: true, get: function() { return m[k]; } };
12
+ }
13
+ Object.defineProperty(o, k2, desc);
14
+ }) : (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ o[k2] = m[k];
17
+ }));
18
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
19
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
20
+ }) : function(o, v) {
21
+ o["default"] = v;
22
+ });
23
+ var __importStar = (this && this.__importStar) || (function () {
24
+ var ownKeys = function(o) {
25
+ ownKeys = Object.getOwnPropertyNames || function (o) {
26
+ var ar = [];
27
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
28
+ return ar;
29
+ };
30
+ return ownKeys(o);
31
+ };
32
+ return function (mod) {
33
+ if (mod && mod.__esModule) return mod;
34
+ var result = {};
35
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
36
+ __setModuleDefault(result, mod);
37
+ return result;
38
+ };
39
+ })();
40
+ var __importDefault = (this && this.__importDefault) || function (mod) {
41
+ return (mod && mod.__esModule) ? mod : { "default": mod };
42
+ };
43
+ Object.defineProperty(exports, "__esModule", { value: true });
44
+ exports.envListHandler = envListHandler;
45
+ exports.envSetHandler = envSetHandler;
46
+ exports.envGetHandler = envGetHandler;
47
+ exports.envDeleteHandler = envDeleteHandler;
48
+ exports.envScanHandler = envScanHandler;
49
+ exports.createEnvCommands = createEnvCommands;
50
+ const ora_1 = __importDefault(require("ora"));
51
+ const api = __importStar(require("../lib/api"));
52
+ const output = __importStar(require("../lib/output"));
53
+ const utils_1 = require("../lib/utils");
54
+ const error_handler_1 = require("../lib/error-handler");
55
+ /**
56
+ * Validates environment variable name format
57
+ */
58
+ function isValidEnvName(name) {
59
+ if (!name) {
60
+ return { valid: false, message: 'Variable name is required' };
61
+ }
62
+ if (!/^[A-Z_][A-Z0-9_]*$/.test(name)) {
63
+ return { valid: false, message: 'Variable name must be uppercase with underscores (e.g., MY_VAR)' };
64
+ }
65
+ if (name.length > 256) {
66
+ return { valid: false, message: 'Variable name must be at most 256 characters' };
67
+ }
68
+ return { valid: true };
69
+ }
70
+ /**
71
+ * Env list command handler
72
+ */
73
+ async function envListHandler(nameOrId, options) {
74
+ const spinner = (0, ora_1.default)('Fetching environment variables...').start();
75
+ try {
76
+ (0, utils_1.requireAuth)();
77
+ const cageId = await (0, utils_1.resolveCageId)(nameOrId);
78
+ const vars = await api.listEnvVars(cageId);
79
+ spinner.stop();
80
+ if (options.json) {
81
+ output.json(vars);
82
+ }
83
+ else {
84
+ console.log();
85
+ console.log(output.formatEnvVars(vars));
86
+ console.log();
87
+ }
88
+ }
89
+ catch (err) {
90
+ (0, error_handler_1.handleError)(err, { spinner, json: options.json, context: 'fetching environment variables' });
91
+ }
92
+ }
93
+ /**
94
+ * Env set command handler
95
+ */
96
+ async function envSetHandler(nameOrId, keyValues, options) {
97
+ if (keyValues.length === 0) {
98
+ output.error('No variables specified. Use KEY=VALUE format.');
99
+ process.exit(1);
100
+ }
101
+ // Parse KEY=VALUE pairs
102
+ const variables = {};
103
+ for (const kv of keyValues) {
104
+ const eqIndex = kv.indexOf('=');
105
+ if (eqIndex === -1) {
106
+ output.error(`Invalid format: "${kv}". Use KEY=VALUE`);
107
+ process.exit(1);
108
+ }
109
+ const key = kv.slice(0, eqIndex);
110
+ const value = kv.slice(eqIndex + 1);
111
+ const validation = isValidEnvName(key);
112
+ if (!validation.valid) {
113
+ output.error(`Invalid variable name "${key}": ${validation.message}`);
114
+ process.exit(1);
115
+ }
116
+ variables[key] = value;
117
+ }
118
+ const spinner = (0, ora_1.default)('Setting environment variables...').start();
119
+ try {
120
+ (0, utils_1.requireAuth)();
121
+ const cageId = await (0, utils_1.resolveCageId)(nameOrId);
122
+ const result = await api.setEnvVars(cageId, {
123
+ variables,
124
+ scan: !options.noScan,
125
+ });
126
+ spinner.stop();
127
+ if (options.json) {
128
+ output.json(result);
129
+ }
130
+ else {
131
+ output.success(`Set ${Object.keys(variables).length} environment variable(s)`);
132
+ // Show security warnings if any
133
+ if (result.securityWarnings && result.securityWarnings.length > 0) {
134
+ console.log();
135
+ output.warning('Security warnings:');
136
+ console.log();
137
+ console.log(output.formatSecurityWarnings(result.securityWarnings));
138
+ console.log();
139
+ }
140
+ }
141
+ }
142
+ catch (err) {
143
+ (0, error_handler_1.handleError)(err, { spinner, json: options.json, context: 'setting environment variables' });
144
+ }
145
+ }
146
+ /**
147
+ * Env get command handler
148
+ */
149
+ async function envGetHandler(nameOrId, varName, options) {
150
+ const validation = isValidEnvName(varName);
151
+ if (!validation.valid) {
152
+ output.error(`Invalid variable name: ${validation.message}`);
153
+ process.exit(1);
154
+ }
155
+ const spinner = (0, ora_1.default)('Fetching environment variable...').start();
156
+ try {
157
+ (0, utils_1.requireAuth)();
158
+ const cageId = await (0, utils_1.resolveCageId)(nameOrId);
159
+ const result = await api.getEnvVar(cageId, varName);
160
+ spinner.stop();
161
+ if (options.json) {
162
+ output.json(result);
163
+ }
164
+ else {
165
+ // Output just the value for easy scripting
166
+ console.log(result.value);
167
+ }
168
+ }
169
+ catch (err) {
170
+ (0, error_handler_1.handleError)(err, { spinner, json: options.json, context: 'fetching environment variable' });
171
+ }
172
+ }
173
+ /**
174
+ * Env delete command handler
175
+ */
176
+ async function envDeleteHandler(nameOrId, varNames, options) {
177
+ if (varNames.length === 0) {
178
+ output.error('No variables specified');
179
+ process.exit(1);
180
+ }
181
+ // Validate all names first
182
+ for (const varName of varNames) {
183
+ const validation = isValidEnvName(varName);
184
+ if (!validation.valid) {
185
+ output.error(`Invalid variable name "${varName}": ${validation.message}`);
186
+ process.exit(1);
187
+ }
188
+ }
189
+ const spinner = (0, ora_1.default)('Deleting environment variables...').start();
190
+ try {
191
+ (0, utils_1.requireAuth)();
192
+ const cageId = await (0, utils_1.resolveCageId)(nameOrId);
193
+ // Delete each variable
194
+ const results = [];
195
+ for (const varName of varNames) {
196
+ try {
197
+ await api.deleteEnvVar(cageId, varName);
198
+ results.push({ name: varName, success: true });
199
+ }
200
+ catch (err) {
201
+ if (err instanceof api.ApiClientError) {
202
+ results.push({ name: varName, success: false, error: err.message });
203
+ }
204
+ else {
205
+ throw err;
206
+ }
207
+ }
208
+ }
209
+ spinner.stop();
210
+ if (options.json) {
211
+ output.json(results);
212
+ }
213
+ else {
214
+ const successes = results.filter(r => r.success);
215
+ const failures = results.filter(r => !r.success);
216
+ if (successes.length > 0) {
217
+ output.success(`Deleted ${successes.length} variable(s)`);
218
+ }
219
+ for (const failure of failures) {
220
+ output.error(`Failed to delete ${failure.name}: ${failure.error}`);
221
+ }
222
+ }
223
+ }
224
+ catch (err) {
225
+ (0, error_handler_1.handleError)(err, { spinner, json: options.json, context: 'deleting environment variables' });
226
+ }
227
+ }
228
+ /**
229
+ * Env scan command handler
230
+ */
231
+ async function envScanHandler(nameOrId, options) {
232
+ const spinner = (0, ora_1.default)('Scanning environment variables for security issues...').start();
233
+ try {
234
+ (0, utils_1.requireAuth)();
235
+ const cageId = await (0, utils_1.resolveCageId)(nameOrId);
236
+ const result = await api.scanEnvVars(cageId);
237
+ spinner.stop();
238
+ if (options.json) {
239
+ output.json(result);
240
+ }
241
+ else {
242
+ console.log();
243
+ console.log(output.formatSecurityWarnings(result.warnings));
244
+ console.log();
245
+ }
246
+ }
247
+ catch (err) {
248
+ (0, error_handler_1.handleError)(err, { spinner, json: options.json, context: 'scanning environment variables' });
249
+ }
250
+ }
251
+ /**
252
+ * Create env commands
253
+ */
254
+ function createEnvCommands(program) {
255
+ const env = program
256
+ .command('env')
257
+ .description('Manage environment variables');
258
+ env
259
+ .command('list <cage>')
260
+ .alias('ls')
261
+ .description('List environment variables')
262
+ .option('--json', 'Output as JSON')
263
+ .action(envListHandler);
264
+ env
265
+ .command('set <cage> <keyValues...>')
266
+ .description('Set environment variables (KEY=VALUE format)')
267
+ .option('--no-scan', 'Skip security scan')
268
+ .option('--json', 'Output as JSON')
269
+ .action(envSetHandler);
270
+ env
271
+ .command('get <cage> <name>')
272
+ .description('Get environment variable value')
273
+ .option('--json', 'Output as JSON')
274
+ .action(envGetHandler);
275
+ env
276
+ .command('delete <cage> <names...>')
277
+ .alias('rm')
278
+ .description('Delete environment variables')
279
+ .option('--json', 'Output as JSON')
280
+ .action(envDeleteHandler);
281
+ env
282
+ .command('scan <cage>')
283
+ .description('Scan environment variables for security issues')
284
+ .option('--json', 'Output as JSON')
285
+ .action(envScanHandler);
286
+ }
287
+ //# 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,12 @@
1
+ /**
2
+ * Exec Command
3
+ *
4
+ * Execute commands in a cage or open an interactive shell.
5
+ * Uses the API when --api-url is configured, otherwise local Docker.
6
+ */
7
+ import { Command } from 'commander';
8
+ export declare function execHandler(name: string, args: string[], options: {
9
+ local?: boolean;
10
+ }): Promise<void>;
11
+ export declare function createExecCommand(program: Command): void;
12
+ //# sourceMappingURL=exec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/commands/exec.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAK3G;AAqED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CASxD"}
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ /**
3
+ * Exec Command
4
+ *
5
+ * Execute commands in a cage or open an interactive shell.
6
+ * Uses the API when --api-url is configured, otherwise local Docker.
7
+ */
8
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
9
+ if (k2 === undefined) k2 = k;
10
+ var desc = Object.getOwnPropertyDescriptor(m, k);
11
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
12
+ desc = { enumerable: true, get: function() { return m[k]; } };
13
+ }
14
+ Object.defineProperty(o, k2, desc);
15
+ }) : (function(o, m, k, k2) {
16
+ if (k2 === undefined) k2 = k;
17
+ o[k2] = m[k];
18
+ }));
19
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
20
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
21
+ }) : function(o, v) {
22
+ o["default"] = v;
23
+ });
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.execHandler = execHandler;
43
+ exports.createExecCommand = createExecCommand;
44
+ const child_process_1 = require("child_process");
45
+ const api = __importStar(require("../lib/api"));
46
+ const docker = __importStar(require("../lib/docker"));
47
+ const output = __importStar(require("../lib/output"));
48
+ const utils_1 = require("../lib/utils");
49
+ const error_handler_1 = require("../lib/error-handler");
50
+ async function execHandler(name, args, options) {
51
+ if (options.local) {
52
+ return execHandlerLocal(name, args);
53
+ }
54
+ return execHandlerApi(name, args);
55
+ }
56
+ /**
57
+ * Exec via API endpoint
58
+ */
59
+ async function execHandlerApi(name, args) {
60
+ if (args.length === 0) {
61
+ output.error('Interactive shell is not supported in API mode. Provide a command to execute.');
62
+ process.exit(1);
63
+ }
64
+ try {
65
+ const cageId = await (0, utils_1.resolveCageId)(name);
66
+ const result = await api.execInCage(cageId, args);
67
+ if (result.stdout) {
68
+ process.stdout.write(result.stdout);
69
+ }
70
+ if (result.stderr) {
71
+ process.stderr.write(result.stderr);
72
+ }
73
+ process.exit(result.exitCode ?? 0);
74
+ }
75
+ catch (err) {
76
+ (0, error_handler_1.handleError)(err, { context: 'executing command in cage' });
77
+ }
78
+ }
79
+ /**
80
+ * Exec via local Docker
81
+ */
82
+ async function execHandlerLocal(name, args) {
83
+ // Verify cage exists and is running
84
+ try {
85
+ const cage = await docker.getCage(name);
86
+ if (cage.status !== 'running') {
87
+ output.error(`Cage "${name}" is not running (status: ${cage.status})`);
88
+ process.exit(1);
89
+ }
90
+ }
91
+ catch (err) {
92
+ (0, error_handler_1.handleError)(err, { context: 'checking cage status' });
93
+ }
94
+ const containerName = docker.getContainerName(name);
95
+ const isInteractive = args.length === 0;
96
+ const spawnArgs = ['exec'];
97
+ if (isInteractive) {
98
+ spawnArgs.push('-it', containerName, '/bin/bash');
99
+ }
100
+ else {
101
+ if (process.stdin.isTTY) {
102
+ spawnArgs.push('-it');
103
+ }
104
+ spawnArgs.push(containerName, ...args);
105
+ }
106
+ const child = (0, child_process_1.spawn)('docker', spawnArgs, {
107
+ stdio: 'inherit',
108
+ });
109
+ child.on('exit', (code) => {
110
+ process.exit(code ?? 0);
111
+ });
112
+ child.on('error', (err) => {
113
+ output.error(`Failed to exec: ${err.message}`);
114
+ process.exit(1);
115
+ });
116
+ }
117
+ function createExecCommand(program) {
118
+ program
119
+ .command('exec <name> [command...]')
120
+ .description('Execute a command in a cage (interactive shell if no command given)')
121
+ .option('-l, --local', 'Use local Docker instead of remote API')
122
+ .passThroughOptions()
123
+ .action(async (name, command, options) => {
124
+ await execHandler(name, command, options);
125
+ });
126
+ }
127
+ //# sourceMappingURL=exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/commands/exec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Tunnel Commands
3
+ *
4
+ * tunnel, ssh
5
+ */
6
+ import { Command } from 'commander';
7
+ /**
8
+ * Tunnel command handler
9
+ */
10
+ export declare function tunnelHandler(nameOrId: string, options: {
11
+ port?: string;
12
+ localPort?: string;
13
+ ssh?: boolean;
14
+ json?: boolean;
15
+ }): Promise<void>;
16
+ /**
17
+ * SSH command handler
18
+ *
19
+ * This is a convenience wrapper around tunnel --ssh
20
+ */
21
+ export declare function sshHandler(nameOrId: string, options: {
22
+ localPort?: string;
23
+ json?: boolean;
24
+ }): Promise<void>;
25
+ /**
26
+ * Create tunnel commands
27
+ */
28
+ export declare function createTunnelCommands(program: Command): void;
29
+ //# sourceMappingURL=tunnel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tunnel.d.ts","sourceRoot":"","sources":["../../src/commands/tunnel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmGpC;;GAEG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IACP,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB,GACA,OAAO,CAAC,IAAI,CAAC,CAkDf;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,OAAO,CAAA;CAAE,GAC9C,OAAO,CAAC,IAAI,CAAC,CAyCf;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAgB3D"}