@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.
- package/dist/chunk-3CILH2TO.js +387 -0
- package/dist/chunk-3CILH2TO.js.map +7 -0
- package/dist/chunk-5NF3BSD6.js +512 -0
- package/dist/chunk-5NF3BSD6.js.map +7 -0
- package/dist/chunk-IIU6U7TE.js +307 -0
- package/dist/chunk-IIU6U7TE.js.map +7 -0
- package/dist/chunk-LQZTKH3U.js +307 -0
- package/dist/chunk-LQZTKH3U.js.map +7 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +84 -0
- package/dist/cli.js.map +7 -0
- package/dist/commands/init.d.ts +7 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +333 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/post.d.ts +20 -0
- package/dist/commands/post.d.ts.map +1 -0
- package/dist/commands/post.js +183 -0
- package/dist/commands/post.js.map +1 -0
- package/dist/commands/pre.d.ts +18 -0
- package/dist/commands/pre.d.ts.map +1 -0
- package/dist/commands/pre.js +102 -0
- package/dist/commands/pre.js.map +1 -0
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +48 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/daemon-V2QDZTUB.js +89 -0
- package/dist/daemon-V2QDZTUB.js.map +7 -0
- package/dist/daemon.d.ts +9 -0
- package/dist/daemon.d.ts.map +1 -0
- package/dist/daemon.js +112 -0
- package/dist/daemon.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +7 -0
- package/dist/parser.d.ts +21 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +152 -0
- package/dist/parser.js.map +1 -0
- package/dist/reviewer/index.js +544 -0
- package/dist/reviewer/index.js.map +7 -0
- package/dist/rules.d.ts +21 -0
- package/dist/rules.d.ts.map +1 -0
- package/dist/rules.js +165 -0
- package/dist/rules.js.map +1 -0
- package/dist/status-Q6Z4TFJZ.js +52 -0
- package/dist/status-Q6Z4TFJZ.js.map +7 -0
- package/dist/types.d.ts +69 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +13 -0
- package/dist/types.js.map +1 -0
- 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
|
package/dist/cli.js.map
ADDED
|
@@ -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 @@
|
|
|
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"}
|