feat(cli): compact table projection for audit-config query (register row 57)

The command passed no `tableProjector`, so `--format table` handed the renderer
an `AuditLogQueryResult` OBJECT. That takes the generic Property/Value branch,
which printed the entire `entries` array as raw JSON inside a single cell. JSON
output was and remains correct, and is the primary format for this command.

Adds `AuditConfigTableProjection`, mirroring `TemplateTableProjection`:
string->string over the raw body, applied only on the table path, returning the
input verbatim when it is not JSON or not a recognised shape so the renderer's
own fallbacks still apply. It unwraps the envelope to a row array — id,
timestamp, user, action, entityType, entityName, entityId — and drops
`afterStateJson`, the full post-change entity snapshot, which is the audit
analogue of template's fat child arrays: one per row fills a terminal.
`bundleImportId` is dropped as mostly-null noise.

`totalCount` would be lost by a plain unwrap, so a truncated page gains a single
trailing row with a `note` cell ("showing 50 of 137 — use --page / --page-size
for the rest"). When the page IS the whole result set the column is not emitted
at all, so a small query's table stays exactly as narrow as its data, and the
note row carries no `id` so it cannot be mistaken for an entry.

A `--detail` flag skips the projection and renders the raw payload, matching
`template list` / `template get` — that plus `--format json` is how to reach
`afterStateJson`. A bare array root is also accepted, so the projection does not
regress if the payload is ever unwrapped upstream or the deprecated `audit-log`
alias meets an older server.

Tests build their fixtures by serialising the REAL AuditLogQueryResult /
AuditLogEntry types, so renaming a server property fails the test instead of
silently blanking a column. CLI README + Component-CLI.md document the table
shape, the omitted fields, and --detail.
This commit is contained in:
Joseph Doherty
2026-08-15 13:22:41 -04:00
parent be29bf471e
commit b2cab59cb9
5 changed files with 377 additions and 3 deletions
+20 -1
View File
@@ -1801,6 +1801,7 @@ scadabridge --url <url> audit-config query [options]
| `--to` | no | — | End timestamp in ISO 8601 format |
| `--page` | no | `1` | Page number |
| `--page-size` | no | `50` | Results per page |
| `--detail` | no | `false` | Table output only: render the raw payload instead of the compact column projection (see below). No effect on JSON output. |
Output shape:
@@ -1822,7 +1823,25 @@ Output shape:
```
`totalCount` is the unpaged number of rows matching the filters, so a client can page
without a second call.
without a second call. JSON is the primary format for this command and is what scripts
should consume — it is never altered by the table projection below.
**Table output.** `--format table` renders a compact projection with one row per entry:
```
id timestamp user action entityType entityName entityId
412 2026-08-15T12:00:00+00:00 multi-role Created Template PumpTemplate 7
413 2026-08-15T12:05:00+00:00 designer Deleted ExternalSystem MES 3
```
`afterStateJson` (the full post-change entity snapshot) and `bundleImportId` are omitted
— one snapshot per row fills a terminal. Pass `--detail` to render the raw payload
instead, or use `--format json`. When the page is a strict subset of the matches, a final
row carries a `note` cell (`showing 50 of 137 — use --page / --page-size for the rest`);
when the page is the whole result set that column is not emitted at all.
Before this projection existed the whole `entries` array was printed as raw JSON inside a
single `Property`/`Value` cell (deferred-work register row 57).
---