@gguf/coder 0.3.0 → 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/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,458 @@
|
|
|
1
|
+
import {existsSync, readFileSync} from 'fs';
|
|
2
|
+
import {basename, join} from 'path';
|
|
3
|
+
import {FileScanner} from '@/init/file-scanner';
|
|
4
|
+
import {
|
|
5
|
+
FrameworkDetector,
|
|
6
|
+
ProjectDependencies,
|
|
7
|
+
} from '@/init/framework-detector';
|
|
8
|
+
import {DetectedLanguages, LanguageDetector} from '@/init/language-detector';
|
|
9
|
+
|
|
10
|
+
export interface ProjectAnalysis {
|
|
11
|
+
projectPath: string;
|
|
12
|
+
projectName: string;
|
|
13
|
+
languages: DetectedLanguages;
|
|
14
|
+
dependencies: ProjectDependencies;
|
|
15
|
+
projectType: string;
|
|
16
|
+
keyFiles: {
|
|
17
|
+
config: string[];
|
|
18
|
+
documentation: string[];
|
|
19
|
+
build: string[];
|
|
20
|
+
test: string[];
|
|
21
|
+
[key: string]: string[];
|
|
22
|
+
};
|
|
23
|
+
structure: {
|
|
24
|
+
totalFiles: number;
|
|
25
|
+
scannedFiles: number;
|
|
26
|
+
directories: string[];
|
|
27
|
+
importantDirectories: string[];
|
|
28
|
+
};
|
|
29
|
+
buildCommands: {[key: string]: string};
|
|
30
|
+
description?: string;
|
|
31
|
+
repository?: string;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export class ProjectAnalyzer {
|
|
35
|
+
private fileScanner: FileScanner;
|
|
36
|
+
private frameworkDetector: FrameworkDetector;
|
|
37
|
+
|
|
38
|
+
constructor(private projectPath: string) {
|
|
39
|
+
this.fileScanner = new FileScanner(projectPath);
|
|
40
|
+
this.frameworkDetector = new FrameworkDetector(projectPath);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Perform comprehensive project analysis
|
|
45
|
+
*/
|
|
46
|
+
public analyze(): ProjectAnalysis {
|
|
47
|
+
// Scan files
|
|
48
|
+
const scanResult = this.fileScanner.scan();
|
|
49
|
+
const keyFiles = this.fileScanner.getProjectFiles() as {
|
|
50
|
+
config: string[];
|
|
51
|
+
documentation: string[];
|
|
52
|
+
build: string[];
|
|
53
|
+
test: string[];
|
|
54
|
+
[key: string]: string[];
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
// Detect languages
|
|
58
|
+
const codeFiles = scanResult.files.filter(
|
|
59
|
+
file => this.isCodeFile(file) && !this.isTestFile(file),
|
|
60
|
+
);
|
|
61
|
+
const languages = LanguageDetector.detectLanguages(codeFiles);
|
|
62
|
+
|
|
63
|
+
// Detect frameworks and dependencies
|
|
64
|
+
const dependencies = this.frameworkDetector.detectDependencies();
|
|
65
|
+
|
|
66
|
+
// Analyze project structure
|
|
67
|
+
const importantDirectories = this.getImportantDirectories(
|
|
68
|
+
scanResult.directories,
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
// Get build commands
|
|
72
|
+
const buildCommands = this.frameworkDetector.getBuildCommands();
|
|
73
|
+
|
|
74
|
+
// Extract project metadata
|
|
75
|
+
const {projectName, description, repository} =
|
|
76
|
+
this.extractProjectMetadata();
|
|
77
|
+
|
|
78
|
+
// Determine project type
|
|
79
|
+
const projectType = this.determineProjectType(languages, dependencies);
|
|
80
|
+
|
|
81
|
+
return {
|
|
82
|
+
projectPath: this.projectPath,
|
|
83
|
+
projectName,
|
|
84
|
+
languages,
|
|
85
|
+
dependencies,
|
|
86
|
+
projectType,
|
|
87
|
+
keyFiles,
|
|
88
|
+
structure: {
|
|
89
|
+
totalFiles: scanResult.totalFiles,
|
|
90
|
+
scannedFiles: scanResult.scannedFiles,
|
|
91
|
+
directories: scanResult.directories,
|
|
92
|
+
importantDirectories,
|
|
93
|
+
},
|
|
94
|
+
buildCommands,
|
|
95
|
+
description,
|
|
96
|
+
repository,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Check if a file is a code file
|
|
102
|
+
*/
|
|
103
|
+
private isCodeFile(file: string): boolean {
|
|
104
|
+
const codeExtensions = [
|
|
105
|
+
'.js',
|
|
106
|
+
'.jsx',
|
|
107
|
+
'.ts',
|
|
108
|
+
'.tsx',
|
|
109
|
+
'.py',
|
|
110
|
+
'.rs',
|
|
111
|
+
'.go',
|
|
112
|
+
'.java',
|
|
113
|
+
'.kt',
|
|
114
|
+
'.c',
|
|
115
|
+
'.cpp',
|
|
116
|
+
'.h',
|
|
117
|
+
'.hpp',
|
|
118
|
+
'.cs',
|
|
119
|
+
'.php',
|
|
120
|
+
'.rb',
|
|
121
|
+
'.swift',
|
|
122
|
+
'.dart',
|
|
123
|
+
'.vue',
|
|
124
|
+
'.svelte',
|
|
125
|
+
];
|
|
126
|
+
|
|
127
|
+
const ext = file.substring(file.lastIndexOf('.'));
|
|
128
|
+
return codeExtensions.includes(ext);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Check if a file is a test file
|
|
133
|
+
*/
|
|
134
|
+
private isTestFile(file: string): boolean {
|
|
135
|
+
const fileName = basename(file).toLowerCase();
|
|
136
|
+
return (
|
|
137
|
+
fileName.includes('test') ||
|
|
138
|
+
fileName.includes('spec') ||
|
|
139
|
+
file.includes('__tests__') ||
|
|
140
|
+
file.includes('/test/') ||
|
|
141
|
+
file.includes('/tests/') ||
|
|
142
|
+
file.includes('/spec/')
|
|
143
|
+
);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Get important directories based on common patterns
|
|
148
|
+
*/
|
|
149
|
+
private getImportantDirectories(directories: string[]): string[] {
|
|
150
|
+
const important = new Set<string>();
|
|
151
|
+
|
|
152
|
+
const sourcePatterns = [
|
|
153
|
+
'src',
|
|
154
|
+
'source',
|
|
155
|
+
'app',
|
|
156
|
+
'lib',
|
|
157
|
+
'libs',
|
|
158
|
+
'components',
|
|
159
|
+
'pages',
|
|
160
|
+
'views',
|
|
161
|
+
'routes',
|
|
162
|
+
'api',
|
|
163
|
+
'server',
|
|
164
|
+
'backend',
|
|
165
|
+
'frontend',
|
|
166
|
+
'models',
|
|
167
|
+
'controllers',
|
|
168
|
+
'services',
|
|
169
|
+
'utils',
|
|
170
|
+
'config',
|
|
171
|
+
'configs',
|
|
172
|
+
'settings',
|
|
173
|
+
'assets',
|
|
174
|
+
'static',
|
|
175
|
+
'public',
|
|
176
|
+
'docs',
|
|
177
|
+
'documentation',
|
|
178
|
+
];
|
|
179
|
+
|
|
180
|
+
const testPatterns = ['test', 'tests', '__tests__', 'spec'];
|
|
181
|
+
|
|
182
|
+
// First pass: Add all source directories
|
|
183
|
+
for (const dir of directories) {
|
|
184
|
+
const dirName = basename(dir).toLowerCase();
|
|
185
|
+
const dirParts = dir.split('/');
|
|
186
|
+
|
|
187
|
+
// Check if this is a source directory (not inside test directories)
|
|
188
|
+
const isInTestDir = dirParts.some(part =>
|
|
189
|
+
testPatterns.includes(part.toLowerCase()),
|
|
190
|
+
);
|
|
191
|
+
|
|
192
|
+
if (!isInTestDir) {
|
|
193
|
+
// Add if directory name matches source patterns
|
|
194
|
+
if (sourcePatterns.includes(dirName)) {
|
|
195
|
+
important.add(dir);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
// Add if any part of the path matches source patterns (e.g., "src/components")
|
|
199
|
+
if (
|
|
200
|
+
dirParts.some(part => sourcePatterns.includes(part.toLowerCase()))
|
|
201
|
+
) {
|
|
202
|
+
important.add(dir);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
// Second pass: Add test directories only if we don't have many source directories
|
|
208
|
+
if (important.size < 5) {
|
|
209
|
+
for (const dir of directories) {
|
|
210
|
+
const dirName = basename(dir).toLowerCase();
|
|
211
|
+
const dirParts = dir.split('/');
|
|
212
|
+
|
|
213
|
+
// Check if this is a test directory
|
|
214
|
+
const isTestDir =
|
|
215
|
+
testPatterns.includes(dirName) ||
|
|
216
|
+
dirParts.some(part => testPatterns.includes(part.toLowerCase()));
|
|
217
|
+
|
|
218
|
+
if (isTestDir) {
|
|
219
|
+
// Only add test directories that contain meaningful structure
|
|
220
|
+
if (
|
|
221
|
+
dirParts.length > 1 ||
|
|
222
|
+
directories.filter(d => d.startsWith(dir)).length > 1
|
|
223
|
+
) {
|
|
224
|
+
important.add(dir);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
// Sort with source directories first, then by depth (fewer levels first), then alphabetically
|
|
231
|
+
return Array.from(important).sort((a, b) => {
|
|
232
|
+
const aIsTest = testPatterns.some(pattern => a.includes(pattern));
|
|
233
|
+
const bIsTest = testPatterns.some(pattern => b.includes(pattern));
|
|
234
|
+
|
|
235
|
+
// Source directories first
|
|
236
|
+
if (aIsTest !== bIsTest) {
|
|
237
|
+
return aIsTest ? 1 : -1;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Then by depth (fewer levels first for better overview)
|
|
241
|
+
const aDepth = a.split('/').length;
|
|
242
|
+
const bDepth = b.split('/').length;
|
|
243
|
+
if (aDepth !== bDepth) {
|
|
244
|
+
return aDepth - bDepth;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// Finally alphabetically
|
|
248
|
+
return a.localeCompare(b);
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Extract project metadata from package.json, README, etc.
|
|
254
|
+
*/
|
|
255
|
+
private extractProjectMetadata(): {
|
|
256
|
+
projectName: string;
|
|
257
|
+
description?: string;
|
|
258
|
+
repository?: string;
|
|
259
|
+
} {
|
|
260
|
+
const defaultName = basename(this.projectPath);
|
|
261
|
+
let projectName = defaultName;
|
|
262
|
+
let description: string | undefined;
|
|
263
|
+
let repository: string | undefined;
|
|
264
|
+
|
|
265
|
+
// Try package.json first
|
|
266
|
+
const packageJsonPath = join(this.projectPath, 'package.json');
|
|
267
|
+
if (existsSync(packageJsonPath)) {
|
|
268
|
+
try {
|
|
269
|
+
const content = readFileSync(packageJsonPath, 'utf-8');
|
|
270
|
+
const pkg = JSON.parse(content) as {
|
|
271
|
+
name?: string;
|
|
272
|
+
description?: string;
|
|
273
|
+
repository?: string | {url?: string};
|
|
274
|
+
};
|
|
275
|
+
|
|
276
|
+
if (pkg.name) projectName = pkg.name;
|
|
277
|
+
if (pkg.description) description = pkg.description;
|
|
278
|
+
if (pkg.repository) {
|
|
279
|
+
if (typeof pkg.repository === 'string') {
|
|
280
|
+
repository = pkg.repository;
|
|
281
|
+
} else if (pkg.repository.url) {
|
|
282
|
+
repository = pkg.repository.url;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
} catch {
|
|
286
|
+
// Ignore parsing errors
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// Try Cargo.toml for Rust projects
|
|
291
|
+
if (!description) {
|
|
292
|
+
const cargoPath = join(this.projectPath, 'Cargo.toml');
|
|
293
|
+
if (existsSync(cargoPath)) {
|
|
294
|
+
try {
|
|
295
|
+
const content = readFileSync(cargoPath, 'utf-8');
|
|
296
|
+
const nameMatch = content.match(/^name\s*=\s*"([^"]+)"/m);
|
|
297
|
+
const descMatch = content.match(/^description\s*=\s*"([^"]+)"/m);
|
|
298
|
+
|
|
299
|
+
if (nameMatch) projectName = nameMatch[1];
|
|
300
|
+
if (descMatch) description = descMatch[1];
|
|
301
|
+
} catch {
|
|
302
|
+
// Ignore parsing errors
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// Try to extract description from README
|
|
308
|
+
if (!description) {
|
|
309
|
+
const readmeFiles = ['README.md', 'README.rst', 'README.txt', 'README'];
|
|
310
|
+
for (const readmeFile of readmeFiles) {
|
|
311
|
+
const readmePath = join(this.projectPath, readmeFile);
|
|
312
|
+
if (existsSync(readmePath)) {
|
|
313
|
+
try {
|
|
314
|
+
const content = readFileSync(readmePath, 'utf-8');
|
|
315
|
+
const lines = content.split('\n').filter(line => line.trim());
|
|
316
|
+
|
|
317
|
+
// Look for the first non-title line as description
|
|
318
|
+
for (const line of lines.slice(1)) {
|
|
319
|
+
if (
|
|
320
|
+
line.trim() &&
|
|
321
|
+
!line.startsWith('#') &&
|
|
322
|
+
!line.startsWith('!')
|
|
323
|
+
) {
|
|
324
|
+
description = line.trim();
|
|
325
|
+
break;
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
break;
|
|
329
|
+
} catch {
|
|
330
|
+
// Ignore parsing errors
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
return {projectName, description, repository};
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* Determine the overall project type
|
|
341
|
+
*/
|
|
342
|
+
private determineProjectType(
|
|
343
|
+
languages: DetectedLanguages,
|
|
344
|
+
dependencies: ProjectDependencies,
|
|
345
|
+
): string {
|
|
346
|
+
interface Framework {
|
|
347
|
+
category:
|
|
348
|
+
| 'web'
|
|
349
|
+
| 'mobile'
|
|
350
|
+
| 'desktop'
|
|
351
|
+
| 'backend'
|
|
352
|
+
| 'testing'
|
|
353
|
+
| 'build'
|
|
354
|
+
| 'other';
|
|
355
|
+
name: string;
|
|
356
|
+
confidence: 'high' | 'medium' | 'low';
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
// Use framework-based detection first
|
|
360
|
+
const webFrameworks = dependencies.frameworks.filter(
|
|
361
|
+
(f): f is Framework => (f as Framework).category === 'web',
|
|
362
|
+
);
|
|
363
|
+
const backendFrameworks = dependencies.frameworks.filter(
|
|
364
|
+
(f): f is Framework => (f as Framework).category === 'backend',
|
|
365
|
+
);
|
|
366
|
+
const mobileFrameworks = dependencies.frameworks.filter(
|
|
367
|
+
(f): f is Framework => (f as Framework).category === 'mobile',
|
|
368
|
+
);
|
|
369
|
+
const desktopFrameworks = dependencies.frameworks.filter(
|
|
370
|
+
(f): f is Framework => (f as Framework).category === 'desktop',
|
|
371
|
+
);
|
|
372
|
+
|
|
373
|
+
if (mobileFrameworks.length > 0) {
|
|
374
|
+
return `${mobileFrameworks[0].name} Mobile Application`;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
if (desktopFrameworks.length > 0) {
|
|
378
|
+
return `${desktopFrameworks[0].name} Desktop Application`;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
if (webFrameworks.length > 0 && backendFrameworks.length > 0) {
|
|
382
|
+
return `Full Stack Web Application (${webFrameworks[0].name} + ${backendFrameworks[0].name})`;
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
if (webFrameworks.length > 0) {
|
|
386
|
+
return `${webFrameworks[0].name} Web Application`;
|
|
387
|
+
}
|
|
388
|
+
|
|
389
|
+
if (backendFrameworks.length > 0) {
|
|
390
|
+
return `${backendFrameworks[0].name} Backend Application`;
|
|
391
|
+
}
|
|
392
|
+
|
|
393
|
+
// Fall back to language-based detection
|
|
394
|
+
return LanguageDetector.suggestProjectType(languages);
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
/**
|
|
398
|
+
* Get coding conventions based on detected languages and frameworks
|
|
399
|
+
*/
|
|
400
|
+
public getCodingConventions(): string[] {
|
|
401
|
+
const analysis = this.analyze();
|
|
402
|
+
const conventions: string[] = [];
|
|
403
|
+
|
|
404
|
+
// Language-specific conventions
|
|
405
|
+
if (analysis.languages.primary) {
|
|
406
|
+
const lang = analysis.languages.primary.name;
|
|
407
|
+
|
|
408
|
+
switch (lang) {
|
|
409
|
+
case 'JavaScript':
|
|
410
|
+
case 'TypeScript':
|
|
411
|
+
conventions.push('Use camelCase for variables and functions');
|
|
412
|
+
conventions.push('Use PascalCase for classes and components');
|
|
413
|
+
conventions.push('Use const/let instead of var');
|
|
414
|
+
if (
|
|
415
|
+
analysis.dependencies.frameworks.some((f: unknown) =>
|
|
416
|
+
(f as {name: string}).name.includes('React'),
|
|
417
|
+
)
|
|
418
|
+
) {
|
|
419
|
+
conventions.push('Use functional components with hooks');
|
|
420
|
+
conventions.push('Follow React naming conventions');
|
|
421
|
+
}
|
|
422
|
+
break;
|
|
423
|
+
|
|
424
|
+
case 'Python':
|
|
425
|
+
conventions.push('Follow PEP 8 style guide');
|
|
426
|
+
conventions.push('Use snake_case for variables and functions');
|
|
427
|
+
conventions.push('Use PascalCase for classes');
|
|
428
|
+
conventions.push('Include type hints where appropriate');
|
|
429
|
+
break;
|
|
430
|
+
|
|
431
|
+
case 'Rust':
|
|
432
|
+
conventions.push('Follow Rust naming conventions (snake_case)');
|
|
433
|
+
conventions.push('Use cargo fmt for formatting');
|
|
434
|
+
conventions.push('Handle errors explicitly with Result<T, E>');
|
|
435
|
+
break;
|
|
436
|
+
|
|
437
|
+
case 'Go':
|
|
438
|
+
conventions.push('Follow Go naming conventions');
|
|
439
|
+
conventions.push('Use gofmt for formatting');
|
|
440
|
+
conventions.push('Handle errors explicitly');
|
|
441
|
+
conventions.push('Use interfaces for abstraction');
|
|
442
|
+
break;
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
// Testing conventions
|
|
447
|
+
if (analysis.dependencies.testingFrameworks.length > 0) {
|
|
448
|
+
conventions.push(
|
|
449
|
+
`Write tests using ${analysis.dependencies.testingFrameworks.join(
|
|
450
|
+
', ',
|
|
451
|
+
)}`,
|
|
452
|
+
);
|
|
453
|
+
conventions.push('Maintain good test coverage');
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
return conventions;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LSP Integration Module
|
|
3
|
+
*
|
|
4
|
+
* Provides Language Server Protocol support for Coder:
|
|
5
|
+
* - Auto-discovery of installed language servers
|
|
6
|
+
* - Multi-language support with routing
|
|
7
|
+
* - Diagnostics, completions, code actions, and formatting
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
export {type LSPServerConfig} from './lsp-client';
|
|
11
|
+
|
|
12
|
+
export {
|
|
13
|
+
getLSPManager,
|
|
14
|
+
type LSPManagerConfig,
|
|
15
|
+
type LSPInitResult,
|
|
16
|
+
type DiagnosticsResult,
|
|
17
|
+
} from './lsp-manager';
|
|
18
|
+
|
|
19
|
+
export {
|
|
20
|
+
type Diagnostic,
|
|
21
|
+
type Position,
|
|
22
|
+
type Range,
|
|
23
|
+
type Location,
|
|
24
|
+
type CompletionItem,
|
|
25
|
+
type CodeAction,
|
|
26
|
+
type TextEdit,
|
|
27
|
+
type WorkspaceEdit,
|
|
28
|
+
type FormattingOptions,
|
|
29
|
+
type PublishDiagnosticsParams,
|
|
30
|
+
DiagnosticSeverity,
|
|
31
|
+
} from './protocol';
|