# TODO Next steps for firefly-cli. Each new command group follows the expandability rule in CLAUDE.md (module + decorator, import line, unit test, SKILL.md, regen bash completion). ## Command groups (deferred, roughly by demand) - [x] `budget` — list/create/delete/enable/disable, limit-list/limit-set, and `tx add --budget`. Shipped v0.4.0 (review follow-ups v0.4.1). - [ ] `bill` — list and inspect bills. - [ ] `piggy` — piggy banks. - [ ] `rule` — rules and rule groups. - [ ] `recurring` — recurring transactions. - [ ] `attachment` — list/download transaction attachments. - [ ] `report` — summary reports (income/expense by period). - [ ] `currency` — list/manage currencies. ## Verbs on existing groups - [ ] `account delete` — currently needs a manual curl DELETE. - [ ] `tx update` / `tx delete`. - [x] `tx edit --budget` — mirrors `tx add --budget`. Shipped v0.5.0. - [x] `budget update` — rename + auto-budget fields via PUT /budgets/{id}. Shipped v0.5.0. - [ ] `tx add --budget-id` — `--budget` resolves a name-or-id but sniffs all-digit refs as ids, so a budget literally named "7" is unreachable by name (see the ponytail note in `resolver.py`). Add an explicit `--budget-id`, mirroring `--from-id`/`--to-id`, if this ever bites. ## Output / UX - [ ] `--human` column whitelists live in `output.py` `_VIEWS`; extend as new resource shapes are added (budget, bill, ...). - [ ] Consider a `--no-color` flag (color is currently TTY-auto only). ## Infrastructure - [ ] n-level command nesting. `cli.py` `_build_parser` and `scripts/gen_completion.py` both `partition(" ")` on the command name, so they only nest two levels (group + leaf). `budget limit-set` / `budget limit-list` are flattened to a hyphenated 2-token leaf as a workaround (v0.4.0). Refactor both to split the full name into tokens and build/scan nested subparsers per token, then a genuine `budget limit set` (three tokens) works and future groups needing sub-subcommands are a non-issue. Add a CLI-dispatch test (parse_args on the real parser), since the mocked unit suite calls handlers directly and cannot catch a dispatch/nesting break. - [ ] `--raw` escape hatch for arbitrary API calls. - [ ] OAuth as an alternative to personal access tokens. - [ ] zsh / fish completion (bash done). ## UI/UX - [x] completion suggests values for `--type` (account: asset/expense/revenue /liability, tx: withdrawal/deposit/transfer), keyed per command. Static enum, no API call. See `FLAG_VALUES` in `scripts/gen_completion.py`.