feat(canopy-cli): catch up to ADR-007 — add household / income / asset / interview / determine subcommands
Context
ADR-007 mandates "every API operation must be available through the CLI" with a Decision section that enumerates the expected surface (lines 41-71 of adrs/adr-007-cli-api-ui-parity.adoc). tools/canopy-cli/src/main.rs:31-83 exposes 8 commands today: login, token, completion, person, rules, application, eligibility, security.
Missing per ADR-007's own Decision section:
-
household(create / get / add-member) -
add-income/add-asset/add-expense/add-address(orpersonsubcommands for these) -
waive-interview/complete-interview -
snap evaluate/tanf evaluate/medicaid evaluate/caps evaluate/wic evaluate -
enrollment(list / get) -
renewal(list / get) -
notice(list / get / download) -
appeal(file / list / get) -
report(generate / list)
Roughly 60% of the mandated CLI surface is absent despite the underlying APIs existing (162 utoipa-decorated handlers across services).
The 11 services published OpenAPI specs in MR !208 (merged) / !209 (merged) — the CLI catch-up has its specs to mirror against.
Acceptance criteria
- CLI subcommands above implemented as thin reqwest wrappers (no direct DB access per ADR-007)
- Each subcommand bears a
#[derive(clap::Parser)]arg struct with required / optional flags matching the API -
canopy-cliintegration tests cover at least the happy-path call for each new command (mirror existingtools/canopy-cli/tests/cli_test.rsshape) - CHANGELOG entry under
Added - CLI reference doc at
docs/modules/ROOT/pages/cli.adocupdated
Why filed now
Multi-agent plan-vs-code audit (2026-05-05) flagged ADR-007 as the single largest "ADR drift" gap. Without this, the ADR is partially-aspirational.