@golba98/codexa 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/README.md +320 -0
  2. package/bin/codexa.js +445 -0
  3. package/package.json +45 -0
  4. package/scripts/audit-codexa-capabilities.mjs +466 -0
  5. package/scripts/smoke-terminal-bench.mjs +35 -0
  6. package/src/app.tsx +4561 -0
  7. package/src/appRenderStability.test.ts +131 -0
  8. package/src/commands/handler.test.ts +643 -0
  9. package/src/commands/handler.ts +875 -0
  10. package/src/config/launchArgs.test.ts +158 -0
  11. package/src/config/launchArgs.ts +186 -0
  12. package/src/config/layeredConfig.test.ts +143 -0
  13. package/src/config/layeredConfig.ts +836 -0
  14. package/src/config/persistence.test.ts +110 -0
  15. package/src/config/persistence.ts +311 -0
  16. package/src/config/runtimeConfig.test.ts +218 -0
  17. package/src/config/runtimeConfig.ts +554 -0
  18. package/src/config/settings.test.ts +155 -0
  19. package/src/config/settings.ts +401 -0
  20. package/src/config/toml-serialize.ts +98 -0
  21. package/src/config/trustStore.test.ts +29 -0
  22. package/src/config/trustStore.ts +68 -0
  23. package/src/core/attachments.test.ts +155 -0
  24. package/src/core/attachments.ts +71 -0
  25. package/src/core/auth/codexAuth.test.ts +68 -0
  26. package/src/core/auth/codexAuth.ts +359 -0
  27. package/src/core/cleanupFastFail.test.ts +76 -0
  28. package/src/core/cleanupFastFail.ts +67 -0
  29. package/src/core/clipboard.ts +24 -0
  30. package/src/core/codex.ts +124 -0
  31. package/src/core/codexExecArgs.test.ts +195 -0
  32. package/src/core/codexExecArgs.ts +152 -0
  33. package/src/core/codexLaunch.test.ts +205 -0
  34. package/src/core/codexLaunch.ts +162 -0
  35. package/src/core/codexPrompt.test.ts +252 -0
  36. package/src/core/codexPrompt.ts +428 -0
  37. package/src/core/executables/claudeExecutable.ts +63 -0
  38. package/src/core/executables/codexExecutable.test.ts +212 -0
  39. package/src/core/executables/codexExecutable.ts +159 -0
  40. package/src/core/executables/executableResolver.test.ts +129 -0
  41. package/src/core/executables/executableResolver.ts +138 -0
  42. package/src/core/executables/geminiExecutable.test.ts +116 -0
  43. package/src/core/executables/geminiExecutable.ts +78 -0
  44. package/src/core/executables/pathSanityScan.test.ts +47 -0
  45. package/src/core/githubDiagnostics.test.ts +92 -0
  46. package/src/core/githubDiagnostics.ts +222 -0
  47. package/src/core/hollowResponseFormat.test.ts +58 -0
  48. package/src/core/hollowResponseFormat.ts +39 -0
  49. package/src/core/inputDebug.ts +51 -0
  50. package/src/core/launchContext.test.ts +157 -0
  51. package/src/core/launchContext.ts +266 -0
  52. package/src/core/models/codexCapabilities.test.ts +45 -0
  53. package/src/core/models/codexCapabilities.ts +95 -0
  54. package/src/core/models/codexModelCapabilities.test.ts +246 -0
  55. package/src/core/models/codexModelCapabilities.ts +571 -0
  56. package/src/core/models/modelSpecs.test.ts +283 -0
  57. package/src/core/models/modelSpecs.ts +300 -0
  58. package/src/core/perf/profiler.ts +125 -0
  59. package/src/core/perf/renderDebug.test.ts +230 -0
  60. package/src/core/perf/renderDebug.ts +373 -0
  61. package/src/core/planStorage.test.ts +143 -0
  62. package/src/core/planStorage.ts +141 -0
  63. package/src/core/process/CommandRunner.test.ts +105 -0
  64. package/src/core/process/CommandRunner.ts +269 -0
  65. package/src/core/process/processValidation.ts +101 -0
  66. package/src/core/projectInstructions.test.ts +50 -0
  67. package/src/core/projectInstructions.ts +54 -0
  68. package/src/core/providerLauncher/launcher.test.ts +238 -0
  69. package/src/core/providerLauncher/launcher.ts +203 -0
  70. package/src/core/providerLauncher/registry.test.ts +324 -0
  71. package/src/core/providerLauncher/registry.ts +253 -0
  72. package/src/core/providerLauncher/types.ts +84 -0
  73. package/src/core/providerLauncher/workspaceConfig.test.ts +638 -0
  74. package/src/core/providerLauncher/workspaceConfig.ts +407 -0
  75. package/src/core/providerRuntime/anthropic.test.ts +1120 -0
  76. package/src/core/providerRuntime/anthropic.ts +576 -0
  77. package/src/core/providerRuntime/capabilityProfile.test.ts +311 -0
  78. package/src/core/providerRuntime/capabilityProfile.ts +288 -0
  79. package/src/core/providerRuntime/claudeCodeDiscovery.ts +446 -0
  80. package/src/core/providerRuntime/contextMetadata.test.ts +468 -0
  81. package/src/core/providerRuntime/contextMetadata.ts +409 -0
  82. package/src/core/providerRuntime/gemini.test.ts +437 -0
  83. package/src/core/providerRuntime/gemini.ts +784 -0
  84. package/src/core/providerRuntime/lmstudio.test.ts +168 -0
  85. package/src/core/providerRuntime/lmstudio.ts +118 -0
  86. package/src/core/providerRuntime/local.test.ts +787 -0
  87. package/src/core/providerRuntime/local.ts +754 -0
  88. package/src/core/providerRuntime/models.ts +150 -0
  89. package/src/core/providerRuntime/reasoning.ts +17 -0
  90. package/src/core/providerRuntime/registry.test.ts +233 -0
  91. package/src/core/providerRuntime/registry.ts +203 -0
  92. package/src/core/providerRuntime/types.ts +103 -0
  93. package/src/core/providers/codexJsonStream.test.ts +148 -0
  94. package/src/core/providers/codexJsonStream.ts +305 -0
  95. package/src/core/providers/codexSubprocess.test.ts +68 -0
  96. package/src/core/providers/codexSubprocess.ts +372 -0
  97. package/src/core/providers/codexTranscript.test.ts +284 -0
  98. package/src/core/providers/codexTranscript.ts +695 -0
  99. package/src/core/providers/openaiNative.ts +13 -0
  100. package/src/core/providers/registry.ts +21 -0
  101. package/src/core/providers/types.ts +59 -0
  102. package/src/core/terminal/terminalCapabilities.test.ts +93 -0
  103. package/src/core/terminal/terminalCapabilities.ts +100 -0
  104. package/src/core/terminal/terminalControl.test.ts +75 -0
  105. package/src/core/terminal/terminalControl.ts +147 -0
  106. package/src/core/terminal/terminalSanitize.test.ts +22 -0
  107. package/src/core/terminal/terminalSanitize.ts +147 -0
  108. package/src/core/terminal/terminalSelection.test.ts +42 -0
  109. package/src/core/terminal/terminalSelection.ts +66 -0
  110. package/src/core/terminal/terminalTitle.test.ts +328 -0
  111. package/src/core/terminal/terminalTitle.ts +483 -0
  112. package/src/core/workspaceActivity.test.ts +163 -0
  113. package/src/core/workspaceActivity.ts +380 -0
  114. package/src/core/workspaceGuard.test.ts +151 -0
  115. package/src/core/workspaceGuard.ts +288 -0
  116. package/src/core/workspaceRoot.test.ts +23 -0
  117. package/src/core/workspaceRoot.ts +47 -0
  118. package/src/exec.test.ts +13 -0
  119. package/src/exec.ts +72 -0
  120. package/src/headless/execArgs.test.ts +147 -0
  121. package/src/headless/execArgs.ts +294 -0
  122. package/src/headless/execRunner.test.ts +434 -0
  123. package/src/headless/execRunner.ts +304 -0
  124. package/src/index.test.tsx +618 -0
  125. package/src/index.tsx +296 -0
  126. package/src/session/appSession.test.ts +897 -0
  127. package/src/session/appSession.ts +761 -0
  128. package/src/session/chatLifecycle.test.ts +64 -0
  129. package/src/session/chatLifecycle.ts +951 -0
  130. package/src/session/liveRenderScheduler.test.ts +201 -0
  131. package/src/session/liveRenderScheduler.ts +214 -0
  132. package/src/session/planFlow.test.ts +103 -0
  133. package/src/session/planFlow.ts +149 -0
  134. package/src/session/planTranscript.test.ts +65 -0
  135. package/src/session/planTranscript.ts +15 -0
  136. package/src/session/promptRunSchedule.test.ts +36 -0
  137. package/src/session/promptRunSchedule.ts +26 -0
  138. package/src/session/types.ts +228 -0
  139. package/src/test/runtimeTestUtils.ts +14 -0
  140. package/src/types/react-dom.d.ts +3 -0
  141. package/src/ui/ActionRequiredBlock.tsx +38 -0
  142. package/src/ui/ActivityBars.tsx +68 -0
  143. package/src/ui/ActivityIndicator.test.tsx +58 -0
  144. package/src/ui/ActivityIndicator.tsx +58 -0
  145. package/src/ui/AgentBlock.test.ts +6 -0
  146. package/src/ui/AgentBlock.tsx +130 -0
  147. package/src/ui/AnimatedStatusText.test.ts +16 -0
  148. package/src/ui/AnimatedStatusText.tsx +69 -0
  149. package/src/ui/AppShell.test.tsx +1739 -0
  150. package/src/ui/AppShell.tsx +698 -0
  151. package/src/ui/AttachmentImportPanel.test.tsx +204 -0
  152. package/src/ui/AttachmentImportPanel.tsx +98 -0
  153. package/src/ui/AuthPanel.tsx +113 -0
  154. package/src/ui/BackendPicker.tsx +28 -0
  155. package/src/ui/BottomComposer.test.ts +674 -0
  156. package/src/ui/BottomComposer.tsx +1028 -0
  157. package/src/ui/CodexLogo.tsx +55 -0
  158. package/src/ui/DashCard.tsx +82 -0
  159. package/src/ui/Markdown.test.ts +157 -0
  160. package/src/ui/Markdown.tsx +310 -0
  161. package/src/ui/ModePicker.tsx +27 -0
  162. package/src/ui/ModelPicker.tsx +31 -0
  163. package/src/ui/ModelPickerProviderScope.test.tsx +411 -0
  164. package/src/ui/ModelPickerScreen.test.tsx +99 -0
  165. package/src/ui/ModelPickerScreen.tsx +416 -0
  166. package/src/ui/ModelPickerState.test.tsx +151 -0
  167. package/src/ui/ModelReasoningPicker.test.tsx +447 -0
  168. package/src/ui/ModelReasoningPicker.tsx +458 -0
  169. package/src/ui/Panel.tsx +51 -0
  170. package/src/ui/PermissionsPanel.tsx +78 -0
  171. package/src/ui/PlanActionPicker.tsx +119 -0
  172. package/src/ui/PlanReviewPanel.test.tsx +267 -0
  173. package/src/ui/PlanReviewPanel.tsx +212 -0
  174. package/src/ui/PromptCardBorder.test.tsx +161 -0
  175. package/src/ui/ProviderPicker.test.tsx +289 -0
  176. package/src/ui/ProviderPicker.tsx +321 -0
  177. package/src/ui/ProviderShortcut.test.tsx +143 -0
  178. package/src/ui/ReasoningPicker.tsx +46 -0
  179. package/src/ui/RunFooter.tsx +65 -0
  180. package/src/ui/SelectionPanel.tsx +67 -0
  181. package/src/ui/SettingsPanel.test.tsx +233 -0
  182. package/src/ui/SettingsPanel.tsx +156 -0
  183. package/src/ui/Spinner.tsx +25 -0
  184. package/src/ui/StaticIntroItem.tsx +54 -0
  185. package/src/ui/StaticTranscriptItem.tsx +56 -0
  186. package/src/ui/TextEntryPanel.tsx +139 -0
  187. package/src/ui/ThemePicker.tsx +31 -0
  188. package/src/ui/ThinkingBlock.tsx +100 -0
  189. package/src/ui/Timeline.test.ts +2067 -0
  190. package/src/ui/Timeline.tsx +1472 -0
  191. package/src/ui/TimelineNavigation.test.tsx +201 -0
  192. package/src/ui/TopHeader.test.tsx +239 -0
  193. package/src/ui/TopHeader.tsx +257 -0
  194. package/src/ui/TurnGroup.test.tsx +365 -0
  195. package/src/ui/TurnGroup.tsx +657 -0
  196. package/src/ui/busyStatusAnimation.test.ts +30 -0
  197. package/src/ui/busyStatusAnimation.ts +11 -0
  198. package/src/ui/commandNormalize.test.ts +142 -0
  199. package/src/ui/commandNormalize.ts +66 -0
  200. package/src/ui/diffRenderer.test.ts +102 -0
  201. package/src/ui/diffRenderer.ts +116 -0
  202. package/src/ui/focus.ts +61 -0
  203. package/src/ui/focusFlow.test.tsx +1098 -0
  204. package/src/ui/inputBuffer.test.ts +151 -0
  205. package/src/ui/inputBuffer.ts +203 -0
  206. package/src/ui/layout.test.ts +145 -0
  207. package/src/ui/layout.ts +287 -0
  208. package/src/ui/modeDisplay.test.ts +42 -0
  209. package/src/ui/modeDisplay.ts +52 -0
  210. package/src/ui/outputPipeline.ts +64 -0
  211. package/src/ui/progressEntries.ts +156 -0
  212. package/src/ui/runActivityView.test.ts +89 -0
  213. package/src/ui/runActivityView.ts +37 -0
  214. package/src/ui/runLifecycleView.test.tsx +237 -0
  215. package/src/ui/slashCommands.ts +41 -0
  216. package/src/ui/statusRenderIsolation.test.tsx +654 -0
  217. package/src/ui/terminalAnswerFormat.test.ts +19 -0
  218. package/src/ui/terminalAnswerFormat.ts +128 -0
  219. package/src/ui/textLayout.test.ts +18 -0
  220. package/src/ui/textLayout.ts +338 -0
  221. package/src/ui/theme.tsx +395 -0
  222. package/src/ui/themeFlow.test.ts +53 -0
  223. package/src/ui/themeFlow.ts +41 -0
  224. package/src/ui/timelineMeasure.ts +3088 -0
  225. package/src/ui/timelineMeasureCache.test.ts +986 -0
  226. package/src/ui/useThrottledValue.ts +31 -0
package/README.md ADDED
@@ -0,0 +1,320 @@
1
+ # Codexa
2
+
3
+ A terminal UI (TUI) wrapper around the `codex` CLI. Built with TypeScript, Bun, and Ink (React for terminal rendering). Codexa gives `codex` a richer interactive shell with scrollable conversation history, workspace locking, layered TOML config, themes, and in-app slash commands.
4
+
5
+ ## Prerequisites
6
+
7
+ - **Bun** — required to run locally from source
8
+ - **codex CLI** — the underlying agent that Codexa wraps. Must be available on `PATH` or pointed to via `CODEX_EXECUTABLE`
9
+
10
+ ## Installation
11
+
12
+ **Local source install:**
13
+
14
+ ```powershell
15
+ bun install
16
+ npm link
17
+ ```
18
+
19
+ Then run `codexa` from the workspace directory you want to use.
20
+
21
+ ## Usage
22
+
23
+ ### Interactive mode
24
+
25
+ Launch from the directory you want to use as the workspace:
26
+
27
+ ```powershell
28
+ cd "<path-to-your-workspace>"
29
+ codexa
30
+ ```
31
+
32
+ The session is locked to the directory Codexa was launched from.
33
+
34
+ ### CLI flags
35
+
36
+ | Flag | Short | Description |
37
+ |------|-------|-------------|
38
+ | `--help` | `-h` | Show help |
39
+ | `--version` | `-v` | Show version |
40
+ | `--profile <name>` | | Load a named config profile |
41
+ | `--config <key=value>` | `-c` | Runtime config override (repeatable) |
42
+ | `--model <name>` | `-m` | Override the active model |
43
+
44
+ Non-flag arguments are sent as an initial prompt on startup:
45
+
46
+ ```powershell
47
+ codexa "explain this codebase"
48
+ codexa --profile review --model gpt-5.4 "review src/app.tsx"
49
+ ```
50
+
51
+ ### Exec mode (headless)
52
+
53
+ Run a single prompt non-interactively and exit:
54
+
55
+ ```powershell
56
+ codexa exec "refactor src/utils.ts to use async/await"
57
+ codexa exec --model gpt-5.4-mini --reasoning low "summarize changes in HEAD"
58
+ codexa exec --timing "run the test suite and fix failures"
59
+ ```
60
+
61
+ Exec-specific flags:
62
+
63
+ | Flag | Description |
64
+ |------|-------------|
65
+ | `--prompt <text>` | Prompt text (alternative to positional arg) |
66
+ | `--model <name>` | Override model |
67
+ | `--reasoning <level>` | Set reasoning level |
68
+ | `--profile <name>` | Load config profile |
69
+ | `-c <key=value>` | Runtime config override |
70
+ | `--timing` / `--benchmark-diagnostics` | Print performance timing to stderr |
71
+ | `--codexa-prompt-policy <raw\|wrapped>` | Prompt formatting (default: raw) |
72
+
73
+ ## Execution Modes
74
+
75
+ Set via `/mode` or `[codexa].mode` in `config.toml`:
76
+
77
+ | Mode | Key | Behavior |
78
+ |------|-----|----------|
79
+ | Read-only | `suggest` | No file writes |
80
+ | Auto | `auto-edit` | Automatic file editing |
81
+ | Full Access | `full-auto` | Strongest autonomy (default) |
82
+
83
+ Mode aliases for `/mode`: `ask` → `suggest`, `add` / `auto` → `auto-edit`, `plan` / `default` → `full-auto`
84
+
85
+ ## Reasoning
86
+
87
+ Set via `/reasoning` or `model_reasoning_effort` in `config.toml`:
88
+
89
+ `none` · `minimal` · `low` · `medium` · `high` (default) · `xhigh` · `max`
90
+
91
+ ## Slash Commands
92
+
93
+ Type `/` in the composer to access in-app commands. Key commands:
94
+
95
+ | Command | Description |
96
+ |---------|-------------|
97
+ | `/help` | Show full command reference |
98
+ | `/clear` | Clear conversation and cancel active run |
99
+ | `/exit` · `/quit` | Exit the app |
100
+ | `/model [name]` · `/models` | Switch model or open picker |
101
+ | `/backend [name]` · `/backends` | Switch backend or list available |
102
+ | `/providers` | Open provider picker |
103
+ | `/mode [name]` | Switch execution mode |
104
+ | `/reasoning [level]` | Set reasoning level |
105
+ | `/plan [on\|off]` | Toggle plan-review workflow |
106
+ | `/theme [name]` · `/themes` | Switch theme or open picker |
107
+ | `/config` | Show layered config sources and active values |
108
+ | `/config trust [on\|off\|status]` | Manage project trust |
109
+ | `/permissions` | Open permissions panel |
110
+ | `/permissions approval-policy <policy>` | Set approval policy |
111
+ | `/permissions sandbox <mode>` | Set sandbox mode |
112
+ | `/permissions network [on\|off]` | Set network access |
113
+ | `/runtime service-tier [flex\|fast]` | Set service tier |
114
+ | `/runtime personality [none\|friendly\|pragmatic]` | Set personality |
115
+ | `/settings` | Open settings panel |
116
+ | `/status` | Show effective runtime config |
117
+ | `/workspace` | Show locked workspace path |
118
+ | `/workspace relaunch <path>` | Restart TUI in another directory |
119
+ | `/auth` · `/auth status` | Auth panel or status probe |
120
+ | `/mouse` | Toggle mouse mode (wheel scroll vs. native selection) |
121
+ | `/verbose` | Toggle verbose output |
122
+ | `/copy` | Copy last response to clipboard |
123
+ | `/diagnose github` | Run GitHub connectivity diagnostics |
124
+ | `!<command>` | Run a shell command inline |
125
+
126
+ ## Layered Config
127
+
128
+ Runtime settings are resolved from a layered `config.toml` surface. Priority order (highest wins):
129
+
130
+ 1. CLI `--config` overrides
131
+ 2. Active profile patch (`[profiles.<name>]` section)
132
+ 3. Project config: `.codex/config.toml` (only when project is trusted)
133
+ 4. User config: `~/.codex/config.toml`
134
+ 5. Built-in defaults
135
+
136
+ **Supported TOML keys:**
137
+
138
+ ```toml
139
+ # Model and reasoning
140
+ model = "gpt-5.4"
141
+ model_reasoning_effort = "high" # none | minimal | low | medium | high | xhigh | max
142
+
143
+ # Permissions
144
+ approval_policy = "on-request" # untrusted | on-request | never
145
+ sandbox_mode = "workspace-write" # read-only | workspace-write | danger-full-access
146
+ service_tier = "flex" # flex | fast
147
+ personality = "none" # none | friendly | pragmatic
148
+
149
+ # Sandbox write permissions
150
+ [sandbox_workspace_write]
151
+ network_access = true
152
+ writable_roots = ["/path/to/dir"]
153
+
154
+ # Codexa-specific
155
+ [codexa]
156
+ backend = "codex-subprocess" # codex-subprocess (only active backend in v1)
157
+ mode = "full-auto" # suggest | auto-edit | full-auto
158
+
159
+ # Gemini CLI path (if using Gemini)
160
+ gemini_command_path = "C:\\path\\to\\gemini.cmd"
161
+
162
+ # Default profile to load
163
+ profile = "dev"
164
+
165
+ # Named profiles
166
+ [profiles.dev]
167
+ model = "gpt-5.4"
168
+ model_reasoning_effort = "high"
169
+ sandbox_mode = "workspace-write"
170
+
171
+ [profiles.safe]
172
+ approval_policy = "on-request"
173
+ sandbox_mode = "read-only"
174
+ ```
175
+
176
+ **Example with CLI overrides:**
177
+
178
+ ```powershell
179
+ codexa --profile review --config model="gpt-5.4" --config codexa.mode="suggest"
180
+ ```
181
+
182
+ ### Gemini CLI Executable
183
+
184
+ Codexa resolves the Gemini executable directly by path rather than through shell aliases or wrappers. To specify the Gemini CLI location:
185
+
186
+ ```powershell
187
+ $env:GEMINI_EXECUTABLE = "C:\Users\you\AppData\Roaming\npm\gemini.cmd"
188
+ ```
189
+
190
+ or in `config.toml`:
191
+
192
+ ```toml
193
+ gemini_command_path = "C:\\Users\\you\\AppData\\Roaming\\npm\\gemini.cmd"
194
+ ```
195
+
196
+ ### Using local models with LM Studio
197
+
198
+ Codexa can route the Local provider through OpenAI-compatible local servers such as LM Studio.
199
+
200
+ 1. Start LM Studio.
201
+ 2. Load a model.
202
+ 3. Enable the LM Studio local server.
203
+ 4. Confirm the endpoint is `http://localhost:1234/v1`.
204
+ 5. Open Codexa's provider picker with `/providers`.
205
+ 6. Select `Local`, refresh models if needed, then choose `Use in Codexa`.
206
+
207
+ Codexa checks `GET http://localhost:1234/v1/models` and uses the returned model IDs in the Local model picker. If LM Studio returns `google/gemma-4-26b-a4b`, that model appears as a selectable Local model.
208
+
209
+ Context length is detected separately from model discovery. Codexa first looks for context metadata returned by the provider, then CLI metadata, then an explicit workspace config override, then exact known registry entries. If no trusted source provides a limit, Codexa shows `Context: Unknown` and does not calculate a context percentage.
210
+
211
+ Environment variable configuration:
212
+
213
+ ```powershell
214
+ $env:CODEXA_LOCAL_BASE_URL = "http://localhost:1234/v1"
215
+ $env:CODEXA_LOCAL_API_KEY = "lm-studio"
216
+ $env:CODEXA_LOCAL_MODEL = "google/gemma-4-26b-a4b"
217
+ ```
218
+
219
+ Workspace provider configuration in `.codexa/providers.json`:
220
+
221
+ ```json
222
+ {
223
+ "providers": {
224
+ "local": {
225
+ "enabled": true,
226
+ "type": "openai-compatible",
227
+ "base_url": "http://localhost:1234/v1",
228
+ "api_key": "lm-studio",
229
+ "default_model": "google/gemma-4-26b-a4b",
230
+ "models": {
231
+ "google/gemma-4-26b-a4b": {
232
+ "contextLength": 8192
233
+ }
234
+ }
235
+ }
236
+ }
237
+ }
238
+ ```
239
+
240
+ `OPENAI_BASE_URL`, `OPENAI_API_BASE`, and `OPENAI_API_KEY` are also accepted for the Local provider only. They do not redirect OpenAI/Codex, Gemini, or Claude routes.
241
+
242
+ Use the `models.<modelId>.contextLength` override only when you know the loaded model/server limit. Values must be positive integers; zero, negative, and non-numeric values are ignored.
243
+
244
+ ### Project Trust
245
+
246
+ Project config (`.codex/config.toml`) is only applied when the detected project root is explicitly trusted. Manage trust with:
247
+
248
+ ```text
249
+ /config trust status
250
+ /config trust on
251
+ /config trust off
252
+ ```
253
+
254
+ Untrusted project config is detected but blocked, and shown visibly in `/config`.
255
+
256
+ ## Workspace Management
257
+
258
+ Codexa locks the session to the directory it was launched from. To start in the correct workspace:
259
+
260
+ ```powershell
261
+ cd "<path-to-your-workspace>"
262
+ codexa
263
+ ```
264
+
265
+ To recover from the wrong workspace without restarting manually:
266
+
267
+ ```text
268
+ /workspace relaunch .
269
+ /workspace relaunch <workspace-path>
270
+ ```
271
+
272
+ `/workspace relaunch` restarts the TUI process in the target directory. It does not hot-swap the workspace in the running process.
273
+
274
+ ## Themes
275
+
276
+ 16 built-in themes. Switch with `/theme <name>` or open the picker with `/themes`:
277
+
278
+ `purple` · `mono` · `dark` · `black` · `emerald` · `solar` · `cyber` · `ocean` · `nordic` · `green` · `amber` · `vaporwave` · `dracula` · `gruvbox` · `synthwave` · `custom`
279
+
280
+ Default: `mono` (Black & White).
281
+
282
+ ## UI Preferences
283
+
284
+ UI-only preferences are stored in `~/.codexa-settings.json` (separate from runtime config):
285
+
286
+ | Setting | Command | Options |
287
+ |---------|---------|---------|
288
+ | Workspace display | `/setting workspace <mode>` | `dir` · `name` · `simple` |
289
+ | Terminal title | `/setting terminal-title <mode>` | `dir` · `name` · `simple` |
290
+ | Busy loader | `/setting busy-loader <bool>` | `true` · `false` |
291
+ | Mouse mode | `/mouse` | wheel scroll · native selection |
292
+
293
+ ## Development
294
+
295
+ ```powershell
296
+ bun install # Install dependencies
297
+ bun run dev # Start with file watching
298
+ bun run start # Single run without watching
299
+ bun run typecheck # TypeScript type-check (no emit)
300
+ ```
301
+
302
+ Dev launches lock the workspace to the directory Bun was invoked from. For the normal end-user flow, use `npm link` and run `codexa` from the intended workspace instead.
303
+
304
+ ## Testing
305
+
306
+ ```powershell
307
+ bun test # Run all tests
308
+ bun test src/ui/layout.test.ts # Run a specific file or pattern
309
+ ```
310
+
311
+ Tests are colocated with source files (`*.test.ts` / `*.test.tsx`).
312
+
313
+ ## Repo Hygiene
314
+
315
+ Local-only files kept out of version control:
316
+
317
+ - `node_modules/`
318
+ - `.claude/`
319
+ - `.env` and other local secret files
320
+ - Editor, OS, and cache files