What's new in CLI v2.0
dci v2.0 is a ground-up refresh of the CLI experience for its two audiences: humans reading cloud costs in a terminal and AI agents driving the CLI programmatically. This page walks through what you'll see differently and ends with the one change that can affect existing scripts. For the full gallery of terminal input/output comparisons, see CLI v2.0: before and after.
v2.0 unifies exit codes across all modes. Scripts that check $? != 0 are unaffected; scripts that branch on specific codes need the new taxonomy. Details in For scripts below.
For humans
Reports render as reports
Report results used to print as a flat database dump — one row per group × time period, with raw floats and epoch timestamps. In v2.0 the interactive table view pivots by default: groups as rows, time as columns, ranked by spend, with totals, a first→last trend column, and amounts carrying the report's currency sign, rounded to whole units.
Before (v1.x):
$ dci query < monthly.json
║ cost │ month │ service_description │ timestamp │ year ║
║ 239927.13841529994 │ 05 │ analytics │ 1.7462e+09 │ 2026 ║
║ 291018.65484701947 │ 06 │ analytics │ 1.7488e+09 │ 2026 ║
║ 345927.05937314965 │ 07 │ analytics │ 1.7514e+09 │ 2026 ║
║ 48875.47185098996 │ 05 │ pipelines │ 1.7462e+09 │ 2026 ║
...12 interleaved rows...
After (v2.0):
$ dci query < monthly.json
║ service_description │ 2026-05 │ 2026-06 │ 2026-07 │ total │ trend ║
║ analytics │ $239,927 │ $291,019 │ $345,927 │ $876,873 │ +44% ║
║ pipelines │ $48,875 │ $70,157 │ $95,806 │ $214,839 │ +96% ║
║ storage │ $83,219 │ $70,721 │ $53,925 │ $207,865 │ -35% ║
║ TOTAL │ $521,554 │ $567,513 │ $638,837 │ $1,727,905 │ +22% ║
In interactive terminals the pivot also shades period cells by magnitude — a heatmap that makes hot spots and movers readable at a glance (NO_COLOR or --heatmap=false disables it). Prefer the old layout? --flat restores flat rows, and --raw-numbers restores exact unformatted values. Hourly reports keep the hour on every row, and ranges with too many periods to scan stay flat unless you pass --pivot. See Running queries for all the result-shaping flags.
Listings you can actually read
Wide listings (anomalies return sixteen columns) used to crush every cell into … stubs and print unset values as a literal <nil>. v2.0 keeps the columns that render readably — identity (id, name) and date columns always survive — and tells you exactly what was hidden and how to get it back (-C, -M wrap, -W). Timestamps everywhere display as 2026-08-10 22:25 instead of epoch numbers or T00:00:00Z noise, budget amounts show their currency ($4,900), and an empty list simply prints No results.
Mistakes fail fast, with help
$ dci list-bugets # v1.x: 258 lines of help, exit code 0
$ dci list-bugets # v2.0:
Error: unknown command "list-bugets" (did you mean "list-budgets"?)
Interactive errors are now a single plain-text line — no more triple-printed messages with a usage dump. Setting an invalid customer context is rejected when you set it, instead of silently breaking every later command with 403s.
Jump to the console
dci open deep-links into the Cloud Intelligence™ console — dci open report <id>, budget, or allocation opens the resource in your browser (agents and pipes get the URL printed instead). dci docs prints every documentation entry point, and CSV export (--output csv) finally exists for spreadsheets.
For AI agents
v2.0 treats agents as first-class users. If you point Claude Code, Cursor, Codex, Gemini, Kiro, or opencode at dci, install the embedded skill with dci skill <agent> — it now ships a FinOps-baseline workflow (spend review → budgets → alerts → allocations) and a question-to-command map.
- Bounded output. An unlimited grouped query could return half a megabyte of rows straight into the context window. Agent mode now caps report results at 500 rows with explicit
rowsOmitted/rowsTotalmarkers;--max-rows 0restores everything. - Terse help.
--helpused to embed complete request/response schemas (query --helpwas ~15 KB). It's now ~2.4 KB, with schemas one flag away via--help-full. - Honest failure semantics. Successful deletes are no longer misreported as retryable upstream errors, client errors are never marked
retryable, and unknown request-body fields fail fast with the valid field list instead of being silently ignored by the API. - No hangs. Without credentials in CI or a sandbox, commands fail immediately with
AUTHENTICATION_REQUIREDand a pointer toDCI_API_KEYinstead of waiting on a browser login. - More context in results. Report results carry an explicit
currencyfield when the query config specifies one, and the pivot'strendcolumn gives agents the derived movement signal without recomputing it.--rows keyedreturns rows as schema-named objects — no more zipping positional arrays. Identical queries return identical row order.
For scripts
Exit codes are now stable and identical in every mode:
| Code | Meaning |
|---|---|
0 | Success |
2 | Usage error (unknown command, flag, or body field) |
10 / 11 | Authentication / permission |
20 / 21 | Not found / conflict |
30 | Validation error or unconfirmed destructive command |
40 / 41 / 50 | Server error / network error / rate limited |
Previously, human and pipe invocations exited 1 for most failures, 4 for 404s — and a mistyped command exited 0. If a brand-new API field is rejected against a stale cached spec, retry with --rsh-no-cache or set DCI_SKIP_BODY_VALIDATION=1. Empty collections now serialize as [] instead of null, and old command names (e.g. id-of-asset) keep working as aliases for their new names (update-asset).
Upgrade
brew upgrade dci # macOS — or winget/scoop/apt/rpm per the install guide
dci upgrade # check your version from any install
dci skill update <agent> # refresh the installed agent skill after upgrading
The full command reference in the sidebar reflects v2.0 names and schemas. For installation, authentication, and the complete flag reference, start at the CLI guide.