@oh-my-pi/pi-coding-agent 0.1.0

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 (337) hide show
  1. package/CHANGELOG.md +1629 -0
  2. package/README.md +1041 -0
  3. package/docs/compaction.md +403 -0
  4. package/docs/config-usage.md +113 -0
  5. package/docs/custom-tools.md +541 -0
  6. package/docs/extension-loading.md +1004 -0
  7. package/docs/hooks.md +867 -0
  8. package/docs/rpc.md +1040 -0
  9. package/docs/sdk.md +994 -0
  10. package/docs/session-tree-plan.md +441 -0
  11. package/docs/session.md +240 -0
  12. package/docs/skills.md +290 -0
  13. package/docs/theme.md +670 -0
  14. package/docs/tree.md +197 -0
  15. package/docs/tui.md +341 -0
  16. package/examples/README.md +21 -0
  17. package/examples/custom-tools/README.md +124 -0
  18. package/examples/custom-tools/hello/index.ts +20 -0
  19. package/examples/custom-tools/question/index.ts +84 -0
  20. package/examples/custom-tools/subagent/README.md +172 -0
  21. package/examples/custom-tools/subagent/agents/planner.md +37 -0
  22. package/examples/custom-tools/subagent/agents/scout.md +50 -0
  23. package/examples/custom-tools/subagent/agents/worker.md +24 -0
  24. package/examples/custom-tools/subagent/agents.ts +156 -0
  25. package/examples/custom-tools/subagent/commands/implement-and-review.md +10 -0
  26. package/examples/custom-tools/subagent/commands/implement.md +10 -0
  27. package/examples/custom-tools/subagent/commands/scout-and-plan.md +9 -0
  28. package/examples/custom-tools/subagent/index.ts +1002 -0
  29. package/examples/custom-tools/todo/index.ts +212 -0
  30. package/examples/hooks/README.md +56 -0
  31. package/examples/hooks/auto-commit-on-exit.ts +49 -0
  32. package/examples/hooks/confirm-destructive.ts +59 -0
  33. package/examples/hooks/custom-compaction.ts +116 -0
  34. package/examples/hooks/dirty-repo-guard.ts +52 -0
  35. package/examples/hooks/file-trigger.ts +41 -0
  36. package/examples/hooks/git-checkpoint.ts +53 -0
  37. package/examples/hooks/handoff.ts +150 -0
  38. package/examples/hooks/permission-gate.ts +34 -0
  39. package/examples/hooks/protected-paths.ts +30 -0
  40. package/examples/hooks/qna.ts +119 -0
  41. package/examples/hooks/snake.ts +343 -0
  42. package/examples/hooks/status-line.ts +40 -0
  43. package/examples/sdk/01-minimal.ts +22 -0
  44. package/examples/sdk/02-custom-model.ts +49 -0
  45. package/examples/sdk/03-custom-prompt.ts +44 -0
  46. package/examples/sdk/04-skills.ts +44 -0
  47. package/examples/sdk/05-tools.ts +90 -0
  48. package/examples/sdk/06-hooks.ts +61 -0
  49. package/examples/sdk/07-context-files.ts +36 -0
  50. package/examples/sdk/08-slash-commands.ts +42 -0
  51. package/examples/sdk/09-api-keys-and-oauth.ts +55 -0
  52. package/examples/sdk/10-settings.ts +38 -0
  53. package/examples/sdk/11-sessions.ts +48 -0
  54. package/examples/sdk/12-full-control.ts +95 -0
  55. package/examples/sdk/README.md +154 -0
  56. package/package.json +89 -0
  57. package/src/bun-imports.d.ts +16 -0
  58. package/src/capability/context-file.ts +40 -0
  59. package/src/capability/extension.ts +48 -0
  60. package/src/capability/hook.ts +40 -0
  61. package/src/capability/index.ts +616 -0
  62. package/src/capability/instruction.ts +37 -0
  63. package/src/capability/mcp.ts +52 -0
  64. package/src/capability/prompt.ts +35 -0
  65. package/src/capability/rule.ts +56 -0
  66. package/src/capability/settings.ts +35 -0
  67. package/src/capability/skill.ts +49 -0
  68. package/src/capability/slash-command.ts +40 -0
  69. package/src/capability/system-prompt.ts +35 -0
  70. package/src/capability/tool.ts +38 -0
  71. package/src/capability/types.ts +166 -0
  72. package/src/cli/args.ts +259 -0
  73. package/src/cli/file-processor.ts +121 -0
  74. package/src/cli/list-models.ts +104 -0
  75. package/src/cli/plugin-cli.ts +661 -0
  76. package/src/cli/session-picker.ts +41 -0
  77. package/src/cli/update-cli.ts +274 -0
  78. package/src/cli.ts +10 -0
  79. package/src/config.ts +391 -0
  80. package/src/core/agent-session.ts +2178 -0
  81. package/src/core/auth-storage.ts +258 -0
  82. package/src/core/bash-executor.ts +197 -0
  83. package/src/core/compaction/branch-summarization.ts +315 -0
  84. package/src/core/compaction/compaction.ts +664 -0
  85. package/src/core/compaction/index.ts +7 -0
  86. package/src/core/compaction/utils.ts +153 -0
  87. package/src/core/custom-commands/bundled/review/index.ts +156 -0
  88. package/src/core/custom-commands/index.ts +15 -0
  89. package/src/core/custom-commands/loader.ts +226 -0
  90. package/src/core/custom-commands/types.ts +112 -0
  91. package/src/core/custom-tools/index.ts +22 -0
  92. package/src/core/custom-tools/loader.ts +248 -0
  93. package/src/core/custom-tools/types.ts +185 -0
  94. package/src/core/custom-tools/wrapper.ts +29 -0
  95. package/src/core/exec.ts +139 -0
  96. package/src/core/export-html/index.ts +159 -0
  97. package/src/core/export-html/template.css +774 -0
  98. package/src/core/export-html/template.generated.ts +2 -0
  99. package/src/core/export-html/template.html +45 -0
  100. package/src/core/export-html/template.js +1185 -0
  101. package/src/core/export-html/template.macro.ts +24 -0
  102. package/src/core/file-mentions.ts +54 -0
  103. package/src/core/hooks/index.ts +16 -0
  104. package/src/core/hooks/loader.ts +288 -0
  105. package/src/core/hooks/runner.ts +434 -0
  106. package/src/core/hooks/tool-wrapper.ts +98 -0
  107. package/src/core/hooks/types.ts +770 -0
  108. package/src/core/index.ts +53 -0
  109. package/src/core/logger.ts +112 -0
  110. package/src/core/mcp/client.ts +185 -0
  111. package/src/core/mcp/config.ts +248 -0
  112. package/src/core/mcp/index.ts +45 -0
  113. package/src/core/mcp/loader.ts +99 -0
  114. package/src/core/mcp/manager.ts +235 -0
  115. package/src/core/mcp/tool-bridge.ts +156 -0
  116. package/src/core/mcp/transports/http.ts +316 -0
  117. package/src/core/mcp/transports/index.ts +6 -0
  118. package/src/core/mcp/transports/stdio.ts +252 -0
  119. package/src/core/mcp/types.ts +228 -0
  120. package/src/core/messages.ts +211 -0
  121. package/src/core/model-registry.ts +334 -0
  122. package/src/core/model-resolver.ts +494 -0
  123. package/src/core/plugins/doctor.ts +67 -0
  124. package/src/core/plugins/index.ts +38 -0
  125. package/src/core/plugins/installer.ts +189 -0
  126. package/src/core/plugins/loader.ts +339 -0
  127. package/src/core/plugins/manager.ts +672 -0
  128. package/src/core/plugins/parser.ts +105 -0
  129. package/src/core/plugins/paths.ts +37 -0
  130. package/src/core/plugins/types.ts +190 -0
  131. package/src/core/sdk.ts +900 -0
  132. package/src/core/session-manager.ts +1837 -0
  133. package/src/core/settings-manager.ts +860 -0
  134. package/src/core/skills.ts +352 -0
  135. package/src/core/slash-commands.ts +132 -0
  136. package/src/core/system-prompt.ts +442 -0
  137. package/src/core/timings.ts +25 -0
  138. package/src/core/title-generator.ts +110 -0
  139. package/src/core/tools/ask.ts +193 -0
  140. package/src/core/tools/bash-interceptor.ts +120 -0
  141. package/src/core/tools/bash.ts +91 -0
  142. package/src/core/tools/context.ts +32 -0
  143. package/src/core/tools/edit-diff.ts +487 -0
  144. package/src/core/tools/edit.ts +140 -0
  145. package/src/core/tools/exa/company.ts +59 -0
  146. package/src/core/tools/exa/index.ts +63 -0
  147. package/src/core/tools/exa/linkedin.ts +59 -0
  148. package/src/core/tools/exa/mcp-client.ts +368 -0
  149. package/src/core/tools/exa/render.ts +200 -0
  150. package/src/core/tools/exa/researcher.ts +90 -0
  151. package/src/core/tools/exa/search.ts +338 -0
  152. package/src/core/tools/exa/types.ts +167 -0
  153. package/src/core/tools/exa/websets.ts +248 -0
  154. package/src/core/tools/find.ts +244 -0
  155. package/src/core/tools/grep.ts +584 -0
  156. package/src/core/tools/index.ts +283 -0
  157. package/src/core/tools/ls.ts +142 -0
  158. package/src/core/tools/lsp/client.ts +767 -0
  159. package/src/core/tools/lsp/clients/biome-client.ts +207 -0
  160. package/src/core/tools/lsp/clients/index.ts +49 -0
  161. package/src/core/tools/lsp/clients/lsp-linter-client.ts +98 -0
  162. package/src/core/tools/lsp/config.ts +845 -0
  163. package/src/core/tools/lsp/edits.ts +110 -0
  164. package/src/core/tools/lsp/index.ts +1364 -0
  165. package/src/core/tools/lsp/render.ts +560 -0
  166. package/src/core/tools/lsp/rust-analyzer.ts +145 -0
  167. package/src/core/tools/lsp/types.ts +495 -0
  168. package/src/core/tools/lsp/utils.ts +526 -0
  169. package/src/core/tools/notebook.ts +182 -0
  170. package/src/core/tools/output.ts +198 -0
  171. package/src/core/tools/path-utils.ts +61 -0
  172. package/src/core/tools/read.ts +507 -0
  173. package/src/core/tools/renderers.ts +820 -0
  174. package/src/core/tools/review.ts +275 -0
  175. package/src/core/tools/rulebook.ts +124 -0
  176. package/src/core/tools/task/agents.ts +158 -0
  177. package/src/core/tools/task/artifacts.ts +114 -0
  178. package/src/core/tools/task/commands.ts +157 -0
  179. package/src/core/tools/task/discovery.ts +217 -0
  180. package/src/core/tools/task/executor.ts +531 -0
  181. package/src/core/tools/task/index.ts +548 -0
  182. package/src/core/tools/task/model-resolver.ts +176 -0
  183. package/src/core/tools/task/parallel.ts +38 -0
  184. package/src/core/tools/task/render.ts +502 -0
  185. package/src/core/tools/task/subprocess-tool-registry.ts +89 -0
  186. package/src/core/tools/task/types.ts +142 -0
  187. package/src/core/tools/truncate.ts +265 -0
  188. package/src/core/tools/web-fetch.ts +2511 -0
  189. package/src/core/tools/web-search/auth.ts +199 -0
  190. package/src/core/tools/web-search/index.ts +583 -0
  191. package/src/core/tools/web-search/providers/anthropic.ts +198 -0
  192. package/src/core/tools/web-search/providers/exa.ts +196 -0
  193. package/src/core/tools/web-search/providers/perplexity.ts +195 -0
  194. package/src/core/tools/web-search/render.ts +372 -0
  195. package/src/core/tools/web-search/types.ts +180 -0
  196. package/src/core/tools/write.ts +63 -0
  197. package/src/core/ttsr.ts +211 -0
  198. package/src/core/utils.ts +187 -0
  199. package/src/discovery/agents-md.ts +75 -0
  200. package/src/discovery/builtin.ts +647 -0
  201. package/src/discovery/claude.ts +623 -0
  202. package/src/discovery/cline.ts +104 -0
  203. package/src/discovery/codex.ts +571 -0
  204. package/src/discovery/cursor.ts +266 -0
  205. package/src/discovery/gemini.ts +368 -0
  206. package/src/discovery/github.ts +120 -0
  207. package/src/discovery/helpers.test.ts +127 -0
  208. package/src/discovery/helpers.ts +249 -0
  209. package/src/discovery/index.ts +84 -0
  210. package/src/discovery/mcp-json.ts +127 -0
  211. package/src/discovery/vscode.ts +99 -0
  212. package/src/discovery/windsurf.ts +219 -0
  213. package/src/index.ts +192 -0
  214. package/src/main.ts +507 -0
  215. package/src/migrations.ts +156 -0
  216. package/src/modes/cleanup.ts +23 -0
  217. package/src/modes/index.ts +48 -0
  218. package/src/modes/interactive/components/armin.ts +382 -0
  219. package/src/modes/interactive/components/assistant-message.ts +86 -0
  220. package/src/modes/interactive/components/bash-execution.ts +199 -0
  221. package/src/modes/interactive/components/bordered-loader.ts +41 -0
  222. package/src/modes/interactive/components/branch-summary-message.ts +42 -0
  223. package/src/modes/interactive/components/compaction-summary-message.ts +45 -0
  224. package/src/modes/interactive/components/custom-editor.ts +122 -0
  225. package/src/modes/interactive/components/diff.ts +147 -0
  226. package/src/modes/interactive/components/dynamic-border.ts +25 -0
  227. package/src/modes/interactive/components/extensions/extension-dashboard.ts +296 -0
  228. package/src/modes/interactive/components/extensions/extension-list.ts +479 -0
  229. package/src/modes/interactive/components/extensions/index.ts +9 -0
  230. package/src/modes/interactive/components/extensions/inspector-panel.ts +313 -0
  231. package/src/modes/interactive/components/extensions/state-manager.ts +558 -0
  232. package/src/modes/interactive/components/extensions/types.ts +191 -0
  233. package/src/modes/interactive/components/hook-editor.ts +117 -0
  234. package/src/modes/interactive/components/hook-input.ts +64 -0
  235. package/src/modes/interactive/components/hook-message.ts +96 -0
  236. package/src/modes/interactive/components/hook-selector.ts +91 -0
  237. package/src/modes/interactive/components/model-selector.ts +560 -0
  238. package/src/modes/interactive/components/oauth-selector.ts +136 -0
  239. package/src/modes/interactive/components/plugin-settings.ts +481 -0
  240. package/src/modes/interactive/components/queue-mode-selector.ts +56 -0
  241. package/src/modes/interactive/components/session-selector.ts +220 -0
  242. package/src/modes/interactive/components/settings-defs.ts +597 -0
  243. package/src/modes/interactive/components/settings-selector.ts +545 -0
  244. package/src/modes/interactive/components/show-images-selector.ts +45 -0
  245. package/src/modes/interactive/components/status-line/index.ts +4 -0
  246. package/src/modes/interactive/components/status-line/presets.ts +94 -0
  247. package/src/modes/interactive/components/status-line/segments.ts +350 -0
  248. package/src/modes/interactive/components/status-line/separators.ts +55 -0
  249. package/src/modes/interactive/components/status-line/types.ts +81 -0
  250. package/src/modes/interactive/components/status-line-segment-editor.ts +357 -0
  251. package/src/modes/interactive/components/status-line.ts +384 -0
  252. package/src/modes/interactive/components/theme-selector.ts +62 -0
  253. package/src/modes/interactive/components/thinking-selector.ts +64 -0
  254. package/src/modes/interactive/components/tool-execution.ts +946 -0
  255. package/src/modes/interactive/components/tree-selector.ts +877 -0
  256. package/src/modes/interactive/components/ttsr-notification.ts +82 -0
  257. package/src/modes/interactive/components/user-message-selector.ts +159 -0
  258. package/src/modes/interactive/components/user-message.ts +18 -0
  259. package/src/modes/interactive/components/visual-truncate.ts +50 -0
  260. package/src/modes/interactive/components/welcome.ts +228 -0
  261. package/src/modes/interactive/interactive-mode.ts +2669 -0
  262. package/src/modes/interactive/theme/dark.json +102 -0
  263. package/src/modes/interactive/theme/defaults/dark-arctic.json +111 -0
  264. package/src/modes/interactive/theme/defaults/dark-catppuccin.json +106 -0
  265. package/src/modes/interactive/theme/defaults/dark-cyberpunk.json +109 -0
  266. package/src/modes/interactive/theme/defaults/dark-dracula.json +105 -0
  267. package/src/modes/interactive/theme/defaults/dark-forest.json +103 -0
  268. package/src/modes/interactive/theme/defaults/dark-github.json +112 -0
  269. package/src/modes/interactive/theme/defaults/dark-gruvbox.json +119 -0
  270. package/src/modes/interactive/theme/defaults/dark-monochrome.json +101 -0
  271. package/src/modes/interactive/theme/defaults/dark-monokai.json +105 -0
  272. package/src/modes/interactive/theme/defaults/dark-nord.json +104 -0
  273. package/src/modes/interactive/theme/defaults/dark-ocean.json +108 -0
  274. package/src/modes/interactive/theme/defaults/dark-one.json +107 -0
  275. package/src/modes/interactive/theme/defaults/dark-retro.json +99 -0
  276. package/src/modes/interactive/theme/defaults/dark-rose-pine.json +95 -0
  277. package/src/modes/interactive/theme/defaults/dark-solarized.json +96 -0
  278. package/src/modes/interactive/theme/defaults/dark-sunset.json +106 -0
  279. package/src/modes/interactive/theme/defaults/dark-synthwave.json +102 -0
  280. package/src/modes/interactive/theme/defaults/dark-tokyo-night.json +108 -0
  281. package/src/modes/interactive/theme/defaults/index.ts +67 -0
  282. package/src/modes/interactive/theme/defaults/light-arctic.json +106 -0
  283. package/src/modes/interactive/theme/defaults/light-catppuccin.json +105 -0
  284. package/src/modes/interactive/theme/defaults/light-cyberpunk.json +103 -0
  285. package/src/modes/interactive/theme/defaults/light-forest.json +107 -0
  286. package/src/modes/interactive/theme/defaults/light-github.json +114 -0
  287. package/src/modes/interactive/theme/defaults/light-gruvbox.json +115 -0
  288. package/src/modes/interactive/theme/defaults/light-monochrome.json +100 -0
  289. package/src/modes/interactive/theme/defaults/light-ocean.json +106 -0
  290. package/src/modes/interactive/theme/defaults/light-one.json +105 -0
  291. package/src/modes/interactive/theme/defaults/light-retro.json +105 -0
  292. package/src/modes/interactive/theme/defaults/light-solarized.json +101 -0
  293. package/src/modes/interactive/theme/defaults/light-sunset.json +106 -0
  294. package/src/modes/interactive/theme/defaults/light-synthwave.json +105 -0
  295. package/src/modes/interactive/theme/defaults/light-tokyo-night.json +118 -0
  296. package/src/modes/interactive/theme/light.json +99 -0
  297. package/src/modes/interactive/theme/theme-schema.json +424 -0
  298. package/src/modes/interactive/theme/theme.ts +2211 -0
  299. package/src/modes/print-mode.ts +163 -0
  300. package/src/modes/rpc/rpc-client.ts +527 -0
  301. package/src/modes/rpc/rpc-mode.ts +494 -0
  302. package/src/modes/rpc/rpc-types.ts +203 -0
  303. package/src/prompts/architect-plan.md +10 -0
  304. package/src/prompts/branch-summary-preamble.md +3 -0
  305. package/src/prompts/branch-summary.md +28 -0
  306. package/src/prompts/browser.md +71 -0
  307. package/src/prompts/compaction-summary.md +34 -0
  308. package/src/prompts/compaction-turn-prefix.md +16 -0
  309. package/src/prompts/compaction-update-summary.md +41 -0
  310. package/src/prompts/explore.md +82 -0
  311. package/src/prompts/implement-with-critic.md +11 -0
  312. package/src/prompts/implement.md +11 -0
  313. package/src/prompts/init.md +30 -0
  314. package/src/prompts/plan.md +54 -0
  315. package/src/prompts/reviewer.md +81 -0
  316. package/src/prompts/summarization-system.md +3 -0
  317. package/src/prompts/system-prompt.md +27 -0
  318. package/src/prompts/task.md +56 -0
  319. package/src/prompts/title-system.md +8 -0
  320. package/src/prompts/tools/ask.md +24 -0
  321. package/src/prompts/tools/bash.md +23 -0
  322. package/src/prompts/tools/edit.md +9 -0
  323. package/src/prompts/tools/find.md +6 -0
  324. package/src/prompts/tools/grep.md +12 -0
  325. package/src/prompts/tools/lsp.md +14 -0
  326. package/src/prompts/tools/output.md +23 -0
  327. package/src/prompts/tools/read.md +25 -0
  328. package/src/prompts/tools/web-fetch.md +8 -0
  329. package/src/prompts/tools/web-search.md +10 -0
  330. package/src/prompts/tools/write.md +10 -0
  331. package/src/utils/changelog.ts +99 -0
  332. package/src/utils/clipboard.ts +265 -0
  333. package/src/utils/fuzzy.ts +108 -0
  334. package/src/utils/mime.ts +30 -0
  335. package/src/utils/shell-snapshot.ts +218 -0
  336. package/src/utils/shell.ts +364 -0
  337. package/src/utils/tools-manager.ts +265 -0
package/docs/theme.md ADDED
@@ -0,0 +1,670 @@
1
+ > omp can create themes. Ask it to build one for your use case.
2
+
3
+ # OMP Coding Agent Themes
4
+
5
+ Themes allow you to customize the colors used throughout the coding agent TUI.
6
+
7
+ ## Color Tokens
8
+
9
+ Every theme must define all color tokens. There are no optional colors.
10
+
11
+ ### Core UI (10 colors)
12
+
13
+ | Token | Purpose | Examples |
14
+ | -------------- | --------------------- | ------------------------------------ |
15
+ | `accent` | Primary accent color | Logo, selected items, cursor (›) |
16
+ | `border` | Normal borders | Selector borders, horizontal lines |
17
+ | `borderAccent` | Highlighted borders | Changelog borders, special panels |
18
+ | `borderMuted` | Subtle borders | Editor borders, secondary separators |
19
+ | `success` | Success states | Success messages, diff additions |
20
+ | `error` | Error states | Error messages, diff deletions |
21
+ | `warning` | Warning states | Warning messages |
22
+ | `muted` | Secondary/dimmed text | Metadata, descriptions, output |
23
+ | `dim` | Very dimmed text | Less important info, placeholders |
24
+ | `text` | Default text color | Main content (usually `""`) |
25
+ | `thinkingText` | Thinking block text | Assistant reasoning traces |
26
+
27
+ ### Backgrounds & Content Text (11 colors)
28
+
29
+ | Token | Purpose |
30
+ | -------------------- | ----------------------------------------------------------------- |
31
+ | `selectedBg` | Selected/active line background (e.g., tree selector) |
32
+ | `userMessageBg` | User message background |
33
+ | `userMessageText` | User message text color |
34
+ | `customMessageBg` | Hook custom message background |
35
+ | `customMessageText` | Hook custom message text color |
36
+ | `customMessageLabel` | Hook custom message label/type text |
37
+ | `toolPendingBg` | Tool execution box (pending state) |
38
+ | `toolSuccessBg` | Tool execution box (success state) |
39
+ | `toolErrorBg` | Tool execution box (error state) |
40
+ | `toolTitle` | Tool execution title/heading (e.g., `$ command`, `read file.txt`) |
41
+ | `toolOutput` | Tool execution output text |
42
+
43
+ ### Markdown (10 colors)
44
+
45
+ | Token | Purpose |
46
+ | ------------------- | ----------------------------- |
47
+ | `mdHeading` | Heading text (`#`, `##`, etc) |
48
+ | `mdLink` | Link text |
49
+ | `mdLinkUrl` | Link URL (in parentheses) |
50
+ | `mdCode` | Inline code (backticks) |
51
+ | `mdCodeBlock` | Code block content |
52
+ | `mdCodeBlockBorder` | Code block fences (```) |
53
+ | `mdQuote` | Blockquote text |
54
+ | `mdQuoteBorder` | Blockquote border (`│`) |
55
+ | `mdHr` | Horizontal rule (`---`) |
56
+ | `mdListBullet` | List bullets/numbers |
57
+
58
+ ### Tool Diffs (3 colors)
59
+
60
+ | Token | Purpose |
61
+ | ----------------- | --------------------------- |
62
+ | `toolDiffAdded` | Added lines in tool diffs |
63
+ | `toolDiffRemoved` | Removed lines in tool diffs |
64
+ | `toolDiffContext` | Context lines in tool diffs |
65
+
66
+ Note: Diff colors are specific to tool execution boxes and must work with tool background colors.
67
+
68
+ ### Syntax Highlighting (9 colors)
69
+
70
+ Future-proofing for syntax highlighting support:
71
+
72
+ | Token | Purpose |
73
+ | ------------------- | -------------------------------- |
74
+ | `syntaxComment` | Comments |
75
+ | `syntaxKeyword` | Keywords (`if`, `function`, etc) |
76
+ | `syntaxFunction` | Function names |
77
+ | `syntaxVariable` | Variable names |
78
+ | `syntaxString` | String literals |
79
+ | `syntaxNumber` | Number literals |
80
+ | `syntaxType` | Type names |
81
+ | `syntaxOperator` | Operators (`+`, `-`, etc) |
82
+ | `syntaxPunctuation` | Punctuation (`;`, `,`, etc) |
83
+
84
+ ### Thinking Level Borders (6 colors)
85
+
86
+ Editor border colors that indicate the current thinking/reasoning level:
87
+
88
+ | Token | Purpose |
89
+ | ----------------- | ----------------------------------------------------------------- |
90
+ | `thinkingOff` | Border when thinking is off (most subtle) |
91
+ | `thinkingMinimal` | Border for minimal thinking |
92
+ | `thinkingLow` | Border for low thinking |
93
+ | `thinkingMedium` | Border for medium thinking |
94
+ | `thinkingHigh` | Border for high thinking |
95
+ | `thinkingXhigh` | Border for xhigh thinking (most prominent, OpenAI codex-max only) |
96
+
97
+ These create a visual hierarchy: off → minimal → low → medium → high → xhigh
98
+
99
+ ### Bash Mode (1 color)
100
+
101
+ | Token | Purpose |
102
+ | ---------- | ------------------------------------------------ |
103
+ | `bashMode` | Editor border color when in bash mode (! prefix) |
104
+
105
+ **Total: 50 color tokens** (all required)
106
+
107
+ ### HTML Export Colors (optional)
108
+
109
+ The `export` section is optional and controls colors used when exporting sessions to HTML via `/export`. If not specified, these colors are automatically derived from `userMessageBg` based on luminance detection.
110
+
111
+ | Token | Purpose |
112
+ | -------- | ------------------------------------------------------------- |
113
+ | `pageBg` | Page background color |
114
+ | `cardBg` | Card/container background (headers, stats boxes) |
115
+ | `infoBg` | Info sections background (system prompt, notices, compaction) |
116
+
117
+ Example:
118
+
119
+ ```json
120
+ {
121
+ "export": {
122
+ "pageBg": "#18181e",
123
+ "cardBg": "#1e1e24",
124
+ "infoBg": "#3c3728"
125
+ }
126
+ }
127
+ ```
128
+
129
+ ## Theme Format
130
+
131
+ Themes are defined in JSON files with the following structure:
132
+
133
+ ```json
134
+ {
135
+ "$schema": "https://raw.githubusercontent.com/can1357/oh-my-pi/main/packages/coding-agent/theme-schema.json",
136
+ "name": "my-theme",
137
+ "vars": {
138
+ "blue": "#0066cc",
139
+ "gray": 242,
140
+ "brightCyan": 51
141
+ },
142
+ "colors": {
143
+ "accent": "blue",
144
+ "muted": "gray",
145
+ "thinkingText": "gray",
146
+ "text": "",
147
+ ...
148
+ }
149
+ }
150
+ ```
151
+
152
+ ## Symbols
153
+
154
+ Themes can also customize specific UI symbols (icons, separators, bullets, etc.). Use `symbols.preset` to set a theme default (overridden by user settings), and `symbols.overrides` to override individual keys.
155
+
156
+ Example:
157
+
158
+ ```json
159
+ {
160
+ "symbols": {
161
+ "preset": "ascii",
162
+ "overrides": {
163
+ "icon.model": "[M]",
164
+ "sep.powerlineLeft": ">",
165
+ "sep.powerlineRight": "<"
166
+ }
167
+ }
168
+ }
169
+ ```
170
+
171
+ Symbol keys by category:
172
+
173
+ - Status: `status.success`, `status.error`, `status.warning`, `status.info`, `status.pending`, `status.disabled`, `status.enabled`, `status.running`, `status.shadowed`, `status.aborted`
174
+ - Navigation: `nav.cursor`, `nav.selected`, `nav.expand`, `nav.collapse`, `nav.back`
175
+ - Tree: `tree.branch`, `tree.last`, `tree.vertical`, `tree.horizontal`, `tree.hook`
176
+ - Boxes (rounded): `boxRound.topLeft`, `boxRound.topRight`, `boxRound.bottomLeft`, `boxRound.bottomRight`, `boxRound.horizontal`, `boxRound.vertical`
177
+ - Boxes (sharp): `boxSharp.topLeft`, `boxSharp.topRight`, `boxSharp.bottomLeft`, `boxSharp.bottomRight`, `boxSharp.horizontal`, `boxSharp.vertical`, `boxSharp.cross`, `boxSharp.teeDown`, `boxSharp.teeUp`, `boxSharp.teeRight`, `boxSharp.teeLeft`
178
+ - Separators: `sep.powerline`, `sep.powerlineThin`, `sep.powerlineLeft`, `sep.powerlineRight`, `sep.powerlineThinLeft`, `sep.powerlineThinRight`, `sep.dot`, `sep.slash`, `sep.pipe`
179
+ - Icons: `icon.model`, `icon.folder`, `icon.file`, `icon.git`, `icon.branch`, `icon.tokens`, `icon.context`, `icon.cost`, `icon.time`, `icon.pi`, `icon.agents`, `icon.cache`, `icon.input`, `icon.output`, `icon.host`, `icon.session`, `icon.package`, `icon.warning`, `icon.rewind`, `icon.auto`, `icon.extensionSkill`, `icon.extensionTool`, `icon.extensionSlashCommand`, `icon.extensionMcp`, `icon.extensionRule`, `icon.extensionHook`, `icon.extensionPrompt`, `icon.extensionContextFile`, `icon.extensionInstruction`
180
+ - Thinking: `thinking.minimal`, `thinking.low`, `thinking.medium`, `thinking.high`, `thinking.xhigh`
181
+ - Checkboxes: `checkbox.checked`, `checkbox.unchecked`
182
+ - Formatting: `format.ellipsis`, `format.bullet`, `format.dash`
183
+ - Markdown: `md.quoteBorder`, `md.hrChar`, `md.bullet`
184
+
185
+ ### Color Values
186
+
187
+ Four formats are supported:
188
+
189
+ 1. **Hex colors**: `"#ff0000"` (6-digit hex RGB)
190
+ 2. **256-color palette**: `39` (number 0-255, xterm 256-color palette)
191
+ 3. **Color references**: `"blue"` (must be defined in `vars`)
192
+ 4. **Terminal default**: `""` (empty string, uses terminal's default color)
193
+
194
+ ### The `vars` Section
195
+
196
+ The optional `vars` section allows you to define reusable colors:
197
+
198
+ ```json
199
+ {
200
+ "vars": {
201
+ "nord0": "#2E3440",
202
+ "nord1": "#3B4252",
203
+ "nord8": "#88C0D0",
204
+ "brightBlue": 39
205
+ },
206
+ "colors": {
207
+ "accent": "nord8",
208
+ "muted": "nord1",
209
+ "mdLink": "brightBlue"
210
+ }
211
+ }
212
+ ```
213
+
214
+ Benefits:
215
+
216
+ - Reuse colors across multiple tokens
217
+ - Easier to maintain theme consistency
218
+ - Can reference standard color palettes
219
+
220
+ Variables can be hex colors (`"#ff0000"`), 256-color indices (`42`), or references to other variables.
221
+
222
+ ### Terminal Default (empty string)
223
+
224
+ Use `""` (empty string) to inherit the terminal's default foreground/background color:
225
+
226
+ ```json
227
+ {
228
+ "colors": {
229
+ "text": "" // Uses terminal's default text color
230
+ }
231
+ }
232
+ ```
233
+
234
+ This is useful for:
235
+
236
+ - Main text color (adapts to user's terminal theme)
237
+ - Creating themes that blend with terminal appearance
238
+
239
+ ## Built-in Themes
240
+
241
+ OMP comes with two built-in themes:
242
+
243
+ ### `dark` (default)
244
+
245
+ Optimized for dark terminal backgrounds with bright, saturated colors.
246
+
247
+ ### `light`
248
+
249
+ Optimized for light terminal backgrounds with darker, muted colors.
250
+
251
+ ## Selecting a Theme
252
+
253
+ Themes are configured in the settings (accessible via `/settings`):
254
+
255
+ ```json
256
+ {
257
+ "theme": "dark"
258
+ }
259
+ ```
260
+
261
+ Or use the `/theme` command interactively.
262
+
263
+ On first run, OMP detects your terminal's background and sets a sensible default (`dark` or `light`).
264
+
265
+ ## Custom Themes
266
+
267
+ ### Theme Locations
268
+
269
+ Custom themes are loaded from `~/.omp/agent/themes/*.json`.
270
+
271
+ ### Creating a Custom Theme
272
+
273
+ 1. **Create theme directory:**
274
+
275
+ ```bash
276
+ mkdir -p ~/.omp/agent/themes
277
+ ```
278
+
279
+ 2. **Create theme file:**
280
+
281
+ ```bash
282
+ vim ~/.omp/agent/themes/my-theme.json
283
+ ```
284
+
285
+ 3. **Define all colors:**
286
+
287
+ ```json
288
+ {
289
+ "$schema": "https://raw.githubusercontent.com/can1357/oh-my-pi/main/packages/coding-agent/theme-schema.json",
290
+ "name": "my-theme",
291
+ "vars": {
292
+ "primary": "#00aaff",
293
+ "secondary": 242,
294
+ "brightGreen": 46
295
+ },
296
+ "colors": {
297
+ "accent": "primary",
298
+ "border": "primary",
299
+ "borderAccent": "#00ffff",
300
+ "borderMuted": "secondary",
301
+ "success": "brightGreen",
302
+ "error": "#ff0000",
303
+ "warning": "#ffff00",
304
+ "muted": "secondary",
305
+ "text": "",
306
+
307
+ "userMessageBg": "#2d2d30",
308
+ "userMessageText": "",
309
+ "toolPendingBg": "#1e1e2e",
310
+ "toolSuccessBg": "#1e2e1e",
311
+ "toolErrorBg": "#2e1e1e",
312
+ "toolText": "",
313
+
314
+ "mdHeading": "#ffaa00",
315
+ "mdLink": "primary",
316
+ "mdCode": "#00ffff",
317
+ "mdCodeBlock": "#00ff00",
318
+ "mdCodeBlockBorder": "secondary",
319
+ "mdQuote": "secondary",
320
+ "mdQuoteBorder": "secondary",
321
+ "mdHr": "secondary",
322
+ "mdListBullet": "#00ffff",
323
+
324
+ "toolDiffAdded": "#00ff00",
325
+ "toolDiffRemoved": "#ff0000",
326
+ "toolDiffContext": "secondary",
327
+
328
+ "syntaxComment": "secondary",
329
+ "syntaxKeyword": "primary",
330
+ "syntaxFunction": "#00aaff",
331
+ "syntaxVariable": "#ffaa00",
332
+ "syntaxString": "#00ff00",
333
+ "syntaxNumber": "#ff00ff",
334
+ "syntaxType": "#00aaff",
335
+ "syntaxOperator": "primary",
336
+ "syntaxPunctuation": "secondary",
337
+
338
+ "thinkingOff": "secondary",
339
+ "thinkingMinimal": "primary",
340
+ "thinkingLow": "#00aaff",
341
+ "thinkingMedium": "#00ffff",
342
+ "thinkingHigh": "#ff00ff"
343
+ }
344
+ }
345
+ ```
346
+
347
+ 4. **Select your theme:**
348
+ - Use `/settings` command and set `"theme": "my-theme"`
349
+ - Or use `/theme` command interactively
350
+
351
+ ## Tips
352
+
353
+ ### Light vs Dark Themes
354
+
355
+ **For dark terminals:**
356
+
357
+ - Use bright, saturated colors
358
+ - Higher contrast
359
+ - Example: `#00ffff` (bright cyan)
360
+
361
+ **For light terminals:**
362
+
363
+ - Use darker, muted colors
364
+ - Lower contrast to avoid eye strain
365
+ - Example: `#008888` (dark cyan)
366
+
367
+ ### Color Harmony
368
+
369
+ - Start with a base palette (e.g., Nord, Gruvbox, Tokyo Night)
370
+ - Define your palette in `defs`
371
+ - Reference colors consistently
372
+
373
+ ### Testing
374
+
375
+ Test your theme with:
376
+
377
+ - Different message types (user, assistant, errors)
378
+ - Tool executions (success and error states)
379
+ - Markdown content (headings, code, lists, etc)
380
+ - Long text that wraps
381
+
382
+ ## Color Format Reference
383
+
384
+ ### Hex Colors
385
+
386
+ Standard 6-digit hex format:
387
+
388
+ - `"#ff0000"` - Red
389
+ - `"#00ff00"` - Green
390
+ - `"#0000ff"` - Blue
391
+ - `"#808080"` - Gray
392
+ - `"#ffffff"` - White
393
+ - `"#000000"` - Black
394
+
395
+ RGB values: `#RRGGBB` where each component is `00-ff` (0-255)
396
+
397
+ ### 256-Color Palette
398
+
399
+ Use numeric indices (0-255) to reference the xterm 256-color palette:
400
+
401
+ **Colors 0-15:** Basic ANSI colors (terminal-dependent, may be themed)
402
+
403
+ - `0` - Black
404
+ - `1` - Red
405
+ - `2` - Green
406
+ - `3` - Yellow
407
+ - `4` - Blue
408
+ - `5` - Magenta
409
+ - `6` - Cyan
410
+ - `7` - White
411
+ - `8-15` - Bright variants
412
+
413
+ **Colors 16-231:** 6×6×6 RGB cube (standardized)
414
+
415
+ - Formula: `16 + 36×R + 6×G + B` where R, G, B are 0-5
416
+ - Example: `39` = bright cyan, `196` = bright red
417
+
418
+ **Colors 232-255:** Grayscale ramp (standardized)
419
+
420
+ - `232` - Darkest gray
421
+ - `255` - Near white
422
+
423
+ Example usage:
424
+
425
+ ```json
426
+ {
427
+ "vars": {
428
+ "gray": 242,
429
+ "brightCyan": 51,
430
+ "darkBlue": 18
431
+ },
432
+ "colors": {
433
+ "muted": "gray",
434
+ "accent": "brightCyan"
435
+ }
436
+ }
437
+ ```
438
+
439
+ **Benefits:**
440
+
441
+ - Works everywhere (`TERM=xterm-256color`)
442
+ - No truecolor detection needed
443
+ - Standardized RGB cube (16-231) looks the same on all terminals
444
+
445
+ ### Terminal Compatibility
446
+
447
+ OMP uses 24-bit RGB colors (`\x1b[38;2;R;G;Bm`). Most modern terminals support this:
448
+
449
+ - ✅ iTerm2, Alacritty, Kitty, WezTerm
450
+ - ✅ Windows Terminal
451
+ - ✅ VS Code integrated terminal
452
+ - ✅ Modern GNOME Terminal, Konsole
453
+
454
+ For older terminals with only 256-color support, OMP automatically falls back to the nearest 256-color approximation.
455
+
456
+ To check if your terminal supports truecolor:
457
+
458
+ ```bash
459
+ echo $COLORTERM # Should output "truecolor" or "24bit"
460
+ ```
461
+
462
+ ## Example Themes
463
+
464
+ See the built-in themes for complete examples:
465
+
466
+ - [Dark theme](../src/themes/dark.json)
467
+ - [Light theme](../src/themes/light.json)
468
+
469
+ ## Schema Validation
470
+
471
+ Themes are validated on load using [TypeBox](https://github.com/sinclairzx81/typebox) + [Ajv](https://ajv.js.org/).
472
+
473
+ Invalid themes will show an error with details about what's wrong:
474
+
475
+ ```
476
+ Error loading theme 'my-theme':
477
+ - colors.accent: must be string or number
478
+ - colors.mdHeading: required property missing
479
+ ```
480
+
481
+ For editor support, the JSON schema is available at:
482
+
483
+ ```
484
+ https://raw.githubusercontent.com/can1357/oh-my-pi/main/packages/coding-agent/theme-schema.json
485
+ ```
486
+
487
+ Add to your theme file for auto-completion and validation:
488
+
489
+ ```json
490
+ {
491
+ "$schema": "https://raw.githubusercontent.com/can1357/oh-my-pi/main/packages/coding-agent/theme-schema.json",
492
+ ...
493
+ }
494
+ ```
495
+
496
+ ## Implementation
497
+
498
+ ### Theme Class
499
+
500
+ Themes are loaded and converted to a `Theme` class that provides type-safe color methods:
501
+
502
+ ```typescript
503
+ class Theme {
504
+ // Apply foreground color
505
+ fg(color: ThemeColor, text: string): string;
506
+
507
+ // Apply background color
508
+ bg(color: ThemeBg, text: string): string;
509
+
510
+ // Text attributes (preserve current colors)
511
+ bold(text: string): string;
512
+ italic(text: string): string;
513
+ underline(text: string): string;
514
+ }
515
+ ```
516
+
517
+ ### Global Theme Instance
518
+
519
+ The active theme is available as a global singleton in `coding-agent`:
520
+
521
+ ```typescript
522
+ // theme.ts
523
+ export let theme: Theme;
524
+
525
+ export function setTheme(name: string) {
526
+ theme = loadTheme(name);
527
+ }
528
+
529
+ // Usage throughout coding-agent
530
+ import { theme } from "./theme.js";
531
+
532
+ theme.fg("accent", "Selected");
533
+ theme.bg("userMessageBg", content);
534
+ ```
535
+
536
+ ### TUI Component Theming
537
+
538
+ TUI components (like `Markdown`, `SelectList`, `Editor`) are in the `@oh-my-pi/pi-tui` package and don't have direct access to the theme. Instead, they define interfaces for the colors they need:
539
+
540
+ ```typescript
541
+ // In @oh-my-pi/pi-tui
542
+ export interface MarkdownTheme {
543
+ heading: (text: string) => string;
544
+ link: (text: string) => string;
545
+ linkUrl: (text: string) => string;
546
+ code: (text: string) => string;
547
+ codeBlock: (text: string) => string;
548
+ codeBlockBorder: (text: string) => string;
549
+ quote: (text: string) => string;
550
+ quoteBorder: (text: string) => string;
551
+ hr: (text: string) => string;
552
+ listBullet: (text: string) => string;
553
+ bold: (text: string) => string;
554
+ italic: (text: string) => string;
555
+ strikethrough: (text: string) => string;
556
+ underline: (text: string) => string;
557
+ }
558
+ ```
559
+
560
+ The `coding-agent` provides themed functions when creating components:
561
+
562
+ ```typescript
563
+ // In coding-agent
564
+ import { theme } from "./theme.js";
565
+ import { Markdown } from "@oh-my-pi/pi-tui";
566
+
567
+ // Helper to create markdown theme functions
568
+ function getMarkdownTheme(): MarkdownTheme {
569
+ return {
570
+ heading: (text) => theme.fg("mdHeading", text),
571
+ link: (text) => theme.fg("mdLink", text),
572
+ linkUrl: (text) => theme.fg("mdLinkUrl", text),
573
+ code: (text) => theme.fg("mdCode", text),
574
+ codeBlock: (text) => theme.fg("mdCodeBlock", text),
575
+ codeBlockBorder: (text) => theme.fg("mdCodeBlockBorder", text),
576
+ quote: (text) => theme.fg("mdQuote", text),
577
+ quoteBorder: (text) => theme.fg("mdQuoteBorder", text),
578
+ hr: (text) => theme.fg("mdHr", text),
579
+ listBullet: (text) => theme.fg("mdListBullet", text),
580
+ bold: (text) => theme.bold(text),
581
+ italic: (text) => theme.italic(text),
582
+ underline: (text) => theme.underline(text),
583
+ strikethrough: (text) => chalk.strikethrough(text),
584
+ };
585
+ }
586
+
587
+ // Create markdown with theme
588
+ const md = new Markdown(text, 1, 1, getMarkdownTheme(), { bgColor: theme.bg("userMessageBg") });
589
+ ```
590
+
591
+ This approach:
592
+
593
+ - Keeps TUI components theme-agnostic (reusable in other projects)
594
+ - Maintains type safety via interfaces
595
+ - Allows components to have sensible defaults if no theme provided
596
+ - Centralizes theme access in `coding-agent`
597
+
598
+ **Example usage:**
599
+
600
+ ```typescript
601
+ const theme = loadTheme("dark");
602
+
603
+ // Apply foreground colors
604
+ theme.fg("accent", "Selected");
605
+ theme.fg("success", "✓ Done");
606
+ theme.fg("error", "Failed");
607
+
608
+ // Apply background colors
609
+ theme.bg("userMessageBg", content);
610
+ theme.bg("toolSuccessBg", output);
611
+
612
+ // Combine styles
613
+ theme.bold(theme.fg("accent", "Title"));
614
+ theme.italic(theme.fg("muted", "metadata"));
615
+
616
+ // Nested foreground + background
617
+ const userMsg = theme.bg("userMessageBg", theme.fg("userMessageText", "Hello"));
618
+ ```
619
+
620
+ **Color resolution:**
621
+
622
+ 1. **Detect terminal capabilities:**
623
+
624
+ - Check `$COLORTERM` env var (`truecolor` or `24bit` → truecolor support)
625
+ - Check `$TERM` env var (`*-256color` → 256-color support)
626
+ - Fallback to 256-color mode if detection fails
627
+
628
+ 2. **Load JSON theme file**
629
+
630
+ 3. **Resolve `vars` references recursively:**
631
+
632
+ ```json
633
+ {
634
+ "vars": {
635
+ "primary": "#0066cc",
636
+ "accent": "primary"
637
+ },
638
+ "colors": {
639
+ "accent": "accent" // → "primary" → "#0066cc"
640
+ }
641
+ }
642
+ ```
643
+
644
+ 4. **Convert colors to ANSI codes based on terminal capability:**
645
+
646
+ **Truecolor mode (24-bit):**
647
+
648
+ - Hex (`"#ff0000"`) → `\x1b[38;2;255;0;0m`
649
+ - 256-color (`42`) → `\x1b[38;5;42m` (keep as-is)
650
+ - Empty string (`""`) → `\x1b[39m`
651
+
652
+ **256-color mode:**
653
+
654
+ - Hex (`"#ff0000"`) → convert to nearest RGB cube color → `\x1b[38;5;196m`
655
+ - 256-color (`42`) → `\x1b[38;5;42m` (keep as-is)
656
+ - Empty string (`""`) → `\x1b[39m`
657
+
658
+ **Hex to 256-color conversion:**
659
+
660
+ ```typescript
661
+ // Convert RGB to 6x6x6 cube (colors 16-231)
662
+ r_index = Math.round((r / 255) * 5);
663
+ g_index = Math.round((g / 255) * 5);
664
+ b_index = Math.round((b / 255) * 5);
665
+ color_index = 16 + 36 * r_index + 6 * g_index + b_index;
666
+ ```
667
+
668
+ 5. **Cache as `Theme` instance**
669
+
670
+ This ensures themes work correctly regardless of terminal capabilities, with graceful degradation from truecolor to 256-color.