@ganakailabs/cloudeval-cli 0.30.3 → 0.30.4

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.
package/README.md CHANGED
@@ -117,7 +117,7 @@ jobs:
117
117
  --non-interactive
118
118
  ```
119
119
 
120
- Public example: [passing baseline PR #6](https://github.com/ganakailabs/cloudeval-azure-arm-review-example/pull/6) in [`ganakailabs/cloudeval-azure-arm-review-example`](https://github.com/ganakailabs/cloudeval-azure-arm-review-example). Review comments show a merge-gate table, CloudEval report badges, a visible AI summary, a folded detailed AI reviewer note, a Well-Architected radar/table drilldown, and cost Mermaid charts.
120
+ Public example: [passing baseline PR #6](https://github.com/ganakailabs/cloudeval-azure-arm-review-example/pull/6) in [`ganakailabs/cloudeval-azure-arm-review-example`](https://github.com/ganakailabs/cloudeval-azure-arm-review-example). Review comments show a merge-gate table, CloudEval report badges, a visible AI summary, a folded detailed AI reviewer note, a compact Well-Architected radar/table drilldown, and cost Mermaid charts grouped for quick scanning.
121
121
 
122
122
  ### MCP For Codex, Cursor, Claude, VS Code
123
123
 
@@ -38,10 +38,10 @@ import {
38
38
  } from "./chunk-NXM4JEOB.js";
39
39
  import {
40
40
  Banner
41
- } from "./chunk-QB3BBKVH.js";
41
+ } from "./chunk-NOR7UT66.js";
42
42
  import {
43
43
  CLI_VERSION
44
- } from "./chunk-FPZWMNAI.js";
44
+ } from "./chunk-RVZOUNMP.js";
45
45
  import {
46
46
  raisedButtonStyle,
47
47
  terminalTheme
@@ -3,8 +3,8 @@ import {
3
3
  bannerMetaColor,
4
4
  bannerSegmentColor,
5
5
  splitBannerLineSegments
6
- } from "./chunk-QB3BBKVH.js";
7
- import "./chunk-FPZWMNAI.js";
6
+ } from "./chunk-NOR7UT66.js";
7
+ import "./chunk-RVZOUNMP.js";
8
8
  import "./chunk-ZDKRIOMB.js";
9
9
  export {
10
10
  Banner,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  CLI_VERSION
3
- } from "./chunk-FPZWMNAI.js";
3
+ } from "./chunk-RVZOUNMP.js";
4
4
  import {
5
5
  shouldUseColor,
6
6
  terminalTheme
@@ -1,5 +1,5 @@
1
1
  // src/version.ts
2
- var CLI_VERSION = "0.30.3";
2
+ var CLI_VERSION = "0.30.4";
3
3
 
4
4
  export {
5
5
  CLI_VERSION
package/dist/cli.js CHANGED
@@ -39,7 +39,7 @@ import {
39
39
  } from "./chunk-NXM4JEOB.js";
40
40
  import {
41
41
  CLI_VERSION
42
- } from "./chunk-FPZWMNAI.js";
42
+ } from "./chunk-RVZOUNMP.js";
43
43
 
44
44
  // src/runtime/prepareInk.ts
45
45
  import fs from "fs";
@@ -3397,6 +3397,28 @@ var mermaidAxisId = (label) => {
3397
3397
  const normalized = normalizeKey(label).replace(/[^a-z0-9_]/g, "_");
3398
3398
  return normalized || "pillar";
3399
3399
  };
3400
+ var compactMermaidAxisLabel = (label) => {
3401
+ const compactLabels = {
3402
+ security: "Security",
3403
+ reliability: "Reliability",
3404
+ cost_optimization: "Cost",
3405
+ operational_excellence: "Ops",
3406
+ performance_efficiency: "Performance"
3407
+ };
3408
+ const normalized = normalizeKey(label);
3409
+ if (compactLabels[normalized]) {
3410
+ return compactLabels[normalized];
3411
+ }
3412
+ const cleaned = label.trim().replace(/\s+/g, " ");
3413
+ if (cleaned.length <= 16) {
3414
+ return cleaned;
3415
+ }
3416
+ const words = cleaned.split(" ");
3417
+ if (words.length > 1) {
3418
+ return words.slice(0, 2).map((word) => word.length > 8 ? word.slice(0, 8) : word).join(" ");
3419
+ }
3420
+ return cleaned.slice(0, 16);
3421
+ };
3400
3422
  var wellArchitectedRadarLines = (pillars) => {
3401
3423
  const scored = pillars.map((pillar) => {
3402
3424
  const label = String(pillar.label ?? pillar.id ?? "Pillar");
@@ -3416,10 +3438,15 @@ var wellArchitectedRadarLines = (pillars) => {
3416
3438
  "```mermaid",
3417
3439
  "radar-beta",
3418
3440
  " title Well-Architected posture",
3419
- ` axis ${scored.map((pillar) => `${pillar.id}["${mermaidLabel(pillar.label)}"]`).join(", ")}`,
3441
+ ` axis ${scored.map(
3442
+ (pillar) => `${pillar.id}["${mermaidLabel(compactMermaidAxisLabel(pillar.label))}"]`
3443
+ ).join(", ")}`,
3420
3444
  ` curve current["Current"]{${scored.map((pillar) => trimNumber(pillar.score, 3)).join(", ")}}`,
3445
+ " showLegend false",
3421
3446
  " max 100",
3422
3447
  " min 0",
3448
+ " graticule polygon",
3449
+ " ticks 4",
3423
3450
  "```",
3424
3451
  "",
3425
3452
  "_If GitHub does not render Mermaid radar charts yet, use the table below as the fallback._"
@@ -4186,7 +4213,9 @@ var buildMarkdownSummary = (data) => {
4186
4213
  "",
4187
4214
  ...riskLines,
4188
4215
  "",
4189
- ...radarLines.length ? [...radarLines, ""] : [],
4216
+ ...radarLines.length ? ["**Radar (compact labels)**", "", ...radarLines, ""] : [],
4217
+ "**Scores**",
4218
+ "",
4190
4219
  "| Pillar | Score | Rating |",
4191
4220
  "| --- | ---: | --- |",
4192
4221
  ...pillarLines,
@@ -4202,14 +4231,18 @@ var buildMarkdownSummary = (data) => {
4202
4231
  cost?.currency ?? data.gate?.cost?.estimatedSavings?.currency
4203
4232
  );
4204
4233
  if (impactLines.length) {
4205
- costLines.push(...impactLines);
4234
+ costLines.push("**Cost impact**", "", ...impactLines);
4206
4235
  } else if (data.gate?.cost?.estimatedSavings?.amount !== void 0) {
4207
4236
  costLines.push(
4237
+ "**Cost impact**",
4238
+ "",
4208
4239
  `- Estimated savings: **${formatMonthlyMoney(data.gate.cost.estimatedSavings.amount, data.gate.cost.estimatedSavings.currency)}**`
4209
4240
  );
4210
4241
  }
4211
4242
  if (costPieRows.length) {
4212
4243
  costLines.push(
4244
+ "",
4245
+ "**Cost split**",
4213
4246
  "",
4214
4247
  "```mermaid",
4215
4248
  `pie title ${costPieTitle}`,
@@ -17181,7 +17214,7 @@ program.command("tui").description("Open the CloudEval Terminal UI").option("--b
17181
17214
  const { assertSecureBaseUrl } = await import("./dist-6LEMVXIY.js");
17182
17215
  const [{ render }, { App }] = await Promise.all([
17183
17216
  import("ink"),
17184
- import("./App-SKVX7NAF.js")
17217
+ import("./App-AN3ELGIY.js")
17185
17218
  ]);
17186
17219
  const baseUrl = await resolveBaseUrl(options, command);
17187
17220
  assertSecureBaseUrl(baseUrl);
@@ -17242,7 +17275,7 @@ program.command("chat").description("Start an interactive chat session").option(
17242
17275
  const { assertSecureBaseUrl } = await import("./dist-6LEMVXIY.js");
17243
17276
  const [{ render }, { App }] = await Promise.all([
17244
17277
  import("ink"),
17245
- import("./App-SKVX7NAF.js")
17278
+ import("./App-AN3ELGIY.js")
17246
17279
  ]);
17247
17280
  const baseUrl = await resolveBaseUrl(options, command);
17248
17281
  assertSecureBaseUrl(baseUrl);
@@ -18034,7 +18067,7 @@ Error: ${errorMsg}
18034
18067
  program.command("banner").description("Preview the startup banner and terminal capabilities").action(async () => {
18035
18068
  const { render } = await import("ink");
18036
18069
  const BannerPreview = React.lazy(async () => ({
18037
- default: (await import("./Banner-CRBHEOTC.js")).Banner
18070
+ default: (await import("./Banner-XD5GCTUQ.js")).Banner
18038
18071
  }));
18039
18072
  render(
18040
18073
  /* @__PURE__ */ jsx(React.Suspense, { fallback: null, children: /* @__PURE__ */ jsx(BannerPreview, { disable: false }) })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ganakailabs/cloudeval-cli",
3
- "version": "0.30.3",
3
+ "version": "0.30.4",
4
4
  "license": "LicenseRef-CloudEval-CLI",
5
5
  "type": "module",
6
6
  "description": "Review Cloud infra-as-code and live environments from CLI, CI, and MCP agents.",
package/sbom.spdx.json CHANGED
@@ -14,7 +14,7 @@
14
14
  {
15
15
  "SPDXID": "SPDXRef-Package-CloudEval-CLI",
16
16
  "name": "CloudEval CLI",
17
- "versionInfo": "0.30.3",
17
+ "versionInfo": "0.30.4",
18
18
  "downloadLocation": "https://github.com/ganakailabs/cloudeval-cli",
19
19
  "filesAnalyzed": false,
20
20
  "licenseConcluded": "LicenseRef-CloudEval-CLI",