@ganakailabs/cloudeval-cli 0.21.0 → 0.21.2

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
@@ -110,31 +110,31 @@ npm uninstall -g @ganakailabs/cloudeval-cli
110
110
  In the Terminal UI, use the Thread control or `/thread` to choose open chat
111
111
  sessions, recent CloudEval chat threads, and local CLI sessions. `/thread new`
112
112
  starts another independent open session, and `/open` opens the matching
113
- CloudEval web chat thread when the active session has a thread id. Roomy terminals
114
- show a context rail with project, thread, model, mode, profile, and report
115
- artifact chips; narrower terminals keep the chat first and expose the same
116
- controls through the docked composer and slash commands. Typing `/` opens a
117
- bottom command completion strip; use Tab or Up/Down to move, Right to accept
118
- the ghost text, and Enter to choose the highlighted command. Streaming work
119
- appears as a task ledger in the thread. Grounded answers show numbered citations and a
120
- Sources section instead of raw `[S_tool_...]` tags, with citation numbers
121
- highlighted inline; `/copy` copies the latest assistant response and `/download`
122
- writes a Markdown transcript with the same references. Project and Connection
123
- tabs include selected-item detail panes for backend fields, report coverage,
124
- sync state, and linked records; use `J`/`K` or Up/Down on Projects and
125
- Connections to move the selected row, then Enter to confirm it. The billing
126
- header separates credits left from observed credits used so
127
- usage does not look like the current budget. Use the Profile control or `/profile
128
- architecture|cost|triage|remediation` to choose an Agent Profile for the next
129
- chat stream. Selecting a profile switches to Agent mode; selecting Ask mode
130
- clears the profile back to the default chat flow. Starter prompts stay hidden
131
- until you run `/starter`. Press `Esc` from the
132
- prompt to leave text editing so tab, arrow, and number shortcuts move through
133
- controls and tabs; type again to resume editing. Busy loaders and the input
134
- cursor share the same animation style unless you pass `--no-anim`. The banner
135
- details include the logged-in user. Focused controls and the active top tab use
136
- the shared warm banner-yellow accent, with the active tab filled across its full
137
- button interior.
113
+ CloudEval web chat thread when the active session has a thread id. Roomy
114
+ terminals show a context rail with project, thread, model, mode, profile, report
115
+ artifact chips; narrower terminals
116
+ keep the chat first and expose the same controls through the docked composer and
117
+ slash commands. Typing `/` opens a bottom command completion strip; use Tab or
118
+ Up/Down to move, Right to accept the ghost text, and Enter to choose the
119
+ highlighted command. Streaming work appears as a task ledger in the thread.
120
+ Grounded answers show numbered citations and a Sources section instead of raw
121
+ `[S_tool_...]` tags, with citation numbers highlighted inline; `/copy` copies
122
+ the latest assistant response and `/download` writes a Markdown transcript with
123
+ the same references. Project and Connection tabs include selected-item detail
124
+ panes for backend fields, report coverage, sync state, and linked records; use
125
+ `J`/`K` or Up/Down on Projects and Connections to move the selected row, then
126
+ Enter to confirm it. The billing header separates credits left from observed
127
+ credits used so usage does not look like the current budget. Use the Profile
128
+ control or `/profile architecture|cost|triage|remediation` to choose an Agent
129
+ Profile for the next chat stream. Selecting a profile switches to Agent mode;
130
+ selecting Ask mode clears the profile back to the default chat flow. Starter
131
+ prompts stay hidden until you run `/starter`. Press `Esc` from the prompt to
132
+ leave text editing so tab, arrow, and number shortcuts move through controls
133
+ and tabs; type again to resume editing. Busy loaders and the input cursor animate
134
+ unless you pass `--no-anim`. The
135
+ banner details include the logged-in user. Focused controls and the active top
136
+ tab use the shared warm banner-yellow accent, with the active tab filled across
137
+ its full button interior.
138
138
 
139
139
  ## Authentication
140
140
 
@@ -38,10 +38,10 @@ import {
38
38
  } from "./chunk-LDDHLUZH.js";
39
39
  import {
40
40
  Banner
41
- } from "./chunk-LGJOACZ5.js";
41
+ } from "./chunk-CJWMEKKP.js";
42
42
  import {
43
43
  CLI_VERSION
44
- } from "./chunk-GXHDB5LK.js";
44
+ } from "./chunk-32EP3DJT.js";
45
45
  import {
46
46
  raisedButtonStyle,
47
47
  terminalTheme
@@ -325,11 +325,13 @@ var TitledBox = ({
325
325
  ...boxProps
326
326
  }) => {
327
327
  const labelColor = titleColor ?? (typeof borderColor === "string" ? borderColor : void 0);
328
+ const clipContent = boxProps.height !== void 0;
328
329
  return /* @__PURE__ */ jsxs2(
329
330
  Box2,
330
331
  {
331
332
  ...boxProps,
332
333
  flexDirection: "column",
334
+ overflow: clipContent ? "hidden" : void 0,
333
335
  borderStyle,
334
336
  borderColor,
335
337
  padding,
@@ -355,6 +357,8 @@ var TitledBox = ({
355
357
  alignItems,
356
358
  justifyContent,
357
359
  flexWrap,
360
+ overflow: clipContent ? "hidden" : void 0,
361
+ height: clipContent ? "100%" : void 0,
358
362
  children
359
363
  }
360
364
  )
@@ -2088,6 +2092,8 @@ var getMiddleViewportRows = (size, options = {}) => {
2088
2092
  return Math.max(1, Math.floor(rows) - headerRows - footerRows - safetyRows);
2089
2093
  };
2090
2094
  var getFramedBodyRows = (frameRows, chromeRows = 4) => Math.max(1, Math.floor(frameRows) - Math.max(0, Math.ceil(chromeRows)));
2095
+ var estimateWorkspaceTabBarRows = () => 2;
2096
+ var estimateSelectPanelRows = (visibleLimit) => 4 + Math.max(1, Math.ceil(visibleLimit));
2091
2097
  var getPromptInputRowBudget = (size) => {
2092
2098
  const rows = normalizeDimension(size.rows, 32);
2093
2099
  return clamp2(Math.floor(rows * 0.13), 4, 8);
@@ -8166,7 +8172,7 @@ var App = ({
8166
8172
  const lastRow = Math.max(...workspaceTabHitAreas.map((area) => area.endRow));
8167
8173
  return Math.max(0, lastRow - firstRow + 1);
8168
8174
  }, [workspaceTabHitAreas]);
8169
- const workspaceTabBarRows = (bannerDisabled ? 3 : 0) + workspaceTabButtonRows + 1 + (bannerDisabled ? 1 : 0);
8175
+ const workspaceTabBarRows = (bannerDisabled ? 4 : 0) + Math.max(estimateWorkspaceTabBarRows(), workspaceTabButtonRows);
8170
8176
  const promptPanelRows = estimatePromptPanelRows({
8171
8177
  inputRows: promptInputRows,
8172
8178
  suggestionRows: promptSuggestionRows,
@@ -8194,15 +8200,23 @@ var App = ({
8194
8200
  24,
8195
8201
  workspaceContentWidth - (workspacePanelOverflowing ? 7 : 5)
8196
8202
  );
8197
- const chatHeaderRows = bannerRenderedRows + workspaceTabBarRows + 2;
8198
- const chatFooterRows = bottomControlsRows + (isSearching ? searchPromptPanelRows : activeSelector ? 0 : promptPanelRows);
8203
+ const chatTabDescriptionRows = 1;
8204
+ const chatMiddleMarginRows = 1;
8205
+ const chatHeaderRows = bannerRenderedRows + workspaceTabBarRows + chatTabDescriptionRows + chatMiddleMarginRows;
8206
+ const chatSelectorRows = activeSelector ? estimateSelectPanelRows(tuiLayout.selectorLimit) : 0;
8207
+ const chatFooterRows = bottomControlsRows + chatSelectorRows + (isSearching ? searchPromptPanelRows : activeSelector ? 0 : promptPanelRows);
8199
8208
  const chatMiddleViewportRows = getMiddleViewportRows(terminalSize, {
8200
8209
  headerRows: chatHeaderRows,
8201
- footerRows: chatFooterRows
8210
+ footerRows: chatFooterRows,
8211
+ safetyRows: 3
8202
8212
  });
8203
- const chatMiddleAuxiliaryRows = (isSearching ? 3 : 0) + (queuedMessages.length > 0 ? 4 : 0) + (notice ? 1 : 0) + (errorText ? 5 : 0) + (chatState.status === "hitl_waiting" && chatState.hitl?.waiting ? 7 : 0) + (activeSelector ? tuiLayout.selectorLimit + 4 : 0);
8213
+ const chatMiddleAuxiliaryRows = (isSearching ? 3 : 0) + (queuedMessages.length > 0 ? 4 : 0) + (notice ? 1 : 0) + (errorText ? 5 : 0) + (chatState.status === "hitl_waiting" && chatState.hitl?.waiting ? 7 : 0);
8204
8214
  const contextRailArtifactRows = splitChatLayout && chatArtifactChips.length ? chatArtifactChips.length + 2 : 0;
8205
- const chatMainPanelRows = Math.max(4, chatMiddleViewportRows - chatMiddleAuxiliaryRows);
8215
+ const chatMainPanelRows = Math.max(
8216
+ 4,
8217
+ chatMiddleViewportRows - chatMiddleAuxiliaryRows
8218
+ );
8219
+ const showChatThreadPanel = !activeSelector;
8206
8220
  const chatThreadHeight = getFramedBodyRows(chatMainPanelRows);
8207
8221
  const chatMiddleOverflowing = chatMiddleContentHeight > chatMiddleViewportHeight;
8208
8222
  const selectorControlStartRow = useMemo(
@@ -9087,16 +9101,16 @@ var App = ({
9087
9101
  ] });
9088
9102
  }
9089
9103
  return /* @__PURE__ */ jsxs8(Box9, { flexDirection: "column", paddingX: tuiLayout.paddingX, paddingY: 0, gap: 0, height: terminalSize.rows, children: [
9090
- /* @__PURE__ */ jsx10(Banner, { disable: bannerDisabled, details: headerDetails, terminalColumns: bannerContentColumns }),
9091
- /* @__PURE__ */ jsx10(
9104
+ /* @__PURE__ */ jsx10(Box9, { flexShrink: 0, children: /* @__PURE__ */ jsx10(Banner, { disable: bannerDisabled, details: headerDetails, terminalColumns: bannerContentColumns }) }),
9105
+ /* @__PURE__ */ jsx10(Box9, { flexShrink: 0, children: /* @__PURE__ */ jsx10(
9092
9106
  WorkspaceTabBar,
9093
9107
  {
9094
9108
  activeTab: activeWorkspaceTab,
9095
9109
  showBrand: bannerDisabled,
9096
9110
  billingSummary: bannerDisabled ? billingHeader : void 0
9097
9111
  }
9098
- ),
9099
- /* @__PURE__ */ jsx10(Text10, { dimColor: true, wrap: "wrap", children: workspaceTabDescriptions.chat }),
9112
+ ) }),
9113
+ /* @__PURE__ */ jsx10(Box9, { flexShrink: 0, children: /* @__PURE__ */ jsx10(Text10, { dimColor: true, wrap: "wrap", children: workspaceTabDescriptions.chat }) }),
9100
9114
  /* @__PURE__ */ jsxs8(Box9, { flexDirection: "row", marginTop: 1, children: [
9101
9115
  /* @__PURE__ */ jsx10(
9102
9116
  Box9,
@@ -9158,7 +9172,7 @@ var App = ({
9158
9172
  terminalColumns: chatAvailableWidth
9159
9173
  }
9160
9174
  ) }) : null,
9161
- splitChatLayout ? /* @__PURE__ */ jsxs8(Box9, { flexDirection: "row", columnGap: chatSplitGap, children: [
9175
+ showChatThreadPanel ? splitChatLayout ? /* @__PURE__ */ jsxs8(Box9, { flexDirection: "row", columnGap: chatSplitGap, children: [
9162
9176
  /* @__PURE__ */ jsx10(
9163
9177
  ChatContextPanel,
9164
9178
  {
@@ -9183,7 +9197,7 @@ var App = ({
9183
9197
  }
9184
9198
  ),
9185
9199
  threadPanel
9186
- ] }) : threadPanel,
9200
+ ] }) : threadPanel : null,
9187
9201
  chatState.status === "hitl_waiting" && chatState.hitl?.waiting ? /* @__PURE__ */ jsx10(
9188
9202
  HitlPanel,
9189
9203
  {
@@ -9193,108 +9207,6 @@ var App = ({
9193
9207
  answers: hitlAnswers,
9194
9208
  frontendUrl: frontendThreadUrl
9195
9209
  }
9196
- ) : null,
9197
- activeSelector === "thread" ? /* @__PURE__ */ jsx10(
9198
- SelectPanel,
9199
- {
9200
- title: "Select Thread",
9201
- items: loadingSessions || loadingRemoteThreads ? [
9202
- {
9203
- label: "Loading threads...",
9204
- value: { kind: "new" },
9205
- description: "Reading CloudEval threads and local CLI history."
9206
- }
9207
- ] : threadSelectItems,
9208
- selectedIndex: Math.max(
9209
- 0,
9210
- threadSelectItems.findIndex(
9211
- (item) => item.value.kind === "remote" && item.value.thread.thread_id === chatState.threadId || item.value.kind === "session" && item.value.session.threadId === chatState.threadId || item.value.kind === "draft" && item.value.draft.key === activeDraftSessionKey
9212
- )
9213
- ),
9214
- onSubmit: (item) => selectThread(item.value),
9215
- onCancel: () => setActiveSelector(null),
9216
- limit: tuiLayout.selectorLimit
9217
- }
9218
- ) : null,
9219
- activeSelector === "project" ? /* @__PURE__ */ jsx10(
9220
- SelectPanel,
9221
- {
9222
- title: "Select Project",
9223
- items: (projects.length ? projects : [defaultProject]).map((project) => ({
9224
- label: `${project.name} (${project.cloud_provider ?? "cloud"})`,
9225
- value: project,
9226
- description: project.id
9227
- })),
9228
- selectedIndex: Math.max(
9229
- 0,
9230
- (projects.length ? projects : [defaultProject]).findIndex(
9231
- (project) => project.id === (selectedProject ?? defaultProject).id
9232
- )
9233
- ),
9234
- onSubmit: (item) => {
9235
- setSelectedProject(item.value);
9236
- setActiveSelector(null);
9237
- },
9238
- onCancel: () => setActiveSelector(null),
9239
- limit: tuiLayout.selectorLimit
9240
- }
9241
- ) : null,
9242
- activeSelector === "model" ? /* @__PURE__ */ jsx10(
9243
- SelectPanel,
9244
- {
9245
- title: "Select Model",
9246
- items: modelItems,
9247
- selectedIndex: Math.max(
9248
- 0,
9249
- modelItems.findIndex((item) => item.value === selectedModel)
9250
- ),
9251
- onSubmit: (item) => {
9252
- setSelectedModel(item.value);
9253
- setActiveSelector(null);
9254
- },
9255
- onCancel: () => setActiveSelector(null),
9256
- limit: tuiLayout.selectorLimit
9257
- }
9258
- ) : null,
9259
- activeSelector === "mode" ? /* @__PURE__ */ jsx10(
9260
- SelectPanel,
9261
- {
9262
- title: "Select Mode",
9263
- items: modeItems,
9264
- selectedIndex: Math.max(
9265
- 0,
9266
- modeItems.findIndex((item) => item.value === selectedMode)
9267
- ),
9268
- onSubmit: (item) => {
9269
- setSelectedMode(item.value);
9270
- if (item.value === "ask") {
9271
- setSelectedAgentProfileId("");
9272
- }
9273
- setNotice(
9274
- item.value === "ask" ? "Mode selected: Ask. Agent Profile cleared." : `Mode selected: ${item.label}`
9275
- );
9276
- setActiveSelector(null);
9277
- },
9278
- onCancel: () => setActiveSelector(null),
9279
- limit: tuiLayout.selectorLimit
9280
- }
9281
- ) : null,
9282
- activeSelector === "profile" ? /* @__PURE__ */ jsx10(
9283
- SelectPanel,
9284
- {
9285
- title: "Select Agent Profile",
9286
- items: agentProfileItems,
9287
- selectedIndex: Math.max(
9288
- 0,
9289
- agentProfileItems.findIndex((item) => item.value === selectedAgentProfileId)
9290
- ),
9291
- onSubmit: (item) => {
9292
- selectAgentProfileById(item.value, item.label);
9293
- setActiveSelector(null);
9294
- },
9295
- onCancel: () => setActiveSelector(null),
9296
- limit: tuiLayout.selectorLimit
9297
- }
9298
9210
  ) : null
9299
9211
  ] })
9300
9212
  }
@@ -9310,6 +9222,108 @@ var App = ({
9310
9222
  }
9311
9223
  ) : null
9312
9224
  ] }),
9225
+ activeSelector === "thread" ? /* @__PURE__ */ jsx10(
9226
+ SelectPanel,
9227
+ {
9228
+ title: "Select Thread",
9229
+ items: loadingSessions || loadingRemoteThreads ? [
9230
+ {
9231
+ label: "Loading threads...",
9232
+ value: { kind: "new" },
9233
+ description: "Reading CloudEval threads and local CLI history."
9234
+ }
9235
+ ] : threadSelectItems,
9236
+ selectedIndex: Math.max(
9237
+ 0,
9238
+ threadSelectItems.findIndex(
9239
+ (item) => item.value.kind === "remote" && item.value.thread.thread_id === chatState.threadId || item.value.kind === "session" && item.value.session.threadId === chatState.threadId || item.value.kind === "draft" && item.value.draft.key === activeDraftSessionKey
9240
+ )
9241
+ ),
9242
+ onSubmit: (item) => selectThread(item.value),
9243
+ onCancel: () => setActiveSelector(null),
9244
+ limit: tuiLayout.selectorLimit
9245
+ }
9246
+ ) : null,
9247
+ activeSelector === "project" ? /* @__PURE__ */ jsx10(
9248
+ SelectPanel,
9249
+ {
9250
+ title: "Select Project",
9251
+ items: (projects.length ? projects : [defaultProject]).map((project) => ({
9252
+ label: `${project.name} (${project.cloud_provider ?? "cloud"})`,
9253
+ value: project,
9254
+ description: project.id
9255
+ })),
9256
+ selectedIndex: Math.max(
9257
+ 0,
9258
+ (projects.length ? projects : [defaultProject]).findIndex(
9259
+ (project) => project.id === (selectedProject ?? defaultProject).id
9260
+ )
9261
+ ),
9262
+ onSubmit: (item) => {
9263
+ setSelectedProject(item.value);
9264
+ setActiveSelector(null);
9265
+ },
9266
+ onCancel: () => setActiveSelector(null),
9267
+ limit: tuiLayout.selectorLimit
9268
+ }
9269
+ ) : null,
9270
+ activeSelector === "model" ? /* @__PURE__ */ jsx10(
9271
+ SelectPanel,
9272
+ {
9273
+ title: "Select Model",
9274
+ items: modelItems,
9275
+ selectedIndex: Math.max(
9276
+ 0,
9277
+ modelItems.findIndex((item) => item.value === selectedModel)
9278
+ ),
9279
+ onSubmit: (item) => {
9280
+ setSelectedModel(item.value);
9281
+ setActiveSelector(null);
9282
+ },
9283
+ onCancel: () => setActiveSelector(null),
9284
+ limit: tuiLayout.selectorLimit
9285
+ }
9286
+ ) : null,
9287
+ activeSelector === "mode" ? /* @__PURE__ */ jsx10(
9288
+ SelectPanel,
9289
+ {
9290
+ title: "Select Mode",
9291
+ items: modeItems,
9292
+ selectedIndex: Math.max(
9293
+ 0,
9294
+ modeItems.findIndex((item) => item.value === selectedMode)
9295
+ ),
9296
+ onSubmit: (item) => {
9297
+ setSelectedMode(item.value);
9298
+ if (item.value === "ask") {
9299
+ setSelectedAgentProfileId("");
9300
+ }
9301
+ setNotice(
9302
+ item.value === "ask" ? "Mode selected: Ask. Agent Profile cleared." : `Mode selected: ${item.label}`
9303
+ );
9304
+ setActiveSelector(null);
9305
+ },
9306
+ onCancel: () => setActiveSelector(null),
9307
+ limit: tuiLayout.selectorLimit
9308
+ }
9309
+ ) : null,
9310
+ activeSelector === "profile" ? /* @__PURE__ */ jsx10(
9311
+ SelectPanel,
9312
+ {
9313
+ title: "Select Agent Profile",
9314
+ items: agentProfileItems,
9315
+ selectedIndex: Math.max(
9316
+ 0,
9317
+ agentProfileItems.findIndex((item) => item.value === selectedAgentProfileId)
9318
+ ),
9319
+ onSubmit: (item) => {
9320
+ selectAgentProfileById(item.value, item.label);
9321
+ setActiveSelector(null);
9322
+ },
9323
+ onCancel: () => setActiveSelector(null),
9324
+ limit: tuiLayout.selectorLimit
9325
+ }
9326
+ ) : null,
9313
9327
  isSearching ? /* @__PURE__ */ jsx10(
9314
9328
  InputBox,
9315
9329
  {
@@ -3,8 +3,8 @@ import {
3
3
  bannerMetaColor,
4
4
  bannerSegmentColor,
5
5
  splitBannerLineSegments
6
- } from "./chunk-LGJOACZ5.js";
7
- import "./chunk-GXHDB5LK.js";
6
+ } from "./chunk-CJWMEKKP.js";
7
+ import "./chunk-32EP3DJT.js";
8
8
  import "./chunk-ZDKRIOMB.js";
9
9
  export {
10
10
  Banner,
@@ -1,5 +1,5 @@
1
1
  // src/version.ts
2
- var CLI_VERSION = "0.21.0";
2
+ var CLI_VERSION = "0.21.2";
3
3
 
4
4
  export {
5
5
  CLI_VERSION
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  CLI_VERSION
3
- } from "./chunk-GXHDB5LK.js";
3
+ } from "./chunk-32EP3DJT.js";
4
4
  import {
5
5
  shouldUseColor,
6
6
  terminalTheme
package/dist/cli.js CHANGED
@@ -36,7 +36,7 @@ import {
36
36
  } from "./chunk-LDDHLUZH.js";
37
37
  import {
38
38
  CLI_VERSION
39
- } from "./chunk-GXHDB5LK.js";
39
+ } from "./chunk-32EP3DJT.js";
40
40
 
41
41
  // src/runtime/prepareInk.ts
42
42
  import fs from "fs";
@@ -13382,7 +13382,7 @@ program.command("tui").description("Open the CloudEval Terminal UI").option(
13382
13382
  const { assertSecureBaseUrl } = await import("./dist-AGQQPJUD.js");
13383
13383
  const [{ render }, { App }] = await Promise.all([
13384
13384
  import("ink"),
13385
- import("./App-D4HXP4GR.js")
13385
+ import("./App-5ITWBHXF.js")
13386
13386
  ]);
13387
13387
  const baseUrl = await resolveBaseUrl(options, command);
13388
13388
  assertSecureBaseUrl(baseUrl);
@@ -13434,7 +13434,7 @@ program.command("chat").description("Start an interactive chat session").option(
13434
13434
  const { assertSecureBaseUrl } = await import("./dist-AGQQPJUD.js");
13435
13435
  const [{ render }, { App }] = await Promise.all([
13436
13436
  import("ink"),
13437
- import("./App-D4HXP4GR.js")
13437
+ import("./App-5ITWBHXF.js")
13438
13438
  ]);
13439
13439
  const baseUrl = await resolveBaseUrl(options, command);
13440
13440
  assertSecureBaseUrl(baseUrl);
@@ -14191,7 +14191,7 @@ Error: ${errorMsg}
14191
14191
  program.command("banner").description("Preview the startup banner and terminal capabilities").action(async () => {
14192
14192
  const { render } = await import("ink");
14193
14193
  const BannerPreview = React.lazy(async () => ({
14194
- default: (await import("./Banner-6FGLG7VG.js")).Banner
14194
+ default: (await import("./Banner-4PWWKMRZ.js")).Banner
14195
14195
  }));
14196
14196
  render(
14197
14197
  /* @__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.21.0",
3
+ "version": "0.21.2",
4
4
  "license": "LicenseRef-CloudEval-CLI",
5
5
  "type": "module",
6
6
  "description": "CloudEval CLI for cloud architecture, cost, report, automation, and MCP workflows.",
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.21.0",
17
+ "versionInfo": "0.21.2",
18
18
  "downloadLocation": "https://github.com/ganakailabs/cloudeval-cli",
19
19
  "filesAnalyzed": false,
20
20
  "licenseConcluded": "LicenseRef-CloudEval-CLI",