mirror of
https://github.com/0xrsydn/idx-cli.git
synced 2026-11-07 01:35:36 +00:00
feat(cli): agent-native output, stdin symbols, and exit-code classes
Phase 1 of docs/DESIGN.md: - Output format resolves -o > IDX_OUTPUT > general.output > auto; auto is a table on a terminal and JSON when stdout is piped or captured. `config init` now writes output = "auto". - JSON is pretty only on a terminal and compact otherwise. New `-o jsonl` prints one array item per line with the same key order. - No ANSI color when stdout is not a terminal (direct owo-colors calls now go through output::style). - `stocks quote -` and `stocks compare -` read symbols from stdin. - Exit codes by class: 2 invalid input/config, 3 not found or cache miss, 4 upstream unavailable, 5 unsupported, 1 other. Golden changes are limited to those documented kinds and were verified mechanically: JSON goldens are semantically identical, tables differ only by removed ANSI codes and the column padding comfy-table had reserved for them (cell contents identical), exit codes match each error's class, and help/completions only gain the new --output values. 17 new golden cases cover auto, jsonl, stdin, and the new errors. tests/cli.rs now pins IDX_OUTPUT=table in its harness (its tests assert table text and run piped) and parses discover JSON instead of matching pretty-printed whitespace. Live A/B against main: 16/16 stocks cases identical; ownership discover got IDX 403 on both binaries, now exiting 4 instead of 1 as intended. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
fe627496dd
commit
22b6dabaeb
119 changed files with 920 additions and 1896 deletions
|
|
@ -144,11 +144,21 @@ CLI flags > environment variables > config file > defaults
|
|||
## Error Strategy
|
||||
- `IdxError` enum (thiserror) with structured error codes
|
||||
- Table mode: human-readable error on stderr
|
||||
- JSON mode: `{"error": true, "code": "...", "message": "..."}`
|
||||
- Exit code 0 on success, non-zero on failure
|
||||
- JSON and JSONL modes: `{"error": true, "code": "...", "message": "..."}` on stderr, stdout empty
|
||||
- Exit codes by class: `0` success, `2` `INVALIDINPUT`/`CONFIGERROR` and clap usage
|
||||
errors, `3` `SYMBOLNOTFOUND`/`NOMARKETDATA`/`CACHEMISS`, `4` `HTTP`/`RATELIMITED`/
|
||||
`PROVIDERUNAVAILABLE`/`OFFLINE`/`AUTHERROR`, `5` `UNSUPPORTED`, `1` everything else
|
||||
- A totally failed `stocks compare` emits one structured error in JSON mode; per-symbol warnings are retained for partial success, not printed ahead of a total-failure error.
|
||||
|
||||
## CLI Output and Offline Cache
|
||||
- Output format resolves as `-o` flag > `IDX_OUTPUT` > `general.output` > `auto`.
|
||||
`auto` is a table when stdout is a terminal and JSON otherwise
|
||||
(`std::io::IsTerminal`).
|
||||
- JSON is pretty-printed only on a terminal; piped output is compact. `jsonl`
|
||||
prints each array item on its own line with the same key order as `json`,
|
||||
and a single object as one line.
|
||||
- ANSI styling goes through `output::style` and is disabled when stdout is not a
|
||||
terminal or color is turned off.
|
||||
- `version`, `cache info`, `cache clear`, and `ownership resolve map|merge` emit
|
||||
JSON objects when JSON output is selected.
|
||||
- `stocks quote` and `stocks compare` require at least one symbol.
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# System Design: idx-core and its frontends
|
||||
|
||||
**Status:** Accepted 2026-10-14. Implementation on `refactor/idx-core`; nothing implemented yet.
|
||||
**Status:** Accepted 2026-10-14. Implementation on `refactor/idx-core`; phases 0-1 done.
|
||||
|
||||
## Goal
|
||||
|
||||
|
|
@ -164,8 +164,8 @@ is another 20-30% smaller than pretty JSON.
|
|||
Already true.
|
||||
- No ANSI color when stdout is not a terminal. Today some table headers emit
|
||||
bold codes even when piped.
|
||||
- Commands that take symbols accept `-` to read them from stdin, one per line or
|
||||
whitespace-separated:
|
||||
- `stocks quote` and `stocks compare` accept `-` to read symbols from stdin,
|
||||
separated by whitespace or commas:
|
||||
`idx stocks screen --filter low-pe | jq -r '.[].symbol' | idx stocks compare -`
|
||||
- Exit codes by error class (today every error exits `1`):
|
||||
|
||||
|
|
@ -175,7 +175,7 @@ is another 20-30% smaller than pretty JSON.
|
|||
| 1 | other failure | `IO`, `DATABASEERROR`, `PARSEERROR`, ... |
|
||||
| 2 | invalid usage or input | clap errors, `INVALIDINPUT`, `CONFIGERROR` |
|
||||
| 3 | not found or no data | `SYMBOLNOTFOUND`, `NOMARKETDATA`, `CACHEMISS` |
|
||||
| 4 | upstream unavailable, retry later | `HTTP`, `RATELIMITED`, `PROVIDERUNAVAILABLE`, `OFFLINE` |
|
||||
| 4 | upstream unavailable, retry later | `HTTP`, `RATELIMITED`, `PROVIDERUNAVAILABLE`, `OFFLINE`, `AUTHERROR` |
|
||||
| 5 | unsupported | `UNSUPPORTED` |
|
||||
|
||||
- JSON keeps today's top-level shape: no `{data, meta}` wrapper, so `jq` paths
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue