@wundr.io/cli 1.0.11 → 1.0.12

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 (269) hide show
  1. package/bin/wundr.js +8 -4
  2. package/package.json +23 -23
  3. package/src/ai/ai-service.ts +16 -17
  4. package/src/ai/claude-client.ts +16 -16
  5. package/src/ai/conversation-manager.ts +29 -29
  6. package/src/cli.ts +4 -4
  7. package/src/commands/ai.ts +246 -78
  8. package/src/commands/alignment.ts +74 -74
  9. package/src/commands/analyze-optimized.ts +111 -78
  10. package/src/commands/analyze.ts +14 -14
  11. package/src/commands/batch.ts +179 -42
  12. package/src/commands/chat.ts +37 -30
  13. package/src/commands/claude-init.ts +41 -45
  14. package/src/commands/claude-setup.ts +204 -119
  15. package/src/commands/computer-setup.ts +85 -43
  16. package/src/commands/create-command.ts +4 -4
  17. package/src/commands/create.ts +27 -27
  18. package/src/commands/dashboard.ts +24 -24
  19. package/src/commands/govern.ts +25 -25
  20. package/src/commands/governance.ts +34 -34
  21. package/src/commands/guardian.ts +56 -56
  22. package/src/commands/init.ts +25 -22
  23. package/src/commands/orchestrator.ts +68 -41
  24. package/src/commands/performance-optimizer.ts +34 -35
  25. package/src/commands/plugins.ts +27 -27
  26. package/src/commands/project-update.ts +175 -72
  27. package/src/commands/rag.ts +185 -78
  28. package/src/commands/session.ts +35 -35
  29. package/src/commands/setup.ts +40 -344
  30. package/src/commands/test-init.ts +3 -3
  31. package/src/commands/test.ts +4 -4
  32. package/src/commands/watch.ts +28 -29
  33. package/src/commands/worktree.ts +49 -49
  34. package/src/context/context-manager.ts +10 -10
  35. package/src/context/session-manager.ts +41 -41
  36. package/src/framework/command-interface.ts +520 -0
  37. package/src/framework/command-registry.ts +942 -0
  38. package/src/framework/completion-exporter.ts +383 -0
  39. package/src/framework/debug-logger.ts +519 -0
  40. package/src/framework/error-handler.ts +867 -0
  41. package/src/framework/help-generator.ts +540 -0
  42. package/src/framework/index.ts +169 -0
  43. package/src/framework/interactive-repl.ts +703 -0
  44. package/src/framework/output-formatter.ts +834 -0
  45. package/src/framework/progress-manager.ts +539 -0
  46. package/src/index.ts +4 -4
  47. package/src/interactive/interactive-mode.ts +16 -16
  48. package/src/lib/conflict-resolution.ts +799 -9
  49. package/src/lib/merge-strategy.ts +529 -7
  50. package/src/lib/safety-mechanisms.ts +422 -18
  51. package/src/lib/state-detection.ts +1015 -13
  52. package/src/nlp/command-mapper.ts +29 -29
  53. package/src/nlp/command-parser.ts +17 -17
  54. package/src/nlp/intent-classifier.ts +7 -7
  55. package/src/nlp/intent-parser.ts +54 -52
  56. package/src/plugins/plugin-manager.ts +61 -39
  57. package/src/tests/computer-setup-integration.test.ts +46 -15
  58. package/src/types/modules.d.ts +424 -1
  59. package/src/utils/backup-rollback-manager.ts +11 -8
  60. package/src/utils/config-manager.ts +3 -3
  61. package/src/utils/error-handler.ts +2 -2
  62. package/src/utils/logger.ts +22 -22
  63. package/templates/batch/ci-cd.yaml +7 -7
  64. package/test-suites/api/health.spec.ts +20 -23
  65. package/test-suites/helpers/test-config.ts +14 -13
  66. package/test-suites/ui/accessibility.spec.ts +27 -22
  67. package/test-suites/ui/smoke.spec.ts +26 -21
  68. package/LICENSE +0 -21
  69. package/dist/ai/ai-service.d.ts +0 -152
  70. package/dist/ai/ai-service.d.ts.map +0 -1
  71. package/dist/ai/ai-service.js +0 -430
  72. package/dist/ai/ai-service.js.map +0 -1
  73. package/dist/ai/claude-client.d.ts +0 -130
  74. package/dist/ai/claude-client.d.ts.map +0 -1
  75. package/dist/ai/claude-client.js +0 -340
  76. package/dist/ai/claude-client.js.map +0 -1
  77. package/dist/ai/conversation-manager.d.ts +0 -164
  78. package/dist/ai/conversation-manager.d.ts.map +0 -1
  79. package/dist/ai/conversation-manager.js +0 -614
  80. package/dist/ai/conversation-manager.js.map +0 -1
  81. package/dist/ai/index.d.ts +0 -5
  82. package/dist/ai/index.d.ts.map +0 -1
  83. package/dist/ai/index.js +0 -8
  84. package/dist/ai/index.js.map +0 -1
  85. package/dist/cli.d.ts +0 -36
  86. package/dist/cli.d.ts.map +0 -1
  87. package/dist/cli.js +0 -192
  88. package/dist/cli.js.map +0 -1
  89. package/dist/commands/ai.d.ts +0 -89
  90. package/dist/commands/ai.d.ts.map +0 -1
  91. package/dist/commands/ai.js +0 -799
  92. package/dist/commands/ai.js.map +0 -1
  93. package/dist/commands/alignment.d.ts +0 -78
  94. package/dist/commands/alignment.d.ts.map +0 -1
  95. package/dist/commands/alignment.js +0 -817
  96. package/dist/commands/alignment.js.map +0 -1
  97. package/dist/commands/analyze-optimized.d.ts +0 -14
  98. package/dist/commands/analyze-optimized.d.ts.map +0 -1
  99. package/dist/commands/analyze-optimized.js +0 -600
  100. package/dist/commands/analyze-optimized.js.map +0 -1
  101. package/dist/commands/analyze.d.ts +0 -65
  102. package/dist/commands/analyze.d.ts.map +0 -1
  103. package/dist/commands/analyze.js +0 -435
  104. package/dist/commands/analyze.js.map +0 -1
  105. package/dist/commands/batch.d.ts +0 -71
  106. package/dist/commands/batch.d.ts.map +0 -1
  107. package/dist/commands/batch.js +0 -738
  108. package/dist/commands/batch.js.map +0 -1
  109. package/dist/commands/chat.d.ts +0 -71
  110. package/dist/commands/chat.d.ts.map +0 -1
  111. package/dist/commands/chat.js +0 -674
  112. package/dist/commands/chat.js.map +0 -1
  113. package/dist/commands/claude-init.d.ts +0 -28
  114. package/dist/commands/claude-init.d.ts.map +0 -1
  115. package/dist/commands/claude-init.js +0 -591
  116. package/dist/commands/claude-init.js.map +0 -1
  117. package/dist/commands/claude-setup.d.ts +0 -119
  118. package/dist/commands/claude-setup.d.ts.map +0 -1
  119. package/dist/commands/claude-setup.js +0 -1073
  120. package/dist/commands/claude-setup.js.map +0 -1
  121. package/dist/commands/computer-setup-commands.d.ts +0 -53
  122. package/dist/commands/computer-setup-commands.d.ts.map +0 -1
  123. package/dist/commands/computer-setup-commands.js +0 -705
  124. package/dist/commands/computer-setup-commands.js.map +0 -1
  125. package/dist/commands/computer-setup.d.ts +0 -7
  126. package/dist/commands/computer-setup.d.ts.map +0 -1
  127. package/dist/commands/computer-setup.js +0 -849
  128. package/dist/commands/computer-setup.js.map +0 -1
  129. package/dist/commands/create-command.d.ts +0 -7
  130. package/dist/commands/create-command.d.ts.map +0 -1
  131. package/dist/commands/create-command.js +0 -158
  132. package/dist/commands/create-command.js.map +0 -1
  133. package/dist/commands/create.d.ts +0 -74
  134. package/dist/commands/create.d.ts.map +0 -1
  135. package/dist/commands/create.js +0 -556
  136. package/dist/commands/create.js.map +0 -1
  137. package/dist/commands/dashboard.d.ts +0 -91
  138. package/dist/commands/dashboard.d.ts.map +0 -1
  139. package/dist/commands/dashboard.js +0 -538
  140. package/dist/commands/dashboard.js.map +0 -1
  141. package/dist/commands/govern.d.ts +0 -70
  142. package/dist/commands/govern.d.ts.map +0 -1
  143. package/dist/commands/govern.js +0 -481
  144. package/dist/commands/govern.js.map +0 -1
  145. package/dist/commands/governance.d.ts +0 -17
  146. package/dist/commands/governance.d.ts.map +0 -1
  147. package/dist/commands/governance.js +0 -703
  148. package/dist/commands/governance.js.map +0 -1
  149. package/dist/commands/guardian.d.ts +0 -20
  150. package/dist/commands/guardian.d.ts.map +0 -1
  151. package/dist/commands/guardian.js +0 -597
  152. package/dist/commands/guardian.js.map +0 -1
  153. package/dist/commands/init.d.ts +0 -59
  154. package/dist/commands/init.d.ts.map +0 -1
  155. package/dist/commands/init.js +0 -650
  156. package/dist/commands/init.js.map +0 -1
  157. package/dist/commands/orchestrator.d.ts +0 -7
  158. package/dist/commands/orchestrator.d.ts.map +0 -1
  159. package/dist/commands/orchestrator.js +0 -571
  160. package/dist/commands/orchestrator.js.map +0 -1
  161. package/dist/commands/performance-optimizer.d.ts +0 -30
  162. package/dist/commands/performance-optimizer.d.ts.map +0 -1
  163. package/dist/commands/performance-optimizer.js +0 -650
  164. package/dist/commands/performance-optimizer.js.map +0 -1
  165. package/dist/commands/plugins.d.ts +0 -87
  166. package/dist/commands/plugins.d.ts.map +0 -1
  167. package/dist/commands/plugins.js +0 -685
  168. package/dist/commands/plugins.js.map +0 -1
  169. package/dist/commands/rag.d.ts +0 -7
  170. package/dist/commands/rag.d.ts.map +0 -1
  171. package/dist/commands/rag.js +0 -748
  172. package/dist/commands/rag.js.map +0 -1
  173. package/dist/commands/session.d.ts +0 -41
  174. package/dist/commands/session.d.ts.map +0 -1
  175. package/dist/commands/session.js +0 -441
  176. package/dist/commands/session.js.map +0 -1
  177. package/dist/commands/setup.d.ts +0 -29
  178. package/dist/commands/setup.d.ts.map +0 -1
  179. package/dist/commands/setup.js +0 -397
  180. package/dist/commands/setup.js.map +0 -1
  181. package/dist/commands/test-init.d.ts +0 -9
  182. package/dist/commands/test-init.d.ts.map +0 -1
  183. package/dist/commands/test-init.js +0 -222
  184. package/dist/commands/test-init.js.map +0 -1
  185. package/dist/commands/test.d.ts +0 -25
  186. package/dist/commands/test.d.ts.map +0 -1
  187. package/dist/commands/test.js +0 -217
  188. package/dist/commands/test.js.map +0 -1
  189. package/dist/commands/vp.d.ts +0 -7
  190. package/dist/commands/vp.d.ts.map +0 -1
  191. package/dist/commands/vp.js +0 -571
  192. package/dist/commands/vp.js.map +0 -1
  193. package/dist/commands/watch.d.ts +0 -76
  194. package/dist/commands/watch.d.ts.map +0 -1
  195. package/dist/commands/watch.js +0 -613
  196. package/dist/commands/watch.js.map +0 -1
  197. package/dist/commands/worktree.d.ts +0 -63
  198. package/dist/commands/worktree.d.ts.map +0 -1
  199. package/dist/commands/worktree.js +0 -774
  200. package/dist/commands/worktree.js.map +0 -1
  201. package/dist/context/context-manager.d.ts +0 -155
  202. package/dist/context/context-manager.d.ts.map +0 -1
  203. package/dist/context/context-manager.js +0 -383
  204. package/dist/context/context-manager.js.map +0 -1
  205. package/dist/context/index.d.ts +0 -3
  206. package/dist/context/index.d.ts.map +0 -1
  207. package/dist/context/index.js +0 -6
  208. package/dist/context/index.js.map +0 -1
  209. package/dist/context/session-manager.d.ts +0 -207
  210. package/dist/context/session-manager.d.ts.map +0 -1
  211. package/dist/context/session-manager.js +0 -686
  212. package/dist/context/session-manager.js.map +0 -1
  213. package/dist/index.d.ts +0 -8
  214. package/dist/index.d.ts.map +0 -1
  215. package/dist/index.js +0 -51
  216. package/dist/index.js.map +0 -1
  217. package/dist/interactive/interactive-mode.d.ts +0 -76
  218. package/dist/interactive/interactive-mode.d.ts.map +0 -1
  219. package/dist/interactive/interactive-mode.js +0 -732
  220. package/dist/interactive/interactive-mode.js.map +0 -1
  221. package/dist/nlp/command-mapper.d.ts +0 -174
  222. package/dist/nlp/command-mapper.d.ts.map +0 -1
  223. package/dist/nlp/command-mapper.js +0 -624
  224. package/dist/nlp/command-mapper.js.map +0 -1
  225. package/dist/nlp/command-parser.d.ts +0 -106
  226. package/dist/nlp/command-parser.d.ts.map +0 -1
  227. package/dist/nlp/command-parser.js +0 -417
  228. package/dist/nlp/command-parser.js.map +0 -1
  229. package/dist/nlp/index.d.ts +0 -5
  230. package/dist/nlp/index.d.ts.map +0 -1
  231. package/dist/nlp/index.js +0 -8
  232. package/dist/nlp/index.js.map +0 -1
  233. package/dist/nlp/intent-classifier.d.ts +0 -59
  234. package/dist/nlp/intent-classifier.d.ts.map +0 -1
  235. package/dist/nlp/intent-classifier.js +0 -384
  236. package/dist/nlp/intent-classifier.js.map +0 -1
  237. package/dist/nlp/intent-parser.d.ts +0 -152
  238. package/dist/nlp/intent-parser.d.ts.map +0 -1
  239. package/dist/nlp/intent-parser.js +0 -744
  240. package/dist/nlp/intent-parser.js.map +0 -1
  241. package/dist/plugins/plugin-manager.d.ts +0 -120
  242. package/dist/plugins/plugin-manager.d.ts.map +0 -1
  243. package/dist/plugins/plugin-manager.js +0 -595
  244. package/dist/plugins/plugin-manager.js.map +0 -1
  245. package/dist/types/index.d.ts +0 -224
  246. package/dist/types/index.d.ts.map +0 -1
  247. package/dist/types/index.js +0 -3
  248. package/dist/types/index.js.map +0 -1
  249. package/dist/utils/backup-rollback-manager.d.ts +0 -72
  250. package/dist/utils/backup-rollback-manager.d.ts.map +0 -1
  251. package/dist/utils/backup-rollback-manager.js +0 -289
  252. package/dist/utils/backup-rollback-manager.js.map +0 -1
  253. package/dist/utils/claude-config-installer.d.ts +0 -98
  254. package/dist/utils/claude-config-installer.d.ts.map +0 -1
  255. package/dist/utils/claude-config-installer.js +0 -678
  256. package/dist/utils/claude-config-installer.js.map +0 -1
  257. package/dist/utils/config-manager.d.ts +0 -73
  258. package/dist/utils/config-manager.d.ts.map +0 -1
  259. package/dist/utils/config-manager.js +0 -339
  260. package/dist/utils/config-manager.js.map +0 -1
  261. package/dist/utils/error-handler.d.ts +0 -46
  262. package/dist/utils/error-handler.d.ts.map +0 -1
  263. package/dist/utils/error-handler.js +0 -169
  264. package/dist/utils/error-handler.js.map +0 -1
  265. package/dist/utils/logger.d.ts +0 -25
  266. package/dist/utils/logger.d.ts.map +0 -1
  267. package/dist/utils/logger.js +0 -105
  268. package/dist/utils/logger.js.map +0 -1
  269. package/src/commands/computer-setup-commands.ts +0 -872
@@ -1,799 +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 chalk_1 = tslib_1.__importDefault(require("chalk"));
6
- const inquirer_1 = tslib_1.__importDefault(require("inquirer"));
7
- const ai_service_1 = require("../ai/ai-service");
8
- const error_handler_1 = require("../utils/error-handler");
9
- const logger_1 = require("../utils/logger");
10
- /**
11
- * AI commands for AI-powered development features
12
- */
13
- class AICommands {
14
- program;
15
- configManager;
16
- aiService;
17
- pluginManager;
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;
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 && beforeBenchmark) {
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
- const fs = await Promise.resolve().then(() => tslib_1.__importStar(require('fs/promises')));
614
- const path = await Promise.resolve().then(() => tslib_1.__importStar(require('path')));
615
- // Ensure directory exists
616
- const dir = path.dirname(outputPath);
617
- await fs.mkdir(dir, { recursive: true });
618
- // Write the generated code to file
619
- await fs.writeFile(outputPath, code, 'utf-8');
620
- logger_1.logger.debug(`Saved generated code to ${outputPath}`);
621
- }
622
- async readFile(filePath) {
623
- // Read file content
624
- return `// Content of ${filePath}`;
625
- }
626
- async getChangedFiles() {
627
- // Get list of changed files from git
628
- return ['src/example.ts'];
629
- }
630
- displayReviewResults(results) {
631
- console.log(chalk_1.default.blue('\nCode Review Results:'));
632
- results.forEach(result => {
633
- console.log(`\n${chalk_1.default.cyan(result.file)} (Score: ${result.score}/100)`);
634
- if (result.issues.length > 0) {
635
- result.issues.forEach((issue) => {
636
- console.log(` ${issue.severity}: ${issue.description}`);
637
- });
638
- }
639
- });
640
- }
641
- async suggestFixes(results) {
642
- logger_1.logger.info('Generating fix suggestions...');
643
- for (const result of results) {
644
- if (result.issues.length > 0) {
645
- console.log(chalk_1.default.yellow(`\nSuggested fixes for ${result.file}:`));
646
- for (const issue of result.issues) {
647
- const fix = await this.callAI('suggest-fix', {
648
- file: result.file,
649
- issue: issue.description,
650
- severity: issue.severity,
651
- });
652
- console.log(` - ${issue.description}: ${fix.suggestion || 'No automatic fix available'}`);
653
- }
654
- }
655
- }
656
- }
657
- async applyRefactoring(target, plan) {
658
- const fs = await Promise.resolve().then(() => tslib_1.__importStar(require('fs/promises')));
659
- logger_1.logger.debug(`Applying refactoring to ${target}`);
660
- logger_1.logger.info(`Refactoring: ${plan.description}`);
661
- // Apply each change from the refactoring plan
662
- for (const change of plan.changes) {
663
- logger_1.logger.debug(` Applying: ${change.description}`);
664
- if (change.code) {
665
- await fs.writeFile(target, change.code, 'utf-8');
666
- }
667
- }
668
- }
669
- getDocsOutputPath(target, type, format) {
670
- const ext = format === 'markdown' ? 'md' : format;
671
- return `docs/${target}.${type}.${ext}`;
672
- }
673
- async saveGeneratedDocs(docs, outputPath) {
674
- const fs = await Promise.resolve().then(() => tslib_1.__importStar(require('fs/promises')));
675
- const path = await Promise.resolve().then(() => tslib_1.__importStar(require('path')));
676
- // Ensure docs directory exists
677
- const dir = path.dirname(outputPath);
678
- await fs.mkdir(dir, { recursive: true });
679
- // Write the generated documentation to file
680
- await fs.writeFile(outputPath, docs, 'utf-8');
681
- logger_1.logger.debug(`Saved documentation to ${outputPath}`);
682
- }
683
- getTestOutputPath(target, framework) {
684
- const path = require('path');
685
- const baseName = path.basename(target, path.extname(target));
686
- const dirName = path.dirname(target);
687
- // Use framework-specific test file extensions
688
- const extension = framework === 'vitest' ? '.test.ts' : '.test.js';
689
- return path.join(dirName, '__tests__', `${baseName}${extension}`);
690
- }
691
- async loadChatSession(sessionId) {
692
- // Load existing chat session
693
- return {
694
- id: sessionId,
695
- model: 'claude-3',
696
- history: [],
697
- created: new Date(),
698
- updated: new Date(),
699
- };
700
- }
701
- async createChatSession(options) {
702
- return {
703
- id: `session-${Date.now()}`,
704
- model: options.model || 'claude-3',
705
- context: options.context,
706
- history: [],
707
- created: new Date(),
708
- updated: new Date(),
709
- };
710
- }
711
- async runChatLoop(session) {
712
- console.log(chalk_1.default.green(`\nAI Chat Session (${session.model})`));
713
- console.log(chalk_1.default.gray('Type "exit" to end the session\n'));
714
- // Load existing session into AI service
715
- this.aiService.loadChatSession(session);
716
- while (true) {
717
- const { message } = await inquirer_1.default.prompt([
718
- {
719
- type: 'input',
720
- name: 'message',
721
- message: 'You:',
722
- validate: input => input.length > 0 || 'Message cannot be empty',
723
- },
724
- ]);
725
- if (message.toLowerCase() === 'exit') {
726
- break;
727
- }
728
- try {
729
- // Use real AI service for chat
730
- const response = await this.aiService.sendMessage(session.id, message, {
731
- projectPath: process.cwd(),
732
- currentGoal: 'Interactive chat session',
733
- });
734
- console.log(chalk_1.default.cyan(`AI: ${response}`));
735
- // Update session history from AI service
736
- session.history = this.aiService.exportChatSession(session.id);
737
- session.updated = new Date();
738
- }
739
- catch (error) {
740
- console.log(chalk_1.default.red(`Error: ${error.message}`));
741
- console.log(chalk_1.default.yellow('\nTip: Try `wundr ai validate` to check your connection'));
742
- }
743
- }
744
- logger_1.logger.success('Chat session ended');
745
- }
746
- displayAnalysisResults(analysis) {
747
- console.log(chalk_1.default.blue('\nCode Analysis Results:'));
748
- console.log(`Complexity: ${analysis.complexity}`);
749
- console.log(`Maintainability: ${analysis.maintainability}`);
750
- if (analysis.suggestions.length > 0) {
751
- console.log('\nSuggestions:');
752
- analysis.suggestions.forEach((suggestion, i) => {
753
- console.log(`${i + 1}. ${suggestion}`);
754
- });
755
- }
756
- }
757
- async runBenchmark(target) {
758
- const { performance } = await Promise.resolve().then(() => tslib_1.__importStar(require('perf_hooks')));
759
- logger_1.logger.debug(`Running benchmark for ${target}`);
760
- const startTime = performance.now();
761
- const startMemory = process.memoryUsage().heapUsed / 1024 / 1024;
762
- // Simulate loading and analyzing the file for benchmarking
763
- const code = await this.readFile(target);
764
- // Simple analysis to measure time
765
- const lines = code.split('\n').length;
766
- logger_1.logger.debug(`Analyzed ${lines} lines`);
767
- const endTime = performance.now();
768
- const endMemory = process.memoryUsage().heapUsed / 1024 / 1024;
769
- return {
770
- time: Math.round(endTime - startTime),
771
- memory: Math.round(endMemory - startMemory),
772
- };
773
- }
774
- async applyOptimization(target, optimization) {
775
- const fs = await Promise.resolve().then(() => tslib_1.__importStar(require('fs/promises')));
776
- logger_1.logger.debug(`Applying optimization to ${target}`);
777
- logger_1.logger.info(`Optimization: ${optimization.description}`);
778
- // Log each change being applied
779
- for (const change of optimization.changes) {
780
- logger_1.logger.debug(` Applying: ${change.description}`);
781
- }
782
- // Write the optimized code to the file
783
- if (optimization.optimizedCode) {
784
- await fs.writeFile(target, optimization.optimizedCode, 'utf-8');
785
- logger_1.logger.success(`Optimization applied to ${target}`);
786
- }
787
- }
788
- displayBenchmarkComparison(before, after) {
789
- console.log(chalk_1.default.blue('\nBenchmark Comparison:'));
790
- const timeDiff = after.time - before.time;
791
- const memDiff = after.memory - before.memory;
792
- const timeColor = timeDiff < 0 ? chalk_1.default.green : chalk_1.default.yellow;
793
- const memColor = memDiff < 0 ? chalk_1.default.green : chalk_1.default.yellow;
794
- console.log(`Time: ${before.time}ms → ${after.time}ms (${timeColor(timeDiff > 0 ? '+' : '')}${timeColor(timeDiff + 'ms')})`);
795
- console.log(`Memory: ${before.memory}MB → ${after.memory}MB (${memColor(memDiff > 0 ? '+' : '')}${memColor(memDiff + 'MB')})`);
796
- }
797
- }
798
- exports.AICommands = AICommands;
799
- //# sourceMappingURL=ai.js.map