@wundr.io/cli 1.0.0

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 (213) hide show
  1. package/README.md +551 -0
  2. package/bin/wundr.js +39 -0
  3. package/dist/ai/ai-service.d.ts +152 -0
  4. package/dist/ai/ai-service.d.ts.map +1 -0
  5. package/dist/ai/ai-service.js +430 -0
  6. package/dist/ai/ai-service.js.map +1 -0
  7. package/dist/ai/claude-client.d.ts +130 -0
  8. package/dist/ai/claude-client.d.ts.map +1 -0
  9. package/dist/ai/claude-client.js +339 -0
  10. package/dist/ai/claude-client.js.map +1 -0
  11. package/dist/ai/conversation-manager.d.ts +164 -0
  12. package/dist/ai/conversation-manager.d.ts.map +1 -0
  13. package/dist/ai/conversation-manager.js +612 -0
  14. package/dist/ai/conversation-manager.js.map +1 -0
  15. package/dist/ai/index.d.ts +5 -0
  16. package/dist/ai/index.d.ts.map +1 -0
  17. package/dist/ai/index.js +8 -0
  18. package/dist/ai/index.js.map +1 -0
  19. package/dist/cli.d.ts +36 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +173 -0
  22. package/dist/cli.js.map +1 -0
  23. package/dist/commands/ai.d.ts +89 -0
  24. package/dist/commands/ai.d.ts.map +1 -0
  25. package/dist/commands/ai.js +735 -0
  26. package/dist/commands/ai.js.map +1 -0
  27. package/dist/commands/analyze-optimized.d.ts +14 -0
  28. package/dist/commands/analyze-optimized.d.ts.map +1 -0
  29. package/dist/commands/analyze-optimized.js +437 -0
  30. package/dist/commands/analyze-optimized.js.map +1 -0
  31. package/dist/commands/analyze.d.ts +65 -0
  32. package/dist/commands/analyze.d.ts.map +1 -0
  33. package/dist/commands/analyze.js +435 -0
  34. package/dist/commands/analyze.js.map +1 -0
  35. package/dist/commands/batch.d.ts +71 -0
  36. package/dist/commands/batch.d.ts.map +1 -0
  37. package/dist/commands/batch.js +738 -0
  38. package/dist/commands/batch.js.map +1 -0
  39. package/dist/commands/chat.d.ts +71 -0
  40. package/dist/commands/chat.d.ts.map +1 -0
  41. package/dist/commands/chat.js +674 -0
  42. package/dist/commands/chat.js.map +1 -0
  43. package/dist/commands/claude-init.d.ts +28 -0
  44. package/dist/commands/claude-init.d.ts.map +1 -0
  45. package/dist/commands/claude-init.js +587 -0
  46. package/dist/commands/claude-init.js.map +1 -0
  47. package/dist/commands/claude-setup.d.ts +32 -0
  48. package/dist/commands/claude-setup.d.ts.map +1 -0
  49. package/dist/commands/claude-setup.js +570 -0
  50. package/dist/commands/claude-setup.js.map +1 -0
  51. package/dist/commands/computer-setup-commands.d.ts +39 -0
  52. package/dist/commands/computer-setup-commands.d.ts.map +1 -0
  53. package/dist/commands/computer-setup-commands.js +563 -0
  54. package/dist/commands/computer-setup-commands.js.map +1 -0
  55. package/dist/commands/computer-setup.d.ts +7 -0
  56. package/dist/commands/computer-setup.d.ts.map +1 -0
  57. package/dist/commands/computer-setup.js +481 -0
  58. package/dist/commands/computer-setup.js.map +1 -0
  59. package/dist/commands/create-command.d.ts +7 -0
  60. package/dist/commands/create-command.d.ts.map +1 -0
  61. package/dist/commands/create-command.js +158 -0
  62. package/dist/commands/create-command.js.map +1 -0
  63. package/dist/commands/create.d.ts +74 -0
  64. package/dist/commands/create.d.ts.map +1 -0
  65. package/dist/commands/create.js +556 -0
  66. package/dist/commands/create.js.map +1 -0
  67. package/dist/commands/dashboard.d.ts +91 -0
  68. package/dist/commands/dashboard.d.ts.map +1 -0
  69. package/dist/commands/dashboard.js +537 -0
  70. package/dist/commands/dashboard.js.map +1 -0
  71. package/dist/commands/govern.d.ts +70 -0
  72. package/dist/commands/govern.d.ts.map +1 -0
  73. package/dist/commands/govern.js +480 -0
  74. package/dist/commands/govern.js.map +1 -0
  75. package/dist/commands/init.d.ts +55 -0
  76. package/dist/commands/init.d.ts.map +1 -0
  77. package/dist/commands/init.js +584 -0
  78. package/dist/commands/init.js.map +1 -0
  79. package/dist/commands/performance-optimizer.d.ts +30 -0
  80. package/dist/commands/performance-optimizer.d.ts.map +1 -0
  81. package/dist/commands/performance-optimizer.js +649 -0
  82. package/dist/commands/performance-optimizer.js.map +1 -0
  83. package/dist/commands/plugins.d.ts +87 -0
  84. package/dist/commands/plugins.d.ts.map +1 -0
  85. package/dist/commands/plugins.js +685 -0
  86. package/dist/commands/plugins.js.map +1 -0
  87. package/dist/commands/setup.d.ts +29 -0
  88. package/dist/commands/setup.d.ts.map +1 -0
  89. package/dist/commands/setup.js +399 -0
  90. package/dist/commands/setup.js.map +1 -0
  91. package/dist/commands/test-init.d.ts +9 -0
  92. package/dist/commands/test-init.d.ts.map +1 -0
  93. package/dist/commands/test-init.js +222 -0
  94. package/dist/commands/test-init.js.map +1 -0
  95. package/dist/commands/test.d.ts +25 -0
  96. package/dist/commands/test.d.ts.map +1 -0
  97. package/dist/commands/test.js +217 -0
  98. package/dist/commands/test.js.map +1 -0
  99. package/dist/commands/watch.d.ts +76 -0
  100. package/dist/commands/watch.d.ts.map +1 -0
  101. package/dist/commands/watch.js +610 -0
  102. package/dist/commands/watch.js.map +1 -0
  103. package/dist/context/context-manager.d.ts +155 -0
  104. package/dist/context/context-manager.d.ts.map +1 -0
  105. package/dist/context/context-manager.js +383 -0
  106. package/dist/context/context-manager.js.map +1 -0
  107. package/dist/context/index.d.ts +3 -0
  108. package/dist/context/index.d.ts.map +1 -0
  109. package/dist/context/index.js +6 -0
  110. package/dist/context/index.js.map +1 -0
  111. package/dist/context/session-manager.d.ts +207 -0
  112. package/dist/context/session-manager.d.ts.map +1 -0
  113. package/dist/context/session-manager.js +682 -0
  114. package/dist/context/session-manager.js.map +1 -0
  115. package/dist/index.d.ts +8 -0
  116. package/dist/index.d.ts.map +1 -0
  117. package/dist/index.js +51 -0
  118. package/dist/index.js.map +1 -0
  119. package/dist/interactive/interactive-mode.d.ts +76 -0
  120. package/dist/interactive/interactive-mode.d.ts.map +1 -0
  121. package/dist/interactive/interactive-mode.js +730 -0
  122. package/dist/interactive/interactive-mode.js.map +1 -0
  123. package/dist/nlp/command-mapper.d.ts +174 -0
  124. package/dist/nlp/command-mapper.d.ts.map +1 -0
  125. package/dist/nlp/command-mapper.js +623 -0
  126. package/dist/nlp/command-mapper.js.map +1 -0
  127. package/dist/nlp/command-parser.d.ts +106 -0
  128. package/dist/nlp/command-parser.d.ts.map +1 -0
  129. package/dist/nlp/command-parser.js +416 -0
  130. package/dist/nlp/command-parser.js.map +1 -0
  131. package/dist/nlp/index.d.ts +5 -0
  132. package/dist/nlp/index.d.ts.map +1 -0
  133. package/dist/nlp/index.js +8 -0
  134. package/dist/nlp/index.js.map +1 -0
  135. package/dist/nlp/intent-classifier.d.ts +59 -0
  136. package/dist/nlp/intent-classifier.d.ts.map +1 -0
  137. package/dist/nlp/intent-classifier.js +384 -0
  138. package/dist/nlp/intent-classifier.js.map +1 -0
  139. package/dist/nlp/intent-parser.d.ts +152 -0
  140. package/dist/nlp/intent-parser.d.ts.map +1 -0
  141. package/dist/nlp/intent-parser.js +739 -0
  142. package/dist/nlp/intent-parser.js.map +1 -0
  143. package/dist/plugins/plugin-manager.d.ts +120 -0
  144. package/dist/plugins/plugin-manager.d.ts.map +1 -0
  145. package/dist/plugins/plugin-manager.js +595 -0
  146. package/dist/plugins/plugin-manager.js.map +1 -0
  147. package/dist/types/index.d.ts +224 -0
  148. package/dist/types/index.d.ts.map +1 -0
  149. package/dist/types/index.js +3 -0
  150. package/dist/types/index.js.map +1 -0
  151. package/dist/utils/config-manager.d.ts +73 -0
  152. package/dist/utils/config-manager.d.ts.map +1 -0
  153. package/dist/utils/config-manager.js +339 -0
  154. package/dist/utils/config-manager.js.map +1 -0
  155. package/dist/utils/error-handler.d.ts +46 -0
  156. package/dist/utils/error-handler.d.ts.map +1 -0
  157. package/dist/utils/error-handler.js +169 -0
  158. package/dist/utils/error-handler.js.map +1 -0
  159. package/dist/utils/logger.d.ts +25 -0
  160. package/dist/utils/logger.d.ts.map +1 -0
  161. package/dist/utils/logger.js +94 -0
  162. package/dist/utils/logger.js.map +1 -0
  163. package/package.json +119 -0
  164. package/src/ai/ai-service.ts +595 -0
  165. package/src/ai/claude-client.ts +490 -0
  166. package/src/ai/conversation-manager.ts +907 -0
  167. package/src/ai/index.ts +8 -0
  168. package/src/cli.ts +202 -0
  169. package/src/commands/ai.ts +995 -0
  170. package/src/commands/analyze-optimized.ts +641 -0
  171. package/src/commands/analyze.ts +576 -0
  172. package/src/commands/batch.ts +935 -0
  173. package/src/commands/chat.ts +876 -0
  174. package/src/commands/claude-init.ts +715 -0
  175. package/src/commands/claude-setup.ts +697 -0
  176. package/src/commands/computer-setup-commands.ts +709 -0
  177. package/src/commands/computer-setup.ts +565 -0
  178. package/src/commands/create-command.ts +175 -0
  179. package/src/commands/create.ts +727 -0
  180. package/src/commands/dashboard.ts +691 -0
  181. package/src/commands/govern.ts +635 -0
  182. package/src/commands/init.ts +677 -0
  183. package/src/commands/performance-optimizer.ts +864 -0
  184. package/src/commands/plugins.ts +848 -0
  185. package/src/commands/setup.ts +508 -0
  186. package/src/commands/test-init.ts +242 -0
  187. package/src/commands/test.ts +264 -0
  188. package/src/commands/watch.ts +755 -0
  189. package/src/context/context-manager.ts +546 -0
  190. package/src/context/index.ts +9 -0
  191. package/src/context/session-manager.ts +1019 -0
  192. package/src/index.ts +64 -0
  193. package/src/interactive/interactive-mode.ts +830 -0
  194. package/src/nlp/command-mapper.ts +885 -0
  195. package/src/nlp/command-parser.ts +564 -0
  196. package/src/nlp/index.ts +4 -0
  197. package/src/nlp/intent-classifier.ts +458 -0
  198. package/src/nlp/intent-parser.ts +1101 -0
  199. package/src/plugins/plugin-manager.ts +744 -0
  200. package/src/types/index.ts +252 -0
  201. package/src/types/modules.d.ts +56 -0
  202. package/src/utils/config-manager.ts +391 -0
  203. package/src/utils/error-handler.ts +192 -0
  204. package/src/utils/logger.ts +104 -0
  205. package/templates/batch/ci-cd.yaml +62 -0
  206. package/templates/component/{{fileName}}.test.tsx +17 -0
  207. package/templates/component/{{fileName}}.tsx +21 -0
  208. package/templates/service/{{fileName}}.ts +98 -0
  209. package/templates/wundr-test.config.js +0 -0
  210. package/test-suites/api/health.spec.ts +134 -0
  211. package/test-suites/helpers/test-config.ts +84 -0
  212. package/test-suites/ui/accessibility.spec.ts +102 -0
  213. package/test-suites/ui/smoke.spec.ts +92 -0
@@ -0,0 +1,224 @@
1
+ import { Command } from 'commander';
2
+ /**
3
+ * Core types for the Wundr CLI
4
+ */
5
+ export interface WundrConfig {
6
+ version: string;
7
+ defaultMode: 'cli' | 'interactive' | 'chat' | 'tui';
8
+ plugins: string[];
9
+ integrations: {
10
+ github?: GitHubIntegration;
11
+ slack?: SlackIntegration;
12
+ jira?: JiraIntegration;
13
+ };
14
+ ai: {
15
+ provider: string;
16
+ model: string;
17
+ apiKey?: string;
18
+ };
19
+ analysis: {
20
+ patterns: string[];
21
+ excludes: string[];
22
+ maxDepth: number;
23
+ };
24
+ governance: {
25
+ rules: string[];
26
+ severity: 'error' | 'warning' | 'info';
27
+ };
28
+ }
29
+ export interface GitHubIntegration {
30
+ token: string;
31
+ owner: string;
32
+ repo: string;
33
+ webhooks?: boolean;
34
+ }
35
+ export interface SlackIntegration {
36
+ token: string;
37
+ channel: string;
38
+ webhooks?: boolean;
39
+ }
40
+ export interface JiraIntegration {
41
+ url: string;
42
+ email: string;
43
+ token: string;
44
+ }
45
+ export interface CommandContext {
46
+ config: WundrConfig;
47
+ logger: Logger;
48
+ spinner: Spinner;
49
+ interactive: boolean;
50
+ dryRun: boolean;
51
+ }
52
+ export interface Logger {
53
+ debug(message: string, ...args: any[]): void;
54
+ info(message: string, ...args: any[]): void;
55
+ warn(message: string, ...args: any[]): void;
56
+ error(message: string, ...args: any[]): void;
57
+ success(message: string, ...args: any[]): void;
58
+ setLevel(level: 'debug' | 'info' | 'warn' | 'error'): void;
59
+ }
60
+ export interface Spinner {
61
+ start(text?: string): void;
62
+ succeed(text?: string): void;
63
+ fail(text?: string): void;
64
+ warn(text?: string): void;
65
+ info(text?: string): void;
66
+ stop(): void;
67
+ text: string;
68
+ }
69
+ export interface Plugin {
70
+ name: string;
71
+ version: string;
72
+ description: string;
73
+ commands?: PluginCommand[];
74
+ hooks?: PluginHook[];
75
+ activate(context: PluginContext): Promise<void>;
76
+ deactivate(): Promise<void>;
77
+ }
78
+ export interface PluginCommand {
79
+ name: string;
80
+ description: string;
81
+ options?: CommandOption[];
82
+ action: (args: any[], options: any, context: CommandContext) => Promise<void>;
83
+ }
84
+ export interface PluginHook {
85
+ event: string;
86
+ handler: (data: any, context: CommandContext) => Promise<void>;
87
+ }
88
+ export interface CommandOption {
89
+ flags: string;
90
+ description: string;
91
+ defaultValue?: any;
92
+ }
93
+ export interface PluginContext {
94
+ config: WundrConfig;
95
+ logger: Logger;
96
+ registerCommand(command: PluginCommand): void;
97
+ registerHook(hook: PluginHook): void;
98
+ }
99
+ export interface BatchJob {
100
+ name: string;
101
+ description?: string;
102
+ commands: BatchCommand[];
103
+ parallel?: boolean;
104
+ continueOnError?: boolean;
105
+ timeout?: number;
106
+ }
107
+ export interface BatchCommand {
108
+ command: string;
109
+ args?: string[];
110
+ options?: Record<string, any>;
111
+ condition?: string;
112
+ retry?: number;
113
+ timeout?: number;
114
+ }
115
+ export interface WatchConfig {
116
+ patterns: string[];
117
+ ignore?: string[];
118
+ commands: WatchCommand[];
119
+ debounce?: number;
120
+ recursive?: boolean;
121
+ }
122
+ export interface WatchCommand {
123
+ trigger: 'change' | 'add' | 'delete' | 'rename';
124
+ command: string;
125
+ args?: string[];
126
+ condition?: string;
127
+ }
128
+ export interface TUILayout {
129
+ name: string;
130
+ widgets: TUIWidget[];
131
+ keybindings?: Keybinding[];
132
+ }
133
+ export interface TUIWidget {
134
+ type: 'log' | 'chart' | 'table' | 'progress' | 'text';
135
+ position: {
136
+ top: string | number;
137
+ left: string | number;
138
+ width: string | number;
139
+ height: string | number;
140
+ };
141
+ options: Record<string, any>;
142
+ dataSource?: string;
143
+ }
144
+ export interface Keybinding {
145
+ key: string;
146
+ action: string;
147
+ description: string;
148
+ }
149
+ export interface ChatSession {
150
+ id: string;
151
+ model: string;
152
+ context?: string;
153
+ history: ChatMessage[];
154
+ created: Date;
155
+ updated: Date;
156
+ }
157
+ export interface ChatMessage {
158
+ role: 'user' | 'assistant' | 'system';
159
+ content: string;
160
+ timestamp: Date;
161
+ metadata?: Record<string, any>;
162
+ }
163
+ export interface AnalysisResult {
164
+ type: 'dependency' | 'quality' | 'security' | 'performance';
165
+ findings: Finding[];
166
+ metrics: Record<string, number>;
167
+ recommendations: Recommendation[];
168
+ timestamp: Date;
169
+ }
170
+ export interface Finding {
171
+ id: string;
172
+ severity: 'critical' | 'high' | 'medium' | 'low' | 'info';
173
+ title: string;
174
+ description: string;
175
+ file: string;
176
+ line?: number;
177
+ column?: number;
178
+ rule: string;
179
+ fixable: boolean;
180
+ fix?: string;
181
+ }
182
+ export interface Recommendation {
183
+ id: string;
184
+ title: string;
185
+ description: string;
186
+ impact: 'high' | 'medium' | 'low';
187
+ effort: 'low' | 'medium' | 'high';
188
+ category: string;
189
+ actions: RecommendationAction[];
190
+ }
191
+ export interface RecommendationAction {
192
+ type: 'command' | 'file_change' | 'config_change';
193
+ description: string;
194
+ command?: string;
195
+ file?: string;
196
+ changes?: any;
197
+ }
198
+ /**
199
+ * Base command interface for all command categories
200
+ */
201
+ export interface BaseCommand {
202
+ program: Command;
203
+ config: WundrConfig;
204
+ logger: Logger;
205
+ registerCommands(): void;
206
+ }
207
+ /**
208
+ * Interactive mode types
209
+ */
210
+ export interface InteractiveSession {
211
+ mode: 'wizard' | 'chat' | 'tui' | 'watch';
212
+ config: any;
213
+ state: Record<string, any>;
214
+ active: boolean;
215
+ }
216
+ /**
217
+ * Error handling types
218
+ */
219
+ export interface WundrError extends Error {
220
+ code?: string;
221
+ context?: Record<string, any>;
222
+ recoverable?: boolean;
223
+ }
224
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,73 @@
1
+ import { WundrConfig } from '../types';
2
+ /**
3
+ * Configuration management system
4
+ */
5
+ export declare class ConfigManager {
6
+ private config;
7
+ private configPath;
8
+ private userConfigDir;
9
+ constructor();
10
+ /**
11
+ * Load configuration from file or create default
12
+ */
13
+ loadConfig(customPath?: string): Promise<WundrConfig>;
14
+ /**
15
+ * Save current configuration to file
16
+ */
17
+ saveConfig(customPath?: string): Promise<void>;
18
+ /**
19
+ * Get current configuration
20
+ */
21
+ getConfig(): WundrConfig;
22
+ /**
23
+ * Update configuration values
24
+ */
25
+ updateConfig(updates: Partial<WundrConfig>): void;
26
+ /**
27
+ * Validate configuration against schema
28
+ */
29
+ validateConfig(config?: any): {
30
+ valid: boolean;
31
+ errors: string[];
32
+ };
33
+ /**
34
+ * Get configuration value by path
35
+ */
36
+ get<T>(path: string, defaultValue?: T): T | undefined;
37
+ /**
38
+ * Set configuration value by path
39
+ */
40
+ set(path: string, value: any): void;
41
+ /**
42
+ * Create default configuration
43
+ */
44
+ private createDefaultConfig;
45
+ /**
46
+ * Merge environment variables into configuration
47
+ */
48
+ private mergeEnvironmentVariables;
49
+ /**
50
+ * Get API key for AI provider with fallback mechanisms
51
+ */
52
+ getAIApiKey(provider?: string): string | undefined;
53
+ /**
54
+ * Set API key securely in config
55
+ */
56
+ setAIApiKey(apiKey: string, provider?: string): Promise<void>;
57
+ /**
58
+ * Check if AI is properly configured
59
+ */
60
+ isAIConfigured(): boolean;
61
+ /**
62
+ * Get config file paths
63
+ */
64
+ getConfigPaths(): {
65
+ user: string;
66
+ project: string;
67
+ };
68
+ /**
69
+ * Merge project config with user config
70
+ */
71
+ loadProjectConfig(): Promise<WundrConfig>;
72
+ }
73
+ //# sourceMappingURL=config-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-manager.d.ts","sourceRoot":"","sources":["../../src/utils/config-manager.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAuDvC;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,MAAM,CAA4B;IAC1C,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,aAAa,CAAS;;IAO9B;;OAEG;IACG,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAiC3D;;OAEG;IACG,UAAU,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBpD;;OAEG;IACH,SAAS,IAAI,WAAW;IAOxB;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,GAAG,IAAI;IAQjD;;OAEG;IACH,cAAc,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE;IAmBlE;;OAEG;IACH,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,SAAS;IAmBrD;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAG,IAAI;IAgCnC;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAsB3B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAwCjC;;OAEG;IACH,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAmBlD;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAanE;;OAEG;IACH,cAAc,IAAI,OAAO;IAOzB;;OAEG;IACH,cAAc,IAAI;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE;IAOnD;;OAEG;IACG,iBAAiB,IAAI,OAAO,CAAC,WAAW,CAAC;CA4BhD"}
@@ -0,0 +1,339 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ConfigManager = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const fs_extra_1 = tslib_1.__importDefault(require("fs-extra"));
6
+ const path_1 = tslib_1.__importDefault(require("path"));
7
+ const os_1 = tslib_1.__importDefault(require("os"));
8
+ const zod_1 = require("zod");
9
+ const logger_1 = require("./logger");
10
+ const error_handler_1 = require("./error-handler");
11
+ // Zod schema for configuration validation
12
+ const WundrConfigSchema = zod_1.z.object({
13
+ version: zod_1.z.string(),
14
+ defaultMode: zod_1.z.enum(['cli', 'interactive', 'chat', 'tui']).default('cli'),
15
+ plugins: zod_1.z.array(zod_1.z.string()).default([]),
16
+ integrations: zod_1.z
17
+ .object({
18
+ github: zod_1.z
19
+ .object({
20
+ token: zod_1.z.string(),
21
+ owner: zod_1.z.string(),
22
+ repo: zod_1.z.string(),
23
+ webhooks: zod_1.z.boolean().optional(),
24
+ })
25
+ .optional(),
26
+ slack: zod_1.z
27
+ .object({
28
+ token: zod_1.z.string(),
29
+ channel: zod_1.z.string(),
30
+ webhooks: zod_1.z.boolean().optional(),
31
+ })
32
+ .optional(),
33
+ jira: zod_1.z
34
+ .object({
35
+ url: zod_1.z.string(),
36
+ email: zod_1.z.string(),
37
+ token: zod_1.z.string(),
38
+ })
39
+ .optional(),
40
+ })
41
+ .default({}),
42
+ ai: zod_1.z.object({
43
+ provider: zod_1.z.string().default('claude'),
44
+ model: zod_1.z.string().default('claude-3'),
45
+ apiKey: zod_1.z.string().optional(),
46
+ }),
47
+ analysis: zod_1.z.object({
48
+ patterns: zod_1.z
49
+ .array(zod_1.z.string())
50
+ .default(['**/*.ts', '**/*.js', '**/*.tsx', '**/*.jsx']),
51
+ excludes: zod_1.z
52
+ .array(zod_1.z.string())
53
+ .default(['**/node_modules/**', '**/dist/**', '**/build/**']),
54
+ maxDepth: zod_1.z.number().default(10),
55
+ }),
56
+ governance: zod_1.z.object({
57
+ rules: zod_1.z.array(zod_1.z.string()).default([]),
58
+ severity: zod_1.z.enum(['error', 'warning', 'info']).default('warning'),
59
+ }),
60
+ });
61
+ /**
62
+ * Configuration management system
63
+ */
64
+ class ConfigManager {
65
+ config = null;
66
+ configPath;
67
+ userConfigDir;
68
+ constructor() {
69
+ this.userConfigDir = path_1.default.join(os_1.default.homedir(), '.wundr');
70
+ this.configPath = path_1.default.join(this.userConfigDir, 'config.json');
71
+ }
72
+ /**
73
+ * Load configuration from file or create default
74
+ */
75
+ async loadConfig(customPath) {
76
+ const configFile = customPath || this.configPath;
77
+ try {
78
+ // Ensure config directory exists
79
+ await fs_extra_1.default.ensureDir(path_1.default.dirname(configFile));
80
+ // Load existing config or create default
81
+ if (await fs_extra_1.default.pathExists(configFile)) {
82
+ const rawConfig = await fs_extra_1.default.readJson(configFile);
83
+ this.config = WundrConfigSchema.parse(rawConfig);
84
+ logger_1.logger.debug(`Loaded config from: ${configFile}`);
85
+ }
86
+ else {
87
+ this.config = this.createDefaultConfig();
88
+ await this.saveConfig();
89
+ logger_1.logger.info('Created default configuration');
90
+ }
91
+ // Merge with environment variables
92
+ this.config = this.mergeEnvironmentVariables(this.config);
93
+ return this.config;
94
+ }
95
+ catch (error) {
96
+ logger_1.logger.error('Failed to load configuration:', error);
97
+ throw error_handler_1.errorHandler.createError('WUNDR_CONFIG_INVALID', 'Failed to load or parse configuration file', { configPath: configFile }, true);
98
+ }
99
+ }
100
+ /**
101
+ * Save current configuration to file
102
+ */
103
+ async saveConfig(customPath) {
104
+ if (!this.config) {
105
+ throw new Error('No configuration to save');
106
+ }
107
+ const configFile = customPath || this.configPath;
108
+ try {
109
+ await fs_extra_1.default.ensureDir(path_1.default.dirname(configFile));
110
+ await fs_extra_1.default.writeJson(configFile, this.config, { spaces: 2 });
111
+ logger_1.logger.debug(`Saved config to: ${configFile}`);
112
+ }
113
+ catch (error) {
114
+ logger_1.logger.error('Failed to save configuration:', error);
115
+ throw error_handler_1.errorHandler.createError('WUNDR_CONFIG_INVALID', 'Failed to save configuration file', { configPath: configFile }, false);
116
+ }
117
+ }
118
+ /**
119
+ * Get current configuration
120
+ */
121
+ getConfig() {
122
+ if (!this.config) {
123
+ throw new Error('Configuration not loaded. Call loadConfig() first.');
124
+ }
125
+ return this.config;
126
+ }
127
+ /**
128
+ * Update configuration values
129
+ */
130
+ updateConfig(updates) {
131
+ if (!this.config) {
132
+ throw new Error('Configuration not loaded. Call loadConfig() first.');
133
+ }
134
+ this.config = { ...this.config, ...updates };
135
+ }
136
+ /**
137
+ * Validate configuration against schema
138
+ */
139
+ validateConfig(config) {
140
+ const configToValidate = config || this.config;
141
+ try {
142
+ WundrConfigSchema.parse(configToValidate);
143
+ return { valid: true, errors: [] };
144
+ }
145
+ catch (error) {
146
+ if (error instanceof zod_1.z.ZodError) {
147
+ return {
148
+ valid: false,
149
+ errors: error.issues.map(issue => `${issue.path.join('.')}: ${issue.message}`),
150
+ };
151
+ }
152
+ return { valid: false, errors: [error.message] };
153
+ }
154
+ }
155
+ /**
156
+ * Get configuration value by path
157
+ */
158
+ get(path, defaultValue) {
159
+ if (!this.config) {
160
+ return defaultValue;
161
+ }
162
+ const keys = path.split('.');
163
+ let value = this.config;
164
+ for (const key of keys) {
165
+ if (value && typeof value === 'object' && key in value) {
166
+ value = value[key];
167
+ }
168
+ else {
169
+ return defaultValue;
170
+ }
171
+ }
172
+ return value;
173
+ }
174
+ /**
175
+ * Set configuration value by path
176
+ */
177
+ set(path, value) {
178
+ if (!this.config) {
179
+ throw new Error('Configuration not loaded. Call loadConfig() first.');
180
+ }
181
+ const keys = path.split('.');
182
+ let current = this.config;
183
+ for (let i = 0; i < keys.length - 1; i++) {
184
+ const key = keys[i];
185
+ if (!key) {
186
+ throw new Error(`Invalid path: empty key at position ${i}`);
187
+ }
188
+ if (!current || typeof current !== 'object') {
189
+ throw new Error(`Invalid path: cannot set property on non-object`);
190
+ }
191
+ if (!current[key] || typeof current[key] !== 'object') {
192
+ current[key] = {};
193
+ }
194
+ current = current[key];
195
+ }
196
+ const finalKey = keys[keys.length - 1];
197
+ if (!finalKey) {
198
+ throw new Error('Invalid path: empty final key');
199
+ }
200
+ if (!finalKey || !current || typeof current !== 'object') {
201
+ throw new Error(`Invalid path: cannot set property`);
202
+ }
203
+ current[finalKey] = value;
204
+ }
205
+ /**
206
+ * Create default configuration
207
+ */
208
+ createDefaultConfig() {
209
+ return {
210
+ version: '1.0.0',
211
+ defaultMode: 'cli',
212
+ plugins: [],
213
+ integrations: {},
214
+ ai: {
215
+ provider: 'claude',
216
+ model: 'claude-3-opus-20240229',
217
+ },
218
+ analysis: {
219
+ patterns: ['**/*.ts', '**/*.js', '**/*.tsx', '**/*.jsx'],
220
+ excludes: ['**/node_modules/**', '**/dist/**', '**/build/**'],
221
+ maxDepth: 10,
222
+ },
223
+ governance: {
224
+ rules: [],
225
+ severity: 'warning',
226
+ },
227
+ };
228
+ }
229
+ /**
230
+ * Merge environment variables into configuration
231
+ */
232
+ mergeEnvironmentVariables(config) {
233
+ const envConfig = { ...config };
234
+ // AI API Key from environment
235
+ if (process.env['CLAUDE_API_KEY'] && !envConfig.ai.apiKey) {
236
+ envConfig.ai.apiKey = process.env['CLAUDE_API_KEY'];
237
+ }
238
+ if (process.env['OPENAI_API_KEY'] &&
239
+ envConfig.ai.provider === 'openai' &&
240
+ !envConfig.ai.apiKey) {
241
+ envConfig.ai.apiKey = process.env['OPENAI_API_KEY'];
242
+ }
243
+ // AI Provider and Model from environment
244
+ if (process.env['WUNDR_AI_PROVIDER']) {
245
+ envConfig.ai.provider = process.env['WUNDR_AI_PROVIDER'];
246
+ }
247
+ if (process.env['WUNDR_AI_MODEL']) {
248
+ envConfig.ai.model = process.env['WUNDR_AI_MODEL'];
249
+ }
250
+ // GitHub integration
251
+ if (process.env['GITHUB_TOKEN']) {
252
+ envConfig.integrations.github = envConfig.integrations.github || {
253
+ token: process.env['GITHUB_TOKEN'],
254
+ owner: process.env['GITHUB_OWNER'] || '',
255
+ repo: process.env['GITHUB_REPO'] || '',
256
+ };
257
+ if (!envConfig.integrations.github.token) {
258
+ envConfig.integrations.github.token = process.env['GITHUB_TOKEN'];
259
+ }
260
+ }
261
+ return envConfig;
262
+ }
263
+ /**
264
+ * Get API key for AI provider with fallback mechanisms
265
+ */
266
+ getAIApiKey(provider) {
267
+ const currentProvider = provider || this.config?.ai?.provider || 'claude';
268
+ // First check config
269
+ if (this.config?.ai?.apiKey) {
270
+ return this.config.ai.apiKey;
271
+ }
272
+ // Then check environment variables based on provider
273
+ switch (currentProvider.toLowerCase()) {
274
+ case 'claude':
275
+ return process.env['CLAUDE_API_KEY'];
276
+ case 'openai':
277
+ return process.env['OPENAI_API_KEY'];
278
+ default:
279
+ return process.env['CLAUDE_API_KEY']; // Default fallback
280
+ }
281
+ }
282
+ /**
283
+ * Set API key securely in config
284
+ */
285
+ async setAIApiKey(apiKey, provider) {
286
+ if (!this.config) {
287
+ await this.loadConfig();
288
+ }
289
+ if (provider && provider !== this.config.ai.provider) {
290
+ this.config.ai.provider = provider;
291
+ }
292
+ this.config.ai.apiKey = apiKey;
293
+ await this.saveConfig();
294
+ }
295
+ /**
296
+ * Check if AI is properly configured
297
+ */
298
+ isAIConfigured() {
299
+ const apiKey = this.getAIApiKey();
300
+ const provider = this.config?.ai?.provider;
301
+ return !!(apiKey && provider);
302
+ }
303
+ /**
304
+ * Get config file paths
305
+ */
306
+ getConfigPaths() {
307
+ return {
308
+ user: this.configPath,
309
+ project: path_1.default.join(process.cwd(), 'wundr.config.json'),
310
+ };
311
+ }
312
+ /**
313
+ * Merge project config with user config
314
+ */
315
+ async loadProjectConfig() {
316
+ const projectConfigPath = path_1.default.join(process.cwd(), 'wundr.config.json');
317
+ // Load user config first
318
+ await this.loadConfig();
319
+ // Merge with project config if it exists
320
+ if (await fs_extra_1.default.pathExists(projectConfigPath)) {
321
+ try {
322
+ const projectConfig = await fs_extra_1.default.readJson(projectConfigPath);
323
+ const validatedProjectConfig = WundrConfigSchema.partial().parse(projectConfig);
324
+ this.config = {
325
+ ...this.config,
326
+ ...validatedProjectConfig,
327
+ };
328
+ logger_1.logger.debug(`Merged project config from: ${projectConfigPath}`);
329
+ }
330
+ catch (error) {
331
+ const message = error instanceof Error ? error.message : 'Unknown error';
332
+ logger_1.logger.warn(`Failed to load project config: ${message}`);
333
+ }
334
+ }
335
+ return this.config;
336
+ }
337
+ }
338
+ exports.ConfigManager = ConfigManager;
339
+ //# sourceMappingURL=config-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-manager.js","sourceRoot":"","sources":["../../src/utils/config-manager.ts"],"names":[],"mappings":"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"}