pax8-cta 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 (224) hide show
  1. package/LICENSE +200 -0
  2. package/README.md +659 -0
  3. package/demo-data/solutions/ProductQADemo_1_0_0_2_managed.zip +0 -0
  4. package/dist/commands/analyze.d.ts +28 -0
  5. package/dist/commands/analyze.d.ts.map +1 -0
  6. package/dist/commands/analyze.js +571 -0
  7. package/dist/commands/analyze.js.map +1 -0
  8. package/dist/commands/auth.d.ts +18 -0
  9. package/dist/commands/auth.d.ts.map +1 -0
  10. package/dist/commands/auth.js +171 -0
  11. package/dist/commands/auth.js.map +1 -0
  12. package/dist/commands/config.d.ts +34 -0
  13. package/dist/commands/config.d.ts.map +1 -0
  14. package/dist/commands/config.js +299 -0
  15. package/dist/commands/config.js.map +1 -0
  16. package/dist/commands/demo.d.ts +33 -0
  17. package/dist/commands/demo.d.ts.map +1 -0
  18. package/dist/commands/demo.js +362 -0
  19. package/dist/commands/demo.js.map +1 -0
  20. package/dist/commands/deploy.d.ts +18 -0
  21. package/dist/commands/deploy.d.ts.map +1 -0
  22. package/dist/commands/deploy.js +1186 -0
  23. package/dist/commands/deploy.js.map +1 -0
  24. package/dist/commands/deployments/helpers.d.ts +68 -0
  25. package/dist/commands/deployments/helpers.d.ts.map +1 -0
  26. package/dist/commands/deployments/helpers.js +414 -0
  27. package/dist/commands/deployments/helpers.js.map +1 -0
  28. package/dist/commands/deployments/index.d.ts +24 -0
  29. package/dist/commands/deployments/index.d.ts.map +1 -0
  30. package/dist/commands/deployments/index.js +47 -0
  31. package/dist/commands/deployments/index.js.map +1 -0
  32. package/dist/commands/deployments/list.d.ts +18 -0
  33. package/dist/commands/deployments/list.d.ts.map +1 -0
  34. package/dist/commands/deployments/list.js +97 -0
  35. package/dist/commands/deployments/list.js.map +1 -0
  36. package/dist/commands/deployments/show.d.ts +18 -0
  37. package/dist/commands/deployments/show.d.ts.map +1 -0
  38. package/dist/commands/deployments/show.js +81 -0
  39. package/dist/commands/deployments/show.js.map +1 -0
  40. package/dist/commands/deployments/undo.d.ts +18 -0
  41. package/dist/commands/deployments/undo.d.ts.map +1 -0
  42. package/dist/commands/deployments/undo.js +295 -0
  43. package/dist/commands/deployments/undo.js.map +1 -0
  44. package/dist/commands/export.d.ts +18 -0
  45. package/dist/commands/export.d.ts.map +1 -0
  46. package/dist/commands/export.js +133 -0
  47. package/dist/commands/export.js.map +1 -0
  48. package/dist/commands/import.d.ts +18 -0
  49. package/dist/commands/import.d.ts.map +1 -0
  50. package/dist/commands/import.js +129 -0
  51. package/dist/commands/import.js.map +1 -0
  52. package/dist/commands/init-config.d.ts +26 -0
  53. package/dist/commands/init-config.d.ts.map +1 -0
  54. package/dist/commands/init-config.js +123 -0
  55. package/dist/commands/init-config.js.map +1 -0
  56. package/dist/commands/init-validation.d.ts +47 -0
  57. package/dist/commands/init-validation.d.ts.map +1 -0
  58. package/dist/commands/init-validation.js +339 -0
  59. package/dist/commands/init-validation.js.map +1 -0
  60. package/dist/commands/init-wizard.d.ts +25 -0
  61. package/dist/commands/init-wizard.d.ts.map +1 -0
  62. package/dist/commands/init-wizard.js +433 -0
  63. package/dist/commands/init-wizard.js.map +1 -0
  64. package/dist/commands/init.d.ts +18 -0
  65. package/dist/commands/init.d.ts.map +1 -0
  66. package/dist/commands/init.js +46 -0
  67. package/dist/commands/init.js.map +1 -0
  68. package/dist/commands/resolve-url.d.ts +18 -0
  69. package/dist/commands/resolve-url.d.ts.map +1 -0
  70. package/dist/commands/resolve-url.js +126 -0
  71. package/dist/commands/resolve-url.js.map +1 -0
  72. package/dist/commands/setup.d.ts +18 -0
  73. package/dist/commands/setup.d.ts.map +1 -0
  74. package/dist/commands/setup.js +239 -0
  75. package/dist/commands/setup.js.map +1 -0
  76. package/dist/commands/solutions/drift-analysis.d.ts +73 -0
  77. package/dist/commands/solutions/drift-analysis.d.ts.map +1 -0
  78. package/dist/commands/solutions/drift-analysis.js +416 -0
  79. package/dist/commands/solutions/drift-analysis.js.map +1 -0
  80. package/dist/commands/solutions/drift.d.ts +32 -0
  81. package/dist/commands/solutions/drift.d.ts.map +1 -0
  82. package/dist/commands/solutions/drift.js +641 -0
  83. package/dist/commands/solutions/drift.js.map +1 -0
  84. package/dist/commands/solutions/fix-planner.d.ts +48 -0
  85. package/dist/commands/solutions/fix-planner.d.ts.map +1 -0
  86. package/dist/commands/solutions/fix-planner.js +43 -0
  87. package/dist/commands/solutions/fix-planner.js.map +1 -0
  88. package/dist/commands/solutions/helpers.d.ts +35 -0
  89. package/dist/commands/solutions/helpers.d.ts.map +1 -0
  90. package/dist/commands/solutions/helpers.js +54 -0
  91. package/dist/commands/solutions/helpers.js.map +1 -0
  92. package/dist/commands/solutions/index.d.ts +18 -0
  93. package/dist/commands/solutions/index.d.ts.map +1 -0
  94. package/dist/commands/solutions/index.js +30 -0
  95. package/dist/commands/solutions/index.js.map +1 -0
  96. package/dist/commands/solutions/list.d.ts +18 -0
  97. package/dist/commands/solutions/list.d.ts.map +1 -0
  98. package/dist/commands/solutions/list.js +174 -0
  99. package/dist/commands/solutions/list.js.map +1 -0
  100. package/dist/commands/solutions/remove.d.ts +18 -0
  101. package/dist/commands/solutions/remove.d.ts.map +1 -0
  102. package/dist/commands/solutions/remove.js +137 -0
  103. package/dist/commands/solutions/remove.js.map +1 -0
  104. package/dist/commands/solutions/risk-calculator.d.ts +33 -0
  105. package/dist/commands/solutions/risk-calculator.d.ts.map +1 -0
  106. package/dist/commands/solutions/risk-calculator.js +79 -0
  107. package/dist/commands/solutions/risk-calculator.js.map +1 -0
  108. package/dist/commands/solutions/show.d.ts +18 -0
  109. package/dist/commands/solutions/show.d.ts.map +1 -0
  110. package/dist/commands/solutions/show.js +165 -0
  111. package/dist/commands/solutions/show.js.map +1 -0
  112. package/dist/commands/status.d.ts +18 -0
  113. package/dist/commands/status.d.ts.map +1 -0
  114. package/dist/commands/status.js +573 -0
  115. package/dist/commands/status.js.map +1 -0
  116. package/dist/commands/telemetry.d.ts +18 -0
  117. package/dist/commands/telemetry.d.ts.map +1 -0
  118. package/dist/commands/telemetry.js +85 -0
  119. package/dist/commands/telemetry.js.map +1 -0
  120. package/dist/commands/tenants/health.d.ts +18 -0
  121. package/dist/commands/tenants/health.d.ts.map +1 -0
  122. package/dist/commands/tenants/health.js +172 -0
  123. package/dist/commands/tenants/health.js.map +1 -0
  124. package/dist/commands/tenants/helpers.d.ts +44 -0
  125. package/dist/commands/tenants/helpers.d.ts.map +1 -0
  126. package/dist/commands/tenants/helpers.js +72 -0
  127. package/dist/commands/tenants/helpers.js.map +1 -0
  128. package/dist/commands/tenants/index.d.ts +19 -0
  129. package/dist/commands/tenants/index.d.ts.map +1 -0
  130. package/dist/commands/tenants/index.js +39 -0
  131. package/dist/commands/tenants/index.js.map +1 -0
  132. package/dist/commands/tenants/inspect.d.ts +18 -0
  133. package/dist/commands/tenants/inspect.d.ts.map +1 -0
  134. package/dist/commands/tenants/inspect.js +176 -0
  135. package/dist/commands/tenants/inspect.js.map +1 -0
  136. package/dist/commands/tenants/list.d.ts +18 -0
  137. package/dist/commands/tenants/list.d.ts.map +1 -0
  138. package/dist/commands/tenants/list.js +144 -0
  139. package/dist/commands/tenants/list.js.map +1 -0
  140. package/dist/commands/tenants/manage.d.ts +20 -0
  141. package/dist/commands/tenants/manage.d.ts.map +1 -0
  142. package/dist/commands/tenants/manage.js +206 -0
  143. package/dist/commands/tenants/manage.js.map +1 -0
  144. package/dist/commands/tenants/show.d.ts +18 -0
  145. package/dist/commands/tenants/show.d.ts.map +1 -0
  146. package/dist/commands/tenants/show.js +191 -0
  147. package/dist/commands/tenants/show.js.map +1 -0
  148. package/dist/commands/validate.d.ts +18 -0
  149. package/dist/commands/validate.d.ts.map +1 -0
  150. package/dist/commands/validate.js +536 -0
  151. package/dist/commands/validate.js.map +1 -0
  152. package/dist/index.d.ts +19 -0
  153. package/dist/index.d.ts.map +1 -0
  154. package/dist/index.js +258 -0
  155. package/dist/index.js.map +1 -0
  156. package/dist/lib/auth.d.ts +51 -0
  157. package/dist/lib/auth.d.ts.map +1 -0
  158. package/dist/lib/auth.js +153 -0
  159. package/dist/lib/auth.js.map +1 -0
  160. package/dist/lib/banner.d.ts +19 -0
  161. package/dist/lib/banner.d.ts.map +1 -0
  162. package/dist/lib/banner.js +78 -0
  163. package/dist/lib/banner.js.map +1 -0
  164. package/dist/lib/command-wrapper.d.ts +56 -0
  165. package/dist/lib/command-wrapper.d.ts.map +1 -0
  166. package/dist/lib/command-wrapper.js +71 -0
  167. package/dist/lib/command-wrapper.js.map +1 -0
  168. package/dist/lib/credentials.d.ts +56 -0
  169. package/dist/lib/credentials.d.ts.map +1 -0
  170. package/dist/lib/credentials.js +146 -0
  171. package/dist/lib/credentials.js.map +1 -0
  172. package/dist/lib/demo-banner.d.ts +15 -0
  173. package/dist/lib/demo-banner.d.ts.map +1 -0
  174. package/dist/lib/demo-banner.js +33 -0
  175. package/dist/lib/demo-banner.js.map +1 -0
  176. package/dist/lib/error-handler.d.ts +51 -0
  177. package/dist/lib/error-handler.d.ts.map +1 -0
  178. package/dist/lib/error-handler.js +458 -0
  179. package/dist/lib/error-handler.js.map +1 -0
  180. package/dist/lib/errors.d.ts +61 -0
  181. package/dist/lib/errors.d.ts.map +1 -0
  182. package/dist/lib/errors.js +168 -0
  183. package/dist/lib/errors.js.map +1 -0
  184. package/dist/lib/formatters.d.ts +55 -0
  185. package/dist/lib/formatters.d.ts.map +1 -0
  186. package/dist/lib/formatters.js +163 -0
  187. package/dist/lib/formatters.js.map +1 -0
  188. package/dist/lib/graph-client.d.ts +74 -0
  189. package/dist/lib/graph-client.d.ts.map +1 -0
  190. package/dist/lib/graph-client.js +231 -0
  191. package/dist/lib/graph-client.js.map +1 -0
  192. package/dist/lib/input.d.ts +22 -0
  193. package/dist/lib/input.d.ts.map +1 -0
  194. package/dist/lib/input.js +120 -0
  195. package/dist/lib/input.js.map +1 -0
  196. package/dist/lib/interactive-wizard.d.ts +26 -0
  197. package/dist/lib/interactive-wizard.d.ts.map +1 -0
  198. package/dist/lib/interactive-wizard.js +550 -0
  199. package/dist/lib/interactive-wizard.js.map +1 -0
  200. package/dist/lib/oss-surface.d.ts +21 -0
  201. package/dist/lib/oss-surface.d.ts.map +1 -0
  202. package/dist/lib/oss-surface.js +29 -0
  203. package/dist/lib/oss-surface.js.map +1 -0
  204. package/dist/lib/output.d.ts +74 -0
  205. package/dist/lib/output.d.ts.map +1 -0
  206. package/dist/lib/output.js +156 -0
  207. package/dist/lib/output.js.map +1 -0
  208. package/dist/lib/picker.d.ts +75 -0
  209. package/dist/lib/picker.d.ts.map +1 -0
  210. package/dist/lib/picker.js +115 -0
  211. package/dist/lib/picker.js.map +1 -0
  212. package/dist/lib/repl.d.ts +19 -0
  213. package/dist/lib/repl.d.ts.map +1 -0
  214. package/dist/lib/repl.js +158 -0
  215. package/dist/lib/repl.js.map +1 -0
  216. package/dist/lib/spinner.d.ts +41 -0
  217. package/dist/lib/spinner.d.ts.map +1 -0
  218. package/dist/lib/spinner.js +126 -0
  219. package/dist/lib/spinner.js.map +1 -0
  220. package/dist/lib/telemetry.d.ts +96 -0
  221. package/dist/lib/telemetry.d.ts.map +1 -0
  222. package/dist/lib/telemetry.js +367 -0
  223. package/dist/lib/telemetry.js.map +1 -0
  224. package/package.json +68 -0
@@ -0,0 +1,137 @@
1
+ /**
2
+ * Copyright 2024 Pax8, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { Command } from "commander";
17
+ import { resolve } from "node:path";
18
+ import chalk from "chalk";
19
+ import { createSpinner, isQuietMode } from "../../lib/spinner.js";
20
+ import { DEMO_TENANTS, loadConfig, TokenManager, DataverseClient, SolutionOperations, } from "@pax8-cta/core";
21
+ import { getClientSecretWithFallback } from "../../lib/credentials.js";
22
+ import { question } from "../../lib/input.js";
23
+ import { handleCommandError } from "../../lib/errors.js";
24
+ import { isDemo } from "../../lib/command-wrapper.js";
25
+ import { resolveFormat } from "../../lib/output.js";
26
+ import { showDemoBanner } from "../../lib/demo-banner.js";
27
+ import { findTenantMatches } from "../tenants/helpers.js";
28
+ export const removeCommand = new Command("remove")
29
+ .alias("uninstall")
30
+ .argument("<solution>", "Solution unique name to remove (e.g., TestDeploy)")
31
+ .description("Uninstall a managed solution from a target environment")
32
+ .requiredOption("-t, --tenant <name>", "Target tenant name or ID")
33
+ .option("-c, --config <path>", "Path to config file", "./config/tenants.yaml")
34
+ .option("-y, --yes", "Skip confirmation prompt")
35
+ .option("--json", "Output as JSON")
36
+ .option("--quiet", "Suppress all output (exit code only)")
37
+ .addHelpText("after", `
38
+ Examples:
39
+ solutions remove TestDeploy -t Pax8CTA-Test2 Uninstall with confirmation
40
+ solutions remove TestDeploy -t Pax8CTA-Test2 -y Uninstall without confirmation
41
+ `)
42
+ .action(async (solutionName, options, cmd) => {
43
+ // Merge global flags (--json, --quiet) registered on root program.
44
+ Object.assign(options, cmd.optsWithGlobals());
45
+ const spinner = createSpinner("Loading configuration...").start();
46
+ try {
47
+ // Issue #385: in demo mode, simulate the removal so the command works
48
+ // without ./config/tenants.yaml or real Dataverse credentials.
49
+ if (isDemo()) {
50
+ await runDemoRemove(spinner, solutionName, options);
51
+ return;
52
+ }
53
+ const configPath = resolve(process.cwd(), options.config);
54
+ const config = await loadConfig(configPath);
55
+ const tenant = config.tenants.find((t) => t.name.toLowerCase() === options.tenant.toLowerCase() ||
56
+ t.tenantId.toLowerCase() === options.tenant.toLowerCase());
57
+ if (!tenant) {
58
+ spinner.fail(chalk.red(`Tenant '${options.tenant}' not found in config`));
59
+ process.exit(1);
60
+ }
61
+ spinner.succeed(`Target: ${tenant.name} (${tenant.environmentUrl})`);
62
+ // Confirm unless --yes
63
+ if (!options.yes) {
64
+ console.log();
65
+ console.log(chalk.yellow(` This will uninstall '${solutionName}' and remove all its components from ${tenant.name}.`));
66
+ const confirm = await question(chalk.red(" Are you sure? ") + chalk.gray("(yes/no) "));
67
+ if (confirm.toLowerCase() !== "yes" && confirm.toLowerCase() !== "y") {
68
+ console.log(chalk.gray(" Cancelled."));
69
+ return;
70
+ }
71
+ }
72
+ spinner.start("Authenticating...");
73
+ const clientSecret = await getClientSecretWithFallback();
74
+ const tokenManager = new TokenManager({
75
+ tenantId: config.partner.tenantId,
76
+ clientId: config.partner.clientId,
77
+ clientSecret,
78
+ });
79
+ const dataverseClient = new DataverseClient({
80
+ environmentUrl: tenant.environmentUrl,
81
+ tokenManager,
82
+ });
83
+ const solutionOps = new SolutionOperations(dataverseClient);
84
+ spinner.start(`Uninstalling '${solutionName}' from ${tenant.name}...`);
85
+ await solutionOps.deleteSolution(solutionName);
86
+ spinner.succeed(chalk.green(`Uninstalled '${solutionName}' from ${tenant.name}`));
87
+ }
88
+ catch (error) {
89
+ handleCommandError(error, spinner, "Failed to remove solution");
90
+ }
91
+ });
92
+ /**
93
+ * Demo-mode removal — looks up the requested tenant in DEMO_TENANTS and prints
94
+ * what *would* happen. Honors --json (machine-readable envelope) and --quiet
95
+ * (zero output, exit 0).
96
+ */
97
+ async function runDemoRemove(spinner, solutionName, options) {
98
+ const fmt = resolveFormat({ json: options.json, quiet: options.quiet });
99
+ // Issue #402: reuse the same case-insensitive substring matching the rest of
100
+ // the CLI uses for `-t <name>`, but also report ambiguous partial matches so
101
+ // users don't get the wrong tenant silently chosen for them.
102
+ const matches = findTenantMatches(DEMO_TENANTS, options.tenant);
103
+ if (matches.length === 0) {
104
+ spinner.fail(chalk.red(`No tenant matches '${options.tenant}'; run 'pax8-cta tenants list' to see available tenants.`));
105
+ process.exit(1);
106
+ }
107
+ if (matches.length > 1) {
108
+ spinner.fail(chalk.red(`Tenant '${options.tenant}' is ambiguous. Did you mean:`));
109
+ for (const candidate of matches) {
110
+ console.error(chalk.gray(` - ${candidate.name}`));
111
+ }
112
+ process.exit(1);
113
+ }
114
+ const tenant = matches[0];
115
+ spinner.succeed(`Target: ${tenant.name} (${tenant.environmentUrl})`);
116
+ // In demo mode we skip the interactive prompt entirely — simulating real I/O
117
+ // doesn't require destructive intent confirmation. Quiet/JSON callers (LLM
118
+ // agents, scripts) wouldn't be able to answer the prompt anyway.
119
+ if (fmt === "json") {
120
+ console.log(JSON.stringify({
121
+ demo: true,
122
+ action: "would-remove",
123
+ solution: solutionName,
124
+ tenant: { name: tenant.name, tenantId: tenant.tenantId },
125
+ message: `Would uninstall '${solutionName}' from ${tenant.name}`,
126
+ }, null, 2));
127
+ return;
128
+ }
129
+ if (fmt === "quiet") {
130
+ return;
131
+ }
132
+ if (!isQuietMode()) {
133
+ showDemoBanner();
134
+ }
135
+ console.log(chalk.gray(` Would uninstall '${solutionName}' from ${tenant.name} (no real changes made).`));
136
+ }
137
+ //# sourceMappingURL=remove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.js","sourceRoot":"","sources":["../../../src/commands/solutions/remove.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Copyright 2024 Pax8, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import type { DriftRecommendation, TenantVersionStatus } from "@pax8-cta/core";
17
+ /** Risk level for a tenant based on its drift state */
18
+ export type DriftRiskLevel = "low" | "medium" | "high";
19
+ /**
20
+ * Calculate the drift risk level for a tenant based on its version status.
21
+ *
22
+ * - low: 1 minor version behind on all solutions
23
+ * - medium: 2+ versions behind or multiple outdated solutions
24
+ * - high: not deployed solutions or 3+ versions behind
25
+ */
26
+ export declare function calculateDriftRisk(status: TenantVersionStatus): DriftRiskLevel;
27
+ /**
28
+ * Parse the --max-risk option into a numeric threshold.
29
+ */
30
+ export declare function riskLevelValue(level: DriftRiskLevel): number;
31
+ export declare function formatRiskLevel(level: string): string;
32
+ export declare function formatRecommendation(rec: DriftRecommendation): string;
33
+ //# sourceMappingURL=risk-calculator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk-calculator.d.ts","sourceRoot":"","sources":["../../../src/commands/solutions/risk-calculator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAE/E,uDAAuD;AACvD,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAEvD;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,mBAAmB,GAAG,cAAc,CAa9E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,CAS5D;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWrD;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,mBAAmB,GAAG,MAAM,CAerE"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Copyright 2024 Pax8, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import chalk from "chalk";
17
+ /**
18
+ * Calculate the drift risk level for a tenant based on its version status.
19
+ *
20
+ * - low: 1 minor version behind on all solutions
21
+ * - medium: 2+ versions behind or multiple outdated solutions
22
+ * - high: not deployed solutions or 3+ versions behind
23
+ */
24
+ export function calculateDriftRisk(status) {
25
+ const outdated = status.solutions.filter((s) => s.status === "outdated");
26
+ const notDeployed = status.solutions.filter((s) => s.status === "not_deployed");
27
+ if (notDeployed.length > 0)
28
+ return "high";
29
+ if (outdated.length === 0)
30
+ return "low";
31
+ const maxDrift = Math.max(...outdated.map((s) => Math.abs(s.versionDrift)));
32
+ if (maxDrift >= 3)
33
+ return "high";
34
+ if (maxDrift >= 2 || outdated.length >= 2)
35
+ return "medium";
36
+ return "low";
37
+ }
38
+ /**
39
+ * Parse the --max-risk option into a numeric threshold.
40
+ */
41
+ export function riskLevelValue(level) {
42
+ switch (level) {
43
+ case "low":
44
+ return 1;
45
+ case "medium":
46
+ return 2;
47
+ case "high":
48
+ return 3;
49
+ }
50
+ }
51
+ export function formatRiskLevel(level) {
52
+ switch (level) {
53
+ case "high":
54
+ return chalk.red("HIGH");
55
+ case "medium":
56
+ return chalk.yellow("MED");
57
+ case "low":
58
+ return chalk.green("LOW");
59
+ default:
60
+ return chalk.gray(level);
61
+ }
62
+ }
63
+ export function formatRecommendation(rec) {
64
+ switch (rec) {
65
+ case "current":
66
+ return chalk.green("✓ current");
67
+ case "safe_to_update":
68
+ return chalk.green("safe to update");
69
+ case "review_recommended":
70
+ return chalk.yellow("review recommended");
71
+ case "update_risky":
72
+ return chalk.red("update risky");
73
+ case "do_not_update":
74
+ return chalk.red("⚠ do not update");
75
+ default:
76
+ return chalk.gray(rec);
77
+ }
78
+ }
79
+ //# sourceMappingURL=risk-calculator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"risk-calculator.js","sourceRoot":"","sources":["../../../src/commands/solutions/risk-calculator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B;;;;;;GAMG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAA2B;IAC5D,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC;IACzE,MAAM,WAAW,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,cAAc,CAAC,CAAC;IAEhF,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,MAAM,CAAC;IAE1C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAExC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAE5E,IAAI,QAAQ,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC;IACjC,IAAI,QAAQ,IAAI,CAAC,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC3D,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAqB;IAClD,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,KAAK;YACR,OAAO,CAAC,CAAC;QACX,KAAK,QAAQ;YACX,OAAO,CAAC,CAAC;QACX,KAAK,MAAM;YACT,OAAO,CAAC,CAAC;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,KAAa;IAC3C,QAAQ,KAAK,EAAE,CAAC;QACd,KAAK,MAAM;YACT,OAAO,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC3B,KAAK,QAAQ;YACX,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7B,KAAK,KAAK;YACR,OAAO,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QAC5B;YACE,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAwB;IAC3D,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,SAAS;YACZ,OAAO,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAClC,KAAK,gBAAgB;YACnB,OAAO,KAAK,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACvC,KAAK,oBAAoB;YACvB,OAAO,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC5C,KAAK,cAAc;YACjB,OAAO,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QACnC,KAAK,eAAe;YAClB,OAAO,KAAK,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC;QACtC;YACE,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Copyright 2024 Pax8, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { Command } from "commander";
17
+ export declare const showCommand: Command;
18
+ //# sourceMappingURL=show.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.d.ts","sourceRoot":"","sources":["../../../src/commands/solutions/show.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwDpC,eAAO,MAAM,WAAW,SAmJpB,CAAC"}
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Copyright 2024 Pax8, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { Command } from "commander";
17
+ import chalk from "chalk";
18
+ import { createSpinner } from "../../lib/spinner.js";
19
+ import { DEMO_SOLUTIONS } from "@pax8-cta/core";
20
+ import { withDemoMode } from "../../lib/command-wrapper.js";
21
+ import { formatTimeAgo } from "../../lib/formatters.js";
22
+ import { findSolution, getTenantDeploymentStatus } from "./helpers.js";
23
+ import { CliError, handleCommandError } from "../../lib/errors.js";
24
+ import { showDemoBanner } from "../../lib/demo-banner.js";
25
+ import { output, resolveFormat } from "../../lib/output.js";
26
+ const TENANT_COLUMNS = [
27
+ { key: "tenantName", header: "Tenant" },
28
+ {
29
+ key: "version",
30
+ header: "Version",
31
+ format: (v) => (v == null || v === "" ? "-" : String(v)),
32
+ },
33
+ {
34
+ key: "status",
35
+ header: "Status",
36
+ format: (_v, row) => {
37
+ switch (row.status) {
38
+ case "current":
39
+ return chalk.green("✓ current");
40
+ case "outdated":
41
+ return chalk.yellow("↑ outdated");
42
+ case "not_deployed":
43
+ return chalk.gray("✗ not deployed");
44
+ }
45
+ },
46
+ },
47
+ {
48
+ key: "deployedAt",
49
+ header: "Last Deployed",
50
+ format: (v) => (typeof v === "string" && v.length > 0 ? formatTimeAgo(v) : "-"),
51
+ },
52
+ ];
53
+ export const showCommand = new Command("show")
54
+ .argument("<name>", "Solution name or unique name")
55
+ .description("View solution details and where it's deployed")
56
+ .option("--tenants", "Show tenant deployment status")
57
+ .option("--json", "Output as JSON")
58
+ .option("--quiet", "Suppress all output (exit code only)")
59
+ .addHelpText("after", `
60
+ Examples:
61
+ solutions show TestDeploy View solution details
62
+ solutions show TestDeploy --tenants Show tenant deployment status
63
+ solutions show TestDeploy --json Output as JSON
64
+ `)
65
+ .action(async (name, options, cmd) => {
66
+ // Merge local opts with globals so root-level `--json` / `--quiet`
67
+ // (`pax8-cta --json solutions show ...`) reach this command. Resolve the
68
+ // effective output format up-front so every branch below can branch on a
69
+ // single `fmt` value (issue #406).
70
+ const opts = { ...options, ...cmd.optsWithGlobals() };
71
+ const fmt = resolveFormat({ json: !!opts.json, quiet: !!opts.quiet });
72
+ const spinner = createSpinner("Loading agent...").start();
73
+ try {
74
+ await withDemoMode(() => {
75
+ spinner.stop();
76
+ if (fmt === "table") {
77
+ showDemoBanner();
78
+ }
79
+ const solution = findSolution(DEMO_SOLUTIONS, name);
80
+ if (!solution) {
81
+ // Route through handleCommandError so --json/non-TTY callers get the
82
+ // structured error envelope instead of bare colored stdout.
83
+ throw new CliError(`Agent '${name}' not found. ` + `Run 'solutions list' to see all available agents.`);
84
+ }
85
+ const tenantStatus = getTenantDeploymentStatus(solution.uniqueName);
86
+ const rows = tenantStatus.map((t) => ({
87
+ tenantName: t.tenantName,
88
+ tenantId: t.tenantId,
89
+ version: t.version,
90
+ status: t.status,
91
+ deployedAt: t.deployedAt,
92
+ }));
93
+ const totalTenants = rows.length;
94
+ const deployed = rows.filter((r) => r.status !== "not_deployed").length;
95
+ const current = rows.filter((r) => r.status === "current").length;
96
+ const outdated = rows.filter((r) => r.status === "outdated").length;
97
+ const notDeployed = rows.filter((r) => r.status === "not_deployed").length;
98
+ // ──────────────────────────────────────────────────────────────────
99
+ // JSON envelope
100
+ // ──────────────────────────────────────────────────────────────────
101
+ if (fmt === "json") {
102
+ const envelope = {
103
+ name: solution.uniqueName,
104
+ displayName: solution.friendlyName,
105
+ latestVersion: solution.version,
106
+ summary: { totalTenants, deployed, current, outdated, notDeployed },
107
+ };
108
+ if (opts.tenants) {
109
+ envelope.tenants = rows;
110
+ }
111
+ console.log(JSON.stringify(envelope, null, 2));
112
+ return;
113
+ }
114
+ // ──────────────────────────────────────────────────────────────────
115
+ // Quiet — produce no output
116
+ // ──────────────────────────────────────────────────────────────────
117
+ if (fmt === "quiet")
118
+ return;
119
+ // ──────────────────────────────────────────────────────────────────
120
+ // Table (TTY default) — existing human-readable rendering
121
+ // ──────────────────────────────────────────────────────────────────
122
+ console.log(chalk.bold(`${solution.friendlyName} (${solution.uniqueName})`));
123
+ console.log("━".repeat(60));
124
+ console.log(`Version: ${solution.version}`);
125
+ console.log(`Category: ${solution.category}`);
126
+ console.log(`Publisher: ${solution.publisherName}`);
127
+ console.log(`Tags: ${solution.tags.join(", ")}`);
128
+ console.log();
129
+ console.log(chalk.bold("Description:"));
130
+ console.log(` ${solution.description}`);
131
+ console.log();
132
+ console.log(chalk.bold("Capabilities:"));
133
+ solution.capabilities.forEach((cap) => {
134
+ console.log(` • ${cap}`);
135
+ });
136
+ console.log();
137
+ console.log(chalk.bold("Dependencies:"));
138
+ solution.dependencies.forEach((dep) => {
139
+ console.log(` • ${dep}`);
140
+ });
141
+ console.log();
142
+ console.log(`Last Published: ${formatTimeAgo(solution.lastPublished)}`);
143
+ // Tenant deployment status (when --tenants is passed)
144
+ if (opts.tenants) {
145
+ console.log();
146
+ console.log(chalk.bold(`${solution.uniqueName} - Tenant Deployment Status`));
147
+ console.log("━".repeat(60));
148
+ output(rows, { format: "table", columns: TENANT_COLUMNS });
149
+ console.log();
150
+ console.log(chalk.gray(`${deployed}/${totalTenants} tenants have this agent ` +
151
+ `(${current} current, ${outdated} outdated, ${notDeployed} not deployed)`));
152
+ }
153
+ }, () => {
154
+ // Production mode
155
+ spinner.fail(chalk.yellow("Production mode not yet implemented"));
156
+ if (fmt === "table") {
157
+ console.log(chalk.gray("\nEnable demo mode with 'demo on' to see sample data."));
158
+ }
159
+ });
160
+ }
161
+ catch (error) {
162
+ handleCommandError(error, spinner, "Failed to load agent");
163
+ }
164
+ });
165
+ //# sourceMappingURL=show.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"show.js","sourceRoot":"","sources":["../../../src/commands/solutions/show.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Copyright 2024 Pax8, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+ import { Command } from "commander";
17
+ export declare const statusCommand: Command;
18
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/commands/status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkMpC,eAAO,MAAM,aAAa,SA8KtB,CAAC"}