@wundr.io/cli 1.0.0 → 1.0.2-dev.20260530174250.ef0ec927

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (230) hide show
  1. package/README.md +696 -280
  2. package/bin/wundr.js +13 -5
  3. package/package.json +30 -9
  4. package/src/ai/ai-service.ts +6 -4
  5. package/src/ai/claude-client.ts +6 -2
  6. package/src/ai/conversation-manager.ts +12 -5
  7. package/src/cli.ts +42 -13
  8. package/src/commands/ai.ts +340 -64
  9. package/src/commands/alignment.ts +1212 -0
  10. package/src/commands/analyze-optimized.ts +371 -33
  11. package/src/commands/analyze.ts +8 -6
  12. package/src/commands/batch.ts +166 -26
  13. package/src/commands/chat.ts +20 -10
  14. package/src/commands/claude-init.ts +31 -27
  15. package/src/commands/claude-setup.ts +761 -81
  16. package/src/commands/computer-setup.ts +524 -12
  17. package/src/commands/create-command.ts +3 -3
  18. package/src/commands/create.ts +9 -6
  19. package/src/commands/dashboard.ts +11 -6
  20. package/src/commands/govern.ts +11 -6
  21. package/src/commands/governance.ts +1005 -0
  22. package/src/commands/guardian.ts +887 -0
  23. package/src/commands/init.ts +104 -11
  24. package/src/commands/orchestrator.ts +789 -0
  25. package/src/commands/performance-optimizer.ts +15 -10
  26. package/src/commands/plugins.ts +8 -5
  27. package/src/commands/project-update.ts +1156 -0
  28. package/src/commands/rag.ts +1011 -0
  29. package/src/commands/session.ts +631 -0
  30. package/src/commands/setup.ts +42 -344
  31. package/src/commands/test-init.ts +3 -2
  32. package/src/commands/test.ts +3 -2
  33. package/src/commands/watch.ts +21 -11
  34. package/src/commands/worktree.ts +1057 -0
  35. package/src/context/context-manager.ts +5 -2
  36. package/src/context/session-manager.ts +18 -7
  37. package/src/framework/command-interface.ts +520 -0
  38. package/src/framework/command-registry.ts +942 -0
  39. package/src/framework/completion-exporter.ts +383 -0
  40. package/src/framework/debug-logger.ts +519 -0
  41. package/src/framework/error-handler.ts +867 -0
  42. package/src/framework/help-generator.ts +540 -0
  43. package/src/framework/index.ts +169 -0
  44. package/src/framework/interactive-repl.ts +703 -0
  45. package/src/framework/output-formatter.ts +834 -0
  46. package/src/framework/progress-manager.ts +539 -0
  47. package/src/index.ts +3 -2
  48. package/src/interactive/interactive-mode.ts +14 -7
  49. package/src/lib/conflict-resolution.ts +818 -0
  50. package/src/lib/merge-strategy.ts +550 -0
  51. package/src/lib/safety-mechanisms.ts +451 -0
  52. package/src/lib/state-detection.ts +1030 -0
  53. package/src/nlp/command-mapper.ts +8 -3
  54. package/src/nlp/command-parser.ts +5 -2
  55. package/src/nlp/intent-parser.ts +23 -9
  56. package/src/plugins/plugin-manager.ts +50 -24
  57. package/src/tests/computer-setup-integration.test.ts +470 -0
  58. package/src/types/index.ts +1 -1
  59. package/src/types/modules.d.ts +425 -1
  60. package/src/utils/backup-rollback-manager.ts +366 -0
  61. package/src/utils/claude-config-installer.ts +823 -0
  62. package/src/utils/config-manager.ts +9 -6
  63. package/src/utils/error-handler.ts +3 -1
  64. package/src/utils/logger.ts +35 -12
  65. package/templates/batch/ci-cd.yaml +7 -7
  66. package/test-suites/api/health.spec.ts +20 -23
  67. package/test-suites/helpers/test-config.ts +14 -13
  68. package/test-suites/ui/accessibility.spec.ts +27 -22
  69. package/test-suites/ui/smoke.spec.ts +26 -21
  70. package/dist/ai/ai-service.d.ts +0 -152
  71. package/dist/ai/ai-service.d.ts.map +0 -1
  72. package/dist/ai/ai-service.js +0 -430
  73. package/dist/ai/ai-service.js.map +0 -1
  74. package/dist/ai/claude-client.d.ts +0 -130
  75. package/dist/ai/claude-client.d.ts.map +0 -1
  76. package/dist/ai/claude-client.js +0 -339
  77. package/dist/ai/claude-client.js.map +0 -1
  78. package/dist/ai/conversation-manager.d.ts +0 -164
  79. package/dist/ai/conversation-manager.d.ts.map +0 -1
  80. package/dist/ai/conversation-manager.js +0 -612
  81. package/dist/ai/conversation-manager.js.map +0 -1
  82. package/dist/ai/index.d.ts +0 -5
  83. package/dist/ai/index.d.ts.map +0 -1
  84. package/dist/ai/index.js +0 -8
  85. package/dist/ai/index.js.map +0 -1
  86. package/dist/cli.d.ts +0 -36
  87. package/dist/cli.d.ts.map +0 -1
  88. package/dist/cli.js +0 -173
  89. package/dist/cli.js.map +0 -1
  90. package/dist/commands/ai.d.ts +0 -89
  91. package/dist/commands/ai.d.ts.map +0 -1
  92. package/dist/commands/ai.js +0 -735
  93. package/dist/commands/ai.js.map +0 -1
  94. package/dist/commands/analyze-optimized.d.ts +0 -14
  95. package/dist/commands/analyze-optimized.d.ts.map +0 -1
  96. package/dist/commands/analyze-optimized.js +0 -437
  97. package/dist/commands/analyze-optimized.js.map +0 -1
  98. package/dist/commands/analyze.d.ts +0 -65
  99. package/dist/commands/analyze.d.ts.map +0 -1
  100. package/dist/commands/analyze.js +0 -435
  101. package/dist/commands/analyze.js.map +0 -1
  102. package/dist/commands/batch.d.ts +0 -71
  103. package/dist/commands/batch.d.ts.map +0 -1
  104. package/dist/commands/batch.js +0 -738
  105. package/dist/commands/batch.js.map +0 -1
  106. package/dist/commands/chat.d.ts +0 -71
  107. package/dist/commands/chat.d.ts.map +0 -1
  108. package/dist/commands/chat.js +0 -674
  109. package/dist/commands/chat.js.map +0 -1
  110. package/dist/commands/claude-init.d.ts +0 -28
  111. package/dist/commands/claude-init.d.ts.map +0 -1
  112. package/dist/commands/claude-init.js +0 -587
  113. package/dist/commands/claude-init.js.map +0 -1
  114. package/dist/commands/claude-setup.d.ts +0 -32
  115. package/dist/commands/claude-setup.d.ts.map +0 -1
  116. package/dist/commands/claude-setup.js +0 -570
  117. package/dist/commands/claude-setup.js.map +0 -1
  118. package/dist/commands/computer-setup-commands.d.ts +0 -39
  119. package/dist/commands/computer-setup-commands.d.ts.map +0 -1
  120. package/dist/commands/computer-setup-commands.js +0 -563
  121. package/dist/commands/computer-setup-commands.js.map +0 -1
  122. package/dist/commands/computer-setup.d.ts +0 -7
  123. package/dist/commands/computer-setup.d.ts.map +0 -1
  124. package/dist/commands/computer-setup.js +0 -481
  125. package/dist/commands/computer-setup.js.map +0 -1
  126. package/dist/commands/create-command.d.ts +0 -7
  127. package/dist/commands/create-command.d.ts.map +0 -1
  128. package/dist/commands/create-command.js +0 -158
  129. package/dist/commands/create-command.js.map +0 -1
  130. package/dist/commands/create.d.ts +0 -74
  131. package/dist/commands/create.d.ts.map +0 -1
  132. package/dist/commands/create.js +0 -556
  133. package/dist/commands/create.js.map +0 -1
  134. package/dist/commands/dashboard.d.ts +0 -91
  135. package/dist/commands/dashboard.d.ts.map +0 -1
  136. package/dist/commands/dashboard.js +0 -537
  137. package/dist/commands/dashboard.js.map +0 -1
  138. package/dist/commands/govern.d.ts +0 -70
  139. package/dist/commands/govern.d.ts.map +0 -1
  140. package/dist/commands/govern.js +0 -480
  141. package/dist/commands/govern.js.map +0 -1
  142. package/dist/commands/init.d.ts +0 -55
  143. package/dist/commands/init.d.ts.map +0 -1
  144. package/dist/commands/init.js +0 -584
  145. package/dist/commands/init.js.map +0 -1
  146. package/dist/commands/performance-optimizer.d.ts +0 -30
  147. package/dist/commands/performance-optimizer.d.ts.map +0 -1
  148. package/dist/commands/performance-optimizer.js +0 -649
  149. package/dist/commands/performance-optimizer.js.map +0 -1
  150. package/dist/commands/plugins.d.ts +0 -87
  151. package/dist/commands/plugins.d.ts.map +0 -1
  152. package/dist/commands/plugins.js +0 -685
  153. package/dist/commands/plugins.js.map +0 -1
  154. package/dist/commands/setup.d.ts +0 -29
  155. package/dist/commands/setup.d.ts.map +0 -1
  156. package/dist/commands/setup.js +0 -399
  157. package/dist/commands/setup.js.map +0 -1
  158. package/dist/commands/test-init.d.ts +0 -9
  159. package/dist/commands/test-init.d.ts.map +0 -1
  160. package/dist/commands/test-init.js +0 -222
  161. package/dist/commands/test-init.js.map +0 -1
  162. package/dist/commands/test.d.ts +0 -25
  163. package/dist/commands/test.d.ts.map +0 -1
  164. package/dist/commands/test.js +0 -217
  165. package/dist/commands/test.js.map +0 -1
  166. package/dist/commands/watch.d.ts +0 -76
  167. package/dist/commands/watch.d.ts.map +0 -1
  168. package/dist/commands/watch.js +0 -610
  169. package/dist/commands/watch.js.map +0 -1
  170. package/dist/context/context-manager.d.ts +0 -155
  171. package/dist/context/context-manager.d.ts.map +0 -1
  172. package/dist/context/context-manager.js +0 -383
  173. package/dist/context/context-manager.js.map +0 -1
  174. package/dist/context/index.d.ts +0 -3
  175. package/dist/context/index.d.ts.map +0 -1
  176. package/dist/context/index.js +0 -6
  177. package/dist/context/index.js.map +0 -1
  178. package/dist/context/session-manager.d.ts +0 -207
  179. package/dist/context/session-manager.d.ts.map +0 -1
  180. package/dist/context/session-manager.js +0 -682
  181. package/dist/context/session-manager.js.map +0 -1
  182. package/dist/index.d.ts +0 -8
  183. package/dist/index.d.ts.map +0 -1
  184. package/dist/index.js +0 -51
  185. package/dist/index.js.map +0 -1
  186. package/dist/interactive/interactive-mode.d.ts +0 -76
  187. package/dist/interactive/interactive-mode.d.ts.map +0 -1
  188. package/dist/interactive/interactive-mode.js +0 -730
  189. package/dist/interactive/interactive-mode.js.map +0 -1
  190. package/dist/nlp/command-mapper.d.ts +0 -174
  191. package/dist/nlp/command-mapper.d.ts.map +0 -1
  192. package/dist/nlp/command-mapper.js +0 -623
  193. package/dist/nlp/command-mapper.js.map +0 -1
  194. package/dist/nlp/command-parser.d.ts +0 -106
  195. package/dist/nlp/command-parser.d.ts.map +0 -1
  196. package/dist/nlp/command-parser.js +0 -416
  197. package/dist/nlp/command-parser.js.map +0 -1
  198. package/dist/nlp/index.d.ts +0 -5
  199. package/dist/nlp/index.d.ts.map +0 -1
  200. package/dist/nlp/index.js +0 -8
  201. package/dist/nlp/index.js.map +0 -1
  202. package/dist/nlp/intent-classifier.d.ts +0 -59
  203. package/dist/nlp/intent-classifier.d.ts.map +0 -1
  204. package/dist/nlp/intent-classifier.js +0 -384
  205. package/dist/nlp/intent-classifier.js.map +0 -1
  206. package/dist/nlp/intent-parser.d.ts +0 -152
  207. package/dist/nlp/intent-parser.d.ts.map +0 -1
  208. package/dist/nlp/intent-parser.js +0 -739
  209. package/dist/nlp/intent-parser.js.map +0 -1
  210. package/dist/plugins/plugin-manager.d.ts +0 -120
  211. package/dist/plugins/plugin-manager.d.ts.map +0 -1
  212. package/dist/plugins/plugin-manager.js +0 -595
  213. package/dist/plugins/plugin-manager.js.map +0 -1
  214. package/dist/types/index.d.ts +0 -224
  215. package/dist/types/index.d.ts.map +0 -1
  216. package/dist/types/index.js +0 -3
  217. package/dist/types/index.js.map +0 -1
  218. package/dist/utils/config-manager.d.ts +0 -73
  219. package/dist/utils/config-manager.d.ts.map +0 -1
  220. package/dist/utils/config-manager.js +0 -339
  221. package/dist/utils/config-manager.js.map +0 -1
  222. package/dist/utils/error-handler.d.ts +0 -46
  223. package/dist/utils/error-handler.d.ts.map +0 -1
  224. package/dist/utils/error-handler.js +0 -169
  225. package/dist/utils/error-handler.js.map +0 -1
  226. package/dist/utils/logger.d.ts +0 -25
  227. package/dist/utils/logger.d.ts.map +0 -1
  228. package/dist/utils/logger.js +0 -94
  229. package/dist/utils/logger.js.map +0 -1
  230. package/src/commands/computer-setup-commands.ts +0 -709
@@ -1,735 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.AICommands = void 0;
4
- const tslib_1 = require("tslib");
5
- const inquirer_1 = tslib_1.__importDefault(require("inquirer"));
6
- const chalk_1 = tslib_1.__importDefault(require("chalk"));
7
- const ai_service_1 = require("../ai/ai-service");
8
- const logger_1 = require("../utils/logger");
9
- const error_handler_1 = require("../utils/error-handler");
10
- /**
11
- * AI commands for AI-powered development features
12
- */
13
- class AICommands {
14
- program;
15
- configManager;
16
- _pluginManager;
17
- aiService;
18
- constructor(program, configManager, _pluginManager) {
19
- this.program = program;
20
- this.configManager = configManager;
21
- this._pluginManager = _pluginManager;
22
- this.aiService = new ai_service_1.AIService(configManager);
23
- this.registerCommands();
24
- }
25
- registerCommands() {
26
- const aiCmd = this.program
27
- .command('ai')
28
- .description('AI-powered development features');
29
- // Code generation
30
- aiCmd
31
- .command('generate <type>')
32
- .alias('gen')
33
- .description('generate code using AI')
34
- .option('--prompt <prompt>', 'generation prompt')
35
- .option('--template <template>', 'use specific template')
36
- .option('--context <path>', 'include context from path')
37
- .option('--output <path>', 'output file path')
38
- .action(async (type, options) => {
39
- await this.generateCode(type, options);
40
- });
41
- // Code review
42
- aiCmd
43
- .command('review [files...]')
44
- .description('AI-powered code review')
45
- .option('--focus <aspect>', 'review focus (security, performance, style)', 'all')
46
- .option('--severity <level>', 'minimum issue severity', 'info')
47
- .option('--suggest-fixes', 'suggest fixes for issues')
48
- .action(async (files, options) => {
49
- await this.reviewCode(files, options);
50
- });
51
- // Code refactoring
52
- aiCmd
53
- .command('refactor <target>')
54
- .description('AI-assisted code refactoring')
55
- .option('--type <type>', 'refactoring type (extract, rename, optimize)', 'optimize')
56
- .option('--scope <scope>', 'refactoring scope (function, class, file)', 'function')
57
- .option('--dry-run', 'show refactoring plan without applying')
58
- .action(async (target, options) => {
59
- await this.refactorCode(target, options);
60
- });
61
- // Documentation generation
62
- aiCmd
63
- .command('docs <target>')
64
- .description('generate documentation using AI')
65
- .option('--type <type>', 'documentation type (api, readme, comments)', 'api')
66
- .option('--format <format>', 'output format (markdown, html, json)', 'markdown')
67
- .option('--include-examples', 'include code examples')
68
- .action(async (target, options) => {
69
- await this.generateDocs(target, options);
70
- });
71
- // Test generation
72
- aiCmd
73
- .command('test <target>')
74
- .description('generate tests using AI')
75
- .option('--framework <framework>', 'testing framework (jest, mocha, vitest)', 'jest')
76
- .option('--coverage <level>', 'coverage level (unit, integration, e2e)', 'unit')
77
- .option('--mocks', 'generate mock objects')
78
- .action(async (target, options) => {
79
- await this.generateTests(target, options);
80
- });
81
- // Chat interface
82
- aiCmd
83
- .command('chat')
84
- .alias('c')
85
- .description('start AI chat session')
86
- .option('--model <model>', 'AI model to use')
87
- .option('--context <path>', 'include project context')
88
- .option('--session <id>', 'resume existing session')
89
- .action(async (options) => {
90
- await this.startChatSession(options);
91
- });
92
- // Code analysis
93
- aiCmd
94
- .command('analyze <target>')
95
- .description('AI-powered code analysis')
96
- .option('--aspect <aspect>', 'analysis aspect (complexity, maintainability, security)', 'all')
97
- .option('--suggestions', 'include improvement suggestions')
98
- .action(async (target, options) => {
99
- await this.analyzeCode(target, options);
100
- });
101
- // Performance optimization
102
- aiCmd
103
- .command('optimize <target>')
104
- .description('AI-powered performance optimization')
105
- .option('--focus <focus>', 'optimization focus (speed, memory, bundle)', 'speed')
106
- .option('--benchmarks', 'run before/after benchmarks')
107
- .action(async (target, options) => {
108
- await this.optimizeCode(target, options);
109
- });
110
- // AI Setup Command
111
- aiCmd
112
- .command('setup')
113
- .description('setup AI configuration and API keys')
114
- .option('--provider <provider>', 'AI provider (claude, openai)', 'claude')
115
- .option('--api-key <key>', 'API key for the provider')
116
- .option('--validate', 'validate the API key after setup')
117
- .action(async (options) => {
118
- await this.setupAI(options);
119
- });
120
- // Status Command
121
- aiCmd
122
- .command('status')
123
- .description('check AI configuration status')
124
- .action(async () => {
125
- await this.showAIStatus();
126
- });
127
- // Validate Command
128
- aiCmd
129
- .command('validate')
130
- .description('validate AI connection and API key')
131
- .action(async () => {
132
- await this.validateAI();
133
- });
134
- // Configuration
135
- aiCmd.command('config').description('configure AI settings');
136
- aiCmd
137
- .command('config set <key> <value>')
138
- .description('set AI configuration')
139
- .action(async (key, value) => {
140
- await this.setAIConfig(key, value);
141
- });
142
- aiCmd
143
- .command('config get [key]')
144
- .description('get AI configuration')
145
- .action(async (key) => {
146
- await this.getAIConfig(key);
147
- });
148
- }
149
- /**
150
- * Generate code using AI
151
- */
152
- async generateCode(type, options) {
153
- try {
154
- // Check if AI is ready
155
- if (!this.aiService.isReady()) {
156
- console.log(chalk_1.default.red('\n❌ AI service not configured'));
157
- console.log(chalk_1.default.yellow('Run `wundr ai setup` to configure your API key first'));
158
- return;
159
- }
160
- logger_1.logger.info(`Generating ${chalk_1.default.cyan(type)} code...`);
161
- const prompt = options.prompt || (await this.promptForGeneration(type));
162
- const context = options.context
163
- ? await this.loadContext(options.context)
164
- : '';
165
- const generatedCode = await this.callAI('generate', {
166
- type,
167
- prompt,
168
- context,
169
- template: options.template,
170
- });
171
- if (options.output) {
172
- await this.saveGeneratedCode(generatedCode, options.output);
173
- logger_1.logger.success(`Code generated and saved to ${options.output}`);
174
- }
175
- else {
176
- console.log(chalk_1.default.green('\nGenerated Code:'));
177
- console.log(generatedCode);
178
- }
179
- }
180
- catch (error) {
181
- throw error_handler_1.errorHandler.createError('WUNDR_AI_GENERATE_FAILED', 'Failed to generate code', { type, options }, true);
182
- }
183
- }
184
- /**
185
- * AI-powered code review
186
- */
187
- async reviewCode(files, options) {
188
- try {
189
- // Check if AI is ready
190
- if (!this.aiService.isReady()) {
191
- console.log(chalk_1.default.red('\n❌ AI service not configured'));
192
- console.log(chalk_1.default.yellow('Run `wundr ai setup` to configure your API key first'));
193
- return;
194
- }
195
- logger_1.logger.info('Starting AI code review...');
196
- const filesToReview = files.length > 0 ? files : await this.getChangedFiles();
197
- const reviewResults = [];
198
- for (const file of filesToReview) {
199
- logger_1.logger.debug(`Reviewing ${file}...`);
200
- const code = await this.readFile(file);
201
- const review = await this.callAI('review', {
202
- code,
203
- file,
204
- focus: options.focus,
205
- severity: options.severity,
206
- });
207
- reviewResults.push({
208
- file,
209
- issues: review.issues,
210
- suggestions: review.suggestions,
211
- score: review.score,
212
- });
213
- }
214
- this.displayReviewResults(reviewResults);
215
- if (options.suggestFixes) {
216
- await this.suggestFixes(reviewResults);
217
- }
218
- }
219
- catch (error) {
220
- throw error_handler_1.errorHandler.createError('WUNDR_AI_REVIEW_FAILED', 'Failed to review code', { files, options }, true);
221
- }
222
- }
223
- /**
224
- * AI-assisted code refactoring
225
- */
226
- async refactorCode(target, options) {
227
- try {
228
- // Check if AI is ready
229
- if (!this.aiService.isReady()) {
230
- console.log(chalk_1.default.red('\n❌ AI service not configured'));
231
- console.log(chalk_1.default.yellow('Run `wundr ai setup` to configure your API key first'));
232
- return;
233
- }
234
- logger_1.logger.info(`Refactoring ${chalk_1.default.cyan(target)}...`);
235
- const code = await this.readFile(target);
236
- const refactoringPlan = await this.callAI('refactor', {
237
- code,
238
- target,
239
- type: options.type,
240
- scope: options.scope,
241
- });
242
- if (options.dryRun) {
243
- logger_1.logger.info('Refactoring Plan:');
244
- console.log(refactoringPlan.description);
245
- console.log('\nProposed Changes:');
246
- refactoringPlan.changes.forEach((change, i) => {
247
- console.log(`${i + 1}. ${change.description}`);
248
- });
249
- return;
250
- }
251
- const { proceed } = await inquirer_1.default.prompt([
252
- {
253
- type: 'confirm',
254
- name: 'proceed',
255
- message: 'Apply refactoring changes?',
256
- default: false,
257
- },
258
- ]);
259
- if (proceed) {
260
- await this.applyRefactoring(target, refactoringPlan);
261
- logger_1.logger.success(`Refactoring applied to ${target}`);
262
- }
263
- }
264
- catch (error) {
265
- throw error_handler_1.errorHandler.createError('WUNDR_AI_REFACTOR_FAILED', 'Failed to refactor code', { target, options }, true);
266
- }
267
- }
268
- /**
269
- * Generate documentation using AI
270
- */
271
- async generateDocs(target, options) {
272
- try {
273
- // Check if AI is ready
274
- if (!this.aiService.isReady()) {
275
- console.log(chalk_1.default.red('\n❌ AI service not configured'));
276
- console.log(chalk_1.default.yellow('Run `wundr ai setup` to configure your API key first'));
277
- return;
278
- }
279
- logger_1.logger.info(`Generating ${options.type} documentation for ${chalk_1.default.cyan(target)}...`);
280
- const code = await this.readFile(target);
281
- const _docs = await this.callAI('docs', {
282
- code,
283
- target,
284
- type: options.type,
285
- format: options.format,
286
- includeExamples: options.includeExamples,
287
- });
288
- const outputPath = this.getDocsOutputPath(target, options.type, options.format);
289
- await this.saveGeneratedDocs(_docs, outputPath);
290
- logger_1.logger.success(`Documentation generated: ${outputPath}`);
291
- }
292
- catch (error) {
293
- throw error_handler_1.errorHandler.createError('WUNDR_AI_DOCS_FAILED', 'Failed to generate documentation', { target, options }, true);
294
- }
295
- }
296
- /**
297
- * Generate tests using AI
298
- */
299
- async generateTests(target, options) {
300
- try {
301
- // Check if AI is ready
302
- if (!this.aiService.isReady()) {
303
- console.log(chalk_1.default.red('\n❌ AI service not configured'));
304
- console.log(chalk_1.default.yellow('Run `wundr ai setup` to configure your API key first'));
305
- return;
306
- }
307
- logger_1.logger.info(`Generating tests for ${chalk_1.default.cyan(target)}...`);
308
- const code = await this.readFile(target);
309
- const tests = await this.callAI('test', {
310
- code,
311
- target,
312
- framework: options.framework,
313
- coverage: options.coverage,
314
- mocks: options.mocks,
315
- });
316
- const testPath = this.getTestOutputPath(target, options.framework);
317
- await this.saveGeneratedCode(tests, testPath);
318
- logger_1.logger.success(`Tests generated: ${testPath}`);
319
- }
320
- catch (error) {
321
- throw error_handler_1.errorHandler.createError('WUNDR_AI_TEST_FAILED', 'Failed to generate tests', { target, options }, true);
322
- }
323
- }
324
- /**
325
- * Start AI chat session
326
- */
327
- async startChatSession(options) {
328
- try {
329
- // Check if AI is ready
330
- if (!this.aiService.isReady()) {
331
- console.log(chalk_1.default.red('\n❌ AI service not configured'));
332
- console.log(chalk_1.default.yellow('Run `wundr ai setup` to configure your API key first'));
333
- return;
334
- }
335
- logger_1.logger.info('Starting AI chat session...');
336
- const session = options.session
337
- ? await this.loadChatSession(options.session)
338
- : await this.createChatSession(options);
339
- await this.runChatLoop(session);
340
- }
341
- catch (error) {
342
- throw error_handler_1.errorHandler.createError('WUNDR_AI_CHAT_FAILED', 'Failed to start chat session', { options }, true);
343
- }
344
- }
345
- /**
346
- * AI-powered code analysis
347
- */
348
- async analyzeCode(target, options) {
349
- try {
350
- // Check if AI is ready
351
- if (!this.aiService.isReady()) {
352
- console.log(chalk_1.default.red('\n❌ AI service not configured'));
353
- console.log(chalk_1.default.yellow('Run `wundr ai setup` to configure your API key first'));
354
- return;
355
- }
356
- logger_1.logger.info(`Analyzing ${chalk_1.default.cyan(target)}...`);
357
- const code = await this.readFile(target);
358
- const analysis = await this.callAI('analyze', {
359
- code,
360
- target,
361
- aspect: options.aspect,
362
- suggestions: options.suggestions,
363
- });
364
- this.displayAnalysisResults(analysis);
365
- }
366
- catch (error) {
367
- throw error_handler_1.errorHandler.createError('WUNDR_AI_ANALYZE_FAILED', 'Failed to analyze code', { target, options }, true);
368
- }
369
- }
370
- /**
371
- * AI-powered performance optimization
372
- */
373
- async optimizeCode(target, options) {
374
- try {
375
- // Check if AI is ready
376
- if (!this.aiService.isReady()) {
377
- console.log(chalk_1.default.red('\n❌ AI service not configured'));
378
- console.log(chalk_1.default.yellow('Run `wundr ai setup` to configure your API key first'));
379
- return;
380
- }
381
- logger_1.logger.info(`Optimizing ${chalk_1.default.cyan(target)}...`);
382
- const code = await this.readFile(target);
383
- let beforeBenchmark = null;
384
- if (options.benchmarks) {
385
- beforeBenchmark = await this.runBenchmark(target);
386
- }
387
- const _optimization = await this.callAI('optimize', {
388
- code,
389
- target,
390
- focus: options.focus,
391
- });
392
- const { apply } = await inquirer_1.default.prompt([
393
- {
394
- type: 'confirm',
395
- name: 'apply',
396
- message: 'Apply optimization changes?',
397
- default: false,
398
- },
399
- ]);
400
- if (apply) {
401
- await this.applyOptimization(target, _optimization);
402
- if (options.benchmarks) {
403
- const afterBenchmark = await this.runBenchmark(target);
404
- this.displayBenchmarkComparison(beforeBenchmark, afterBenchmark);
405
- }
406
- logger_1.logger.success(`Code optimized: ${target}`);
407
- }
408
- }
409
- catch (error) {
410
- throw error_handler_1.errorHandler.createError('WUNDR_AI_OPTIMIZE_FAILED', 'Failed to optimize code', { target, options }, true);
411
- }
412
- }
413
- /**
414
- * Set AI configuration
415
- */
416
- async setAIConfig(key, value) {
417
- try {
418
- this.configManager.set(`ai.${key}`, value);
419
- await this.configManager.saveConfig();
420
- logger_1.logger.success(`AI configuration updated: ${key} = ${value}`);
421
- }
422
- catch (error) {
423
- throw error_handler_1.errorHandler.createError('WUNDR_AI_CONFIG_SET_FAILED', 'Failed to set AI configuration', { key, value }, true);
424
- }
425
- }
426
- /**
427
- * Get AI configuration
428
- */
429
- async getAIConfig(key) {
430
- try {
431
- if (key) {
432
- const value = this.configManager.get(`ai.${key}`);
433
- console.log(`${key}: ${value}`);
434
- }
435
- else {
436
- const aiConfig = this.configManager.get('ai');
437
- console.log(JSON.stringify(aiConfig, null, 2));
438
- }
439
- }
440
- catch (error) {
441
- throw error_handler_1.errorHandler.createError('WUNDR_AI_CONFIG_GET_FAILED', 'Failed to get AI configuration', { key }, true);
442
- }
443
- }
444
- /**
445
- * Setup AI configuration
446
- */
447
- async setupAI(options) {
448
- try {
449
- console.log(chalk_1.default.blue('\n🤖 Wundr AI Setup'));
450
- console.log(chalk_1.default.gray('Configure your AI assistant for enhanced CLI features\n'));
451
- let { provider, apiKey } = options;
452
- // Ask for provider if not specified
453
- if (!provider) {
454
- const providerAnswer = await inquirer_1.default.prompt([
455
- {
456
- type: 'list',
457
- name: 'provider',
458
- message: 'Select AI provider:',
459
- choices: [
460
- { name: 'Claude (Anthropic)', value: 'claude' },
461
- { name: 'OpenAI GPT', value: 'openai' },
462
- ],
463
- default: 'claude',
464
- },
465
- ]);
466
- provider = providerAnswer.provider;
467
- }
468
- // Ask for API key if not provided
469
- if (!apiKey) {
470
- const keyPrompt = provider === 'claude'
471
- ? 'Enter your Claude API key (from https://console.anthropic.com):'
472
- : 'Enter your OpenAI API key (from https://platform.openai.com):';
473
- const keyAnswer = await inquirer_1.default.prompt([
474
- {
475
- type: 'password',
476
- name: 'apiKey',
477
- message: keyPrompt,
478
- validate: input => {
479
- if (!input || input.length < 10) {
480
- return 'Please enter a valid API key';
481
- }
482
- return true;
483
- },
484
- },
485
- ]);
486
- apiKey = keyAnswer.apiKey;
487
- }
488
- // Set up the AI service
489
- await this.aiService.setupAI(apiKey, provider);
490
- // Validate if requested
491
- if (options.validate) {
492
- console.log(chalk_1.default.blue('\nValidating API key...'));
493
- const validation = await this.aiService.validateConnection();
494
- if (validation.connected) {
495
- console.log(chalk_1.default.green('✅ API key is valid and working!'));
496
- }
497
- else {
498
- console.log(chalk_1.default.red(`❌ API key validation failed: ${validation.error}`));
499
- return;
500
- }
501
- }
502
- console.log(chalk_1.default.green('\n✅ AI setup completed successfully!'));
503
- console.log(chalk_1.default.gray('\nYou can now use AI features like:'));
504
- console.log(chalk_1.default.gray(' • wundr ai chat - Interactive AI assistant'));
505
- console.log(chalk_1.default.gray(' • wundr ai generate - Code generation'));
506
- console.log(chalk_1.default.gray(' • wundr ai review - Code review'));
507
- console.log(chalk_1.default.gray('\nRun `wundr ai status` to check configuration'));
508
- }
509
- catch (error) {
510
- throw error_handler_1.errorHandler.createError('WUNDR_AI_SETUP_FAILED', 'Failed to setup AI configuration', { options }, true);
511
- }
512
- }
513
- /**
514
- * Show AI status
515
- */
516
- async showAIStatus() {
517
- try {
518
- const status = this.aiService.getStatus();
519
- console.log(chalk_1.default.blue('\n🤖 AI Configuration Status\n'));
520
- console.log(`Provider: ${chalk_1.default.cyan(status.provider)}`);
521
- console.log(`Model: ${chalk_1.default.cyan(status.model)}`);
522
- console.log(`API Key: ${status.hasApiKey ? chalk_1.default.green('✅ Configured') : chalk_1.default.red('❌ Missing')}`);
523
- console.log(`Status: ${status.ready ? chalk_1.default.green('✅ Ready') : chalk_1.default.yellow('⚠️ Not Ready')}`);
524
- if (!status.hasApiKey) {
525
- console.log(chalk_1.default.yellow('\n⚠️ API key not configured'));
526
- console.log(chalk_1.default.gray('Run `wundr ai setup` to configure your API key'));
527
- console.log(chalk_1.default.gray('Or set the CLAUDE_API_KEY environment variable'));
528
- }
529
- else if (!status.ready) {
530
- console.log(chalk_1.default.yellow('\n⚠️ AI service not ready'));
531
- console.log(chalk_1.default.gray('Try running `wundr ai validate` to check connection'));
532
- }
533
- }
534
- catch (error) {
535
- throw error_handler_1.errorHandler.createError('WUNDR_AI_STATUS_FAILED', 'Failed to get AI status', {}, true);
536
- }
537
- }
538
- /**
539
- * Validate AI connection
540
- */
541
- async validateAI() {
542
- try {
543
- console.log(chalk_1.default.blue('\n🔍 Validating AI connection...'));
544
- const validation = await this.aiService.validateConnection();
545
- console.log(`\nProvider: ${chalk_1.default.cyan(validation.provider)}`);
546
- console.log(`Model: ${chalk_1.default.cyan(validation.model)}`);
547
- if (validation.connected) {
548
- console.log(chalk_1.default.green('\n✅ Connection successful!'));
549
- console.log(chalk_1.default.gray('AI features are ready to use.'));
550
- }
551
- else {
552
- console.log(chalk_1.default.red('\n❌ Connection failed'));
553
- console.log(chalk_1.default.red(`Error: ${validation.error}`));
554
- if (validation.error?.includes('API key')) {
555
- console.log(chalk_1.default.yellow('\n💡 Try:'));
556
- console.log(chalk_1.default.gray('1. Run `wundr ai setup` to configure your API key'));
557
- console.log(chalk_1.default.gray('2. Check your API key is valid and has sufficient credits'));
558
- console.log(chalk_1.default.gray('3. Verify your internet connection'));
559
- }
560
- }
561
- }
562
- catch (error) {
563
- throw error_handler_1.errorHandler.createError('WUNDR_AI_VALIDATE_FAILED', 'Failed to validate AI connection', {}, true);
564
- }
565
- }
566
- /**
567
- * Helper methods
568
- */
569
- async callAI(operation, params) {
570
- // Check if AI service is ready
571
- if (!this.aiService.isReady()) {
572
- throw new Error('AI service not configured. Run `wundr ai setup` first.');
573
- }
574
- logger_1.logger.debug(`Calling AI for operation: ${operation}`);
575
- // For now, return mock responses - these would be replaced with actual AI calls
576
- switch (operation) {
577
- case 'generate':
578
- return `// Generated ${params.type} code\nfunction ${params.type}() {\n // Implementation here\n}`;
579
- case 'review':
580
- return { issues: [], suggestions: [], score: 95 };
581
- case 'refactor':
582
- return { description: 'Refactoring plan', changes: [] };
583
- case 'docs':
584
- return `# ${params.target} Documentation\n\nGenerated documentation...`;
585
- case 'test':
586
- return `// Generated tests\ndescribe('${params.target}', () => {\n // Tests here\n});`;
587
- case 'analyze':
588
- return { complexity: 'low', maintainability: 'high', suggestions: [] };
589
- case 'optimize':
590
- return { description: 'Optimization plan', changes: [] };
591
- case 'chat':
592
- return 'This is a mock response. In a real implementation, this would use the AI service.';
593
- default:
594
- throw new Error(`Unknown AI operation: ${operation}`);
595
- }
596
- }
597
- async promptForGeneration(type) {
598
- const { prompt } = await inquirer_1.default.prompt([
599
- {
600
- type: 'input',
601
- name: 'prompt',
602
- message: `Describe the ${type} you want to generate:`,
603
- validate: input => input.length > 0 || 'Prompt is required',
604
- },
605
- ]);
606
- return prompt;
607
- }
608
- async loadContext(contextPath) {
609
- // Load project context from specified path
610
- return `// Context from ${contextPath}`;
611
- }
612
- async saveGeneratedCode(_code, outputPath) {
613
- // Save generated code to file
614
- logger_1.logger.debug(`Saving generated code to ${outputPath}`);
615
- }
616
- async readFile(filePath) {
617
- // Read file content
618
- return `// Content of ${filePath}`;
619
- }
620
- async getChangedFiles() {
621
- // Get list of changed files from git
622
- return ['src/example.ts'];
623
- }
624
- displayReviewResults(results) {
625
- console.log(chalk_1.default.blue('\nCode Review Results:'));
626
- results.forEach(result => {
627
- console.log(`\n${chalk_1.default.cyan(result.file)} (Score: ${result.score}/100)`);
628
- if (result.issues.length > 0) {
629
- result.issues.forEach((issue) => {
630
- console.log(` ${issue.severity}: ${issue.description}`);
631
- });
632
- }
633
- });
634
- }
635
- async suggestFixes(_results) {
636
- // Implementation for suggesting fixes
637
- logger_1.logger.info('Generating fix suggestions...');
638
- }
639
- async applyRefactoring(target, _plan) {
640
- // Apply refactoring changes
641
- logger_1.logger.debug(`Applying refactoring to ${target}`);
642
- }
643
- getDocsOutputPath(target, type, format) {
644
- const ext = format === 'markdown' ? 'md' : format;
645
- return `docs/${target}.${type}.${ext}`;
646
- }
647
- async saveGeneratedDocs(_docs, outputPath) {
648
- // Save generated documentation
649
- logger_1.logger.debug(`Saving documentation to ${outputPath}`);
650
- }
651
- getTestOutputPath(target, _framework) {
652
- return `${target}.test.js`;
653
- }
654
- async loadChatSession(sessionId) {
655
- // Load existing chat session
656
- return {
657
- id: sessionId,
658
- model: 'claude-3',
659
- history: [],
660
- created: new Date(),
661
- updated: new Date(),
662
- };
663
- }
664
- async createChatSession(options) {
665
- return {
666
- id: `session-${Date.now()}`,
667
- model: options.model || 'claude-3',
668
- context: options.context,
669
- history: [],
670
- created: new Date(),
671
- updated: new Date(),
672
- };
673
- }
674
- async runChatLoop(session) {
675
- console.log(chalk_1.default.green(`\nAI Chat Session (${session.model})`));
676
- console.log(chalk_1.default.gray('Type "exit" to end the session\n'));
677
- // Load existing session into AI service
678
- this.aiService.loadChatSession(session);
679
- while (true) {
680
- const { message } = await inquirer_1.default.prompt([
681
- {
682
- type: 'input',
683
- name: 'message',
684
- message: 'You:',
685
- validate: input => input.length > 0 || 'Message cannot be empty',
686
- },
687
- ]);
688
- if (message.toLowerCase() === 'exit') {
689
- break;
690
- }
691
- try {
692
- // Use real AI service for chat
693
- const response = await this.aiService.sendMessage(session.id, message, {
694
- projectPath: process.cwd(),
695
- currentGoal: 'Interactive chat session',
696
- });
697
- console.log(chalk_1.default.cyan(`AI: ${response}`));
698
- // Update session history from AI service
699
- session.history = this.aiService.exportChatSession(session.id);
700
- session.updated = new Date();
701
- }
702
- catch (error) {
703
- console.log(chalk_1.default.red(`Error: ${error.message}`));
704
- console.log(chalk_1.default.yellow('\nTip: Try `wundr ai validate` to check your connection'));
705
- }
706
- }
707
- logger_1.logger.success('Chat session ended');
708
- }
709
- displayAnalysisResults(analysis) {
710
- console.log(chalk_1.default.blue('\nCode Analysis Results:'));
711
- console.log(`Complexity: ${analysis.complexity}`);
712
- console.log(`Maintainability: ${analysis.maintainability}`);
713
- if (analysis.suggestions.length > 0) {
714
- console.log('\nSuggestions:');
715
- analysis.suggestions.forEach((suggestion, i) => {
716
- console.log(`${i + 1}. ${suggestion}`);
717
- });
718
- }
719
- }
720
- async runBenchmark(_target) {
721
- // Run performance benchmark
722
- return { time: 100, memory: 50 };
723
- }
724
- async applyOptimization(target, _optimization) {
725
- // Apply optimization changes
726
- logger_1.logger.debug(`Applying optimization to ${target}`);
727
- }
728
- displayBenchmarkComparison(before, after) {
729
- console.log(chalk_1.default.blue('\nBenchmark Comparison:'));
730
- console.log(`Time: ${before.time}ms → ${after.time}ms (${after.time - before.time}ms)`);
731
- console.log(`Memory: ${before.memory}MB → ${after.memory}MB (${after.memory - before.memory}MB)`);
732
- }
733
- }
734
- exports.AICommands = AICommands;
735
- //# sourceMappingURL=ai.js.map