@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.
- package/LICENSE +21 -0
- package/README.md +411 -0
- package/__fixtures__/responses/code-generation.json +42 -0
- package/__fixtures__/responses/error-response.json +20 -0
- package/__fixtures__/responses/hello-world.json +32 -0
- package/dist/auth-6MCXESOH.js +26 -0
- package/dist/chunk-SECXJGWA.js +597 -0
- package/dist/index.js +34023 -0
- package/package.json +67 -0
- package/src/__tests__/commands.e2e.test.ts +728 -0
- package/src/__tests__/credentials.test.ts +713 -0
- package/src/__tests__/mode-e2e.test.ts +391 -0
- package/src/__tests__/tui-integration.test.tsx +1271 -0
- package/src/agents/__tests__/task-persistence.test.ts +235 -0
- package/src/agents/commands/delegate.ts +240 -0
- package/src/agents/commands/index.ts +10 -0
- package/src/agents/commands/resume.ts +335 -0
- package/src/agents/index.ts +29 -0
- package/src/agents/task-persistence.ts +272 -0
- package/src/agents/task-resumption.ts +242 -0
- package/src/app.tsx +4737 -0
- package/src/commands/__tests__/.gitkeep +1 -0
- package/src/commands/__tests__/agents.test.ts +606 -0
- package/src/commands/__tests__/auth.test.ts +626 -0
- package/src/commands/__tests__/autocomplete.test.ts +683 -0
- package/src/commands/__tests__/batch.test.ts +287 -0
- package/src/commands/__tests__/chain-pipe-parser.test.ts +654 -0
- package/src/commands/__tests__/completion.test.ts +238 -0
- package/src/commands/__tests__/core.test.ts +363 -0
- package/src/commands/__tests__/executor.test.ts +496 -0
- package/src/commands/__tests__/exit-codes.test.ts +220 -0
- package/src/commands/__tests__/init.test.ts +243 -0
- package/src/commands/__tests__/language.test.ts +353 -0
- package/src/commands/__tests__/mode-cli.test.ts +667 -0
- package/src/commands/__tests__/model.test.ts +277 -0
- package/src/commands/__tests__/parser.test.ts +493 -0
- package/src/commands/__tests__/performance.bench.ts +380 -0
- package/src/commands/__tests__/registry.test.ts +534 -0
- package/src/commands/__tests__/resume.test.ts +449 -0
- package/src/commands/__tests__/security.test.ts +845 -0
- package/src/commands/__tests__/stream-json.test.ts +372 -0
- package/src/commands/__tests__/user-commands.test.ts +597 -0
- package/src/commands/adapters.ts +267 -0
- package/src/commands/agent.ts +395 -0
- package/src/commands/agents/generate.ts +506 -0
- package/src/commands/agents/index.ts +272 -0
- package/src/commands/agents/show.ts +271 -0
- package/src/commands/agents/validate.ts +387 -0
- package/src/commands/auth.ts +883 -0
- package/src/commands/autocomplete.ts +480 -0
- package/src/commands/batch/command.ts +388 -0
- package/src/commands/batch/executor.ts +361 -0
- package/src/commands/batch/index.ts +12 -0
- package/src/commands/commit.ts +235 -0
- package/src/commands/completion/index.ts +371 -0
- package/src/commands/condense.ts +191 -0
- package/src/commands/config.ts +344 -0
- package/src/commands/context-provider.ts +173 -0
- package/src/commands/copy.ts +329 -0
- package/src/commands/core/clear.ts +38 -0
- package/src/commands/core/exit.ts +43 -0
- package/src/commands/core/help.ts +354 -0
- package/src/commands/core/index.ts +15 -0
- package/src/commands/cost.ts +179 -0
- package/src/commands/credentials.tsx +618 -0
- package/src/commands/custom-agents/__tests__/custom-agents.test.ts +709 -0
- package/src/commands/custom-agents/create.ts +377 -0
- package/src/commands/custom-agents/export.ts +135 -0
- package/src/commands/custom-agents/import.ts +199 -0
- package/src/commands/custom-agents/index.ts +372 -0
- package/src/commands/custom-agents/info.ts +318 -0
- package/src/commands/custom-agents/list.ts +267 -0
- package/src/commands/custom-agents/validate.ts +388 -0
- package/src/commands/diff-mode.ts +241 -0
- package/src/commands/env.ts +53 -0
- package/src/commands/executor.ts +579 -0
- package/src/commands/exit-codes.ts +202 -0
- package/src/commands/index.ts +701 -0
- package/src/commands/init/index.ts +15 -0
- package/src/commands/init/prompts.ts +366 -0
- package/src/commands/init/templates/commands-readme.md +80 -0
- package/src/commands/init/templates/example-command.md +79 -0
- package/src/commands/init/templates/example-skill.md +168 -0
- package/src/commands/init/templates/example-workflow.md +101 -0
- package/src/commands/init/templates/prompts-readme.md +52 -0
- package/src/commands/init/templates/rules-readme.md +63 -0
- package/src/commands/init/templates/skills-readme.md +83 -0
- package/src/commands/init/templates/workflows-readme.md +94 -0
- package/src/commands/init.ts +391 -0
- package/src/commands/install.ts +90 -0
- package/src/commands/language.ts +191 -0
- package/src/commands/loaders/.gitkeep +1 -0
- package/src/commands/lsp.ts +199 -0
- package/src/commands/markdown-commands.ts +253 -0
- package/src/commands/mcp.ts +588 -0
- package/src/commands/memory/export.ts +341 -0
- package/src/commands/memory/index.ts +148 -0
- package/src/commands/memory/list.ts +261 -0
- package/src/commands/memory/search.ts +346 -0
- package/src/commands/memory/utils.ts +15 -0
- package/src/commands/metrics.ts +75 -0
- package/src/commands/migrate/index.ts +16 -0
- package/src/commands/migrate/prompts.ts +477 -0
- package/src/commands/mode.ts +331 -0
- package/src/commands/model.ts +298 -0
- package/src/commands/onboard.ts +205 -0
- package/src/commands/open.ts +169 -0
- package/src/commands/output/stream-json.ts +373 -0
- package/src/commands/parser/chain-parser.ts +370 -0
- package/src/commands/parser/index.ts +29 -0
- package/src/commands/parser/pipe-parser.ts +480 -0
- package/src/commands/parser.ts +588 -0
- package/src/commands/persistence.ts +355 -0
- package/src/commands/progress.ts +18 -0
- package/src/commands/prompt/index.ts +17 -0
- package/src/commands/prompt/validate.ts +621 -0
- package/src/commands/prompt-priority.ts +401 -0
- package/src/commands/registry.ts +374 -0
- package/src/commands/sandbox/index.ts +131 -0
- package/src/commands/security/index.ts +21 -0
- package/src/commands/security/input-sanitizer.ts +168 -0
- package/src/commands/security/permission-checker.ts +456 -0
- package/src/commands/security/sensitive-data.ts +350 -0
- package/src/commands/session/delete.ts +38 -0
- package/src/commands/session/export.ts +39 -0
- package/src/commands/session/index.ts +26 -0
- package/src/commands/session/list.ts +26 -0
- package/src/commands/session/resume.ts +562 -0
- package/src/commands/session/search.ts +434 -0
- package/src/commands/session/show.ts +26 -0
- package/src/commands/settings.ts +368 -0
- package/src/commands/setup.ts +23 -0
- package/src/commands/shell/index.ts +16 -0
- package/src/commands/shell/setup.ts +422 -0
- package/src/commands/shell-init.ts +50 -0
- package/src/commands/shell-integration/index.ts +194 -0
- package/src/commands/skill.ts +1220 -0
- package/src/commands/spec.ts +558 -0
- package/src/commands/status.ts +246 -0
- package/src/commands/theme.ts +211 -0
- package/src/commands/think.ts +551 -0
- package/src/commands/trust.ts +211 -0
- package/src/commands/tutorial.ts +522 -0
- package/src/commands/types.ts +512 -0
- package/src/commands/update.ts +274 -0
- package/src/commands/usage.ts +213 -0
- package/src/commands/user-commands.ts +630 -0
- package/src/commands/utils.ts +142 -0
- package/src/commands/vim.ts +152 -0
- package/src/commands/workflow.ts +257 -0
- package/src/components/header.tsx +25 -0
- package/src/components/input.tsx +25 -0
- package/src/components/message-list.tsx +32 -0
- package/src/components/status-bar.tsx +23 -0
- package/src/index.tsx +614 -0
- package/src/onboarding/__tests__/tutorial.test.ts +740 -0
- package/src/onboarding/index.ts +69 -0
- package/src/onboarding/tips/index.ts +9 -0
- package/src/onboarding/tips/tip-engine.ts +459 -0
- package/src/onboarding/tutorial/index.ts +88 -0
- package/src/onboarding/tutorial/lessons/basics.ts +151 -0
- package/src/onboarding/tutorial/lessons/index.ts +151 -0
- package/src/onboarding/tutorial/lessons/modes.ts +230 -0
- package/src/onboarding/tutorial/lessons/tools.ts +172 -0
- package/src/onboarding/tutorial/progress-tracker.ts +350 -0
- package/src/onboarding/tutorial/storage.ts +249 -0
- package/src/onboarding/tutorial/tutorial-system.ts +462 -0
- package/src/onboarding/tutorial/types.ts +310 -0
- package/src/orchestrator-singleton.ts +129 -0
- package/src/shutdown.ts +33 -0
- package/src/test/e2e/assertions.ts +267 -0
- package/src/test/e2e/fixtures.ts +204 -0
- package/src/test/e2e/harness.ts +575 -0
- package/src/test/e2e/index.ts +57 -0
- package/src/test/e2e/types.ts +228 -0
- package/src/test/fixtures/__tests__/fake-response-loader.test.ts +314 -0
- package/src/test/fixtures/fake-response-loader.ts +314 -0
- package/src/test/fixtures/index.ts +20 -0
- package/src/tui/__tests__/mcp-panel.test.tsx +82 -0
- package/src/tui/__tests__/mcp-wiring.test.tsx +78 -0
- package/src/tui/__tests__/mode-components.test.tsx +395 -0
- package/src/tui/__tests__/permission-ask-flow.test.tsx +138 -0
- package/src/tui/__tests__/sidebar-panel-data.test.tsx +148 -0
- package/src/tui/__tests__/tools-panel-hotkeys.test.tsx +41 -0
- package/src/tui/adapters/agent-adapter.ts +1008 -0
- package/src/tui/adapters/index.ts +48 -0
- package/src/tui/adapters/message-adapter.ts +315 -0
- package/src/tui/adapters/persistence-bridge.ts +331 -0
- package/src/tui/adapters/session-adapter.ts +419 -0
- package/src/tui/buffered-stdout.ts +223 -0
- package/src/tui/components/AgentProgress.tsx +424 -0
- package/src/tui/components/Banner/AsciiArt.ts +160 -0
- package/src/tui/components/Banner/Banner.tsx +355 -0
- package/src/tui/components/Banner/ShimmerContext.tsx +131 -0
- package/src/tui/components/Banner/ShimmerText.tsx +193 -0
- package/src/tui/components/Banner/TypeWriterGradient.tsx +321 -0
- package/src/tui/components/Banner/index.ts +61 -0
- package/src/tui/components/Banner/useShimmer.ts +241 -0
- package/src/tui/components/ChatView.tsx +11 -0
- package/src/tui/components/Checkpoint/CheckpointDiffView.tsx +371 -0
- package/src/tui/components/Checkpoint/SnapshotCheckpointPanel.tsx +440 -0
- package/src/tui/components/Checkpoint/index.ts +19 -0
- package/src/tui/components/CostDisplay.tsx +226 -0
- package/src/tui/components/InitErrorBanner.tsx +122 -0
- package/src/tui/components/Input/Autocomplete.tsx +603 -0
- package/src/tui/components/Input/EnhancedCommandInput.tsx +471 -0
- package/src/tui/components/Input/HighlightedText.tsx +236 -0
- package/src/tui/components/Input/MentionAutocomplete.tsx +375 -0
- package/src/tui/components/Input/TextInput.tsx +1002 -0
- package/src/tui/components/Input/__tests__/Autocomplete.test.tsx +374 -0
- package/src/tui/components/Input/__tests__/TextInput.test.tsx +241 -0
- package/src/tui/components/Input/__tests__/highlight.test.ts +219 -0
- package/src/tui/components/Input/__tests__/slash-command-utils.test.ts +104 -0
- package/src/tui/components/Input/highlight.ts +362 -0
- package/src/tui/components/Input/index.ts +36 -0
- package/src/tui/components/Input/slash-command-utils.ts +135 -0
- package/src/tui/components/Layout.tsx +432 -0
- package/src/tui/components/McpPanel.tsx +137 -0
- package/src/tui/components/MemoryPanel.tsx +448 -0
- package/src/tui/components/Messages/CodeBlock.tsx +527 -0
- package/src/tui/components/Messages/DiffView.tsx +679 -0
- package/src/tui/components/Messages/ImageReference.tsx +89 -0
- package/src/tui/components/Messages/MarkdownBlock.tsx +228 -0
- package/src/tui/components/Messages/MarkdownRenderer.tsx +498 -0
- package/src/tui/components/Messages/MessageBubble.tsx +270 -0
- package/src/tui/components/Messages/MessageList.tsx +1719 -0
- package/src/tui/components/Messages/StreamingText.tsx +216 -0
- package/src/tui/components/Messages/ThinkingBlock.tsx +408 -0
- package/src/tui/components/Messages/ToolResultPreview.tsx +243 -0
- package/src/tui/components/Messages/__tests__/CodeBlock.test.tsx +296 -0
- package/src/tui/components/Messages/__tests__/DiffView.test.tsx +239 -0
- package/src/tui/components/Messages/__tests__/MarkdownRenderer.test.tsx +303 -0
- package/src/tui/components/Messages/__tests__/MessageBubble.test.tsx +268 -0
- package/src/tui/components/Messages/__tests__/MessageList.test.tsx +324 -0
- package/src/tui/components/Messages/__tests__/StreamingText.test.tsx +215 -0
- package/src/tui/components/Messages/index.ts +25 -0
- package/src/tui/components/ModeIndicator.tsx +177 -0
- package/src/tui/components/ModeSelector.tsx +216 -0
- package/src/tui/components/ModelSelector.tsx +339 -0
- package/src/tui/components/OnboardingWizard.tsx +670 -0
- package/src/tui/components/PhaseProgressIndicator.tsx +270 -0
- package/src/tui/components/RateLimitIndicator.tsx +82 -0
- package/src/tui/components/ScreenReaderLayout.tsx +295 -0
- package/src/tui/components/SettingsPanel.tsx +643 -0
- package/src/tui/components/Sidebar/SystemStatusPanel.tsx +284 -0
- package/src/tui/components/Sidebar/index.ts +9 -0
- package/src/tui/components/Status/ModelStatusBar.tsx +270 -0
- package/src/tui/components/Status/index.ts +12 -0
- package/src/tui/components/StatusBar/AgentModeIndicator.tsx +257 -0
- package/src/tui/components/StatusBar/ContextProgress.tsx +167 -0
- package/src/tui/components/StatusBar/FileChangesIndicator.tsx +62 -0
- package/src/tui/components/StatusBar/GitIndicator.tsx +89 -0
- package/src/tui/components/StatusBar/HeaderBar.tsx +126 -0
- package/src/tui/components/StatusBar/ModelIndicator.tsx +157 -0
- package/src/tui/components/StatusBar/PersistenceStatusIndicator.tsx +210 -0
- package/src/tui/components/StatusBar/ResilienceIndicator.tsx +106 -0
- package/src/tui/components/StatusBar/SandboxIndicator.tsx +167 -0
- package/src/tui/components/StatusBar/StatusBar.tsx +368 -0
- package/src/tui/components/StatusBar/ThinkingModeIndicator.tsx +170 -0
- package/src/tui/components/StatusBar/TokenBreakdown.tsx +246 -0
- package/src/tui/components/StatusBar/TokenCounter.tsx +135 -0
- package/src/tui/components/StatusBar/TrustModeIndicator.tsx +130 -0
- package/src/tui/components/StatusBar/WorkspaceIndicator.tsx +86 -0
- package/src/tui/components/StatusBar/__tests__/AgentModeIndicator.test.tsx +193 -0
- package/src/tui/components/StatusBar/__tests__/StatusBar.test.tsx +729 -0
- package/src/tui/components/StatusBar/index.ts +60 -0
- package/src/tui/components/TipBanner.tsx +115 -0
- package/src/tui/components/TodoItem.tsx +208 -0
- package/src/tui/components/TodoPanel.tsx +455 -0
- package/src/tui/components/Tools/ApprovalQueue.tsx +407 -0
- package/src/tui/components/Tools/OptionSelector.tsx +160 -0
- package/src/tui/components/Tools/PermissionDialog.tsx +286 -0
- package/src/tui/components/Tools/ToolParams.tsx +483 -0
- package/src/tui/components/Tools/ToolsPanel.tsx +178 -0
- package/src/tui/components/Tools/__tests__/PermissionDialog.test.tsx +510 -0
- package/src/tui/components/Tools/__tests__/ToolParams.test.tsx +432 -0
- package/src/tui/components/Tools/index.ts +21 -0
- package/src/tui/components/TrustPrompt.tsx +279 -0
- package/src/tui/components/UpdateBanner.tsx +166 -0
- package/src/tui/components/VimModeIndicator.tsx +112 -0
- package/src/tui/components/backtrack/BacktrackControls.tsx +402 -0
- package/src/tui/components/backtrack/index.ts +13 -0
- package/src/tui/components/common/AutoApprovalStatus.tsx +251 -0
- package/src/tui/components/common/CostWarning.tsx +294 -0
- package/src/tui/components/common/DynamicShortcutHints.tsx +209 -0
- package/src/tui/components/common/EnhancedLoadingIndicator.tsx +305 -0
- package/src/tui/components/common/ErrorBoundary.tsx +140 -0
- package/src/tui/components/common/GradientText.tsx +224 -0
- package/src/tui/components/common/HotkeyHelpModal.tsx +193 -0
- package/src/tui/components/common/HotkeyHints.tsx +70 -0
- package/src/tui/components/common/MaxSizedBox.tsx +354 -0
- package/src/tui/components/common/NewMessagesBadge.tsx +65 -0
- package/src/tui/components/common/ProtectedFileLegend.tsx +89 -0
- package/src/tui/components/common/ScrollIndicator.tsx +160 -0
- package/src/tui/components/common/Spinner.tsx +342 -0
- package/src/tui/components/common/StreamingIndicator.tsx +316 -0
- package/src/tui/components/common/VirtualizedList/VirtualizedList.tsx +428 -0
- package/src/tui/components/common/VirtualizedList/hooks/index.ts +19 -0
- package/src/tui/components/common/VirtualizedList/hooks/useBatchedScroll.ts +64 -0
- package/src/tui/components/common/VirtualizedList/hooks/useScrollAnchor.ts +290 -0
- package/src/tui/components/common/VirtualizedList/hooks/useVirtualization.ts +340 -0
- package/src/tui/components/common/VirtualizedList/index.ts +30 -0
- package/src/tui/components/common/VirtualizedList/types.ts +107 -0
- package/src/tui/components/common/__tests__/NewMessagesBadge.test.tsx +74 -0
- package/src/tui/components/common/__tests__/ScrollIndicator.test.tsx +193 -0
- package/src/tui/components/common/index.ts +110 -0
- package/src/tui/components/index.ts +79 -0
- package/src/tui/components/session/CheckpointPanel.tsx +323 -0
- package/src/tui/components/session/RollbackDialog.tsx +169 -0
- package/src/tui/components/session/SessionItem.tsx +136 -0
- package/src/tui/components/session/SessionListPanel.tsx +252 -0
- package/src/tui/components/session/SessionPicker.tsx +449 -0
- package/src/tui/components/session/SessionPreview.tsx +240 -0
- package/src/tui/components/session/__tests__/session.test.tsx +408 -0
- package/src/tui/components/session/index.ts +28 -0
- package/src/tui/components/session/types.ts +116 -0
- package/src/tui/components/theme/__tests__/tokens.test.ts +471 -0
- package/src/tui/components/theme/index.ts +227 -0
- package/src/tui/components/theme/tokens.ts +484 -0
- package/src/tui/config/defaults.ts +134 -0
- package/src/tui/config/index.ts +17 -0
- package/src/tui/context/AnimationContext.tsx +284 -0
- package/src/tui/context/AppContext.tsx +349 -0
- package/src/tui/context/BracketedPasteContext.tsx +372 -0
- package/src/tui/context/LspContext.tsx +192 -0
- package/src/tui/context/McpContext.tsx +325 -0
- package/src/tui/context/MessagesContext.tsx +870 -0
- package/src/tui/context/OverflowContext.tsx +213 -0
- package/src/tui/context/RateLimitContext.tsx +108 -0
- package/src/tui/context/ResilienceContext.tsx +275 -0
- package/src/tui/context/RootProvider.tsx +136 -0
- package/src/tui/context/ScrollContext.tsx +331 -0
- package/src/tui/context/ToolsContext.tsx +702 -0
- package/src/tui/context/__tests__/BracketedPasteContext.test.tsx +416 -0
- package/src/tui/context/index.ts +140 -0
- package/src/tui/enterprise-integration.ts +282 -0
- package/src/tui/hooks/__tests__/useBacktrack.test.tsx +138 -0
- package/src/tui/hooks/__tests__/useBracketedPaste.test.tsx +222 -0
- package/src/tui/hooks/__tests__/useCopyMode.test.tsx +336 -0
- package/src/tui/hooks/__tests__/useHotkeys.ctrl-input.test.tsx +96 -0
- package/src/tui/hooks/__tests__/useHotkeys.test.tsx +454 -0
- package/src/tui/hooks/__tests__/useInputHistory.test.tsx +660 -0
- package/src/tui/hooks/__tests__/useLineBuffer.test.ts +295 -0
- package/src/tui/hooks/__tests__/useModeController.test.ts +137 -0
- package/src/tui/hooks/__tests__/useModeShortcuts.test.tsx +142 -0
- package/src/tui/hooks/__tests__/useScrollController.test.ts +464 -0
- package/src/tui/hooks/__tests__/useVim.test.tsx +531 -0
- package/src/tui/hooks/index.ts +252 -0
- package/src/tui/hooks/useAgentLoop.ts +712 -0
- package/src/tui/hooks/useAlternateBuffer.ts +398 -0
- package/src/tui/hooks/useAnimatedScrollbar.ts +241 -0
- package/src/tui/hooks/useBacktrack.ts +443 -0
- package/src/tui/hooks/useBracketedPaste.ts +104 -0
- package/src/tui/hooks/useCollapsible.ts +240 -0
- package/src/tui/hooks/useCopyMode.ts +382 -0
- package/src/tui/hooks/useCostSummary.ts +75 -0
- package/src/tui/hooks/useDesktopNotification.ts +414 -0
- package/src/tui/hooks/useDiffMode.ts +44 -0
- package/src/tui/hooks/useFileChangeStats.ts +110 -0
- package/src/tui/hooks/useFileSuggestions.ts +284 -0
- package/src/tui/hooks/useFlickerDetector.ts +250 -0
- package/src/tui/hooks/useGitStatus.ts +200 -0
- package/src/tui/hooks/useHotkeys.ts +579 -0
- package/src/tui/hooks/useImagePaste.ts +114 -0
- package/src/tui/hooks/useInputHighlight.ts +145 -0
- package/src/tui/hooks/useInputHistory.ts +246 -0
- package/src/tui/hooks/useKeyboardScroll.ts +209 -0
- package/src/tui/hooks/useLineBuffer.ts +356 -0
- package/src/tui/hooks/useMentionAutocomplete.ts +235 -0
- package/src/tui/hooks/useModeController.ts +167 -0
- package/src/tui/hooks/useModeShortcuts.ts +196 -0
- package/src/tui/hooks/usePermissionHandler.ts +146 -0
- package/src/tui/hooks/usePersistence.ts +480 -0
- package/src/tui/hooks/usePersistenceShortcuts.ts +225 -0
- package/src/tui/hooks/usePlaceholderRotation.ts +143 -0
- package/src/tui/hooks/useProviderStatus.ts +270 -0
- package/src/tui/hooks/useRateLimitStatus.ts +90 -0
- package/src/tui/hooks/useScreenReader.ts +315 -0
- package/src/tui/hooks/useScrollController.ts +450 -0
- package/src/tui/hooks/useScrollEventBatcher.ts +185 -0
- package/src/tui/hooks/useSidebarPanelData.ts +115 -0
- package/src/tui/hooks/useSmoothScroll.ts +202 -0
- package/src/tui/hooks/useSnapshots.ts +300 -0
- package/src/tui/hooks/useStateAndRef.ts +50 -0
- package/src/tui/hooks/useTerminalSize.ts +206 -0
- package/src/tui/hooks/useToolApprovalController.ts +91 -0
- package/src/tui/hooks/useVim.ts +334 -0
- package/src/tui/hooks/useWorkspace.ts +56 -0
- package/src/tui/i18n/__tests__/init.test.ts +278 -0
- package/src/tui/i18n/__tests__/language-config.test.ts +199 -0
- package/src/tui/i18n/__tests__/locale-detection.test.ts +250 -0
- package/src/tui/i18n/__tests__/settings-integration.test.ts +262 -0
- package/src/tui/i18n/index.ts +72 -0
- package/src/tui/i18n/init.ts +131 -0
- package/src/tui/i18n/language-config.ts +106 -0
- package/src/tui/i18n/locale-detection.ts +173 -0
- package/src/tui/i18n/settings-integration.ts +557 -0
- package/src/tui/i18n/tui-namespace.ts +538 -0
- package/src/tui/i18n/types.ts +312 -0
- package/src/tui/index.ts +43 -0
- package/src/tui/lsp-integration.ts +409 -0
- package/src/tui/metrics-integration.ts +366 -0
- package/src/tui/plugins.ts +383 -0
- package/src/tui/resilience.ts +342 -0
- package/src/tui/sandbox-integration.ts +317 -0
- package/src/tui/services/clipboard.ts +348 -0
- package/src/tui/services/fuzzy-search.ts +441 -0
- package/src/tui/services/index.ts +72 -0
- package/src/tui/services/markdown-renderer.ts +565 -0
- package/src/tui/services/open-external.ts +247 -0
- package/src/tui/services/syntax-highlighter.ts +483 -0
- package/src/tui/slash-commands.ts +12 -0
- package/src/tui/theme/index.ts +15 -0
- package/src/tui/theme/provider.tsx +206 -0
- package/src/tui/tip-integration.ts +300 -0
- package/src/tui/types/__tests__/ink-extended.test.ts +121 -0
- package/src/tui/types/ink-extended.ts +87 -0
- package/src/tui/utils/__tests__/bracketedPaste.test.ts +231 -0
- package/src/tui/utils/__tests__/heightEstimator.test.ts +157 -0
- package/src/tui/utils/__tests__/text-width.test.ts +158 -0
- package/src/tui/utils/__tests__/textSanitizer.test.ts +266 -0
- package/src/tui/utils/__tests__/ui-sizing.test.ts +169 -0
- package/src/tui/utils/bracketedPaste.ts +107 -0
- package/src/tui/utils/cursor-manager.ts +131 -0
- package/src/tui/utils/detectTerminal.ts +596 -0
- package/src/tui/utils/findLastSafeSplitPoint.ts +92 -0
- package/src/tui/utils/heightEstimator.ts +198 -0
- package/src/tui/utils/index.ts +91 -0
- package/src/tui/utils/isNarrowWidth.ts +52 -0
- package/src/tui/utils/stdoutGuard.ts +90 -0
- package/src/tui/utils/synchronized-update.ts +70 -0
- package/src/tui/utils/text-width.ts +225 -0
- package/src/tui/utils/textSanitizer.ts +225 -0
- package/src/tui/utils/textUtils.ts +114 -0
- package/src/tui/utils/ui-sizing.ts +192 -0
- package/src/tui-blessed/app.ts +160 -0
- package/src/tui-blessed/index.ts +2 -0
- package/src/tui-blessed/neo-blessed.d.ts +6 -0
- package/src/tui-blessed/test.ts +21 -0
- package/src/tui-blessed/types.ts +14 -0
- package/src/utils/icons.ts +130 -0
- package/src/utils/index.ts +33 -0
- package/src/utils/resume-hint.ts +86 -0
- package/src/version.ts +1 -0
- package/tsconfig.json +8 -0
- package/vitest.config.ts +35 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Onboard Command (Phase 38)
|
|
3
|
+
*
|
|
4
|
+
* CLI command to run or restart the onboarding wizard.
|
|
5
|
+
* Can be invoked as `vellum onboard` or `/onboard` slash command.
|
|
6
|
+
*
|
|
7
|
+
* @module cli/commands/onboard
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { EXIT_CODES } from "./exit-codes.js";
|
|
11
|
+
import type { CommandContext, CommandResult, SlashCommand } from "./types.js";
|
|
12
|
+
|
|
13
|
+
// =============================================================================
|
|
14
|
+
// Types
|
|
15
|
+
// =============================================================================
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Onboard command options
|
|
19
|
+
*/
|
|
20
|
+
export interface OnboardOptions {
|
|
21
|
+
/** Force restart even if already completed */
|
|
22
|
+
force?: boolean;
|
|
23
|
+
/** Skip to specific step */
|
|
24
|
+
step?: string;
|
|
25
|
+
/** Non-interactive mode */
|
|
26
|
+
nonInteractive?: boolean;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Onboard command result
|
|
31
|
+
*/
|
|
32
|
+
export interface OnboardResult {
|
|
33
|
+
/** Whether onboarding completed successfully */
|
|
34
|
+
success: boolean;
|
|
35
|
+
/** Selected provider */
|
|
36
|
+
provider?: string;
|
|
37
|
+
/** Selected mode */
|
|
38
|
+
mode?: string;
|
|
39
|
+
/** Whether credentials were configured */
|
|
40
|
+
credentialsConfigured: boolean;
|
|
41
|
+
/** Error message if failed */
|
|
42
|
+
error?: string;
|
|
43
|
+
/** Exit code */
|
|
44
|
+
exitCode: number;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// =============================================================================
|
|
48
|
+
// Slash Command Definition
|
|
49
|
+
// =============================================================================
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Onboard slash command definition
|
|
53
|
+
*/
|
|
54
|
+
export const onboardCommand: SlashCommand = {
|
|
55
|
+
name: "onboard",
|
|
56
|
+
aliases: ["setup", "wizard"],
|
|
57
|
+
description: "Run the onboarding wizard to configure Vellum",
|
|
58
|
+
category: "session",
|
|
59
|
+
kind: "builtin",
|
|
60
|
+
positionalArgs: [
|
|
61
|
+
{
|
|
62
|
+
name: "force",
|
|
63
|
+
type: "boolean",
|
|
64
|
+
description: "Force restart even if already completed",
|
|
65
|
+
required: false,
|
|
66
|
+
},
|
|
67
|
+
],
|
|
68
|
+
namedArgs: [
|
|
69
|
+
{
|
|
70
|
+
name: "step",
|
|
71
|
+
type: "string",
|
|
72
|
+
description:
|
|
73
|
+
"Skip to specific step (welcome, provider-select, credential-setup, mode-select)",
|
|
74
|
+
required: false,
|
|
75
|
+
},
|
|
76
|
+
],
|
|
77
|
+
subcommands: [
|
|
78
|
+
{ name: "welcome", description: "Show welcome screen" },
|
|
79
|
+
{ name: "provider", description: "Configure LLM provider", aliases: ["provider-select"] },
|
|
80
|
+
{ name: "credential", description: "Setup API credentials", aliases: ["credential-setup"] },
|
|
81
|
+
{ name: "mode", description: "Choose default mode", aliases: ["mode-select"] },
|
|
82
|
+
],
|
|
83
|
+
examples: [
|
|
84
|
+
"/onboard - Run onboarding wizard",
|
|
85
|
+
"/onboard --force - Restart onboarding from beginning",
|
|
86
|
+
"/onboard --step provider-select - Jump to provider selection",
|
|
87
|
+
],
|
|
88
|
+
execute: async (context: CommandContext): Promise<CommandResult> => {
|
|
89
|
+
const { parsedArgs } = context;
|
|
90
|
+
const force = parsedArgs.positional[0] === "true" || parsedArgs.named.force === "true";
|
|
91
|
+
const stepArg = parsedArgs.named.step as string | undefined;
|
|
92
|
+
|
|
93
|
+
// Import dynamically to avoid circular dependencies
|
|
94
|
+
const { OnboardingWizard, shouldRunOnboarding, ONBOARDING_STEPS } = await import(
|
|
95
|
+
"@vellum/core"
|
|
96
|
+
);
|
|
97
|
+
|
|
98
|
+
// Check if onboarding needed
|
|
99
|
+
const needsOnboarding = await shouldRunOnboarding();
|
|
100
|
+
|
|
101
|
+
if (!needsOnboarding && !force) {
|
|
102
|
+
return {
|
|
103
|
+
kind: "success",
|
|
104
|
+
message: "✅ Onboarding already completed. Use --force to restart.",
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Create wizard with force option
|
|
109
|
+
const wizard = new OnboardingWizard({ force });
|
|
110
|
+
await wizard.loadState();
|
|
111
|
+
|
|
112
|
+
// Jump to specific step if requested
|
|
113
|
+
if (stepArg) {
|
|
114
|
+
const validSteps = ONBOARDING_STEPS as readonly string[];
|
|
115
|
+
if (!validSteps.includes(stepArg)) {
|
|
116
|
+
return {
|
|
117
|
+
kind: "error",
|
|
118
|
+
code: "INVALID_ARGUMENT",
|
|
119
|
+
message: `Invalid step: ${stepArg}. Valid steps: ${validSteps.join(", ")}`,
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
await wizard.goToStep(
|
|
123
|
+
stepArg as "welcome" | "provider-select" | "credential-setup" | "mode-select" | "complete"
|
|
124
|
+
);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Return interactive prompt that triggers wizard
|
|
128
|
+
return {
|
|
129
|
+
kind: "interactive",
|
|
130
|
+
prompt: {
|
|
131
|
+
inputType: "text",
|
|
132
|
+
message: `🚀 Starting Vellum Setup Wizard\n\nThis will guide you through:\n• Provider selection (Anthropic, OpenAI, etc.)\n• API key configuration\n• Default mode selection\n\nPress Enter to continue or type 'skip' to exit.`,
|
|
133
|
+
placeholder: "",
|
|
134
|
+
defaultValue: "",
|
|
135
|
+
handler: async (value: string): Promise<CommandResult> => {
|
|
136
|
+
if (value.toLowerCase() === "skip") {
|
|
137
|
+
return {
|
|
138
|
+
kind: "success",
|
|
139
|
+
message: "Onboarding skipped. Run /onboard when ready.",
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Run welcome step
|
|
144
|
+
await wizard.executeWelcome();
|
|
145
|
+
|
|
146
|
+
return {
|
|
147
|
+
kind: "success",
|
|
148
|
+
message: `✅ Welcome complete!\n\nCurrent step: ${wizard.getCurrentStep()}\n\nFor the full wizard experience, use the TUI or run:\n• /provider - Select AI provider\n• /credentials - Configure API keys\n• /mode - Set default mode`,
|
|
149
|
+
};
|
|
150
|
+
},
|
|
151
|
+
onCancel: () => ({
|
|
152
|
+
kind: "success",
|
|
153
|
+
message: "Onboarding cancelled. Run /onboard when ready.",
|
|
154
|
+
}),
|
|
155
|
+
},
|
|
156
|
+
};
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
// =============================================================================
|
|
161
|
+
// CLI Entry Point
|
|
162
|
+
// =============================================================================
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Run onboard command from CLI (non-TUI mode)
|
|
166
|
+
*/
|
|
167
|
+
export async function runOnboardCommand(options: OnboardOptions = {}): Promise<OnboardResult> {
|
|
168
|
+
const { OnboardingWizard, shouldRunOnboarding } = await import("@vellum/core");
|
|
169
|
+
|
|
170
|
+
// Check if needed
|
|
171
|
+
if (!options.force && !(await shouldRunOnboarding())) {
|
|
172
|
+
return {
|
|
173
|
+
success: true,
|
|
174
|
+
credentialsConfigured: true,
|
|
175
|
+
exitCode: EXIT_CODES.SUCCESS,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// For non-interactive, just report status
|
|
180
|
+
if (options.nonInteractive) {
|
|
181
|
+
const isFirstRun = OnboardingWizard.isFirstRun();
|
|
182
|
+
return {
|
|
183
|
+
success: false,
|
|
184
|
+
credentialsConfigured: false,
|
|
185
|
+
error: isFirstRun
|
|
186
|
+
? "First run detected. Please run 'vellum onboard' interactively."
|
|
187
|
+
: "Onboarding incomplete. Please run 'vellum onboard' interactively.",
|
|
188
|
+
exitCode: EXIT_CODES.ERROR,
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// Interactive mode handled by TUI
|
|
193
|
+
const wizard = new OnboardingWizard({ force: options.force });
|
|
194
|
+
await wizard.loadState();
|
|
195
|
+
|
|
196
|
+
// Return wizard for TUI to handle
|
|
197
|
+
return {
|
|
198
|
+
success: false,
|
|
199
|
+
credentialsConfigured: false,
|
|
200
|
+
error: "Interactive mode required",
|
|
201
|
+
exitCode: EXIT_CODES.SUCCESS,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
export default onboardCommand;
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Open Slash Command
|
|
3
|
+
*
|
|
4
|
+
* Opens files and URLs using system defaults:
|
|
5
|
+
* - /open <url> - Open URL in browser
|
|
6
|
+
* - /open <file> - Open file with default app
|
|
7
|
+
* - /open -e <file> - Open file in editor (supports :line)
|
|
8
|
+
*
|
|
9
|
+
* @module cli/commands/open
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import * as path from "node:path";
|
|
13
|
+
import { isValidUrl, openFile, openInEditor, openUrl } from "../tui/services/open-external.js";
|
|
14
|
+
import type { CommandContext, CommandResult, SlashCommand } from "./types.js";
|
|
15
|
+
import { error, success } from "./types.js";
|
|
16
|
+
|
|
17
|
+
// =============================================================================
|
|
18
|
+
// Helper Functions
|
|
19
|
+
// =============================================================================
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Parse file path with optional line number
|
|
23
|
+
*
|
|
24
|
+
* Supports formats:
|
|
25
|
+
* - /path/to/file.ts
|
|
26
|
+
* - /path/to/file.ts:42
|
|
27
|
+
* - C:\path\to\file.ts:42 (Windows)
|
|
28
|
+
*
|
|
29
|
+
* @param input - Path string potentially containing :line suffix
|
|
30
|
+
* @returns Parsed path and optional line number
|
|
31
|
+
*/
|
|
32
|
+
function parsePathWithLine(input: string): { filePath: string; line?: number } {
|
|
33
|
+
// Windows absolute path check (C:\, D:\, etc.)
|
|
34
|
+
const isWindowsAbsolute = /^[a-zA-Z]:[/\\]/.test(input);
|
|
35
|
+
|
|
36
|
+
// Find the last colon that's followed by a number (line indicator)
|
|
37
|
+
// For Windows paths, skip the drive letter colon
|
|
38
|
+
const searchStart = isWindowsAbsolute ? 2 : 0;
|
|
39
|
+
const colonIndex = input.lastIndexOf(":");
|
|
40
|
+
|
|
41
|
+
if (colonIndex > searchStart) {
|
|
42
|
+
const potentialLine = input.slice(colonIndex + 1);
|
|
43
|
+
const lineNum = parseInt(potentialLine, 10);
|
|
44
|
+
|
|
45
|
+
if (!Number.isNaN(lineNum) && lineNum > 0) {
|
|
46
|
+
return {
|
|
47
|
+
filePath: input.slice(0, colonIndex),
|
|
48
|
+
line: lineNum,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return { filePath: input };
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Resolve path relative to current working directory
|
|
58
|
+
*/
|
|
59
|
+
function resolvePath(inputPath: string, cwd: string): string {
|
|
60
|
+
if (path.isAbsolute(inputPath)) {
|
|
61
|
+
return inputPath;
|
|
62
|
+
}
|
|
63
|
+
return path.resolve(cwd, inputPath);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// =============================================================================
|
|
67
|
+
// Command Implementation
|
|
68
|
+
// =============================================================================
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Open command handler
|
|
72
|
+
*/
|
|
73
|
+
async function executeOpen(ctx: CommandContext): Promise<CommandResult> {
|
|
74
|
+
const target = ctx.parsedArgs.positional[0] as string | undefined;
|
|
75
|
+
const inEditor = ctx.parsedArgs.named.editor === true || ctx.parsedArgs.named.e === true;
|
|
76
|
+
|
|
77
|
+
if (!target) {
|
|
78
|
+
return error(
|
|
79
|
+
"MISSING_ARGUMENT",
|
|
80
|
+
"Missing target. Usage: /open <url|file> or /open -e <file>[:line]",
|
|
81
|
+
["/open https://example.com", "/open ./README.md", "/open -e src/index.ts:42"]
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// URL handling
|
|
86
|
+
if (isValidUrl(target)) {
|
|
87
|
+
if (inEditor) {
|
|
88
|
+
return error(
|
|
89
|
+
"INVALID_ARGUMENT",
|
|
90
|
+
"Cannot open URL in editor. Use /open <url> without -e flag."
|
|
91
|
+
);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const result = await openUrl(target);
|
|
95
|
+
if (result.success) {
|
|
96
|
+
return success(`Opened ${target} in browser`);
|
|
97
|
+
}
|
|
98
|
+
return error("INTERNAL_ERROR", result.error);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// File handling
|
|
102
|
+
const cwd = ctx.session.cwd ?? process.cwd();
|
|
103
|
+
const { filePath, line } = parsePathWithLine(target);
|
|
104
|
+
const resolvedPath = resolvePath(filePath, cwd);
|
|
105
|
+
|
|
106
|
+
if (inEditor) {
|
|
107
|
+
const result = await openInEditor(resolvedPath, { line });
|
|
108
|
+
if (result.success) {
|
|
109
|
+
const location = line ? `${resolvedPath}:${line}` : resolvedPath;
|
|
110
|
+
return success(`Opened ${location} in editor`);
|
|
111
|
+
}
|
|
112
|
+
return error("INTERNAL_ERROR", result.error);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Default: open with system default application
|
|
116
|
+
const result = await openFile(resolvedPath);
|
|
117
|
+
if (result.success) {
|
|
118
|
+
return success(`Opened ${resolvedPath}`);
|
|
119
|
+
}
|
|
120
|
+
return error("INTERNAL_ERROR", result.error);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// =============================================================================
|
|
124
|
+
// Command Definition
|
|
125
|
+
// =============================================================================
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* /open command - Open files and URLs externally
|
|
129
|
+
*
|
|
130
|
+
* @example
|
|
131
|
+
* ```
|
|
132
|
+
* /open https://github.com # Open URL in browser
|
|
133
|
+
* /open ./README.md # Open file with default app
|
|
134
|
+
* /open -e src/index.ts # Open in editor (VS Code)
|
|
135
|
+
* /open -e src/index.ts:42 # Open in editor at line 42
|
|
136
|
+
* ```
|
|
137
|
+
*/
|
|
138
|
+
export const openCommand: SlashCommand = {
|
|
139
|
+
name: "open",
|
|
140
|
+
description: "Open a file or URL with system default or editor",
|
|
141
|
+
kind: "builtin",
|
|
142
|
+
category: "navigation",
|
|
143
|
+
aliases: ["o"],
|
|
144
|
+
positionalArgs: [
|
|
145
|
+
{
|
|
146
|
+
name: "target",
|
|
147
|
+
type: "string",
|
|
148
|
+
description: "URL or file path to open (supports :line for editor)",
|
|
149
|
+
required: true,
|
|
150
|
+
},
|
|
151
|
+
],
|
|
152
|
+
namedArgs: [
|
|
153
|
+
{
|
|
154
|
+
name: "editor",
|
|
155
|
+
shorthand: "e",
|
|
156
|
+
type: "boolean",
|
|
157
|
+
description: "Open in text editor (VS Code) instead of default app",
|
|
158
|
+
required: false,
|
|
159
|
+
default: false,
|
|
160
|
+
},
|
|
161
|
+
],
|
|
162
|
+
examples: [
|
|
163
|
+
"/open https://github.com",
|
|
164
|
+
"/open ./README.md",
|
|
165
|
+
"/open -e src/index.ts",
|
|
166
|
+
"/open -e src/index.ts:42",
|
|
167
|
+
],
|
|
168
|
+
execute: executeOpen,
|
|
169
|
+
};
|