@butlerw/vellum 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 (446) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +411 -0
  3. package/__fixtures__/responses/code-generation.json +42 -0
  4. package/__fixtures__/responses/error-response.json +20 -0
  5. package/__fixtures__/responses/hello-world.json +32 -0
  6. package/dist/auth-6MCXESOH.js +26 -0
  7. package/dist/chunk-SECXJGWA.js +597 -0
  8. package/dist/index.js +34023 -0
  9. package/package.json +67 -0
  10. package/src/__tests__/commands.e2e.test.ts +728 -0
  11. package/src/__tests__/credentials.test.ts +713 -0
  12. package/src/__tests__/mode-e2e.test.ts +391 -0
  13. package/src/__tests__/tui-integration.test.tsx +1271 -0
  14. package/src/agents/__tests__/task-persistence.test.ts +235 -0
  15. package/src/agents/commands/delegate.ts +240 -0
  16. package/src/agents/commands/index.ts +10 -0
  17. package/src/agents/commands/resume.ts +335 -0
  18. package/src/agents/index.ts +29 -0
  19. package/src/agents/task-persistence.ts +272 -0
  20. package/src/agents/task-resumption.ts +242 -0
  21. package/src/app.tsx +4737 -0
  22. package/src/commands/__tests__/.gitkeep +1 -0
  23. package/src/commands/__tests__/agents.test.ts +606 -0
  24. package/src/commands/__tests__/auth.test.ts +626 -0
  25. package/src/commands/__tests__/autocomplete.test.ts +683 -0
  26. package/src/commands/__tests__/batch.test.ts +287 -0
  27. package/src/commands/__tests__/chain-pipe-parser.test.ts +654 -0
  28. package/src/commands/__tests__/completion.test.ts +238 -0
  29. package/src/commands/__tests__/core.test.ts +363 -0
  30. package/src/commands/__tests__/executor.test.ts +496 -0
  31. package/src/commands/__tests__/exit-codes.test.ts +220 -0
  32. package/src/commands/__tests__/init.test.ts +243 -0
  33. package/src/commands/__tests__/language.test.ts +353 -0
  34. package/src/commands/__tests__/mode-cli.test.ts +667 -0
  35. package/src/commands/__tests__/model.test.ts +277 -0
  36. package/src/commands/__tests__/parser.test.ts +493 -0
  37. package/src/commands/__tests__/performance.bench.ts +380 -0
  38. package/src/commands/__tests__/registry.test.ts +534 -0
  39. package/src/commands/__tests__/resume.test.ts +449 -0
  40. package/src/commands/__tests__/security.test.ts +845 -0
  41. package/src/commands/__tests__/stream-json.test.ts +372 -0
  42. package/src/commands/__tests__/user-commands.test.ts +597 -0
  43. package/src/commands/adapters.ts +267 -0
  44. package/src/commands/agent.ts +395 -0
  45. package/src/commands/agents/generate.ts +506 -0
  46. package/src/commands/agents/index.ts +272 -0
  47. package/src/commands/agents/show.ts +271 -0
  48. package/src/commands/agents/validate.ts +387 -0
  49. package/src/commands/auth.ts +883 -0
  50. package/src/commands/autocomplete.ts +480 -0
  51. package/src/commands/batch/command.ts +388 -0
  52. package/src/commands/batch/executor.ts +361 -0
  53. package/src/commands/batch/index.ts +12 -0
  54. package/src/commands/commit.ts +235 -0
  55. package/src/commands/completion/index.ts +371 -0
  56. package/src/commands/condense.ts +191 -0
  57. package/src/commands/config.ts +344 -0
  58. package/src/commands/context-provider.ts +173 -0
  59. package/src/commands/copy.ts +329 -0
  60. package/src/commands/core/clear.ts +38 -0
  61. package/src/commands/core/exit.ts +43 -0
  62. package/src/commands/core/help.ts +354 -0
  63. package/src/commands/core/index.ts +15 -0
  64. package/src/commands/cost.ts +179 -0
  65. package/src/commands/credentials.tsx +618 -0
  66. package/src/commands/custom-agents/__tests__/custom-agents.test.ts +709 -0
  67. package/src/commands/custom-agents/create.ts +377 -0
  68. package/src/commands/custom-agents/export.ts +135 -0
  69. package/src/commands/custom-agents/import.ts +199 -0
  70. package/src/commands/custom-agents/index.ts +372 -0
  71. package/src/commands/custom-agents/info.ts +318 -0
  72. package/src/commands/custom-agents/list.ts +267 -0
  73. package/src/commands/custom-agents/validate.ts +388 -0
  74. package/src/commands/diff-mode.ts +241 -0
  75. package/src/commands/env.ts +53 -0
  76. package/src/commands/executor.ts +579 -0
  77. package/src/commands/exit-codes.ts +202 -0
  78. package/src/commands/index.ts +701 -0
  79. package/src/commands/init/index.ts +15 -0
  80. package/src/commands/init/prompts.ts +366 -0
  81. package/src/commands/init/templates/commands-readme.md +80 -0
  82. package/src/commands/init/templates/example-command.md +79 -0
  83. package/src/commands/init/templates/example-skill.md +168 -0
  84. package/src/commands/init/templates/example-workflow.md +101 -0
  85. package/src/commands/init/templates/prompts-readme.md +52 -0
  86. package/src/commands/init/templates/rules-readme.md +63 -0
  87. package/src/commands/init/templates/skills-readme.md +83 -0
  88. package/src/commands/init/templates/workflows-readme.md +94 -0
  89. package/src/commands/init.ts +391 -0
  90. package/src/commands/install.ts +90 -0
  91. package/src/commands/language.ts +191 -0
  92. package/src/commands/loaders/.gitkeep +1 -0
  93. package/src/commands/lsp.ts +199 -0
  94. package/src/commands/markdown-commands.ts +253 -0
  95. package/src/commands/mcp.ts +588 -0
  96. package/src/commands/memory/export.ts +341 -0
  97. package/src/commands/memory/index.ts +148 -0
  98. package/src/commands/memory/list.ts +261 -0
  99. package/src/commands/memory/search.ts +346 -0
  100. package/src/commands/memory/utils.ts +15 -0
  101. package/src/commands/metrics.ts +75 -0
  102. package/src/commands/migrate/index.ts +16 -0
  103. package/src/commands/migrate/prompts.ts +477 -0
  104. package/src/commands/mode.ts +331 -0
  105. package/src/commands/model.ts +298 -0
  106. package/src/commands/onboard.ts +205 -0
  107. package/src/commands/open.ts +169 -0
  108. package/src/commands/output/stream-json.ts +373 -0
  109. package/src/commands/parser/chain-parser.ts +370 -0
  110. package/src/commands/parser/index.ts +29 -0
  111. package/src/commands/parser/pipe-parser.ts +480 -0
  112. package/src/commands/parser.ts +588 -0
  113. package/src/commands/persistence.ts +355 -0
  114. package/src/commands/progress.ts +18 -0
  115. package/src/commands/prompt/index.ts +17 -0
  116. package/src/commands/prompt/validate.ts +621 -0
  117. package/src/commands/prompt-priority.ts +401 -0
  118. package/src/commands/registry.ts +374 -0
  119. package/src/commands/sandbox/index.ts +131 -0
  120. package/src/commands/security/index.ts +21 -0
  121. package/src/commands/security/input-sanitizer.ts +168 -0
  122. package/src/commands/security/permission-checker.ts +456 -0
  123. package/src/commands/security/sensitive-data.ts +350 -0
  124. package/src/commands/session/delete.ts +38 -0
  125. package/src/commands/session/export.ts +39 -0
  126. package/src/commands/session/index.ts +26 -0
  127. package/src/commands/session/list.ts +26 -0
  128. package/src/commands/session/resume.ts +562 -0
  129. package/src/commands/session/search.ts +434 -0
  130. package/src/commands/session/show.ts +26 -0
  131. package/src/commands/settings.ts +368 -0
  132. package/src/commands/setup.ts +23 -0
  133. package/src/commands/shell/index.ts +16 -0
  134. package/src/commands/shell/setup.ts +422 -0
  135. package/src/commands/shell-init.ts +50 -0
  136. package/src/commands/shell-integration/index.ts +194 -0
  137. package/src/commands/skill.ts +1220 -0
  138. package/src/commands/spec.ts +558 -0
  139. package/src/commands/status.ts +246 -0
  140. package/src/commands/theme.ts +211 -0
  141. package/src/commands/think.ts +551 -0
  142. package/src/commands/trust.ts +211 -0
  143. package/src/commands/tutorial.ts +522 -0
  144. package/src/commands/types.ts +512 -0
  145. package/src/commands/update.ts +274 -0
  146. package/src/commands/usage.ts +213 -0
  147. package/src/commands/user-commands.ts +630 -0
  148. package/src/commands/utils.ts +142 -0
  149. package/src/commands/vim.ts +152 -0
  150. package/src/commands/workflow.ts +257 -0
  151. package/src/components/header.tsx +25 -0
  152. package/src/components/input.tsx +25 -0
  153. package/src/components/message-list.tsx +32 -0
  154. package/src/components/status-bar.tsx +23 -0
  155. package/src/index.tsx +614 -0
  156. package/src/onboarding/__tests__/tutorial.test.ts +740 -0
  157. package/src/onboarding/index.ts +69 -0
  158. package/src/onboarding/tips/index.ts +9 -0
  159. package/src/onboarding/tips/tip-engine.ts +459 -0
  160. package/src/onboarding/tutorial/index.ts +88 -0
  161. package/src/onboarding/tutorial/lessons/basics.ts +151 -0
  162. package/src/onboarding/tutorial/lessons/index.ts +151 -0
  163. package/src/onboarding/tutorial/lessons/modes.ts +230 -0
  164. package/src/onboarding/tutorial/lessons/tools.ts +172 -0
  165. package/src/onboarding/tutorial/progress-tracker.ts +350 -0
  166. package/src/onboarding/tutorial/storage.ts +249 -0
  167. package/src/onboarding/tutorial/tutorial-system.ts +462 -0
  168. package/src/onboarding/tutorial/types.ts +310 -0
  169. package/src/orchestrator-singleton.ts +129 -0
  170. package/src/shutdown.ts +33 -0
  171. package/src/test/e2e/assertions.ts +267 -0
  172. package/src/test/e2e/fixtures.ts +204 -0
  173. package/src/test/e2e/harness.ts +575 -0
  174. package/src/test/e2e/index.ts +57 -0
  175. package/src/test/e2e/types.ts +228 -0
  176. package/src/test/fixtures/__tests__/fake-response-loader.test.ts +314 -0
  177. package/src/test/fixtures/fake-response-loader.ts +314 -0
  178. package/src/test/fixtures/index.ts +20 -0
  179. package/src/tui/__tests__/mcp-panel.test.tsx +82 -0
  180. package/src/tui/__tests__/mcp-wiring.test.tsx +78 -0
  181. package/src/tui/__tests__/mode-components.test.tsx +395 -0
  182. package/src/tui/__tests__/permission-ask-flow.test.tsx +138 -0
  183. package/src/tui/__tests__/sidebar-panel-data.test.tsx +148 -0
  184. package/src/tui/__tests__/tools-panel-hotkeys.test.tsx +41 -0
  185. package/src/tui/adapters/agent-adapter.ts +1008 -0
  186. package/src/tui/adapters/index.ts +48 -0
  187. package/src/tui/adapters/message-adapter.ts +315 -0
  188. package/src/tui/adapters/persistence-bridge.ts +331 -0
  189. package/src/tui/adapters/session-adapter.ts +419 -0
  190. package/src/tui/buffered-stdout.ts +223 -0
  191. package/src/tui/components/AgentProgress.tsx +424 -0
  192. package/src/tui/components/Banner/AsciiArt.ts +160 -0
  193. package/src/tui/components/Banner/Banner.tsx +355 -0
  194. package/src/tui/components/Banner/ShimmerContext.tsx +131 -0
  195. package/src/tui/components/Banner/ShimmerText.tsx +193 -0
  196. package/src/tui/components/Banner/TypeWriterGradient.tsx +321 -0
  197. package/src/tui/components/Banner/index.ts +61 -0
  198. package/src/tui/components/Banner/useShimmer.ts +241 -0
  199. package/src/tui/components/ChatView.tsx +11 -0
  200. package/src/tui/components/Checkpoint/CheckpointDiffView.tsx +371 -0
  201. package/src/tui/components/Checkpoint/SnapshotCheckpointPanel.tsx +440 -0
  202. package/src/tui/components/Checkpoint/index.ts +19 -0
  203. package/src/tui/components/CostDisplay.tsx +226 -0
  204. package/src/tui/components/InitErrorBanner.tsx +122 -0
  205. package/src/tui/components/Input/Autocomplete.tsx +603 -0
  206. package/src/tui/components/Input/EnhancedCommandInput.tsx +471 -0
  207. package/src/tui/components/Input/HighlightedText.tsx +236 -0
  208. package/src/tui/components/Input/MentionAutocomplete.tsx +375 -0
  209. package/src/tui/components/Input/TextInput.tsx +1002 -0
  210. package/src/tui/components/Input/__tests__/Autocomplete.test.tsx +374 -0
  211. package/src/tui/components/Input/__tests__/TextInput.test.tsx +241 -0
  212. package/src/tui/components/Input/__tests__/highlight.test.ts +219 -0
  213. package/src/tui/components/Input/__tests__/slash-command-utils.test.ts +104 -0
  214. package/src/tui/components/Input/highlight.ts +362 -0
  215. package/src/tui/components/Input/index.ts +36 -0
  216. package/src/tui/components/Input/slash-command-utils.ts +135 -0
  217. package/src/tui/components/Layout.tsx +432 -0
  218. package/src/tui/components/McpPanel.tsx +137 -0
  219. package/src/tui/components/MemoryPanel.tsx +448 -0
  220. package/src/tui/components/Messages/CodeBlock.tsx +527 -0
  221. package/src/tui/components/Messages/DiffView.tsx +679 -0
  222. package/src/tui/components/Messages/ImageReference.tsx +89 -0
  223. package/src/tui/components/Messages/MarkdownBlock.tsx +228 -0
  224. package/src/tui/components/Messages/MarkdownRenderer.tsx +498 -0
  225. package/src/tui/components/Messages/MessageBubble.tsx +270 -0
  226. package/src/tui/components/Messages/MessageList.tsx +1719 -0
  227. package/src/tui/components/Messages/StreamingText.tsx +216 -0
  228. package/src/tui/components/Messages/ThinkingBlock.tsx +408 -0
  229. package/src/tui/components/Messages/ToolResultPreview.tsx +243 -0
  230. package/src/tui/components/Messages/__tests__/CodeBlock.test.tsx +296 -0
  231. package/src/tui/components/Messages/__tests__/DiffView.test.tsx +239 -0
  232. package/src/tui/components/Messages/__tests__/MarkdownRenderer.test.tsx +303 -0
  233. package/src/tui/components/Messages/__tests__/MessageBubble.test.tsx +268 -0
  234. package/src/tui/components/Messages/__tests__/MessageList.test.tsx +324 -0
  235. package/src/tui/components/Messages/__tests__/StreamingText.test.tsx +215 -0
  236. package/src/tui/components/Messages/index.ts +25 -0
  237. package/src/tui/components/ModeIndicator.tsx +177 -0
  238. package/src/tui/components/ModeSelector.tsx +216 -0
  239. package/src/tui/components/ModelSelector.tsx +339 -0
  240. package/src/tui/components/OnboardingWizard.tsx +670 -0
  241. package/src/tui/components/PhaseProgressIndicator.tsx +270 -0
  242. package/src/tui/components/RateLimitIndicator.tsx +82 -0
  243. package/src/tui/components/ScreenReaderLayout.tsx +295 -0
  244. package/src/tui/components/SettingsPanel.tsx +643 -0
  245. package/src/tui/components/Sidebar/SystemStatusPanel.tsx +284 -0
  246. package/src/tui/components/Sidebar/index.ts +9 -0
  247. package/src/tui/components/Status/ModelStatusBar.tsx +270 -0
  248. package/src/tui/components/Status/index.ts +12 -0
  249. package/src/tui/components/StatusBar/AgentModeIndicator.tsx +257 -0
  250. package/src/tui/components/StatusBar/ContextProgress.tsx +167 -0
  251. package/src/tui/components/StatusBar/FileChangesIndicator.tsx +62 -0
  252. package/src/tui/components/StatusBar/GitIndicator.tsx +89 -0
  253. package/src/tui/components/StatusBar/HeaderBar.tsx +126 -0
  254. package/src/tui/components/StatusBar/ModelIndicator.tsx +157 -0
  255. package/src/tui/components/StatusBar/PersistenceStatusIndicator.tsx +210 -0
  256. package/src/tui/components/StatusBar/ResilienceIndicator.tsx +106 -0
  257. package/src/tui/components/StatusBar/SandboxIndicator.tsx +167 -0
  258. package/src/tui/components/StatusBar/StatusBar.tsx +368 -0
  259. package/src/tui/components/StatusBar/ThinkingModeIndicator.tsx +170 -0
  260. package/src/tui/components/StatusBar/TokenBreakdown.tsx +246 -0
  261. package/src/tui/components/StatusBar/TokenCounter.tsx +135 -0
  262. package/src/tui/components/StatusBar/TrustModeIndicator.tsx +130 -0
  263. package/src/tui/components/StatusBar/WorkspaceIndicator.tsx +86 -0
  264. package/src/tui/components/StatusBar/__tests__/AgentModeIndicator.test.tsx +193 -0
  265. package/src/tui/components/StatusBar/__tests__/StatusBar.test.tsx +729 -0
  266. package/src/tui/components/StatusBar/index.ts +60 -0
  267. package/src/tui/components/TipBanner.tsx +115 -0
  268. package/src/tui/components/TodoItem.tsx +208 -0
  269. package/src/tui/components/TodoPanel.tsx +455 -0
  270. package/src/tui/components/Tools/ApprovalQueue.tsx +407 -0
  271. package/src/tui/components/Tools/OptionSelector.tsx +160 -0
  272. package/src/tui/components/Tools/PermissionDialog.tsx +286 -0
  273. package/src/tui/components/Tools/ToolParams.tsx +483 -0
  274. package/src/tui/components/Tools/ToolsPanel.tsx +178 -0
  275. package/src/tui/components/Tools/__tests__/PermissionDialog.test.tsx +510 -0
  276. package/src/tui/components/Tools/__tests__/ToolParams.test.tsx +432 -0
  277. package/src/tui/components/Tools/index.ts +21 -0
  278. package/src/tui/components/TrustPrompt.tsx +279 -0
  279. package/src/tui/components/UpdateBanner.tsx +166 -0
  280. package/src/tui/components/VimModeIndicator.tsx +112 -0
  281. package/src/tui/components/backtrack/BacktrackControls.tsx +402 -0
  282. package/src/tui/components/backtrack/index.ts +13 -0
  283. package/src/tui/components/common/AutoApprovalStatus.tsx +251 -0
  284. package/src/tui/components/common/CostWarning.tsx +294 -0
  285. package/src/tui/components/common/DynamicShortcutHints.tsx +209 -0
  286. package/src/tui/components/common/EnhancedLoadingIndicator.tsx +305 -0
  287. package/src/tui/components/common/ErrorBoundary.tsx +140 -0
  288. package/src/tui/components/common/GradientText.tsx +224 -0
  289. package/src/tui/components/common/HotkeyHelpModal.tsx +193 -0
  290. package/src/tui/components/common/HotkeyHints.tsx +70 -0
  291. package/src/tui/components/common/MaxSizedBox.tsx +354 -0
  292. package/src/tui/components/common/NewMessagesBadge.tsx +65 -0
  293. package/src/tui/components/common/ProtectedFileLegend.tsx +89 -0
  294. package/src/tui/components/common/ScrollIndicator.tsx +160 -0
  295. package/src/tui/components/common/Spinner.tsx +342 -0
  296. package/src/tui/components/common/StreamingIndicator.tsx +316 -0
  297. package/src/tui/components/common/VirtualizedList/VirtualizedList.tsx +428 -0
  298. package/src/tui/components/common/VirtualizedList/hooks/index.ts +19 -0
  299. package/src/tui/components/common/VirtualizedList/hooks/useBatchedScroll.ts +64 -0
  300. package/src/tui/components/common/VirtualizedList/hooks/useScrollAnchor.ts +290 -0
  301. package/src/tui/components/common/VirtualizedList/hooks/useVirtualization.ts +340 -0
  302. package/src/tui/components/common/VirtualizedList/index.ts +30 -0
  303. package/src/tui/components/common/VirtualizedList/types.ts +107 -0
  304. package/src/tui/components/common/__tests__/NewMessagesBadge.test.tsx +74 -0
  305. package/src/tui/components/common/__tests__/ScrollIndicator.test.tsx +193 -0
  306. package/src/tui/components/common/index.ts +110 -0
  307. package/src/tui/components/index.ts +79 -0
  308. package/src/tui/components/session/CheckpointPanel.tsx +323 -0
  309. package/src/tui/components/session/RollbackDialog.tsx +169 -0
  310. package/src/tui/components/session/SessionItem.tsx +136 -0
  311. package/src/tui/components/session/SessionListPanel.tsx +252 -0
  312. package/src/tui/components/session/SessionPicker.tsx +449 -0
  313. package/src/tui/components/session/SessionPreview.tsx +240 -0
  314. package/src/tui/components/session/__tests__/session.test.tsx +408 -0
  315. package/src/tui/components/session/index.ts +28 -0
  316. package/src/tui/components/session/types.ts +116 -0
  317. package/src/tui/components/theme/__tests__/tokens.test.ts +471 -0
  318. package/src/tui/components/theme/index.ts +227 -0
  319. package/src/tui/components/theme/tokens.ts +484 -0
  320. package/src/tui/config/defaults.ts +134 -0
  321. package/src/tui/config/index.ts +17 -0
  322. package/src/tui/context/AnimationContext.tsx +284 -0
  323. package/src/tui/context/AppContext.tsx +349 -0
  324. package/src/tui/context/BracketedPasteContext.tsx +372 -0
  325. package/src/tui/context/LspContext.tsx +192 -0
  326. package/src/tui/context/McpContext.tsx +325 -0
  327. package/src/tui/context/MessagesContext.tsx +870 -0
  328. package/src/tui/context/OverflowContext.tsx +213 -0
  329. package/src/tui/context/RateLimitContext.tsx +108 -0
  330. package/src/tui/context/ResilienceContext.tsx +275 -0
  331. package/src/tui/context/RootProvider.tsx +136 -0
  332. package/src/tui/context/ScrollContext.tsx +331 -0
  333. package/src/tui/context/ToolsContext.tsx +702 -0
  334. package/src/tui/context/__tests__/BracketedPasteContext.test.tsx +416 -0
  335. package/src/tui/context/index.ts +140 -0
  336. package/src/tui/enterprise-integration.ts +282 -0
  337. package/src/tui/hooks/__tests__/useBacktrack.test.tsx +138 -0
  338. package/src/tui/hooks/__tests__/useBracketedPaste.test.tsx +222 -0
  339. package/src/tui/hooks/__tests__/useCopyMode.test.tsx +336 -0
  340. package/src/tui/hooks/__tests__/useHotkeys.ctrl-input.test.tsx +96 -0
  341. package/src/tui/hooks/__tests__/useHotkeys.test.tsx +454 -0
  342. package/src/tui/hooks/__tests__/useInputHistory.test.tsx +660 -0
  343. package/src/tui/hooks/__tests__/useLineBuffer.test.ts +295 -0
  344. package/src/tui/hooks/__tests__/useModeController.test.ts +137 -0
  345. package/src/tui/hooks/__tests__/useModeShortcuts.test.tsx +142 -0
  346. package/src/tui/hooks/__tests__/useScrollController.test.ts +464 -0
  347. package/src/tui/hooks/__tests__/useVim.test.tsx +531 -0
  348. package/src/tui/hooks/index.ts +252 -0
  349. package/src/tui/hooks/useAgentLoop.ts +712 -0
  350. package/src/tui/hooks/useAlternateBuffer.ts +398 -0
  351. package/src/tui/hooks/useAnimatedScrollbar.ts +241 -0
  352. package/src/tui/hooks/useBacktrack.ts +443 -0
  353. package/src/tui/hooks/useBracketedPaste.ts +104 -0
  354. package/src/tui/hooks/useCollapsible.ts +240 -0
  355. package/src/tui/hooks/useCopyMode.ts +382 -0
  356. package/src/tui/hooks/useCostSummary.ts +75 -0
  357. package/src/tui/hooks/useDesktopNotification.ts +414 -0
  358. package/src/tui/hooks/useDiffMode.ts +44 -0
  359. package/src/tui/hooks/useFileChangeStats.ts +110 -0
  360. package/src/tui/hooks/useFileSuggestions.ts +284 -0
  361. package/src/tui/hooks/useFlickerDetector.ts +250 -0
  362. package/src/tui/hooks/useGitStatus.ts +200 -0
  363. package/src/tui/hooks/useHotkeys.ts +579 -0
  364. package/src/tui/hooks/useImagePaste.ts +114 -0
  365. package/src/tui/hooks/useInputHighlight.ts +145 -0
  366. package/src/tui/hooks/useInputHistory.ts +246 -0
  367. package/src/tui/hooks/useKeyboardScroll.ts +209 -0
  368. package/src/tui/hooks/useLineBuffer.ts +356 -0
  369. package/src/tui/hooks/useMentionAutocomplete.ts +235 -0
  370. package/src/tui/hooks/useModeController.ts +167 -0
  371. package/src/tui/hooks/useModeShortcuts.ts +196 -0
  372. package/src/tui/hooks/usePermissionHandler.ts +146 -0
  373. package/src/tui/hooks/usePersistence.ts +480 -0
  374. package/src/tui/hooks/usePersistenceShortcuts.ts +225 -0
  375. package/src/tui/hooks/usePlaceholderRotation.ts +143 -0
  376. package/src/tui/hooks/useProviderStatus.ts +270 -0
  377. package/src/tui/hooks/useRateLimitStatus.ts +90 -0
  378. package/src/tui/hooks/useScreenReader.ts +315 -0
  379. package/src/tui/hooks/useScrollController.ts +450 -0
  380. package/src/tui/hooks/useScrollEventBatcher.ts +185 -0
  381. package/src/tui/hooks/useSidebarPanelData.ts +115 -0
  382. package/src/tui/hooks/useSmoothScroll.ts +202 -0
  383. package/src/tui/hooks/useSnapshots.ts +300 -0
  384. package/src/tui/hooks/useStateAndRef.ts +50 -0
  385. package/src/tui/hooks/useTerminalSize.ts +206 -0
  386. package/src/tui/hooks/useToolApprovalController.ts +91 -0
  387. package/src/tui/hooks/useVim.ts +334 -0
  388. package/src/tui/hooks/useWorkspace.ts +56 -0
  389. package/src/tui/i18n/__tests__/init.test.ts +278 -0
  390. package/src/tui/i18n/__tests__/language-config.test.ts +199 -0
  391. package/src/tui/i18n/__tests__/locale-detection.test.ts +250 -0
  392. package/src/tui/i18n/__tests__/settings-integration.test.ts +262 -0
  393. package/src/tui/i18n/index.ts +72 -0
  394. package/src/tui/i18n/init.ts +131 -0
  395. package/src/tui/i18n/language-config.ts +106 -0
  396. package/src/tui/i18n/locale-detection.ts +173 -0
  397. package/src/tui/i18n/settings-integration.ts +557 -0
  398. package/src/tui/i18n/tui-namespace.ts +538 -0
  399. package/src/tui/i18n/types.ts +312 -0
  400. package/src/tui/index.ts +43 -0
  401. package/src/tui/lsp-integration.ts +409 -0
  402. package/src/tui/metrics-integration.ts +366 -0
  403. package/src/tui/plugins.ts +383 -0
  404. package/src/tui/resilience.ts +342 -0
  405. package/src/tui/sandbox-integration.ts +317 -0
  406. package/src/tui/services/clipboard.ts +348 -0
  407. package/src/tui/services/fuzzy-search.ts +441 -0
  408. package/src/tui/services/index.ts +72 -0
  409. package/src/tui/services/markdown-renderer.ts +565 -0
  410. package/src/tui/services/open-external.ts +247 -0
  411. package/src/tui/services/syntax-highlighter.ts +483 -0
  412. package/src/tui/slash-commands.ts +12 -0
  413. package/src/tui/theme/index.ts +15 -0
  414. package/src/tui/theme/provider.tsx +206 -0
  415. package/src/tui/tip-integration.ts +300 -0
  416. package/src/tui/types/__tests__/ink-extended.test.ts +121 -0
  417. package/src/tui/types/ink-extended.ts +87 -0
  418. package/src/tui/utils/__tests__/bracketedPaste.test.ts +231 -0
  419. package/src/tui/utils/__tests__/heightEstimator.test.ts +157 -0
  420. package/src/tui/utils/__tests__/text-width.test.ts +158 -0
  421. package/src/tui/utils/__tests__/textSanitizer.test.ts +266 -0
  422. package/src/tui/utils/__tests__/ui-sizing.test.ts +169 -0
  423. package/src/tui/utils/bracketedPaste.ts +107 -0
  424. package/src/tui/utils/cursor-manager.ts +131 -0
  425. package/src/tui/utils/detectTerminal.ts +596 -0
  426. package/src/tui/utils/findLastSafeSplitPoint.ts +92 -0
  427. package/src/tui/utils/heightEstimator.ts +198 -0
  428. package/src/tui/utils/index.ts +91 -0
  429. package/src/tui/utils/isNarrowWidth.ts +52 -0
  430. package/src/tui/utils/stdoutGuard.ts +90 -0
  431. package/src/tui/utils/synchronized-update.ts +70 -0
  432. package/src/tui/utils/text-width.ts +225 -0
  433. package/src/tui/utils/textSanitizer.ts +225 -0
  434. package/src/tui/utils/textUtils.ts +114 -0
  435. package/src/tui/utils/ui-sizing.ts +192 -0
  436. package/src/tui-blessed/app.ts +160 -0
  437. package/src/tui-blessed/index.ts +2 -0
  438. package/src/tui-blessed/neo-blessed.d.ts +6 -0
  439. package/src/tui-blessed/test.ts +21 -0
  440. package/src/tui-blessed/types.ts +14 -0
  441. package/src/utils/icons.ts +130 -0
  442. package/src/utils/index.ts +33 -0
  443. package/src/utils/resume-hint.ts +86 -0
  444. package/src/version.ts +1 -0
  445. package/tsconfig.json +8 -0
  446. package/vitest.config.ts +35 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Vellum Team
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,411 @@
1
+ # @vellum/cli
2
+
3
+ > Command-line interface for the Vellum AI coding agent
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ pnpm add @vellum/cli
9
+ ```markdown
10
+
11
+ ## Usage
12
+
13
+ ```bash
14
+ # Start interactive mode
15
+ vellum
16
+
17
+ # Run with a specific prompt
18
+ vellum "Create a React component"
19
+
20
+ # Run with a configuration file
21
+ vellum --config vellum.config.json
22
+ ```markdown
23
+
24
+ ## TUI System
25
+
26
+ The CLI provides a rich Terminal User Interface (TUI) built with React Ink. The TUI system is modular and customizable.
27
+
28
+ ### Architecture
29
+
30
+ ```
31
+ tui/
32
+ ├── components/ # UI components
33
+ ├── context/ # React context providers
34
+ ├── hooks/ # Custom hooks
35
+ ├── theme/ # Theming system
36
+ ├── adapters/ # External integrations
37
+ └── i18n/ # Internationalization
38
+ ```markdown
39
+
40
+ ### Quick Start
41
+
42
+ ```tsx
43
+ import { RootProvider, Layout, TextInput, MessageList, StatusBar } from "@vellum/cli";
44
+
45
+ function App() {
46
+ return (
47
+ <RootProvider theme="dark">
48
+ <Layout
49
+ header={<StatusBar model={{ provider: "anthropic", model: "claude-3" }} />}
50
+ footer={<TextInput value={input} onChange={setInput} />}
51
+ >
52
+ <MessageList messages={messages} />
53
+ </Layout>
54
+ </RootProvider>
55
+ );
56
+ }
57
+ ```markdown
58
+
59
+ ### Core Components
60
+
61
+ | Component | Description |
62
+ |-----------|-------------|
63
+ | `RootProvider` | Composes all context providers |
64
+ | `Layout` | Main application layout with header/footer/sidebar |
65
+ | `TextInput` | Multiline text input with keyboard handling |
66
+ | `MessageList` | Message display with auto-scroll |
67
+ | `StatusBar` | Model, tokens, and mode indicators |
68
+ | `PermissionDialog` | Tool approval dialog |
69
+
70
+ ### Hooks
71
+
72
+ | Hook | Description |
73
+ |------|-------------|
74
+ | `useVim` | Vim modal editing mode |
75
+ | `useHotkeys` | Keyboard shortcut management |
76
+ | `useCopyMode` | Visual text selection and copy |
77
+ | `useApp` | Application state access |
78
+ | `useMessages` | Message state management |
79
+ | `useTools` | Tool execution state |
80
+ | `useTheme` | Theme access and switching |
81
+
82
+ ### Themes
83
+
84
+ Built-in themes: `dark`, `light`, `dracula`, `nord`, `solarized`
85
+
86
+ ```tsx
87
+ // Use a preset theme
88
+ <RootProvider theme="dracula">
89
+
90
+ // Or provide a custom theme
91
+ <RootProvider theme={customTheme}>
92
+ ```text
93
+
94
+ For detailed documentation, see [docs/tui.md](../../docs/tui.md).
95
+
96
+ ## Configuration
97
+
98
+ | Option | Type | Default | Description |
99
+ |--------|------|---------|-------------|
100
+ | `theme` | `string` | `"dark"` | Color theme |
101
+ | `vimMode` | `boolean` | `false` | Enable Vim keybindings |
102
+ | `trustMode` | `string` | `"ask"` | Tool approval mode |
103
+
104
+ ## Slash Commands
105
+
106
+ The CLI provides a powerful slash command system for quick actions and configuration.
107
+
108
+ ### Available Commands
109
+
110
+ | Command | Aliases | Description |
111
+ |---------|---------|-------------|
112
+ | `/help [topic]` | `/h`, `/?` | Show help for commands or categories |
113
+ | `/clear` | `/cls` | Clear the terminal screen |
114
+ | `/exit [--force]` | `/quit`, `/q` | Exit the application |
115
+ | `/login [provider]` | `/signin` | Add credential for a provider |
116
+ | `/logout [provider]` | `/signout` | Remove credential for a provider |
117
+ | `/credentials` | | Show credential status |
118
+ | `/language [code]` | `/lang` | Show or change UI language |
119
+
120
+ ### Command Syntax
121
+
122
+ ```bash
123
+ # Basic command
124
+ /help
125
+
126
+ # Command with positional argument
127
+ /login anthropic
128
+
129
+ # Command with flags
130
+ /exit --force
131
+ /exit -f
132
+
133
+ # Command with flag and value
134
+ /login anthropic --store keychain
135
+ /login anthropic -s keychain
136
+
137
+ # Mixed positional and named arguments
138
+ /config theme --value dark --global
139
+ ```markdown
140
+
141
+ ## AGENTS.md Commands
142
+
143
+ The CLI provides commands for managing AGENTS.md configuration files, which control AI assistant behavior.
144
+
145
+ ### `vellum init`
146
+
147
+ Create a new AGENTS.md file in the current directory.
148
+
149
+ ```bash
150
+ # Interactive wizard (default)
151
+ vellum init
152
+
153
+ # Skip wizard, use minimal defaults
154
+ vellum init --minimal
155
+
156
+ # Overwrite existing file
157
+ vellum init --force
158
+
159
+ # Non-interactive mode for CI
160
+ vellum init --non-interactive
161
+ ```markdown
162
+
163
+ **Options:**
164
+
165
+ | Flag | Description |
166
+ |------|-------------|
167
+ | `--minimal` | Skip prompts, create minimal template |
168
+ | `--force`, `-f` | Overwrite existing AGENTS.md |
169
+ | `--non-interactive` | Disable interactive prompts (for CI) |
170
+
171
+ ### `vellum agents show`
172
+
173
+ Display the merged AGENTS.md configuration.
174
+
175
+ ```bash
176
+ # Show current configuration
177
+ vellum agents show
178
+
179
+ # Output as JSON
180
+ vellum agents show --json
181
+
182
+ # Show all details including sources
183
+ vellum agents show --verbose
184
+
185
+ # Show config for specific scope
186
+ vellum agents show --scope ./src
187
+ ```markdown
188
+
189
+ **Options:**
190
+
191
+ | Flag | Description |
192
+ |------|-------------|
193
+ | `--json` | Output configuration as JSON |
194
+ | `--verbose`, `-v` | Show all details including merge config |
195
+ | `--scope <path>` | Show config for specific directory |
196
+
197
+ ### `vellum agents validate`
198
+
199
+ Validate AGENTS.md files for syntax and structural errors.
200
+
201
+ ```bash
202
+ # Validate all AGENTS.md files in project
203
+ vellum agents validate
204
+
205
+ # Validate specific file
206
+ vellum agents validate ./AGENTS.md
207
+
208
+ # JSON output (for CI)
209
+ vellum agents validate --json
210
+
211
+ # Verbose output with warnings
212
+ vellum agents validate --verbose
213
+ ```markdown
214
+
215
+ **Options:**
216
+
217
+ | Flag | Description |
218
+ |------|-------------|
219
+ | `--json` | Output validation results as JSON |
220
+ | `--verbose`, `-v` | Show detailed validation info |
221
+
222
+ **Exit Codes:**
223
+
224
+ | Code | Meaning |
225
+ |------|---------|
226
+ | `0` | All files valid |
227
+ | `1` | Validation errors found |
228
+
229
+ ### `vellum agents generate`
230
+
231
+ Generate an AGENTS.md file based on project analysis.
232
+
233
+ ```bash
234
+ # Generate from project analysis
235
+ vellum agents generate
236
+
237
+ # Preview without writing file
238
+ vellum agents generate --dry-run
239
+
240
+ # Write to custom path
241
+ vellum agents generate --output ./config/AGENTS.md
242
+
243
+ # Merge with existing file
244
+ vellum agents generate --merge
245
+ ```markdown
246
+
247
+ **Options:**
248
+
249
+ | Flag | Description |
250
+ |------|-------------|
251
+ | `--dry-run` | Preview generated content without writing |
252
+ | `--output <path>` | Custom output file path |
253
+ | `--merge` | Merge with existing AGENTS.md |
254
+
255
+ **Detection Features:**
256
+
257
+ - Project name and description from `package.json`
258
+ - Language detection (TypeScript, JavaScript, Python, etc.)
259
+ - Framework detection (React, Vue, Next.js, etc.)
260
+ - Build tool detection (Vite, Webpack, esbuild)
261
+ - Test framework detection (Vitest, Jest, Playwright)
262
+ - Package manager detection (npm, pnpm, yarn, bun)
263
+
264
+ ### Autocomplete
265
+
266
+ The CLI provides intelligent autocomplete for slash commands:
267
+
268
+ - **Trigger**: Start typing `/` to activate autocomplete
269
+ - **Navigate**: Use `↑`/`↓` arrow keys to select candidates
270
+ - **Complete**: Press `Tab` to insert the selected command
271
+ - **Cancel**: Press `Escape` to dismiss autocomplete
272
+
273
+ Autocomplete uses fuzzy matching, so typing `/hel` will match both `/help` and `/hello`.
274
+
275
+ ### Adding Custom Commands
276
+
277
+ You can extend the command system by registering custom commands:
278
+
279
+ ```typescript
280
+ import { CommandRegistry, type SlashCommand } from "@vellum/cli";
281
+
282
+ const myCommand: SlashCommand = {
283
+ name: "greet",
284
+ description: "Send a greeting",
285
+ kind: "user",
286
+ category: "tools",
287
+ positionalArgs: [
288
+ {
289
+ name: "name",
290
+ type: "string",
291
+ description: "Name to greet",
292
+ required: false,
293
+ },
294
+ ],
295
+ namedArgs: [
296
+ {
297
+ name: "loud",
298
+ shorthand: "l",
299
+ type: "boolean",
300
+ description: "Use uppercase",
301
+ required: false,
302
+ default: false,
303
+ },
304
+ ],
305
+ execute: async (ctx) => {
306
+ const name = ctx.parsedArgs.positional[0] ?? "World";
307
+ const loud = ctx.parsedArgs.named.loud;
308
+ const message = `Hello, ${name}!`;
309
+
310
+ return {
311
+ kind: "success",
312
+ message: loud ? message.toUpperCase() : message,
313
+ };
314
+ },
315
+ };
316
+
317
+ // Register with a CommandRegistry instance
318
+ registry.register(myCommand);
319
+ ```markdown
320
+
321
+ ### Command Result Types
322
+
323
+ Commands return one of four result types:
324
+
325
+ | Type | Description |
326
+ |------|-------------|
327
+ | `success` | Command completed successfully |
328
+ | `error` | Command failed with error code and message |
329
+ | `interactive` | Command needs user input to continue |
330
+ | `pending` | Command started an async operation |
331
+
332
+ ## Internationalization (i18n)
333
+
334
+ The CLI supports multiple languages for UI text.
335
+
336
+ ### Supported Languages
337
+
338
+ | Code | Language |
339
+ |------|----------|
340
+ | `en` | English (default) |
341
+ | `zh` | 中文 (Chinese) |
342
+
343
+ ### Setting Language
344
+
345
+ **Using the `/language` command:**
346
+
347
+ ```bash
348
+ # Show current language and available options
349
+ /language
350
+
351
+ # Switch to Chinese
352
+ /language zh
353
+
354
+ # Switch to English
355
+ /language en
356
+
357
+ # Clear preference (use auto-detection)
358
+ /language auto
359
+ ```markdown
360
+
361
+ **Using the `--language` CLI flag:**
362
+
363
+ ```bash
364
+ # Start with Chinese UI
365
+ vellum --language zh
366
+ vellum -l zh
367
+
368
+ # Start with English UI
369
+ vellum --language en
370
+ ```markdown
371
+
372
+ **Using environment variable:**
373
+
374
+ ```bash
375
+ # Set default language via environment
376
+ export VELLUM_LANGUAGE=zh
377
+ vellum
378
+ ```markdown
379
+
380
+ ### Language Priority
381
+
382
+ Language is resolved in the following order (highest priority first):
383
+
384
+ 1. `--language` / `-l` CLI flag
385
+ 2. `VELLUM_LANGUAGE` environment variable
386
+ 3. Saved preference (from `/language` command)
387
+ 4. System locale detection
388
+ 5. Default (`en`)
389
+
390
+ ## Development
391
+
392
+ ```bash
393
+ # Run in development mode
394
+ pnpm dev
395
+
396
+ # Build
397
+ pnpm build
398
+
399
+ # Test
400
+ pnpm test
401
+
402
+ # Run benchmarks
403
+ pnpm exec vitest bench
404
+
405
+ # Type check
406
+ pnpm typecheck
407
+ ```
408
+
409
+ ## License
410
+
411
+ MIT
@@ -0,0 +1,42 @@
1
+ {
2
+ "id": "code-generation",
3
+ "promptPattern": "write.*function|create.*code|generate.*typescript",
4
+ "isRegex": true,
5
+ "description": "Code generation response with tool calls",
6
+ "streamDelay": 20,
7
+ "events": [
8
+ {
9
+ "type": "text",
10
+ "content": "I'll create a TypeScript function for you.\n\n"
11
+ },
12
+ {
13
+ "type": "tool_call_start",
14
+ "toolCallId": "toolu_01ABC123",
15
+ "toolName": "write_file"
16
+ },
17
+ {
18
+ "type": "tool_call_delta",
19
+ "toolCallId": "toolu_01ABC123",
20
+ "arguments": "{\"path\": \"src/utils/helper.ts\", \"content\": \"export function greet(name: string): string {\\n return `Hello, ${name}!`;\\n}\"}"
21
+ },
22
+ {
23
+ "type": "tool_call_end",
24
+ "toolCallId": "toolu_01ABC123"
25
+ },
26
+ {
27
+ "type": "text",
28
+ "content": "\n\nI've created a simple greeting function in `src/utils/helper.ts`."
29
+ },
30
+ {
31
+ "type": "usage",
32
+ "usage": {
33
+ "inputTokens": 25,
34
+ "outputTokens": 120
35
+ }
36
+ },
37
+ {
38
+ "type": "end",
39
+ "stopReason": "end_turn"
40
+ }
41
+ ]
42
+ }
@@ -0,0 +1,20 @@
1
+ {
2
+ "id": "error-response",
3
+ "promptPattern": "trigger-error|cause-failure",
4
+ "isRegex": true,
5
+ "description": "Error response for testing error handling",
6
+ "streamDelay": 0,
7
+ "events": [
8
+ {
9
+ "type": "text",
10
+ "content": "Processing your request..."
11
+ },
12
+ {
13
+ "type": "error",
14
+ "error": {
15
+ "code": "RATE_LIMIT_EXCEEDED",
16
+ "message": "You have exceeded the rate limit. Please wait before making another request."
17
+ }
18
+ }
19
+ ]
20
+ }
@@ -0,0 +1,32 @@
1
+ {
2
+ "id": "hello-world",
3
+ "promptPattern": "hello",
4
+ "isRegex": false,
5
+ "description": "Simple greeting response for basic connectivity tests",
6
+ "streamDelay": 10,
7
+ "events": [
8
+ {
9
+ "type": "text",
10
+ "content": "Hello! "
11
+ },
12
+ {
13
+ "type": "text",
14
+ "content": "I'm Vellum, your AI assistant. "
15
+ },
16
+ {
17
+ "type": "text",
18
+ "content": "How can I help you today?"
19
+ },
20
+ {
21
+ "type": "usage",
22
+ "usage": {
23
+ "inputTokens": 5,
24
+ "outputTokens": 15
25
+ }
26
+ },
27
+ {
28
+ "type": "end",
29
+ "stopReason": "end_turn"
30
+ }
31
+ ]
32
+ }
@@ -0,0 +1,26 @@
1
+ import {
2
+ authCommand,
3
+ authSlashCommands,
4
+ createCredentialManager,
5
+ credentialsCommand,
6
+ enhancedAuthCommands,
7
+ executeSlashCommand,
8
+ findSlashCommand,
9
+ getSlashCommandHelp,
10
+ handleCredentials,
11
+ isSlashCommand,
12
+ parseSlashCommand
13
+ } from "./chunk-SECXJGWA.js";
14
+ export {
15
+ authCommand,
16
+ authSlashCommands,
17
+ createCredentialManager,
18
+ credentialsCommand,
19
+ enhancedAuthCommands,
20
+ executeSlashCommand,
21
+ findSlashCommand,
22
+ getSlashCommandHelp,
23
+ handleCredentials,
24
+ isSlashCommand,
25
+ parseSlashCommand
26
+ };