{"version":3,"sources":["../src/commands/index.ts","../src/provisioning/hooks.ts","../src/index.ts","../src/commands/status.ts","../src/provisioning/uv.ts","../src/registration/mcp.ts","../src/commands/setup.ts","../src/provisioning/python.ts","../src/provisioning/jcodemunch.ts","../src/registration/assets.ts","../src/registration/commands.ts","../src/registration/agents.ts","../src/commands/doctor.ts","../src/commands/uninstall.ts","../src/cli.ts"],"sourcesContent":["import { Command } from 'commander'\nimport { VERSION } from '../index.js'\nimport { showStatus } from './status.js'\nimport { runSetup } from './setup.js'\nimport { runDoctor } from './doctor.js'\nimport { runUninstall } from './uninstall.js'\n\nexport function createProgram(): Command {\n  const program = new Command()\n\n  program\n    .name('gsd-munch')\n    .version(VERSION)\n    .description('GSD workflow orchestration + jCodeMunch code indexing for Claude Code')\n    .action(() => {\n      showStatus()\n    })\n\n  program\n    .command('setup')\n    .description('Provision Python/uv and register jCodeMunch MCP server')\n    .option('--project', 'Register MCP server at project scope (.mcp.json)')\n    .action(async (opts: { project?: boolean }) => {\n      await runSetup(opts)\n    })\n\n  program\n    .command('doctor')\n    .description('Check installation health (flutter doctor pattern)')\n    .action(async () => {\n      await runDoctor()\n    })\n\n  program\n    .command('uninstall')\n    .description('Remove all gsd-munch files from ~/.claude/')\n    .action(async () => {\n      await runUninstall()\n    })\n\n  return program\n}\n","import { existsSync, readFileSync, writeFileSync, chmodSync, unlinkSync } from 'node:fs'\nimport { join } from 'node:path'\n\nexport const HOOK_MARKER = '# gsd-munch: auto re-index on commit'\n\n/**\n * Installs a post-commit hook in the given git repo that re-indexes changed files\n * using the jCodeMunch venv Python directly (bypassing MCP protocol).\n *\n * @param repoRoot     Absolute path to the git repository root\n * @param venvPythonPath  Absolute path to the venv Python binary\n * @param pkgPythonDir    Absolute path to the package python/ dir (PYTHONPATH)\n * @returns 'installed'      — hook was created/appended successfully\n *          'already_present' — hook already has the gsd-munch marker (idempotent)\n *          'skipped'         — .git/hooks/ directory not found (not a git repo)\n */\nexport function installPostCommitHook(\n  repoRoot: string,\n  venvPythonPath: string,\n  pkgPythonDir: string,\n): 'installed' | 'already_present' | 'skipped' {\n  const gitHooksDir = join(repoRoot, '.git', 'hooks')\n  if (!existsSync(gitHooksDir)) {\n    return 'skipped'\n  }\n\n  const hookPath = join(gitHooksDir, 'post-commit')\n  const hookScript = buildHookScript(venvPythonPath, pkgPythonDir)\n\n  if (existsSync(hookPath)) {\n    const existing = readFileSync(hookPath, 'utf8')\n    if (existing.includes(HOOK_MARKER)) {\n      return 'already_present'\n    }\n    writeFileSync(hookPath, existing.trimEnd() + '\\n\\n' + hookScript + '\\n', 'utf8')\n  } else {\n    writeFileSync(hookPath, '#!/usr/bin/env bash\\n\\n' + hookScript + '\\n', 'utf8')\n  }\n  chmodSync(hookPath, 0o755)\n  return 'installed'\n}\n\n/**\n * Removes the gsd-munch post-commit hook block from a git repo's post-commit hook.\n * If the hook file only contained the gsd-munch block (plus optional shebang), deletes the file.\n *\n * @param repoRoot  Absolute path to the git repository root\n * @returns true if the hook block was found and removed, false otherwise\n */\nexport function removePostCommitHook(repoRoot: string): boolean {\n  const hookPath = join(repoRoot, '.git', 'hooks', 'post-commit')\n  if (!existsSync(hookPath)) {\n    return false\n  }\n\n  const content = readFileSync(hookPath, 'utf8')\n  if (!content.includes(HOOK_MARKER)) {\n    return false\n  }\n\n  // Remove from HOOK_MARKER to the next blank line after the closing `)`\n  // The block ends with `) &` followed by a newline, so strip from marker to end of block\n  const markerIndex = content.indexOf(HOOK_MARKER)\n  const beforeMarker = content.slice(0, markerIndex).trimEnd()\n\n  // Find the end of the block: look for `) &` after the marker position\n  const afterMarker = content.slice(markerIndex)\n  // The block closes with ) &\\n — find end of that line\n  const blockEndMatch = afterMarker.match(/\\) &\\n?/)\n  let afterBlock = ''\n  if (blockEndMatch && blockEndMatch.index !== undefined) {\n    afterBlock = afterMarker.slice(blockEndMatch.index + blockEndMatch[0].length).trimStart()\n  }\n\n  const cleaned = beforeMarker + (afterBlock ? '\\n\\n' + afterBlock : '')\n\n  // If remaining content is only the shebang line or empty, delete the file\n  const trimmed = cleaned.trim()\n  if (trimmed === '' || trimmed === '#!/usr/bin/env bash') {\n    unlinkSync(hookPath)\n  } else {\n    writeFileSync(hookPath, cleaned + '\\n', 'utf8')\n  }\n\n  return true\n}\n\n/**\n * Builds the post-commit hook shell script block with absolute paths embedded at install time.\n * The entire body runs in a background subshell and swallows all errors.\n */\nfunction buildHookScript(venvPython: string, pkgPythonDir: string): string {\n  return `${HOOK_MARKER}\n(\n  if [ -x \"${venvPython}\" ]; then\n    CHANGED_DIRS=$(git diff-tree --no-commit-id -r --name-only HEAD 2>/dev/null \\\\\n      | xargs -I{} dirname \"{}\" 2>/dev/null | sort -u | head -20)\n    for DIR in $CHANGED_DIRS; do\n      ABS_DIR=$(cd \"$DIR\" 2>/dev/null && pwd || true)\n      if [ -n \"$ABS_DIR\" ]; then\n        \"${venvPython}\" -c \"\nimport sys\nsys.path.insert(0, '${pkgPythonDir}')\nfrom jcodemunch_mcp.tools.index_folder import index_folder\ntry:\n    index_folder('$ABS_DIR')\nexcept Exception as e:\n    import os\n    log = os.path.expanduser('~/.code-index/reindex.log')\n    os.makedirs(os.path.dirname(log), exist_ok=True)\n    open(log, 'a').write(str(e) + '\\\\n')\n\" 2>/dev/null || true\n      fi\n    done\n  fi\n) &`\n}\n","export const VERSION = '0.10.0'\n\nexport { installPostCommitHook, removePostCommitHook, HOOK_MARKER } from './provisioning/hooks.js'\n","import { existsSync } from 'node:fs'\nimport { VERSION } from '../index.js'\nimport { getDefaultUvPath, getDefaultUvxPath } from '../provisioning/uv.js'\nimport { getMcpRegistrationStatus } from '../registration/mcp.js'\n\nconst noColor = process.env.NO_COLOR !== undefined\n\nconst GREEN = noColor ? '' : '\\x1b[32m'\nconst RED = noColor ? '' : '\\x1b[31m'\nconst DIM = noColor ? '' : '\\x1b[2m'\nconst RESET = noColor ? '' : '\\x1b[0m'\n\nconst CHECK = noColor ? '[ok]' : `${GREEN}✓${RESET}`\nconst CROSS = noColor ? '[x]' : `${RED}✗${RESET}`\n\nexport function showStatus(): void {\n  const uvProvisioned = existsSync(getDefaultUvPath())\n  const mcpStatus = getMcpRegistrationStatus()\n  const mcpRegistered = mcpStatus.userScope\n  const jcodemunchReady = existsSync(getDefaultUvxPath())\n\n  const anyFailed = !uvProvisioned || !mcpRegistered || !jcodemunchReady\n\n  console.log(`gsd-munch v${VERSION}`)\n  console.log('')\n  console.log('  Status:')\n  console.log(\n    `    Python/uv ........... ${uvProvisioned ? CHECK : CROSS} ${uvProvisioned ? 'provisioned' : 'not found'}`,\n  )\n  console.log(\n    `    MCP server .......... ${mcpRegistered ? CHECK : CROSS} ${mcpRegistered ? 'registered' : 'not registered'}`,\n  )\n  console.log(\n    `    jCodeMunch .......... ${jcodemunchReady ? CHECK : CROSS} ${jcodemunchReady ? 'ready' : 'not ready'}`,\n  )\n  if (anyFailed) {\n    console.log(`    ${DIM}run: gsd-munch setup${RESET}`)\n  }\n  console.log('')\n  console.log('  Commands:')\n  console.log('    gsd-munch setup     Provision Python & register MCP')\n  console.log('    gsd-munch doctor    Check installation health')\n  console.log('')\n  console.log('  GSD workflows available via Claude Code:')\n  console.log(\n    '    /gsd:new-project, /gsd:plan-phase, /gsd:execute-phase, /gsd:verify-work, /gsd:ship',\n  )\n}\n","import { execFile } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport { existsSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\n\nconst execFileAsync = promisify(execFile)\n\nexport function getDefaultUvPath(): string {\n  const home = homedir()\n  if (process.platform === 'win32') {\n    return join(home, '.local', 'bin', 'uv.exe')\n  }\n  return join(home, '.local', 'bin', 'uv')\n}\n\nexport function getDefaultUvxPath(): string {\n  const home = homedir()\n  if (process.platform === 'win32') {\n    return join(home, '.local', 'bin', 'uvx.exe')\n  }\n  return join(home, '.local', 'bin', 'uvx')\n}\n\nasync function installUv(): Promise<void> {\n  const uvInstallDir = join(homedir(), '.local', 'bin')\n\n  if (process.platform === 'win32') {\n    await execFileAsync(\n      'powershell',\n      [\n        '-ExecutionPolicy',\n        'ByPass',\n        '-c',\n        `$env:UV_INSTALL_DIR=\"${uvInstallDir}\"; $env:UV_NO_MODIFY_PATH=1; irm https://astral.sh/uv/install.ps1 | iex`,\n      ],\n      { timeout: 60_000 },\n    )\n  } else {\n    await execFileAsync(\n      'sh',\n      [\n        '-c',\n        `UV_INSTALL_DIR=\"${uvInstallDir}\" UV_NO_MODIFY_PATH=1 curl -LsSf https://astral.sh/uv/install.sh | sh`,\n      ],\n      { timeout: 60_000 },\n    )\n  }\n}\n\nexport async function findOrInstallUv(): Promise<string> {\n  const defaultPath = getDefaultUvPath()\n  if (existsSync(defaultPath)) {\n    return defaultPath\n  }\n  await installUv()\n  if (existsSync(defaultPath)) {\n    return defaultPath\n  }\n  throw new Error(`uv binary not found at ${defaultPath} after installation`)\n}\n","import { readFileSync, existsSync, copyFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport writeFile from 'write-file-atomic'\n\ninterface McpServerEntry {\n  command: string\n  args?: string[]\n  env?: Record<string, string>\n}\n\ninterface ClaudeJson {\n  mcpServers?: Record<string, McpServerEntry>\n  [key: string]: unknown\n}\n\nfunction readJsonFile(filePath: string): ClaudeJson {\n  if (!existsSync(filePath)) {\n    return {}\n  }\n  try {\n    return JSON.parse(readFileSync(filePath, 'utf8')) as ClaudeJson\n  } catch {\n    // File exists but is corrupt — back it up and start fresh\n    const backupPath = `${filePath}.bak`\n    copyFileSync(filePath, backupPath)\n    return {}\n  }\n}\n\n/**\n * Detects and removes standalone jcodemunch MCP entries (uvx-based or jcodemunch-mcp entries).\n * Logs a warning if a standalone entry is replaced.\n */\nfunction removeStandaloneEntries(config: ClaudeJson): void {\n  if (!config.mcpServers) return\n\n  const standaloneKeys = ['jcodemunch-mcp', 'jcodemunch']\n  for (const key of standaloneKeys) {\n    const entry = config.mcpServers[key]\n    if (entry) {\n      const isStandalone =\n        entry.command?.includes('uvx') ||\n        entry.args?.some(arg => arg.includes('jcodemunch-mcp') || arg.includes('uvx'))\n      if (isStandalone) {\n        console.warn('gsd-munch: Replacing standalone jcodemunch MCP entry with bundled version.')\n        delete config.mcpServers[key]\n      }\n    }\n  }\n}\n\n/**\n * Registers jcodemunch in the user-scoped ~/.claude.json config using venv Python.\n * Reads the existing file, detects and replaces standalone entries, merges the\n * bundled venv-based entry, and writes atomically.\n * Preserves all other top-level keys in ~/.claude.json.\n *\n * @param venvPythonPath Absolute path to the venv Python binary\n * @param pythonPath Absolute path to the python/ directory (used as PYTHONPATH)\n */\nexport async function registerMcpUserScope(venvPythonPath: string, pythonPath: string): Promise<void> {\n  const claudeJsonPath = join(homedir(), '.claude.json')\n\n  const config = readJsonFile(claudeJsonPath)\n\n  removeStandaloneEntries(config)\n\n  config.mcpServers = {\n    ...(config.mcpServers ?? {}),\n    jcodemunch: {\n      command: venvPythonPath,\n      args: ['-m', 'jcodemunch_mcp.server'],\n      env: {\n        PYTHONPATH: pythonPath,\n        JCODEMUNCH_USE_AI_SUMMARIES: 'false',\n      },\n    },\n  }\n\n  await writeFile(claudeJsonPath, JSON.stringify(config, null, 2) + '\\n', 'utf8')\n}\n\n/**\n * Registers jcodemunch in a project-scoped .mcp.json file in the current working directory.\n * Reads the existing file, detects and replaces standalone entries, merges the\n * bundled venv-based entry, and writes atomically.\n * Preserves all other server entries.\n *\n * @param venvPythonPath Absolute path to the venv Python binary\n * @param pythonPath Absolute path to the python/ directory (used as PYTHONPATH)\n */\nexport async function registerMcpProjectScope(venvPythonPath: string, pythonPath: string): Promise<void> {\n  const mcpJsonPath = join(process.cwd(), '.mcp.json')\n\n  const config = readJsonFile(mcpJsonPath)\n\n  removeStandaloneEntries(config)\n\n  config.mcpServers = {\n    ...(config.mcpServers ?? {}),\n    jcodemunch: {\n      command: venvPythonPath,\n      args: ['-m', 'jcodemunch_mcp.server'],\n      env: {\n        PYTHONPATH: pythonPath,\n        JCODEMUNCH_USE_AI_SUMMARIES: 'false',\n      },\n    },\n  }\n\n  await writeFile(mcpJsonPath, JSON.stringify(config, null, 2) + '\\n', 'utf8')\n}\n\n/**\n * Fast file-based check for MCP registration status.\n * Does not spawn any processes — suitable for the status screen (<100ms).\n *\n * @returns Object indicating whether jcodemunch is registered at user and project scope\n */\nexport function getMcpRegistrationStatus(): { userScope: boolean; projectScope: boolean } {\n  let userScope = false\n  let projectScope = false\n\n  try {\n    const claudeJsonPath = join(homedir(), '.claude.json')\n    if (existsSync(claudeJsonPath)) {\n      const config = JSON.parse(readFileSync(claudeJsonPath, 'utf8')) as ClaudeJson\n      userScope = Boolean(config.mcpServers?.jcodemunch)\n    }\n  } catch {\n    userScope = false\n  }\n\n  try {\n    const mcpJsonPath = join(process.cwd(), '.mcp.json')\n    if (existsSync(mcpJsonPath)) {\n      const config = JSON.parse(readFileSync(mcpJsonPath, 'utf8')) as ClaudeJson\n      projectScope = Boolean(config.mcpServers?.jcodemunch)\n    }\n  } catch {\n    projectScope = false\n  }\n\n  return { userScope, projectScope }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport os from 'node:os'\nimport { findOrInstallUv } from '../provisioning/uv.js'\nimport { ensurePython } from '../provisioning/python.js'\nimport { ensureVenv, installJcodemunchDeps, getVenvPythonPath, getPythonPath } from '../provisioning/jcodemunch.js'\nimport { registerMcpUserScope, registerMcpProjectScope } from '../registration/mcp.js'\nimport { deployAssets } from '../registration/assets.js'\nimport { registerCommands, COMMANDS_GM_DIR } from '../registration/commands.js'\nimport { registerAgents, AGENTS_DIR } from '../registration/agents.js'\nimport { installPostCommitHook } from '../provisioning/hooks.js'\n\nexport async function runSetup(opts: { project?: boolean }): Promise<void> {\n  let uvPath = ''\n  let succeeded = 0\n  let failed = 0\n\n  // Step 1: Provision uv\n  console.log('Provisioning uv...')\n  try {\n    uvPath = await findOrInstallUv()\n    console.log(`  done: uv at ${uvPath}`)\n    succeeded++\n  } catch (err) {\n    console.error(`  error: ${(err as Error).message}`)\n    failed++\n  }\n\n  // Step 2: Install Python 3.10\n  console.log('Installing Python 3.10...')\n  if (uvPath) {\n    try {\n      await ensurePython(uvPath)\n      console.log('  done: Python 3.10 installed')\n      succeeded++\n    } catch (err) {\n      console.error(`  error: ${(err as Error).message}`)\n      failed++\n    }\n  } else {\n    console.error('  skipped: uv not available')\n    failed++\n  }\n\n  // Step 3: Create venv and install jCodeMunch deps\n  console.log('Installing jCodeMunch dependencies...')\n  if (uvPath) {\n    try {\n      await ensureVenv(uvPath)\n      await installJcodemunchDeps(uvPath)\n      console.log('  done: jCodeMunch deps installed')\n      succeeded++\n    } catch (err) {\n      console.error(`  error: ${(err as Error).message}`)\n      failed++\n    }\n  } else {\n    console.error('  skipped: uv not available')\n    failed++\n  }\n\n  // Step 4: Register MCP server\n  console.log(\n    opts.project\n      ? 'Registering MCP server (project scope)...'\n      : 'Registering MCP server (user scope)...',\n  )\n  const venvPythonPath = getVenvPythonPath()\n  const pythonPath = getPythonPath()\n  try {\n    if (opts.project) {\n      await registerMcpProjectScope(venvPythonPath, pythonPath)\n    } else {\n      await registerMcpUserScope(venvPythonPath, pythonPath)\n    }\n    console.log('  done: jcodemunch-mcp registered')\n    succeeded++\n  } catch (err) {\n    const errMsg = (err as Error).message\n    console.error(`  error: ${errMsg}`)\n    failed++\n\n    // Print manual instructions fallback\n    console.log('')\n    console.log(`gsd-munch: MCP registration failed: ${errMsg}`)\n    console.log('')\n    console.log('To register manually, add the following to ~/.claude.json under \"mcpServers\":')\n    console.log(`  \"jcodemunch\": {`)\n    console.log(`    \"command\": \"${venvPythonPath}\",`)\n    console.log(`    \"args\": [\"-m\", \"jcodemunch_mcp.server\"],`)\n    console.log(`    \"env\": {`)\n    console.log(`      \"PYTHONPATH\": \"${pythonPath}\",`)\n    console.log(`      \"JCODEMUNCH_USE_AI_SUMMARIES\": \"false\"`)\n    console.log(`    }`)\n    console.log(`  }`)\n  }\n\n  // Step 5: Deploy GSD workflow assets\n  console.log('Deploying GSD workflow assets...')\n\n  // Detect existing GSD installation and inform user about coexistence\n  const gsdPath = path.join(os.homedir(), '.claude', 'get-shit-done')\n  if (fs.existsSync(gsdPath)) {\n    console.log('  Detected existing GSD installation at ~/.claude/get-shit-done/')\n    console.log('  Both GSD (/gsd:*) and gsd-munch (/gm:*) can coexist safely.')\n  }\n\n  try {\n    await deployAssets()\n    console.log('  done: workflow assets deployed to ~/.claude/gsd-munch/')\n    succeeded++\n  } catch (err) {\n    console.error(`  error: ${(err as Error).message}`)\n    failed++\n  }\n\n  // Step 6: Register command stubs\n  console.log('Registering command stubs...')\n  try {\n    await registerCommands()\n    const stubCount = fs.existsSync(COMMANDS_GM_DIR)\n      ? fs.readdirSync(COMMANDS_GM_DIR).filter(f => f.endsWith('.md')).length\n      : 0\n    console.log(`  done: ${stubCount} command stubs written to ~/.claude/commands/gm/`)\n    succeeded++\n  } catch (err) {\n    console.error(`  error: ${(err as Error).message}`)\n    failed++\n  }\n\n  // Step 7: Register agent files\n  console.log('Registering agent files...')\n  try {\n    await registerAgents()\n    const agentCount = fs.existsSync(AGENTS_DIR)\n      ? fs.readdirSync(AGENTS_DIR).filter(f => f.startsWith('gsd-') && f.endsWith('.md')).length\n      : 0\n    console.log(`  done: ${agentCount} agent files written to ~/.claude/agents/`)\n    succeeded++\n  } catch (err) {\n    console.error(`  error: ${(err as Error).message}`)\n    failed++\n  }\n\n  // Step 8: Install post-commit hook for auto re-indexing\n  console.log('Installing post-commit hook...')\n  try {\n    const cwd = process.cwd()\n    const result = installPostCommitHook(cwd, venvPythonPath, getPythonPath())\n    if (result === 'installed') {\n      console.log('  done: post-commit hook installed for auto re-indexing')\n      succeeded++\n    } else if (result === 'already_present') {\n      console.log('  done: post-commit hook already installed')\n      succeeded++\n    } else {\n      console.log('  skipped: not a git repository')\n      succeeded++\n    }\n  } catch (err) {\n    console.error(`  error: ${(err as Error).message}`)\n    failed++\n  }\n\n  // Summary\n  const total = succeeded + failed\n  console.log('')\n  console.log(`Setup complete: ${succeeded}/${total} steps succeeded`)\n  if (failed > 0) {\n    console.log('Run `gsd-munch doctor` to verify your installation.')\n  }\n}\n","import { execFile } from 'node:child_process'\nimport { promisify } from 'node:util'\n\nconst execFileAsync = promisify(execFile)\n\n/**\n * Installs Python 3.10 via the provided uv binary path.\n * This operation is idempotent — uv skips installation if Python 3.10 is already present.\n *\n * @param uvPath Absolute path to the uv binary\n */\nexport async function ensurePython(uvPath: string): Promise<void> {\n  await execFileAsync(uvPath, ['python', 'install', '3.10'], {\n    timeout: 120_000,\n  })\n}\n","import { execFile } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport { existsSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { dirname, join, resolve } from 'node:path'\n\nconst execFileAsync = promisify(execFile)\n\n/**\n * Returns the npm package root directory.\n * Computed as one level up from __dirname since compiled .cjs output lives in dist/.\n * Throws if the vendored jCodeMunch server.py is not found at the expected path.\n */\nexport function getPackageRoot(): string {\n  const root = resolve(dirname(__filename), '..')\n  const serverPath = join(root, 'python', 'jcodemunch_mcp', 'server.py')\n  if (!existsSync(serverPath)) {\n    throw new Error(\n      `jCodeMunch vendored source not found at ${serverPath} -- reinstall gsd-munch`,\n    )\n  }\n  return root\n}\n\n/**\n * Returns the absolute path to the vendored jCodeMunch server.py entry point.\n */\nexport function getServerPath(): string {\n  return join(getPackageRoot(), 'python', 'jcodemunch_mcp', 'server.py')\n}\n\n/**\n * Returns the python/ directory path, used as PYTHONPATH when spawning the MCP server.\n */\nexport function getPythonPath(): string {\n  return join(getPackageRoot(), 'python')\n}\n\n/**\n * Returns the fixed venv location at ~/.local/share/gsd-munch/venv.\n */\nexport function getVenvPath(): string {\n  return join(homedir(), '.local', 'share', 'gsd-munch', 'venv')\n}\n\n/**\n * Returns the absolute path to the venv Python binary.\n * Checks bin/python3 then bin/python on Unix; Scripts/python3.exe then Scripts/python.exe on Windows.\n * Falls back to bin/python (unix) or Scripts/python.exe (windows) if neither exists.\n */\nexport function getVenvPythonPath(): string {\n  const venvPath = getVenvPath()\n\n  if (process.platform === 'win32') {\n    const python3 = join(venvPath, 'Scripts', 'python3.exe')\n    const python = join(venvPath, 'Scripts', 'python.exe')\n    if (existsSync(python3)) return python3\n    if (existsSync(python)) return python\n    return python\n  }\n\n  const python3 = join(venvPath, 'bin', 'python3')\n  const python = join(venvPath, 'bin', 'python')\n  if (existsSync(python3)) return python3\n  if (existsSync(python)) return python\n  return python\n}\n\n/**\n * Creates the venv at the fixed location if it does not already exist.\n * Uses uv venv with Python 3.10.\n *\n * @param uvPath Absolute path to the uv binary\n */\nexport async function ensureVenv(uvPath: string): Promise<void> {\n  const venvPath = getVenvPath()\n  await execFileAsync(uvPath, ['venv', '--python', '3.10', '--allow-existing', venvPath], {\n    timeout: 60_000,\n  })\n}\n\n/**\n * Installs jCodeMunch Python dependencies into the venv using uv pip install.\n * Reads from python/requirements.txt in the package root.\n * Uses a 180s timeout to allow for large wheel downloads (tree-sitter-language-pack).\n *\n * @param uvPath Absolute path to the uv binary\n */\nexport async function installJcodemunchDeps(uvPath: string): Promise<void> {\n  const venvPath = getVenvPath()\n  const requirementsPath = join(getPackageRoot(), 'python', 'requirements.txt')\n  await execFileAsync(\n    uvPath,\n    ['pip', 'install', '--python', venvPath, '-r', requirementsPath],\n    { timeout: 180_000 },\n  )\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport os from 'node:os'\n\n/**\n * Returns the stable gsd-munch home directory path.\n * Mirrors upstream GSD's ~/.claude/get-shit-done/ pattern.\n */\nexport function getGsdMunchHome(): string {\n  return path.join(os.homedir(), '.claude', 'gsd-munch')\n}\n\n/**\n * Returns the package root directory (one level above dist/).\n */\nexport function getPkgRoot(): string {\n  return path.resolve(__dirname, '..')\n}\n\n/**\n * Transforms file content by replacing all upstream GSD path references\n * with the gsd-munch equivalents. Three passes in order:\n *\n * 1. Replace bash-invoked gsd-tools path (shell expansion not available in @-refs)\n * 2. Replace any remaining get-shit-done path fragments (catches @-refs and absolute paths)\n * 3. Replace /gsd: command namespace with /gm:\n * 4. Replace name: gsd: frontmatter field with name: gm:\n *\n * CRITICAL: After transformation, output must not contain 'get-shit-done'.\n */\nexport function transformContent(content: string, gsdMunchHome: string): string {\n  return content\n    // Pass 1: Replace bash-invoked gsd-tools path (quoted shell invocation)\n    .replaceAll(\n      '\"$HOME/.claude/get-shit-done/bin/gsd-tools.cjs\"',\n      `\"${gsdMunchHome}/bin/gsd-tools.cjs\"`\n    )\n    // Pass 2: Replace any remaining get-shit-done path fragments\n    // Matches paths like @/Users/foo/.claude/get-shit-done/ or /Users/foo/.claude/get-shit-done/\n    // Uses a capture group to preserve any leading @ character from @-references\n    .replaceAll(\n      /(@?)\\/[^\\s\"']*\\.claude\\/get-shit-done\\//g,\n      `$1${gsdMunchHome}/`\n    )\n    // Pass 3: Replace name: gsd: frontmatter field\n    .replaceAll('name: gsd:', 'name: gm:')\n    // Pass 4: Replace /gsd: command namespace references\n    .replaceAll('/gsd:', '/gm:')\n}\n\n/**\n * Recursively copies files from srcDir to destDir, applying transformer to each file's content.\n * Creates destDir if it doesn't exist.\n */\nexport async function deployDirectory(\n  srcDir: string,\n  destDir: string,\n  transformer: (content: string) => string\n): Promise<void> {\n  fs.mkdirSync(destDir, { recursive: true })\n  const entries = fs.readdirSync(srcDir, { withFileTypes: true })\n  for (const entry of entries) {\n    const srcPath = path.join(srcDir, entry.name)\n    const destPath = path.join(destDir, entry.name)\n    if (entry.isDirectory()) {\n      await deployDirectory(srcPath, destPath, transformer)\n    } else {\n      const content = fs.readFileSync(srcPath, 'utf-8')\n      fs.writeFileSync(destPath, transformer(content), 'utf-8')\n    }\n  }\n}\n\n/**\n * Deploys all GSD workflow assets to the gsd-munch home directory.\n * Deploys: workflows/, templates/, references/, bin/ directories + VERSION file.\n * All file content is transformed with path substitution before writing.\n *\n * @param gsdMunchHome Deployment target directory (defaults to ~/.claude/gsd-munch)\n */\nexport async function deployAssets(gsdMunchHome = getGsdMunchHome()): Promise<void> {\n  const pkgRoot = getPkgRoot()\n  const transformer = (content: string) => transformContent(content, gsdMunchHome)\n\n  const dirs = ['workflows', 'templates', 'references', 'bin', 'hooks', 'contexts']\n  for (const dir of dirs) {\n    const srcDir = path.join(pkgRoot, dir)\n    if (fs.existsSync(srcDir)) {\n      await deployDirectory(srcDir, path.join(gsdMunchHome, dir), transformer)\n    }\n  }\n\n  // Copy VERSION verbatim (no transformation needed)\n  const versionSrc = path.join(pkgRoot, 'VERSION')\n  if (fs.existsSync(versionSrc)) {\n    fs.mkdirSync(gsdMunchHome, { recursive: true })\n    fs.copyFileSync(versionSrc, path.join(gsdMunchHome, 'VERSION'))\n  }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport os from 'node:os'\nimport { transformContent, getGsdMunchHome, getPkgRoot } from './assets.js'\n\n/**\n * Target directory for gsd-munch command stubs.\n * Coexists alongside upstream GSD's ~/.claude/commands/gsd/ without conflict.\n */\nexport const COMMANDS_GM_DIR = path.join(os.homedir(), '.claude', 'commands', 'gm')\n\n/**\n * Reads all .md command stub templates from the package commands/ directory,\n * applies transformContent to each (updating paths and /gsd: -> /gm: namespace),\n * and writes them to ~/.claude/commands/gm/.\n *\n * Creates the target directory if it doesn't exist.\n * Safe to re-run — overwrites existing stubs (idempotent by design).\n *\n * @param gsdMunchHome Deployed assets home directory (defaults to ~/.claude/gsd-munch)\n */\nexport async function registerCommands(gsdMunchHome = getGsdMunchHome()): Promise<void> {\n  const stubSrcDir = path.join(getPkgRoot(), 'commands')\n\n  if (!fs.existsSync(stubSrcDir)) {\n    return\n  }\n\n  fs.mkdirSync(COMMANDS_GM_DIR, { recursive: true })\n\n  for (const file of fs.readdirSync(stubSrcDir)) {\n    if (!file.endsWith('.md')) continue\n    const content = fs.readFileSync(path.join(stubSrcDir, file), 'utf-8')\n    const adapted = transformContent(content, gsdMunchHome)\n    fs.writeFileSync(path.join(COMMANDS_GM_DIR, file), adapted, 'utf-8')\n  }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport os from 'node:os'\nimport { transformContent, getGsdMunchHome, getPkgRoot } from './assets.js'\n\n/**\n * Target directory for Claude Code agent files.\n * Agent filenames preserve gsd-* naming (gsd-executor.md, gsd-planner.md, etc.)\n * as these are internal implementation names referenced by workflows.\n */\nexport const AGENTS_DIR = path.join(os.homedir(), '.claude', 'agents')\n\n/**\n * Reads all .md agent files from the package agents/ directory,\n * applies transformContent to each (updating paths and /gsd: -> /gm: namespace),\n * and writes them to ~/.claude/agents/.\n *\n * IMPORTANT: Agent filenames are preserved as gsd-*.md — the /gm: namespace\n * change applies only to user-facing command stubs. Agent names are internal\n * identifiers referenced by workflows when spawning subagents.\n *\n * Creates the target directory if it doesn't exist.\n * Safe to re-run — overwrites existing agent files (idempotent by design).\n *\n * @param gsdMunchHome Deployed assets home directory (defaults to ~/.claude/gsd-munch)\n */\nexport async function registerAgents(gsdMunchHome = getGsdMunchHome()): Promise<void> {\n  const agentSrcDir = path.join(getPkgRoot(), 'agents')\n\n  if (!fs.existsSync(agentSrcDir)) {\n    return\n  }\n\n  fs.mkdirSync(AGENTS_DIR, { recursive: true })\n\n  for (const file of fs.readdirSync(agentSrcDir)) {\n    if (!file.endsWith('.md')) continue\n    const content = fs.readFileSync(path.join(agentSrcDir, file), 'utf-8')\n    const adapted = transformContent(content, gsdMunchHome)\n    // Agent filenames stay as gsd-*.md — no name transformation\n    fs.writeFileSync(path.join(AGENTS_DIR, file), adapted, 'utf-8')\n  }\n}\n","import { execFile } from 'node:child_process'\nimport { promisify } from 'node:util'\nimport { existsSync, readdirSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { homedir } from 'node:os'\nimport { getDefaultUvPath } from '../provisioning/uv.js'\nimport { getVenvPythonPath, getPythonPath } from '../provisioning/jcodemunch.js'\nimport { getMcpRegistrationStatus } from '../registration/mcp.js'\nimport { COMMANDS_GM_DIR } from '../registration/commands.js'\nimport { AGENTS_DIR } from '../registration/agents.js'\nimport { getGsdMunchHome } from '../registration/assets.js'\n\nconst execFileAsync = promisify(execFile)\n\nconst noColor = process.env.NO_COLOR !== undefined\n\nconst GREEN = noColor ? '' : '\\x1b[32m'\nconst RED = noColor ? '' : '\\x1b[31m'\nconst YELLOW = noColor ? '' : '\\x1b[33m'\nconst DIM = noColor ? '' : '\\x1b[2m'\nconst RESET = noColor ? '' : '\\x1b[0m'\n\nconst CHECK = noColor ? '[ok]' : `${GREEN}✓${RESET}`\nconst CROSS = noColor ? '[x]' : `${RED}✗${RESET}`\nconst WARN = noColor ? '[!]' : `${YELLOW}!${RESET}`\n\nconst REQUIRED_LANGUAGES = [\n  'python', 'javascript', 'typescript', 'go', 'rust', 'java',\n  'php', 'dart', 'c_sharp', 'c', 'cpp', 'elixir', 'ruby', 'sql',\n]\n\nexport async function runDoctor(): Promise<void> {\n  let passed = 0\n  let total = 0\n\n  console.log('gsd-munch doctor')\n  console.log('')\n\n  // Check 1: uv installed\n  total++\n  const uvPath = getDefaultUvPath()\n  const uvExists = existsSync(uvPath)\n  if (uvExists) {\n    try {\n      const { stdout } = await execFileAsync(uvPath, ['--version'], { timeout: 10_000 })\n      const version = stdout.trim()\n      console.log(`${CHECK} uv installed ... ${version}`)\n      passed++\n    } catch {\n      console.log(`${CHECK} uv installed ... ${DIM}(version check failed)${RESET}`)\n      passed++\n    }\n  } else {\n    console.log(`${CROSS} uv installed ... not found at ${uvPath}`)\n  }\n\n  // Check 2: Python available\n  total++\n  if (uvExists) {\n    try {\n      await execFileAsync(uvPath, ['python', 'find', '3.10'], { timeout: 10_000 })\n      console.log(`${CHECK} Python 3.10 available`)\n      passed++\n    } catch (err) {\n      const msg = (err as NodeJS.ErrnoException).message ?? 'not found'\n      console.log(`${CROSS} Python 3.10 available ... ${msg}`)\n    }\n  } else {\n    console.log(`${CROSS} Python 3.10 available ... skipped (uv not found)`)\n  }\n\n  // Check 3: MCP registered (user scope)\n  total++\n  const mcpStatus = getMcpRegistrationStatus()\n  if (mcpStatus.userScope) {\n    console.log(`${CHECK} MCP registered (user scope)`)\n    passed++\n  } else {\n    console.log(`${CROSS} MCP registered (user scope) ... not found in ~/.claude.json`)\n  }\n\n  // Check 4: MCP server starts (venv Python)\n  total++\n  const venvPython = getVenvPythonPath()\n  const pythonModulePath = getPythonPath()\n  const venvPythonExists = existsSync(venvPython)\n  if (venvPythonExists) {\n    const controller = new AbortController()\n    const timer = setTimeout(() => controller.abort(), 10_000)\n    try {\n      await execFileAsync(venvPython, ['-m', 'jcodemunch_mcp.server', '--help'], {\n        signal: controller.signal,\n        timeout: 10_000,\n        env: { ...process.env, PYTHONPATH: pythonModulePath, JCODEMUNCH_USE_AI_SUMMARIES: 'false' },\n      })\n      clearTimeout(timer)\n      console.log(`${CHECK} MCP server starts`)\n      passed++\n    } catch (err) {\n      clearTimeout(timer)\n      const errNode = err as NodeJS.ErrnoException\n      if (errNode.code === 'ABORT_ERR' || errNode.name === 'AbortError') {\n        // Timed out with some output — consider this a pass (server started but --help hung)\n        console.log(`${CHECK} MCP server starts ... ${DIM}(timed out after 10s — process started)${RESET}`)\n        passed++\n      } else if (errNode.code === 'ENOENT') {\n        console.log(`${CROSS} MCP server starts ... venv Python not found at ${venvPython}`)\n        console.log(`  Run \\`gsd-munch setup\\` to provision the venv.`)\n      } else {\n        // Non-zero exit code from --help is still a \"started\" signal for many CLIs\n        const exitCode = (err as { code?: number }).code\n        if (typeof exitCode === 'number' && exitCode !== 0) {\n          console.log(`${CHECK} MCP server starts ... ${DIM}(exited ${exitCode})${RESET}`)\n          passed++\n        } else {\n          console.log(`${CROSS} MCP server starts ... ${errNode.message}`)\n        }\n      }\n    }\n  } else {\n    console.log(`${CROSS} MCP server starts ... venv Python not found at ${venvPython}`)\n    console.log(`  Run \\`gsd-munch setup\\` to provision the venv.`)\n  }\n\n  // Check 5: Grammar health (14 languages)\n  total++\n  if (venvPythonExists) {\n    const checkScript = `\nimport sys\nfrom tree_sitter_language_pack import get_language\nlangs = ${JSON.stringify(REQUIRED_LANGUAGES)}\nok = 0\nfailed = []\nfor lang in langs:\n    try:\n        get_language(lang)\n        ok += 1\n    except Exception:\n        failed.append(lang)\nprint(f\"{ok}/{len(langs)}\")\nif failed:\n    print(\",\".join(failed))\nsys.exit(0 if ok == len(langs) else 1)\n`\n    try {\n      const { stdout } = await execFileAsync(\n        venvPython,\n        ['-c', checkScript],\n        {\n          timeout: 30_000,\n          env: { ...process.env, PYTHONPATH: pythonModulePath },\n        },\n      )\n      const lines = stdout.trim().split('\\n')\n      const countLine = lines[0] ?? ''\n      console.log(`${CHECK} ${countLine} languages ready`)\n      passed++\n    } catch (err) {\n      const errNode = err as NodeJS.ErrnoException & { stdout?: string }\n      const stdoutStr = errNode.stdout ?? ''\n      const lines = stdoutStr.trim().split('\\n')\n      const countLine = lines[0] ?? '0/14'\n      const missingLine = lines[1] ?? ''\n      console.log(`${CROSS} ${countLine} languages ready`)\n      if (missingLine) {\n        console.log(`  Missing: ${missingLine}`)\n      }\n      console.log(`  Run \\`gsd-munch setup\\` to reinstall grammars.`)\n    }\n  } else {\n    console.log(`${CROSS} 0/14 languages ready ... venv not provisioned`)\n    console.log(`  Run \\`gsd-munch setup\\` to reinstall grammars.`)\n  }\n\n  // Check 6: Index health (end-to-end)\n  total++\n  if (venvPythonExists) {\n    const indexScript = `\nimport tempfile, os, sys, shutil\nsys.path.insert(0, '${pythonModulePath.replace(/\\\\/g, '\\\\\\\\')}')\nfrom jcodemunch_mcp.tools.index_folder import index_folder\nfrom jcodemunch_mcp.tools.get_file_outline import get_file_outline\ntmp = tempfile.mkdtemp()\nidx = tempfile.mkdtemp()\ntry:\n    test_file = os.path.join(tmp, 'test_health.py')\n    with open(test_file, 'w') as f:\n        f.write('def health_check():\\\\n    return True\\\\n')\n    result = index_folder(tmp, use_ai_summaries=False, storage_path=idx)\n    if not result.get('success'):\n        print(f\"index_folder failed: {result.get('error', 'unknown error')}\", file=sys.stderr)\n        sys.exit(1)\n    repo = result.get('repo', '')\n    outline = get_file_outline(repo, 'test_health.py', storage_path=idx)\n    assert 'health_check' in str(outline), f'Symbol not found in outline: {outline}'\n    print('ok')\nfinally:\n    shutil.rmtree(tmp, ignore_errors=True)\n    shutil.rmtree(idx, ignore_errors=True)\n`\n    try {\n      await execFileAsync(\n        venvPython,\n        ['-c', indexScript],\n        {\n          timeout: 30_000,\n          env: { ...process.env, PYTHONPATH: pythonModulePath, JCODEMUNCH_USE_AI_SUMMARIES: 'false' },\n        },\n      )\n      console.log(`${CHECK} Index health ... passed`)\n      passed++\n    } catch (err) {\n      const errNode = err as NodeJS.ErrnoException & { stderr?: string }\n      const stderrStr = errNode.stderr ?? errNode.message ?? 'unknown error'\n      const shortErr = stderrStr.split('\\n').filter(Boolean).pop() ?? stderrStr\n      console.log(`${CROSS} Index health ... ${shortErr}`)\n      console.log(`  Run \\`gsd-munch setup\\` to reinstall dependencies.`)\n    }\n  } else {\n    console.log(`${CROSS} Index health ... venv not provisioned`)\n    console.log(`  Run \\`gsd-munch setup\\` to reinstall dependencies.`)\n  }\n\n  // --- GSD Workflow Asset Checks ---\n  console.log('')\n  console.log('GSD workflow assets:')\n\n  // Check 7: Command stubs exist\n  total++\n  if (existsSync(COMMANDS_GM_DIR)) {\n    const stubFiles = readdirSync(COMMANDS_GM_DIR).filter(f => f.endsWith('.md'))\n    const stubCount = stubFiles.length\n    if (stubCount >= 30) {\n      console.log(`${CHECK} command stubs ... ${stubCount} stubs in ~/.claude/commands/gm/`)\n      passed++\n    } else if (stubCount === 0) {\n      console.log(`${WARN} command stubs ... directory exists but no .md files found`)\n    } else {\n      console.log(`${WARN} command stubs ... only ${stubCount} stubs found (expected >= 30)`)\n      passed++\n    }\n  } else {\n    console.log(`${CROSS} command stubs ... ~/.claude/commands/gm/ not found`)\n  }\n\n  // Check 8: Stub @-references resolve\n  total++\n  if (existsSync(COMMANDS_GM_DIR)) {\n    const stubFiles = readdirSync(COMMANDS_GM_DIR).filter(f => f.endsWith('.md'))\n    const brokenRefs: string[] = []\n    for (const file of stubFiles) {\n      const content = readFileSync(join(COMMANDS_GM_DIR, file), 'utf-8')\n      // Extract @/absolute/path references\n      const refMatches = content.match(/@(\\/[^\\s\\n\"'`.,)}\\]]+)/g) ?? []\n      for (const ref of refMatches) {\n        const refPath = ref.slice(1) // strip leading @\n        if (!existsSync(refPath)) {\n          brokenRefs.push(`${file}: ${ref}`)\n        }\n      }\n    }\n    if (brokenRefs.length === 0) {\n      console.log(`${CHECK} stub @-references resolve ... all references valid`)\n      passed++\n    } else {\n      console.log(`${CROSS} stub @-references resolve ... ${brokenRefs.length} broken reference(s):`)\n      for (const ref of brokenRefs.slice(0, 5)) {\n        console.log(`    ${ref}`)\n      }\n      if (brokenRefs.length > 5) {\n        console.log(`    ... and ${brokenRefs.length - 5} more`)\n      }\n    }\n  } else {\n    console.log(`${CROSS} stub @-references resolve ... ~/.claude/commands/gm/ not found`)\n  }\n\n  // Check 9: Agent files exist\n  total++\n  if (existsSync(AGENTS_DIR)) {\n    const agentFiles = readdirSync(AGENTS_DIR).filter(f => f.startsWith('gsd-') && f.endsWith('.md'))\n    const agentCount = agentFiles.length\n    if (agentCount >= 10) {\n      console.log(`${CHECK} agent files ... ${agentCount} gsd-*.md files in ~/.claude/agents/`)\n      passed++\n    } else if (agentCount === 0) {\n      console.log(`${WARN} agent files ... ~/.claude/agents/ exists but no gsd-*.md files found`)\n    } else {\n      console.log(`${WARN} agent files ... only ${agentCount} agent files found (expected >= 10)`)\n      passed++\n    }\n  } else {\n    console.log(`${WARN} agent files ... ~/.claude/agents/ directory not found`)\n  }\n\n  // Check 10: No stale get-shit-done references\n  total++\n  const staleRefs: string[] = []\n  const dirsToCheck = [COMMANDS_GM_DIR, getGsdMunchHome()]\n  for (const dir of dirsToCheck) {\n    if (!existsSync(dir)) continue\n    const checkDir = (dirPath: string) => {\n      try {\n        for (const entry of readdirSync(dirPath, { withFileTypes: true })) {\n          const entryPath = join(dirPath, entry.name)\n          if (entry.isDirectory()) {\n            checkDir(entryPath)\n          } else if (entry.isFile()) {\n            try {\n              const content = readFileSync(entryPath, 'utf-8')\n              if (/\\.claude\\/get-shit-done\\//.test(content)) {\n                staleRefs.push(entryPath)\n              }\n            } catch {\n              // Skip unreadable files\n            }\n          }\n        }\n      } catch {\n        // Skip unreadable directories\n      }\n    }\n    checkDir(dir)\n  }\n  if (staleRefs.length === 0) {\n    console.log(`${CHECK} no stale get-shit-done references`)\n    passed++\n  } else {\n    console.log(`${CROSS} stale get-shit-done references found in ${staleRefs.length} file(s):`)\n    for (const ref of staleRefs.slice(0, 3)) {\n      console.log(`    ${ref}`)\n    }\n    if (staleRefs.length > 3) {\n      console.log(`    ... and ${staleRefs.length - 3} more`)\n    }\n  }\n\n  // Check 11: gsd-tools.cjs callable\n  total++\n  const gsdToolsPath = join(getGsdMunchHome(), 'bin', 'gsd-tools.cjs')\n  if (existsSync(gsdToolsPath)) {\n    console.log(`${CHECK} gsd-tools.cjs present ... ${gsdToolsPath}`)\n    passed++\n  } else {\n    console.log(`${CROSS} gsd-tools.cjs present ... not found at ${gsdToolsPath}`)\n  }\n\n  // Summary\n  console.log('')\n  console.log(`${passed} of ${total} checks passed`)\n  if (passed < total) {\n    console.log('Run `gsd-munch setup` to fix provisioning issues.')\n  }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\nimport os from 'node:os'\n\nexport async function runUninstall(): Promise<void> {\n  // 1. Remove command stubs directory\n  const commandsGmDir = path.join(os.homedir(), '.claude', 'commands', 'gm')\n  if (fs.existsSync(commandsGmDir)) {\n    fs.rmSync(commandsGmDir, { recursive: true, force: true })\n    console.log('  Removed command stubs from ~/.claude/commands/gm/')\n  } else {\n    console.log('  ~/.claude/commands/gm/ not found — skipping')\n  }\n\n  // 2. Remove deployed assets\n  const gsdMunchHome = path.join(os.homedir(), '.claude', 'gsd-munch')\n  if (fs.existsSync(gsdMunchHome)) {\n    fs.rmSync(gsdMunchHome, { recursive: true, force: true })\n    console.log('  Removed deployed assets from ~/.claude/gsd-munch/')\n  } else {\n    console.log('  ~/.claude/gsd-munch/ not found — skipping')\n  }\n\n  // 3. Remove agent files (only gsd-*.md, not other agents)\n  const agentsDir = path.join(os.homedir(), '.claude', 'agents')\n  if (fs.existsSync(agentsDir)) {\n    const removed: string[] = []\n    for (const file of fs.readdirSync(agentsDir)) {\n      if (file.startsWith('gsd-') && file.endsWith('.md')) {\n        fs.rmSync(path.join(agentsDir, file))\n        removed.push(file)\n      }\n    }\n    if (removed.length > 0) {\n      console.log(`  Removed ${removed.length} agent files from ~/.claude/agents/`)\n    } else {\n      console.log('  No gsd-*.md agent files found in ~/.claude/agents/ — skipping')\n    }\n  } else {\n    console.log('  ~/.claude/agents/ not found — skipping')\n  }\n\n  // 4. Remove MCP entry from ~/.claude.json\n  const claudeJsonPath = path.join(os.homedir(), '.claude.json')\n  if (fs.existsSync(claudeJsonPath)) {\n    try {\n      const raw = fs.readFileSync(claudeJsonPath, 'utf-8')\n      const config = JSON.parse(raw) as { mcpServers?: Record<string, unknown>; [key: string]: unknown }\n      if (config.mcpServers?.jcodemunch) {\n        delete config.mcpServers.jcodemunch\n        // Remove empty mcpServers object if no servers remain\n        if (Object.keys(config.mcpServers).length === 0) {\n          delete config.mcpServers\n        }\n        fs.writeFileSync(claudeJsonPath, JSON.stringify(config, null, 2) + '\\n', 'utf-8')\n        console.log('  Removed jcodemunch MCP entry from ~/.claude.json')\n      }\n    } catch (err) {\n      console.warn(`  Warning: could not update ~/.claude.json: ${(err as Error).message}`)\n    }\n  }\n\n  console.log('')\n  console.log('  gsd-munch uninstalled. To reinstall, run: npm install -g gsd-munch')\n}\n","#!/usr/bin/env node\n\nimport { createProgram } from './commands/index.js'\n\ncreateProgram().parse()\n"],"mappings":"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","names":["import_node_fs","import_node_fs","import_node_path","import_node_fs","import_node_os","import_node_path","writeFile","import_node_fs","import_node_path","import_node_os","import_node_child_process","import_node_util","execFileAsync","import_node_child_process","import_node_util","import_node_fs","import_node_os","import_node_path","execFileAsync","python3","python","execFileAsync","import_node_fs","import_node_path","import_node_os","path","os","fs","import_node_fs","import_node_path","import_node_os","path","os","fs","import_node_fs","import_node_path","import_node_os","path","os","fs","path","os","fs","import_node_child_process","import_node_util","import_node_fs","import_node_path","execFileAsync","noColor","GREEN","RED","DIM","RESET","CHECK","CROSS","import_node_fs","import_node_path","import_node_os","path","os","fs"]}