@lenne.tech/cli 1.2.0 → 1.3.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 (36) hide show
  1. package/build/commands/claude/install-plugin.js +339 -0
  2. package/package.json +1 -1
  3. package/build/commands/claude/install-commands.js +0 -337
  4. package/build/commands/claude/install-mcps.js +0 -258
  5. package/build/commands/claude/install-skills.js +0 -693
  6. package/build/lib/mcp-registry.js +0 -80
  7. package/build/templates/claude-commands/code-cleanup.md +0 -82
  8. package/build/templates/claude-commands/commit-message.md +0 -21
  9. package/build/templates/claude-commands/create-story.md +0 -435
  10. package/build/templates/claude-commands/mr-description-clipboard.md +0 -48
  11. package/build/templates/claude-commands/mr-description.md +0 -33
  12. package/build/templates/claude-commands/sec-review.md +0 -62
  13. package/build/templates/claude-commands/skill-optimize.md +0 -481
  14. package/build/templates/claude-commands/test-generate.md +0 -45
  15. package/build/templates/claude-skills/building-stories-with-tdd/SKILL.md +0 -265
  16. package/build/templates/claude-skills/building-stories-with-tdd/code-quality.md +0 -276
  17. package/build/templates/claude-skills/building-stories-with-tdd/database-indexes.md +0 -182
  18. package/build/templates/claude-skills/building-stories-with-tdd/examples.md +0 -1383
  19. package/build/templates/claude-skills/building-stories-with-tdd/handling-existing-tests.md +0 -197
  20. package/build/templates/claude-skills/building-stories-with-tdd/reference.md +0 -1427
  21. package/build/templates/claude-skills/building-stories-with-tdd/security-review.md +0 -307
  22. package/build/templates/claude-skills/building-stories-with-tdd/workflow.md +0 -1004
  23. package/build/templates/claude-skills/generating-nest-servers/SKILL.md +0 -303
  24. package/build/templates/claude-skills/generating-nest-servers/configuration.md +0 -285
  25. package/build/templates/claude-skills/generating-nest-servers/declare-keyword-warning.md +0 -133
  26. package/build/templates/claude-skills/generating-nest-servers/description-management.md +0 -226
  27. package/build/templates/claude-skills/generating-nest-servers/examples.md +0 -893
  28. package/build/templates/claude-skills/generating-nest-servers/framework-guide.md +0 -259
  29. package/build/templates/claude-skills/generating-nest-servers/quality-review.md +0 -864
  30. package/build/templates/claude-skills/generating-nest-servers/reference.md +0 -487
  31. package/build/templates/claude-skills/generating-nest-servers/security-rules.md +0 -371
  32. package/build/templates/claude-skills/generating-nest-servers/verification-checklist.md +0 -262
  33. package/build/templates/claude-skills/generating-nest-servers/workflow-process.md +0 -1061
  34. package/build/templates/claude-skills/using-lt-cli/SKILL.md +0 -284
  35. package/build/templates/claude-skills/using-lt-cli/examples.md +0 -546
  36. package/build/templates/claude-skills/using-lt-cli/reference.md +0 -513
@@ -0,0 +1,339 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
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
+ /**
17
+ * Plugin configuration
18
+ */
19
+ const PLUGIN_CONFIG = {
20
+ marketplaceName: 'lenne-tech',
21
+ marketplaceRepo: 'lenneTech/claude-code',
22
+ pluginName: 'core',
23
+ };
24
+ /**
25
+ * Find the claude CLI executable path
26
+ */
27
+ function findClaudeCli() {
28
+ const possiblePaths = [
29
+ (0, path_1.join)((0, os_1.homedir)(), '.claude', 'local', 'claude'),
30
+ '/usr/local/bin/claude',
31
+ '/usr/bin/claude',
32
+ ];
33
+ for (const p of possiblePaths) {
34
+ if ((0, fs_1.existsSync)(p)) {
35
+ return p;
36
+ }
37
+ }
38
+ try {
39
+ const result = (0, child_process_1.execSync)('which claude', { encoding: 'utf-8', stdio: ['pipe', 'pipe', 'pipe'] });
40
+ const path = result.trim();
41
+ if (path && (0, fs_1.existsSync)(path)) {
42
+ return path;
43
+ }
44
+ }
45
+ catch (_a) {
46
+ // Ignore errors
47
+ }
48
+ return null;
49
+ }
50
+ /**
51
+ * Recursively find all .md files in a directory
52
+ */
53
+ function findMarkdownFiles(dir, basePath = '') {
54
+ const results = [];
55
+ if (!(0, fs_1.existsSync)(dir))
56
+ return results;
57
+ try {
58
+ const entries = (0, fs_1.readdirSync)(dir, { withFileTypes: true });
59
+ for (const entry of entries) {
60
+ const fullPath = (0, path_1.join)(dir, entry.name);
61
+ const relativePath = basePath ? `${basePath}/${entry.name}` : entry.name;
62
+ if (entry.isDirectory()) {
63
+ results.push(...findMarkdownFiles(fullPath, relativePath));
64
+ }
65
+ else if (entry.isFile() && entry.name.endsWith('.md')) {
66
+ // Convert path to command name (e.g., "git/commit-message.md" -> "/git:commit-message")
67
+ const commandName = relativePath
68
+ .replace(/\.md$/, '')
69
+ .replace(/\//g, ':');
70
+ results.push(`/${commandName}`);
71
+ }
72
+ }
73
+ }
74
+ catch (_a) {
75
+ // Ignore errors
76
+ }
77
+ return results;
78
+ }
79
+ /**
80
+ * Read plugin contents (skills, commands, hooks, permissions, mcpServers)
81
+ */
82
+ function readPluginContents(marketplaceName) {
83
+ const pluginDir = (0, path_1.join)((0, os_1.homedir)(), '.claude', 'plugins', 'marketplaces', marketplaceName, 'plugins', 'core');
84
+ const result = {
85
+ commands: [],
86
+ hooks: 0,
87
+ mcpServers: [],
88
+ permissions: [],
89
+ skills: [],
90
+ };
91
+ // Read skills
92
+ const skillsDir = (0, path_1.join)(pluginDir, 'skills');
93
+ if ((0, fs_1.existsSync)(skillsDir)) {
94
+ try {
95
+ result.skills = (0, fs_1.readdirSync)(skillsDir, { withFileTypes: true })
96
+ .filter(dirent => dirent.isDirectory())
97
+ .map(dirent => dirent.name);
98
+ }
99
+ catch (_a) {
100
+ // Ignore
101
+ }
102
+ }
103
+ // Read commands
104
+ const commandsDir = (0, path_1.join)(pluginDir, 'commands');
105
+ result.commands = findMarkdownFiles(commandsDir);
106
+ // Read hooks
107
+ const hooksPath = (0, path_1.join)(pluginDir, 'hooks', 'hooks.json');
108
+ if ((0, fs_1.existsSync)(hooksPath)) {
109
+ try {
110
+ const hooksContent = JSON.parse((0, fs_1.readFileSync)(hooksPath, 'utf-8'));
111
+ // Count hooks across all event types
112
+ for (const eventHooks of Object.values(hooksContent.hooks || {})) {
113
+ if (Array.isArray(eventHooks)) {
114
+ for (const hookGroup of eventHooks) {
115
+ if (hookGroup.hooks && Array.isArray(hookGroup.hooks)) {
116
+ result.hooks += hookGroup.hooks.length;
117
+ }
118
+ }
119
+ }
120
+ }
121
+ }
122
+ catch (_b) {
123
+ // Ignore
124
+ }
125
+ }
126
+ // Read MCP servers
127
+ const mcpPath = (0, path_1.join)(pluginDir, '.mcp.json');
128
+ if ((0, fs_1.existsSync)(mcpPath)) {
129
+ try {
130
+ const mcpContent = JSON.parse((0, fs_1.readFileSync)(mcpPath, 'utf-8'));
131
+ if (mcpContent.mcpServers) {
132
+ result.mcpServers = Object.keys(mcpContent.mcpServers);
133
+ }
134
+ }
135
+ catch (_c) {
136
+ // Ignore
137
+ }
138
+ }
139
+ // Read permissions
140
+ const permissionsPath = (0, path_1.join)(pluginDir, 'permissions.json');
141
+ if ((0, fs_1.existsSync)(permissionsPath)) {
142
+ try {
143
+ const content = (0, fs_1.readFileSync)(permissionsPath, 'utf-8');
144
+ const pluginPerms = JSON.parse(content);
145
+ result.permissions = pluginPerms.permissions.map(p => p.pattern);
146
+ }
147
+ catch (_d) {
148
+ // Ignore
149
+ }
150
+ }
151
+ return result;
152
+ }
153
+ /**
154
+ * Execute a claude CLI command
155
+ */
156
+ function runClaudeCommand(cli, args) {
157
+ try {
158
+ const result = (0, child_process_1.spawnSync)(cli, args.split(' '), {
159
+ encoding: 'utf-8',
160
+ shell: true,
161
+ stdio: ['pipe', 'pipe', 'pipe'],
162
+ });
163
+ return {
164
+ output: result.stdout + result.stderr,
165
+ success: result.status === 0,
166
+ };
167
+ }
168
+ catch (err) {
169
+ return {
170
+ output: err.message,
171
+ success: false,
172
+ };
173
+ }
174
+ }
175
+ /**
176
+ * Setup permissions in settings.json
177
+ * Only adds new permissions, does not remove existing ones
178
+ * (User may have customized permissions that should be preserved)
179
+ */
180
+ function setupPermissions(requiredPermissions, error) {
181
+ const settingsPath = (0, path_1.join)((0, os_1.homedir)(), '.claude', 'settings.json');
182
+ try {
183
+ // Read existing settings
184
+ let settings = {};
185
+ if ((0, fs_1.existsSync)(settingsPath)) {
186
+ const content = (0, fs_1.readFileSync)(settingsPath, 'utf-8');
187
+ settings = JSON.parse(content);
188
+ }
189
+ // Ensure permissions.allow exists
190
+ if (!settings.permissions) {
191
+ settings.permissions = {};
192
+ }
193
+ const perms = settings.permissions;
194
+ if (!perms.allow) {
195
+ perms.allow = [];
196
+ }
197
+ const currentAllowList = perms.allow;
198
+ // Determine what to add
199
+ const added = [];
200
+ const existing = [];
201
+ requiredPermissions.forEach(perm => {
202
+ if (currentAllowList.includes(perm)) {
203
+ existing.push(perm);
204
+ }
205
+ else {
206
+ added.push(perm);
207
+ }
208
+ });
209
+ // Add new permissions
210
+ if (added.length > 0) {
211
+ perms.allow = [...currentAllowList, ...added];
212
+ (0, fs_1.writeFileSync)(settingsPath, JSON.stringify(settings, null, 2));
213
+ }
214
+ return { added, existing, success: true };
215
+ }
216
+ catch (err) {
217
+ error(`Could not configure permissions: ${err.message}`);
218
+ return { added: [], existing: [], success: false };
219
+ }
220
+ }
221
+ /**
222
+ * Install lenne.tech Claude Code Plugin
223
+ */
224
+ const NewCommand = {
225
+ alias: ['plugin', 'ip'],
226
+ description: 'Installs/updates the lenne.tech Claude Code Plugin with skills, commands, and hooks',
227
+ hidden: false,
228
+ name: 'install-plugin',
229
+ run: (toolbox) => __awaiter(void 0, void 0, void 0, function* () {
230
+ const { helper, print: { error, info, spin, success }, system, } = toolbox;
231
+ // Start timer
232
+ const timer = system.startTimer();
233
+ info('Install lenne.tech Claude Code Plugin');
234
+ // Check if claude CLI is available
235
+ const cli = findClaudeCli();
236
+ if (!cli) {
237
+ error('Claude CLI not found. Please install Claude Code first.');
238
+ info('');
239
+ info('Installation: https://docs.anthropic.com/en/docs/claude-code');
240
+ return process.exit(1);
241
+ }
242
+ // Step 1: Add marketplace
243
+ const marketplaceSpinner = spin('Adding plugin marketplace');
244
+ const addMarketplaceResult = runClaudeCommand(cli, `plugin marketplace add ${PLUGIN_CONFIG.marketplaceRepo}`);
245
+ if (addMarketplaceResult.success || addMarketplaceResult.output.includes('already')) {
246
+ marketplaceSpinner.succeed('Marketplace added');
247
+ }
248
+ else {
249
+ marketplaceSpinner.fail('Failed to add marketplace');
250
+ error(addMarketplaceResult.output);
251
+ return process.exit(1);
252
+ }
253
+ // Step 2: Install or update plugin
254
+ const fullPluginName = `${PLUGIN_CONFIG.pluginName}@${PLUGIN_CONFIG.marketplaceName}`;
255
+ const pluginSpinner = spin('Installing/updating plugin');
256
+ const installResult = runClaudeCommand(cli, `plugin install ${fullPluginName}`);
257
+ let pluginAction = 'installed';
258
+ if (installResult.output.includes('already') || installResult.output.includes('up to date')) {
259
+ pluginAction = 'up to date';
260
+ }
261
+ else if (installResult.output.includes('update') || installResult.output.includes('upgrade')) {
262
+ pluginAction = 'updated';
263
+ }
264
+ if (installResult.success || installResult.output.includes('already') || installResult.output.includes('up to date')) {
265
+ pluginSpinner.succeed(`Plugin ${pluginAction}`);
266
+ }
267
+ else {
268
+ pluginSpinner.fail('Failed to install plugin');
269
+ error(installResult.output);
270
+ info('');
271
+ info('Manual installation:');
272
+ info(` /plugin marketplace add ${PLUGIN_CONFIG.marketplaceRepo}`);
273
+ info(` /plugin install ${fullPluginName}`);
274
+ return process.exit(1);
275
+ }
276
+ // Step 3: Read plugin contents
277
+ const pluginContents = readPluginContents(PLUGIN_CONFIG.marketplaceName);
278
+ // Warn if plugin seems empty
279
+ if (pluginContents.skills.length === 0 && pluginContents.commands.length === 0) {
280
+ info('');
281
+ info('Warning: No skills or commands found. Plugin may not be installed correctly.');
282
+ }
283
+ // Step 4: Setup permissions
284
+ if (pluginContents.permissions.length > 0) {
285
+ const permSpinner = spin('Configuring permissions');
286
+ const permResult = setupPermissions(pluginContents.permissions, error);
287
+ if (permResult.success) {
288
+ if (permResult.added.length > 0) {
289
+ permSpinner.succeed(`Permissions configured (${permResult.added.length} added)`);
290
+ }
291
+ else {
292
+ permSpinner.succeed('Permissions already configured');
293
+ }
294
+ }
295
+ else {
296
+ permSpinner.fail('Failed to configure permissions');
297
+ info('');
298
+ info('Add manually to ~/.claude/settings.json:');
299
+ info(JSON.stringify({ permissions: { allow: pluginContents.permissions } }, null, 2));
300
+ }
301
+ }
302
+ // Success summary
303
+ info('');
304
+ success(`Plugin ${pluginAction} in ${helper.msToMinutesAndSeconds(timer())}m.`);
305
+ if (pluginContents.skills.length > 0 || pluginContents.commands.length > 0) {
306
+ info('');
307
+ info('Installed:');
308
+ if (pluginContents.skills.length > 0) {
309
+ info(` Skills (${pluginContents.skills.length}): ${pluginContents.skills.join(', ')}`);
310
+ }
311
+ if (pluginContents.commands.length > 0) {
312
+ // Show first 5 commands, then "and X more"
313
+ const maxShow = 5;
314
+ const shown = pluginContents.commands.slice(0, maxShow);
315
+ const remaining = pluginContents.commands.length - maxShow;
316
+ const commandsStr = remaining > 0
317
+ ? `${shown.join(', ')} and ${remaining} more`
318
+ : shown.join(', ');
319
+ info(` Commands (${pluginContents.commands.length}): ${commandsStr}`);
320
+ }
321
+ if (pluginContents.hooks > 0) {
322
+ info(` Hooks: ${pluginContents.hooks} auto-detection hooks`);
323
+ }
324
+ if (pluginContents.mcpServers.length > 0) {
325
+ info(` MCP Servers (${pluginContents.mcpServers.length}): ${pluginContents.mcpServers.join(', ')}`);
326
+ }
327
+ }
328
+ info('');
329
+ info('Next:');
330
+ info(' Restart Claude Code to activate the plugin');
331
+ info('');
332
+ if (!toolbox.parameters.options.fromGluegunMenu) {
333
+ process.exit(0);
334
+ }
335
+ return 'plugin installed';
336
+ }),
337
+ };
338
+ exports.default = NewCommand;
339
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5zdGFsbC1wbHVnaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tbWFuZHMvY2xhdWRlL2luc3RhbGwtcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O0FBQUEsaURBQW9EO0FBQ3BELDJCQUEwRTtBQUUxRSwyQkFBNkI7QUFDN0IsK0JBQTRCO0FBSTVCOztHQUVHO0FBQ0gsTUFBTSxhQUFhLEdBQUc7SUFDcEIsZUFBZSxFQUFFLFlBQVk7SUFDN0IsZUFBZSxFQUFFLHVCQUF1QjtJQUN4QyxVQUFVLEVBQUUsTUFBTTtDQUNuQixDQUFDO0FBY0Y7O0dBRUc7QUFDSCxTQUFTLGFBQWE7SUFDcEIsTUFBTSxhQUFhLEdBQUc7UUFDcEIsSUFBQSxXQUFJLEVBQUMsSUFBQSxZQUFPLEdBQUUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQztRQUM3Qyx1QkFBdUI7UUFDdkIsaUJBQWlCO0tBQ2xCLENBQUM7SUFFRixLQUFLLE1BQU0sQ0FBQyxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQzlCLElBQUksSUFBQSxlQUFVLEVBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNsQixPQUFPLENBQUMsQ0FBQztRQUNYLENBQUM7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDO1FBQ0gsTUFBTSxNQUFNLEdBQUcsSUFBQSx3QkFBUSxFQUFDLGNBQWMsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEcsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzNCLElBQUksSUFBSSxJQUFJLElBQUEsZUFBVSxFQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDN0IsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztJQUFDLFdBQU0sQ0FBQztRQUNQ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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lenne.tech/cli",
3
- "version": "1.2.0",
3
+ "version": "1.3.0",
4
4
  "description": "lenne.Tech CLI: lt",
5
5
  "keywords": [
6
6
  "lenne.Tech",