@lenne.tech/cli 1.6.3 → 1.6.5

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.
@@ -9,192 +9,10 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
9
9
  });
10
10
  };
11
11
  Object.defineProperty(exports, "__esModule", { value: true });
12
- const child_process_1 = require("child_process");
13
- const fs_1 = require("fs");
14
- const os_1 = require("os");
15
- const path_1 = require("path");
16
- const MARKETPLACES = [
17
- {
18
- apiBase: 'https://api.github.com/repos/lenneTech/claude-code/contents',
19
- name: 'lenne-tech',
20
- rawBase: 'https://raw.githubusercontent.com/lenneTech/claude-code/main',
21
- repo: 'lenneTech/claude-code',
22
- },
23
- {
24
- apiBase: 'https://api.github.com/repos/anthropics/claude-plugins-official/contents',
25
- name: 'claude-plugins-official',
26
- rawBase: 'https://raw.githubusercontent.com/anthropics/claude-plugins-official/main',
27
- repo: 'anthropics/claude-plugins-official',
28
- },
29
- ];
30
- /**
31
- * Default plugins to install when no specific plugins are requested
32
- * These are installed in addition to all plugins from the primary marketplace (lenne-tech)
33
- */
34
- const DEFAULT_EXTERNAL_PLUGINS = [
35
- { marketplaceName: 'claude-plugins-official', pluginName: 'typescript-lsp' },
36
- ];
37
- /**
38
- * Empty plugin contents constant (used for failed installations)
39
- */
40
- const EMPTY_PLUGIN_CONTENTS = {
41
- agents: [],
42
- commands: [],
43
- hooks: 0,
44
- mcpServers: [],
45
- permissions: [],
46
- skills: [],
47
- };
48
- /**
49
- * Fetch available plugins from all marketplaces
50
- */
51
- function fetchAvailablePlugins(spin) {
52
- return __awaiter(this, void 0, void 0, function* () {
53
- const spinner = spin('Fetching available plugins from marketplaces');
54
- try {
55
- // Fetch plugins from all marketplaces in parallel
56
- const results = yield Promise.all(MARKETPLACES.map(marketplace => fetchPluginsFromMarketplace(marketplace)));
57
- // Flatten results
58
- const plugins = results.flat();
59
- if (plugins.length === 0) {
60
- spinner.fail('No plugins found in any marketplace');
61
- throw new Error('No plugins found');
62
- }
63
- // Group by marketplace for display
64
- const byMarketplace = MARKETPLACES.map(m => ({
65
- count: plugins.filter(p => p.marketplaceName === m.name).length,
66
- name: m.name,
67
- })).filter(m => m.count > 0);
68
- const summary = byMarketplace.map(m => `${m.name}: ${m.count}`).join(', ');
69
- spinner.succeed(`Found ${plugins.length} plugins (${summary})`);
70
- return plugins;
71
- }
72
- catch (err) {
73
- spinner.fail('Failed to fetch plugins from marketplaces');
74
- throw err;
75
- }
76
- });
77
- }
78
- /**
79
- * Fetch available plugins from a single marketplace
80
- */
81
- function fetchPluginsFromMarketplace(marketplace) {
82
- return __awaiter(this, void 0, void 0, function* () {
83
- const plugins = [];
84
- try {
85
- // First try to read central marketplace.json (used by official marketplace)
86
- const marketplaceJsonUrl = `${marketplace.rawBase}/.claude-plugin/marketplace.json`;
87
- const marketplaceJsonResponse = yield fetch(marketplaceJsonUrl);
88
- if (marketplaceJsonResponse.ok) {
89
- try {
90
- const marketplaceManifest = yield marketplaceJsonResponse.json();
91
- if (marketplaceManifest.plugins && marketplaceManifest.plugins.length > 0) {
92
- for (const plugin of marketplaceManifest.plugins) {
93
- plugins.push({
94
- description: plugin.description || '',
95
- marketplaceName: marketplace.name,
96
- marketplaceRepo: marketplace.repo,
97
- pluginName: plugin.name,
98
- });
99
- }
100
- return plugins;
101
- }
102
- }
103
- catch (_a) {
104
- // Failed to parse marketplace.json, fall through to directory scan
105
- }
106
- }
107
- // Fallback: Get list of plugin directories and read individual plugin.json files
108
- const dirResponse = yield fetch(`${marketplace.apiBase}/plugins`);
109
- if (!dirResponse.ok) {
110
- return plugins;
111
- }
112
- const directories = yield dirResponse.json();
113
- const pluginDirs = directories.filter(d => d.type === 'dir');
114
- // Fetch plugin.json for each plugin in parallel
115
- const manifestPromises = pluginDirs.map((dir) => __awaiter(this, void 0, void 0, function* () {
116
- try {
117
- const manifestUrl = `${marketplace.rawBase}/plugins/${dir.name}/.claude-plugin/plugin.json`;
118
- const manifestResponse = yield fetch(manifestUrl);
119
- if (manifestResponse.ok) {
120
- const manifest = yield manifestResponse.json();
121
- return {
122
- description: manifest.description,
123
- marketplaceName: marketplace.name,
124
- marketplaceRepo: marketplace.repo,
125
- pluginName: manifest.name,
126
- };
127
- }
128
- }
129
- catch (_a) {
130
- // Skip plugins without valid manifest
131
- }
132
- return null;
133
- }));
134
- const results = yield Promise.all(manifestPromises);
135
- plugins.push(...results.filter((p) => p !== null));
136
- }
137
- catch (_b) {
138
- // Marketplace fetch failed, return empty array
139
- }
140
- return plugins;
141
- });
142
- }
143
- /**
144
- * Find the claude CLI executable path
145
- */
146
- function findClaudeCli() {
147
- const possiblePaths = [
148
- (0, path_1.join)((0, os_1.homedir)(), '.claude', 'local', 'claude'),
149
- '/usr/local/bin/claude',
150
- '/usr/bin/claude',
151
- ];
152
- for (const p of possiblePaths) {
153
- if ((0, fs_1.existsSync)(p)) {
154
- return p;
155
- }
156
- }
157
- try {
158
- const result = (0, child_process_1.execSync)('which claude', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });
159
- const path = result.trim();
160
- if (path && (0, fs_1.existsSync)(path)) {
161
- return path;
162
- }
163
- }
164
- catch (_a) {
165
- // Ignore errors
166
- }
167
- return null;
168
- }
169
- /**
170
- * Recursively find all .md files in a directory
171
- */
172
- function findMarkdownFiles(dir, basePath = '') {
173
- const results = [];
174
- if (!(0, fs_1.existsSync)(dir))
175
- return results;
176
- try {
177
- const entries = (0, fs_1.readdirSync)(dir, { withFileTypes: true });
178
- for (const entry of entries) {
179
- const fullPath = (0, path_1.join)(dir, entry.name);
180
- const relativePath = basePath ? `${basePath}/${entry.name}` : entry.name;
181
- if (entry.isDirectory()) {
182
- results.push(...findMarkdownFiles(fullPath, relativePath));
183
- }
184
- else if (entry.isFile() && entry.name.endsWith('.md')) {
185
- // Convert path to command name (e.g., "git/commit-message.md" -> "/git:commit-message")
186
- const commandName = relativePath
187
- .replace(/\.md$/, '')
188
- .replace(/\//g, ':');
189
- results.push(`/${commandName}`);
190
- }
191
- }
192
- }
193
- catch (_a) {
194
- // Ignore errors
195
- }
196
- return results;
197
- }
12
+ const claude_cli_1 = require("../../lib/claude-cli");
13
+ const marketplace_1 = require("../../lib/marketplace");
14
+ const plugin_utils_1 = require("../../lib/plugin-utils");
15
+ const shell_config_1 = require("../../lib/shell-config");
198
16
  /**
199
17
  * Install a single plugin (marketplace must already be added and updated)
200
18
  */
@@ -204,7 +22,7 @@ function installPlugin(plugin, cli, toolbox) {
204
22
  // Step 1: Install or update plugin
205
23
  const fullPluginName = `${plugin.pluginName}@${plugin.marketplaceName}`;
206
24
  const pluginSpinner = spin(`Installing/updating ${plugin.pluginName}`);
207
- const installResult = runClaudeCommand(cli, `plugin install ${fullPluginName}`);
25
+ const installResult = (0, claude_cli_1.runClaudeCommand)(cli, `plugin install ${fullPluginName}`);
208
26
  let pluginAction = 'installed';
209
27
  if (installResult.output.includes('already') || installResult.output.includes('up to date')) {
210
28
  pluginAction = 'up to date';
@@ -222,10 +40,10 @@ function installPlugin(plugin, cli, toolbox) {
222
40
  info('Manual installation:');
223
41
  info(` /plugin marketplace add ${plugin.marketplaceRepo}`);
224
42
  info(` /plugin install ${fullPluginName}`);
225
- return { action: 'failed', contents: EMPTY_PLUGIN_CONTENTS, success: false };
43
+ return { action: 'failed', contents: plugin_utils_1.EMPTY_PLUGIN_CONTENTS, postInstall: null, success: false };
226
44
  }
227
45
  // Step 2: Read plugin contents
228
- const pluginContents = readPluginContents(plugin.marketplaceName, plugin.pluginName);
46
+ const pluginContents = (0, plugin_utils_1.readPluginContents)(plugin.marketplaceName, plugin.pluginName);
229
47
  // Warn if plugin seems empty (but not for LSP plugins which don't have skills/commands)
230
48
  const isLspPlugin = plugin.pluginName.endsWith('-lsp');
231
49
  if (!isLspPlugin && pluginContents.skills.length === 0 && pluginContents.commands.length === 0) {
@@ -235,7 +53,7 @@ function installPlugin(plugin, cli, toolbox) {
235
53
  // Step 3: Setup permissions
236
54
  if (pluginContents.permissions.length > 0) {
237
55
  const permSpinner = spin(`Configuring permissions for ${plugin.pluginName}`);
238
- const permResult = setupPermissions(pluginContents.permissions, error);
56
+ const permResult = (0, plugin_utils_1.setupPermissions)(pluginContents.permissions, error);
239
57
  if (permResult.success) {
240
58
  if (permResult.added.length > 0) {
241
59
  permSpinner.succeed(`Permissions configured for ${plugin.pluginName} (${permResult.added.length} added)`);
@@ -251,7 +69,9 @@ function installPlugin(plugin, cli, toolbox) {
251
69
  info(JSON.stringify({ permissions: { allow: pluginContents.permissions } }, null, 2));
252
70
  }
253
71
  }
254
- return { action: pluginAction, contents: pluginContents, success: true };
72
+ // Step 4: Process post-installation requirements (for LSP plugins, etc.)
73
+ const postInstallResult = (0, plugin_utils_1.processPostInstall)(plugin.pluginName, toolbox);
74
+ return { action: pluginAction, contents: pluginContents, postInstall: postInstallResult, success: true };
255
75
  });
256
76
  }
257
77
  /**
@@ -269,22 +89,26 @@ function prepareMarketplaces(plugins, cli, toolbox) {
269
89
  }
270
90
  const preparedMarketplaces = new Set();
271
91
  for (const [marketplaceName, plugin] of marketplaceMap) {
272
- // Add marketplace
273
- const addSpinner = spin(`Adding marketplace ${marketplaceName}`);
274
- const addResult = runClaudeCommand(cli, `plugin marketplace add ${plugin.marketplaceRepo}`);
275
- if (addResult.success || addResult.output.includes('already')) {
276
- addSpinner.succeed(`Marketplace ${marketplaceName} added`);
277
- }
278
- else {
279
- addSpinner.fail(`Failed to add marketplace ${marketplaceName}`);
280
- error(addResult.output);
281
- continue;
92
+ // Check if marketplace already exists
93
+ const marketplaceExists = (0, claude_cli_1.checkMarketplaceExists)(marketplaceName);
94
+ // Add marketplace only if it doesn't exist yet
95
+ if (!marketplaceExists) {
96
+ const addSpinner = spin(`Adding marketplace ${marketplaceName}`);
97
+ const addResult = (0, claude_cli_1.runClaudeCommand)(cli, `plugin marketplace add ${plugin.marketplaceRepo}`);
98
+ if (addResult.success || addResult.output.includes('already')) {
99
+ addSpinner.succeed(`Marketplace ${marketplaceName} added`);
100
+ }
101
+ else {
102
+ addSpinner.fail(`Failed to add marketplace ${marketplaceName}`);
103
+ error(addResult.output);
104
+ continue;
105
+ }
282
106
  }
283
- // Update marketplace cache
284
- const updateSpinner = spin(`Updating marketplace cache for ${marketplaceName}`);
285
- const updateResult = runClaudeCommand(cli, `plugin marketplace update ${marketplaceName}`);
107
+ // Always update marketplace cache to get latest plugin versions
108
+ const updateSpinner = spin(`Updating ${marketplaceName} cache`);
109
+ const updateResult = (0, claude_cli_1.runClaudeCommand)(cli, `plugin marketplace update ${marketplaceName}`);
286
110
  if (updateResult.success) {
287
- updateSpinner.succeed(`Marketplace ${marketplaceName} cache updated`);
111
+ updateSpinner.succeed(`${marketplaceName} cache updated`);
288
112
  }
289
113
  else {
290
114
  updateSpinner.stopAndPersist({ symbol: '⚠', text: `Could not update ${marketplaceName} cache, using cached version` });
@@ -293,225 +117,40 @@ function prepareMarketplaces(plugins, cli, toolbox) {
293
117
  }
294
118
  return preparedMarketplaces;
295
119
  }
296
- /**
297
- * Print plugin summary
298
- */
299
- function printPluginSummary(pluginName, contents, info) {
300
- const isLspPlugin = pluginName.endsWith('-lsp');
301
- const hasContent = contents.skills.length > 0 || contents.commands.length > 0 || contents.agents.length > 0;
302
- if (hasContent || isLspPlugin) {
303
- info('');
304
- info(`${pluginName}:`);
305
- // Show LSP indicator for LSP plugins
306
- if (isLspPlugin) {
307
- info(` Type: Language Server (LSP)`);
308
- }
309
- // Alphabetical order: Agents, Commands, Hooks, MCP Servers, Skills
310
- if (contents.agents.length > 0) {
311
- info(` Agents (${contents.agents.length}): ${contents.agents.join(', ')}`);
312
- }
313
- if (contents.commands.length > 0) {
314
- const maxShow = 5;
315
- const shown = contents.commands.slice(0, maxShow);
316
- const remaining = contents.commands.length - maxShow;
317
- const commandsStr = remaining > 0
318
- ? `${shown.join(', ')} and ${remaining} more`
319
- : shown.join(', ');
320
- info(` Commands (${contents.commands.length}): ${commandsStr}`);
321
- }
322
- if (contents.hooks > 0) {
323
- info(` Hooks: ${contents.hooks} auto-detection hooks`);
324
- }
325
- if (contents.mcpServers.length > 0) {
326
- info(` MCP Servers (${contents.mcpServers.length}): ${contents.mcpServers.join(', ')}`);
327
- }
328
- if (contents.skills.length > 0) {
329
- info(` Skills (${contents.skills.length}): ${contents.skills.join(', ')}`);
330
- }
331
- }
332
- }
333
- /**
334
- * Read plugin contents from installed plugin directory
335
- */
336
- function readPluginContents(marketplaceName, pluginName) {
337
- const pluginDir = (0, path_1.join)((0, os_1.homedir)(), '.claude', 'plugins', 'marketplaces', marketplaceName, 'plugins', pluginName);
338
- const result = {
339
- agents: [],
340
- commands: [],
341
- hooks: 0,
342
- mcpServers: [],
343
- permissions: [],
344
- skills: [],
345
- };
346
- // Read skills
347
- const skillsDir = (0, path_1.join)(pluginDir, 'skills');
348
- if ((0, fs_1.existsSync)(skillsDir)) {
349
- try {
350
- result.skills = (0, fs_1.readdirSync)(skillsDir, { withFileTypes: true })
351
- .filter(dirent => dirent.isDirectory())
352
- .map(dirent => dirent.name);
353
- }
354
- catch (_a) {
355
- // Ignore
356
- }
357
- }
358
- // Read agents
359
- const agentsDir = (0, path_1.join)(pluginDir, 'agents');
360
- if ((0, fs_1.existsSync)(agentsDir)) {
361
- try {
362
- result.agents = (0, fs_1.readdirSync)(agentsDir, { withFileTypes: true })
363
- .filter(dirent => dirent.isFile() && dirent.name.endsWith('.md'))
364
- .map(dirent => dirent.name.replace(/\.md$/, ''));
365
- }
366
- catch (_b) {
367
- // Ignore
368
- }
369
- }
370
- // Read commands
371
- const commandsDir = (0, path_1.join)(pluginDir, 'commands');
372
- result.commands = findMarkdownFiles(commandsDir);
373
- // Read hooks
374
- const hooksPath = (0, path_1.join)(pluginDir, 'hooks', 'hooks.json');
375
- if ((0, fs_1.existsSync)(hooksPath)) {
376
- try {
377
- const hooksContent = JSON.parse((0, fs_1.readFileSync)(hooksPath, 'utf-8'));
378
- // Count hooks across all event types
379
- for (const eventHooks of Object.values(hooksContent.hooks || {})) {
380
- if (Array.isArray(eventHooks)) {
381
- for (const hookGroup of eventHooks) {
382
- if (hookGroup.hooks && Array.isArray(hookGroup.hooks)) {
383
- result.hooks += hookGroup.hooks.length;
384
- }
385
- }
386
- }
387
- }
388
- }
389
- catch (_c) {
390
- // Ignore
391
- }
392
- }
393
- // Read MCP servers
394
- const mcpPath = (0, path_1.join)(pluginDir, '.mcp.json');
395
- if ((0, fs_1.existsSync)(mcpPath)) {
396
- try {
397
- const mcpContent = JSON.parse((0, fs_1.readFileSync)(mcpPath, 'utf-8'));
398
- if (mcpContent.mcpServers) {
399
- result.mcpServers = Object.keys(mcpContent.mcpServers);
400
- }
401
- }
402
- catch (_d) {
403
- // Ignore
404
- }
405
- }
406
- // Read permissions
407
- const permissionsPath = (0, path_1.join)(pluginDir, 'permissions.json');
408
- if ((0, fs_1.existsSync)(permissionsPath)) {
409
- try {
410
- const content = (0, fs_1.readFileSync)(permissionsPath, 'utf-8');
411
- const pluginPerms = JSON.parse(content);
412
- result.permissions = pluginPerms.permissions.map(p => p.pattern);
413
- }
414
- catch (_e) {
415
- // Ignore
416
- }
417
- }
418
- return result;
419
- }
420
- /**
421
- * Execute a claude CLI command
422
- */
423
- function runClaudeCommand(cli, args) {
424
- try {
425
- const result = (0, child_process_1.spawnSync)(cli, args.split(' '), {
426
- encoding: 'utf-8',
427
- shell: true,
428
- stdio: ['pipe', 'pipe', 'pipe'],
429
- });
430
- return {
431
- output: result.stdout + result.stderr,
432
- success: result.status === 0,
433
- };
434
- }
435
- catch (err) {
436
- return {
437
- output: err.message,
438
- success: false,
439
- };
440
- }
441
- }
442
- /**
443
- * Setup permissions in settings.json
444
- * Only adds new permissions, does not remove existing ones
445
- * (User may have customized permissions that should be preserved)
446
- */
447
- function setupPermissions(requiredPermissions, error) {
448
- const settingsPath = (0, path_1.join)((0, os_1.homedir)(), '.claude', 'settings.json');
449
- try {
450
- // Read existing settings
451
- let settings = {};
452
- if ((0, fs_1.existsSync)(settingsPath)) {
453
- const content = (0, fs_1.readFileSync)(settingsPath, 'utf-8');
454
- settings = JSON.parse(content);
455
- }
456
- // Ensure permissions.allow exists
457
- if (!settings.permissions) {
458
- settings.permissions = {};
459
- }
460
- const perms = settings.permissions;
461
- if (!perms.allow) {
462
- perms.allow = [];
463
- }
464
- const currentAllowList = perms.allow;
465
- // Determine what to add
466
- const added = [];
467
- const existing = [];
468
- requiredPermissions.forEach(perm => {
469
- if (currentAllowList.includes(perm)) {
470
- existing.push(perm);
471
- }
472
- else {
473
- added.push(perm);
474
- }
475
- });
476
- // Add new permissions
477
- if (added.length > 0) {
478
- perms.allow = [...currentAllowList, ...added];
479
- (0, fs_1.writeFileSync)(settingsPath, JSON.stringify(settings, null, 2));
480
- }
481
- return { added, existing, success: true };
482
- }
483
- catch (err) {
484
- error(`Could not configure permissions: ${err.message}`);
485
- return { added: [], existing: [], success: false };
486
- }
487
- }
488
120
  /**
489
121
  * Install/update Claude Code Plugins
490
122
  */
491
123
  const PluginsCommand = {
492
124
  alias: ['p'],
493
125
  description: 'Install Claude Code plugins',
494
- hidden: false,
495
126
  name: 'plugins',
496
127
  run: (toolbox) => __awaiter(void 0, void 0, void 0, function* () {
497
- var _a;
128
+ var _a, _b;
498
129
  const { helper, parameters, print: { error, info, spin, success, warning }, system, } = toolbox;
499
130
  // Start timer
500
131
  const timer = system.startTimer();
132
+ // Check if claude CLI is available (before network requests)
133
+ const cli = (0, claude_cli_1.findClaudeCli)();
134
+ if (!cli) {
135
+ error('Claude CLI not found. Please install Claude Code first.');
136
+ info('');
137
+ info('Installation: https://docs.anthropic.com/en/docs/claude-code');
138
+ process.exit(1);
139
+ }
501
140
  // Fetch available plugins from GitHub
502
141
  let availablePlugins;
503
142
  try {
504
- availablePlugins = yield fetchAvailablePlugins(spin);
143
+ availablePlugins = yield (0, marketplace_1.fetchAvailablePlugins)(spin);
505
144
  }
506
145
  catch (err) {
507
146
  error(`Failed to fetch plugins: ${err.message}`);
508
147
  info('');
509
148
  info('Check your internet connection or try again later.');
510
- return process.exit(1);
149
+ process.exit(1);
511
150
  }
512
151
  if (availablePlugins.length === 0) {
513
152
  error('No plugins found in the repository.');
514
- return process.exit(1);
153
+ process.exit(1);
515
154
  }
516
155
  // Get plugin names from parameters (if provided)
517
156
  const requestedPlugins = ((_a = parameters.array) === null || _a === void 0 ? void 0 : _a.filter((p) => typeof p === 'string')) || [];
@@ -538,21 +177,18 @@ const PluginsCommand = {
538
177
  if (pluginsToInstall.length === 0) {
539
178
  error('No valid plugins to install.');
540
179
  info('');
541
- info('Available plugins:');
542
- availablePlugins.forEach(p => {
543
- info(` ${p.pluginName} - ${p.description}`);
544
- });
545
- return process.exit(1);
180
+ (0, marketplace_1.printAvailablePlugins)(availablePlugins, info);
181
+ process.exit(1);
546
182
  }
547
183
  info(`Installing ${pluginsToInstall.length} plugin${pluginsToInstall.length > 1 ? 's' : ''}: ${pluginsToInstall.map(p => p.pluginName).join(', ')}`);
548
184
  }
549
185
  else {
550
186
  // Install all plugins from primary marketplace (lenne-tech) plus default external plugins
551
- const primaryMarketplace = MARKETPLACES[0].name;
187
+ const primaryMarketplace = marketplace_1.MARKETPLACES[0].name;
552
188
  const primaryPlugins = availablePlugins.filter(p => p.marketplaceName === primaryMarketplace);
553
189
  // Add default external plugins
554
190
  const externalPlugins = [];
555
- for (const defaultPlugin of DEFAULT_EXTERNAL_PLUGINS) {
191
+ for (const defaultPlugin of marketplace_1.DEFAULT_EXTERNAL_PLUGINS) {
556
192
  const plugin = availablePlugins.find(p => p.pluginName === defaultPlugin.pluginName && p.marketplaceName === defaultPlugin.marketplaceName);
557
193
  if (plugin) {
558
194
  externalPlugins.push(plugin);
@@ -568,14 +204,6 @@ const PluginsCommand = {
568
204
  }
569
205
  }
570
206
  info('');
571
- // Check if claude CLI is available
572
- const cli = findClaudeCli();
573
- if (!cli) {
574
- error('Claude CLI not found. Please install Claude Code first.');
575
- info('');
576
- info('Installation: https://docs.anthropic.com/en/docs/claude-code');
577
- return process.exit(1);
578
- }
579
207
  // Prepare marketplaces (add and update cache once per marketplace)
580
208
  const preparedMarketplaces = prepareMarketplaces(pluginsToInstall, cli, toolbox);
581
209
  info('');
@@ -586,8 +214,9 @@ const PluginsCommand = {
586
214
  if (!preparedMarketplaces.has(plugin.marketplaceName)) {
587
215
  results.push({
588
216
  action: 'failed',
589
- contents: EMPTY_PLUGIN_CONTENTS,
217
+ contents: plugin_utils_1.EMPTY_PLUGIN_CONTENTS,
590
218
  plugin,
219
+ postInstall: null,
591
220
  success: false,
592
221
  });
593
222
  continue;
@@ -615,7 +244,7 @@ const PluginsCommand = {
615
244
  info('');
616
245
  info('Installed:');
617
246
  for (const result of successfulResults) {
618
- printPluginSummary(result.plugin.pluginName, result.contents, info);
247
+ (0, plugin_utils_1.printPluginSummary)(result.plugin.pluginName, result.contents, info);
619
248
  }
620
249
  }
621
250
  // Print failed installations
@@ -635,22 +264,45 @@ const PluginsCommand = {
635
264
  info(` ${name}`);
636
265
  }
637
266
  info('');
638
- info('Available plugins:');
639
- availablePlugins.forEach(p => {
640
- info(` ${p.pluginName} - ${p.description}`);
641
- });
267
+ (0, marketplace_1.printAvailablePlugins)(availablePlugins, info);
268
+ }
269
+ // Collect missing environment variables from all successful installations
270
+ const allMissingEnvVars = new Map();
271
+ for (const result of successfulResults) {
272
+ if ((_b = result.postInstall) === null || _b === void 0 ? void 0 : _b.envVarsMissing) {
273
+ for (const envVar of result.postInstall.envVarsMissing) {
274
+ if (!allMissingEnvVars.has(envVar.name)) {
275
+ allMissingEnvVars.set(envVar.name, envVar);
276
+ }
277
+ }
278
+ }
642
279
  }
280
+ // Handle missing environment variables
281
+ const envVarsResult = yield (0, plugin_utils_1.handleMissingEnvVars)(allMissingEnvVars, toolbox);
282
+ // Show next steps
643
283
  if (successCount > 0) {
644
284
  info('');
645
285
  info('Next:');
646
- info(' Restart Claude Code to activate the plugins');
286
+ if (envVarsResult.needed && !envVarsResult.configured) {
287
+ info(' 1. Set required environment variables (see above)');
288
+ info(' 2. Restart Claude Code to activate the plugins');
289
+ }
290
+ else if (envVarsResult.configured || allMissingEnvVars.size > 0) {
291
+ const shellConfig = (0, shell_config_1.getPreferredShellConfig)();
292
+ const sourceCmd = shellConfig ? `source ${shellConfig.path}` : 'source your shell config';
293
+ info(` 1. Restart your terminal or run: ${sourceCmd}`);
294
+ info(' 2. Restart Claude Code to activate the plugins');
295
+ }
296
+ else {
297
+ info(' Restart Claude Code to activate the plugins');
298
+ }
647
299
  }
648
300
  info('');
649
301
  if (!toolbox.parameters.options.fromGluegunMenu) {
650
302
  process.exit(totalIssues > 0 ? 1 : 0);
651
303
  }
652
- return 'plugins installed';
304
+ return `${successCount} plugin${successCount !== 1 ? 's' : ''} installed${totalIssues > 0 ? `, ${totalIssues} failed` : ''}`;
653
305
  }),
654
306
  };
655
307
  exports.default = PluginsCommand;
656
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9jbGF1ZGUvcGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUFBLGlEQUFvRDtBQUNwRCwyQkFBMEU7QUFFMUUsMkJBQTZCO0FBQzdCLCtCQUE0QjtBQWM1QixNQUFNLFlBQVksR0FBd0I7SUFDeEM7UUFDRSxPQUFPLEVBQUUsNkRBQTZEO1FBQ3RFLElBQUksRUFBRSxZQUFZO1FBQ2xCLE9BQU8sRUFBRSw4REFBOEQ7UUFDdkUsSUFBSSxFQUFFLHVCQUF1QjtLQUM5QjtJQUNEO1FBQ0UsT0FBTyxFQUFFLDBFQUEwRTtRQUNuRixJQUFJLEVBQUUseUJBQXlCO1FBQy9CLE9BQU8sRUFBRSwyRUFBMkU7UUFDcEYsSUFBSSxFQUFFLG9DQUFvQztLQUMzQztDQUNGLENBQUM7QUFFRjs7O0dBR0c7QUFDSCxNQUFNLHdCQUF3QixHQUEyRDtJQUN2RixFQUFFLGVBQWUsRUFBRSx5QkFBeUIsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUU7Q0FDN0UsQ0FBQztBQTJDRjs7R0FFRztBQUNILE1BQU0scUJBQXFCLEdBQW1CO0lBQzVDLE1BQU0sRUFBRSxFQUFFO0lBQ1YsUUFBUSxFQUFFLEVBQUU7SUFDWixLQUFLLEVBQUUsQ0FBQztJQUNSLFVBQVUsRUFBRSxFQUFFO0lBQ2QsV0FBVyxFQUFFLEVBQUU7SUFDZixNQUFNLEVBQUUsRUFBRTtDQUNYLENBQUM7QUF5QkY7O0dBRUc7QUFDSCxTQUFlLHFCQUFxQixDQUNsQyxJQUFzRjs7UUFFdEYsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFFckUsSUFBSSxDQUFDO1lBQ0gsa0RBQWtEO1lBQ2xELE1BQU0sT0FBTyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FDL0IsWUFBWSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLDJCQUEy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
308
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21tYW5kcy9jbGF1ZGUvcGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztBQUdBLHFEQUErRjtBQUMvRix1REFNK0I7QUFDL0IseURBVWdDO0FBQ2hDLHlEQUFpRTtBQUVqRTs7R0FFRztBQUNILFNBQWUsYUFBYSxDQUMxQixNQUFvQixFQUNwQixHQUFXLEVBQ1gsT0FBK0I7O1FBRS9CLE1BQU0sRUFDSixLQUFLLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUM3QixHQUFHLE9BQU8sQ0FBQztRQUVaLG1DQUFtQztRQUNuQyxNQUFNLGNBQWMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3hFLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyx1QkFBdUIsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7UUFDdkUsTUFBTSxhQUFhLEdBQUcsSUFBQSw2QkFBZ0IsRUFBQyxHQUFHLEVBQUUsa0JBQWtCLGNBQWMsRUFBRSxDQUFDLENBQUM7UUFFaEYsSUFBSSxZQUFZLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLElBQUksYUFBYSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztZQUM1RixZQUFZLEdBQUcsWUFBWSxDQUFDO1FBQzlCLENBQUM7YUFBTSxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLGFBQWEsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDL0YsWUFBWSxHQUFHLFNBQVMsQ0FBQztRQUMzQixDQUFDO1FBRUQsSUFBSSxhQUFhLENBQUMsT0FBTyxJ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