--- summary: "CLI refactor plan: JSON-only errors, config validation, SettingsStore split." read_when: - "Refactoring CodexBar CLI error handling or config parsing." - "Splitting SettingsStore into smaller files." - "Adding config validation or CLI config commands." --- # CLI Refactor Plan ## Goals - JSON-only: every error is valid JSON on stdout (no mixed stderr). - Per-provider errors: provider failures yield provider-scoped error payloads. - Config validation: warn on invalid fields, unsupported source modes, bad regions. - Config parity: add CLI command to validate (and optionally dump) config. - SettingsStore split: files <500 LOC; clear separation (defaults vs config). ## Constraints (keep) - Provider ordering stays driven by config `providers[]` order. - Provider enable/disable stays in config (`enabled`). - No Keychain persistence for provider secrets. - CLI still supports text output for non-JSON use. ## Error JSON shape - JSON output remains an array for `usage` and `cost` commands. - Errors appear as payload entries with `error` set. - Global/CLI errors use `provider: "cli"` and `source: "cli"`. ```json { "provider": "cli", "source": "cli", "error": { "code": 1, "message": "...", "kind": "config" } } ``` ## Config validation rules - `source` must be in provider descriptor `fetchPlan.sourceModes`. - `apiKey` only valid when provider supports `.api`. - `cookieSource` only valid when provider supports `.web`/`.auto`. - `region` only for `zai` or `minimax` with known values. - `workspaceID` only for `opencode`. - `tokenAccounts` only for providers in `TokenAccountSupportCatalog`. ## CLI commands - `codexbar config validate` - Prints JSON issues (or text summary). - Exit non-zero if any errors. - (Optional) `codexbar config dump` - Prints normalized config JSON. ## Step-by-step implementation guide 1. **Add validation types** - `CodexBarConfigIssue` + `CodexBarConfigValidator` in `CodexBarCore/Config`. - Keep file <500 LOC. 2. **Hook validation into CLI** - New `config validate` command. - `--json-only` emits JSON array of issues. 3. **Unify CLI error reporting** - Parse `--json-only` early. - Route all exits through a JSON-aware reporter. - Use provider-scoped errors where possible. 4. **Split CLIEntry.swift** - Extract helpers + payload structs into dedicated files (<500 LOC each). 5. **Split SettingsStore.swift** - Move config-backed computed properties to `SettingsStore+Config.swift`. - Move defaults-backed computed properties to `SettingsStore+Defaults.swift`. - Move provider detection to `SettingsStore+ProviderDetection.swift`. 6. **Provider toggles cleanup** - Remove unused `ProviderToggleStore` + tests; keep migrator path for legacy toggles. 7. **Tests** - CLI json-only error payloads (invalid source, invalid provider selection). - Config validation (bad region/source/apiKey field). - SettingsStore order/toggle invariants still pass. 8. **Verification** - `make test`, `swiftformat Sources Tests`, `swiftlint --strict`, `make check`. - `./Scripts/compile_and_run.sh`. - CLI e2e: `codexbar --json-only ...`, `codexbar config validate`.