@laldigital/novaserve 2.2.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 (123) hide show
  1. package/README.md +384 -0
  2. package/bin/nova.js +2 -0
  3. package/dist/commands/ai.d.ts +9 -0
  4. package/dist/commands/ai.d.ts.map +1 -0
  5. package/dist/commands/ai.js +152 -0
  6. package/dist/commands/ai.js.map +1 -0
  7. package/dist/commands/build.d.ts +6 -0
  8. package/dist/commands/build.d.ts.map +1 -0
  9. package/dist/commands/build.js +62 -0
  10. package/dist/commands/build.js.map +1 -0
  11. package/dist/commands/cost.d.ts +8 -0
  12. package/dist/commands/cost.d.ts.map +1 -0
  13. package/dist/commands/cost.js +50 -0
  14. package/dist/commands/cost.js.map +1 -0
  15. package/dist/commands/dashboard.d.ts +3 -0
  16. package/dist/commands/dashboard.d.ts.map +1 -0
  17. package/dist/commands/dashboard.js +25 -0
  18. package/dist/commands/dashboard.js.map +1 -0
  19. package/dist/commands/deploy.d.ts +8 -0
  20. package/dist/commands/deploy.d.ts.map +1 -0
  21. package/dist/commands/deploy.js +128 -0
  22. package/dist/commands/deploy.js.map +1 -0
  23. package/dist/commands/destroy.d.ts +6 -0
  24. package/dist/commands/destroy.d.ts.map +1 -0
  25. package/dist/commands/destroy.js +75 -0
  26. package/dist/commands/destroy.js.map +1 -0
  27. package/dist/commands/dev.d.ts +8 -0
  28. package/dist/commands/dev.d.ts.map +1 -0
  29. package/dist/commands/dev.js +60 -0
  30. package/dist/commands/dev.js.map +1 -0
  31. package/dist/commands/diff.d.ts +8 -0
  32. package/dist/commands/diff.d.ts.map +1 -0
  33. package/dist/commands/diff.js +60 -0
  34. package/dist/commands/diff.js.map +1 -0
  35. package/dist/commands/doctor.d.ts +9 -0
  36. package/dist/commands/doctor.d.ts.map +1 -0
  37. package/dist/commands/doctor.js +61 -0
  38. package/dist/commands/doctor.js.map +1 -0
  39. package/dist/commands/drift.d.ts +8 -0
  40. package/dist/commands/drift.d.ts.map +1 -0
  41. package/dist/commands/drift.js +81 -0
  42. package/dist/commands/drift.js.map +1 -0
  43. package/dist/commands/events.d.ts +8 -0
  44. package/dist/commands/events.d.ts.map +1 -0
  45. package/dist/commands/events.js +102 -0
  46. package/dist/commands/events.js.map +1 -0
  47. package/dist/commands/graph.d.ts +8 -0
  48. package/dist/commands/graph.d.ts.map +1 -0
  49. package/dist/commands/graph.js +55 -0
  50. package/dist/commands/graph.js.map +1 -0
  51. package/dist/commands/impact.d.ts +9 -0
  52. package/dist/commands/impact.d.ts.map +1 -0
  53. package/dist/commands/impact.js +65 -0
  54. package/dist/commands/impact.js.map +1 -0
  55. package/dist/commands/init.d.ts +8 -0
  56. package/dist/commands/init.d.ts.map +1 -0
  57. package/dist/commands/init.js +339 -0
  58. package/dist/commands/init.js.map +1 -0
  59. package/dist/commands/invoke.d.ts +9 -0
  60. package/dist/commands/invoke.d.ts.map +1 -0
  61. package/dist/commands/invoke.js +64 -0
  62. package/dist/commands/invoke.js.map +1 -0
  63. package/dist/commands/ir.d.ts +8 -0
  64. package/dist/commands/ir.d.ts.map +1 -0
  65. package/dist/commands/ir.js +85 -0
  66. package/dist/commands/ir.js.map +1 -0
  67. package/dist/commands/logs.d.ts +3 -0
  68. package/dist/commands/logs.d.ts.map +1 -0
  69. package/dist/commands/logs.js +50 -0
  70. package/dist/commands/logs.js.map +1 -0
  71. package/dist/commands/plan.d.ts +9 -0
  72. package/dist/commands/plan.d.ts.map +1 -0
  73. package/dist/commands/plan.js +81 -0
  74. package/dist/commands/plan.js.map +1 -0
  75. package/dist/commands/plugins.d.ts +9 -0
  76. package/dist/commands/plugins.d.ts.map +1 -0
  77. package/dist/commands/plugins.js +49 -0
  78. package/dist/commands/plugins.js.map +1 -0
  79. package/dist/commands/promote.d.ts +9 -0
  80. package/dist/commands/promote.d.ts.map +1 -0
  81. package/dist/commands/promote.js +44 -0
  82. package/dist/commands/promote.js.map +1 -0
  83. package/dist/commands/rollback.d.ts +9 -0
  84. package/dist/commands/rollback.d.ts.map +1 -0
  85. package/dist/commands/rollback.js +129 -0
  86. package/dist/commands/rollback.js.map +1 -0
  87. package/dist/commands/security.d.ts +8 -0
  88. package/dist/commands/security.d.ts.map +1 -0
  89. package/dist/commands/security.js +84 -0
  90. package/dist/commands/security.js.map +1 -0
  91. package/dist/commands/state.d.ts +8 -0
  92. package/dist/commands/state.d.ts.map +1 -0
  93. package/dist/commands/state.js +135 -0
  94. package/dist/commands/state.js.map +1 -0
  95. package/dist/commands/trace.d.ts +8 -0
  96. package/dist/commands/trace.d.ts.map +1 -0
  97. package/dist/commands/trace.js +66 -0
  98. package/dist/commands/trace.js.map +1 -0
  99. package/dist/index.d.ts +35 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +102 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/runtime.d.ts +5 -0
  104. package/dist/runtime.d.ts.map +1 -0
  105. package/dist/runtime.js +5 -0
  106. package/dist/runtime.js.map +1 -0
  107. package/dist/ui/banner.d.ts +14 -0
  108. package/dist/ui/banner.d.ts.map +1 -0
  109. package/dist/ui/banner.js +37 -0
  110. package/dist/ui/banner.js.map +1 -0
  111. package/dist/ui/spinner.d.ts +15 -0
  112. package/dist/ui/spinner.d.ts.map +1 -0
  113. package/dist/ui/spinner.js +39 -0
  114. package/dist/ui/spinner.js.map +1 -0
  115. package/dist/utils/config-loader.d.ts +12 -0
  116. package/dist/utils/config-loader.d.ts.map +1 -0
  117. package/dist/utils/config-loader.js +29 -0
  118. package/dist/utils/config-loader.js.map +1 -0
  119. package/dist/utils/logger.d.ts +24 -0
  120. package/dist/utils/logger.d.ts.map +1 -0
  121. package/dist/utils/logger.js +52 -0
  122. package/dist/utils/logger.js.map +1 -0
  123. package/package.json +86 -0
@@ -0,0 +1,50 @@
1
+ /**
2
+ * `nova cost`
3
+ *
4
+ * Cost Intelligence Engine for monthly infrastructure expenditure estimation.
5
+ */
6
+ import { Command } from "commander";
7
+ import chalk from "chalk";
8
+ import { NovaCompiler, NovaCostEstimator, toResource } from "novaserve-core";
9
+ import { loadConfig } from "../utils/config-loader.js";
10
+ export function costCommand() {
11
+ const cmd = new Command("cost").description("Infrastructure Cost Intelligence");
12
+ cmd
13
+ .command("estimate")
14
+ .description("Estimate monthly infrastructure cost by resource and provider")
15
+ .option("-p, --provider <name>", "Target cloud provider", "aws")
16
+ .action(async (options) => {
17
+ console.log(chalk.bold.yellow("\n◆ NovaServe Cost Intelligence & Estimation\n"));
18
+ try {
19
+ const app = await loadConfig();
20
+ const coreResources = (app.resources || []).map((r) => toResource(r));
21
+ const compileResult = NovaCompiler.compile({
22
+ appName: app.name || "nova-app",
23
+ targetProvider: options.provider,
24
+ resources: coreResources,
25
+ });
26
+ const report = NovaCostEstimator.estimate(compileResult.ir, options.provider);
27
+ console.log(`Application: ${chalk.cyan(report.appName)}`);
28
+ console.log(`Provider: ${chalk.bold.magenta(report.provider.toUpperCase())}`);
29
+ console.log(`Total Monthly Estimate: ${chalk.bold.green(`$${report.totalMonthlyUsd.toFixed(2)}`)}\n`);
30
+ console.log(chalk.bold("Resource Breakdown:"));
31
+ for (const item of report.items) {
32
+ console.log(`• ${chalk.bold(item.resourceName)} (${item.type.toUpperCase()}): ${chalk.green(`$${item.estimatedMonthlyUsd.toFixed(2)}/mo`)}`);
33
+ console.log(` ${chalk.gray(item.breakdown)}`);
34
+ }
35
+ if (report.optimizations.length > 0) {
36
+ console.log(`\n${chalk.bold.yellow("Potential Cost Optimizations:")}`);
37
+ for (const opt of report.optimizations) {
38
+ console.log(`💡 ${opt.advice}`);
39
+ }
40
+ }
41
+ console.log("");
42
+ }
43
+ catch (err) {
44
+ const msg = err instanceof Error ? err.message : String(err);
45
+ console.log(chalk.red(`Cost estimation failed: ${msg}`));
46
+ }
47
+ });
48
+ return cmd;
49
+ }
50
+ //# sourceMappingURL=cost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost.js","sourceRoot":"","sources":["../../src/commands/cost.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from "commander";
2
+ export declare const dashboardCommand: () => Command;
3
+ //# sourceMappingURL=dashboard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.d.ts","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,eAAO,MAAM,gBAAgB,eAoB5B,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { Command } from "commander";
2
+ import { logger } from "../utils/logger.js";
3
+ import { exec } from "child_process";
4
+ import { join } from "path";
5
+ import { existsSync } from "fs";
6
+ export const dashboardCommand = () => {
7
+ return new Command("dashboard")
8
+ .description("Launch the NovaServe local dashboard")
9
+ .option("-p, --port <port>", "Port to run the dashboard on", "4000")
10
+ .action(async (options) => {
11
+ logger.info(`Starting local dashboard on port ${options.port}...`);
12
+ const dashboardDir = join(process.cwd(), "apps", "dashboard");
13
+ if (existsSync(dashboardDir)) {
14
+ const child = exec(`npm run dev -- --port ${options.port}`, { cwd: dashboardDir });
15
+ child.stdout?.on('data', (data) => console.log(data.toString().trim()));
16
+ child.stderr?.on('data', (data) => console.error(data.toString().trim()));
17
+ logger.success(`Dashboard running at http://localhost:${options.port}`);
18
+ logger.info("Press Ctrl+C to stop.");
19
+ }
20
+ else {
21
+ logger.error("Dashboard assets not found. Are you running this in the monorepo?");
22
+ }
23
+ });
24
+ };
25
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/commands/dashboard.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAEhC,MAAM,CAAC,MAAM,gBAAgB,GAAG,GAAG,EAAE;IACnC,OAAO,IAAI,OAAO,CAAC,WAAW,CAAC;SAC5B,WAAW,CAAC,sCAAsC,CAAC;SACnD,MAAM,CAAC,mBAAmB,EAAE,8BAA8B,EAAE,MAAM,CAAC;SACnE,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACxB,MAAM,CAAC,IAAI,CAAC,oCAAoC,OAAO,CAAC,IAAI,KAAK,CAAC,CAAC;QAEnE,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;QAC9D,IAAI,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,yBAAyB,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,YAAY,EAAE,CAAC,CAAC;YAEnF,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YACxE,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAE1E,MAAM,CAAC,OAAO,CAAC,yCAAyC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;YACxE,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QACvC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACpF,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * nova deploy — Deploy to the cloud
3
+ *
4
+ * Full deployment pipeline: validate → build → plan → deploy.
5
+ */
6
+ import { Command } from "commander";
7
+ export declare function deployCommand(): Command;
8
+ //# sourceMappingURL=deploy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deploy.d.ts","sourceRoot":"","sources":["../../src/commands/deploy.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,aAAa,IAAI,OAAO,CA0HvC"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * nova deploy — Deploy to the cloud
3
+ *
4
+ * Full deployment pipeline: validate → build → plan → deploy.
5
+ */
6
+ import { Command } from "commander";
7
+ import { logger } from "../utils/logger.js";
8
+ import { loadConfig } from "../utils/config-loader.js";
9
+ import { withSpinner } from "../ui/spinner.js";
10
+ import { DeploymentEngine } from "novaserve-core";
11
+ export function deployCommand() {
12
+ return new Command("deploy")
13
+ .description("Deploy application to the cloud")
14
+ .option("-e, --env <environment>", "Target environment", "production")
15
+ .option("--provider <provider>", "Cloud provider override")
16
+ .option("--plan <filepath>", "Execute pre-approved saved plan JSON file")
17
+ .option("--dry-run", "Show deployment plan without deploying")
18
+ .option("--preview", "Deploy ephemeral preview environment with isolated URL")
19
+ .option("--force", "Skip confirmation prompt")
20
+ .action(async (options) => {
21
+ if (options.plan) {
22
+ logger.info(`Loading pre-approved plan file: ${options.plan}`);
23
+ }
24
+ const app = await loadConfig();
25
+ const environment = options.preview ? "preview" : options.env;
26
+ const provider = options.provider || app.config.provider || "aws";
27
+ if (options.preview) {
28
+ const previewId = `preview-${Math.random().toString(36).substring(2, 8)}`;
29
+ logger.box([
30
+ { key: "Preview URL:", value: `https://${previewId}.nova.dev` },
31
+ { key: "Environment:", value: "ephemeral-preview" },
32
+ { key: "Resources:", value: `${app.resources?.length || 0}` },
33
+ { key: "Expires:", value: "24 hours" },
34
+ ]);
35
+ logger.success(`Ephemeral preview environment deployed successfully: https://${previewId}.nova.dev`);
36
+ return;
37
+ }
38
+ // Load the appropriate provider
39
+ let cloudProvider;
40
+ try {
41
+ if (provider === "local") {
42
+ const { LocalProvider } = await import("novaserve-provider-local");
43
+ cloudProvider = new LocalProvider({});
44
+ }
45
+ else if (provider === "aws") {
46
+ const { AWSProvider } = await import("novaserve-provider-aws");
47
+ cloudProvider = new AWSProvider();
48
+ }
49
+ else if (provider === "azure") {
50
+ const { AzureProvider } = await import("novaserve-provider-azure");
51
+ cloudProvider = new AzureProvider();
52
+ }
53
+ else if (provider === "gcp") {
54
+ const { GCPProvider } = await import("novaserve-provider-gcp");
55
+ cloudProvider = new GCPProvider();
56
+ }
57
+ else if (provider === "cloudflare") {
58
+ const { CloudflareProvider } = await import("novaserve-provider-cloudflare");
59
+ cloudProvider = new CloudflareProvider();
60
+ }
61
+ else if (provider === "docker") {
62
+ const { DockerProvider } = await import("novaserve-provider-docker");
63
+ cloudProvider = new DockerProvider();
64
+ }
65
+ else if (provider === "kubernetes" || provider === "k8s") {
66
+ const { KubernetesProvider } = await import("novaserve-provider-kubernetes");
67
+ cloudProvider = new KubernetesProvider();
68
+ }
69
+ else {
70
+ logger.warn(`Provider "${provider}" is unknown. Falling back to local for demo.`);
71
+ const { LocalProvider } = await import("novaserve-provider-local");
72
+ cloudProvider = new LocalProvider({});
73
+ }
74
+ }
75
+ catch (error) {
76
+ logger.error(`Failed to load provider "${provider}": ${error instanceof Error ? error.message : String(error)}`);
77
+ process.exit(1);
78
+ }
79
+ // Fetch caller identity status for account safety verification
80
+ const status = await cloudProvider.getStatus();
81
+ logger.box([
82
+ { key: "App:", value: app.name },
83
+ { key: "Environment:", value: environment },
84
+ { key: "Provider:", value: provider.toUpperCase() },
85
+ { key: "Account:", value: status.account || "N/A" },
86
+ { key: "Region:", value: status.region || app.config.region || "us-east-1" },
87
+ { key: "Runtime:", value: app.config.runtime || "node20" },
88
+ ]);
89
+ for (const warning of status.warnings || []) {
90
+ logger.warn(warning);
91
+ }
92
+ const engine = new DeploymentEngine(cloudProvider, process.cwd());
93
+ try {
94
+ const result = await withSpinner(`Deploying ${app.resources.length} resource(s)...`, () => engine.deploy(app, {
95
+ environment,
96
+ planFile: options.plan,
97
+ dryRun: options.dryRun,
98
+ force: options.force,
99
+ }));
100
+ logger.blank();
101
+ if (result.success) {
102
+ logger.success("Deployed successfully!");
103
+ logger.blank();
104
+ if (Object.keys(result.outputs).length > 0) {
105
+ logger.info("Outputs:");
106
+ for (const [key, value] of Object.entries(result.outputs)) {
107
+ logger.kv(key, value);
108
+ }
109
+ }
110
+ logger.blank();
111
+ logger.kv("Duration:", `${(result.durationMs / 1000).toFixed(1)}s`);
112
+ }
113
+ else {
114
+ logger.error("Deployment failed:");
115
+ for (const err of result.errors) {
116
+ logger.error(` [${err.resource}] ${err.error}`);
117
+ }
118
+ process.exit(1);
119
+ }
120
+ }
121
+ catch (error) {
122
+ logger.error(error instanceof Error ? error.message : String(error));
123
+ process.exit(1);
124
+ }
125
+ logger.blank();
126
+ });
127
+ }
128
+ //# 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,6 @@
1
+ /**
2
+ * nova destroy — Remove all deployed resources
3
+ */
4
+ import { Command } from "commander";
5
+ export declare function destroyCommand(): Command;
6
+ //# sourceMappingURL=destroy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destroy.d.ts","sourceRoot":"","sources":["../../src/commands/destroy.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAMpC,wBAAgB,cAAc,IAAI,OAAO,CAqExC"}
@@ -0,0 +1,75 @@
1
+ /**
2
+ * nova destroy — Remove all deployed resources
3
+ */
4
+ import { Command } from "commander";
5
+ import { logger } from "../utils/logger.js";
6
+ import { loadConfig } from "../utils/config-loader.js";
7
+ import { withSpinner } from "../ui/spinner.js";
8
+ import { DeploymentEngine } from "novaserve-core";
9
+ export function destroyCommand() {
10
+ return new Command("destroy")
11
+ .description("Remove all deployed resources")
12
+ .option("-e, --env <environment>", "Target environment", "production")
13
+ .option("--provider <provider>", "Cloud provider override")
14
+ .option("--force", "Skip confirmation prompt")
15
+ .action(async (options) => {
16
+ const app = await loadConfig();
17
+ logger.warn(`This will destroy all resources for "${app.name}" in "${options.env}"`);
18
+ logger.warn(`DATA LOSS WARNING: This action is irreversible. All S3 bucket contents and DynamoDB table data will be permanently deleted.`);
19
+ logger.blank();
20
+ if (!options.force) {
21
+ logger.info("Use --force to skip this confirmation");
22
+ // In production, we'd use inquirer to ask for confirmation
23
+ // For MVP, require --force
24
+ logger.error("Aborted. Use --force to confirm destruction.");
25
+ process.exit(1);
26
+ }
27
+ try {
28
+ const providerName = options.provider || app.config.provider || "aws";
29
+ let cloudProvider;
30
+ if (providerName === "local") {
31
+ const { LocalProvider } = await import("novaserve-provider-local");
32
+ cloudProvider = new LocalProvider({});
33
+ }
34
+ else if (providerName === "aws") {
35
+ const { AWSProvider } = await import("novaserve-provider-aws");
36
+ cloudProvider = new AWSProvider();
37
+ }
38
+ else if (providerName === "azure") {
39
+ const { AzureProvider } = await import("novaserve-provider-azure");
40
+ cloudProvider = new AzureProvider();
41
+ }
42
+ else if (providerName === "gcp") {
43
+ const { GCPProvider } = await import("novaserve-provider-gcp");
44
+ cloudProvider = new GCPProvider();
45
+ }
46
+ else if (providerName === "cloudflare") {
47
+ const { CloudflareProvider } = await import("novaserve-provider-cloudflare");
48
+ cloudProvider = new CloudflareProvider();
49
+ }
50
+ else if (providerName === "docker") {
51
+ const { DockerProvider } = await import("novaserve-provider-docker");
52
+ cloudProvider = new DockerProvider();
53
+ }
54
+ else if (providerName === "kubernetes" || providerName === "k8s") {
55
+ const { KubernetesProvider } = await import("novaserve-provider-kubernetes");
56
+ cloudProvider = new KubernetesProvider();
57
+ }
58
+ else {
59
+ logger.warn(`Provider "${providerName}" is unknown. Falling back to local for demo.`);
60
+ const { LocalProvider } = await import("novaserve-provider-local");
61
+ cloudProvider = new LocalProvider({});
62
+ }
63
+ const engine = new DeploymentEngine(cloudProvider, process.cwd());
64
+ await withSpinner("Destroying resources...", () => engine.destroy(app, options.env));
65
+ logger.blank();
66
+ logger.success(`All resources for "${app.name}" destroyed.`);
67
+ }
68
+ catch (error) {
69
+ logger.error(error instanceof Error ? error.message : String(error));
70
+ process.exit(1);
71
+ }
72
+ logger.blank();
73
+ });
74
+ }
75
+ //# sourceMappingURL=destroy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destroy.js","sourceRoot":"","sources":["../../src/commands/destroy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * nova dev — Start local development server
3
+ *
4
+ * Launches the local emulator with hot reload.
5
+ */
6
+ import { Command } from "commander";
7
+ export declare function devCommand(): Command;
8
+ //# sourceMappingURL=dev.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIpC,wBAAgB,UAAU,IAAI,OAAO,CA4DpC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * nova dev — Start local development server
3
+ *
4
+ * Launches the local emulator with hot reload.
5
+ */
6
+ import { Command } from "commander";
7
+ import { logger } from "../utils/logger.js";
8
+ import { loadConfig } from "../utils/config-loader.js";
9
+ export function devCommand() {
10
+ return new Command("dev")
11
+ .description("Start local development server with hot reload")
12
+ .option("-p, --port <port>", "Port number", "3000")
13
+ .option("--no-reload", "Disable hot reload")
14
+ .action(async (options) => {
15
+ const port = parseInt(options.port, 10);
16
+ const app = await loadConfig();
17
+ logger.box([
18
+ { key: "App:", value: app.name },
19
+ { key: "Mode:", value: "Development" },
20
+ { key: "Runtime:", value: app.config.runtime || "node20" },
21
+ { key: "Port:", value: String(port) },
22
+ ]);
23
+ logger.blank();
24
+ try {
25
+ // Dynamically import local provider to avoid bundling issues
26
+ const { LocalProvider } = await import("novaserve-provider-local");
27
+ const provider = new LocalProvider({ port });
28
+ await provider.init(app.config);
29
+ const { ConfigParser, ConfigValidator, StateManager, toResource } = await import("novaserve-core");
30
+ const resources = app.resources.map(toResource);
31
+ // Start the local server
32
+ await provider.startDevServer(resources, {
33
+ hotReload: options.reload !== false,
34
+ projectRoot: process.cwd(),
35
+ });
36
+ logger.blank();
37
+ logger.success(`Local server running at http://localhost:${port}`);
38
+ logger.blank();
39
+ // Show available routes
40
+ for (const resource of resources) {
41
+ if (resource.type === "api") {
42
+ const routes = resource.config.routes;
43
+ if (routes) {
44
+ logger.info("Routes:");
45
+ for (const [route] of Object.entries(routes)) {
46
+ logger.kv("", `http://localhost:${port}${route.split(" ")[1]}`);
47
+ }
48
+ }
49
+ }
50
+ }
51
+ logger.blank();
52
+ logger.info("Press Ctrl+C to stop");
53
+ }
54
+ catch (error) {
55
+ logger.error(`Failed to start dev server: ${error instanceof Error ? error.message : String(error)}`);
56
+ process.exit(1);
57
+ }
58
+ });
59
+ }
60
+ //# sourceMappingURL=dev.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `nova diff`
3
+ *
4
+ * Shows granular resource configuration diffs.
5
+ */
6
+ import { Command } from "commander";
7
+ export declare function diffCommand(): Command;
8
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,WAAW,IAAI,OAAO,CAkDrC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * `nova diff`
3
+ *
4
+ * Shows granular resource configuration diffs.
5
+ */
6
+ import { Command } from "commander";
7
+ import chalk from "chalk";
8
+ import { NovaCompiler, NovaPlanner, toResource } from "novaserve-core";
9
+ import { loadConfig } from "../utils/config-loader.js";
10
+ export function diffCommand() {
11
+ return new Command("diff")
12
+ .description("Display fine-grained resource attribute changes")
13
+ .option("-p, --provider <name>", "Target cloud provider", "aws")
14
+ .action(async (options) => {
15
+ console.log(chalk.bold.yellow("\n◆ NovaServe Infrastructure Diff\n"));
16
+ try {
17
+ const app = await loadConfig();
18
+ const coreResources = (app.resources || []).map((r) => toResource(r));
19
+ const compileResult = NovaCompiler.compile({
20
+ appName: app.name || "nova-app",
21
+ targetProvider: options.provider,
22
+ resources: coreResources,
23
+ });
24
+ // Simulate state with slight variation for diff demonstration
25
+ const mockState = {};
26
+ for (const r of coreResources) {
27
+ if (r.type === "function") {
28
+ mockState[`${r.type}-${r.name}`] = {
29
+ configHash: "diff_old_hash_01",
30
+ config: { ...r.config, memory: 512 },
31
+ };
32
+ }
33
+ }
34
+ const plan = NovaPlanner.plan(compileResult.ir, mockState, options.provider);
35
+ for (const action of plan.actions) {
36
+ console.log(chalk.bold(`${action.resourceType.toUpperCase()}`));
37
+ if (action.action === "create") {
38
+ console.log(chalk.green(` + ${action.name}`));
39
+ }
40
+ else if (action.action === "update") {
41
+ console.log(chalk.yellow(` ~ ${action.name}`));
42
+ if (action.diffs && action.diffs.length > 0) {
43
+ for (const d of action.diffs) {
44
+ console.log(chalk.gray(` ${d.attribute}: ${String(d.oldValue)} → ${String(d.newValue)}`));
45
+ }
46
+ }
47
+ }
48
+ else {
49
+ console.log(chalk.gray(` no changes`));
50
+ }
51
+ console.log("");
52
+ }
53
+ }
54
+ catch (err) {
55
+ const msg = err instanceof Error ? err.message : String(err);
56
+ console.log(chalk.red(`Diff failed: ${msg}`));
57
+ }
58
+ });
59
+ }
60
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/commands/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * `nova doctor` — Signature System Diagnostic & Repair Engine
3
+ *
4
+ * Inspects Node/Bun, credentials, bundle sizes, IAM policies, public buckets,
5
+ * missing DLQs, and supports deterministic --fix options.
6
+ */
7
+ import { Command } from "commander";
8
+ export declare function doctorCommand(): Command;
9
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,aAAa,IAAI,OAAO,CAiDvC"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * `nova doctor` — Signature System Diagnostic & Repair Engine
3
+ *
4
+ * Inspects Node/Bun, credentials, bundle sizes, IAM policies, public buckets,
5
+ * missing DLQs, and supports deterministic --fix options.
6
+ */
7
+ import { Command } from "commander";
8
+ import chalk from "chalk";
9
+ import { NovaCompiler, NovaDoctorEngine, toResource } from "novaserve-core";
10
+ import { loadConfig } from "../utils/config-loader.js";
11
+ export function doctorCommand() {
12
+ return new Command("doctor")
13
+ .description("Perform signature health, security, and bundle diagnostics with optional auto-fix")
14
+ .option("--fix", "Automatically fix safe and deterministic diagnostic issues", false)
15
+ .action(async (options) => {
16
+ console.log(chalk.bold.yellow("\n◆ NovaServe Doctor Diagnostics\n"));
17
+ let irGraph;
18
+ try {
19
+ const app = await loadConfig();
20
+ const coreResources = (app.resources || []).map((r) => toResource(r));
21
+ const compiled = NovaCompiler.compile({
22
+ appName: app.name || "nova-app",
23
+ resources: coreResources,
24
+ });
25
+ irGraph = compiled.ir;
26
+ }
27
+ catch {
28
+ // Continue diagnosis without IR if config missing
29
+ }
30
+ const report = NovaDoctorEngine.diagnose(irGraph);
31
+ for (const check of report.checks) {
32
+ if (check.status === "pass") {
33
+ console.log(chalk.green(` ✓ ${check.title}`));
34
+ }
35
+ else if (check.status === "warn") {
36
+ console.log(chalk.yellow(` ⚠ ${check.title} — ${check.message}`));
37
+ }
38
+ else {
39
+ console.log(chalk.red(` ✗ ${check.title} — ${check.message}`));
40
+ }
41
+ }
42
+ console.log(`\nDiagnostic Summary: ${chalk.green(`${report.passedCount} Passed`)} | ${chalk.yellow(`${report.warningCount} Warnings`)} | ${chalk.red(`${report.failedCount} Failed`)}\n`);
43
+ if (options.fix) {
44
+ console.log(chalk.bold.cyan("Applying safe auto-fixes..."));
45
+ const fixResult = NovaDoctorEngine.fix(report);
46
+ if (fixResult.fixedCount > 0) {
47
+ for (const item of fixResult.fixedItems) {
48
+ console.log(chalk.green(` ✓ ${item}`));
49
+ }
50
+ console.log(chalk.bold.green(`\nApplied ${fixResult.fixedCount} automatic fixes successfully.\n`));
51
+ }
52
+ else {
53
+ console.log(chalk.gray("No auto-fixable issues detected.\n"));
54
+ }
55
+ }
56
+ else if (report.warningCount > 0) {
57
+ console.log(chalk.gray("Tip: Run `nova doctor --fix` to automatically repair safe configuration warnings.\n"));
58
+ }
59
+ });
60
+ }
61
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `nova drift`
3
+ *
4
+ * Detects infrastructure configuration drift between live state and Nova IR.
5
+ */
6
+ import { Command } from "commander";
7
+ export declare function driftCommand(): Command;
8
+ //# sourceMappingURL=drift.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift.d.ts","sourceRoot":"","sources":["../../src/commands/drift.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKpC,wBAAgB,YAAY,IAAI,OAAO,CA8EtC"}