@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
package/bin/wundr.js CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  /**
4
4
  * Wundr CLI Entry Point
5
- *
5
+ *
6
6
  * This is the main executable for the Wundr CLI tool.
7
7
  * It handles cross-platform compatibility and bootstraps the CLI.
8
8
  */
@@ -26,7 +26,9 @@ if (isDevelopment && existsSync(srcPath)) {
26
26
  if (existsSync(distPath)) {
27
27
  require(distPath);
28
28
  } else {
29
- console.error('No compiled JavaScript found. Please run "npm run build" first.');
29
+ console.error(
30
+ 'No compiled JavaScript found. Please run "npm run build" first.'
31
+ );
30
32
  process.exit(1);
31
33
  }
32
34
  }
@@ -38,6 +40,8 @@ if (isDevelopment && existsSync(srcPath)) {
38
40
  cli.main();
39
41
  }
40
42
  } else {
41
- console.error('Wundr CLI not properly installed. Please reinstall the package.');
43
+ console.error(
44
+ 'Wundr CLI not properly installed. Please reinstall the package.'
45
+ );
42
46
  process.exit(1);
43
- }
47
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wundr.io/cli",
3
- "version": "1.0.11",
3
+ "version": "1.0.12",
4
4
  "description": "Unified CLI framework for the Wundr platform",
5
5
  "keywords": [
6
6
  "wundr",
@@ -38,18 +38,37 @@
38
38
  "test-suites",
39
39
  "README.md"
40
40
  ],
41
+ "scripts": {
42
+ "build": "tsc",
43
+ "build:watch": "tsc --watch",
44
+ "clean": "rm -rf dist",
45
+ "dev": "tsc --watch",
46
+ "format": "prettier --write 'src/**/*.{ts,tsx,js,jsx,json,md}'",
47
+ "format:check": "prettier --check 'src/**/*.{ts,tsx,js,jsx,json,md}'",
48
+ "lint": "eslint src --ext .ts,.tsx,.js,.jsx --fix",
49
+ "test": "jest",
50
+ "test:watch": "jest --watch",
51
+ "typecheck": "tsc --noEmit"
52
+ },
41
53
  "dependencies": {
54
+ "@axe-core/playwright": "^4.10.0",
42
55
  "@oclif/core": "^3.15.0",
43
56
  "@oclif/plugin-help": "^6.0.0",
44
57
  "@oclif/plugin-plugins": "^4.1.0",
58
+ "@playwright/test": "^1.48.0",
45
59
  "@types/axios": "^0.9.36",
46
60
  "@types/open": "^6.2.1",
61
+ "@wundr.io/computer-setup": "^1.0.12",
62
+ "@wundr.io/config": "^1.0.12",
63
+ "@wundr.io/core": "^1.0.12",
64
+ "@wundr.io/governance": "^1.0.12",
65
+ "@wundr.io/guardian-dashboard": "^1.0.12",
47
66
  "@wundr.io/vp-daemon": "^1.0.6",
48
67
  "axios": "^1.11.0",
49
- "chokidar": "^3.5.3",
50
68
  "blessed": "^0.1.81",
51
69
  "blessed-contrib": "^4.11.0",
52
70
  "chalk": "^5.3.0",
71
+ "chokidar": "^3.5.3",
53
72
  "commander": "^11.1.0",
54
73
  "conf": "^12.0.0",
55
74
  "execa": "^8.0.1",
@@ -61,19 +80,12 @@
61
80
  "node-pty": "^1.0.0",
62
81
  "open": "^10.2.0",
63
82
  "ora": "^8.0.1",
64
- "@playwright/test": "^1.48.0",
65
- "@axe-core/playwright": "^4.10.0",
66
83
  "prompts": "^2.4.2",
67
84
  "rxjs": "^7.8.1",
68
85
  "terminal-kit": "^3.0.1",
69
86
  "ws": "^8.16.0",
70
87
  "yaml": "^2.3.4",
71
- "zod": "^3.22.4",
72
- "@wundr.io/computer-setup": "1.0.7",
73
- "@wundr.io/config": "1.0.6",
74
- "@wundr.io/governance": "1.0.6",
75
- "@wundr.io/core": "1.0.6",
76
- "@wundr.io/guardian-dashboard": "1.0.6"
88
+ "zod": "^3.22.4"
77
89
  },
78
90
  "devDependencies": {
79
91
  "@types/blessed": "^0.1.25",
@@ -124,17 +136,5 @@
124
136
  "description": "Computer setup and provisioning for developer machines"
125
137
  }
126
138
  }
127
- },
128
- "scripts": {
129
- "build": "tsc",
130
- "build:watch": "tsc --watch",
131
- "clean": "rm -rf dist",
132
- "dev": "tsc --watch",
133
- "format": "prettier --write 'src/**/*.{ts,tsx,js,jsx,json,md}'",
134
- "format:check": "prettier --check 'src/**/*.{ts,tsx,js,jsx,json,md}'",
135
- "lint": "eslint src --ext .ts,.tsx,.js,.jsx --fix",
136
- "test": "jest",
137
- "test:watch": "jest --watch",
138
- "typecheck": "tsc --noEmit"
139
139
  }
140
- }
140
+ }
@@ -5,7 +5,6 @@ import type { ChatSession, ChatMessage } from '../types';
5
5
  import type { ClaudeMessage } from './claude-client';
6
6
  import type { ConfigManager } from '../utils/config-manager';
7
7
 
8
-
9
8
  /**
10
9
  * AI service configuration
11
10
  */
@@ -54,7 +53,7 @@ export class AIService {
54
53
  if (this.config.provider === 'claude') {
55
54
  if (!this.config.apiKey) {
56
55
  logger.warn(
57
- 'Claude API key not configured. AI features will be limited.',
56
+ 'Claude API key not configured. AI features will be limited.'
58
57
  );
59
58
  logger.info('Configure your API key using: wundr ai setup');
60
59
  logger.info('Or set the CLAUDE_API_KEY environment variable');
@@ -70,7 +69,7 @@ export class AIService {
70
69
  });
71
70
 
72
71
  logger.info(
73
- `Initialized Claude client with model: ${this.config.model}`,
72
+ `Initialized Claude client with model: ${this.config.model}`
74
73
  );
75
74
  } else {
76
75
  throw new Error(`Unsupported AI provider: ${this.config.provider}`);
@@ -118,7 +117,7 @@ export class AIService {
118
117
  async sendMessage(
119
118
  sessionId: string,
120
119
  message: string,
121
- context?: ConversationContext,
120
+ context?: ConversationContext
122
121
  ): Promise<string> {
123
122
  this.ensureClientInitialized();
124
123
 
@@ -134,7 +133,7 @@ export class AIService {
134
133
  const systemPrompt = this.buildSystemPrompt(context);
135
134
  const response = await this.claudeClient!.sendConversation(
136
135
  conversationMessages,
137
- systemPrompt,
136
+ systemPrompt
138
137
  );
139
138
 
140
139
  // Add AI response to history
@@ -159,7 +158,7 @@ export class AIService {
159
158
  async *streamMessage(
160
159
  sessionId: string,
161
160
  message: string,
162
- context?: ConversationContext,
161
+ context?: ConversationContext
163
162
  ): AsyncGenerator<string, string, unknown> {
164
163
  this.ensureClientInitialized();
165
164
 
@@ -177,7 +176,7 @@ export class AIService {
177
176
 
178
177
  for await (const chunk of this.claudeClient!.streamConversation(
179
178
  conversationMessages,
180
- systemPrompt,
179
+ systemPrompt
181
180
  )) {
182
181
  fullResponse += chunk;
183
182
  yield chunk;
@@ -204,7 +203,7 @@ export class AIService {
204
203
  */
205
204
  async parseNaturalLanguageCommand(
206
205
  input: string,
207
- _context?: ConversationContext,
206
+ _context?: ConversationContext
208
207
  ): Promise<{
209
208
  intent: string;
210
209
  command: string;
@@ -229,7 +228,7 @@ export class AIService {
229
228
 
230
229
  const result = await this.claudeClient!.analyzeIntent(
231
230
  input,
232
- availableCommands,
231
+ availableCommands
233
232
  );
234
233
 
235
234
  return {
@@ -251,7 +250,7 @@ export class AIService {
251
250
  */
252
251
  async suggestCommands(
253
252
  goal: string,
254
- context?: ConversationContext,
253
+ context?: ConversationContext
255
254
  ): Promise<
256
255
  Array<{
257
256
  command: string;
@@ -279,7 +278,7 @@ export class AIService {
279
278
  const result = await this.claudeClient!.suggestCommands(
280
279
  projectContext,
281
280
  goal,
282
- availableCommands,
281
+ availableCommands
283
282
  );
284
283
 
285
284
  return result.suggestions.map(suggestion => ({
@@ -298,7 +297,7 @@ export class AIService {
298
297
  async explainCommandResults(
299
298
  command: string,
300
299
  output: string,
301
- context?: ConversationContext,
300
+ context?: ConversationContext
302
301
  ): Promise<string> {
303
302
  this.ensureClientInitialized();
304
303
 
@@ -309,7 +308,7 @@ export class AIService {
309
308
  return await this.claudeClient!.explainResults(
310
309
  command,
311
310
  output,
312
- contextString,
311
+ contextString
313
312
  );
314
313
  } catch (error) {
315
314
  logger.error('Failed to explain command results:', error);
@@ -323,7 +322,7 @@ export class AIService {
323
322
  async generateContextualHelp(
324
323
  command: string,
325
324
  context?: ConversationContext,
326
- userLevel: 'beginner' | 'intermediate' | 'advanced' = 'intermediate',
325
+ userLevel: 'beginner' | 'intermediate' | 'advanced' = 'intermediate'
327
326
  ): Promise<string> {
328
327
  this.ensureClientInitialized();
329
328
 
@@ -332,7 +331,7 @@ export class AIService {
332
331
  return await this.claudeClient!.generateHelp(
333
332
  command,
334
333
  userContext,
335
- userLevel,
334
+ userLevel
336
335
  );
337
336
  } catch (error) {
338
337
  logger.error('Failed to generate contextual help:', error);
@@ -492,12 +491,12 @@ export class AIService {
492
491
 
493
492
  if (!configuredKey) {
494
493
  throw new Error(
495
- 'AI API key not configured.\n\nTo set up AI features:\n1. Run: wundr ai setup\n2. Or set environment variable: export CLAUDE_API_KEY=your_key_here\n3. Or add to config: wundr ai config set apiKey your_key_here',
494
+ 'AI API key not configured.\n\nTo set up AI features:\n1. Run: wundr ai setup\n2. Or set environment variable: export CLAUDE_API_KEY=your_key_here\n3. Or add to config: wundr ai config set apiKey your_key_here'
496
495
  );
497
496
  }
498
497
 
499
498
  throw new Error(
500
- 'AI client failed to initialize. Please check your configuration.',
499
+ 'AI client failed to initialize. Please check your configuration.'
501
500
  );
502
501
  }
503
502
  }
@@ -94,7 +94,7 @@ export class ClaudeClient {
94
94
  async sendMessage(
95
95
  message: string,
96
96
  systemPrompt?: string,
97
- options?: Partial<ClaudeConfig>,
97
+ options?: Partial<ClaudeConfig>
98
98
  ): Promise<string> {
99
99
  try {
100
100
  const messages: ClaudeMessage[] = [];
@@ -124,7 +124,7 @@ export class ClaudeClient {
124
124
  async sendConversation(
125
125
  messages: ClaudeMessage[],
126
126
  systemPrompt?: string,
127
- options?: Partial<ClaudeConfig>,
127
+ options?: Partial<ClaudeConfig>
128
128
  ): Promise<string> {
129
129
  try {
130
130
  const conversationMessages = [...messages];
@@ -152,7 +152,7 @@ export class ClaudeClient {
152
152
  async *streamConversation(
153
153
  messages: ClaudeMessage[],
154
154
  systemPrompt?: string,
155
- options?: Partial<ClaudeConfig>,
155
+ options?: Partial<ClaudeConfig>
156
156
  ): AsyncGenerator<string, void, unknown> {
157
157
  try {
158
158
  const conversationMessages = [...messages];
@@ -172,7 +172,7 @@ export class ClaudeClient {
172
172
  },
173
173
  {
174
174
  responseType: 'stream',
175
- },
175
+ }
176
176
  );
177
177
 
178
178
  let buffer = '';
@@ -186,8 +186,8 @@ export class ClaudeClient {
186
186
  if (line.startsWith('data: ')) {
187
187
  const data = line.slice(6);
188
188
  if (data === '[DONE]') {
189
- return;
190
- }
189
+ return;
190
+ }
191
191
 
192
192
  try {
193
193
  const parsed: ClaudeStreamChunk = JSON.parse(data);
@@ -204,7 +204,7 @@ return;
204
204
  } catch (error) {
205
205
  throw this.handleError(
206
206
  error,
207
- 'Failed to stream conversation with Claude',
207
+ 'Failed to stream conversation with Claude'
208
208
  );
209
209
  }
210
210
  }
@@ -214,7 +214,7 @@ return;
214
214
  */
215
215
  async analyzeIntent(
216
216
  input: string,
217
- availableCommands: string[],
217
+ availableCommands: string[]
218
218
  ): Promise<{
219
219
  intent: string;
220
220
  confidence: number;
@@ -255,7 +255,7 @@ Respond with JSON only in this format:
255
255
  async suggestCommands(
256
256
  projectContext: string,
257
257
  userGoal: string,
258
- availableCommands: string[],
258
+ availableCommands: string[]
259
259
  ): Promise<{
260
260
  suggestions: Array<{
261
261
  command: string;
@@ -298,7 +298,7 @@ Respond with JSON only:
298
298
  async explainResults(
299
299
  command: string,
300
300
  output: string,
301
- context?: string,
301
+ context?: string
302
302
  ): Promise<string> {
303
303
  const systemPrompt = `You are a helpful CLI assistant. Explain the results of a CLI command in clear, natural language. Focus on:
304
304
  1. What the command did
@@ -328,7 +328,7 @@ ${output}`;
328
328
  async generateHelp(
329
329
  command: string,
330
330
  userContext: string,
331
- difficulty: 'beginner' | 'intermediate' | 'advanced' = 'intermediate',
331
+ difficulty: 'beginner' | 'intermediate' | 'advanced' = 'intermediate'
332
332
  ): Promise<string> {
333
333
  const systemPrompt = `You are a CLI documentation assistant. Generate helpful, contextual guidance for CLI commands. Adapt the explanation level to: ${difficulty}
334
334
 
@@ -364,7 +364,7 @@ User Context: ${userContext}`;
364
364
  'Respond with just "OK" if you can understand this message.',
365
365
  {
366
366
  maxTokens: 10,
367
- },
367
+ }
368
368
  );
369
369
  return true;
370
370
  } catch (error) {
@@ -418,28 +418,28 @@ User Context: ${userContext}`;
418
418
  this.client.interceptors.request.use(
419
419
  (config: any) => {
420
420
  logger.debug(
421
- `Claude API Request: ${config.method?.toUpperCase()} ${config.url}`,
421
+ `Claude API Request: ${config.method?.toUpperCase()} ${config.url}`
422
422
  );
423
423
  return config;
424
424
  },
425
425
  (error: any) => {
426
426
  logger.error('Claude API Request Error:', error);
427
427
  return Promise.reject(error);
428
- },
428
+ }
429
429
  );
430
430
 
431
431
  // Response interceptor
432
432
  this.client.interceptors.response.use(
433
433
  (response: any) => {
434
434
  logger.debug(
435
- `Claude API Response: ${response.status} ${response.statusText}`,
435
+ `Claude API Response: ${response.status} ${response.statusText}`
436
436
  );
437
437
  return response;
438
438
  },
439
439
  (error: any) => {
440
440
  logger.error('Claude API Response Error:', error);
441
441
  return Promise.reject(error);
442
- },
442
+ }
443
443
  );
444
444
  }
445
445
 
@@ -63,7 +63,7 @@ export class ConversationManager extends EventEmitter {
63
63
 
64
64
  constructor(
65
65
  claudeClient: ClaudeClient,
66
- config: Partial<ConversationConfig> = {},
66
+ config: Partial<ConversationConfig> = {}
67
67
  ) {
68
68
  super();
69
69
 
@@ -93,7 +93,7 @@ export class ConversationManager extends EventEmitter {
93
93
  context?: string;
94
94
  tags?: string[];
95
95
  metadata?: Partial<SessionMetadata>;
96
- } = {},
96
+ } = {}
97
97
  ): Promise<EnhancedChatSession> {
98
98
  const sessionId =
99
99
  options.id ||
@@ -179,7 +179,7 @@ export class ConversationManager extends EventEmitter {
179
179
  systemPrompt?: string;
180
180
  streaming?: boolean;
181
181
  metadata?: Record<string, any>;
182
- } = {},
182
+ } = {}
183
183
  ): Promise<string | AsyncGenerator<string, void, unknown>> {
184
184
  const session = await this.loadSession(sessionId);
185
185
  if (!session) {
@@ -214,12 +214,12 @@ export class ConversationManager extends EventEmitter {
214
214
  if (options.streaming) {
215
215
  response = this.claudeClient.streamConversation(
216
216
  claudeMessages,
217
- options.systemPrompt,
217
+ options.systemPrompt
218
218
  );
219
219
  } else {
220
220
  response = await this.claudeClient.sendConversation(
221
221
  claudeMessages,
222
- options.systemPrompt,
222
+ options.systemPrompt
223
223
  );
224
224
  }
225
225
 
@@ -228,13 +228,13 @@ export class ConversationManager extends EventEmitter {
228
228
  return this.handleStreamingResponse(
229
229
  session,
230
230
  response as AsyncGenerator<string, void, unknown>,
231
- startTime,
231
+ startTime
232
232
  );
233
233
  } else {
234
234
  return await this.handleSyncResponse(
235
235
  session,
236
236
  response as string,
237
- startTime,
237
+ startTime
238
238
  );
239
239
  }
240
240
  } catch (error) {
@@ -254,7 +254,7 @@ export class ConversationManager extends EventEmitter {
254
254
  from?: Date;
255
255
  to?: Date;
256
256
  roles?: ('user' | 'assistant' | 'system')[];
257
- } = {},
257
+ } = {}
258
258
  ): ChatMessage[] {
259
259
  const session = this.activeSessions.get(sessionId);
260
260
  if (!session) {
@@ -289,7 +289,7 @@ export class ConversationManager extends EventEmitter {
289
289
  async addContext(
290
290
  sessionId: string,
291
291
  contextType: 'project' | 'command' | 'preference' | 'workflow',
292
- contextData: any,
292
+ contextData: any
293
293
  ): Promise<void> {
294
294
  const session = await this.loadSession(sessionId);
295
295
  if (!session) {
@@ -331,7 +331,7 @@ export class ConversationManager extends EventEmitter {
331
331
  olderThan?: number; // days
332
332
  inactiveFor?: number; // days
333
333
  maxSessions?: number;
334
- } = {},
334
+ } = {}
335
335
  ): Promise<string[]> {
336
336
  const archivedSessions: string[] = [];
337
337
  const now = new Date();
@@ -370,7 +370,7 @@ export class ConversationManager extends EventEmitter {
370
370
  this.activeSessions.size > criteria.maxSessions
371
371
  ) {
372
372
  const sessionsByAccess = Array.from(this.activeSessions.entries()).sort(
373
- ([, a], [, b]) => a.lastAccessed.getTime() - b.lastAccessed.getTime(),
373
+ ([, a], [, b]) => a.lastAccessed.getTime() - b.lastAccessed.getTime()
374
374
  );
375
375
 
376
376
  const excessCount = this.activeSessions.size - criteria.maxSessions;
@@ -443,8 +443,8 @@ export class ConversationManager extends EventEmitter {
443
443
  if (sessionId) {
444
444
  const session = this.activeSessions.get(sessionId);
445
445
  if (!session) {
446
- return null;
447
- }
446
+ return null;
447
+ }
448
448
 
449
449
  return {
450
450
  messageCount: session.history.length,
@@ -460,12 +460,12 @@ return null;
460
460
  const totalSessions = this.activeSessions.size;
461
461
  const totalMessages = Array.from(this.activeSessions.values()).reduce(
462
462
  (sum, session) => sum + session.history.length,
463
- 0,
463
+ 0
464
464
  );
465
465
 
466
466
  const totalTokens = Array.from(this.activeSessions.values()).reduce(
467
467
  (sum, session) => sum + session.metadata.tokenUsage.total,
468
- 0,
468
+ 0
469
469
  );
470
470
 
471
471
  return {
@@ -515,7 +515,7 @@ return null;
515
515
  */
516
516
  async exportSession(
517
517
  sessionId: string,
518
- format: 'json' | 'markdown' | 'csv',
518
+ format: 'json' | 'markdown' | 'csv'
519
519
  ): Promise<string> {
520
520
  const session = await this.loadSession(sessionId);
521
521
  if (!session) {
@@ -570,7 +570,7 @@ return null;
570
570
  includeArchived?: boolean;
571
571
  sortBy?: 'created' | 'updated' | 'lastAccessed';
572
572
  sortOrder?: 'asc' | 'desc';
573
- } = {},
573
+ } = {}
574
574
  ): Promise<{
575
575
  sessions: Array<
576
576
  Pick<
@@ -630,7 +630,7 @@ return null;
630
630
  logger.error('Session cleanup failed:', error);
631
631
  });
632
632
  },
633
- 10 * 60 * 1000,
633
+ 10 * 60 * 1000
634
634
  ); // Every 10 minutes
635
635
 
636
636
  logger.debug('Conversation manager initialized');
@@ -646,7 +646,7 @@ return null;
646
646
  // Keep system messages and recent messages
647
647
  const systemMessages = session.history.filter(msg => msg.role === 'system');
648
648
  const recentMessages = session.history.slice(
649
- -contextWindowSize + systemMessages.length,
649
+ -contextWindowSize + systemMessages.length
650
650
  );
651
651
 
652
652
  // If we still have too many messages, apply compression
@@ -666,8 +666,8 @@ return null;
666
666
  const older = messages.slice(0, -recentCount);
667
667
 
668
668
  if (older.length === 0) {
669
- return recent;
670
- }
669
+ return recent;
670
+ }
671
671
 
672
672
  const summary: ChatMessage = {
673
673
  role: 'system',
@@ -681,7 +681,7 @@ return recent;
681
681
  private async handleSyncResponse(
682
682
  session: EnhancedChatSession,
683
683
  response: string,
684
- startTime: number,
684
+ startTime: number
685
685
  ): Promise<string> {
686
686
  const endTime = Date.now();
687
687
  const responseTime = endTime - startTime;
@@ -716,7 +716,7 @@ return recent;
716
716
  private async *handleStreamingResponse(
717
717
  session: EnhancedChatSession,
718
718
  responseGenerator: AsyncGenerator<string, void, unknown>,
719
- startTime: number,
719
+ startTime: number
720
720
  ): AsyncGenerator<string, void, unknown> {
721
721
  let fullResponse = '';
722
722
  let firstChunk = true;
@@ -760,7 +760,7 @@ return recent;
760
760
 
761
761
  private updatePerformanceMetrics(
762
762
  session: EnhancedChatSession,
763
- responseTime: number,
763
+ responseTime: number
764
764
  ): void {
765
765
  const perf = session.metadata.performance;
766
766
  perf.totalRequests++;
@@ -809,14 +809,14 @@ return recent;
809
809
 
810
810
  private searchSession(
811
811
  session: EnhancedChatSession,
812
- query: any,
812
+ query: any
813
813
  ): ChatMessage[] {
814
814
  let matches = session.history;
815
815
 
816
816
  if (query.text) {
817
817
  const searchText = query.text.toLowerCase();
818
818
  matches = matches.filter(msg =>
819
- msg.content.toLowerCase().includes(searchText),
819
+ msg.content.toLowerCase().includes(searchText)
820
820
  );
821
821
  }
822
822
 
@@ -824,13 +824,13 @@ return recent;
824
824
  matches = matches.filter(
825
825
  msg =>
826
826
  msg.timestamp >= query.dateRange.from &&
827
- msg.timestamp <= query.dateRange.to,
827
+ msg.timestamp <= query.dateRange.to
828
828
  );
829
829
  }
830
830
 
831
831
  if (query.tags && query.tags.length > 0) {
832
832
  const hasMatchingTag = query.tags.some((tag: string) =>
833
- session.tags.includes(tag),
833
+ session.tags.includes(tag)
834
834
  );
835
835
  if (!hasMatchingTag) {
836
836
  matches = [];
@@ -850,7 +850,7 @@ return recent;
850
850
  if (query.text) {
851
851
  // Boost score based on exact matches
852
852
  const exactMatches = matches.filter(msg =>
853
- msg.content.toLowerCase().includes(query.text.toLowerCase()),
853
+ msg.content.toLowerCase().includes(query.text.toLowerCase())
854
854
  ).length;
855
855
  score += exactMatches * 2;
856
856
  }
package/src/cli.ts CHANGED
@@ -47,7 +47,7 @@ export class WundrCLI {
47
47
  this.pluginManager = new PluginManager(this.configManager);
48
48
  this.interactiveMode = new InteractiveMode(
49
49
  this.configManager,
50
- this.pluginManager,
50
+ this.pluginManager
51
51
  );
52
52
 
53
53
  this.setupProgram();
@@ -63,7 +63,7 @@ export class WundrCLI {
63
63
  this.program
64
64
  .name('wundr')
65
65
  .description(
66
- 'Unified Developer Platform - Code Analysis, Governance & Computer Setup for Engineering Teams',
66
+ 'Unified Developer Platform - Code Analysis, Governance & Computer Setup for Engineering Teams'
67
67
  )
68
68
  .version(version, '-v, --version', 'display version number')
69
69
  .helpOption('-h, --help', 'display help for command')
@@ -74,7 +74,7 @@ export class WundrCLI {
74
74
  ║║║║ ║║║║ ║║╠╦╝
75
75
  ╚╩╝╚═╝╝╚╝═╩╝╩╚═
76
76
  The Unified Developer Platform
77
- `,
77
+ `
78
78
  )
79
79
  .configureOutput({
80
80
  writeOut: str => process.stdout.write(str),
@@ -208,7 +208,7 @@ The Unified Developer Platform
208
208
  .option(
209
209
  '--layout <type>',
210
210
  'TUI layout (dashboard, monitor, debug)',
211
- 'dashboard',
211
+ 'dashboard'
212
212
  )
213
213
  .action(async options => {
214
214
  await this.interactiveMode.launchTUI(options.layout);