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:
hermes 2026-10-14 08:52:13 +00:00
commit 22b6dabaeb
119 changed files with 920 additions and 1896 deletions

View file

@ -1,41 +1,4 @@
exit: 0
--- stdout
{
"symbol": "BBCA.JK",
"growth": {
"revenue_growth": 0.118,
"earnings_growth": 0.121,
"revenue_growth_pct": 11.8,
"earnings_growth_pct": 12.1,
"revenue_signal": "moderate",
"earnings_signal": "moderate",
"overall_signal": "growing"
},
"valuation": {
"pe_trailing": 25.4,
"pe_forward": 23.1,
"pb": 4.6,
"roe": 0.202,
"roe_pct": 20.2,
"net_margin": 0.385,
"net_margin_pct": 38.5,
"ev_ebitda": 21.28,
"pe_signal": "premium",
"pb_signal": "expensive",
"roe_signal": "excellent",
"margin_signal": "excellent",
"ev_ebitda_signal": "expensive",
"overall_signal": "expensive"
},
"risk": {
"debt_to_equity": 18.5,
"current_ratio": 1.21,
"roa": 0.038,
"roa_pct": 3.8,
"de_signal": "conservative",
"current_ratio_signal": "tight",
"overall_signal": "moderate risk"
},
"overall_signal": "mixed"
}
{"symbol":"BBCA.JK","growth":{"revenue_growth":0.118,"earnings_growth":0.121,"revenue_growth_pct":11.8,"earnings_growth_pct":12.1,"revenue_signal":"moderate","earnings_signal":"moderate","overall_signal":"growing"},"valuation":{"pe_trailing":25.4,"pe_forward":23.1,"pb":4.6,"roe":0.202,"roe_pct":20.2,"net_margin":0.385,"net_margin_pct":38.5,"ev_ebitda":21.28,"pe_signal":"premium","pb_signal":"expensive","roe_signal":"excellent","margin_signal":"excellent","ev_ebitda_signal":"expensive","overall_signal":"expensive"},"risk":{"debt_to_equity":18.5,"current_ratio":1.21,"roa":0.038,"roa_pct":3.8,"de_signal":"conservative","current_ratio_signal":"tight","overall_signal":"moderate risk"},"overall_signal":"mixed"}
--- stderr