@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,697 @@
1
+ import { Command } from 'commander';
2
+ import chalk from 'chalk';
3
+ import ora from 'ora';
4
+ import { execSync, spawn } from 'child_process';
5
+ import * as path from 'path';
6
+ import * as fs from 'fs';
7
+
8
+ /**
9
+ * Claude Setup Commands
10
+ * Comprehensive setup for Claude Code, Claude Flow, and MCP tools
11
+ */
12
+ export class ClaudeSetupCommands {
13
+ constructor(private program: Command) {
14
+ this.registerCommands();
15
+ }
16
+
17
+ private registerCommands(): void {
18
+ const claudeSetup = this.program
19
+ .command('claude-setup')
20
+ .alias('cs')
21
+ .description('Setup Claude Code, Claude Flow, and MCP tools')
22
+ .addHelpText(
23
+ 'after',
24
+ chalk.gray(`
25
+ Examples:
26
+ ${chalk.green('wundr claude-setup')} Interactive Claude setup
27
+ ${chalk.green('wundr claude-setup mcp')} Install all MCP tools
28
+ ${chalk.green('wundr claude-setup agents')} Configure all 54 agents
29
+ ${chalk.green('wundr claude-setup optimize')} Setup hardware-adaptive optimizations
30
+ ${chalk.green('wundr claude-setup validate')} Validate Claude installation
31
+ `)
32
+ );
33
+
34
+ // Main setup command
35
+ claudeSetup
36
+ .command('install', { isDefault: true })
37
+ .description('Complete Claude ecosystem installation')
38
+ .option('--skip-chrome', 'Skip Chrome installation')
39
+ .option('--skip-mcp', 'Skip MCP tools installation')
40
+ .option('--skip-agents', 'Skip agent configuration')
41
+ .action(async options => {
42
+ await this.runCompleteSetup(options);
43
+ });
44
+
45
+ // MCP tools installation
46
+ claudeSetup
47
+ .command('mcp')
48
+ .description('Install and configure MCP tools')
49
+ .option(
50
+ '--tool <tool>',
51
+ 'Install specific tool (firecrawl, context7, playwright, browser, sequentialthinking)'
52
+ )
53
+ .action(async options => {
54
+ await this.installMcpTools(options);
55
+ });
56
+
57
+ // Agent configuration
58
+ claudeSetup
59
+ .command('agents')
60
+ .description('Configure Claude Flow agents')
61
+ .option('--list', 'List available agents')
62
+ .option('--enable <agents>', 'Enable specific agents (comma-separated)')
63
+ .option('--profile <profile>', 'Use profile-specific agents')
64
+ .action(async options => {
65
+ await this.configureAgents(options);
66
+ });
67
+
68
+ // Validation
69
+ claudeSetup
70
+ .command('validate')
71
+ .description('Validate Claude installation')
72
+ .option('--fix', 'Attempt to fix issues')
73
+ .action(async options => {
74
+ await this.validateInstallation(options);
75
+ });
76
+
77
+ // Chrome extension
78
+ claudeSetup
79
+ .command('extension')
80
+ .description('Install Browser MCP Chrome extension')
81
+ .action(async () => {
82
+ await this.installChromeExtension();
83
+ });
84
+
85
+ // Hardware optimization
86
+ claudeSetup
87
+ .command('optimize')
88
+ .description('Setup hardware-adaptive Claude Code optimizations')
89
+ .option('--force', 'Force reinstallation of optimization scripts')
90
+ .action(async options => {
91
+ await this.setupOptimizations(options);
92
+ });
93
+ }
94
+
95
+ private async runCompleteSetup(options: any): Promise<void> {
96
+ const spinner = ora();
97
+ console.log(chalk.cyan.bold('\nšŸ¤– Claude Ecosystem Setup\n'));
98
+
99
+ try {
100
+ // Step 1: Install Claude CLI
101
+ if (!this.isClaudeInstalled()) {
102
+ spinner.start('Installing Claude CLI...');
103
+ execSync('npm install -g @anthropic/claude-cli', { stdio: 'inherit' });
104
+ spinner.succeed('Claude CLI installed');
105
+ } else {
106
+ console.log(chalk.green('āœ“ Claude CLI already installed'));
107
+ }
108
+
109
+ // Step 2: Install Chrome (if needed and not skipped)
110
+ if (!options.skipChrome && !this.isChromeInstalled()) {
111
+ spinner.start('Installing Google Chrome...');
112
+ await this.installChrome();
113
+ spinner.succeed('Chrome installed');
114
+ }
115
+
116
+ // Step 3: Install MCP tools (if not skipped)
117
+ if (!options.skipMcp) {
118
+ await this.installMcpTools({});
119
+ }
120
+
121
+ // Step 4: Configure agents (if not skipped)
122
+ if (!options.skipAgents) {
123
+ await this.configureAgents({ profile: 'fullstack' });
124
+ }
125
+
126
+ // Step 5: Setup Claude configuration
127
+ spinner.start('Configuring Claude settings...');
128
+ await this.setupClaudeConfig();
129
+ spinner.succeed('Claude configured');
130
+
131
+ console.log(chalk.green.bold('\nāœ… Claude ecosystem setup complete!\n'));
132
+ this.printNextSteps();
133
+ } catch (error) {
134
+ spinner.fail('Setup failed');
135
+ console.error(chalk.red(error));
136
+ process.exit(1);
137
+ }
138
+ }
139
+
140
+ private async installMcpTools(options: any): Promise<void> {
141
+ const spinner = ora();
142
+ const scriptPath = path.join(
143
+ __dirname,
144
+ '../../../../scripts/install-mcp-tools.sh'
145
+ );
146
+
147
+ if (!fs.existsSync(scriptPath)) {
148
+ console.error(chalk.red('āŒ MCP tools installation script not found'));
149
+ console.log(
150
+ chalk.yellow('Please ensure the script exists at: ' + scriptPath)
151
+ );
152
+ return;
153
+ }
154
+
155
+ console.log(chalk.cyan('\nšŸ“¦ Installing MCP Tools...\n'));
156
+
157
+ if (options.tool) {
158
+ // Install specific tool
159
+ spinner.start(`Installing ${options.tool} MCP...`);
160
+ try {
161
+ const installCommands: Record<string, string> = {
162
+ firecrawl: 'npx claude mcp add firecrawl npx @firecrawl/mcp-server',
163
+ context7: 'npx claude mcp add context7 npx @context7/mcp-server',
164
+ playwright:
165
+ 'npx claude mcp add playwright npx @playwright/mcp-server',
166
+ browser: 'npx claude mcp add browser npx @browser/mcp-server',
167
+ sequentialthinking:
168
+ 'npm install -g @modelcontextprotocol/server-sequentialthinking',
169
+ };
170
+
171
+ const command = installCommands[options.tool];
172
+ if (command) {
173
+ execSync(command, { stdio: 'inherit' });
174
+ spinner.succeed(`${options.tool} MCP installed`);
175
+ } else {
176
+ spinner.fail(`Unknown tool: ${options.tool}`);
177
+ }
178
+ } catch (error) {
179
+ spinner.fail(`Failed to install ${options.tool}`);
180
+ console.error(error);
181
+ }
182
+ } else {
183
+ // Install all tools using the script
184
+ console.log(
185
+ chalk.gray('Running comprehensive MCP tools installation...')
186
+ );
187
+
188
+ const install = spawn('bash', [scriptPath], {
189
+ stdio: 'inherit',
190
+ shell: true,
191
+ });
192
+
193
+ return new Promise((resolve, reject) => {
194
+ install.on('close', code => {
195
+ if (code === 0) {
196
+ console.log(
197
+ chalk.green('\nāœ… All MCP tools installed successfully')
198
+ );
199
+ resolve();
200
+ } else {
201
+ reject(new Error(`Installation failed with code ${code}`));
202
+ }
203
+ });
204
+ });
205
+ }
206
+ }
207
+
208
+ private async configureAgents(options: any): Promise<void> {
209
+ const spinner = ora();
210
+
211
+ if (options.list) {
212
+ this.listAgents();
213
+ return;
214
+ }
215
+
216
+ spinner.start('Configuring Claude Flow agents...');
217
+
218
+ const agents = options.enable
219
+ ? options.enable.split(',')
220
+ : this.getProfileAgents(options.profile || 'fullstack');
221
+
222
+ // Create agent configurations
223
+ const homeDir = process.env.HOME || process.env.USERPROFILE || '';
224
+ const agentsDir = path.join(homeDir, '.claude', 'agents');
225
+
226
+ try {
227
+ fs.mkdirSync(agentsDir, { recursive: true });
228
+
229
+ for (const agent of agents) {
230
+ const config = this.generateAgentConfig(agent);
231
+ fs.writeFileSync(
232
+ path.join(agentsDir, `${agent}.json`),
233
+ JSON.stringify(config, null, 2)
234
+ );
235
+ }
236
+
237
+ spinner.succeed(`${agents.length} agents configured`);
238
+ } catch (error) {
239
+ spinner.fail('Failed to configure agents');
240
+ console.error(error);
241
+ }
242
+ }
243
+
244
+ private async validateInstallation(options: any): Promise<void> {
245
+ console.log(chalk.cyan('\nšŸ” Validating Claude Installation...\n'));
246
+
247
+ const checks = [
248
+ { name: 'Claude CLI', check: () => this.isClaudeInstalled() },
249
+ { name: 'Claude Flow', check: () => this.isClaudeFlowInstalled() },
250
+ { name: 'Chrome Browser', check: () => this.isChromeInstalled() },
251
+ { name: 'Claude Directory', check: () => this.claudeDirExists() },
252
+ { name: 'Agent Configurations', check: () => this.agentsConfigured() },
253
+ { name: 'MCP Servers', check: () => this.mcpServersConfigured() },
254
+ ];
255
+
256
+ let allPassed = true;
257
+
258
+ for (const check of checks) {
259
+ const passed = check.check();
260
+ if (passed) {
261
+ console.log(chalk.green(`āœ“ ${check.name}`));
262
+ } else {
263
+ console.log(chalk.red(`āœ— ${check.name}`));
264
+ allPassed = false;
265
+ }
266
+ }
267
+
268
+ if (allPassed) {
269
+ console.log(chalk.green.bold('\nāœ… All checks passed!'));
270
+ } else if (options.fix) {
271
+ console.log(chalk.yellow('\nšŸ”§ Attempting to fix issues...'));
272
+ await this.runCompleteSetup({});
273
+ } else {
274
+ console.log(
275
+ chalk.yellow(
276
+ '\nāš ļø Some checks failed. Run with --fix to attempt repairs.'
277
+ )
278
+ );
279
+ }
280
+ }
281
+
282
+ private async installChromeExtension(): Promise<void> {
283
+ console.log(chalk.cyan('\nšŸ”Œ Browser MCP Chrome Extension Setup\n'));
284
+
285
+ const homeDir = process.env.HOME || process.env.USERPROFILE || '';
286
+ const extensionDir = path.join(homeDir, '.claude', 'browser-extension');
287
+
288
+ console.log(chalk.white('Extension location: ' + extensionDir));
289
+ console.log(chalk.yellow('\nTo install:'));
290
+ console.log('1. Open Chrome and navigate to chrome://extensions');
291
+ console.log('2. Enable "Developer mode" (top right)');
292
+ console.log('3. Click "Load unpacked"');
293
+ console.log(`4. Select: ${extensionDir}`);
294
+ console.log('\nāœ… The extension will then be active!');
295
+ }
296
+
297
+ private async setupOptimizations(options: any): Promise<void> {
298
+ const spinner = ora();
299
+ console.log(
300
+ chalk.cyan.bold('\n⚔ Claude Code Hardware-Adaptive Optimization Setup\n')
301
+ );
302
+
303
+ try {
304
+ const homeDir = process.env.HOME || process.env.USERPROFILE || '';
305
+ const scriptsDir = path.join(homeDir, '.claude', 'scripts');
306
+ const resourcesDir = path.join(
307
+ __dirname,
308
+ '../../../computer-setup/resources/scripts'
309
+ );
310
+
311
+ // Check if optimization scripts already exist
312
+ const scriptsExist = fs.existsSync(scriptsDir);
313
+ if (scriptsExist && !options.force) {
314
+ const { overwrite } = await (
315
+ await import('inquirer')
316
+ ).default.prompt([
317
+ {
318
+ type: 'confirm',
319
+ name: 'overwrite',
320
+ message:
321
+ 'Optimization scripts already exist. Do you want to reinstall?',
322
+ default: false,
323
+ },
324
+ ]);
325
+
326
+ if (!overwrite) {
327
+ console.log(chalk.yellow('Optimization setup cancelled'));
328
+ return;
329
+ }
330
+ }
331
+
332
+ // Step 1: Create scripts directory
333
+ spinner.start('Creating scripts directory...');
334
+ fs.mkdirSync(scriptsDir, { recursive: true });
335
+ spinner.succeed('Scripts directory ready');
336
+
337
+ // Step 2: Copy optimization scripts
338
+ spinner.start('Installing optimization scripts...');
339
+
340
+ if (!fs.existsSync(resourcesDir)) {
341
+ spinner.fail('Optimization scripts not found in resources');
342
+ console.error(
343
+ chalk.red(
344
+ `Expected scripts at: ${resourcesDir}\nPlease ensure @wundr/computer-setup is installed.`
345
+ )
346
+ );
347
+ return;
348
+ }
349
+
350
+ // Copy all scripts
351
+ const scripts = [
352
+ 'detect-hardware-limits.js',
353
+ 'claude-optimized',
354
+ 'orchestrator.js',
355
+ 'cleanup-zombies.sh',
356
+ 'README-ORCHESTRATION.md',
357
+ 'QUICK-START.md',
358
+ ];
359
+
360
+ for (const script of scripts) {
361
+ const src = path.join(resourcesDir, script);
362
+ const dest = path.join(scriptsDir, script);
363
+
364
+ if (fs.existsSync(src)) {
365
+ fs.copyFileSync(src, dest);
366
+ } else {
367
+ console.warn(chalk.yellow(`āš ļø Script not found: ${script}`));
368
+ }
369
+ }
370
+
371
+ // Make executable scripts executable
372
+ const executableScripts = ['claude-optimized', 'cleanup-zombies.sh'];
373
+ for (const script of executableScripts) {
374
+ const scriptPath = path.join(scriptsDir, script);
375
+ if (fs.existsSync(scriptPath)) {
376
+ execSync(`chmod +x "${scriptPath}"`, { stdio: 'pipe' });
377
+ }
378
+ }
379
+
380
+ spinner.succeed('Optimization scripts installed');
381
+
382
+ // Step 3: Configure shell
383
+ spinner.start('Configuring shell environment...');
384
+ await this.addOptimizationToShell(homeDir);
385
+ spinner.succeed('Shell configuration updated');
386
+
387
+ console.log(chalk.green.bold('\nāœ… Optimization setup complete!\n'));
388
+
389
+ // Show what was installed
390
+ console.log(chalk.cyan('šŸ“¦ Installed Scripts:'));
391
+ console.log(
392
+ chalk.white(' • detect-hardware-limits.js - Hardware detection')
393
+ );
394
+ console.log(
395
+ chalk.white(' • claude-optimized - Optimized Claude wrapper')
396
+ );
397
+ console.log(
398
+ chalk.white(' • orchestrator.js - Fault-tolerant orchestration')
399
+ );
400
+ console.log(
401
+ chalk.white(' • cleanup-zombies.sh - Process cleanup utility')
402
+ );
403
+
404
+ console.log(chalk.cyan('\nšŸ”§ Shell Aliases:'));
405
+ console.log(
406
+ chalk.white(' • claude - Hardware-optimized Claude wrapper')
407
+ );
408
+ console.log(chalk.white(' • claude-stats - Show hardware statistics'));
409
+ console.log(chalk.white(' • claude-cleanup - Clean up zombie processes'));
410
+ console.log(
411
+ chalk.white(' • claude-orchestrate - Run multi-task orchestrator')
412
+ );
413
+
414
+ console.log(chalk.cyan('\nšŸ“ Next Steps:'));
415
+ console.log('1. Restart your terminal (or run: source ~/.zshrc)');
416
+ console.log('2. Run "claude-stats" to see your hardware configuration');
417
+ console.log('3. Use "claude" command as normal - now optimized!');
418
+ console.log(
419
+ '4. Read ~/.claude/scripts/QUICK-START.md for advanced usage'
420
+ );
421
+ } catch (error) {
422
+ spinner.fail('Optimization setup failed');
423
+ console.error(chalk.red(error));
424
+ throw error;
425
+ }
426
+ }
427
+
428
+ private async addOptimizationToShell(homeDir: string): Promise<void> {
429
+ const shellConfigs = [
430
+ path.join(homeDir, '.zshrc'),
431
+ path.join(homeDir, '.bashrc'),
432
+ ];
433
+
434
+ const optimizationConfig = `
435
+ # ═══════════════════════════════════════════════════════════════════════════
436
+ # Claude Code - Hardware-Adaptive Configuration (Auto-generated by Wundr)
437
+ # ═══════════════════════════════════════════════════════════════════════════
438
+
439
+ # Ensure PATH includes usr/local/bin
440
+ export PATH="/usr/local/bin:$PATH"
441
+
442
+ # Hardware-adaptive V8 memory configuration
443
+ if [ -f "$HOME/.claude/scripts/detect-hardware-limits.js" ]; then
444
+ eval "$(node $HOME/.claude/scripts/detect-hardware-limits.js export 2>/dev/null)"
445
+ fi
446
+
447
+ # Alias 'claude' to use hardware-optimized wrapper
448
+ if [ -f "$HOME/.claude/scripts/claude-optimized" ]; then
449
+ alias claude="$HOME/.claude/scripts/claude-optimized"
450
+ else
451
+ # Fallback to standard claude if optimization scripts not available
452
+ alias claude='npx @anthropic-ai/claude-code'
453
+ fi
454
+
455
+ # Convenience aliases for Claude optimization tools
456
+ alias claude-stats='node $HOME/.claude/scripts/detect-hardware-limits.js 2>/dev/null'
457
+ alias claude-cleanup='$HOME/.claude/scripts/cleanup-zombies.sh 2>/dev/null'
458
+ alias claude-orchestrate='node $HOME/.claude/scripts/orchestrator.js'
459
+
460
+ # ═══════════════════════════════════════════════════════════════════════════
461
+ `;
462
+
463
+ for (const configFile of shellConfigs) {
464
+ if (fs.existsSync(configFile)) {
465
+ const content = fs.readFileSync(configFile, 'utf8');
466
+
467
+ // Check if optimization config already exists
468
+ if (
469
+ content.includes(
470
+ 'Claude Code - Hardware-Adaptive Configuration (Auto-generated by Wundr)'
471
+ )
472
+ ) {
473
+ // Remove old config and add new one
474
+ const lines = content.split('\n');
475
+ const startIdx = lines.findIndex(line =>
476
+ line.includes(
477
+ 'Claude Code - Hardware-Adaptive Configuration (Auto-generated by Wundr)'
478
+ )
479
+ );
480
+
481
+ if (startIdx !== -1) {
482
+ // Find the end of the config block
483
+ let endIdx = startIdx;
484
+ for (let i = startIdx + 1; i < lines.length; i++) {
485
+ if (lines[i]?.includes('═══════════════')) {
486
+ endIdx = i;
487
+ break;
488
+ }
489
+ }
490
+
491
+ // Remove old config
492
+ lines.splice(startIdx - 1, endIdx - startIdx + 3);
493
+ const newContent = lines.join('\n');
494
+ fs.writeFileSync(configFile, newContent + optimizationConfig);
495
+ }
496
+ } else {
497
+ // Add new config
498
+ fs.appendFileSync(configFile, optimizationConfig);
499
+ }
500
+ }
501
+ }
502
+ }
503
+
504
+ private async installChrome(): Promise<void> {
505
+ if (process.platform === 'darwin') {
506
+ execSync(
507
+ 'curl -L -o ~/Downloads/googlechrome.dmg "https://dl.google.com/chrome/mac/stable/GGRO/googlechrome.dmg"'
508
+ );
509
+ execSync('hdiutil attach ~/Downloads/googlechrome.dmg');
510
+ execSync(
511
+ 'cp -R "/Volumes/Google Chrome/Google Chrome.app" /Applications/'
512
+ );
513
+ execSync('hdiutil detach "/Volumes/Google Chrome"');
514
+ execSync('rm ~/Downloads/googlechrome.dmg');
515
+ } else {
516
+ console.log(
517
+ chalk.yellow('Chrome installation is only automated for macOS')
518
+ );
519
+ }
520
+ }
521
+
522
+ private async setupClaudeConfig(): Promise<void> {
523
+ const homeDir = process.env.HOME || process.env.USERPROFILE || '';
524
+ const configPath = path.join(homeDir, '.claude', 'settings.json');
525
+
526
+ const config = {
527
+ claudeCodeOptions: {
528
+ enabledMcpjsonServers: [
529
+ 'claude-flow',
530
+ 'firecrawl',
531
+ 'context7',
532
+ 'playwright',
533
+ 'browser',
534
+ 'sequentialthinking',
535
+ ],
536
+ gitAutoCompact: true,
537
+ contextCompactionThreshold: 100000,
538
+ enableHooks: true,
539
+ enableAgentCoordination: true,
540
+ enableNeuralTraining: true,
541
+ enablePerformanceTracking: true,
542
+ },
543
+ };
544
+
545
+ fs.mkdirSync(path.dirname(configPath), { recursive: true });
546
+ fs.writeFileSync(configPath, JSON.stringify(config, null, 2));
547
+ }
548
+
549
+ private isClaudeInstalled(): boolean {
550
+ try {
551
+ execSync('claude --version', { stdio: 'ignore' });
552
+ return true;
553
+ } catch {
554
+ return false;
555
+ }
556
+ }
557
+
558
+ private isClaudeFlowInstalled(): boolean {
559
+ try {
560
+ execSync('npx claude-flow@alpha --version', { stdio: 'ignore' });
561
+ return true;
562
+ } catch {
563
+ return false;
564
+ }
565
+ }
566
+
567
+ private isChromeInstalled(): boolean {
568
+ if (process.platform === 'darwin') {
569
+ return fs.existsSync('/Applications/Google Chrome.app');
570
+ }
571
+ return true; // Assume installed on other platforms
572
+ }
573
+
574
+ private claudeDirExists(): boolean {
575
+ const homeDir = process.env.HOME || process.env.USERPROFILE || '';
576
+ return fs.existsSync(path.join(homeDir, '.claude'));
577
+ }
578
+
579
+ private agentsConfigured(): boolean {
580
+ const homeDir = process.env.HOME || process.env.USERPROFILE || '';
581
+ const agentsDir = path.join(homeDir, '.claude', 'agents');
582
+ if (!fs.existsSync(agentsDir)) return false;
583
+
584
+ const files = fs.readdirSync(agentsDir);
585
+ return files.length > 0;
586
+ }
587
+
588
+ private mcpServersConfigured(): boolean {
589
+ const homeDir = process.env.HOME || process.env.USERPROFILE || '';
590
+ const settingsPath = path.join(homeDir, '.claude', 'settings.json');
591
+
592
+ if (!fs.existsSync(settingsPath)) return false;
593
+
594
+ try {
595
+ const settings = JSON.parse(fs.readFileSync(settingsPath, 'utf8'));
596
+ return settings.claudeCodeOptions?.enabledMcpjsonServers?.length > 0;
597
+ } catch {
598
+ return false;
599
+ }
600
+ }
601
+
602
+ private listAgents(): void {
603
+ console.log(chalk.cyan('\nšŸ“‹ Available Claude Flow Agents:\n'));
604
+
605
+ const categories = {
606
+ 'Core Development': [
607
+ 'coder',
608
+ 'reviewer',
609
+ 'tester',
610
+ 'planner',
611
+ 'researcher',
612
+ ],
613
+ 'Swarm Coordination': [
614
+ 'hierarchical-coordinator',
615
+ 'mesh-coordinator',
616
+ 'adaptive-coordinator',
617
+ ],
618
+ 'GitHub Integration': [
619
+ 'github-modes',
620
+ 'pr-manager',
621
+ 'issue-tracker',
622
+ 'release-manager',
623
+ ],
624
+ Specialized: [
625
+ 'backend-dev',
626
+ 'mobile-dev',
627
+ 'ml-developer',
628
+ 'system-architect',
629
+ ],
630
+ };
631
+
632
+ for (const [category, agents] of Object.entries(categories)) {
633
+ console.log(chalk.yellow(`${category}:`));
634
+ agents.forEach(agent => console.log(` • ${agent}`));
635
+ console.log();
636
+ }
637
+ }
638
+
639
+ private getProfileAgents(profile: string): string[] {
640
+ const profileAgents: Record<string, string[]> = {
641
+ frontend: ['coder', 'reviewer', 'tester', 'mobile-dev'],
642
+ backend: [
643
+ 'coder',
644
+ 'reviewer',
645
+ 'tester',
646
+ 'backend-dev',
647
+ 'system-architect',
648
+ ],
649
+ fullstack: [
650
+ 'coder',
651
+ 'reviewer',
652
+ 'tester',
653
+ 'planner',
654
+ 'researcher',
655
+ 'system-architect',
656
+ ],
657
+ devops: ['planner', 'cicd-engineer', 'perf-analyzer', 'github-modes'],
658
+ };
659
+
660
+ return (
661
+ profileAgents[profile] ||
662
+ profileAgents.fullstack || ['coder', 'reviewer', 'tester']
663
+ );
664
+ }
665
+
666
+ private generateAgentConfig(agentName: string): any {
667
+ return {
668
+ name: agentName,
669
+ enabled: true,
670
+ description: `${agentName} agent for Claude Flow`,
671
+ configuration: {
672
+ maxTokens: 8000,
673
+ temperature: 0.7,
674
+ topP: 0.9,
675
+ enableMemory: true,
676
+ enableLearning: true,
677
+ },
678
+ };
679
+ }
680
+
681
+ private printNextSteps(): void {
682
+ console.log(chalk.cyan('šŸ“‹ Next Steps:'));
683
+ console.log('1. Configure API keys for MCP tools (if needed)');
684
+ console.log(
685
+ '2. Install Browser MCP Chrome extension: wundr claude-setup extension'
686
+ );
687
+ console.log('3. Restart Claude Desktop to load new configurations');
688
+ console.log('4. Initialize a project: wundr claude-init');
689
+ console.log(
690
+ '5. Start coding with Claude Flow: npx claude-flow@alpha sparc tdd "feature"'
691
+ );
692
+ }
693
+ }
694
+
695
+ const createClaudeSetupCommands = (program: Command) =>
696
+ new ClaudeSetupCommands(program);
697
+ export default createClaudeSetupCommands;