@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
@@ -0,0 +1,272 @@
1
+ /**
2
+ * Agents Command Group
3
+ *
4
+ * Command group for AGENTS.md management operations.
5
+ *
6
+ * Subcommands:
7
+ * - `vellum agents show` - Display merged configuration
8
+ * - `vellum agents validate` - Validate syntax and structure
9
+ * - `vellum agents generate` - Generate optimized AGENTS.md
10
+ *
11
+ * @module cli/commands/agents
12
+ */
13
+
14
+ import type { CommandContext, CommandResult, SlashCommand } from "../types.js";
15
+ import { success } from "../types.js";
16
+ import { handleAgentsGenerate } from "./generate.js";
17
+ // Import subcommand handlers
18
+ import { handleAgentsShow } from "./show.js";
19
+ import { handleAgentsValidate } from "./validate.js";
20
+
21
+ // =============================================================================
22
+ // Types
23
+ // =============================================================================
24
+
25
+ /**
26
+ * Agents subcommand names
27
+ */
28
+ export type AgentsSubcommand = "show" | "validate" | "generate" | "help";
29
+
30
+ /**
31
+ * Options for agents subcommands
32
+ */
33
+ export interface AgentsShowOptions {
34
+ /** Output as JSON */
35
+ json?: boolean;
36
+ /** Show all details including sources */
37
+ verbose?: boolean;
38
+ /** Show config for specific file/directory */
39
+ scope?: string;
40
+ }
41
+
42
+ export interface AgentsValidateOptions {
43
+ /** Path to AGENTS.md file */
44
+ file?: string;
45
+ /** Show verbose output */
46
+ verbose?: boolean;
47
+ /** Output as JSON */
48
+ json?: boolean;
49
+ }
50
+
51
+ export interface AgentsGenerateOptions {
52
+ /** Output file path */
53
+ output?: string;
54
+ /** Merge with existing file */
55
+ merge?: boolean;
56
+ /** Dry run - show what would be generated */
57
+ dryRun?: boolean;
58
+ }
59
+
60
+ // =============================================================================
61
+ // Help Text
62
+ // =============================================================================
63
+
64
+ /**
65
+ * Generate help text for agents command group
66
+ */
67
+ function getAgentsHelp(): string {
68
+ return `📋 Agents Commands
69
+
70
+ Manage AGENTS.md configuration files.
71
+
72
+ Subcommands:
73
+ show Display merged AGENTS.md configuration
74
+ validate Validate syntax and structure
75
+ generate Generate optimized AGENTS.md from codebase
76
+
77
+ Usage:
78
+ /agents Show this help
79
+ /agents show Display current config
80
+ /agents show --json Output as JSON
81
+ /agents show --verbose Show all details
82
+ /agents validate Validate current config
83
+ /agents validate <file> Validate specific file
84
+ /agents generate Generate new config
85
+
86
+ Examples:
87
+ /agents show --scope ./src Show config for src directory
88
+ /agents validate --verbose Validate with detailed output
89
+ /agents generate --dry-run Preview generated config
90
+
91
+ See also:
92
+ /init Create new AGENTS.md file`;
93
+ }
94
+
95
+ // =============================================================================
96
+ // Subcommand Handlers
97
+ // =============================================================================
98
+
99
+ /**
100
+ * Handle agents show subcommand
101
+ */
102
+ async function handleShow(options: AgentsShowOptions): Promise<CommandResult> {
103
+ return handleAgentsShow(options);
104
+ }
105
+
106
+ /**
107
+ * Handle agents validate subcommand
108
+ */
109
+ async function handleValidate(options: AgentsValidateOptions): Promise<CommandResult> {
110
+ return handleAgentsValidate(options);
111
+ }
112
+
113
+ /**
114
+ * Handle agents generate subcommand
115
+ */
116
+ async function handleGenerate(options: AgentsGenerateOptions): Promise<CommandResult> {
117
+ return handleAgentsGenerate(options);
118
+ }
119
+
120
+ // =============================================================================
121
+ // Command Execution
122
+ // =============================================================================
123
+
124
+ /**
125
+ * Parse agents subcommand from positional args
126
+ */
127
+ function parseSubcommand(positional: readonly unknown[]): AgentsSubcommand {
128
+ const first = positional[0];
129
+ if (typeof first === "string") {
130
+ const sub = first.toLowerCase();
131
+ if (sub === "show" || sub === "validate" || sub === "generate") {
132
+ return sub;
133
+ }
134
+ }
135
+ return "help";
136
+ }
137
+
138
+ /**
139
+ * Execute agents command group
140
+ *
141
+ * @param ctx - Command context
142
+ * @returns Command result
143
+ */
144
+ export async function executeAgents(ctx: CommandContext): Promise<CommandResult> {
145
+ const subcommand = parseSubcommand(ctx.parsedArgs.positional);
146
+ const named = ctx.parsedArgs.named;
147
+
148
+ switch (subcommand) {
149
+ case "show":
150
+ return handleShow({
151
+ json: named.json as boolean | undefined,
152
+ verbose: named.verbose as boolean | undefined,
153
+ scope: named.scope as string | undefined,
154
+ });
155
+
156
+ case "validate":
157
+ return handleValidate({
158
+ file: ctx.parsedArgs.positional[1] as string | undefined,
159
+ verbose: named.verbose as boolean | undefined,
160
+ });
161
+
162
+ case "generate":
163
+ return handleGenerate({
164
+ output: named.output as string | undefined,
165
+ merge: named.merge as boolean | undefined,
166
+ dryRun: named["dry-run"] as boolean | undefined,
167
+ });
168
+
169
+ default:
170
+ return success(getAgentsHelp());
171
+ }
172
+ }
173
+
174
+ // =============================================================================
175
+ // Slash Command Definition
176
+ // =============================================================================
177
+
178
+ /**
179
+ * Agents command group for TUI
180
+ *
181
+ * Provides access to AGENTS.md management operations.
182
+ */
183
+ export const agentsCommand: SlashCommand = {
184
+ name: "agents",
185
+ description: "Manage AGENTS.md configuration",
186
+ kind: "builtin",
187
+ category: "config",
188
+ aliases: ["agent"],
189
+ positionalArgs: [
190
+ {
191
+ name: "subcommand",
192
+ type: "string",
193
+ description: "Subcommand: show, validate, generate",
194
+ required: false,
195
+ },
196
+ {
197
+ name: "file",
198
+ type: "path",
199
+ description: "Target file (for validate subcommand)",
200
+ required: false,
201
+ },
202
+ ],
203
+ namedArgs: [
204
+ {
205
+ name: "json",
206
+ shorthand: "j",
207
+ type: "boolean",
208
+ description: "Output as JSON (for show)",
209
+ required: false,
210
+ default: false,
211
+ },
212
+ {
213
+ name: "verbose",
214
+ shorthand: "v",
215
+ type: "boolean",
216
+ description: "Show verbose output",
217
+ required: false,
218
+ default: false,
219
+ },
220
+ {
221
+ name: "scope",
222
+ shorthand: "s",
223
+ type: "path",
224
+ description: "Scope to specific file/directory (for show)",
225
+ required: false,
226
+ },
227
+ {
228
+ name: "output",
229
+ shorthand: "o",
230
+ type: "path",
231
+ description: "Output file path (for generate)",
232
+ required: false,
233
+ },
234
+ {
235
+ name: "merge",
236
+ shorthand: "m",
237
+ type: "boolean",
238
+ description: "Merge with existing file (for generate)",
239
+ required: false,
240
+ default: false,
241
+ },
242
+ {
243
+ name: "dry-run",
244
+ type: "boolean",
245
+ description: "Preview without writing (for generate)",
246
+ required: false,
247
+ default: false,
248
+ },
249
+ ],
250
+ examples: [
251
+ "/agents - Show help",
252
+ "/agents show - Display current config",
253
+ "/agents show --json - Output as JSON",
254
+ "/agents show --verbose - Show all details",
255
+ "/agents validate - Validate current config",
256
+ "/agents validate ./AGENTS.md - Validate specific file",
257
+ "/agents generate --dry-run - Preview generated config",
258
+ ],
259
+ subcommands: [
260
+ { name: "show", description: "Show agent details" },
261
+ { name: "validate", description: "Validate agents" },
262
+ { name: "generate", description: "Generate agent" },
263
+ ],
264
+
265
+ execute: executeAgents,
266
+ };
267
+
268
+ // =============================================================================
269
+ // Re-exports
270
+ // =============================================================================
271
+
272
+ export { getAgentsHelp };
@@ -0,0 +1,271 @@
1
+ /**
2
+ * Agents Show Command
3
+ *
4
+ * Displays merged AGENTS.md configuration with all contributing sources.
5
+ * Supports JSON output for programmatic usage and verbose mode for debugging.
6
+ *
7
+ * @module cli/commands/agents/show
8
+ */
9
+
10
+ import * as path from "node:path";
11
+ import {
12
+ type AgentsConfig,
13
+ AgentsLoader,
14
+ type AgentsLoadResult,
15
+ type AgentsWarning,
16
+ type ToolPermission,
17
+ } from "@vellum/core";
18
+ import chalk from "chalk";
19
+
20
+ import type { CommandContext, CommandResult } from "../types.js";
21
+ import { error, success } from "../types.js";
22
+ import type { AgentsShowOptions } from "./index.js";
23
+
24
+ // =============================================================================
25
+ // Types
26
+ // =============================================================================
27
+
28
+ /**
29
+ * JSON output format for agents show
30
+ */
31
+ export interface AgentsShowJsonOutput {
32
+ /** Whether the configuration was loaded successfully */
33
+ success: boolean;
34
+ /** Merged configuration (null if failed) */
35
+ config: AgentsConfig | null;
36
+ /** Source files that contributed to configuration */
37
+ sources: string[];
38
+ /** Warnings during loading */
39
+ warnings: Array<{
40
+ file: string;
41
+ message: string;
42
+ severity: string;
43
+ line?: number;
44
+ }>;
45
+ /** Whether result came from cache */
46
+ fromCache: boolean;
47
+ }
48
+
49
+ // =============================================================================
50
+ // Formatters
51
+ // =============================================================================
52
+
53
+ /**
54
+ * Format tool permissions for display
55
+ */
56
+ function formatToolPermissions(config: AgentsConfig): string {
57
+ if (config.allowedTools.length === 0) {
58
+ return chalk.gray(" No explicit tool permissions set");
59
+ }
60
+
61
+ return config.allowedTools
62
+ .map((tool: ToolPermission) => {
63
+ const icon = tool.negated ? chalk.red("❌") : chalk.green("✅");
64
+ const pattern = tool.negated ? tool.pattern.replace(/^!/, "") : tool.pattern;
65
+ const args = tool.args?.length ? chalk.gray(` (args: ${tool.args.join(", ")})`) : "";
66
+ return ` ${icon} ${tool.negated ? chalk.red(pattern) : chalk.cyan(pattern)}${args}`;
67
+ })
68
+ .join("\n");
69
+ }
70
+
71
+ /**
72
+ * Format sources list for display
73
+ */
74
+ function formatSources(sources: string[], cwd: string): string {
75
+ if (sources.length === 0) {
76
+ return chalk.gray(" No sources found");
77
+ }
78
+
79
+ return sources
80
+ .map((source, index) => {
81
+ // Make paths relative to cwd for readability
82
+ const relativePath = path.relative(cwd, source) || source;
83
+ return ` ${chalk.gray(`${index + 1}.`)} ${chalk.blue(relativePath)}`;
84
+ })
85
+ .join("\n");
86
+ }
87
+
88
+ /**
89
+ * Format warnings list for display
90
+ */
91
+ function formatWarnings(result: AgentsLoadResult): string {
92
+ if (result.warnings.length === 0) {
93
+ return "";
94
+ }
95
+
96
+ const warningLines = result.warnings.map((w: AgentsWarning) => {
97
+ const loc = w.line ? `:${w.line}` : "";
98
+ const file = chalk.gray(`${path.basename(w.file)}${loc}`);
99
+ const icon = w.severity === "warn" ? chalk.yellow("⚠") : chalk.blue("ℹ");
100
+ return ` ${icon} ${file}: ${w.message}`;
101
+ });
102
+
103
+ return `\n${chalk.yellow("⚠️ Warnings:")}\n${warningLines.join("\n")}`;
104
+ }
105
+
106
+ /**
107
+ * Format configuration for human-readable display
108
+ */
109
+ function formatConfigDisplay(result: AgentsLoadResult, cwd: string, verbose: boolean): string {
110
+ const config = result.config;
111
+
112
+ if (!config) {
113
+ return chalk.yellow(
114
+ "No AGENTS.md configuration found.\n\n" +
115
+ "Run " +
116
+ chalk.cyan("/init") +
117
+ " to create one, or create AGENTS.md manually."
118
+ );
119
+ }
120
+
121
+ const lines: string[] = [
122
+ chalk.bold("📋 AGENTS.md Configuration"),
123
+ chalk.gray("━".repeat(40)),
124
+ "",
125
+ ];
126
+
127
+ // Name and description
128
+ if (config.name) {
129
+ lines.push(`${chalk.gray("Name:")} ${chalk.white(config.name)}`);
130
+ }
131
+ if (config.description) {
132
+ lines.push(`${chalk.gray("Description:")} ${config.description}`);
133
+ }
134
+ lines.push(`${chalk.gray("Priority:")} ${config.priority}`);
135
+ lines.push("");
136
+
137
+ // Instructions
138
+ if (config.instructions) {
139
+ lines.push(chalk.bold("📝 Instructions:"));
140
+ const instructionPreview =
141
+ config.instructions.length > 200
142
+ ? config.instructions.slice(0, 200) + chalk.gray("...")
143
+ : config.instructions;
144
+ lines.push(chalk.gray(` ${instructionPreview.split("\n").join("\n ")}`));
145
+ lines.push("");
146
+ }
147
+
148
+ // Tools
149
+ lines.push(chalk.bold("🔧 Allowed Tools:"));
150
+ lines.push(formatToolPermissions(config));
151
+ lines.push("");
152
+
153
+ // Merge config (verbose only)
154
+ if (verbose) {
155
+ lines.push(chalk.bold("🔀 Merge Configuration:"));
156
+ lines.push(` Strategy: ${chalk.cyan(config.merge.strategy)}`);
157
+ lines.push(` Arrays: ${chalk.cyan(config.merge.arrays)}`);
158
+ lines.push("");
159
+
160
+ // Scope (verbose only)
161
+ if (config.scope.include.length > 0 || config.scope.exclude.length > 0) {
162
+ lines.push(chalk.bold("📂 Scope:"));
163
+ if (config.scope.include.length > 0) {
164
+ lines.push(` Include: ${chalk.green(config.scope.include.join(", "))}`);
165
+ }
166
+ if (config.scope.exclude.length > 0) {
167
+ lines.push(` Exclude: ${chalk.red(config.scope.exclude.join(", "))}`);
168
+ }
169
+ lines.push("");
170
+ }
171
+ }
172
+
173
+ // Sources
174
+ lines.push(chalk.bold("📁 Sources:"));
175
+ lines.push(formatSources(config.sources, cwd));
176
+
177
+ // Warnings (if any)
178
+ lines.push(formatWarnings(result));
179
+
180
+ // Cache info (verbose only)
181
+ if (verbose && result.fromCache) {
182
+ lines.push("");
183
+ lines.push(chalk.gray("(Loaded from cache)"));
184
+ }
185
+
186
+ return lines.join("\n");
187
+ }
188
+
189
+ /**
190
+ * Convert load result to JSON output format
191
+ */
192
+ function toJsonOutput(result: AgentsLoadResult): AgentsShowJsonOutput {
193
+ return {
194
+ success: result.config !== null,
195
+ config: result.config,
196
+ sources: result.config?.sources ?? [],
197
+ warnings: result.warnings.map((w: AgentsWarning) => ({
198
+ file: w.file,
199
+ message: w.message,
200
+ severity: w.severity,
201
+ line: w.line,
202
+ })),
203
+ fromCache: result.fromCache,
204
+ };
205
+ }
206
+
207
+ // =============================================================================
208
+ // Command Handler
209
+ // =============================================================================
210
+
211
+ /**
212
+ * Execute agents show command
213
+ *
214
+ * @param options - Command options
215
+ * @returns Command result
216
+ */
217
+ export async function handleAgentsShow(options: AgentsShowOptions): Promise<CommandResult> {
218
+ const cwd = options.scope ? path.resolve(options.scope) : process.cwd();
219
+
220
+ try {
221
+ // Create loader with cache disabled for fresh results
222
+ const loader = new AgentsLoader({
223
+ enableCache: !options.verbose, // Disable cache in verbose mode
224
+ });
225
+
226
+ // Load configuration
227
+ const result = await loader.load(cwd);
228
+
229
+ // JSON output
230
+ if (options.json) {
231
+ const jsonOutput = toJsonOutput(result);
232
+ return success(JSON.stringify(jsonOutput, null, 2), {
233
+ format: "json",
234
+ data: jsonOutput,
235
+ });
236
+ }
237
+
238
+ // Human-readable output
239
+ const display = formatConfigDisplay(result, cwd, options.verbose ?? false);
240
+ return success(display);
241
+ } catch (err) {
242
+ const message = err instanceof Error ? err.message : String(err);
243
+
244
+ if (options.json) {
245
+ const jsonError = {
246
+ success: false,
247
+ config: null,
248
+ sources: [],
249
+ warnings: [],
250
+ fromCache: false,
251
+ error: message,
252
+ };
253
+ return error("INTERNAL_ERROR", JSON.stringify(jsonError, null, 2));
254
+ }
255
+
256
+ return error("INTERNAL_ERROR", `Failed to load AGENTS.md configuration: ${message}`);
257
+ }
258
+ }
259
+
260
+ /**
261
+ * Execute handler for command context
262
+ */
263
+ export async function executeShow(ctx: CommandContext): Promise<CommandResult> {
264
+ const options: AgentsShowOptions = {
265
+ json: ctx.parsedArgs.named.json as boolean | undefined,
266
+ verbose: ctx.parsedArgs.named.verbose as boolean | undefined,
267
+ scope: ctx.parsedArgs.named.scope as string | undefined,
268
+ };
269
+
270
+ return handleAgentsShow(options);
271
+ }