Skip to main content

schwab_cli/
env_schema.rs

1use serde_json::{json, Value};
2
3pub fn env_schema_json() -> Value {
4    json!({
5        "precedence": ["CLI flags", "environment variables", "defaults"],
6        "dotenv": {
7            "enabled": true,
8            "behavior": "Loads nearest .env walking up from cwd; values override existing shell exports"
9        },
10        "variables": [
11            {
12                "name": "SCHWAB_APP_KEY",
13                "aliases": ["SCHWAB_CLIENT_ID"],
14                "required": true,
15                "secret": true,
16                "description": "Schwab Developer Portal app key (OAuth client id)"
17            },
18            {
19                "name": "SCHWAB_APP_SECRET",
20                "aliases": ["SCHWAB_CLIENT_SECRET"],
21                "required": true,
22                "secret": true,
23                "description": "Schwab Developer Portal app secret"
24            },
25            {
26                "name": "SCHWAB_REDIRECT_URI",
27                "aliases": [],
28                "required": false,
29                "default": "https://127.0.0.1:8182",
30                "description": "OAuth redirect URI registered with your Schwab app"
31            },
32            {
33                "name": "SCHWAB_TOKEN_DIR",
34                "aliases": [],
35                "required": false,
36                "description": "Override directory for tokens.json"
37            },
38            {
39                "name": "SCHWAB_SAFETY_CONFIG",
40                "aliases": [],
41                "required": false,
42                "description": "Override path to safety.json trading limits (default: platform config dir)"
43            },
44            {
45                "name": "SCHWAB_CONFIG_DIR",
46                "aliases": [],
47                "required": false,
48                "description": "Override schwabinvestbot config directory (disclaimer markers, etc.)"
49            },
50            {
51                "name": "SCHWAB_DISCLAIMER_ACCEPTED",
52                "aliases": [],
53                "required": false,
54                "description": "Set to any non-empty value to skip disclaimer acceptance file check (automation you control)"
55            },
56            {
57                "name": "SCHWAB_MODE",
58                "aliases": [],
59                "required": false,
60                "default": "agent",
61                "enum": ["agent", "human"],
62                "description": "CLI operating mode"
63            },
64            {
65                "name": "SCHWAB_OUTPUT",
66                "aliases": [],
67                "required": false,
68                "default": "pretty",
69                "enum": ["pretty", "json", "md"],
70                "description": "Default output format"
71            },
72            {
73                "name": "NO_COLOR",
74                "aliases": [],
75                "required": false,
76                "description": "Disable ANSI colors in pretty output"
77            },
78            {
79                "name": "OPENROUTER_API_KEY",
80                "aliases": [],
81                "required": false,
82                "secret": true,
83                "description": "OpenRouter API key for LLM-powered agent reviews (when llm.enabled in rules.yaml)"
84            },
85            {
86                "name": "TELEGRAM_BOT_TOKEN",
87                "aliases": [],
88                "required": false,
89                "secret": true,
90                "description": "Telegram bot token from @BotFather (when notify.telegram.enabled in rules.yaml)"
91            },
92            {
93                "name": "TELEGRAM_CHAT_ID",
94                "aliases": [],
95                "required": false,
96                "secret": true,
97                "description": "Telegram chat ID for agent notifications"
98            }
99        ]
100    })
101}