@wundr.io/cli 1.0.10 → 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.
- package/bin/wundr.js +8 -4
- package/package.json +23 -23
- package/src/ai/ai-service.ts +16 -17
- package/src/ai/claude-client.ts +16 -16
- package/src/ai/conversation-manager.ts +29 -29
- package/src/cli.ts +4 -4
- package/src/commands/ai.ts +246 -78
- package/src/commands/alignment.ts +74 -74
- package/src/commands/analyze-optimized.ts +111 -78
- package/src/commands/analyze.ts +14 -14
- package/src/commands/batch.ts +179 -42
- package/src/commands/chat.ts +37 -30
- package/src/commands/claude-init.ts +41 -45
- package/src/commands/claude-setup.ts +204 -119
- package/src/commands/computer-setup.ts +85 -43
- package/src/commands/create-command.ts +4 -4
- package/src/commands/create.ts +27 -27
- package/src/commands/dashboard.ts +24 -24
- package/src/commands/govern.ts +25 -25
- package/src/commands/governance.ts +34 -34
- package/src/commands/guardian.ts +56 -56
- package/src/commands/init.ts +25 -22
- package/src/commands/orchestrator.ts +68 -41
- package/src/commands/performance-optimizer.ts +34 -35
- package/src/commands/plugins.ts +27 -27
- package/src/commands/project-update.ts +175 -72
- package/src/commands/rag.ts +185 -78
- package/src/commands/session.ts +35 -35
- package/src/commands/setup.ts +40 -344
- package/src/commands/test-init.ts +3 -3
- package/src/commands/test.ts +4 -4
- package/src/commands/watch.ts +28 -29
- package/src/commands/worktree.ts +49 -49
- package/src/context/context-manager.ts +10 -10
- package/src/context/session-manager.ts +41 -41
- package/src/framework/command-interface.ts +520 -0
- package/src/framework/command-registry.ts +942 -0
- package/src/framework/completion-exporter.ts +383 -0
- package/src/framework/debug-logger.ts +519 -0
- package/src/framework/error-handler.ts +867 -0
- package/src/framework/help-generator.ts +540 -0
- package/src/framework/index.ts +169 -0
- package/src/framework/interactive-repl.ts +703 -0
- package/src/framework/output-formatter.ts +834 -0
- package/src/framework/progress-manager.ts +539 -0
- package/src/index.ts +4 -4
- package/src/interactive/interactive-mode.ts +16 -16
- package/src/lib/conflict-resolution.ts +799 -9
- package/src/lib/merge-strategy.ts +529 -7
- package/src/lib/safety-mechanisms.ts +422 -18
- package/src/lib/state-detection.ts +1015 -13
- package/src/nlp/command-mapper.ts +29 -29
- package/src/nlp/command-parser.ts +17 -17
- package/src/nlp/intent-classifier.ts +7 -7
- package/src/nlp/intent-parser.ts +54 -52
- package/src/plugins/plugin-manager.ts +61 -39
- package/src/tests/computer-setup-integration.test.ts +46 -15
- package/src/types/modules.d.ts +424 -1
- package/src/utils/backup-rollback-manager.ts +11 -8
- package/src/utils/config-manager.ts +3 -3
- package/src/utils/error-handler.ts +2 -2
- package/src/utils/logger.ts +22 -22
- package/templates/batch/ci-cd.yaml +7 -7
- package/test-suites/api/health.spec.ts +20 -23
- package/test-suites/helpers/test-config.ts +14 -13
- package/test-suites/ui/accessibility.spec.ts +27 -22
- package/test-suites/ui/smoke.spec.ts +26 -21
- package/LICENSE +0 -21
- package/dist/ai/ai-service.d.ts +0 -152
- package/dist/ai/ai-service.d.ts.map +0 -1
- package/dist/ai/ai-service.js +0 -430
- package/dist/ai/ai-service.js.map +0 -1
- package/dist/ai/claude-client.d.ts +0 -130
- package/dist/ai/claude-client.d.ts.map +0 -1
- package/dist/ai/claude-client.js +0 -340
- package/dist/ai/claude-client.js.map +0 -1
- package/dist/ai/conversation-manager.d.ts +0 -164
- package/dist/ai/conversation-manager.d.ts.map +0 -1
- package/dist/ai/conversation-manager.js +0 -614
- package/dist/ai/conversation-manager.js.map +0 -1
- package/dist/ai/index.d.ts +0 -5
- package/dist/ai/index.d.ts.map +0 -1
- package/dist/ai/index.js +0 -8
- package/dist/ai/index.js.map +0 -1
- package/dist/cli.d.ts +0 -36
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -192
- package/dist/cli.js.map +0 -1
- package/dist/commands/ai.d.ts +0 -89
- package/dist/commands/ai.d.ts.map +0 -1
- package/dist/commands/ai.js +0 -799
- package/dist/commands/ai.js.map +0 -1
- package/dist/commands/alignment.d.ts +0 -78
- package/dist/commands/alignment.d.ts.map +0 -1
- package/dist/commands/alignment.js +0 -817
- package/dist/commands/alignment.js.map +0 -1
- package/dist/commands/analyze-optimized.d.ts +0 -14
- package/dist/commands/analyze-optimized.d.ts.map +0 -1
- package/dist/commands/analyze-optimized.js +0 -600
- package/dist/commands/analyze-optimized.js.map +0 -1
- package/dist/commands/analyze.d.ts +0 -65
- package/dist/commands/analyze.d.ts.map +0 -1
- package/dist/commands/analyze.js +0 -435
- package/dist/commands/analyze.js.map +0 -1
- package/dist/commands/batch.d.ts +0 -71
- package/dist/commands/batch.d.ts.map +0 -1
- package/dist/commands/batch.js +0 -738
- package/dist/commands/batch.js.map +0 -1
- package/dist/commands/chat.d.ts +0 -71
- package/dist/commands/chat.d.ts.map +0 -1
- package/dist/commands/chat.js +0 -674
- package/dist/commands/chat.js.map +0 -1
- package/dist/commands/claude-init.d.ts +0 -28
- package/dist/commands/claude-init.d.ts.map +0 -1
- package/dist/commands/claude-init.js +0 -591
- package/dist/commands/claude-init.js.map +0 -1
- package/dist/commands/claude-setup.d.ts +0 -119
- package/dist/commands/claude-setup.d.ts.map +0 -1
- package/dist/commands/claude-setup.js +0 -1073
- package/dist/commands/claude-setup.js.map +0 -1
- package/dist/commands/computer-setup-commands.d.ts +0 -53
- package/dist/commands/computer-setup-commands.d.ts.map +0 -1
- package/dist/commands/computer-setup-commands.js +0 -705
- package/dist/commands/computer-setup-commands.js.map +0 -1
- package/dist/commands/computer-setup.d.ts +0 -7
- package/dist/commands/computer-setup.d.ts.map +0 -1
- package/dist/commands/computer-setup.js +0 -849
- package/dist/commands/computer-setup.js.map +0 -1
- package/dist/commands/create-command.d.ts +0 -7
- package/dist/commands/create-command.d.ts.map +0 -1
- package/dist/commands/create-command.js +0 -158
- package/dist/commands/create-command.js.map +0 -1
- package/dist/commands/create.d.ts +0 -74
- package/dist/commands/create.d.ts.map +0 -1
- package/dist/commands/create.js +0 -556
- package/dist/commands/create.js.map +0 -1
- package/dist/commands/dashboard.d.ts +0 -91
- package/dist/commands/dashboard.d.ts.map +0 -1
- package/dist/commands/dashboard.js +0 -538
- package/dist/commands/dashboard.js.map +0 -1
- package/dist/commands/govern.d.ts +0 -70
- package/dist/commands/govern.d.ts.map +0 -1
- package/dist/commands/govern.js +0 -481
- package/dist/commands/govern.js.map +0 -1
- package/dist/commands/governance.d.ts +0 -17
- package/dist/commands/governance.d.ts.map +0 -1
- package/dist/commands/governance.js +0 -703
- package/dist/commands/governance.js.map +0 -1
- package/dist/commands/guardian.d.ts +0 -20
- package/dist/commands/guardian.d.ts.map +0 -1
- package/dist/commands/guardian.js +0 -597
- package/dist/commands/guardian.js.map +0 -1
- package/dist/commands/init.d.ts +0 -59
- package/dist/commands/init.d.ts.map +0 -1
- package/dist/commands/init.js +0 -650
- package/dist/commands/init.js.map +0 -1
- package/dist/commands/orchestrator.d.ts +0 -7
- package/dist/commands/orchestrator.d.ts.map +0 -1
- package/dist/commands/orchestrator.js +0 -571
- package/dist/commands/orchestrator.js.map +0 -1
- package/dist/commands/performance-optimizer.d.ts +0 -30
- package/dist/commands/performance-optimizer.d.ts.map +0 -1
- package/dist/commands/performance-optimizer.js +0 -650
- package/dist/commands/performance-optimizer.js.map +0 -1
- package/dist/commands/plugins.d.ts +0 -87
- package/dist/commands/plugins.d.ts.map +0 -1
- package/dist/commands/plugins.js +0 -685
- package/dist/commands/plugins.js.map +0 -1
- package/dist/commands/rag.d.ts +0 -7
- package/dist/commands/rag.d.ts.map +0 -1
- package/dist/commands/rag.js +0 -748
- package/dist/commands/rag.js.map +0 -1
- package/dist/commands/session.d.ts +0 -41
- package/dist/commands/session.d.ts.map +0 -1
- package/dist/commands/session.js +0 -441
- package/dist/commands/session.js.map +0 -1
- package/dist/commands/setup.d.ts +0 -29
- package/dist/commands/setup.d.ts.map +0 -1
- package/dist/commands/setup.js +0 -397
- package/dist/commands/setup.js.map +0 -1
- package/dist/commands/test-init.d.ts +0 -9
- package/dist/commands/test-init.d.ts.map +0 -1
- package/dist/commands/test-init.js +0 -222
- package/dist/commands/test-init.js.map +0 -1
- package/dist/commands/test.d.ts +0 -25
- package/dist/commands/test.d.ts.map +0 -1
- package/dist/commands/test.js +0 -217
- package/dist/commands/test.js.map +0 -1
- package/dist/commands/vp.d.ts +0 -7
- package/dist/commands/vp.d.ts.map +0 -1
- package/dist/commands/vp.js +0 -571
- package/dist/commands/vp.js.map +0 -1
- package/dist/commands/watch.d.ts +0 -76
- package/dist/commands/watch.d.ts.map +0 -1
- package/dist/commands/watch.js +0 -613
- package/dist/commands/watch.js.map +0 -1
- package/dist/commands/worktree.d.ts +0 -63
- package/dist/commands/worktree.d.ts.map +0 -1
- package/dist/commands/worktree.js +0 -774
- package/dist/commands/worktree.js.map +0 -1
- package/dist/context/context-manager.d.ts +0 -155
- package/dist/context/context-manager.d.ts.map +0 -1
- package/dist/context/context-manager.js +0 -383
- package/dist/context/context-manager.js.map +0 -1
- package/dist/context/index.d.ts +0 -3
- package/dist/context/index.d.ts.map +0 -1
- package/dist/context/index.js +0 -6
- package/dist/context/index.js.map +0 -1
- package/dist/context/session-manager.d.ts +0 -207
- package/dist/context/session-manager.d.ts.map +0 -1
- package/dist/context/session-manager.js +0 -686
- package/dist/context/session-manager.js.map +0 -1
- package/dist/index.d.ts +0 -8
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -51
- package/dist/index.js.map +0 -1
- package/dist/interactive/interactive-mode.d.ts +0 -76
- package/dist/interactive/interactive-mode.d.ts.map +0 -1
- package/dist/interactive/interactive-mode.js +0 -732
- package/dist/interactive/interactive-mode.js.map +0 -1
- package/dist/nlp/command-mapper.d.ts +0 -174
- package/dist/nlp/command-mapper.d.ts.map +0 -1
- package/dist/nlp/command-mapper.js +0 -624
- package/dist/nlp/command-mapper.js.map +0 -1
- package/dist/nlp/command-parser.d.ts +0 -106
- package/dist/nlp/command-parser.d.ts.map +0 -1
- package/dist/nlp/command-parser.js +0 -417
- package/dist/nlp/command-parser.js.map +0 -1
- package/dist/nlp/index.d.ts +0 -5
- package/dist/nlp/index.d.ts.map +0 -1
- package/dist/nlp/index.js +0 -8
- package/dist/nlp/index.js.map +0 -1
- package/dist/nlp/intent-classifier.d.ts +0 -59
- package/dist/nlp/intent-classifier.d.ts.map +0 -1
- package/dist/nlp/intent-classifier.js +0 -384
- package/dist/nlp/intent-classifier.js.map +0 -1
- package/dist/nlp/intent-parser.d.ts +0 -152
- package/dist/nlp/intent-parser.d.ts.map +0 -1
- package/dist/nlp/intent-parser.js +0 -744
- package/dist/nlp/intent-parser.js.map +0 -1
- package/dist/plugins/plugin-manager.d.ts +0 -120
- package/dist/plugins/plugin-manager.d.ts.map +0 -1
- package/dist/plugins/plugin-manager.js +0 -595
- package/dist/plugins/plugin-manager.js.map +0 -1
- package/dist/types/index.d.ts +0 -224
- package/dist/types/index.d.ts.map +0 -1
- package/dist/types/index.js +0 -3
- package/dist/types/index.js.map +0 -1
- package/dist/utils/backup-rollback-manager.d.ts +0 -72
- package/dist/utils/backup-rollback-manager.d.ts.map +0 -1
- package/dist/utils/backup-rollback-manager.js +0 -289
- package/dist/utils/backup-rollback-manager.js.map +0 -1
- package/dist/utils/claude-config-installer.d.ts +0 -98
- package/dist/utils/claude-config-installer.d.ts.map +0 -1
- package/dist/utils/claude-config-installer.js +0 -678
- package/dist/utils/claude-config-installer.js.map +0 -1
- package/dist/utils/config-manager.d.ts +0 -73
- package/dist/utils/config-manager.d.ts.map +0 -1
- package/dist/utils/config-manager.js +0 -339
- package/dist/utils/config-manager.js.map +0 -1
- package/dist/utils/error-handler.d.ts +0 -46
- package/dist/utils/error-handler.d.ts.map +0 -1
- package/dist/utils/error-handler.js +0 -169
- package/dist/utils/error-handler.js.map +0 -1
- package/dist/utils/logger.d.ts +0 -25
- package/dist/utils/logger.d.ts.map +0 -1
- package/dist/utils/logger.js +0 -105
- package/dist/utils/logger.js.map +0 -1
- package/src/commands/computer-setup-commands.ts +0 -872
package/dist/commands/ai.js
DELETED
|
@@ -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
|