@gguf/coder 0.2.9 → 0.3.1
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/.editorconfig +16 -0
- package/.env.example +63 -0
- package/.gitattributes +1 -0
- package/.semgrepignore +19 -0
- package/coder-dummy-file.ts +52 -0
- package/coder.config.example.json +59 -0
- package/coder.config.json +13 -0
- package/color_picker.html +36 -0
- package/dist/tools/execute-bash.js +3 -3
- package/dist/tools/execute-bash.js.map +1 -1
- package/dist/tools/fetch-url.js +3 -3
- package/dist/tools/fetch-url.js.map +1 -1
- package/dist/tools/find-files.d.ts.map +1 -1
- package/dist/tools/find-files.js +1 -1
- package/dist/tools/find-files.js.map +1 -1
- package/dist/tools/lsp-get-diagnostics.js +1 -1
- package/dist/tools/lsp-get-diagnostics.js.map +1 -1
- package/dist/tools/read-file.d.ts.map +1 -1
- package/dist/tools/read-file.js +6 -6
- package/dist/tools/read-file.js.map +1 -1
- package/dist/tools/search-file-contents.d.ts.map +1 -1
- package/dist/tools/search-file-contents.js +1 -1
- package/dist/tools/search-file-contents.js.map +1 -1
- package/dist/tools/string-replace.js +11 -11
- package/dist/tools/string-replace.js.map +1 -1
- package/dist/tools/web-search.d.ts.map +1 -1
- package/dist/tools/web-search.js +3 -3
- package/dist/tools/web-search.js.map +1 -1
- package/dist/tools/write-file.js +4 -4
- package/dist/tools/write-file.js.map +1 -1
- package/dist/utils/tool-result-display.d.ts.map +1 -1
- package/dist/utils/tool-result-display.js +3 -3
- package/dist/utils/tool-result-display.js.map +1 -1
- package/package.json +2 -14
- package/scripts/extract-changelog.js +73 -0
- package/scripts/fetch-models.js +143 -0
- package/scripts/test.sh +40 -0
- package/scripts/update-homebrew-formula.sh +125 -0
- package/scripts/update-nix-version.sh +157 -0
- package/source/ai-sdk-client/AISDKClient.spec.ts +117 -0
- package/source/ai-sdk-client/AISDKClient.ts +155 -0
- package/source/ai-sdk-client/chat/chat-handler.spec.ts +121 -0
- package/source/ai-sdk-client/chat/chat-handler.ts +276 -0
- package/source/ai-sdk-client/chat/streaming-handler.spec.ts +173 -0
- package/source/ai-sdk-client/chat/streaming-handler.ts +110 -0
- package/source/ai-sdk-client/chat/tool-processor.spec.ts +92 -0
- package/source/ai-sdk-client/chat/tool-processor.ts +70 -0
- package/source/ai-sdk-client/converters/message-converter.spec.ts +220 -0
- package/source/ai-sdk-client/converters/message-converter.ts +113 -0
- package/source/ai-sdk-client/converters/tool-converter.spec.ts +90 -0
- package/source/ai-sdk-client/converters/tool-converter.ts +46 -0
- package/source/ai-sdk-client/error-handling/error-extractor.spec.ts +55 -0
- package/source/ai-sdk-client/error-handling/error-extractor.ts +15 -0
- package/source/ai-sdk-client/error-handling/error-parser.spec.ts +169 -0
- package/source/ai-sdk-client/error-handling/error-parser.ts +161 -0
- package/source/ai-sdk-client/index.ts +7 -0
- package/source/ai-sdk-client/providers/provider-factory.spec.ts +71 -0
- package/source/ai-sdk-client/providers/provider-factory.ts +41 -0
- package/source/ai-sdk-client/types.ts +9 -0
- package/source/ai-sdk-client-empty-message.spec.ts +141 -0
- package/source/ai-sdk-client-error-handling.spec.ts +186 -0
- package/source/ai-sdk-client-maxretries.spec.ts +114 -0
- package/source/ai-sdk-client-preparestep.spec.ts +279 -0
- package/source/app/App.spec.tsx +32 -0
- package/source/app/App.tsx +480 -0
- package/source/app/components/AppContainer.spec.tsx +96 -0
- package/source/app/components/AppContainer.tsx +56 -0
- package/source/app/components/ChatInterface.spec.tsx +163 -0
- package/source/app/components/ChatInterface.tsx +144 -0
- package/source/app/components/ModalSelectors.spec.tsx +141 -0
- package/source/app/components/ModalSelectors.tsx +135 -0
- package/source/app/helpers.spec.ts +97 -0
- package/source/app/helpers.ts +63 -0
- package/source/app/index.ts +4 -0
- package/source/app/types.ts +39 -0
- package/source/app/utils/appUtils.ts +294 -0
- package/source/app/utils/conversationState.ts +310 -0
- package/source/app.spec.tsx +244 -0
- package/source/cli.spec.ts +73 -0
- package/source/cli.tsx +51 -0
- package/source/client-factory.spec.ts +48 -0
- package/source/client-factory.ts +178 -0
- package/source/command-parser.spec.ts +127 -0
- package/source/command-parser.ts +36 -0
- package/source/commands/checkpoint.spec.tsx +277 -0
- package/source/commands/checkpoint.tsx +366 -0
- package/source/commands/clear.tsx +22 -0
- package/source/commands/custom-commands.tsx +121 -0
- package/source/commands/exit.ts +21 -0
- package/source/commands/export.spec.tsx +131 -0
- package/source/commands/export.tsx +79 -0
- package/source/commands/help.tsx +120 -0
- package/source/commands/index.ts +17 -0
- package/source/commands/init.tsx +339 -0
- package/source/commands/lsp-command.spec.tsx +281 -0
- package/source/commands/lsp.tsx +120 -0
- package/source/commands/mcp-command.spec.tsx +313 -0
- package/source/commands/mcp.tsx +162 -0
- package/source/commands/model-database.spec.tsx +758 -0
- package/source/commands/model-database.tsx +418 -0
- package/source/commands/model.ts +12 -0
- package/source/commands/provider.ts +12 -0
- package/source/commands/setup-config.tsx +16 -0
- package/source/commands/simple-commands.spec.tsx +175 -0
- package/source/commands/status.ts +12 -0
- package/source/commands/theme.ts +12 -0
- package/source/commands/update.spec.tsx +261 -0
- package/source/commands/update.tsx +201 -0
- package/source/commands/usage.spec.tsx +495 -0
- package/source/commands/usage.tsx +100 -0
- package/source/commands.spec.ts +436 -0
- package/source/commands.ts +83 -0
- package/source/components/assistant-message.spec.tsx +796 -0
- package/source/components/assistant-message.tsx +34 -0
- package/source/components/bash-execution-indicator.tsx +21 -0
- package/source/components/cancelling-indicator.tsx +16 -0
- package/source/components/chat-queue.spec.tsx +83 -0
- package/source/components/chat-queue.tsx +36 -0
- package/source/components/checkpoint-display.spec.tsx +219 -0
- package/source/components/checkpoint-display.tsx +126 -0
- package/source/components/checkpoint-selector.spec.tsx +173 -0
- package/source/components/checkpoint-selector.tsx +173 -0
- package/source/components/development-mode-indicator.spec.tsx +268 -0
- package/source/components/development-mode-indicator.tsx +38 -0
- package/source/components/message-box.spec.tsx +427 -0
- package/source/components/message-box.tsx +87 -0
- package/source/components/model-selector.tsx +132 -0
- package/source/components/provider-selector.tsx +75 -0
- package/source/components/random-spinner.tsx +19 -0
- package/source/components/security-disclaimer.tsx +73 -0
- package/source/components/status-connection-display.spec.tsx +133 -0
- package/source/components/status.tsx +267 -0
- package/source/components/theme-selector.tsx +126 -0
- package/source/components/tool-confirmation.tsx +190 -0
- package/source/components/tool-execution-indicator.tsx +33 -0
- package/source/components/tool-message.tsx +85 -0
- package/source/components/ui/titled-box.spec.tsx +207 -0
- package/source/components/ui/titled-box.tsx +57 -0
- package/source/components/usage/progress-bar.spec.tsx +398 -0
- package/source/components/usage/progress-bar.tsx +30 -0
- package/source/components/usage/usage-display.spec.tsx +780 -0
- package/source/components/usage/usage-display.tsx +291 -0
- package/source/components/user-input.spec.tsx +327 -0
- package/source/components/user-input.tsx +533 -0
- package/source/components/user-message.spec.tsx +230 -0
- package/source/components/user-message.tsx +84 -0
- package/source/components/welcome-message.tsx +76 -0
- package/source/config/env-substitution.ts +65 -0
- package/source/config/index.spec.ts +171 -0
- package/source/config/index.ts +154 -0
- package/source/config/paths.spec.ts +241 -0
- package/source/config/paths.ts +55 -0
- package/source/config/preferences.ts +51 -0
- package/source/config/themes.ts +315 -0
- package/source/constants.ts +130 -0
- package/source/context/mode-context.spec.ts +79 -0
- package/source/context/mode-context.ts +24 -0
- package/source/custom-commands/executor.spec.ts +142 -0
- package/source/custom-commands/executor.ts +64 -0
- package/source/custom-commands/loader.spec.ts +314 -0
- package/source/custom-commands/loader.ts +153 -0
- package/source/custom-commands/parser.ts +196 -0
- package/source/hooks/chat-handler/conversation/conversation-loop.spec.ts +39 -0
- package/source/hooks/chat-handler/conversation/conversation-loop.tsx +511 -0
- package/source/hooks/chat-handler/conversation/tool-executor.spec.ts +50 -0
- package/source/hooks/chat-handler/conversation/tool-executor.tsx +109 -0
- package/source/hooks/chat-handler/index.ts +12 -0
- package/source/hooks/chat-handler/state/streaming-state.spec.ts +26 -0
- package/source/hooks/chat-handler/state/streaming-state.ts +19 -0
- package/source/hooks/chat-handler/types.ts +38 -0
- package/source/hooks/chat-handler/useChatHandler.spec.tsx +321 -0
- package/source/hooks/chat-handler/useChatHandler.tsx +194 -0
- package/source/hooks/chat-handler/utils/context-checker.spec.ts +60 -0
- package/source/hooks/chat-handler/utils/context-checker.tsx +73 -0
- package/source/hooks/chat-handler/utils/message-helpers.spec.ts +42 -0
- package/source/hooks/chat-handler/utils/message-helpers.tsx +36 -0
- package/source/hooks/chat-handler/utils/tool-filters.spec.ts +109 -0
- package/source/hooks/chat-handler/utils/tool-filters.ts +64 -0
- package/source/hooks/useAppHandlers.tsx +291 -0
- package/source/hooks/useAppInitialization.tsx +422 -0
- package/source/hooks/useAppState.tsx +311 -0
- package/source/hooks/useDirectoryTrust.tsx +98 -0
- package/source/hooks/useInputState.ts +414 -0
- package/source/hooks/useModeHandlers.tsx +302 -0
- package/source/hooks/useNonInteractiveMode.ts +140 -0
- package/source/hooks/useTerminalWidth.tsx +81 -0
- package/source/hooks/useTheme.ts +18 -0
- package/source/hooks/useToolHandler.tsx +349 -0
- package/source/hooks/useUIState.ts +61 -0
- package/source/init/agents-template-generator.ts +421 -0
- package/source/init/existing-rules-extractor.ts +319 -0
- package/source/init/file-scanner.spec.ts +227 -0
- package/source/init/file-scanner.ts +238 -0
- package/source/init/framework-detector.ts +382 -0
- package/source/init/language-detector.ts +269 -0
- package/source/init/project-analyzer.spec.ts +231 -0
- package/source/init/project-analyzer.ts +458 -0
- package/source/lsp/index.ts +31 -0
- package/source/lsp/lsp-client.spec.ts +508 -0
- package/source/lsp/lsp-client.ts +487 -0
- package/source/lsp/lsp-manager.spec.ts +477 -0
- package/source/lsp/lsp-manager.ts +419 -0
- package/source/lsp/protocol.spec.ts +502 -0
- package/source/lsp/protocol.ts +360 -0
- package/source/lsp/server-discovery.spec.ts +654 -0
- package/source/lsp/server-discovery.ts +515 -0
- package/source/markdown-parser/html-entities.spec.ts +88 -0
- package/source/markdown-parser/html-entities.ts +45 -0
- package/source/markdown-parser/index.spec.ts +281 -0
- package/source/markdown-parser/index.ts +126 -0
- package/source/markdown-parser/table-parser.spec.ts +133 -0
- package/source/markdown-parser/table-parser.ts +114 -0
- package/source/markdown-parser/utils.spec.ts +70 -0
- package/source/markdown-parser/utils.ts +13 -0
- package/source/mcp/mcp-client.spec.ts +81 -0
- package/source/mcp/mcp-client.ts +625 -0
- package/source/mcp/transport-factory.spec.ts +406 -0
- package/source/mcp/transport-factory.ts +312 -0
- package/source/message-handler.ts +67 -0
- package/source/model-database/database-engine.spec.ts +494 -0
- package/source/model-database/database-engine.ts +50 -0
- package/source/model-database/model-database.spec.ts +363 -0
- package/source/model-database/model-database.ts +91 -0
- package/source/model-database/model-engine.spec.ts +447 -0
- package/source/model-database/model-engine.ts +65 -0
- package/source/model-database/model-fetcher.spec.ts +583 -0
- package/source/model-database/model-fetcher.ts +330 -0
- package/source/models/index.ts +1 -0
- package/source/models/models-cache.spec.ts +214 -0
- package/source/models/models-cache.ts +78 -0
- package/source/models/models-dev-client.spec.ts +379 -0
- package/source/models/models-dev-client.ts +329 -0
- package/source/models/models-types.ts +68 -0
- package/source/prompt-history.ts +155 -0
- package/source/security/command-injection.spec.ts +240 -0
- package/source/services/checkpoint-manager.spec.ts +523 -0
- package/source/services/checkpoint-manager.ts +466 -0
- package/source/services/file-snapshot.spec.ts +569 -0
- package/source/services/file-snapshot.ts +220 -0
- package/source/test-utils/render-with-theme.tsx +48 -0
- package/source/tokenization/index.ts +1 -0
- package/source/tokenization/tokenizer-factory.spec.ts +170 -0
- package/source/tokenization/tokenizer-factory.ts +125 -0
- package/source/tokenization/tokenizers/anthropic-tokenizer.spec.ts +200 -0
- package/source/tokenization/tokenizers/anthropic-tokenizer.ts +43 -0
- package/source/tokenization/tokenizers/fallback-tokenizer.spec.ts +236 -0
- package/source/tokenization/tokenizers/fallback-tokenizer.ts +26 -0
- package/source/tokenization/tokenizers/llama-tokenizer.spec.ts +224 -0
- package/source/tokenization/tokenizers/llama-tokenizer.ts +41 -0
- package/source/tokenization/tokenizers/openai-tokenizer.spec.ts +184 -0
- package/source/tokenization/tokenizers/openai-tokenizer.ts +57 -0
- package/source/tool-calling/index.ts +5 -0
- package/source/tool-calling/json-parser.spec.ts +639 -0
- package/source/tool-calling/json-parser.ts +247 -0
- package/source/tool-calling/tool-parser.spec.ts +395 -0
- package/source/tool-calling/tool-parser.ts +120 -0
- package/source/tool-calling/xml-parser.spec.ts +662 -0
- package/source/tool-calling/xml-parser.ts +289 -0
- package/source/tools/execute-bash.spec.tsx +353 -0
- package/source/tools/execute-bash.tsx +219 -0
- package/source/tools/execute-function.spec.ts +130 -0
- package/source/tools/fetch-url.spec.tsx +342 -0
- package/source/tools/fetch-url.tsx +172 -0
- package/source/tools/find-files.spec.tsx +924 -0
- package/source/tools/find-files.tsx +293 -0
- package/source/tools/index.ts +102 -0
- package/source/tools/lsp-get-diagnostics.tsx +192 -0
- package/source/tools/needs-approval.spec.ts +282 -0
- package/source/tools/read-file.spec.tsx +801 -0
- package/source/tools/read-file.tsx +387 -0
- package/source/tools/search-file-contents.spec.tsx +1273 -0
- package/source/tools/search-file-contents.tsx +293 -0
- package/source/tools/string-replace.spec.tsx +730 -0
- package/source/tools/string-replace.tsx +548 -0
- package/source/tools/tool-manager.ts +210 -0
- package/source/tools/tool-registry.spec.ts +415 -0
- package/source/tools/tool-registry.ts +228 -0
- package/source/tools/web-search.tsx +223 -0
- package/source/tools/write-file.spec.tsx +559 -0
- package/source/tools/write-file.tsx +228 -0
- package/source/types/app.ts +37 -0
- package/source/types/checkpoint.ts +48 -0
- package/source/types/commands.ts +46 -0
- package/source/types/components.ts +27 -0
- package/source/types/config.ts +103 -0
- package/source/types/core-connection-status.spec.ts +67 -0
- package/source/types/core.ts +181 -0
- package/source/types/hooks.ts +50 -0
- package/source/types/index.ts +12 -0
- package/source/types/markdown-parser.ts +11 -0
- package/source/types/mcp.ts +52 -0
- package/source/types/system.ts +16 -0
- package/source/types/tokenization.ts +41 -0
- package/source/types/ui.ts +40 -0
- package/source/types/usage.ts +58 -0
- package/source/types/utils.ts +16 -0
- package/source/usage/calculator.spec.ts +385 -0
- package/source/usage/calculator.ts +104 -0
- package/source/usage/storage.spec.ts +703 -0
- package/source/usage/storage.ts +238 -0
- package/source/usage/tracker.spec.ts +456 -0
- package/source/usage/tracker.ts +102 -0
- package/source/utils/atomic-deletion.spec.ts +194 -0
- package/source/utils/atomic-deletion.ts +127 -0
- package/source/utils/bounded-map.spec.ts +300 -0
- package/source/utils/bounded-map.ts +193 -0
- package/source/utils/checkpoint-utils.spec.ts +222 -0
- package/source/utils/checkpoint-utils.ts +92 -0
- package/source/utils/error-formatter.spec.ts +169 -0
- package/source/utils/error-formatter.ts +194 -0
- package/source/utils/file-autocomplete.spec.ts +173 -0
- package/source/utils/file-autocomplete.ts +196 -0
- package/source/utils/file-cache.spec.ts +309 -0
- package/source/utils/file-cache.ts +195 -0
- package/source/utils/file-content-loader.spec.ts +180 -0
- package/source/utils/file-content-loader.ts +179 -0
- package/source/utils/file-mention-handler.spec.ts +261 -0
- package/source/utils/file-mention-handler.ts +84 -0
- package/source/utils/file-mention-parser.spec.ts +182 -0
- package/source/utils/file-mention-parser.ts +170 -0
- package/source/utils/fuzzy-matching.spec.ts +149 -0
- package/source/utils/fuzzy-matching.ts +146 -0
- package/source/utils/indentation-normalizer.spec.ts +216 -0
- package/source/utils/indentation-normalizer.ts +76 -0
- package/source/utils/installation-detector.spec.ts +178 -0
- package/source/utils/installation-detector.ts +153 -0
- package/source/utils/logging/config.spec.ts +311 -0
- package/source/utils/logging/config.ts +210 -0
- package/source/utils/logging/console-facade.spec.ts +184 -0
- package/source/utils/logging/console-facade.ts +384 -0
- package/source/utils/logging/correlation.spec.ts +679 -0
- package/source/utils/logging/correlation.ts +474 -0
- package/source/utils/logging/formatters.spec.ts +464 -0
- package/source/utils/logging/formatters.ts +207 -0
- package/source/utils/logging/health-monitor/alerts/alert-manager.spec.ts +93 -0
- package/source/utils/logging/health-monitor/alerts/alert-manager.ts +79 -0
- package/source/utils/logging/health-monitor/checks/configuration-check.spec.ts +56 -0
- package/source/utils/logging/health-monitor/checks/configuration-check.ts +43 -0
- package/source/utils/logging/health-monitor/checks/logging-check.spec.ts +56 -0
- package/source/utils/logging/health-monitor/checks/logging-check.ts +58 -0
- package/source/utils/logging/health-monitor/checks/memory-check.spec.ts +100 -0
- package/source/utils/logging/health-monitor/checks/memory-check.ts +78 -0
- package/source/utils/logging/health-monitor/checks/performance-check.spec.ts +56 -0
- package/source/utils/logging/health-monitor/checks/performance-check.ts +56 -0
- package/source/utils/logging/health-monitor/checks/request-check.spec.ts +56 -0
- package/source/utils/logging/health-monitor/checks/request-check.ts +76 -0
- package/source/utils/logging/health-monitor/core/health-check-runner.spec.ts +70 -0
- package/source/utils/logging/health-monitor/core/health-check-runner.ts +138 -0
- package/source/utils/logging/health-monitor/core/health-monitor.spec.ts +58 -0
- package/source/utils/logging/health-monitor/core/health-monitor.ts +344 -0
- package/source/utils/logging/health-monitor/core/scoring.spec.ts +65 -0
- package/source/utils/logging/health-monitor/core/scoring.ts +91 -0
- package/source/utils/logging/health-monitor/index.ts +15 -0
- package/source/utils/logging/health-monitor/instances.ts +48 -0
- package/source/utils/logging/health-monitor/middleware/http-middleware.spec.ts +141 -0
- package/source/utils/logging/health-monitor/middleware/http-middleware.ts +75 -0
- package/source/utils/logging/health-monitor/types.ts +126 -0
- package/source/utils/logging/index.spec.ts +284 -0
- package/source/utils/logging/index.ts +236 -0
- package/source/utils/logging/integration.spec.ts +441 -0
- package/source/utils/logging/log-method-factory.spec.ts +573 -0
- package/source/utils/logging/log-method-factory.ts +233 -0
- package/source/utils/logging/log-query/aggregation/aggregator.spec.ts +277 -0
- package/source/utils/logging/log-query/aggregation/aggregator.ts +159 -0
- package/source/utils/logging/log-query/aggregation/facet-generator.spec.ts +159 -0
- package/source/utils/logging/log-query/aggregation/facet-generator.ts +47 -0
- package/source/utils/logging/log-query/index.ts +23 -0
- package/source/utils/logging/log-query/query/filter-predicates.spec.ts +247 -0
- package/source/utils/logging/log-query/query/filter-predicates.ts +154 -0
- package/source/utils/logging/log-query/query/query-builder.spec.ts +182 -0
- package/source/utils/logging/log-query/query/query-builder.ts +151 -0
- package/source/utils/logging/log-query/query/query-engine.spec.ts +214 -0
- package/source/utils/logging/log-query/query/query-engine.ts +45 -0
- package/source/utils/logging/log-query/storage/circular-buffer.spec.ts +143 -0
- package/source/utils/logging/log-query/storage/circular-buffer.ts +75 -0
- package/source/utils/logging/log-query/storage/index-manager.spec.ts +150 -0
- package/source/utils/logging/log-query/storage/index-manager.ts +71 -0
- package/source/utils/logging/log-query/storage/log-storage.spec.ts +257 -0
- package/source/utils/logging/log-query/storage/log-storage.ts +80 -0
- package/source/utils/logging/log-query/types.ts +163 -0
- package/source/utils/logging/log-query/utils/helpers.spec.ts +263 -0
- package/source/utils/logging/log-query/utils/helpers.ts +72 -0
- package/source/utils/logging/log-query/utils/sorting.spec.ts +182 -0
- package/source/utils/logging/log-query/utils/sorting.ts +61 -0
- package/source/utils/logging/logger-provider.spec.ts +262 -0
- package/source/utils/logging/logger-provider.ts +362 -0
- package/source/utils/logging/performance.spec.ts +209 -0
- package/source/utils/logging/performance.ts +757 -0
- package/source/utils/logging/pino-logger.spec.ts +425 -0
- package/source/utils/logging/pino-logger.ts +514 -0
- package/source/utils/logging/redaction.spec.ts +490 -0
- package/source/utils/logging/redaction.ts +267 -0
- package/source/utils/logging/request-tracker.spec.ts +1198 -0
- package/source/utils/logging/request-tracker.ts +803 -0
- package/source/utils/logging/transports.spec.ts +505 -0
- package/source/utils/logging/transports.ts +305 -0
- package/source/utils/logging/types.ts +216 -0
- package/source/utils/message-builder.spec.ts +179 -0
- package/source/utils/message-builder.ts +101 -0
- package/source/utils/message-queue.tsx +486 -0
- package/source/utils/paste-detection.spec.ts +69 -0
- package/source/utils/paste-detection.ts +124 -0
- package/source/utils/paste-roundtrip.spec.ts +442 -0
- package/source/utils/paste-utils.spec.ts +128 -0
- package/source/utils/paste-utils.ts +52 -0
- package/source/utils/programming-language-helper.spec.ts +74 -0
- package/source/utils/programming-language-helper.ts +32 -0
- package/source/utils/prompt-assembly.spec.ts +221 -0
- package/source/utils/prompt-processor.ts +173 -0
- package/source/utils/tool-args-parser.spec.ts +136 -0
- package/source/utils/tool-args-parser.ts +54 -0
- package/source/utils/tool-cancellation.spec.ts +230 -0
- package/source/utils/tool-cancellation.ts +28 -0
- package/source/utils/tool-result-display.spec.tsx +469 -0
- package/source/utils/tool-result-display.tsx +90 -0
- package/source/utils/update-checker.spec.ts +383 -0
- package/source/utils/update-checker.ts +183 -0
- package/source/wizard/config-wizard.spec.tsx +103 -0
- package/source/wizard/config-wizard.tsx +382 -0
- package/source/wizard/steps/location-step.spec.tsx +186 -0
- package/source/wizard/steps/location-step.tsx +147 -0
- package/source/wizard/steps/mcp-step.spec.tsx +607 -0
- package/source/wizard/steps/mcp-step.tsx +632 -0
- package/source/wizard/steps/provider-step.spec.tsx +342 -0
- package/source/wizard/steps/provider-step.tsx +957 -0
- package/source/wizard/steps/summary-step.spec.tsx +749 -0
- package/source/wizard/steps/summary-step.tsx +228 -0
- package/source/wizard/templates/mcp-templates.spec.ts +613 -0
- package/source/wizard/templates/mcp-templates.ts +570 -0
- package/source/wizard/templates/provider-templates.spec.ts +152 -0
- package/source/wizard/templates/provider-templates.ts +485 -0
- package/source/wizard/utils/fetch-cloud-models.spec.ts +428 -0
- package/source/wizard/utils/fetch-cloud-models.ts +223 -0
- package/source/wizard/utils/fetch-local-models.spec.ts +297 -0
- package/source/wizard/utils/fetch-local-models.ts +192 -0
- package/source/wizard/validation-array.spec.ts +264 -0
- package/source/wizard/validation.spec.ts +373 -0
- package/source/wizard/validation.ts +232 -0
- package/source/app/prompts/main-prompt.md +0 -122
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import test from 'ava';
|
|
2
|
+
import { parseInput } from './command-parser';
|
|
3
|
+
|
|
4
|
+
test('parseInput - parses bash commands with ! prefix', t => {
|
|
5
|
+
const result = parseInput('!ls -la');
|
|
6
|
+
|
|
7
|
+
t.false(result.isCommand);
|
|
8
|
+
t.true(result.isBashCommand);
|
|
9
|
+
t.is(result.bashCommand, 'ls -la');
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
test('parseInput - handles empty bash command', t => {
|
|
13
|
+
const result = parseInput('!');
|
|
14
|
+
|
|
15
|
+
t.false(result.isCommand);
|
|
16
|
+
t.true(result.isBashCommand);
|
|
17
|
+
t.is(result.bashCommand, '');
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
test('parseInput - handles bash command with spaces', t => {
|
|
21
|
+
const result = parseInput('! echo "hello world" ');
|
|
22
|
+
|
|
23
|
+
t.false(result.isCommand);
|
|
24
|
+
t.true(result.isBashCommand);
|
|
25
|
+
t.is(result.bashCommand, ' echo "hello world"');
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
test('parseInput - returns non-command for text without prefix', t => {
|
|
29
|
+
const result = parseInput('Hello world');
|
|
30
|
+
|
|
31
|
+
t.false(result.isCommand);
|
|
32
|
+
t.is(result.isBashCommand, undefined);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test('parseInput - parses regular commands with / prefix', t => {
|
|
36
|
+
const result = parseInput('/command arg1 arg2');
|
|
37
|
+
|
|
38
|
+
t.true(result.isCommand);
|
|
39
|
+
t.is(result.isBashCommand, undefined);
|
|
40
|
+
t.is(result.command, 'command');
|
|
41
|
+
t.deepEqual(result.args, ['arg1', 'arg2']);
|
|
42
|
+
t.is(result.fullCommand, 'command arg1 arg2');
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test('parseInput - handles empty command', t => {
|
|
46
|
+
const result = parseInput('/');
|
|
47
|
+
|
|
48
|
+
t.true(result.isCommand);
|
|
49
|
+
t.is(result.isBashCommand, undefined);
|
|
50
|
+
t.is(result.command, '');
|
|
51
|
+
t.deepEqual(result.args, []);
|
|
52
|
+
t.is(result.fullCommand, '');
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test('parseInput - handles command without arguments', t => {
|
|
56
|
+
const result = parseInput('/help');
|
|
57
|
+
|
|
58
|
+
t.true(result.isCommand);
|
|
59
|
+
t.is(result.isBashCommand, undefined);
|
|
60
|
+
t.is(result.command, 'help');
|
|
61
|
+
t.deepEqual(result.args, []);
|
|
62
|
+
t.is(result.fullCommand, 'help');
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
test('parseInput - handles command with single argument', t => {
|
|
66
|
+
const result = parseInput('/init my-project');
|
|
67
|
+
|
|
68
|
+
t.true(result.isCommand);
|
|
69
|
+
t.is(result.isBashCommand, undefined);
|
|
70
|
+
t.is(result.command, 'init');
|
|
71
|
+
t.deepEqual(result.args, ['my-project']);
|
|
72
|
+
t.is(result.fullCommand, 'init my-project');
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
test('parseInput - handles multiple whitespace between arguments', t => {
|
|
76
|
+
const result = parseInput('/test arg1 arg2');
|
|
77
|
+
|
|
78
|
+
t.true(result.isCommand);
|
|
79
|
+
t.is(result.isBashCommand, undefined);
|
|
80
|
+
t.is(result.command, 'test');
|
|
81
|
+
t.deepEqual(result.args, ['arg1', 'arg2']);
|
|
82
|
+
t.is(result.fullCommand, 'test arg1 arg2');
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test('parseInput - trims whitespace from input', t => {
|
|
86
|
+
const result = parseInput(' /command arg1 ');
|
|
87
|
+
|
|
88
|
+
t.true(result.isCommand);
|
|
89
|
+
t.is(result.isBashCommand, undefined);
|
|
90
|
+
t.is(result.command, 'command');
|
|
91
|
+
t.deepEqual(result.args, ['arg1']);
|
|
92
|
+
t.is(result.fullCommand, 'command arg1');
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
test('parseInput - handles empty string input', t => {
|
|
96
|
+
const result = parseInput('');
|
|
97
|
+
|
|
98
|
+
t.false(result.isCommand);
|
|
99
|
+
t.is(result.isBashCommand, undefined);
|
|
100
|
+
});
|
|
101
|
+
|
|
102
|
+
test('parseInput - handles whitespace-only input', t => {
|
|
103
|
+
const result = parseInput(' ');
|
|
104
|
+
|
|
105
|
+
t.false(result.isCommand);
|
|
106
|
+
t.is(result.isBashCommand, undefined);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
test('parseInput - handles / followed by whitespace', t => {
|
|
110
|
+
const result = parseInput('/ ');
|
|
111
|
+
|
|
112
|
+
t.true(result.isCommand);
|
|
113
|
+
t.is(result.isBashCommand, undefined);
|
|
114
|
+
t.is(result.command, '');
|
|
115
|
+
t.deepEqual(result.args, []);
|
|
116
|
+
t.is(result.fullCommand, '');
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
test('parseInput - preserves argument case and special characters', t => {
|
|
120
|
+
const result = parseInput('/echo "Hello World" --flag=value');
|
|
121
|
+
|
|
122
|
+
t.true(result.isCommand);
|
|
123
|
+
t.is(result.isBashCommand, undefined);
|
|
124
|
+
t.is(result.command, 'echo');
|
|
125
|
+
t.deepEqual(result.args, ['"Hello', 'World"', '--flag=value']);
|
|
126
|
+
t.is(result.fullCommand, 'echo "Hello World" --flag=value');
|
|
127
|
+
});
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import type {ParsedCommand} from '@/types/index';
|
|
2
|
+
|
|
3
|
+
export function parseInput(input: string): ParsedCommand {
|
|
4
|
+
const trimmed = input.trim();
|
|
5
|
+
|
|
6
|
+
// Check for bash command (prefixed with !)
|
|
7
|
+
if (trimmed.startsWith('!')) {
|
|
8
|
+
const bashCommand = trimmed.slice(1);
|
|
9
|
+
return {
|
|
10
|
+
isCommand: false, // Not a regular command
|
|
11
|
+
isBashCommand: true,
|
|
12
|
+
bashCommand: bashCommand,
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Check for regular command (prefixed with /)
|
|
17
|
+
if (!trimmed.startsWith('/')) {
|
|
18
|
+
return {isCommand: false};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const commandText = trimmed.slice(1);
|
|
22
|
+
if (!commandText) {
|
|
23
|
+
return {isCommand: true, command: '', args: [], fullCommand: ''};
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const parts = commandText.split(/\s+/);
|
|
27
|
+
const command = parts[0];
|
|
28
|
+
const args = parts.slice(1);
|
|
29
|
+
|
|
30
|
+
return {
|
|
31
|
+
isCommand: true,
|
|
32
|
+
command,
|
|
33
|
+
args,
|
|
34
|
+
fullCommand: commandText,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import {renderWithTheme} from '@/test-utils/render-with-theme';
|
|
2
|
+
import type {Message} from '@/types/core';
|
|
3
|
+
import test from 'ava';
|
|
4
|
+
import React from 'react';
|
|
5
|
+
import {checkpointCommand} from './checkpoint';
|
|
6
|
+
|
|
7
|
+
// Helper to create mock messages
|
|
8
|
+
function createMockMessages(count: number): Message[] {
|
|
9
|
+
const messages: Message[] = [];
|
|
10
|
+
for (let i = 0; i < count; i++) {
|
|
11
|
+
messages.push({
|
|
12
|
+
role: i % 2 === 0 ? 'user' : 'assistant',
|
|
13
|
+
content: `Message ${i + 1}`,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
return messages;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
const mockMetadata = {
|
|
20
|
+
provider: 'TestProvider',
|
|
21
|
+
model: 'test-model',
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
// Command metadata tests
|
|
25
|
+
test('checkpointCommand has correct name', t => {
|
|
26
|
+
t.is(checkpointCommand.name, 'checkpoint');
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test('checkpointCommand has description', t => {
|
|
30
|
+
t.truthy(checkpointCommand.description);
|
|
31
|
+
t.true(checkpointCommand.description.length > 0);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test('checkpointCommand has handler function', t => {
|
|
35
|
+
t.is(typeof checkpointCommand.handler, 'function');
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
// Help command tests
|
|
39
|
+
test('checkpointCommand shows help with no arguments', async t => {
|
|
40
|
+
const result = await checkpointCommand.handler([], [], mockMetadata);
|
|
41
|
+
const {lastFrame} = renderWithTheme(result as React.ReactElement);
|
|
42
|
+
const output = lastFrame() || '';
|
|
43
|
+
|
|
44
|
+
t.true(output.includes('Checkpoint Commands'));
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
test('checkpointCommand shows help with help argument', async t => {
|
|
48
|
+
const result = await checkpointCommand.handler(['help'], [], mockMetadata);
|
|
49
|
+
const {lastFrame} = renderWithTheme(result as React.ReactElement);
|
|
50
|
+
const output = lastFrame() || '';
|
|
51
|
+
|
|
52
|
+
t.true(output.includes('Checkpoint Commands'));
|
|
53
|
+
t.true(output.includes('/checkpoint create'));
|
|
54
|
+
t.true(output.includes('/checkpoint list'));
|
|
55
|
+
t.true(output.includes('/checkpoint load'));
|
|
56
|
+
t.true(output.includes('/checkpoint delete'));
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test('checkpointCommand shows help with --help flag', async t => {
|
|
60
|
+
const result = await checkpointCommand.handler(['--help'], [], mockMetadata);
|
|
61
|
+
const {lastFrame} = renderWithTheme(result as React.ReactElement);
|
|
62
|
+
const output = lastFrame() || '';
|
|
63
|
+
|
|
64
|
+
t.true(output.includes('Checkpoint Commands'));
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
test('checkpointCommand shows help with -h flag', async t => {
|
|
68
|
+
const result = await checkpointCommand.handler(['-h'], [], mockMetadata);
|
|
69
|
+
const {lastFrame} = renderWithTheme(result as React.ReactElement);
|
|
70
|
+
const output = lastFrame() || '';
|
|
71
|
+
|
|
72
|
+
t.true(output.includes('Checkpoint Commands'));
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
// Create subcommand tests
|
|
76
|
+
test('checkpointCommand create warns when no messages', async t => {
|
|
77
|
+
const result = await checkpointCommand.handler(['create'], [], mockMetadata);
|
|
78
|
+
const {lastFrame} = renderWithTheme(result as React.ReactElement);
|
|
79
|
+
const output = lastFrame() || '';
|
|
80
|
+
|
|
81
|
+
t.true(output.includes('No messages to checkpoint'));
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
test('checkpointCommand create alias "save" works', async t => {
|
|
85
|
+
const result = await checkpointCommand.handler(['save'], [], mockMetadata);
|
|
86
|
+
const {lastFrame} = renderWithTheme(result as React.ReactElement);
|
|
87
|
+
const output = lastFrame() || '';
|
|
88
|
+
|
|
89
|
+
t.true(output.includes('No messages to checkpoint'));
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
// List subcommand tests
|
|
93
|
+
test('checkpointCommand list shows checkpoints', async t => {
|
|
94
|
+
const result = await checkpointCommand.handler(['list'], [], mockMetadata);
|
|
95
|
+
// Just verify it returns something (actual checkpoints depend on state)
|
|
96
|
+
t.truthy(result);
|
|
97
|
+
});
|
|
98
|
+
|
|
99
|
+
test('checkpointCommand list alias "ls" works', async t => {
|
|
100
|
+
const result = await checkpointCommand.handler(['ls'], [], mockMetadata);
|
|
101
|
+
t.truthy(result);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
// Load subcommand tests
|
|
105
|
+
test('checkpointCommand load with non-existent checkpoint shows error', async t => {
|
|
106
|
+
const messages = createMockMessages(2);
|
|
107
|
+
const result = await checkpointCommand.handler(
|
|
108
|
+
['load', 'non-existent-checkpoint-xyz'],
|
|
109
|
+
messages,
|
|
110
|
+
mockMetadata,
|
|
111
|
+
);
|
|
112
|
+
const {lastFrame} = renderWithTheme(result as React.ReactElement);
|
|
113
|
+
const output = lastFrame() || '';
|
|
114
|
+
|
|
115
|
+
t.true(output.includes('does not exist'));
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test('checkpointCommand load alias "restore" works', async t => {
|
|
119
|
+
const messages = createMockMessages(2);
|
|
120
|
+
const result = await checkpointCommand.handler(
|
|
121
|
+
['restore', 'non-existent'],
|
|
122
|
+
messages,
|
|
123
|
+
mockMetadata,
|
|
124
|
+
);
|
|
125
|
+
const {lastFrame} = renderWithTheme(result as React.ReactElement);
|
|
126
|
+
const output = lastFrame() || '';
|
|
127
|
+
|
|
128
|
+
t.true(output.includes('does not exist'));
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
// Delete subcommand tests
|
|
132
|
+
test('checkpointCommand delete requires name', async t => {
|
|
133
|
+
const result = await checkpointCommand.handler(['delete'], [], mockMetadata);
|
|
134
|
+
const {lastFrame} = renderWithTheme(result as React.ReactElement);
|
|
135
|
+
const output = lastFrame() || '';
|
|
136
|
+
|
|
137
|
+
t.true(output.includes('specify a checkpoint name'));
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
test('checkpointCommand delete with non-existent checkpoint shows error', async t => {
|
|
141
|
+
const result = await checkpointCommand.handler(
|
|
142
|
+
['delete', 'non-existent-checkpoint-xyz'],
|
|
143
|
+
[],
|
|
144
|
+
mockMetadata,
|
|
145
|
+
);
|
|
146
|
+
const {lastFrame} = renderWithTheme(result as React.ReactElement);
|
|
147
|
+
const output = lastFrame() || '';
|
|
148
|
+
|
|
149
|
+
t.true(output.includes('does not exist'));
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
test('checkpointCommand delete alias "remove" works', async t => {
|
|
153
|
+
const result = await checkpointCommand.handler(
|
|
154
|
+
['remove', 'non-existent'],
|
|
155
|
+
[],
|
|
156
|
+
mockMetadata,
|
|
157
|
+
);
|
|
158
|
+
const {lastFrame} = renderWithTheme(result as React.ReactElement);
|
|
159
|
+
const output = lastFrame() || '';
|
|
160
|
+
|
|
161
|
+
t.true(output.includes('does not exist'));
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
test('checkpointCommand delete alias "rm" works', async t => {
|
|
165
|
+
const result = await checkpointCommand.handler(
|
|
166
|
+
['rm', 'non-existent'],
|
|
167
|
+
[],
|
|
168
|
+
mockMetadata,
|
|
169
|
+
);
|
|
170
|
+
const {lastFrame} = renderWithTheme(result as React.ReactElement);
|
|
171
|
+
const output = lastFrame() || '';
|
|
172
|
+
|
|
173
|
+
t.true(output.includes('does not exist'));
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
// Unknown subcommand tests
|
|
177
|
+
test('checkpointCommand shows error for unknown subcommand', async t => {
|
|
178
|
+
const result = await checkpointCommand.handler(['unknown'], [], mockMetadata);
|
|
179
|
+
const {lastFrame} = renderWithTheme(result as React.ReactElement);
|
|
180
|
+
const output = lastFrame() || '';
|
|
181
|
+
|
|
182
|
+
t.true(output.includes('Unknown checkpoint subcommand'));
|
|
183
|
+
t.true(output.includes('unknown'));
|
|
184
|
+
t.true(output.includes('/checkpoint help'));
|
|
185
|
+
});
|
|
186
|
+
|
|
187
|
+
test('checkpointCommand handles subcommand case-insensitively', async t => {
|
|
188
|
+
const result1 = await checkpointCommand.handler(['HELP'], [], mockMetadata);
|
|
189
|
+
const result2 = await checkpointCommand.handler(['Help'], [], mockMetadata);
|
|
190
|
+
const result3 = await checkpointCommand.handler(['LIST'], [], mockMetadata);
|
|
191
|
+
|
|
192
|
+
const {lastFrame: frame1} = renderWithTheme(result1 as React.ReactElement);
|
|
193
|
+
const {lastFrame: frame2} = renderWithTheme(result2 as React.ReactElement);
|
|
194
|
+
|
|
195
|
+
t.true((frame1() || '').includes('Checkpoint Commands'));
|
|
196
|
+
t.true((frame2() || '').includes('Checkpoint Commands'));
|
|
197
|
+
t.truthy(result3); // Just verify it doesn't throw
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
// Multiple word checkpoint name tests
|
|
201
|
+
test('checkpointCommand delete handles multi-word names', async t => {
|
|
202
|
+
const result = await checkpointCommand.handler(
|
|
203
|
+
['delete', 'my', 'checkpoint', 'name'],
|
|
204
|
+
[],
|
|
205
|
+
mockMetadata,
|
|
206
|
+
);
|
|
207
|
+
const {lastFrame} = renderWithTheme(result as React.ReactElement);
|
|
208
|
+
const output = lastFrame() || '';
|
|
209
|
+
|
|
210
|
+
// Should join the words and look for "my checkpoint name"
|
|
211
|
+
t.true(output.includes('my checkpoint name'));
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
test('checkpointCommand load handles multi-word names', async t => {
|
|
215
|
+
const result = await checkpointCommand.handler(
|
|
216
|
+
['load', 'my', 'checkpoint', 'name'],
|
|
217
|
+
[],
|
|
218
|
+
mockMetadata,
|
|
219
|
+
);
|
|
220
|
+
const {lastFrame} = renderWithTheme(result as React.ReactElement);
|
|
221
|
+
const output = lastFrame() || '';
|
|
222
|
+
|
|
223
|
+
t.true(output.includes('my checkpoint name'));
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
// Handler returns React elements
|
|
227
|
+
test('checkpointCommand handler returns React element', async t => {
|
|
228
|
+
const result = await checkpointCommand.handler(['help'], [], mockMetadata);
|
|
229
|
+
t.true(React.isValidElement(result));
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
test('checkpointCommand create handler returns React element', async t => {
|
|
233
|
+
const result = await checkpointCommand.handler(['create'], [], mockMetadata);
|
|
234
|
+
t.true(React.isValidElement(result));
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
test('checkpointCommand list handler returns React element', async t => {
|
|
238
|
+
const result = await checkpointCommand.handler(['list'], [], mockMetadata);
|
|
239
|
+
t.true(React.isValidElement(result));
|
|
240
|
+
});
|
|
241
|
+
|
|
242
|
+
test('checkpointCommand delete handler returns React element', async t => {
|
|
243
|
+
const result = await checkpointCommand.handler(['delete'], [], mockMetadata);
|
|
244
|
+
t.true(React.isValidElement(result));
|
|
245
|
+
});
|
|
246
|
+
|
|
247
|
+
// Verify help content is comprehensive
|
|
248
|
+
test('checkpointCommand help includes all subcommands', async t => {
|
|
249
|
+
const result = await checkpointCommand.handler(['help'], [], mockMetadata);
|
|
250
|
+
const {lastFrame} = renderWithTheme(result as React.ReactElement);
|
|
251
|
+
const output = lastFrame() || '';
|
|
252
|
+
|
|
253
|
+
// Check for create subcommand
|
|
254
|
+
t.true(output.includes('create'));
|
|
255
|
+
t.true(output.includes('snapshot'));
|
|
256
|
+
|
|
257
|
+
// Check for list subcommand
|
|
258
|
+
t.true(output.includes('list'));
|
|
259
|
+
|
|
260
|
+
// Check for load subcommand
|
|
261
|
+
t.true(output.includes('load'));
|
|
262
|
+
t.true(output.includes('restore') || output.includes('Interactive'));
|
|
263
|
+
|
|
264
|
+
// Check for delete subcommand
|
|
265
|
+
t.true(output.includes('delete'));
|
|
266
|
+
|
|
267
|
+
// Check for help subcommand
|
|
268
|
+
t.true(output.includes('help'));
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
test('checkpointCommand help includes examples', async t => {
|
|
272
|
+
const result = await checkpointCommand.handler(['help'], [], mockMetadata);
|
|
273
|
+
const {lastFrame} = renderWithTheme(result as React.ReactElement);
|
|
274
|
+
const output = lastFrame() || '';
|
|
275
|
+
|
|
276
|
+
t.true(output.includes('Example'));
|
|
277
|
+
});
|