5c655ee3c8
* feat(sinafinance): rewrite stock as public API adapter Replace browser-based DOM scraping with direct Sina public APIs: suggest3.sinajs.cn — symbol search (GBK, no auth) hq.sinajs.cn — real-time quote (GBK, no auth) Strategy.PUBLIC, browser: false — no Chrome or login required. Supports A股 (sh/sz), 港股 (hk prefix), 美股 (gb_ prefix). US MarketCap parsed from hq field [12]; formatted as T/B/M. * feat(exit-codes): add Unix-standard exit codes to all CliError types Introduce EXIT_CODES constant table (sysexits.h conventions) and wire exitCode into every CliError subclass so the process exit code reflects the semantic type of failure: 0 success (default) 1 generic / unexpected error 2 argument / usage error (ArgumentError) 66 empty result / not found (EmptyResultError, SelectorError) 69 service unavailable (BrowserConnectError, AdapterLoadError) 77 permission / auth required (AuthRequiredError) 78 configuration error (ConfigError) 124 timeout (TimeoutError) 130 Ctrl-C / SIGINT (unchanged, tui.ts) resolveExitCode() in commanderAdapter.ts reads err.exitCode for typed CliErrors, and falls back to pattern-matching message text for untyped adapter errors (auth pattern → 77, not-found pattern → 66, else → 1). Shell scripts can now distinguish error categories: opencli spotify status || echo "exit $?" # 69 if browser not running opencli github issues --repo x 2>/dev/null; [ $? -eq 77 ] && opencli github auth * review: regex escape sym, fix change precision, optimize suggest type param