schema.json 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. {
  2. "$schema": "https://json-schema.org/draft/2020-12/schema",
  3. "$id": "https://github.com/charmbracelet/crush/internal/config/config",
  4. "$ref": "#/$defs/Config",
  5. "$defs": {
  6. "Config": {
  7. "properties": {
  8. "$schema": {
  9. "type": "string"
  10. },
  11. "models": {
  12. "additionalProperties": {
  13. "$ref": "#/$defs/SelectedModel"
  14. },
  15. "type": "object",
  16. "description": "Model configurations for different model types"
  17. },
  18. "providers": {
  19. "additionalProperties": {
  20. "$ref": "#/$defs/ProviderConfig"
  21. },
  22. "type": "object",
  23. "description": "AI provider configurations"
  24. },
  25. "mcp": {
  26. "$ref": "#/$defs/MCPs",
  27. "description": "Model Context Protocol server configurations"
  28. },
  29. "lsp": {
  30. "$ref": "#/$defs/LSPs",
  31. "description": "Language Server Protocol configurations"
  32. },
  33. "options": {
  34. "$ref": "#/$defs/Options",
  35. "description": "General application options"
  36. },
  37. "permissions": {
  38. "$ref": "#/$defs/Permissions",
  39. "description": "Permission settings for tool usage"
  40. }
  41. },
  42. "additionalProperties": false,
  43. "type": "object"
  44. },
  45. "LSPConfig": {
  46. "properties": {
  47. "enabled": {
  48. "type": "boolean",
  49. "description": "Whether this LSP server is disabled",
  50. "default": false
  51. },
  52. "command": {
  53. "type": "string",
  54. "description": "Command to execute for the LSP server",
  55. "examples": [
  56. "gopls"
  57. ]
  58. },
  59. "args": {
  60. "items": {
  61. "type": "string"
  62. },
  63. "type": "array",
  64. "description": "Arguments to pass to the LSP server command"
  65. },
  66. "env": {
  67. "additionalProperties": {
  68. "type": "string"
  69. },
  70. "type": "object",
  71. "description": "Environment variables to set to the LSP server command"
  72. },
  73. "options": {
  74. "description": "LSP server-specific configuration options"
  75. },
  76. "filetypes": {
  77. "items": {
  78. "type": "string",
  79. "examples": [
  80. "go",
  81. "mod",
  82. "rs",
  83. "c",
  84. "js",
  85. "ts"
  86. ]
  87. },
  88. "type": "array",
  89. "description": "File types this LSP server handles"
  90. }
  91. },
  92. "additionalProperties": false,
  93. "type": "object",
  94. "required": [
  95. "command"
  96. ]
  97. },
  98. "LSPs": {
  99. "additionalProperties": {
  100. "$ref": "#/$defs/LSPConfig"
  101. },
  102. "type": "object"
  103. },
  104. "MCPConfig": {
  105. "properties": {
  106. "command": {
  107. "type": "string",
  108. "description": "Command to execute for stdio MCP servers",
  109. "examples": [
  110. "npx"
  111. ]
  112. },
  113. "env": {
  114. "additionalProperties": {
  115. "type": "string"
  116. },
  117. "type": "object",
  118. "description": "Environment variables to set for the MCP server"
  119. },
  120. "args": {
  121. "items": {
  122. "type": "string"
  123. },
  124. "type": "array",
  125. "description": "Arguments to pass to the MCP server command"
  126. },
  127. "type": {
  128. "type": "string",
  129. "enum": [
  130. "stdio",
  131. "sse",
  132. "http"
  133. ],
  134. "description": "Type of MCP connection",
  135. "default": "stdio"
  136. },
  137. "url": {
  138. "type": "string",
  139. "format": "uri",
  140. "description": "URL for HTTP or SSE MCP servers",
  141. "examples": [
  142. "http://localhost:3000/mcp"
  143. ]
  144. },
  145. "disabled": {
  146. "type": "boolean",
  147. "description": "Whether this MCP server is disabled",
  148. "default": false
  149. },
  150. "timeout": {
  151. "type": "integer",
  152. "description": "Timeout in seconds for MCP server connections",
  153. "default": 15,
  154. "examples": [
  155. 30,
  156. 60,
  157. 120
  158. ]
  159. },
  160. "headers": {
  161. "additionalProperties": {
  162. "type": "string"
  163. },
  164. "type": "object",
  165. "description": "HTTP headers for HTTP/SSE MCP servers"
  166. }
  167. },
  168. "additionalProperties": false,
  169. "type": "object",
  170. "required": [
  171. "type"
  172. ]
  173. },
  174. "MCPs": {
  175. "additionalProperties": {
  176. "$ref": "#/$defs/MCPConfig"
  177. },
  178. "type": "object"
  179. },
  180. "Model": {
  181. "properties": {
  182. "id": {
  183. "type": "string"
  184. },
  185. "name": {
  186. "type": "string"
  187. },
  188. "cost_per_1m_in": {
  189. "type": "number"
  190. },
  191. "cost_per_1m_out": {
  192. "type": "number"
  193. },
  194. "cost_per_1m_in_cached": {
  195. "type": "number"
  196. },
  197. "cost_per_1m_out_cached": {
  198. "type": "number"
  199. },
  200. "context_window": {
  201. "type": "integer"
  202. },
  203. "default_max_tokens": {
  204. "type": "integer"
  205. },
  206. "can_reason": {
  207. "type": "boolean"
  208. },
  209. "has_reasoning_efforts": {
  210. "type": "boolean"
  211. },
  212. "default_reasoning_effort": {
  213. "type": "string"
  214. },
  215. "supports_attachments": {
  216. "type": "boolean"
  217. }
  218. },
  219. "additionalProperties": false,
  220. "type": "object",
  221. "required": [
  222. "id",
  223. "name",
  224. "cost_per_1m_in",
  225. "cost_per_1m_out",
  226. "cost_per_1m_in_cached",
  227. "cost_per_1m_out_cached",
  228. "context_window",
  229. "default_max_tokens",
  230. "can_reason",
  231. "has_reasoning_efforts",
  232. "supports_attachments"
  233. ]
  234. },
  235. "Options": {
  236. "properties": {
  237. "context_paths": {
  238. "items": {
  239. "type": "string",
  240. "examples": [
  241. ".cursorrules",
  242. "CRUSH.md"
  243. ]
  244. },
  245. "type": "array",
  246. "description": "Paths to files containing context information for the AI"
  247. },
  248. "tui": {
  249. "$ref": "#/$defs/TUIOptions",
  250. "description": "Terminal user interface options"
  251. },
  252. "debug": {
  253. "type": "boolean",
  254. "description": "Enable debug logging",
  255. "default": false
  256. },
  257. "debug_lsp": {
  258. "type": "boolean",
  259. "description": "Enable debug logging for LSP servers",
  260. "default": false
  261. },
  262. "disable_auto_summarize": {
  263. "type": "boolean",
  264. "description": "Disable automatic conversation summarization",
  265. "default": false
  266. },
  267. "data_directory": {
  268. "type": "string",
  269. "description": "Directory for storing application data (relative to working directory)",
  270. "default": ".crush",
  271. "examples": [
  272. ".crush"
  273. ]
  274. }
  275. },
  276. "additionalProperties": false,
  277. "type": "object"
  278. },
  279. "Permissions": {
  280. "properties": {
  281. "allowed_tools": {
  282. "items": {
  283. "type": "string",
  284. "examples": [
  285. "bash",
  286. "view"
  287. ]
  288. },
  289. "type": "array",
  290. "description": "List of tools that don't require permission prompts"
  291. }
  292. },
  293. "additionalProperties": false,
  294. "type": "object"
  295. },
  296. "ProviderConfig": {
  297. "properties": {
  298. "id": {
  299. "type": "string",
  300. "description": "Unique identifier for the provider",
  301. "examples": [
  302. "openai"
  303. ]
  304. },
  305. "name": {
  306. "type": "string",
  307. "description": "Human-readable name for the provider",
  308. "examples": [
  309. "OpenAI"
  310. ]
  311. },
  312. "base_url": {
  313. "type": "string",
  314. "format": "uri",
  315. "description": "Base URL for the provider's API",
  316. "examples": [
  317. "https://api.openai.com/v1"
  318. ]
  319. },
  320. "type": {
  321. "type": "string",
  322. "enum": [
  323. "openai",
  324. "anthropic",
  325. "gemini",
  326. "azure",
  327. "vertexai"
  328. ],
  329. "description": "Provider type that determines the API format",
  330. "default": "openai"
  331. },
  332. "api_key": {
  333. "type": "string",
  334. "description": "API key for authentication with the provider",
  335. "examples": [
  336. "$OPENAI_API_KEY"
  337. ]
  338. },
  339. "disable": {
  340. "type": "boolean",
  341. "description": "Whether this provider is disabled",
  342. "default": false
  343. },
  344. "system_prompt_prefix": {
  345. "type": "string",
  346. "description": "Custom prefix to add to system prompts for this provider"
  347. },
  348. "extra_headers": {
  349. "additionalProperties": {
  350. "type": "string"
  351. },
  352. "type": "object",
  353. "description": "Additional HTTP headers to send with requests"
  354. },
  355. "extra_body": {
  356. "type": "object",
  357. "description": "Additional fields to include in request bodies"
  358. },
  359. "models": {
  360. "items": {
  361. "$ref": "#/$defs/Model"
  362. },
  363. "type": "array",
  364. "description": "List of models available from this provider"
  365. }
  366. },
  367. "additionalProperties": false,
  368. "type": "object"
  369. },
  370. "SelectedModel": {
  371. "properties": {
  372. "model": {
  373. "type": "string",
  374. "description": "The model ID as used by the provider API",
  375. "examples": [
  376. "gpt-4o"
  377. ]
  378. },
  379. "provider": {
  380. "type": "string",
  381. "description": "The model provider ID that matches a key in the providers config",
  382. "examples": [
  383. "openai"
  384. ]
  385. },
  386. "reasoning_effort": {
  387. "type": "string",
  388. "enum": [
  389. "low",
  390. "medium",
  391. "high"
  392. ],
  393. "description": "Reasoning effort level for OpenAI models that support it"
  394. },
  395. "max_tokens": {
  396. "type": "integer",
  397. "maximum": 200000,
  398. "minimum": 1,
  399. "description": "Maximum number of tokens for model responses",
  400. "examples": [
  401. 4096
  402. ]
  403. },
  404. "think": {
  405. "type": "boolean",
  406. "description": "Enable thinking mode for Anthropic models that support reasoning"
  407. }
  408. },
  409. "additionalProperties": false,
  410. "type": "object",
  411. "required": [
  412. "model",
  413. "provider"
  414. ]
  415. },
  416. "TUIOptions": {
  417. "properties": {
  418. "compact_mode": {
  419. "type": "boolean",
  420. "description": "Enable compact mode for the TUI interface",
  421. "default": false
  422. },
  423. "diff_mode": {
  424. "type": "string",
  425. "enum": [
  426. "unified",
  427. "split"
  428. ],
  429. "description": "Diff mode for the TUI interface"
  430. }
  431. },
  432. "additionalProperties": false,
  433. "type": "object"
  434. }
  435. }
  436. }