Skip to content

v1.5.4 — Governance

Choose a tag to compare

@greenarmor greenarmor released this 20 Jun 21:57
· 17 commits to master since this release

Release v1.5.4 — Governance Subcommand Next-Action Menus

Patch release. ges governance list, show, and verify now show an interactive "next action" menu after their output instead of dropping users back to the shell with no guidance. No breaking changes.

Previous release: v1.5.3
Release date: 2026-06-20


Highlights

Read-Only Subcommands No Longer Leave You Stuck

In v1.5.3, parent commands (ges governance, ges policy, etc.) gained interactive guided menus. But the read-only subcommands list, show <id>, and verify <id> still printed their output and exited — leaving users with no clue what to do next.

Now they show a context-aware "What would you like to do next?" menu:

$ ges governance list

  Governance Records (1)

  ○ DRAFT My System
     ID     gov-1781991485573-1
     Type   ai-system  |  Risk HIGH
     By     NOT RECORDED
     Ev     0 reference(s)

  ────────────────────────────────────────────────────

  What would you like to do next?

? Choose your next action:
❯ Show a record's full provenance chain — all dimensions in detail
  Verify a record's completeness — check all 8 dimensions
  Create a new governance record — start a new approval chain
  Exit — return to terminal

Context-Aware Choices

The menu adapts to what you just did:

Command Menu Options
ges governance list Show a record / Verify a record / Create new / Exit
ges governance show <id> Verify THIS record / Approve / Evidence / Risk / Policy / Create new / Exit
ges governance verify <id> Same as show (single-record scope)

When list shows multiple records, selecting "Show a record" or "Verify a record" opens a record picker. When only one record exists, it is auto-selected.

Selected actions dispatch via execSync(cmd, { stdio: "inherit" }), reusing the proven next-steps.ts pattern — so the target subcommand's own .action() runs in full.

CI/CD Safe — No Hangs in Non-TTY Mode

The menu is gated behind process.stdin.isTTY && process.stdout.isTTY. In non-interactive contexts (pipes, scripts, CI):

  • Output prints normally
  • No menu is shown
  • Process exits cleanly with code 0
$ echo "" | ges governance list     # exits 0, no hang
$ ges governance list | jq ...      # exits 0, no hang

Changes

packages/cli/src/commands/governance.ts

  • Added showGovernanceNextAction(root, records, lastShownId?) helper — renders a context-aware select() menu after read-only subcommands. Dispatches chosen action via execSync.
  • Updated list action (line 422) — calls showGovernanceNextAction(root, records) after printing records. Also handles empty-state (calls the helper, which still offers "Create new record").
  • Updated show action (line 564) — calls showGovernanceNextAction(root, [record], record.id) after printing the full provenance chain.
  • Updated verify action (line 619) — calls showGovernanceNextAction(root, [record], record.id) after printing the verification report.

Verification

Check Result
All 16 packages build clean
Full test suite ✓ 483/483 passing
ges governance list (TTY) — menu renders ✓ via expect PTY
ges governance show <id> (TTY) — menu renders ✓ via expect PTY
ges governance verify <id> (TTY) — menu renders ✓ via expect PTY
list / show / verify (non-TTY) — exits 0, no hang ✓ via piped stdin
Menu dispatch works (selecting "Verify" runs ges governance verify <id>)
Context-aware choices (single-record scope after show/verify)

Upgrade Notes

No breaking changes. No configuration changes. Existing scripts and CI pipelines continue to work unchanged — non-TTY behavior is identical to v1.5.3.

Install / upgrade:

npm install -g @greenarmor/ges@1.5.4
# or
npx @greenarmor/ges@1.5.4 governance list

Full changelog: v1.5.3...v1.5.4