schema.json 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641
  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. "Attribution": {
  7. "properties": {
  8. "co_authored_by": {
  9. "type": "boolean",
  10. "description": "Add Co-Authored-By trailer to commit messages",
  11. "default": true
  12. },
  13. "generated_with": {
  14. "type": "boolean",
  15. "description": "Add Generated with Crush line to commit messages and issues and PRs",
  16. "default": true
  17. }
  18. },
  19. "additionalProperties": false,
  20. "type": "object"
  21. },
  22. "Completions": {
  23. "properties": {
  24. "max_depth": {
  25. "type": "integer",
  26. "description": "Maximum depth for the ls tool",
  27. "default": 0,
  28. "examples": [
  29. 10
  30. ]
  31. },
  32. "max_items": {
  33. "type": "integer",
  34. "description": "Maximum number of items to return for the ls tool",
  35. "default": 1000,
  36. "examples": [
  37. 100
  38. ]
  39. }
  40. },
  41. "additionalProperties": false,
  42. "type": "object"
  43. },
  44. "Config": {
  45. "properties": {
  46. "$schema": {
  47. "type": "string"
  48. },
  49. "models": {
  50. "additionalProperties": {
  51. "$ref": "#/$defs/SelectedModel"
  52. },
  53. "type": "object",
  54. "description": "Model configurations for different model types"
  55. },
  56. "recent_models": {
  57. "additionalProperties": {
  58. "items": {
  59. "$ref": "#/$defs/SelectedModel"
  60. },
  61. "type": "array"
  62. },
  63. "type": "object",
  64. "description": "Recently used models sorted by most recent first"
  65. },
  66. "providers": {
  67. "additionalProperties": {
  68. "$ref": "#/$defs/ProviderConfig"
  69. },
  70. "type": "object",
  71. "description": "AI provider configurations"
  72. },
  73. "mcp": {
  74. "$ref": "#/$defs/MCPs",
  75. "description": "Model Context Protocol server configurations"
  76. },
  77. "lsp": {
  78. "$ref": "#/$defs/LSPs",
  79. "description": "Language Server Protocol configurations"
  80. },
  81. "options": {
  82. "$ref": "#/$defs/Options",
  83. "description": "General application options"
  84. },
  85. "permissions": {
  86. "$ref": "#/$defs/Permissions",
  87. "description": "Permission settings for tool usage"
  88. },
  89. "tools": {
  90. "$ref": "#/$defs/Tools",
  91. "description": "Tool configurations"
  92. }
  93. },
  94. "additionalProperties": false,
  95. "type": "object",
  96. "required": [
  97. "tools"
  98. ]
  99. },
  100. "LSPConfig": {
  101. "properties": {
  102. "disabled": {
  103. "type": "boolean",
  104. "description": "Whether this LSP server is disabled",
  105. "default": false
  106. },
  107. "command": {
  108. "type": "string",
  109. "description": "Command to execute for the LSP server",
  110. "examples": [
  111. "gopls"
  112. ]
  113. },
  114. "args": {
  115. "items": {
  116. "type": "string"
  117. },
  118. "type": "array",
  119. "description": "Arguments to pass to the LSP server command"
  120. },
  121. "env": {
  122. "additionalProperties": {
  123. "type": "string"
  124. },
  125. "type": "object",
  126. "description": "Environment variables to set to the LSP server command"
  127. },
  128. "filetypes": {
  129. "items": {
  130. "type": "string",
  131. "examples": [
  132. "go",
  133. "mod",
  134. "rs",
  135. "c",
  136. "js",
  137. "ts"
  138. ]
  139. },
  140. "type": "array",
  141. "description": "File types this LSP server handles"
  142. },
  143. "root_markers": {
  144. "items": {
  145. "type": "string",
  146. "examples": [
  147. "go.mod",
  148. "package.json",
  149. "Cargo.toml"
  150. ]
  151. },
  152. "type": "array",
  153. "description": "Files or directories that indicate the project root"
  154. },
  155. "init_options": {
  156. "type": "object",
  157. "description": "Initialization options passed to the LSP server during initialize request"
  158. },
  159. "options": {
  160. "type": "object",
  161. "description": "LSP server-specific settings passed during initialization"
  162. }
  163. },
  164. "additionalProperties": false,
  165. "type": "object",
  166. "required": [
  167. "command"
  168. ]
  169. },
  170. "LSPs": {
  171. "additionalProperties": {
  172. "$ref": "#/$defs/LSPConfig"
  173. },
  174. "type": "object"
  175. },
  176. "MCPConfig": {
  177. "properties": {
  178. "command": {
  179. "type": "string",
  180. "description": "Command to execute for stdio MCP servers",
  181. "examples": [
  182. "npx"
  183. ]
  184. },
  185. "env": {
  186. "additionalProperties": {
  187. "type": "string"
  188. },
  189. "type": "object",
  190. "description": "Environment variables to set for the MCP server"
  191. },
  192. "args": {
  193. "items": {
  194. "type": "string"
  195. },
  196. "type": "array",
  197. "description": "Arguments to pass to the MCP server command"
  198. },
  199. "type": {
  200. "type": "string",
  201. "enum": [
  202. "stdio",
  203. "sse",
  204. "http"
  205. ],
  206. "description": "Type of MCP connection",
  207. "default": "stdio"
  208. },
  209. "url": {
  210. "type": "string",
  211. "format": "uri",
  212. "description": "URL for HTTP or SSE MCP servers",
  213. "examples": [
  214. "http://localhost:3000/mcp"
  215. ]
  216. },
  217. "disabled": {
  218. "type": "boolean",
  219. "description": "Whether this MCP server is disabled",
  220. "default": false
  221. },
  222. "timeout": {
  223. "type": "integer",
  224. "description": "Timeout in seconds for MCP server connections",
  225. "default": 15,
  226. "examples": [
  227. 30,
  228. 60,
  229. 120
  230. ]
  231. },
  232. "headers": {
  233. "additionalProperties": {
  234. "type": "string"
  235. },
  236. "type": "object",
  237. "description": "HTTP headers for HTTP/SSE MCP servers"
  238. }
  239. },
  240. "additionalProperties": false,
  241. "type": "object",
  242. "required": [
  243. "type"
  244. ]
  245. },
  246. "MCPs": {
  247. "additionalProperties": {
  248. "$ref": "#/$defs/MCPConfig"
  249. },
  250. "type": "object"
  251. },
  252. "Model": {
  253. "properties": {
  254. "id": {
  255. "type": "string"
  256. },
  257. "name": {
  258. "type": "string"
  259. },
  260. "cost_per_1m_in": {
  261. "type": "number"
  262. },
  263. "cost_per_1m_out": {
  264. "type": "number"
  265. },
  266. "cost_per_1m_in_cached": {
  267. "type": "number"
  268. },
  269. "cost_per_1m_out_cached": {
  270. "type": "number"
  271. },
  272. "context_window": {
  273. "type": "integer"
  274. },
  275. "default_max_tokens": {
  276. "type": "integer"
  277. },
  278. "can_reason": {
  279. "type": "boolean"
  280. },
  281. "reasoning_levels": {
  282. "items": {
  283. "type": "string"
  284. },
  285. "type": "array"
  286. },
  287. "default_reasoning_effort": {
  288. "type": "string"
  289. },
  290. "supports_attachments": {
  291. "type": "boolean"
  292. },
  293. "options": {
  294. "$ref": "#/$defs/ModelOptions"
  295. }
  296. },
  297. "additionalProperties": false,
  298. "type": "object",
  299. "required": [
  300. "id",
  301. "name",
  302. "cost_per_1m_in",
  303. "cost_per_1m_out",
  304. "cost_per_1m_in_cached",
  305. "cost_per_1m_out_cached",
  306. "context_window",
  307. "default_max_tokens",
  308. "can_reason",
  309. "supports_attachments",
  310. "options"
  311. ]
  312. },
  313. "ModelOptions": {
  314. "properties": {
  315. "temperature": {
  316. "type": "number"
  317. },
  318. "top_p": {
  319. "type": "number"
  320. },
  321. "top_k": {
  322. "type": "integer"
  323. },
  324. "frequency_penalty": {
  325. "type": "number"
  326. },
  327. "presence_penalty": {
  328. "type": "number"
  329. },
  330. "provider_options": {
  331. "type": "object"
  332. }
  333. },
  334. "additionalProperties": false,
  335. "type": "object"
  336. },
  337. "Options": {
  338. "properties": {
  339. "context_paths": {
  340. "items": {
  341. "type": "string",
  342. "examples": [
  343. ".cursorrules",
  344. "CRUSH.md"
  345. ]
  346. },
  347. "type": "array",
  348. "description": "Paths to files containing context information for the AI"
  349. },
  350. "tui": {
  351. "$ref": "#/$defs/TUIOptions",
  352. "description": "Terminal user interface options"
  353. },
  354. "debug": {
  355. "type": "boolean",
  356. "description": "Enable debug logging",
  357. "default": false
  358. },
  359. "debug_lsp": {
  360. "type": "boolean",
  361. "description": "Enable debug logging for LSP servers",
  362. "default": false
  363. },
  364. "disable_auto_summarize": {
  365. "type": "boolean",
  366. "description": "Disable automatic conversation summarization",
  367. "default": false
  368. },
  369. "data_directory": {
  370. "type": "string",
  371. "description": "Directory for storing application data (relative to working directory)",
  372. "default": ".crush",
  373. "examples": [
  374. ".crush"
  375. ]
  376. },
  377. "disabled_tools": {
  378. "items": {
  379. "type": "string"
  380. },
  381. "type": "array",
  382. "description": "Tools to disable"
  383. },
  384. "disable_provider_auto_update": {
  385. "type": "boolean",
  386. "description": "Disable providers auto-update",
  387. "default": false
  388. },
  389. "attribution": {
  390. "$ref": "#/$defs/Attribution",
  391. "description": "Attribution settings for generated content"
  392. },
  393. "disable_metrics": {
  394. "type": "boolean",
  395. "description": "Disable sending metrics",
  396. "default": false
  397. }
  398. },
  399. "additionalProperties": false,
  400. "type": "object",
  401. "required": [
  402. "disabled_tools"
  403. ]
  404. },
  405. "Permissions": {
  406. "properties": {
  407. "allowed_tools": {
  408. "items": {
  409. "type": "string",
  410. "examples": [
  411. "bash",
  412. "view"
  413. ]
  414. },
  415. "type": "array",
  416. "description": "List of tools that don't require permission prompts"
  417. }
  418. },
  419. "additionalProperties": false,
  420. "type": "object"
  421. },
  422. "ProviderConfig": {
  423. "properties": {
  424. "id": {
  425. "type": "string",
  426. "description": "Unique identifier for the provider",
  427. "examples": [
  428. "openai"
  429. ]
  430. },
  431. "name": {
  432. "type": "string",
  433. "description": "Human-readable name for the provider",
  434. "examples": [
  435. "OpenAI"
  436. ]
  437. },
  438. "base_url": {
  439. "type": "string",
  440. "format": "uri",
  441. "description": "Base URL for the provider's API",
  442. "examples": [
  443. "https://api.openai.com/v1"
  444. ]
  445. },
  446. "type": {
  447. "type": "string",
  448. "enum": [
  449. "openai",
  450. "anthropic",
  451. "gemini",
  452. "azure",
  453. "vertexai"
  454. ],
  455. "description": "Provider type that determines the API format",
  456. "default": "openai"
  457. },
  458. "api_key": {
  459. "type": "string",
  460. "description": "API key for authentication with the provider",
  461. "examples": [
  462. "$OPENAI_API_KEY"
  463. ]
  464. },
  465. "disable": {
  466. "type": "boolean",
  467. "description": "Whether this provider is disabled",
  468. "default": false
  469. },
  470. "system_prompt_prefix": {
  471. "type": "string",
  472. "description": "Custom prefix to add to system prompts for this provider"
  473. },
  474. "extra_headers": {
  475. "additionalProperties": {
  476. "type": "string"
  477. },
  478. "type": "object",
  479. "description": "Additional HTTP headers to send with requests"
  480. },
  481. "extra_body": {
  482. "type": "object",
  483. "description": "Additional fields to include in request bodies"
  484. },
  485. "provider_options": {
  486. "type": "object",
  487. "description": "Additional provider-specific options for this provider"
  488. },
  489. "models": {
  490. "items": {
  491. "$ref": "#/$defs/Model"
  492. },
  493. "type": "array",
  494. "description": "List of models available from this provider"
  495. }
  496. },
  497. "additionalProperties": false,
  498. "type": "object"
  499. },
  500. "SelectedModel": {
  501. "properties": {
  502. "model": {
  503. "type": "string",
  504. "description": "The model ID as used by the provider API",
  505. "examples": [
  506. "gpt-4o"
  507. ]
  508. },
  509. "provider": {
  510. "type": "string",
  511. "description": "The model provider ID that matches a key in the providers config",
  512. "examples": [
  513. "openai"
  514. ]
  515. },
  516. "reasoning_effort": {
  517. "type": "string",
  518. "enum": [
  519. "low",
  520. "medium",
  521. "high"
  522. ],
  523. "description": "Reasoning effort level for OpenAI models that support it"
  524. },
  525. "think": {
  526. "type": "boolean",
  527. "description": "Enable thinking mode for Anthropic models that support reasoning"
  528. },
  529. "max_tokens": {
  530. "type": "integer",
  531. "maximum": 200000,
  532. "minimum": 1,
  533. "description": "Maximum number of tokens for model responses",
  534. "examples": [
  535. 4096
  536. ]
  537. },
  538. "temperature": {
  539. "type": "number",
  540. "maximum": 1,
  541. "minimum": 0,
  542. "description": "Sampling temperature",
  543. "examples": [
  544. 0.7
  545. ]
  546. },
  547. "top_p": {
  548. "type": "number",
  549. "maximum": 1,
  550. "minimum": 0,
  551. "description": "Top-p (nucleus) sampling parameter",
  552. "examples": [
  553. 0.9
  554. ]
  555. },
  556. "top_k": {
  557. "type": "integer",
  558. "description": "Top-k sampling parameter"
  559. },
  560. "frequency_penalty": {
  561. "type": "number",
  562. "description": "Frequency penalty to reduce repetition"
  563. },
  564. "presence_penalty": {
  565. "type": "number",
  566. "description": "Presence penalty to increase topic diversity"
  567. },
  568. "provider_options": {
  569. "type": "object",
  570. "description": "Additional provider-specific options for the model"
  571. }
  572. },
  573. "additionalProperties": false,
  574. "type": "object",
  575. "required": [
  576. "model",
  577. "provider"
  578. ]
  579. },
  580. "TUIOptions": {
  581. "properties": {
  582. "compact_mode": {
  583. "type": "boolean",
  584. "description": "Enable compact mode for the TUI interface",
  585. "default": false
  586. },
  587. "diff_mode": {
  588. "type": "string",
  589. "enum": [
  590. "unified",
  591. "split"
  592. ],
  593. "description": "Diff mode for the TUI interface"
  594. },
  595. "completions": {
  596. "$ref": "#/$defs/Completions",
  597. "description": "Completions UI options"
  598. }
  599. },
  600. "additionalProperties": false,
  601. "type": "object",
  602. "required": [
  603. "completions"
  604. ]
  605. },
  606. "ToolLs": {
  607. "properties": {
  608. "max_depth": {
  609. "type": "integer",
  610. "description": "Maximum depth for the ls tool",
  611. "default": 0,
  612. "examples": [
  613. 10
  614. ]
  615. },
  616. "max_items": {
  617. "type": "integer",
  618. "description": "Maximum number of items to return for the ls tool",
  619. "default": 1000,
  620. "examples": [
  621. 100
  622. ]
  623. }
  624. },
  625. "additionalProperties": false,
  626. "type": "object"
  627. },
  628. "Tools": {
  629. "properties": {
  630. "ls": {
  631. "$ref": "#/$defs/ToolLs"
  632. }
  633. },
  634. "additionalProperties": false,
  635. "type": "object",
  636. "required": [
  637. "ls"
  638. ]
  639. }
  640. }
  641. }