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,416 @@
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
+ import Table from "cli-table3";
18
+ import { DEMO_TENANTS } from "@pax8-cta/core";
19
+ import { formatRecommendation, formatRiskLevel } from "./risk-calculator.js";
20
+ /**
21
+ * The set of tenants in a fleet drift analysis that are "outdated" — i.e. the
22
+ * report's actionable rows. We treat anything that isn't `current` as
23
+ * outdated; this matches what the table-mode renderer surfaces and what
24
+ * `--fix` would touch.
25
+ */
26
+ export function selectOutdated(fleet) {
27
+ return fleet.tenants.filter((t) => t.recommendation !== "current");
28
+ }
29
+ /**
30
+ * Build the after-action hint shown beneath the drift table.
31
+ *
32
+ * Mirrors the analyze → test-deploy nudge: a one-paragraph "what should I do
33
+ * about this?" string driven by the result shape. Returns an empty string
34
+ * when there is nothing to suggest, so the caller can `if (hint) console.log`.
35
+ *
36
+ * Pure / side-effect-free so the unit tests can pin the wording without
37
+ * shelling out.
38
+ *
39
+ * @param solutionLabel The solution name to interpolate into per-tenant
40
+ * suggestions. When the drift run wasn't scoped to a
41
+ * single solution we fall back to `<solution>` so the
42
+ * user knows to substitute.
43
+ */
44
+ export function buildAfterActionHint(outdated, solutionLabel = "<solution>") {
45
+ const count = outdated.length;
46
+ if (count === 0) {
47
+ return "Fleet is current. Nothing to do.";
48
+ }
49
+ const hasHighRisk = outdated.some((t) => t.riskLevel === "high");
50
+ const lines = [];
51
+ if (count <= 3) {
52
+ lines.push("Suggested next action:");
53
+ lines.push(` pax8-cta deploy ${solutionLabel} --tenant <name>`);
54
+ lines.push("or 'pax8-cta solutions drift --fix' to update them all.");
55
+ }
56
+ else {
57
+ lines.push("Suggested next action: pax8-cta solutions drift --fix");
58
+ lines.push("(review the list above first; --fix will deploy to every outdated tenant).");
59
+ }
60
+ if (hasHighRisk) {
61
+ lines.push(`Drill into risk before updating: pax8-cta analyze ${solutionLabel} --tenant <name>`);
62
+ }
63
+ return lines.join("\n");
64
+ }
65
+ export function displayTenantStatus(status) {
66
+ console.log(chalk.bold(`${status.tenantName} - Version Status`));
67
+ console.log("━".repeat(60));
68
+ if (status.error) {
69
+ console.log(chalk.red(` Error: ${status.error}`));
70
+ console.log();
71
+ }
72
+ const table = new Table({
73
+ head: ["Agent", "Expected", "Deployed", "Status"],
74
+ style: { head: ["cyan"] },
75
+ });
76
+ status.solutions.forEach((sol) => {
77
+ table.push([
78
+ sol.uniqueName,
79
+ sol.expectedVersion,
80
+ sol.deployedVersion || "-",
81
+ formatStatus(sol),
82
+ ]);
83
+ });
84
+ console.log(table.toString());
85
+ console.log();
86
+ const overallIcon = status.overallStatus === "current"
87
+ ? chalk.green("✓")
88
+ : status.overallStatus === "outdated"
89
+ ? chalk.yellow("⚠")
90
+ : status.overallStatus === "mixed"
91
+ ? chalk.yellow("⚠")
92
+ : chalk.gray("?");
93
+ console.log(`Overall: ${overallIcon} ${status.overallStatus}`);
94
+ }
95
+ function formatStatus(sol) {
96
+ switch (sol.status) {
97
+ case "current":
98
+ return chalk.green("✓ current");
99
+ case "outdated":
100
+ return chalk.yellow(`↑ outdated (${sol.versionDrift})`);
101
+ case "ahead":
102
+ return chalk.blue(`↓ ahead (+${sol.versionDrift})`);
103
+ case "not_deployed":
104
+ return chalk.gray("✗ not deployed");
105
+ default:
106
+ return chalk.gray("? unknown");
107
+ }
108
+ }
109
+ export function buildSummary(statuses, expectedSolutions) {
110
+ const solutionSummary = expectedSolutions.map((solution) => {
111
+ let atVersion = 0;
112
+ let behind = 0;
113
+ let notDeployed = 0;
114
+ for (const status of statuses) {
115
+ const solStatus = status.solutions.find((s) => s.uniqueName === solution.uniqueName);
116
+ if (!solStatus || solStatus.status === "unknown")
117
+ continue;
118
+ if (solStatus.status === "current" || solStatus.status === "ahead") {
119
+ atVersion++;
120
+ }
121
+ else if (solStatus.status === "outdated") {
122
+ behind++;
123
+ }
124
+ else if (solStatus.status === "not_deployed") {
125
+ notDeployed++;
126
+ }
127
+ }
128
+ return {
129
+ uniqueName: solution.uniqueName,
130
+ friendlyName: solution.friendlyName,
131
+ expectedVersion: solution.version,
132
+ tenantsAtVersion: atVersion,
133
+ tenantsBehind: behind,
134
+ tenantsNotDeployed: notDeployed,
135
+ };
136
+ });
137
+ return {
138
+ totalTenants: statuses.length,
139
+ currentTenants: statuses.filter((s) => s.overallStatus === "current").length,
140
+ outdatedTenants: statuses.filter((s) => s.overallStatus === "outdated" || s.overallStatus === "mixed").length,
141
+ unknownTenants: statuses.filter((s) => s.overallStatus === "unknown").length,
142
+ solutionSummary,
143
+ };
144
+ }
145
+ export function displayTenantRiskAnalysis(analysis) {
146
+ console.log(chalk.bold(`${analysis.tenantName} — Drift Risk Analysis`));
147
+ console.log("━".repeat(70));
148
+ console.log();
149
+ console.log(` Risk Score: ${analysis.riskScore}/100 ${formatRiskLevel(analysis.riskLevel)}`);
150
+ console.log(` Recommendation: ${formatRecommendation(analysis.recommendation)}`);
151
+ console.log(` Reason: ${analysis.recommendationReason}`);
152
+ console.log();
153
+ if (analysis.factors.length > 0) {
154
+ console.log(chalk.bold("Risk Factors"));
155
+ console.log("─".repeat(70));
156
+ const factorTable = new Table({
157
+ head: ["Factor", "Level", "Weight", "Details"],
158
+ style: { head: ["cyan"] },
159
+ });
160
+ analysis.factors.forEach((f) => {
161
+ factorTable.push([
162
+ f.name.replace(/_/g, " "),
163
+ formatRiskLevel(f.level),
164
+ `${f.weight}/10`,
165
+ f.description,
166
+ ]);
167
+ });
168
+ console.log(factorTable.toString());
169
+ console.log();
170
+ }
171
+ if (analysis.outdatedSolutions.length > 0) {
172
+ console.log(chalk.bold("Outdated Solutions"));
173
+ console.log("─".repeat(70));
174
+ const solTable = new Table({
175
+ head: ["Solution", "Expected", "Deployed", "Drift"],
176
+ style: { head: ["cyan"] },
177
+ });
178
+ analysis.outdatedSolutions.forEach((sol) => {
179
+ solTable.push([
180
+ sol.uniqueName,
181
+ sol.expectedVersion,
182
+ sol.deployedVersion || "-",
183
+ chalk.yellow(`${sol.versionDrift} behind`),
184
+ ]);
185
+ });
186
+ console.log(solTable.toString());
187
+ }
188
+ }
189
+ export function displayFleetRiskAnalysis(fleet, riskFilter) {
190
+ let analyses = fleet.tenants;
191
+ // Filter by risk level if specified (e.g., --risk high)
192
+ if (typeof riskFilter === "string") {
193
+ const level = riskFilter.toLowerCase();
194
+ analyses = analyses.filter((a) => a.riskLevel === level);
195
+ }
196
+ // Sort: do_not_update first, then update_risky, review_recommended, safe_to_update, current
197
+ const recOrder = {
198
+ do_not_update: 0,
199
+ update_risky: 1,
200
+ review_recommended: 2,
201
+ safe_to_update: 3,
202
+ current: 4,
203
+ };
204
+ analyses.sort((a, b) => (recOrder[a.recommendation] ?? 5) - (recOrder[b.recommendation] ?? 5));
205
+ console.log(chalk.bold("Fleet Drift Risk Analysis"));
206
+ console.log("━".repeat(80));
207
+ console.log();
208
+ // Summary
209
+ const s = fleet.summary;
210
+ console.log(`Tenants: ${s.total} total`);
211
+ console.log(` ${chalk.green("✓")} Current: ${s.current}`);
212
+ console.log(` ${chalk.green("●")} Safe to update: ${s.safeToUpdate}`);
213
+ console.log(` ${chalk.yellow("●")} Review recommended: ${s.reviewRecommended}`);
214
+ console.log(` ${chalk.red("●")} Update risky: ${s.risky}`);
215
+ if (s.doNotUpdate > 0) {
216
+ console.log(` ${chalk.red("⚠")} Do not update: ${s.doNotUpdate}`);
217
+ }
218
+ console.log();
219
+ if (analyses.length === 0) {
220
+ console.log(chalk.gray("No tenants match the specified risk filter."));
221
+ return;
222
+ }
223
+ // Detailed table
224
+ const table = new Table({
225
+ head: ["Tenant", "Score", "Risk", "Recommendation", "Top Factor"],
226
+ style: { head: ["cyan"] },
227
+ colWidths: [22, 8, 8, 22, 35],
228
+ wordWrap: true,
229
+ });
230
+ analyses.forEach((a) => {
231
+ const topFactor = a.factors.length > 0
232
+ ? a.factors.filter((f) => f.level !== "low").sort((x, y) => y.weight - x.weight)[0]
233
+ ?.description || "Minor risk"
234
+ : "-";
235
+ table.push([
236
+ a.tenantName,
237
+ `${a.riskScore}`,
238
+ formatRiskLevel(a.riskLevel),
239
+ formatRecommendation(a.recommendation),
240
+ topFactor,
241
+ ]);
242
+ });
243
+ console.log(table.toString());
244
+ }
245
+ export function generateDemoDeployHistory(tenantId) {
246
+ // Prefer the explicit deploymentHistory authored on the tenant's metadata.
247
+ // This is what gives the demo a consistent risk-spread (HIGH/MED/LOW)
248
+ // without relying on tenant-id hashing. See `DEMO_TENANTS` in
249
+ // packages/core/src/mock/demo-data.ts.
250
+ const tenant = DEMO_TENANTS.find((t) => t.tenantId === tenantId);
251
+ const meta = tenant?.metadata;
252
+ if (meta?.deploymentHistory) {
253
+ const lastDate = new Date();
254
+ lastDate.setDate(lastDate.getDate() - meta.deploymentHistory.lastDeployDaysAgo);
255
+ return {
256
+ tenantId,
257
+ lastDeployResult: meta.deploymentHistory.lastDeployResult,
258
+ lastDeployDate: lastDate.toISOString(),
259
+ totalDeploys: meta.deploymentHistory.totalDeploys,
260
+ successfulDeploys: meta.deploymentHistory.successfulDeploys,
261
+ };
262
+ }
263
+ // Fallback: deterministic but varied history based on tenant ID for any
264
+ // demo tenants that don't define `deploymentHistory` explicitly.
265
+ const seed = parseInt(tenantId.replace(/-/g, "").slice(0, 8), 16) || 0;
266
+ const total = 3 + (seed % 20);
267
+ const successRate = 0.5 + (seed % 50) / 100; // 50-99%
268
+ const successful = Math.min(total, Math.round(total * successRate));
269
+ const daysAgo = 5 + (seed % 120);
270
+ const lastDate = new Date();
271
+ lastDate.setDate(lastDate.getDate() - daysAgo);
272
+ const lastResult = successful === total ? "success" : seed % 3 === 0 ? "failure" : "success";
273
+ return {
274
+ tenantId,
275
+ lastDeployResult: lastResult,
276
+ lastDeployDate: lastDate.toISOString(),
277
+ totalDeploys: total,
278
+ successfulDeploys: successful,
279
+ };
280
+ }
281
+ export function displayFleetSummary(summary, options, tenants, statuses, _checker, _expectedSolutions) {
282
+ console.log(chalk.bold("Version Drift Summary"));
283
+ console.log("━".repeat(60));
284
+ console.log();
285
+ const currentPct = Math.round((summary.currentTenants / summary.totalTenants) * 100);
286
+ console.log(`Tenants: ${summary.totalTenants} total`);
287
+ console.log(` ${chalk.green("✓")} Current: ${summary.currentTenants} (${currentPct}%)`);
288
+ console.log(` ${chalk.yellow("⚠")} Outdated: ${summary.outdatedTenants}`);
289
+ if (summary.unknownTenants > 0) {
290
+ console.log(` ${chalk.gray("?")} Unknown: ${summary.unknownTenants}`);
291
+ }
292
+ console.log();
293
+ console.log(chalk.bold("Per-Agent Status"));
294
+ console.log("─".repeat(60));
295
+ const solutionTable = new Table({
296
+ head: ["Agent", "Version", "Current", "Outdated", "Not Deployed"],
297
+ style: { head: ["cyan"] },
298
+ });
299
+ let filteredSummary = summary.solutionSummary;
300
+ if (options.agent) {
301
+ filteredSummary = filteredSummary.filter((s) => s.uniqueName.toLowerCase().includes(options.agent.toLowerCase()) ||
302
+ s.friendlyName.toLowerCase().includes(options.agent.toLowerCase()));
303
+ }
304
+ filteredSummary.forEach((sol) => {
305
+ solutionTable.push([
306
+ sol.uniqueName,
307
+ sol.expectedVersion,
308
+ chalk.green(sol.tenantsAtVersion.toString()),
309
+ sol.tenantsBehind > 0 ? chalk.yellow(sol.tenantsBehind.toString()) : "0",
310
+ sol.tenantsNotDeployed > 0 ? chalk.gray(sol.tenantsNotDeployed.toString()) : "0",
311
+ ]);
312
+ });
313
+ console.log(solutionTable.toString());
314
+ if (options.outdated) {
315
+ console.log();
316
+ console.log(chalk.bold("Outdated Tenants"));
317
+ console.log("─".repeat(60));
318
+ const outdatedTable = new Table({
319
+ head: ["Tenant", "Agent", "Deployed", "Expected"],
320
+ style: { head: ["cyan"] },
321
+ });
322
+ for (let i = 0; i < tenants.length; i++) {
323
+ const status = statuses[i];
324
+ status.solutions
325
+ .filter((s) => s.status === "outdated")
326
+ .forEach((sol) => {
327
+ outdatedTable.push([
328
+ tenants[i].name,
329
+ sol.uniqueName,
330
+ chalk.yellow(sol.deployedVersion || "-"),
331
+ sol.expectedVersion,
332
+ ]);
333
+ });
334
+ }
335
+ console.log(outdatedTable.toString());
336
+ }
337
+ }
338
+ /**
339
+ * Display unmanaged customization details for a single tenant
340
+ */
341
+ export function displayCustomizationDetails(result) {
342
+ console.log();
343
+ if (result.totalCustomizations === 0) {
344
+ console.log(chalk.green("Customizations: None detected - clean environment"));
345
+ return;
346
+ }
347
+ const riskIcon = result.riskLevel === "high"
348
+ ? chalk.red("⚠")
349
+ : result.riskLevel === "medium"
350
+ ? chalk.yellow("⚠")
351
+ : chalk.blue("ℹ");
352
+ console.log(chalk.bold("Unmanaged Customizations"));
353
+ console.log("─".repeat(60));
354
+ console.log(`${riskIcon} ${result.riskSummary}`);
355
+ console.log();
356
+ const custTable = new Table({
357
+ head: ["Component", "Type", "Description"],
358
+ style: { head: ["cyan"] },
359
+ colWidths: [30, 15, 45],
360
+ wordWrap: true,
361
+ });
362
+ result.customizations.forEach((c) => {
363
+ const typeColor = c.componentType === "flow" ||
364
+ c.componentType === "security_role" ||
365
+ c.componentType === "plugin"
366
+ ? chalk.red
367
+ : chalk.yellow;
368
+ custTable.push([c.displayName, typeColor(c.componentType), c.description]);
369
+ });
370
+ console.log(custTable.toString());
371
+ // Type summary
372
+ const nonZeroTypes = Object.entries(result.byType)
373
+ .filter(([_, count]) => count > 0)
374
+ .map(([type, count]) => `${count} ${type}`)
375
+ .join(", ");
376
+ console.log(chalk.gray(`\nBreakdown: ${nonZeroTypes}`));
377
+ }
378
+ /**
379
+ * Display fleet-wide unmanaged customization summary
380
+ */
381
+ export function displayCustomizationFleetSummary(summary) {
382
+ console.log();
383
+ console.log(chalk.bold("Unmanaged Customizations"));
384
+ console.log("─".repeat(60));
385
+ console.log(` ${chalk.green("✓")} Clean: ${summary.tenantsClean} tenants`);
386
+ console.log(` ${chalk.yellow("⚠")} Customized: ${summary.tenantsWithCustomizations} tenants (${summary.totalCustomizations} total)`);
387
+ if (summary.highRiskTenants.length > 0) {
388
+ console.log(` ${chalk.red("⚠")} High risk: ${summary.highRiskTenants.join(", ")}`);
389
+ }
390
+ // Show per-tenant customization counts
391
+ const tenantsWithCustomizations = summary.results.filter((r) => r.totalCustomizations > 0);
392
+ if (tenantsWithCustomizations.length > 0) {
393
+ console.log();
394
+ const custTable = new Table({
395
+ head: ["Tenant", "Count", "Risk", "Top Types"],
396
+ style: { head: ["cyan"] },
397
+ });
398
+ tenantsWithCustomizations.forEach((r) => {
399
+ const riskColor = r.riskLevel === "high" ? chalk.red : r.riskLevel === "medium" ? chalk.yellow : chalk.blue;
400
+ const topTypes = Object.entries(r.byType)
401
+ .filter(([_, count]) => count > 0)
402
+ .sort((a, b) => b[1] - a[1])
403
+ .slice(0, 3)
404
+ .map(([type, count]) => `${count} ${type}`)
405
+ .join(", ");
406
+ custTable.push([
407
+ r.tenantName,
408
+ r.totalCustomizations.toString(),
409
+ riskColor(r.riskLevel),
410
+ topTypes,
411
+ ]);
412
+ });
413
+ console.log(custTable.toString());
414
+ }
415
+ }
416
+ //# sourceMappingURL=drift-analysis.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift-analysis.js","sourceRoot":"","sources":["../../../src/commands/solutions/drift-analysis.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
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
+ /**
18
+ * Build a fresh `drift` Command instance.
19
+ *
20
+ * The same handler is registered under two parents — `solutions drift`
21
+ * (legacy) and `tenants drift` (the canonical name now that the output is
22
+ * primarily per-tenant; see issue #422 for the deeper restructure). Each
23
+ * parent gets its own Command instance because Commander tracks parent
24
+ * pointers per-Command.
25
+ */
26
+ export declare function createDriftCommand(): Command;
27
+ export { buildAfterActionHint } from "./drift-analysis.js";
28
+ export { calculateDriftRisk } from "./risk-calculator.js";
29
+ export { buildDriftFixPlan } from "./fix-planner.js";
30
+ export type { DriftFixEntry, DriftFixResult } from "./fix-planner.js";
31
+ export type { DriftRiskLevel } from "./risk-calculator.js";
32
+ //# sourceMappingURL=drift.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drift.d.ts","sourceRoot":"","sources":["../../../src/commands/solutions/drift.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqHpC;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,IAAI,OAAO,CAgkB5C;AAsJD,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AACtE,YAAY,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC"}