@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,79 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import {SuccessMessage} from '@/components/message-box';
|
|
3
|
+
import {Command, Message} from '@/types/index';
|
|
4
|
+
import fs from 'fs/promises';
|
|
5
|
+
import React from 'react';
|
|
6
|
+
|
|
7
|
+
const formatMessageContent = (message: Message) => {
|
|
8
|
+
let content = '';
|
|
9
|
+
switch (message.role) {
|
|
10
|
+
case 'user':
|
|
11
|
+
content += `## User\n${message.content}`;
|
|
12
|
+
break;
|
|
13
|
+
case 'assistant':
|
|
14
|
+
content += `## Assistant\n${message.content || ''}`;
|
|
15
|
+
if (message.tool_calls) {
|
|
16
|
+
content += `\n\n[tool_use: ${message.tool_calls
|
|
17
|
+
.map(tc => tc.function.name)
|
|
18
|
+
.join(', ')}]`;
|
|
19
|
+
}
|
|
20
|
+
break;
|
|
21
|
+
case 'tool':
|
|
22
|
+
content +=
|
|
23
|
+
`## Tool Output: ${message.name}\n` +
|
|
24
|
+
'```\n' +
|
|
25
|
+
`${message.content}\n` +
|
|
26
|
+
'```\n';
|
|
27
|
+
break;
|
|
28
|
+
case 'system':
|
|
29
|
+
// For now, we don't include system messages in the export
|
|
30
|
+
return '';
|
|
31
|
+
default:
|
|
32
|
+
return '';
|
|
33
|
+
}
|
|
34
|
+
return content + '\n\n';
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
function Export({filename}: {filename: string}) {
|
|
38
|
+
return (
|
|
39
|
+
<SuccessMessage
|
|
40
|
+
hideBox={true}
|
|
41
|
+
message={`✔️ Chat exported to ${filename}`}
|
|
42
|
+
></SuccessMessage>
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export const exportCommand: Command = {
|
|
47
|
+
name: 'export',
|
|
48
|
+
description: 'Export the chat history to a markdown file',
|
|
49
|
+
handler: async (
|
|
50
|
+
args: string[],
|
|
51
|
+
messages: Message[],
|
|
52
|
+
{provider, model, tokens},
|
|
53
|
+
) => {
|
|
54
|
+
const filename =
|
|
55
|
+
args[0] ||
|
|
56
|
+
`coder-chat-${new Date().toISOString().replace(/:/g, '-')}.md`;
|
|
57
|
+
const filepath = path.resolve(process.cwd(), filename); // nosemgrep
|
|
58
|
+
|
|
59
|
+
const frontmatter = `---
|
|
60
|
+
session_date: ${new Date().toISOString()}
|
|
61
|
+
provider: ${provider}
|
|
62
|
+
model: ${model}
|
|
63
|
+
total_tokens: ${tokens}
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
# Coder Chat Export
|
|
67
|
+
|
|
68
|
+
`;
|
|
69
|
+
|
|
70
|
+
const markdownContent = messages.map(formatMessageContent).join('');
|
|
71
|
+
|
|
72
|
+
await fs.writeFile(filepath, frontmatter + markdownContent);
|
|
73
|
+
|
|
74
|
+
return React.createElement(Export, {
|
|
75
|
+
key: `export-${Date.now()}`,
|
|
76
|
+
filename,
|
|
77
|
+
});
|
|
78
|
+
},
|
|
79
|
+
};
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import {readFile} from 'node:fs/promises';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import {fileURLToPath} from 'url';
|
|
4
|
+
import {commandRegistry} from '@/commands';
|
|
5
|
+
import {TitledBox} from '@/components/ui/titled-box';
|
|
6
|
+
import {useTerminalWidth} from '@/hooks/useTerminalWidth';
|
|
7
|
+
import {useTheme} from '@/hooks/useTheme';
|
|
8
|
+
import {Command} from '@/types/index';
|
|
9
|
+
import {Box, Text} from 'ink';
|
|
10
|
+
import React from 'react';
|
|
11
|
+
|
|
12
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
13
|
+
const __dirname = path.dirname(__filename);
|
|
14
|
+
let cachedVersion: string | null = null;
|
|
15
|
+
|
|
16
|
+
async function getPackageVersion(): Promise<string> {
|
|
17
|
+
if (cachedVersion) {
|
|
18
|
+
return cachedVersion;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
try {
|
|
22
|
+
const content = await readFile(
|
|
23
|
+
path.join(__dirname, '../../package.json'),
|
|
24
|
+
'utf8',
|
|
25
|
+
);
|
|
26
|
+
const packageJson = JSON.parse(content) as {version?: string};
|
|
27
|
+
cachedVersion = packageJson.version ?? '0.0.0';
|
|
28
|
+
return cachedVersion;
|
|
29
|
+
} catch (error) {
|
|
30
|
+
console.warn('Failed to read package version:', error);
|
|
31
|
+
cachedVersion = '0.0.0';
|
|
32
|
+
return cachedVersion;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function Help({
|
|
37
|
+
version,
|
|
38
|
+
commands,
|
|
39
|
+
}: {
|
|
40
|
+
version: string;
|
|
41
|
+
commands: Array<{name: string; description: string}>;
|
|
42
|
+
}) {
|
|
43
|
+
const boxWidth = useTerminalWidth();
|
|
44
|
+
const {colors} = useTheme();
|
|
45
|
+
return (
|
|
46
|
+
<TitledBox
|
|
47
|
+
title="/help"
|
|
48
|
+
width={boxWidth}
|
|
49
|
+
borderColor={colors.primary}
|
|
50
|
+
paddingX={2}
|
|
51
|
+
paddingY={1}
|
|
52
|
+
flexDirection="column"
|
|
53
|
+
marginBottom={1}
|
|
54
|
+
>
|
|
55
|
+
<Box marginBottom={1}>
|
|
56
|
+
<Text color={colors.primary} bold>
|
|
57
|
+
Coder – {version}
|
|
58
|
+
</Text>
|
|
59
|
+
</Box>
|
|
60
|
+
|
|
61
|
+
<Text color={colors.white}>
|
|
62
|
+
A local-first CLI coding agent that brings the power of agentic coding
|
|
63
|
+
tools like Claude Code and Gemini CLI to local models or controlled APIs
|
|
64
|
+
like OpenRouter.
|
|
65
|
+
</Text>
|
|
66
|
+
|
|
67
|
+
<Box marginTop={1}>
|
|
68
|
+
<Text color={colors.secondary}>
|
|
69
|
+
Always review model responses, especially when running code. Models
|
|
70
|
+
have read access to files in the current directory and can run
|
|
71
|
+
commands and edit files with your permission.
|
|
72
|
+
</Text>
|
|
73
|
+
</Box>
|
|
74
|
+
|
|
75
|
+
<Box marginTop={1}>
|
|
76
|
+
<Text color={colors.primary} bold>
|
|
77
|
+
Common Tasks:
|
|
78
|
+
</Text>
|
|
79
|
+
</Box>
|
|
80
|
+
<Text color={colors.white}>
|
|
81
|
+
{' '}
|
|
82
|
+
• Ask questions about your codebase {'>'} How does foo.py work?
|
|
83
|
+
</Text>
|
|
84
|
+
<Text color={colors.white}> • Edit files {'>'} Update bar.ts to...</Text>
|
|
85
|
+
<Text color={colors.white}> • Fix errors {'>'} cargo build</Text>
|
|
86
|
+
<Text color={colors.white}> • Run commands {'>'} /help</Text>
|
|
87
|
+
|
|
88
|
+
<Box marginTop={1}>
|
|
89
|
+
<Text color={colors.primary} bold>
|
|
90
|
+
Commands:
|
|
91
|
+
</Text>
|
|
92
|
+
</Box>
|
|
93
|
+
{commands.length === 0 ? (
|
|
94
|
+
<Text color={colors.white}> No commands available.</Text>
|
|
95
|
+
) : (
|
|
96
|
+
commands.map((cmd, index) => (
|
|
97
|
+
<Text key={index} color={colors.white}>
|
|
98
|
+
{' '}
|
|
99
|
+
• /{cmd.name} - {cmd.description}
|
|
100
|
+
</Text>
|
|
101
|
+
))
|
|
102
|
+
)}
|
|
103
|
+
</TitledBox>
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
export const helpCommand: Command = {
|
|
108
|
+
name: 'help',
|
|
109
|
+
description: 'Show available commands',
|
|
110
|
+
handler: async (_args: string[], _messages, _metadata) => {
|
|
111
|
+
const commands = commandRegistry.getAll();
|
|
112
|
+
const version = await getPackageVersion();
|
|
113
|
+
|
|
114
|
+
return React.createElement(Help, {
|
|
115
|
+
key: `help-${Date.now()}`,
|
|
116
|
+
version,
|
|
117
|
+
commands: commands,
|
|
118
|
+
});
|
|
119
|
+
},
|
|
120
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export * from '@/commands/exit';
|
|
2
|
+
export * from '@/commands/help';
|
|
3
|
+
export * from '@/commands/clear';
|
|
4
|
+
export * from '@/commands/model';
|
|
5
|
+
export * from '@/commands/provider';
|
|
6
|
+
export * from '@/commands/mcp';
|
|
7
|
+
export * from '@/commands/lsp';
|
|
8
|
+
export * from '@/commands/custom-commands';
|
|
9
|
+
export * from '@/commands/init';
|
|
10
|
+
export * from '@/commands/theme';
|
|
11
|
+
export * from '@/commands/export';
|
|
12
|
+
export * from '@/commands/update';
|
|
13
|
+
export * from '@/commands/model-database';
|
|
14
|
+
export * from '@/commands/status';
|
|
15
|
+
export * from '@/commands/setup-config';
|
|
16
|
+
export * from '@/commands/usage';
|
|
17
|
+
export * from '@/commands/checkpoint';
|
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, writeFileSync } from 'fs';
|
|
2
|
+
import { join } from 'path';
|
|
3
|
+
import { ErrorMessage } from '@/components/message-box';
|
|
4
|
+
import { TitledBox } from '@/components/ui/titled-box';
|
|
5
|
+
import { colors } from '@/config/index';
|
|
6
|
+
import { useTerminalWidth } from '@/hooks/useTerminalWidth';
|
|
7
|
+
import { AgentsTemplateGenerator } from '@/init/agents-template-generator';
|
|
8
|
+
import { ExistingRulesExtractor } from '@/init/existing-rules-extractor';
|
|
9
|
+
import { ProjectAnalyzer } from '@/init/project-analyzer';
|
|
10
|
+
import { Command } from '@/types/index';
|
|
11
|
+
import { Box, Text } from 'ink';
|
|
12
|
+
import React from 'react';
|
|
13
|
+
|
|
14
|
+
const DEFAULT_CODER_CONFIG = {
|
|
15
|
+
coder: {
|
|
16
|
+
providers: [
|
|
17
|
+
{
|
|
18
|
+
name: 'OpenRouter',
|
|
19
|
+
baseUrl: 'https://openrouter.ai/api/v1',
|
|
20
|
+
apiKey: 'your-openrouter-api-key-here',
|
|
21
|
+
models: ['openai/gpt-4o-mini', 'anthropic/claude-3-haiku'],
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
name: 'GitHub Models',
|
|
25
|
+
baseUrl: 'https://models.github.ai/inference',
|
|
26
|
+
apiKey: 'your-github-token-here',
|
|
27
|
+
models: ['openai/gpt-4o-mini', 'openai/gpt-4o'],
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: 'Local Ollama',
|
|
31
|
+
baseUrl: 'http://localhost:11434/v1',
|
|
32
|
+
models: ['llama3.2', 'qwen2.5-coder'],
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
mcpServers: [],
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
function InitSuccess({
|
|
40
|
+
created,
|
|
41
|
+
analysis,
|
|
42
|
+
}: {
|
|
43
|
+
created: string[];
|
|
44
|
+
analysis?: {
|
|
45
|
+
projectType: string;
|
|
46
|
+
primaryLanguage: string;
|
|
47
|
+
frameworks: string[];
|
|
48
|
+
totalFiles: number;
|
|
49
|
+
};
|
|
50
|
+
}) {
|
|
51
|
+
const boxWidth = useTerminalWidth();
|
|
52
|
+
return (
|
|
53
|
+
<TitledBox
|
|
54
|
+
title="Project Initialized"
|
|
55
|
+
width={boxWidth}
|
|
56
|
+
borderColor={colors.primary}
|
|
57
|
+
paddingX={2}
|
|
58
|
+
paddingY={1}
|
|
59
|
+
flexDirection="column"
|
|
60
|
+
marginBottom={1}
|
|
61
|
+
>
|
|
62
|
+
<Box marginBottom={1}>
|
|
63
|
+
<Text color={colors.primary} bold>
|
|
64
|
+
✓ Coder project initialized successfully!
|
|
65
|
+
</Text>
|
|
66
|
+
</Box>
|
|
67
|
+
|
|
68
|
+
{analysis && (
|
|
69
|
+
<>
|
|
70
|
+
<Box marginBottom={1}>
|
|
71
|
+
<Text color={colors.white} bold>
|
|
72
|
+
Project Analysis:
|
|
73
|
+
</Text>
|
|
74
|
+
</Box>
|
|
75
|
+
<Text color={colors.secondary}>• Type: {analysis.projectType}</Text>
|
|
76
|
+
<Text color={colors.secondary}>
|
|
77
|
+
• Primary Language: {analysis.primaryLanguage}
|
|
78
|
+
</Text>
|
|
79
|
+
{analysis.frameworks.length > 0 && (
|
|
80
|
+
<Text color={colors.secondary}>
|
|
81
|
+
• Frameworks: {analysis.frameworks.slice(0, 3).join(', ')}
|
|
82
|
+
</Text>
|
|
83
|
+
)}
|
|
84
|
+
<Text color={colors.secondary}>
|
|
85
|
+
• Files Analyzed: {analysis.totalFiles}
|
|
86
|
+
</Text>
|
|
87
|
+
<Box marginBottom={1} />
|
|
88
|
+
</>
|
|
89
|
+
)}
|
|
90
|
+
|
|
91
|
+
<Box marginBottom={1}>
|
|
92
|
+
<Text color={colors.white} bold>
|
|
93
|
+
Files Created:
|
|
94
|
+
</Text>
|
|
95
|
+
</Box>
|
|
96
|
+
|
|
97
|
+
{created.map((item, index) => (
|
|
98
|
+
<Text key={index} color={colors.secondary}>
|
|
99
|
+
• {item}
|
|
100
|
+
</Text>
|
|
101
|
+
))}
|
|
102
|
+
|
|
103
|
+
<Box marginTop={1} flexDirection="column">
|
|
104
|
+
<Box marginBottom={1}>
|
|
105
|
+
<Text color={colors.white}>
|
|
106
|
+
Your project is now ready for AI-assisted development!
|
|
107
|
+
</Text>
|
|
108
|
+
</Box>
|
|
109
|
+
<Text color={colors.secondary}>
|
|
110
|
+
The AGENTS.md file will help AI understand your project context.
|
|
111
|
+
</Text>
|
|
112
|
+
</Box>
|
|
113
|
+
</TitledBox>
|
|
114
|
+
);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
function InitError({ message }: { message: string }) {
|
|
118
|
+
return <ErrorMessage hideBox={true} message={`✗ ${message}`} />;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// Enhanced example commands based on detected project type
|
|
122
|
+
const getExampleCommands = (projectType: string, primaryLanguage: string) => {
|
|
123
|
+
const baseCommands = {
|
|
124
|
+
'review.md': `---
|
|
125
|
+
description: Review code and suggest improvements
|
|
126
|
+
aliases: [code-review, cr]
|
|
127
|
+
parameters: [files]
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
Review the code in {{files}} and provide detailed feedback on:
|
|
131
|
+
|
|
132
|
+
1. Code quality and best practices
|
|
133
|
+
2. Potential bugs or issues
|
|
134
|
+
3. Performance considerations
|
|
135
|
+
4. Readability and maintainability
|
|
136
|
+
5. Security concerns
|
|
137
|
+
|
|
138
|
+
Provide specific, actionable suggestions for improvement.`,
|
|
139
|
+
|
|
140
|
+
'test.md': `---
|
|
141
|
+
description: Generate comprehensive unit tests
|
|
142
|
+
aliases: [unittest, test-gen]
|
|
143
|
+
parameters: [filename]
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
Generate comprehensive unit tests for {{filename}}.
|
|
147
|
+
|
|
148
|
+
Consider:
|
|
149
|
+
1. Test all public functions and methods
|
|
150
|
+
2. Include edge cases and error scenarios
|
|
151
|
+
3. Use appropriate mocking where needed
|
|
152
|
+
4. Follow existing test framework conventions
|
|
153
|
+
5. Ensure good test coverage
|
|
154
|
+
|
|
155
|
+
If no filename provided, suggest which files need tests.`,
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
// Add language/framework-specific commands
|
|
159
|
+
const additionalCommands: { [key: string]: string } = {};
|
|
160
|
+
|
|
161
|
+
if (primaryLanguage === 'JavaScript' || primaryLanguage === 'TypeScript') {
|
|
162
|
+
additionalCommands['refactor.md'] = `---
|
|
163
|
+
description: Refactor JavaScript/TypeScript code
|
|
164
|
+
aliases: [refactor-js, clean]
|
|
165
|
+
parameters: [target]
|
|
166
|
+
---
|
|
167
|
+
|
|
168
|
+
Refactor {{target}} to improve:
|
|
169
|
+
|
|
170
|
+
1. Code structure and organization
|
|
171
|
+
2. Modern ES6+ syntax usage
|
|
172
|
+
3. Performance optimizations
|
|
173
|
+
4. Type safety (for TypeScript)
|
|
174
|
+
5. Reusability and maintainability
|
|
175
|
+
|
|
176
|
+
Follow current project conventions and patterns.`;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
if (primaryLanguage === 'Python') {
|
|
180
|
+
additionalCommands['optimize.md'] = `---
|
|
181
|
+
description: Optimize Python code for performance
|
|
182
|
+
aliases: [perf, optimize-py]
|
|
183
|
+
parameters: [file]
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
Analyze and optimize {{file}} for:
|
|
187
|
+
|
|
188
|
+
1. Algorithm efficiency
|
|
189
|
+
2. Memory usage
|
|
190
|
+
3. Pythonic patterns
|
|
191
|
+
4. Performance bottlenecks
|
|
192
|
+
5. Code readability
|
|
193
|
+
|
|
194
|
+
Follow PEP 8 and project conventions.`;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
if (projectType.includes('Web')) {
|
|
198
|
+
additionalCommands['component.md'] = `---
|
|
199
|
+
description: Create a new UI component
|
|
200
|
+
aliases: [comp, ui]
|
|
201
|
+
parameters: [name, type]
|
|
202
|
+
---
|
|
203
|
+
|
|
204
|
+
Create a new {{type}} component named {{name}} that:
|
|
205
|
+
|
|
206
|
+
1. Follows project component patterns
|
|
207
|
+
2. Includes proper TypeScript types
|
|
208
|
+
3. Has responsive design considerations
|
|
209
|
+
4. Includes basic styling structure
|
|
210
|
+
5. Has proper prop validation
|
|
211
|
+
|
|
212
|
+
Make it reusable and well-documented.`;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
return { ...baseCommands, ...additionalCommands };
|
|
216
|
+
};
|
|
217
|
+
|
|
218
|
+
export const initCommand: Command = {
|
|
219
|
+
name: 'init',
|
|
220
|
+
description:
|
|
221
|
+
'Initialize coder configuration and analyze project structure. Use --force to regenerate AGENTS.md.',
|
|
222
|
+
handler: (args: string[], _messages, _metadata) => {
|
|
223
|
+
const cwd = process.cwd();
|
|
224
|
+
const created: string[] = [];
|
|
225
|
+
const forceRegenerate = args.includes('--force') || args.includes('-f');
|
|
226
|
+
|
|
227
|
+
try {
|
|
228
|
+
// Check if already initialized
|
|
229
|
+
const agentsPath = join(cwd, 'AGENTS.md');
|
|
230
|
+
const coderDir = join(cwd, '.coder');
|
|
231
|
+
const configPath = join(cwd, 'coder.config.json');
|
|
232
|
+
|
|
233
|
+
// Check for existing initialization
|
|
234
|
+
const hasAgents = existsSync(agentsPath);
|
|
235
|
+
const hasCoder = existsSync(coderDir);
|
|
236
|
+
const hasConfig = existsSync(configPath);
|
|
237
|
+
|
|
238
|
+
if (hasAgents && hasCoder && hasConfig && !forceRegenerate) {
|
|
239
|
+
return Promise.resolve(
|
|
240
|
+
React.createElement(InitError, {
|
|
241
|
+
key: `init-error-${Date.now()}`,
|
|
242
|
+
message:
|
|
243
|
+
'Project already initialized. Found AGENTS.md, .coder/ directory and coder.config.json. Use /init --force to regenerate.',
|
|
244
|
+
}),
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
// Show progress indicator for analysis
|
|
249
|
+
// Note: In a real implementation, we'd want to show this as a loading state
|
|
250
|
+
// For now, we'll do the analysis synchronously
|
|
251
|
+
|
|
252
|
+
// Analyze the project
|
|
253
|
+
const analyzer = new ProjectAnalyzer(cwd);
|
|
254
|
+
const analysis = analyzer.analyze();
|
|
255
|
+
|
|
256
|
+
// Extract existing AI configuration files
|
|
257
|
+
const rulesExtractor = new ExistingRulesExtractor(cwd);
|
|
258
|
+
const existingRules = rulesExtractor.extractExistingRules();
|
|
259
|
+
|
|
260
|
+
// Create AGENTS.md based on analysis and existing rules
|
|
261
|
+
if (!hasAgents || forceRegenerate) {
|
|
262
|
+
const agentsContent = AgentsTemplateGenerator.generateAgentsMd(
|
|
263
|
+
analysis,
|
|
264
|
+
existingRules,
|
|
265
|
+
);
|
|
266
|
+
writeFileSync(agentsPath, agentsContent);
|
|
267
|
+
created.push(hasAgents ? 'AGENTS.md (regenerated)' : 'AGENTS.md');
|
|
268
|
+
|
|
269
|
+
// Report found existing rules
|
|
270
|
+
if (existingRules.length > 0) {
|
|
271
|
+
const sourceFiles = existingRules.map(r => r.source).join(', ');
|
|
272
|
+
created.push(`↳ Merged content from: ${sourceFiles}`);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
// Create .coder directory structure
|
|
277
|
+
if (!hasCoder) {
|
|
278
|
+
mkdirSync(coderDir, { recursive: true });
|
|
279
|
+
created.push('.coder/');
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
const commandsDir = join(coderDir, 'commands');
|
|
283
|
+
if (!existsSync(commandsDir)) {
|
|
284
|
+
mkdirSync(commandsDir, { recursive: true });
|
|
285
|
+
created.push('.coder/commands/');
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// Create example custom commands based on project analysis
|
|
289
|
+
const exampleCommands = getExampleCommands(
|
|
290
|
+
analysis.projectType,
|
|
291
|
+
analysis.languages.primary?.name || 'Unknown',
|
|
292
|
+
);
|
|
293
|
+
|
|
294
|
+
for (const [filename, content] of Object.entries(exampleCommands)) {
|
|
295
|
+
const filePath = join(commandsDir, filename);
|
|
296
|
+
if (!existsSync(filePath)) {
|
|
297
|
+
writeFileSync(filePath, content);
|
|
298
|
+
created.push(`.coder/commands/${filename}`);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// Prepare analysis summary for display
|
|
303
|
+
const analysisSummary = {
|
|
304
|
+
projectType: analysis.projectType,
|
|
305
|
+
primaryLanguage: analysis.languages.primary?.name || 'Unknown',
|
|
306
|
+
frameworks: analysis.dependencies.frameworks.map(
|
|
307
|
+
(f: { name: string }) => f.name,
|
|
308
|
+
),
|
|
309
|
+
totalFiles: analysis.structure.scannedFiles,
|
|
310
|
+
};
|
|
311
|
+
|
|
312
|
+
// Create coder.config.json
|
|
313
|
+
if (!hasConfig || forceRegenerate) {
|
|
314
|
+
writeFileSync(
|
|
315
|
+
configPath,
|
|
316
|
+
JSON.stringify(DEFAULT_CODER_CONFIG, null, 2),
|
|
317
|
+
);
|
|
318
|
+
created.push(hasConfig ? 'coder.config.json (regenerated)' : 'coder.config.json');
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
return Promise.resolve(
|
|
322
|
+
React.createElement(InitSuccess, {
|
|
323
|
+
key: `init-success-${Date.now()}`,
|
|
324
|
+
created,
|
|
325
|
+
analysis: analysisSummary,
|
|
326
|
+
}),
|
|
327
|
+
);
|
|
328
|
+
} catch (error: unknown) {
|
|
329
|
+
const errorMessage =
|
|
330
|
+
error instanceof Error ? error.message : 'Unknown error';
|
|
331
|
+
return Promise.resolve(
|
|
332
|
+
React.createElement(InitError, {
|
|
333
|
+
key: `init-error-${Date.now()}`,
|
|
334
|
+
message: `Failed to initialize project: ${errorMessage}`,
|
|
335
|
+
}),
|
|
336
|
+
);
|
|
337
|
+
}
|
|
338
|
+
},
|
|
339
|
+
};
|