@heramb1/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 (73) hide show
  1. package/dist/commands/deploy.d.ts +9 -0
  2. package/dist/commands/deploy.d.ts.map +1 -0
  3. package/dist/commands/deploy.js +82 -0
  4. package/dist/commands/deploy.js.map +1 -0
  5. package/dist/commands/env.d.ts +3 -0
  6. package/dist/commands/env.d.ts.map +1 -0
  7. package/dist/commands/env.js +52 -0
  8. package/dist/commands/env.js.map +1 -0
  9. package/dist/commands/init.d.ts +2 -0
  10. package/dist/commands/init.d.ts.map +1 -0
  11. package/dist/commands/init.js +82 -0
  12. package/dist/commands/init.js.map +1 -0
  13. package/dist/commands/logs.d.ts +2 -0
  14. package/dist/commands/logs.d.ts.map +1 -0
  15. package/dist/commands/logs.js +27 -0
  16. package/dist/commands/logs.js.map +1 -0
  17. package/dist/commands/migrate.d.ts +8 -0
  18. package/dist/commands/migrate.d.ts.map +1 -0
  19. package/dist/commands/migrate.js +84 -0
  20. package/dist/commands/migrate.js.map +1 -0
  21. package/dist/commands/plan.d.ts +2 -0
  22. package/dist/commands/plan.d.ts.map +1 -0
  23. package/dist/commands/plan.js +55 -0
  24. package/dist/commands/plan.js.map +1 -0
  25. package/dist/commands/status.d.ts +2 -0
  26. package/dist/commands/status.d.ts.map +1 -0
  27. package/dist/commands/status.js +36 -0
  28. package/dist/commands/status.js.map +1 -0
  29. package/dist/commands/ws.d.ts +2 -0
  30. package/dist/commands/ws.d.ts.map +1 -0
  31. package/dist/commands/ws.js +37 -0
  32. package/dist/commands/ws.js.map +1 -0
  33. package/dist/index.d.ts +3 -0
  34. package/dist/index.d.ts.map +1 -0
  35. package/dist/index.js +72 -0
  36. package/dist/index.js.map +1 -0
  37. package/dist/utils/config.d.ts +6 -0
  38. package/dist/utils/config.d.ts.map +1 -0
  39. package/dist/utils/config.js +23 -0
  40. package/dist/utils/config.js.map +1 -0
  41. package/dist/utils/connect.d.ts +7 -0
  42. package/dist/utils/connect.d.ts.map +1 -0
  43. package/dist/utils/connect.js +101 -0
  44. package/dist/utils/connect.js.map +1 -0
  45. package/dist/utils/credentials.d.ts +8 -0
  46. package/dist/utils/credentials.d.ts.map +1 -0
  47. package/dist/utils/credentials.js +56 -0
  48. package/dist/utils/credentials.js.map +1 -0
  49. package/dist/utils/gitignore.d.ts +5 -0
  50. package/dist/utils/gitignore.d.ts.map +1 -0
  51. package/dist/utils/gitignore.js +35 -0
  52. package/dist/utils/gitignore.js.map +1 -0
  53. package/dist/utils/output.d.ts +23 -0
  54. package/dist/utils/output.d.ts.map +1 -0
  55. package/dist/utils/output.js +53 -0
  56. package/dist/utils/output.js.map +1 -0
  57. package/dist/utils/preview.d.ts +7 -0
  58. package/dist/utils/preview.d.ts.map +1 -0
  59. package/dist/utils/preview.js +31 -0
  60. package/dist/utils/preview.js.map +1 -0
  61. package/dist/utils/provider-pick.d.ts +5 -0
  62. package/dist/utils/provider-pick.d.ts.map +1 -0
  63. package/dist/utils/provider-pick.js +110 -0
  64. package/dist/utils/provider-pick.js.map +1 -0
  65. package/dist/utils/registry.d.ts +3 -0
  66. package/dist/utils/registry.d.ts.map +1 -0
  67. package/dist/utils/registry.js +42 -0
  68. package/dist/utils/registry.js.map +1 -0
  69. package/dist/utils/stack-detector.d.ts +4 -0
  70. package/dist/utils/stack-detector.d.ts.map +1 -0
  71. package/dist/utils/stack-detector.js +141 -0
  72. package/dist/utils/stack-detector.js.map +1 -0
  73. package/package.json +45 -0
@@ -0,0 +1,9 @@
1
+ import { type DeployEnv } from '../utils/preview.js';
2
+ export interface DeployCommandOptions {
3
+ backendOnly?: boolean;
4
+ frontendOnly?: boolean;
5
+ env?: DeployEnv;
6
+ branch?: string;
7
+ }
8
+ export declare function deployCommand(options?: DeployCommandOptions): Promise<void>;
9
+ //# sourceMappingURL=deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAKA,OAAO,EAAsC,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAWzF,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,aAAa,CAAC,OAAO,GAAE,oBAAyB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8ErF"}
@@ -0,0 +1,82 @@
1
+ import ora from 'ora';
2
+ import chalk from 'chalk';
3
+ import { Orchestrator, isProviderConfig } from '@heramb1/core';
4
+ import { loadHerambConfig, saveHerambConfig } from '../utils/config.js';
5
+ import { createRegistry } from '../utils/registry.js';
6
+ import { applyPreviewContext, resolveBranch } from '../utils/preview.js';
7
+ import { formatStepFailure, formatStepLabel, formatStepSuccess, printBanner, printError, printPreviewReady, printUnlock, } from '../utils/output.js';
8
+ export async function deployCommand(options = {}) {
9
+ printBanner();
10
+ const deployEnv = options.env ?? 'production';
11
+ let config = loadHerambConfig();
12
+ if (deployEnv === 'preview') {
13
+ const branch = resolveBranch(options.branch);
14
+ if (!branch) {
15
+ printError('Preview deploy requires --branch (or GITHUB_HEAD_REF in CI)');
16
+ process.exit(1);
17
+ }
18
+ config = applyPreviewContext(config, branch);
19
+ console.log(chalk.dim(`Preview deploy for branch: ${chalk.cyan(branch)}\n`));
20
+ }
21
+ const registry = createRegistry(config);
22
+ let currentSpinner = null;
23
+ const orchestrator = new Orchestrator({
24
+ config,
25
+ registry,
26
+ credentials: {},
27
+ backendOnly: options.backendOnly,
28
+ frontendOnly: options.frontendOnly,
29
+ deployEnv,
30
+ branch: resolveBranch(options.branch),
31
+ corsWildcardFirstDeploy: deployEnv === 'production',
32
+ onStepStart: (step, index, total) => {
33
+ currentSpinner?.stop();
34
+ currentSpinner = ora(formatStepLabel(index, total, step.label)).start();
35
+ },
36
+ onStepComplete: (result, index, total) => {
37
+ currentSpinner?.stop();
38
+ const prefix = formatStepLabel(index, total, result.step.label);
39
+ if (result.success) {
40
+ console.log(`${prefix} ${formatStepSuccess(result.value)}`);
41
+ }
42
+ else {
43
+ console.log(`${prefix} ${formatStepFailure(result.error)}`);
44
+ }
45
+ currentSpinner = null;
46
+ },
47
+ });
48
+ const report = await orchestrator.run();
49
+ if (Object.keys(report.serviceIds).length > 0) {
50
+ let configUpdated = false;
51
+ for (const [key, id] of Object.entries(report.serviceIds)) {
52
+ const svc = config.services[key];
53
+ if (isProviderConfig(svc) && !svc.serviceId && !svc.projectId) {
54
+ svc.serviceId = id;
55
+ configUpdated = true;
56
+ }
57
+ else if (isProviderConfig(svc) && svc.provider === 'vercel' && !svc.projectId) {
58
+ svc.projectId = id;
59
+ configUpdated = true;
60
+ }
61
+ }
62
+ if (configUpdated) {
63
+ saveHerambConfig(config);
64
+ console.log(chalk.dim('Updated heramb.config.json with linked service IDs\n'));
65
+ }
66
+ }
67
+ if (report.success) {
68
+ if (deployEnv === 'preview') {
69
+ printPreviewReady(report);
70
+ }
71
+ else {
72
+ printUnlock(report);
73
+ }
74
+ process.exit(0);
75
+ }
76
+ else {
77
+ const lastError = report.steps.find((s) => !s.success)?.error;
78
+ printError(lastError ?? 'Deploy failed');
79
+ process.exit(1);
80
+ }
81
+ }
82
+ //# 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,3 @@
1
+ export declare function envPushCommand(): Promise<void>;
2
+ export declare function envPullCommand(): Promise<void>;
3
+ //# sourceMappingURL=env.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.ts","sourceRoot":"","sources":["../../src/commands/env.ts"],"names":[],"mappings":"AASA,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAuCpD;AAED,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAIpD"}
@@ -0,0 +1,52 @@
1
+ import { readFileSync, existsSync } from 'node:fs';
2
+ import { resolve } from 'node:path';
3
+ import chalk from 'chalk';
4
+ import dotenv from 'dotenv';
5
+ import { isProviderConfig } from '@heramb1/core';
6
+ import { loadHerambConfig } from '../utils/config.js';
7
+ import { createRegistry } from '../utils/registry.js';
8
+ import { printBanner } from '../utils/output.js';
9
+ export async function envPushCommand() {
10
+ printBanner();
11
+ const config = loadHerambConfig();
12
+ const registry = createRegistry(config);
13
+ const envPath = resolve(process.cwd(), '.env');
14
+ if (!existsSync(envPath)) {
15
+ console.error(chalk.red('No .env file found'));
16
+ process.exit(1);
17
+ }
18
+ const vars = dotenv.parse(readFileSync(envPath));
19
+ let pushed = 0;
20
+ for (const [key, svc] of Object.entries(config.services)) {
21
+ if (!isProviderConfig(svc) || !svc.serviceId)
22
+ continue;
23
+ const lock = registry.getLock(svc.provider);
24
+ if (!lock)
25
+ continue;
26
+ const manual = config.env?.manual ?? [];
27
+ const toPush = {};
28
+ for (const [k, v] of Object.entries(vars)) {
29
+ if (v !== undefined)
30
+ toPush[k] = v;
31
+ }
32
+ for (const m of manual) {
33
+ if (vars[m])
34
+ toPush[m] = vars[m];
35
+ }
36
+ const result = await lock.setEnvVars(svc.serviceId, toPush);
37
+ if (result.ok) {
38
+ console.log(chalk.green('✓') + ` Pushed ${Object.keys(toPush).length} vars to ${key} (${svc.provider})`);
39
+ pushed++;
40
+ }
41
+ else {
42
+ console.log(chalk.red('✗') + ` ${key}: ${result.error}`);
43
+ }
44
+ }
45
+ console.log(chalk.dim(`\n${pushed} service(s) updated\n`));
46
+ }
47
+ export async function envPullCommand() {
48
+ printBanner();
49
+ console.log(chalk.yellow('env pull requires provider-specific env list APIs — coming in v0.2'));
50
+ console.log(chalk.dim('Use `heramb status` to verify deployed URLs\n'));
51
+ }
52
+ //# 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
+ export declare function initCommand(): Promise<void>;
2
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAYA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAiFjD"}
@@ -0,0 +1,82 @@
1
+ import inquirer from 'inquirer';
2
+ import chalk from 'chalk';
3
+ import { basename } from 'node:path';
4
+ import { buildDeployPlan, providersNeededForPlan } from '@heramb1/core';
5
+ import { detectStack } from '../utils/stack-detector.js';
6
+ import { saveHerambConfig, configExists } from '../utils/config.js';
7
+ import { getCredentialsPath } from '../utils/credentials.js';
8
+ import { ensureGitignore } from '../utils/gitignore.js';
9
+ import { connectProviders } from '../utils/connect.js';
10
+ import { pickProviders, generateConfigFromChoices } from '../utils/provider-pick.js';
11
+ import { printBanner } from '../utils/output.js';
12
+ export async function initCommand() {
13
+ printBanner();
14
+ if (configExists()) {
15
+ const { overwrite } = await inquirer.prompt([
16
+ {
17
+ type: 'confirm',
18
+ name: 'overwrite',
19
+ message: 'heramb.config.json already exists. Overwrite?',
20
+ default: false,
21
+ },
22
+ ]);
23
+ if (!overwrite) {
24
+ console.log(chalk.dim('Init cancelled.'));
25
+ return;
26
+ }
27
+ }
28
+ console.log(chalk.dim('Scanning repo...\n'));
29
+ const stack = detectStack();
30
+ const plan = buildDeployPlan(stack);
31
+ if (stack.frontend) {
32
+ console.log(chalk.green('✓') + ` Frontend: ${stack.frontend.framework} at ${stack.frontend.path}`);
33
+ }
34
+ if (stack.backend) {
35
+ console.log(chalk.green('✓') + ` Backend: ${stack.backend.runtime} at ${stack.backend.path}`);
36
+ }
37
+ if (!stack.frontend && !stack.backend) {
38
+ console.log(chalk.yellow('⚠') + ' No frontend or backend detected — you can configure manually');
39
+ }
40
+ for (const line of plan.summary) {
41
+ console.log(chalk.cyan('→') + ` ${line}`);
42
+ }
43
+ for (const warning of stack.warnings) {
44
+ console.log(chalk.yellow('⚠') + ` ${warning}`);
45
+ if (warning.includes('hardcode port') || warning.includes('process.env.PORT')) {
46
+ console.log(chalk.dim(' Fix: app.listen(process.env.PORT || 3000)'));
47
+ }
48
+ if (warning.includes('Redis adapter')) {
49
+ console.log(chalk.dim(' Heramb will inject REDIS_URL — add @socket.io/redis-adapter to your app'));
50
+ }
51
+ }
52
+ const providerChoices = plan.services.length > 0 ? await pickProviders(plan) : {};
53
+ const providersNeeded = providersNeededForPlan(plan, providerChoices);
54
+ if (providersNeeded.length > 0) {
55
+ console.log(chalk.dim('\nConnect the platforms you chose — paste API keys or sign up on the fly:\n'));
56
+ await connectProviders(providersNeeded, { skipExisting: true });
57
+ }
58
+ const defaultName = basename(process.cwd()).replace(/[^a-z0-9-]/gi, '-').toLowerCase();
59
+ const { projectName } = await inquirer.prompt([
60
+ {
61
+ type: 'input',
62
+ name: 'projectName',
63
+ message: 'Project name:',
64
+ default: defaultName,
65
+ },
66
+ ]);
67
+ const config = plan.services.length > 0
68
+ ? generateConfigFromChoices(projectName, stack, providerChoices, plan.requirements)
69
+ : { project: projectName, services: {}, env: { manual: ['JWT_SECRET'] } };
70
+ saveHerambConfig(config);
71
+ const gitignoreResult = ensureGitignore();
72
+ if (gitignoreResult === 'created') {
73
+ console.log(chalk.green('✓') + ' Created .gitignore (secrets excluded from git)');
74
+ }
75
+ else if (gitignoreResult === 'updated') {
76
+ console.log(chalk.green('✓') + ' Updated .gitignore with Heramb secret patterns');
77
+ }
78
+ console.log(chalk.green('\n✓') + ' Created heramb.config.json');
79
+ console.log(chalk.dim(`Credentials stored in ${getCredentialsPath()}`));
80
+ console.log(chalk.dim('\nNext: heramb deploy\n'));
81
+ }
82
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function logsCommand(serviceName: string): Promise<void>;
2
+ //# sourceMappingURL=logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAMA,wBAAsB,WAAW,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAyBpE"}
@@ -0,0 +1,27 @@
1
+ import chalk from 'chalk';
2
+ import { isProviderConfig } from '@heramb1/core';
3
+ import { loadHerambConfig } from '../utils/config.js';
4
+ import { createRegistry } from '../utils/registry.js';
5
+ import { printBanner } from '../utils/output.js';
6
+ export async function logsCommand(serviceName) {
7
+ printBanner();
8
+ const config = loadHerambConfig();
9
+ const registry = createRegistry(config);
10
+ const svc = config.services[serviceName];
11
+ if (!svc || !isProviderConfig(svc)) {
12
+ console.error(chalk.red(`Service "${serviceName}" not found in heramb.config.json`));
13
+ console.log(chalk.dim('\nAvailable: ' + Object.keys(config.services).join(', ')));
14
+ process.exit(1);
15
+ }
16
+ const lock = registry.getLock(svc.provider);
17
+ if (!lock || !svc.serviceId) {
18
+ console.error(chalk.red(`Service "${serviceName}" not linked — add serviceId in config`));
19
+ process.exit(1);
20
+ }
21
+ console.log(chalk.dim(`Tailing logs for ${serviceName} (${svc.provider})...\n`));
22
+ for await (const line of lock.getLogs(svc.serviceId)) {
23
+ console.log(line);
24
+ }
25
+ console.log('');
26
+ }
27
+ //# sourceMappingURL=logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/commands/logs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAAmB;IACnD,WAAW,EAAE,CAAC;IACd,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAExC,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACzC,IAAI,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,WAAW,mCAAmC,CAAC,CAAC,CAAC;QACrF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC;QAC5B,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,WAAW,wCAAwC,CAAC,CAAC,CAAC;QAC1F,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,oBAAoB,WAAW,KAAK,GAAG,CAAC,QAAQ,QAAQ,CAAC,CAAC,CAAC;IAEjF,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;QACrD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface MigrateOptions {
2
+ service?: string;
3
+ from?: string;
4
+ to?: string;
5
+ dryRun?: boolean;
6
+ }
7
+ export declare function migrateCommand(options?: MigrateOptions): Promise<void>;
8
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,wBAAsB,cAAc,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CA4FhF"}
@@ -0,0 +1,84 @@
1
+ import inquirer from 'inquirer';
2
+ import chalk from 'chalk';
3
+ import { isProviderConfig } from '@heramb1/core';
4
+ import { loadHerambConfig, saveHerambConfig } from '../utils/config.js';
5
+ import { printBanner } from '../utils/output.js';
6
+ const IMPLEMENTED_PROVIDERS = ['railway', 'vercel', 'upstash'];
7
+ const PLANNED_PROVIDERS = ['render', 'netlify', 'fly', 'heroku', 'cloudflare-pages'];
8
+ export async function migrateCommand(options = {}) {
9
+ printBanner();
10
+ const config = loadHerambConfig();
11
+ let target = options.service;
12
+ if (!target) {
13
+ const services = Object.entries(config.services)
14
+ .filter(([, s]) => isProviderConfig(s))
15
+ .map(([k]) => k);
16
+ const { selected } = await inquirer.prompt([
17
+ {
18
+ type: 'list',
19
+ name: 'selected',
20
+ message: 'Which service to migrate?',
21
+ choices: services,
22
+ },
23
+ ]);
24
+ target = selected;
25
+ }
26
+ const svc = config.services[target];
27
+ if (!svc || !isProviderConfig(svc)) {
28
+ console.error(chalk.red(`Service "${target}" not found`));
29
+ process.exit(1);
30
+ }
31
+ const fromProvider = options.from ?? svc.provider;
32
+ let toProvider = options.to;
33
+ if (!toProvider) {
34
+ const { selected } = await inquirer.prompt([
35
+ {
36
+ type: 'list',
37
+ name: 'selected',
38
+ message: `Migrate ${target} from ${fromProvider} to:`,
39
+ choices: PLANNED_PROVIDERS.filter((p) => p !== fromProvider),
40
+ },
41
+ ]);
42
+ toProvider = selected;
43
+ }
44
+ if (fromProvider === toProvider) {
45
+ console.error(chalk.red('Source and target providers must differ'));
46
+ process.exit(1);
47
+ }
48
+ console.log(chalk.dim(`\nMigration plan: ${target} (${fromProvider} → ${toProvider})\n`));
49
+ const steps = [
50
+ `Read env vars from ${fromProvider}`,
51
+ `Deploy ${target} to ${toProvider}`,
52
+ 'Run smoke tests on new deployment',
53
+ 'Update frontend env vars (NEXT_PUBLIC_API_URL)',
54
+ 'Patch CORS on new backend',
55
+ 'Verify CORS + WebSocket end to end',
56
+ 'Mark migration complete (old deployment untouched until verified)',
57
+ ];
58
+ steps.forEach((step, i) => {
59
+ console.log(chalk.dim(` ${i + 1}.`) + ` ${step}`);
60
+ });
61
+ console.log('');
62
+ if (!IMPLEMENTED_PROVIDERS.includes(toProvider) && !IMPLEMENTED_PROVIDERS.includes(fromProvider)) {
63
+ console.log(chalk.yellow(`⚠ Provider locks for ${fromProvider} → ${toProvider} are planned.`));
64
+ console.log(chalk.dim(`Available locks today: ${IMPLEMENTED_PROVIDERS.join(', ')}\n`));
65
+ }
66
+ if (options.dryRun) {
67
+ console.log(chalk.dim('Dry run — config not modified.\n'));
68
+ return;
69
+ }
70
+ const previousProvider = svc.provider;
71
+ svc.provider = toProvider;
72
+ svc.serviceId = undefined;
73
+ saveHerambConfig(config);
74
+ console.log(chalk.green('✓') + ` Updated heramb.config.json: ${target} → ${toProvider}`);
75
+ console.log(chalk.dim(`\nOld ${fromProvider} deployment remains live.`));
76
+ console.log(chalk.dim('Next steps:'));
77
+ console.log(chalk.dim(` 1. heramb init # add ${toProvider} credentials if needed`));
78
+ console.log(chalk.dim(` 2. heramb deploy # deploy + validate before DNS switch`));
79
+ console.log(chalk.dim(` 3. heramb status # confirm new URLs\n`));
80
+ if (previousProvider !== fromProvider) {
81
+ console.log(chalk.yellow(`Note: config had provider "${previousProvider}", migrated from "${fromProvider}" as specified.\n`));
82
+ }
83
+ }
84
+ //# sourceMappingURL=migrate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function planCommand(): Promise<void>;
2
+ //# sourceMappingURL=plan.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.d.ts","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"AAKA,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CA6DjD"}
@@ -0,0 +1,55 @@
1
+ import chalk from 'chalk';
2
+ import { buildDeployPlan } from '@heramb1/core';
3
+ import { detectStack } from '../utils/stack-detector.js';
4
+ import { printBanner } from '../utils/output.js';
5
+ export async function planCommand() {
6
+ printBanner();
7
+ console.log(chalk.dim('Scanning repo...\n'));
8
+ const stack = detectStack();
9
+ const plan = buildDeployPlan(stack);
10
+ if (plan.summary.length > 0) {
11
+ for (const line of plan.summary) {
12
+ console.log(chalk.cyan('→') + ` ${line}`);
13
+ }
14
+ console.log('');
15
+ }
16
+ console.log(chalk.bold('Project requirements'));
17
+ const req = plan.requirements;
18
+ const flags = [
19
+ req.frontend && 'frontend',
20
+ req.backend && 'backend',
21
+ req.websocket && 'WebSockets',
22
+ req.redis && 'Redis',
23
+ req.longRunning && 'always-on server',
24
+ ].filter(Boolean);
25
+ console.log(chalk.dim(` ${flags.join(' · ') || 'none detected'}\n`));
26
+ for (const svc of plan.services) {
27
+ console.log(chalk.bold(`${svc.label}${svc.path ? chalk.dim(` (${svc.path})`) : ''}`));
28
+ console.log(chalk.dim(` Needs: ${svc.requirements.join(', ')}`));
29
+ for (const warning of svc.warnings) {
30
+ console.log(chalk.yellow(' ⚠') + ` ${warning}`);
31
+ }
32
+ console.log(chalk.dim('\n Platform fit (best first):\n'));
33
+ for (const rec of svc.recommendations.slice(0, 6)) {
34
+ const status = rec.score > 0
35
+ ? rec.implemented
36
+ ? chalk.green('✓ ready')
37
+ : chalk.yellow('○ planned')
38
+ : chalk.red('✗ unsuitable');
39
+ console.log(` ${status} ${chalk.bold(rec.name)}${rec.score > 0 ? chalk.dim(` — score ${rec.score}`) : ''}`);
40
+ if (rec.reasons.length > 0 && rec.score > 0) {
41
+ console.log(chalk.dim(` ${rec.reasons.join(' · ')}`));
42
+ }
43
+ for (const blocker of rec.blockers) {
44
+ console.log(chalk.red(` ✗ ${blocker}`));
45
+ }
46
+ }
47
+ const best = svc.recommendations.find((r) => r.implemented && r.score > 0);
48
+ if (best) {
49
+ console.log(chalk.green(`\n Recommended: ${best.name}`));
50
+ }
51
+ console.log('');
52
+ }
53
+ console.log(chalk.dim('Run `heramb init` to pick platforms and connect accounts.\n'));
54
+ }
55
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/commands/plan.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function statusCommand(): Promise<void>;
2
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAMA,wBAAsB,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAqCnD"}
@@ -0,0 +1,36 @@
1
+ import chalk from 'chalk';
2
+ import { isProviderConfig } from '@heramb1/core';
3
+ import { loadHerambConfig } from '../utils/config.js';
4
+ import { createRegistry } from '../utils/registry.js';
5
+ import { printBanner } from '../utils/output.js';
6
+ export async function statusCommand() {
7
+ printBanner();
8
+ const config = loadHerambConfig();
9
+ const registry = createRegistry(config);
10
+ console.log(chalk.bold(`Project: ${config.project}\n`));
11
+ for (const [key, svc] of Object.entries(config.services)) {
12
+ if (!isProviderConfig(svc))
13
+ continue;
14
+ const lock = registry.getLock(svc.provider);
15
+ const serviceId = svc.serviceId;
16
+ if (!lock || !serviceId) {
17
+ console.log(`${chalk.dim(key.padEnd(12))} ${chalk.yellow('not linked')} (${svc.provider})`);
18
+ continue;
19
+ }
20
+ try {
21
+ const status = await lock.getStatus(serviceId);
22
+ const statusColor = status.status === 'live'
23
+ ? chalk.green
24
+ : status.status === 'failed'
25
+ ? chalk.red
26
+ : chalk.yellow;
27
+ console.log(`${chalk.dim(key.padEnd(12))} ${statusColor(status.status.padEnd(10))} ${status.url ?? chalk.dim('no url')}`);
28
+ }
29
+ catch (err) {
30
+ const msg = err instanceof Error ? err.message : String(err);
31
+ console.log(`${chalk.dim(key.padEnd(12))} ${chalk.red('error')} ${msg}`);
32
+ }
33
+ }
34
+ console.log('');
35
+ }
36
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,aAAa;IACjC,WAAW,EAAE,CAAC;IACd,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;IAClC,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IAExC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;IAExD,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC;YAAE,SAAS;QAErC,MAAM,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;QAEhC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACxB,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC;YAC5F,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAC/C,MAAM,WAAW,GACf,MAAM,CAAC,MAAM,KAAK,MAAM;gBACtB,CAAC,CAAC,KAAK,CAAC,KAAK;gBACb,CAAC,CAAC,MAAM,CAAC,MAAM,KAAK,QAAQ;oBAC1B,CAAC,CAAC,KAAK,CAAC,GAAG;oBACX,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;YAErB,OAAO,CAAC,GAAG,CACT,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAC7G,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAC7D,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC,CAAC;QAC3E,CAAC;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;AAClB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function wsTestCommand(urlArg?: string): Promise<void>;
2
+ //# sourceMappingURL=ws.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws.d.ts","sourceRoot":"","sources":["../../src/commands/ws.ts"],"names":[],"mappings":"AAKA,wBAAsB,aAAa,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkClE"}
@@ -0,0 +1,37 @@
1
+ import chalk from 'chalk';
2
+ import { testWebSocket } from '@heramb1/core';
3
+ import { loadHerambConfig } from '../utils/config.js';
4
+ import { printBanner } from '../utils/output.js';
5
+ export async function wsTestCommand(urlArg) {
6
+ printBanner();
7
+ let url = urlArg;
8
+ if (!url) {
9
+ try {
10
+ const config = loadHerambConfig();
11
+ const backend = config.services.backend;
12
+ if (backend && 'derives' in backend) {
13
+ console.log(chalk.dim('No URL provided — deploy first or pass a URL'));
14
+ process.exit(1);
15
+ }
16
+ }
17
+ catch {
18
+ console.error(chalk.red('Provide a WebSocket URL: heramb ws test wss://...'));
19
+ process.exit(1);
20
+ }
21
+ }
22
+ if (!url) {
23
+ console.error(chalk.red('WebSocket URL required'));
24
+ process.exit(1);
25
+ }
26
+ process.stdout.write(chalk.dim(`Testing ${url}... `));
27
+ try {
28
+ const latency = await testWebSocket(url, 10000);
29
+ console.log(chalk.green(`✓ handshake OK (${latency}ms)\n`));
30
+ }
31
+ catch (err) {
32
+ const msg = err instanceof Error ? err.message : String(err);
33
+ console.log(chalk.red(`✗ ${msg}\n`));
34
+ process.exit(1);
35
+ }
36
+ }
37
+ //# sourceMappingURL=ws.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ws.js","sourceRoot":"","sources":["../../src/commands/ws.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAe;IACjD,WAAW,EAAE,CAAC;IAEd,IAAI,GAAG,GAAG,MAAM,CAAC;IAEjB,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC;YACxC,IAAI,OAAO,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;gBACpC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC,CAAC;gBACvE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC,CAAC;YAC9E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC;IAEtD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAmB,OAAO,OAAO,CAAC,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,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":""}