@goobits/sherpa 1.0.1

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 (55) hide show
  1. package/dist/chunk-3CILH2TO.js +387 -0
  2. package/dist/chunk-3CILH2TO.js.map +7 -0
  3. package/dist/chunk-5NF3BSD6.js +512 -0
  4. package/dist/chunk-5NF3BSD6.js.map +7 -0
  5. package/dist/chunk-IIU6U7TE.js +307 -0
  6. package/dist/chunk-IIU6U7TE.js.map +7 -0
  7. package/dist/chunk-LQZTKH3U.js +307 -0
  8. package/dist/chunk-LQZTKH3U.js.map +7 -0
  9. package/dist/cli.d.ts +11 -0
  10. package/dist/cli.d.ts.map +1 -0
  11. package/dist/cli.js +84 -0
  12. package/dist/cli.js.map +7 -0
  13. package/dist/commands/init.d.ts +7 -0
  14. package/dist/commands/init.d.ts.map +1 -0
  15. package/dist/commands/init.js +333 -0
  16. package/dist/commands/init.js.map +1 -0
  17. package/dist/commands/post.d.ts +20 -0
  18. package/dist/commands/post.d.ts.map +1 -0
  19. package/dist/commands/post.js +183 -0
  20. package/dist/commands/post.js.map +1 -0
  21. package/dist/commands/pre.d.ts +18 -0
  22. package/dist/commands/pre.d.ts.map +1 -0
  23. package/dist/commands/pre.js +102 -0
  24. package/dist/commands/pre.js.map +1 -0
  25. package/dist/commands/status.d.ts +5 -0
  26. package/dist/commands/status.d.ts.map +1 -0
  27. package/dist/commands/status.js +48 -0
  28. package/dist/commands/status.js.map +1 -0
  29. package/dist/daemon-V2QDZTUB.js +89 -0
  30. package/dist/daemon-V2QDZTUB.js.map +7 -0
  31. package/dist/daemon.d.ts +9 -0
  32. package/dist/daemon.d.ts.map +1 -0
  33. package/dist/daemon.js +112 -0
  34. package/dist/daemon.js.map +1 -0
  35. package/dist/index.d.ts +15 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +36 -0
  38. package/dist/index.js.map +7 -0
  39. package/dist/parser.d.ts +21 -0
  40. package/dist/parser.d.ts.map +1 -0
  41. package/dist/parser.js +152 -0
  42. package/dist/parser.js.map +1 -0
  43. package/dist/reviewer/index.js +544 -0
  44. package/dist/reviewer/index.js.map +7 -0
  45. package/dist/rules.d.ts +21 -0
  46. package/dist/rules.d.ts.map +1 -0
  47. package/dist/rules.js +165 -0
  48. package/dist/rules.js.map +1 -0
  49. package/dist/status-Q6Z4TFJZ.js +52 -0
  50. package/dist/status-Q6Z4TFJZ.js.map +7 -0
  51. package/dist/types.d.ts +69 -0
  52. package/dist/types.d.ts.map +1 -0
  53. package/dist/types.js +13 -0
  54. package/dist/types.js.map +1 -0
  55. package/package.json +52 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/commands/init.ts"],
4
+ "sourcesContent": ["/**\n * sherpa init - Set up repo with husky, lint-staged, gitleaks, and claude hooks\n *\n * Usage: sherpa init [--force]\n */\n\nimport { execSync } from 'child_process'\nimport { createRequire } from 'module'\nimport { appendFileSync, chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs'\nimport { dirname, join, resolve } from 'path'\nimport { fileURLToPath } from 'url'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\n\ninterface HookEntry {\n matcher: string\n hooks: Array<{ type: string; command: string }>\n}\n\ninterface McpServer {\n type: 'stdio'\n command: string\n args: string[]\n env?: Record<string, string>\n}\n\ninterface McpJson {\n mcpServers: Record<string, McpServer>\n}\n\ninterface ClaudeSettings {\n hooks?: {\n PreToolUse?: HookEntry[]\n PostToolUse?: HookEntry[]\n }\n [key: string]: unknown\n}\n\nconst CLAUDE_HOOK_CONFIG = {\n PreToolUse: [{ matcher: 'Bash', hooks: [{ type: 'command', command: 'sherpa pre' }] }],\n PostToolUse: [{ matcher: 'Bash', hooks: [{ type: 'command', command: 'sherpa post' }] }]\n}\n\nconst GUARD_CONFIG = {\n maxTokens: 2000,\n previewTokens: 500,\n scratchDir: '.claude/scratch',\n maxAgeMinutes: 60,\n maxScratchSizeMB: 50\n}\n\nconst REVIEW_COMMAND = `# review\n\nUse the MCP tool \\`review\\` with the arguments provided by the user.\nIf no arguments are given, ask for the paths or mode.\n`\n\nconst TREE_COMMAND = `# tree\n\nUse the MCP tool \\`tree\\` with the arguments provided by the user.\nIf no arguments are given, show the default repo tree.\n`\n\nconst LINT_STAGED_CONFIG = {\n '*.{js,jsx,ts,tsx,json,md,yml,yaml}': ['prettier --write']\n}\n\nconst HUSKY_PRE_COMMIT = `npx lint-staged\nif command -v gitleaks >/dev/null 2>&1; then\n\tgitleaks protect --staged --verbose\nelse\n\techo \"gitleaks not found - skipping\"\nfi\n`\n\n/**\n * Get absolute path to node binary\n */\nfunction getNodePath(): string {\n try {\n return execSync('which node', { encoding: 'utf-8' }).trim()\n } catch {\n return 'node' // fallback\n }\n}\n\n/**\n * Get absolute path to reviewer dist\n */\nfunction getReviewerPath(): string {\n\tconst require = createRequire(import.meta.url)\n\tconst bundledPath = resolve(__dirname, '..', 'reviewer', 'index.js')\n\tif (existsSync(bundledPath)) {\n\t\treturn bundledPath\n\t}\n\ttry {\n\t\treturn require.resolve('@goobits/sherpa-reviewer/dist/index.js')\n\t} catch {\n\t\t// Fall through to monorepo path\n\t}\n\n\t// __dirname is packages/sherpa/dist/commands in compiled code\n\t// Reviewer is at packages/reviewer/dist/index.js\n\tconst reviewerPath = resolve(__dirname, '../../../reviewer/dist/index.js')\n\tif (existsSync(reviewerPath)) {\n\t\treturn reviewerPath\n\t}\n\n\treturn reviewerPath\n}\n\nexport function runInit(): void {\n const isInitCommand = process.argv[2] === 'init'\n const initArgs = isInitCommand ? process.argv.slice(3) : []\n const force = initArgs.includes('--force')\n const cwd = process.cwd()\n\n console.log('Setting up sherpa...\\n')\n\n // 1. Create .claude directory and hooks config\n setupClaudeHooks(cwd, force)\n\n // 2. Create .claude commands\n setupClaudeCommands(cwd, force)\n\n // 3. Set up MCP server in .mcp.json\n setupMcpConfig(cwd, force)\n\n // 4. Set up husky\n setupHusky(cwd, force)\n\n // 5. Set up lint-staged\n setupLintStaged(cwd, force)\n\n // 6. Check for gitleaks\n checkGitleaks()\n\n // Print success\n console.log(`\\n${'='.repeat(50)}`)\n console.log('Sherpa setup complete!\\n')\n console.log('What was configured:')\n console.log(' [x] .claude/settings.local.json - Hooks')\n console.log(' [x] .claude/guard.json - Guard config')\n console.log(' [x] .claude/commands/review.md - Slash command')\n console.log(' [x] .claude/commands/tree.md - Slash command')\n console.log(' [x] .mcp.json - MCP servers')\n console.log(' [x] .husky/pre-commit - Git pre-commit hook')\n console.log(' [x] .lintstagedrc.json - Lint staged files')\n console.log('')\n console.log('Pre-commit will run:')\n console.log(' 1. lint-staged (lint/format changed files)')\n console.log(' 2. gitleaks (scan for secrets)')\n console.log('')\n console.log('Claude Code:')\n console.log(' - sherpa pre: Block dangerous bash commands')\n console.log(' - sherpa post: Offload large outputs')\n console.log(' - reviewer: AI code review (MCP)')\n console.log('')\n console.log('IMPORTANT: Restart Claude Code to load the MCP server.')\n console.log('='.repeat(50))\n}\n\nfunction setupClaudeHooks(cwd: string, force: boolean): void {\n const claudeDir = join(cwd, '.claude')\n const configPath = join(claudeDir, 'guard.json')\n const settingsPath = join(claudeDir, 'settings.local.json')\n\n // Create .claude directory\n if (!existsSync(claudeDir)) {\n mkdirSync(claudeDir, { recursive: true })\n console.log('Created .claude/ directory')\n }\n\n // Create guard.json\n if (!existsSync(configPath) || force) {\n writeFileSync(configPath, `${JSON.stringify(GUARD_CONFIG, null, 2)}\\n`)\n console.log('Created .claude/guard.json')\n } else {\n console.log('.claude/guard.json already exists (use --force to overwrite)')\n }\n\n // Update settings.local.json with hooks only (not MCP)\n let settings: ClaudeSettings = {}\n if (existsSync(settingsPath)) {\n try {\n settings = JSON.parse(readFileSync(settingsPath, 'utf-8'))\n } catch {\n console.warn('Warning: Could not parse existing settings.local.json')\n }\n }\n\n // Merge hook config\n settings.hooks = settings.hooks || {}\n let hooksUpdated = false\n\n for (const [hookType, hooks] of Object.entries(CLAUDE_HOOK_CONFIG)) {\n const existing = settings.hooks[hookType as keyof typeof CLAUDE_HOOK_CONFIG] || []\n const hasSherpa = existing.some((h) =>\n h.hooks?.some((hook: { command?: string }) => hook.command?.startsWith('sherpa '))\n )\n\n if (!hasSherpa) {\n settings.hooks[hookType as keyof typeof CLAUDE_HOOK_CONFIG] = [...existing, ...hooks]\n hooksUpdated = true\n }\n }\n\n if (hooksUpdated) {\n writeFileSync(settingsPath, `${JSON.stringify(settings, null, 2)}\\n`)\n console.log('Updated .claude/settings.local.json with hooks')\n } else {\n console.log('Claude hooks already configured')\n }\n}\n\nfunction setupClaudeCommands(cwd: string, force: boolean): void {\n const claudeDir = join(cwd, '.claude')\n const commandsDir = join(claudeDir, 'commands')\n const reviewCommandPath = join(commandsDir, 'review.md')\n const treeCommandPath = join(commandsDir, 'tree.md')\n\n if (!existsSync(commandsDir)) {\n mkdirSync(commandsDir, { recursive: true })\n }\n\n if (!existsSync(reviewCommandPath) || force) {\n writeFileSync(reviewCommandPath, REVIEW_COMMAND)\n console.log('Created .claude/commands/review.md')\n } else {\n console.log('.claude/commands/review.md already exists')\n }\n\n if (!existsSync(treeCommandPath) || force) {\n writeFileSync(treeCommandPath, TREE_COMMAND)\n console.log('Created .claude/commands/tree.md')\n } else {\n console.log('.claude/commands/tree.md already exists')\n }\n}\n\nfunction setupMcpConfig(cwd: string, force: boolean): void {\n const mcpPath = join(cwd, '.mcp.json')\n const settingsPath = join(cwd, '.claude/settings.local.json')\n const nodePath = getNodePath()\n const reviewerPath = getReviewerPath()\n\n // 1. Clean up stale MCP config from settings.local.json (wrong location)\n if (existsSync(settingsPath)) {\n try {\n const settings = JSON.parse(readFileSync(settingsPath, 'utf-8'))\n if (settings.mcpServers) {\n delete settings.mcpServers\n writeFileSync(settingsPath, `${JSON.stringify(settings, null, 2)}\\n`)\n console.log('Cleaned up stale MCP config from settings.local.json')\n }\n } catch {\n // Ignore parse errors\n }\n }\n\n const mcpConfig: McpServer = {\n type: 'stdio',\n command: nodePath,\n args: [reviewerPath],\n env: {}\n }\n\n // 2. Try using claude CLI first (most reliable)\n try {\n // Remove existing and add fresh (always, to ensure correct config)\n execSync('claude mcp remove reviewer -s project 2>/dev/null || true', {\n cwd,\n stdio: 'pipe'\n })\n execSync('claude mcp remove cerebras-reviewer -s project 2>/dev/null || true', {\n cwd,\n stdio: 'pipe'\n })\n execSync(`claude mcp add reviewer -s project ${nodePath} ${reviewerPath}`, {\n cwd,\n stdio: 'pipe'\n })\n console.log('Configured MCP server via claude CLI')\n return\n } catch {\n // Claude CLI not available, fall back to manual config\n }\n\n // 3. Manual .mcp.json creation (always overwrite reviewer to fix any issues)\n let mcpJson: McpJson = { mcpServers: {} }\n if (existsSync(mcpPath)) {\n try {\n mcpJson = JSON.parse(readFileSync(mcpPath, 'utf-8'))\n } catch {\n // Start fresh if parse fails\n }\n }\n\n delete mcpJson.mcpServers['cerebras-reviewer']\n mcpJson.mcpServers['reviewer'] = mcpConfig\n writeFileSync(mcpPath, `${JSON.stringify(mcpJson, null, 2)}\\n`)\n console.log('Configured .mcp.json with reviewer')\n\n // 4. Verify it works\n try {\n const testMsg =\n '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2024-11-05\",\"capabilities\":{},\"clientInfo\":{\"name\":\"test\",\"version\":\"1.0.0\"}}}'\n execSync(`echo '${testMsg}' | \"${nodePath}\" \"${reviewerPath}\"`, {\n stdio: 'pipe',\n timeout: 5000\n })\n console.log('Verified MCP server responds correctly')\n } catch {\n console.warn('Warning: MCP server test failed - check paths and try restarting Claude Code')\n }\n}\n\nfunction setupHusky(cwd: string, force: boolean): void {\n const huskyDir = join(cwd, '.husky')\n const preCommitPath = join(huskyDir, 'pre-commit')\n const pkgPath = join(cwd, 'package.json')\n\n if (!existsSync(pkgPath)) {\n console.log('No package.json found - skipping husky setup')\n return\n }\n\n try {\n JSON.parse(readFileSync(pkgPath, 'utf-8'))\n } catch {\n console.warn('Warning: Could not parse package.json')\n return\n }\n\n const hasHusky = existsSync(huskyDir)\n\n if (!hasHusky) {\n try {\n console.log('Initializing husky...')\n execSync('npx husky init', { cwd, stdio: 'pipe' })\n console.log('Initialized husky')\n } catch {\n console.warn('Could not initialize husky automatically')\n console.warn('Run: npx husky init')\n return\n }\n }\n\n if (!existsSync(preCommitPath) || force) {\n writeFileSync(preCommitPath, HUSKY_PRE_COMMIT)\n chmodSync(preCommitPath, '755')\n console.log('Created .husky/pre-commit')\n } else {\n const existing = readFileSync(preCommitPath, 'utf-8')\n if (existing.includes('npm test')) {\n writeFileSync(preCommitPath, HUSKY_PRE_COMMIT)\n chmodSync(preCommitPath, '755')\n console.log('Replaced default pre-commit with lint-staged + gitleaks')\n return\n }\n\n let updated = false\n\n if (!existing.includes('lint-staged')) {\n appendFileSync(preCommitPath, '\\nnpx lint-staged\\n')\n updated = true\n }\n\n if (!existing.includes('gitleaks')) {\n appendFileSync(preCommitPath, '\\ngitleaks protect --staged --verbose\\n')\n updated = true\n }\n\n if (updated) {\n console.log('Updated .husky/pre-commit with lint-staged + gitleaks')\n } else {\n console.log('.husky/pre-commit already configured')\n }\n }\n}\n\nfunction setupLintStaged(cwd: string, force: boolean): void {\n const configPath = join(cwd, '.lintstagedrc.json')\n\n if (!existsSync(configPath) || force) {\n writeFileSync(configPath, `${JSON.stringify(LINT_STAGED_CONFIG, null, 2)}\\n`)\n console.log('Created .lintstagedrc.json')\n } else {\n console.log('.lintstagedrc.json already exists')\n }\n}\n\nfunction checkGitleaks(): void {\n try {\n const checkCmd = process.platform === 'win32' ? 'where gitleaks' : 'command -v gitleaks'\n execSync(checkCmd, { stdio: 'pipe' })\n console.log('gitleaks found')\n } catch {\n console.log('')\n console.log('NOTE: gitleaks not found. Install it:')\n console.log(' brew install gitleaks # macOS')\n console.log(' apt install gitleaks # Debian/Ubuntu')\n console.log(' choco install gitleaks # Windows')\n console.log(' https://github.com/gitleaks/gitleaks#installing')\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["require"]
7
+ }
package/dist/cli.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Sherpa CLI - unified entry point
4
+ *
5
+ * Usage:
6
+ * sherpa init # Set up repo (husky, lint-staged, gitleaks, claude hooks)
7
+ * sherpa pre # PreToolUse hook (blocks dangerous commands)
8
+ * sherpa post # PostToolUse hook (offloads large output)
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG"}
package/dist/cli.js ADDED
@@ -0,0 +1,84 @@
1
+ #!/usr/bin/env node
2
+ import {
3
+ runInit
4
+ } from "./chunk-IIU6U7TE.js";
5
+ import {
6
+ runPost,
7
+ runPre
8
+ } from "./chunk-5NF3BSD6.js";
9
+ import "./chunk-3CILH2TO.js";
10
+
11
+ // src/cli.ts
12
+ import { readFileSync } from "fs";
13
+ import { dirname, join } from "path";
14
+ import { fileURLToPath } from "url";
15
+ var __dirname = dirname(fileURLToPath(import.meta.url));
16
+ function getVersion() {
17
+ try {
18
+ const pkgPath = join(__dirname, "..", "package.json");
19
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf-8"));
20
+ return pkg.version || "0.0.0";
21
+ } catch {
22
+ return "0.0.0";
23
+ }
24
+ }
25
+ function showHelp() {
26
+ console.log(`
27
+ sherpa - MCP hooks and repo setup for safer AI coding
28
+
29
+ Usage:
30
+ sherpa init Set up repo (husky, lint-staged, gitleaks, claude hooks)
31
+ sherpa pre PreToolUse hook (blocks dangerous commands)
32
+ sherpa post PostToolUse hook (offloads large output)
33
+ sherpa daemon Start persistent daemon for faster hook responses
34
+ sherpa status Show LLM provider status and rate limits
35
+
36
+ Options:
37
+ --help, -h Show this help message
38
+ --version, -v Show version
39
+
40
+ Examples:
41
+ sherpa init # First-time setup
42
+ sherpa init --force # Overwrite existing config
43
+ sherpa daemon & # Start daemon in background
44
+ sherpa status # Check provider quotas
45
+ `);
46
+ }
47
+ var command = process.argv[2];
48
+ try {
49
+ switch (command) {
50
+ case "init":
51
+ runInit();
52
+ break;
53
+ case "pre":
54
+ runPre();
55
+ break;
56
+ case "post":
57
+ runPost();
58
+ break;
59
+ case "daemon":
60
+ import("./daemon-V2QDZTUB.js");
61
+ break;
62
+ case "status":
63
+ import("./status-Q6Z4TFJZ.js").then((m) => m.runStatus());
64
+ break;
65
+ case "--help":
66
+ case "-h":
67
+ case void 0:
68
+ showHelp();
69
+ break;
70
+ case "--version":
71
+ case "-v":
72
+ console.log(getVersion());
73
+ break;
74
+ default:
75
+ console.error(`Unknown command: ${command}`);
76
+ console.error('Run "sherpa --help" for usage');
77
+ process.exit(1);
78
+ }
79
+ } catch (error) {
80
+ const message = error instanceof Error ? error.message : String(error);
81
+ console.error(`Error: ${message}`);
82
+ process.exit(1);
83
+ }
84
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/cli.ts"],
4
+ "sourcesContent": ["#!/usr/bin/env node\n/**\n * Sherpa CLI - unified entry point\n *\n * Usage:\n * sherpa init # Set up repo (husky, lint-staged, gitleaks, claude hooks)\n * sherpa pre # PreToolUse hook (blocks dangerous commands)\n * sherpa post # PostToolUse hook (offloads large output)\n */\n\nimport { readFileSync } from 'fs'\nimport { dirname, join } from 'path'\nimport { fileURLToPath } from 'url'\n\nimport { runInit } from './commands/init.js'\nimport { runPost } from './commands/post.js'\nimport { runPre } from './commands/pre.js'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\n\nfunction getVersion(): string {\n\ttry {\n\t\tconst pkgPath = join(__dirname, '..', 'package.json')\n\t\tconst pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'))\n\t\treturn pkg.version || '0.0.0'\n\t} catch {\n\t\treturn '0.0.0'\n\t}\n}\n\nfunction showHelp(): void {\n\tconsole.log(`\nsherpa - MCP hooks and repo setup for safer AI coding\n\nUsage:\n sherpa init Set up repo (husky, lint-staged, gitleaks, claude hooks)\n sherpa pre PreToolUse hook (blocks dangerous commands)\n sherpa post PostToolUse hook (offloads large output)\n sherpa daemon Start persistent daemon for faster hook responses\n sherpa status Show LLM provider status and rate limits\n\nOptions:\n --help, -h Show this help message\n --version, -v Show version\n\nExamples:\n sherpa init # First-time setup\n sherpa init --force # Overwrite existing config\n sherpa daemon & # Start daemon in background\n sherpa status # Check provider quotas\n`)\n}\n\nconst command = process.argv[2]\n\ntry {\n\tswitch (command) {\n\t\tcase 'init':\n\t\t\trunInit()\n\t\t\tbreak\n\t\tcase 'pre':\n\t\t\trunPre()\n\t\t\tbreak\n\t\tcase 'post':\n\t\t\trunPost()\n\t\t\tbreak\n\t\tcase 'daemon':\n\t\t\t// Dynamic import to avoid loading daemon code unless needed\n\t\t\timport('./daemon.js')\n\t\t\tbreak\n\t\tcase 'status':\n\t\t\t// Dynamic import for status command\n\t\t\timport('./commands/status.js').then(m => m.runStatus())\n\t\t\tbreak\n\t\tcase '--help':\n\t\tcase '-h':\n\t\tcase undefined:\n\t\t\tshowHelp()\n\t\t\tbreak\n\t\tcase '--version':\n\t\tcase '-v':\n\t\t\tconsole.log(getVersion())\n\t\t\tbreak\n\t\tdefault:\n\t\t\tconsole.error(`Unknown command: ${ command }`)\n\t\t\tconsole.error('Run \"sherpa --help\" for usage')\n\t\t\tprocess.exit(1)\n\t}\n} catch(error) {\n\tconst message = error instanceof Error ? error.message : String(error)\n\tconsole.error(`Error: ${ message }`)\n\tprocess.exit(1)\n}\n"],
5
+ "mappings": ";;;;;;;;;;;AAUA,SAAS,oBAAoB;AAC7B,SAAS,SAAS,YAAY;AAC9B,SAAS,qBAAqB;AAM9B,IAAM,YAAY,QAAQ,cAAc,YAAY,GAAG,CAAC;AAExD,SAAS,aAAqB;AAC7B,MAAI;AACH,UAAM,UAAU,KAAK,WAAW,MAAM,cAAc;AACpD,UAAM,MAAM,KAAK,MAAM,aAAa,SAAS,OAAO,CAAC;AACrD,WAAO,IAAI,WAAW;AAAA,EACvB,QAAQ;AACP,WAAO;AAAA,EACR;AACD;AAEA,SAAS,WAAiB;AACzB,UAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAmBZ;AACD;AAEA,IAAM,UAAU,QAAQ,KAAK,CAAC;AAE9B,IAAI;AACH,UAAQ,SAAS;AAAA,IAChB,KAAK;AACJ,cAAQ;AACR;AAAA,IACD,KAAK;AACJ,aAAO;AACP;AAAA,IACD,KAAK;AACJ,cAAQ;AACR;AAAA,IACD,KAAK;AAEJ,aAAO,sBAAa;AACpB;AAAA,IACD,KAAK;AAEJ,aAAO,sBAAsB,EAAE,KAAK,OAAK,EAAE,UAAU,CAAC;AACtD;AAAA,IACD,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACJ,eAAS;AACT;AAAA,IACD,KAAK;AAAA,IACL,KAAK;AACJ,cAAQ,IAAI,WAAW,CAAC;AACxB;AAAA,IACD;AACC,cAAQ,MAAM,oBAAqB,OAAQ,EAAE;AAC7C,cAAQ,MAAM,+BAA+B;AAC7C,cAAQ,KAAK,CAAC;AAAA,EAChB;AACD,SAAQ,OAAO;AACd,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,UAAQ,MAAM,UAAW,OAAQ,EAAE;AACnC,UAAQ,KAAK,CAAC;AACf;",
6
+ "names": []
7
+ }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * sherpa init - Set up repo with husky, lint-staged, gitleaks, and claude hooks
3
+ *
4
+ * Usage: sherpa init [--force]
5
+ */
6
+ export declare function runInit(): void;
7
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA2GH,wBAAgB,OAAO,IAAI,IAAI,CAiD9B"}
@@ -0,0 +1,333 @@
1
+ /**
2
+ * sherpa init - Set up repo with husky, lint-staged, gitleaks, and claude hooks
3
+ *
4
+ * Usage: sherpa init [--force]
5
+ */
6
+ import { execSync } from 'child_process';
7
+ import { appendFileSync, chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';
8
+ import { dirname, join, resolve } from 'path';
9
+ import { fileURLToPath } from 'url';
10
+ const __dirname = dirname(fileURLToPath(import.meta.url));
11
+ const CLAUDE_HOOK_CONFIG = {
12
+ PreToolUse: [{ matcher: 'Bash', hooks: [{ type: 'command', command: 'sherpa pre' }] }],
13
+ PostToolUse: [{ matcher: 'Bash', hooks: [{ type: 'command', command: 'sherpa post' }] }]
14
+ };
15
+ const GUARD_CONFIG = {
16
+ maxTokens: 2000,
17
+ previewTokens: 500,
18
+ scratchDir: '.claude/scratch',
19
+ maxAgeMinutes: 60,
20
+ maxScratchSizeMB: 50
21
+ };
22
+ const REVIEW_COMMAND = `# review
23
+
24
+ Use the MCP tool \`review\` with the arguments provided by the user.
25
+ If no arguments are given, ask for the paths or mode.
26
+ `;
27
+ const TREE_COMMAND = `# tree
28
+
29
+ Use the MCP tool \`tree\` with the arguments provided by the user.
30
+ If no arguments are given, show the default repo tree.
31
+ `;
32
+ const LINT_STAGED_CONFIG = {
33
+ '*.{js,jsx,ts,tsx,json,md,yml,yaml}': ['prettier --write']
34
+ };
35
+ const HUSKY_PRE_COMMIT = `npx lint-staged
36
+ if command -v gitleaks >/dev/null 2>&1; then
37
+ gitleaks protect --staged --verbose
38
+ else
39
+ echo "gitleaks not found - skipping"
40
+ fi
41
+ `;
42
+ /**
43
+ * Get absolute path to node binary
44
+ */
45
+ function getNodePath() {
46
+ try {
47
+ return execSync('which node', { encoding: 'utf-8' }).trim();
48
+ }
49
+ catch {
50
+ return 'node'; // fallback
51
+ }
52
+ }
53
+ /**
54
+ * Get absolute path to reviewer dist
55
+ */
56
+ function getReviewerPath() {
57
+ // __dirname is packages/sherpa/dist/commands in compiled code
58
+ // Reviewer is at packages/reviewer/dist/index.js
59
+ const reviewerPath = resolve(__dirname, '../../../reviewer/dist/index.js');
60
+ if (existsSync(reviewerPath)) {
61
+ return reviewerPath;
62
+ }
63
+ // Fallback: try to find via node_modules or global
64
+ return reviewerPath;
65
+ }
66
+ export function runInit() {
67
+ const isInitCommand = process.argv[2] === 'init';
68
+ const initArgs = isInitCommand ? process.argv.slice(3) : [];
69
+ const force = initArgs.includes('--force');
70
+ const cwd = process.cwd();
71
+ console.log('Setting up sherpa...\n');
72
+ // 1. Create .claude directory and hooks config
73
+ setupClaudeHooks(cwd, force);
74
+ // 2. Create .claude commands
75
+ setupClaudeCommands(cwd, force);
76
+ // 3. Set up MCP server in .mcp.json
77
+ setupMcpConfig(cwd, force);
78
+ // 4. Set up husky
79
+ setupHusky(cwd, force);
80
+ // 5. Set up lint-staged
81
+ setupLintStaged(cwd, force);
82
+ // 6. Check for gitleaks
83
+ checkGitleaks();
84
+ // Print success
85
+ console.log(`\n${'='.repeat(50)}`);
86
+ console.log('Sherpa setup complete!\n');
87
+ console.log('What was configured:');
88
+ console.log(' [x] .claude/settings.local.json - Hooks');
89
+ console.log(' [x] .claude/guard.json - Guard config');
90
+ console.log(' [x] .claude/commands/review.md - Slash command');
91
+ console.log(' [x] .claude/commands/tree.md - Slash command');
92
+ console.log(' [x] .mcp.json - MCP servers');
93
+ console.log(' [x] .husky/pre-commit - Git pre-commit hook');
94
+ console.log(' [x] .lintstagedrc.json - Lint staged files');
95
+ console.log('');
96
+ console.log('Pre-commit will run:');
97
+ console.log(' 1. lint-staged (lint/format changed files)');
98
+ console.log(' 2. gitleaks (scan for secrets)');
99
+ console.log('');
100
+ console.log('Claude Code:');
101
+ console.log(' - sherpa pre: Block dangerous bash commands');
102
+ console.log(' - sherpa post: Offload large outputs');
103
+ console.log(' - reviewer: AI code review (MCP)');
104
+ console.log('');
105
+ console.log('IMPORTANT: Restart Claude Code to load the MCP server.');
106
+ console.log('='.repeat(50));
107
+ }
108
+ function setupClaudeHooks(cwd, force) {
109
+ const claudeDir = join(cwd, '.claude');
110
+ const configPath = join(claudeDir, 'guard.json');
111
+ const settingsPath = join(claudeDir, 'settings.local.json');
112
+ // Create .claude directory
113
+ if (!existsSync(claudeDir)) {
114
+ mkdirSync(claudeDir, { recursive: true });
115
+ console.log('Created .claude/ directory');
116
+ }
117
+ // Create guard.json
118
+ if (!existsSync(configPath) || force) {
119
+ writeFileSync(configPath, `${JSON.stringify(GUARD_CONFIG, null, 2)}\n`);
120
+ console.log('Created .claude/guard.json');
121
+ }
122
+ else {
123
+ console.log('.claude/guard.json already exists (use --force to overwrite)');
124
+ }
125
+ // Update settings.local.json with hooks only (not MCP)
126
+ let settings = {};
127
+ if (existsSync(settingsPath)) {
128
+ try {
129
+ settings = JSON.parse(readFileSync(settingsPath, 'utf-8'));
130
+ }
131
+ catch {
132
+ console.warn('Warning: Could not parse existing settings.local.json');
133
+ }
134
+ }
135
+ // Merge hook config
136
+ settings.hooks = settings.hooks || {};
137
+ let hooksUpdated = false;
138
+ for (const [hookType, hooks] of Object.entries(CLAUDE_HOOK_CONFIG)) {
139
+ const existing = settings.hooks[hookType] || [];
140
+ const hasSherpa = existing.some((h) => h.hooks?.some((hook) => hook.command?.startsWith('sherpa ')));
141
+ if (!hasSherpa) {
142
+ settings.hooks[hookType] = [...existing, ...hooks];
143
+ hooksUpdated = true;
144
+ }
145
+ }
146
+ if (hooksUpdated) {
147
+ writeFileSync(settingsPath, `${JSON.stringify(settings, null, 2)}\n`);
148
+ console.log('Updated .claude/settings.local.json with hooks');
149
+ }
150
+ else {
151
+ console.log('Claude hooks already configured');
152
+ }
153
+ }
154
+ function setupClaudeCommands(cwd, force) {
155
+ const claudeDir = join(cwd, '.claude');
156
+ const commandsDir = join(claudeDir, 'commands');
157
+ const reviewCommandPath = join(commandsDir, 'review.md');
158
+ const treeCommandPath = join(commandsDir, 'tree.md');
159
+ if (!existsSync(commandsDir)) {
160
+ mkdirSync(commandsDir, { recursive: true });
161
+ }
162
+ if (!existsSync(reviewCommandPath) || force) {
163
+ writeFileSync(reviewCommandPath, REVIEW_COMMAND);
164
+ console.log('Created .claude/commands/review.md');
165
+ }
166
+ else {
167
+ console.log('.claude/commands/review.md already exists');
168
+ }
169
+ if (!existsSync(treeCommandPath) || force) {
170
+ writeFileSync(treeCommandPath, TREE_COMMAND);
171
+ console.log('Created .claude/commands/tree.md');
172
+ }
173
+ else {
174
+ console.log('.claude/commands/tree.md already exists');
175
+ }
176
+ }
177
+ function setupMcpConfig(cwd, force) {
178
+ const mcpPath = join(cwd, '.mcp.json');
179
+ const settingsPath = join(cwd, '.claude/settings.local.json');
180
+ const nodePath = getNodePath();
181
+ const reviewerPath = getReviewerPath();
182
+ // 1. Clean up stale MCP config from settings.local.json (wrong location)
183
+ if (existsSync(settingsPath)) {
184
+ try {
185
+ const settings = JSON.parse(readFileSync(settingsPath, 'utf-8'));
186
+ if (settings.mcpServers) {
187
+ delete settings.mcpServers;
188
+ writeFileSync(settingsPath, `${JSON.stringify(settings, null, 2)}\n`);
189
+ console.log('Cleaned up stale MCP config from settings.local.json');
190
+ }
191
+ }
192
+ catch {
193
+ // Ignore parse errors
194
+ }
195
+ }
196
+ const mcpConfig = {
197
+ type: 'stdio',
198
+ command: nodePath,
199
+ args: [reviewerPath],
200
+ env: {}
201
+ };
202
+ // 2. Try using claude CLI first (most reliable)
203
+ try {
204
+ // Remove existing and add fresh (always, to ensure correct config)
205
+ execSync('claude mcp remove reviewer -s project 2>/dev/null || true', {
206
+ cwd,
207
+ stdio: 'pipe'
208
+ });
209
+ execSync('claude mcp remove cerebras-reviewer -s project 2>/dev/null || true', {
210
+ cwd,
211
+ stdio: 'pipe'
212
+ });
213
+ execSync(`claude mcp add reviewer -s project ${nodePath} ${reviewerPath}`, {
214
+ cwd,
215
+ stdio: 'pipe'
216
+ });
217
+ console.log('Configured MCP server via claude CLI');
218
+ return;
219
+ }
220
+ catch {
221
+ // Claude CLI not available, fall back to manual config
222
+ }
223
+ // 3. Manual .mcp.json creation (always overwrite reviewer to fix any issues)
224
+ let mcpJson = { mcpServers: {} };
225
+ if (existsSync(mcpPath)) {
226
+ try {
227
+ mcpJson = JSON.parse(readFileSync(mcpPath, 'utf-8'));
228
+ }
229
+ catch {
230
+ // Start fresh if parse fails
231
+ }
232
+ }
233
+ delete mcpJson.mcpServers['cerebras-reviewer'];
234
+ mcpJson.mcpServers['reviewer'] = mcpConfig;
235
+ writeFileSync(mcpPath, `${JSON.stringify(mcpJson, null, 2)}\n`);
236
+ console.log('Configured .mcp.json with reviewer');
237
+ // 4. Verify it works
238
+ try {
239
+ const testMsg = '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1.0.0"}}}';
240
+ execSync(`echo '${testMsg}' | "${nodePath}" "${reviewerPath}"`, {
241
+ stdio: 'pipe',
242
+ timeout: 5000
243
+ });
244
+ console.log('Verified MCP server responds correctly');
245
+ }
246
+ catch {
247
+ console.warn('Warning: MCP server test failed - check paths and try restarting Claude Code');
248
+ }
249
+ }
250
+ function setupHusky(cwd, force) {
251
+ const huskyDir = join(cwd, '.husky');
252
+ const preCommitPath = join(huskyDir, 'pre-commit');
253
+ const pkgPath = join(cwd, 'package.json');
254
+ if (!existsSync(pkgPath)) {
255
+ console.log('No package.json found - skipping husky setup');
256
+ return;
257
+ }
258
+ try {
259
+ JSON.parse(readFileSync(pkgPath, 'utf-8'));
260
+ }
261
+ catch {
262
+ console.warn('Warning: Could not parse package.json');
263
+ return;
264
+ }
265
+ const hasHusky = existsSync(huskyDir);
266
+ if (!hasHusky) {
267
+ try {
268
+ console.log('Initializing husky...');
269
+ execSync('npx husky init', { cwd, stdio: 'pipe' });
270
+ console.log('Initialized husky');
271
+ }
272
+ catch {
273
+ console.warn('Could not initialize husky automatically');
274
+ console.warn('Run: npx husky init');
275
+ return;
276
+ }
277
+ }
278
+ if (!existsSync(preCommitPath) || force) {
279
+ writeFileSync(preCommitPath, HUSKY_PRE_COMMIT);
280
+ chmodSync(preCommitPath, '755');
281
+ console.log('Created .husky/pre-commit');
282
+ }
283
+ else {
284
+ const existing = readFileSync(preCommitPath, 'utf-8');
285
+ if (existing.includes('npm test')) {
286
+ writeFileSync(preCommitPath, HUSKY_PRE_COMMIT);
287
+ chmodSync(preCommitPath, '755');
288
+ console.log('Replaced default pre-commit with lint-staged + gitleaks');
289
+ return;
290
+ }
291
+ let updated = false;
292
+ if (!existing.includes('lint-staged')) {
293
+ appendFileSync(preCommitPath, '\nnpx lint-staged\n');
294
+ updated = true;
295
+ }
296
+ if (!existing.includes('gitleaks')) {
297
+ appendFileSync(preCommitPath, '\ngitleaks protect --staged --verbose\n');
298
+ updated = true;
299
+ }
300
+ if (updated) {
301
+ console.log('Updated .husky/pre-commit with lint-staged + gitleaks');
302
+ }
303
+ else {
304
+ console.log('.husky/pre-commit already configured');
305
+ }
306
+ }
307
+ }
308
+ function setupLintStaged(cwd, force) {
309
+ const configPath = join(cwd, '.lintstagedrc.json');
310
+ if (!existsSync(configPath) || force) {
311
+ writeFileSync(configPath, `${JSON.stringify(LINT_STAGED_CONFIG, null, 2)}\n`);
312
+ console.log('Created .lintstagedrc.json');
313
+ }
314
+ else {
315
+ console.log('.lintstagedrc.json already exists');
316
+ }
317
+ }
318
+ function checkGitleaks() {
319
+ try {
320
+ const checkCmd = process.platform === 'win32' ? 'where gitleaks' : 'command -v gitleaks';
321
+ execSync(checkCmd, { stdio: 'pipe' });
322
+ console.log('gitleaks found');
323
+ }
324
+ catch {
325
+ console.log('');
326
+ console.log('NOTE: gitleaks not found. Install it:');
327
+ console.log(' brew install gitleaks # macOS');
328
+ console.log(' apt install gitleaks # Debian/Ubuntu');
329
+ console.log(' choco install gitleaks # Windows');
330
+ console.log(' https://github.com/gitleaks/gitleaks#installing');
331
+ }
332
+ }
333
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * sherpa post - PostToolUse hook that offloads large outputs to scratch files
3
+ */
4
+ import { type GuardConfig } from '../types.js';
5
+ /**
6
+ * Load guard config from .claude/guard.json or fallback locations
7
+ */
8
+ export declare function loadGuardConfig(): GuardConfig;
9
+ /**
10
+ * Offload large output to a scratch file
11
+ */
12
+ export declare function offloadOutput(output: string, exitCode: number, config: GuardConfig): {
13
+ modified: boolean;
14
+ result: string;
15
+ };
16
+ /**
17
+ * Main entry point for PostToolUse hook
18
+ */
19
+ export declare function runPost(): void;
20
+ //# sourceMappingURL=post.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post.d.ts","sourceRoot":"","sources":["../../src/commands/post.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH,OAAO,EAAkB,KAAK,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9D;;GAEG;AACH,wBAAgB,eAAe,IAAI,WAAW,CAM7C;AAiFD;;GAEG;AACH,wBAAgB,aAAa,CAC5B,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,WAAW,GACjB;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CA6CvC;AAED;;GAEG;AACH,wBAAgB,OAAO,IAAI,IAAI,CAkD9B"}