|
| 1 | +#!/usr/bin/env node |
| 2 | +/** |
| 3 | + * SLM Mesh — Post-install: auto-setup skills for supported platforms. |
| 4 | + * Runs after `npm install -g slm-mesh`. |
| 5 | + * |
| 6 | + * SAFETY RULES: |
| 7 | + * - NEVER overwrite existing files (skip if file exists) |
| 8 | + * - NEVER modify existing config files |
| 9 | + * - NEVER break if a platform isn't installed |
| 10 | + * - Only CREATE new files in expected directories |
| 11 | + * - Every operation wrapped in try/catch |
| 12 | + * - Silent exit on any error (don't break npm install) |
| 13 | + * |
| 14 | + * Copyright 2026 Varun Pratap Bhardwaj. MIT License. |
| 15 | + */ |
| 16 | + |
| 17 | +import { mkdirSync, copyFileSync, readdirSync, existsSync } from 'node:fs'; |
| 18 | +import { join, dirname } from 'node:path'; |
| 19 | +import { homedir } from 'node:os'; |
| 20 | +import { fileURLToPath } from 'node:url'; |
| 21 | + |
| 22 | +const __dirname = dirname(fileURLToPath(import.meta.url)); |
| 23 | +const skillsDir = join(__dirname, '..', 'skills'); |
| 24 | +const home = homedir(); |
| 25 | + |
| 26 | +// Silent exit if skills folder missing (CI, partial install) |
| 27 | +if (!existsSync(skillsDir)) process.exit(0); |
| 28 | + |
| 29 | +const skills = readdirSync(skillsDir).filter(f => f.endsWith('.md')); |
| 30 | +if (skills.length === 0) process.exit(0); |
| 31 | + |
| 32 | +// ─── Claude Code: ~/.claude/commands/ ─── |
| 33 | +// These are slash commands. Only copies files that don't already exist. |
| 34 | +try { |
| 35 | + const claudeDir = join(home, '.claude', 'commands'); |
| 36 | + mkdirSync(claudeDir, { recursive: true }); |
| 37 | + let count = 0; |
| 38 | + for (const skill of skills) { |
| 39 | + const target = join(claudeDir, skill); |
| 40 | + if (!existsSync(target)) { |
| 41 | + copyFileSync(join(skillsDir, skill), target); |
| 42 | + count++; |
| 43 | + } |
| 44 | + } |
| 45 | + if (count > 0) { |
| 46 | + console.log(` slm-mesh: ${count} slash commands installed to ~/.claude/commands/`); |
| 47 | + console.log(' Type /mesh-peers, /mesh-send, /mesh-lock in any Claude Code session.'); |
| 48 | + } |
| 49 | +} catch { |
| 50 | + // Skip silently — don't break npm install |
| 51 | +} |
| 52 | + |
| 53 | +// ─── Summary ─── |
| 54 | +console.log(''); |
| 55 | +console.log(' slm-mesh: Setup complete.'); |
| 56 | +console.log(' Add to Claude Code: claude mcp add --scope user slm-mesh -- npx slm-mesh'); |
| 57 | +console.log(' Add to Cursor/Windsurf/VS Code:'); |
| 58 | +console.log(' { "mcpServers": { "slm-mesh": { "command": "npx", "args": ["slm-mesh"] } } }'); |
| 59 | +console.log(' Docs: https://github.com/qualixar/slm-mesh'); |
0 commit comments