infra-kit 0.1.75 → 0.1.77

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/cli.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/entry/cli.ts", "../src/commands/doctor/doctor.ts", "../src/lib/logger/index.ts", "../src/commands/env-clear/env-clear.ts", "../src/lib/constants.ts", "../src/commands/env-init/env-init.ts", "../src/commands/env-list/env-list.ts", "../src/integrations/doppler/doppler-cli-auth.ts", "../src/integrations/doppler/doppler-project.ts", "../src/lib/git-utils/git-utils.ts", "../src/commands/env-load/env-load.ts", "../src/lib/command-echo/command-echo.ts", "../src/commands/env-status/env-status.ts", "../src/commands/gh-merge-dev/gh-merge-dev.ts", "../src/integrations/gh/gh-cli-auth/gh-cli-auth.ts", "../src/integrations/gh/gh-release-prs/gh-release-prs.ts", "../src/lib/version-utils/version-utils.ts", "../src/commands/gh-release-deliver/gh-release-deliver.ts", "../src/integrations/jira/api.ts", "../src/commands/gh-release-deploy-all/gh-release-deploy-all.ts", "../src/commands/gh-release-deploy-selected/gh-release-deploy-selected.ts", "../src/commands/gh-release-deploy-service/gh-release-deploy-service.ts", "../src/commands/gh-release-list/gh-release-list.ts", "../src/commands/release-create/release-create.ts", "../src/lib/release-utils/release-utils.ts", "../src/commands/release-create-batch/release-create-batch.ts", "../src/commands/worktrees-add/worktrees-add.ts", "../src/commands/worktrees-list/worktrees-list.ts", "../src/commands/worktrees-remove/worktrees-remove.ts", "../src/commands/worktrees-sync/worktrees-sync.ts"],
4
- "sourcesContent": ["import { Command } from 'commander'\n\nimport { doctor } from 'src/commands/doctor'\nimport { envClear } from 'src/commands/env-clear'\nimport { envInit } from 'src/commands/env-init'\nimport { envList } from 'src/commands/env-list'\nimport { envLoad } from 'src/commands/env-load'\nimport { envStatus } from 'src/commands/env-status'\n// Commands\nimport { ghMergeDev } from 'src/commands/gh-merge-dev'\nimport { ghReleaseDeliver } from 'src/commands/gh-release-deliver'\nimport { ghReleaseDeployAll } from 'src/commands/gh-release-deploy-all'\nimport { ghReleaseDeploySelected } from 'src/commands/gh-release-deploy-selected'\nimport { ghReleaseDeployService } from 'src/commands/gh-release-deploy-service'\nimport { ghReleaseList } from 'src/commands/gh-release-list'\nimport { releaseCreate } from 'src/commands/release-create'\nimport { releaseCreateBatch } from 'src/commands/release-create-batch'\nimport { worktreesAdd } from 'src/commands/worktrees-add'\nimport { worktreesList } from 'src/commands/worktrees-list'\nimport { worktreesRemove } from 'src/commands/worktrees-remove'\nimport { worktreesSync } from 'src/commands/worktrees-sync'\n\nconst program = new Command()\n\nprogram\n .command('merge-dev')\n .description('Merge dev branch into every release branch')\n .option('-a, --all', 'Select all active release branches')\n .option('-y, --yes', 'Skip confirmation prompt')\n .action(async (options) => {\n await ghMergeDev({ all: options.all, confirmedCommand: options.yes })\n })\n\nprogram\n .command('release-list')\n .description('List all release branches')\n .action(async () => {\n await ghReleaseList()\n })\n\nprogram\n .command('release-create')\n .description('Create a single release branch')\n .option('-v, --version <version>', 'Specify the version to create, e.g. 1.2.5')\n .option('-d, --description <description>', 'Optional description for the Jira version')\n .option('-y, --yes', 'Skip confirmation prompt')\n .option('--no-checkout', 'Do not checkout the created branch after creation (checkout is default)')\n .action(async (options) => {\n await releaseCreate({\n version: options.version,\n description: options.description,\n confirmedCommand: options.yes,\n checkout: options.checkout,\n })\n })\n\nprogram\n .command('release-create-batch')\n .description('Create multiple release branches (batch operation)')\n .option('-v, --versions <versions>', 'Specify the versions to create by comma, e.g. 1.2.5, 1.2.6')\n .option('-d, --description <description>', 'Optional description for the Jira versions')\n .option('-y, --yes', 'Skip confirmation prompt')\n .action(async (options) => {\n await releaseCreateBatch({\n versions: options.versions,\n description: options.description,\n confirmedCommand: options.yes,\n })\n })\n\nprogram\n .command('release-deploy-all')\n .description('Deploy any release branch to any environment')\n .option('-v, --version <version>', 'Specify the version to deploy, e.g. 1.2.5')\n .option('-e, --env <env>', 'Specify the environment to deploy to, e.g. dev')\n .option('--skip-terraform', 'Skip terraform deployment step')\n .action(async (options) => {\n await ghReleaseDeployAll({ version: options.version, env: options.env, skipTerraform: options.skipTerraform })\n })\n\nprogram\n .command('release-deploy-service')\n .description('Deploy specific service in release branch to any environment')\n .option('-v, --version <version>', 'Specify the version to deploy, e.g. 1.2.5')\n .option('-e, --env <env>', 'Specify the environment to deploy to, e.g. dev')\n .option('-s, --service <service>', 'Specify the service to deploy, e.g. client-be')\n .option('--skip-terraform', 'Skip terraform deployment step')\n .action(async (options) => {\n await ghReleaseDeployService({\n version: options.version,\n env: options.env,\n service: options.service,\n skipTerraform: options.skipTerraform,\n })\n })\n\nprogram\n .command('release-deploy-selected')\n .description('Deploy selected services from release branch to any environment')\n .option('-v, --version <version>', 'Specify the version to deploy, e.g. 1.2.5')\n .option('-e, --env <env>', 'Specify the environment to deploy to, e.g. dev')\n .option('-s, --services <services...>', 'Specify services to deploy, e.g. client-be client-fe')\n .option('--skip-terraform', 'Skip terraform deployment step')\n .action(async (options) => {\n await ghReleaseDeploySelected({\n version: options.version,\n env: options.env,\n services: options.services,\n skipTerraform: options.skipTerraform,\n })\n })\n\nprogram\n .command('release-deliver')\n .description('Release a new version to production')\n .option('-v, --version <version>', 'Specify the version to release, e.g. 1.2.5')\n .option('-y, --yes', 'Skip confirmation prompt')\n .action(async (options) => {\n await ghReleaseDeliver({ version: options.version, confirmedCommand: options.yes })\n })\n\nprogram\n .command('worktrees-sync')\n .description('Remove release worktrees whose PRs are no longer open')\n .option('-y, --yes', 'Skip confirmation prompt')\n .action(async (options) => {\n await worktreesSync({ confirmedCommand: options.yes })\n })\n\nprogram\n .command('worktrees-add')\n .description('Add git worktrees for release branches')\n .option('-y, --yes', 'Skip confirmation prompt')\n .option('-a, --all', 'Select all active release branches')\n .option('-c, --cursor', 'Open created worktrees in Cursor')\n .action(async (options) => {\n await worktreesAdd({ confirmedCommand: options.yes, all: options.all, cursor: options.cursor })\n })\n\nprogram\n .command('worktrees-list')\n .description('List all git worktrees with detailed information')\n .action(async () => {\n await worktreesList()\n })\n\nprogram\n .command('worktrees-remove')\n .description('Remove git worktrees for release branches')\n .option('-y, --yes', 'Skip confirmation prompt')\n .option('-a, --all', 'Select all active release branches')\n .action(async (options) => {\n await worktreesRemove({ confirmedCommand: options.yes, all: options.all })\n })\n\nprogram\n .command('doctor')\n .description('Check installation and authentication status of gh and doppler CLIs')\n .action(async () => {\n await doctor()\n })\n\nprogram\n .command('env-status')\n .description('Show Doppler authentication status and detected project info')\n .action(async () => {\n await envStatus()\n })\n\nprogram\n .command('env-list')\n .description('List available Doppler configs for the detected project')\n .action(async () => {\n await envList()\n })\n\nprogram\n .command('env-init')\n .description('Set up shell functions for env-load/env-clear in .zshrc')\n .action(async () => {\n await envInit()\n })\n\nprogram\n .command('env-load')\n .description('Load environment variables from Doppler. Usage: env-load -c dev (after shell init)')\n .option('-c, --config <config>', 'Environment config name to load (e.g. dev, arthur)')\n .option('-q, --quiet', 'Suppress info logging')\n .action(async (options) => {\n await envLoad({ config: options.config, quiet: options.quiet })\n })\n\nprogram\n .command('env-clear')\n .description('Clear previously loaded environment variables. Usage: env-clear (after shell init)')\n .action(async () => {\n await envClear()\n })\n\nprogram.parse()\n", "import { z } from 'zod'\nimport { $ } from 'zx'\n\nimport { logger } from 'src/lib/logger'\nimport type { ToolsExecutionResult } from 'src/types'\n\ninterface CheckResult {\n name: string\n status: 'pass' | 'fail'\n message: string\n}\n\nconst checkCommand = async (\n name: string,\n command: string[],\n successMsg: string,\n failMsg: string,\n): Promise<CheckResult> => {\n try {\n await $`${command}`\n\n return { name, status: 'pass', message: successMsg }\n } catch {\n return { name, status: 'fail', message: failMsg }\n }\n}\n\n/**\n * Check installation and authentication status of gh and doppler CLIs\n */\nexport const doctor = async (): Promise<ToolsExecutionResult> => {\n const checks: CheckResult[] = await Promise.all([\n checkCommand(\n 'gh installed',\n ['gh', '--version'],\n 'GitHub CLI is installed',\n 'GitHub CLI is not installed. Install from: https://cli.github.com/',\n ),\n checkCommand(\n 'gh authenticated',\n ['gh', 'auth', 'status'],\n 'GitHub CLI is authenticated',\n 'GitHub CLI is not authenticated. Run: gh auth login',\n ),\n checkCommand(\n 'doppler installed',\n ['doppler', '--version'],\n 'Doppler CLI is installed',\n 'Doppler CLI is not installed. Install from: https://docs.doppler.com/docs/install-cli',\n ),\n checkCommand(\n 'doppler authenticated',\n ['doppler', 'me'],\n 'Doppler CLI is authenticated',\n 'Doppler CLI is not authenticated. Run: doppler login',\n ),\n ])\n\n logger.info('Doctor check results:\\n')\n\n for (const check of checks) {\n const icon = check.status === 'pass' ? '[PASS]' : '[FAIL]'\n\n logger.info(` ${icon} ${check.name}: ${check.message}`)\n }\n\n const structuredContent = {\n checks: checks.map((c) => {\n return { name: c.name, status: c.status, message: c.message }\n }),\n allPassed: checks.every((c) => {\n return c.status === 'pass'\n }),\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n}\n\n// MCP Tool Registration\nexport const doctorMcpTool = {\n name: 'doctor',\n description: 'Check installation and authentication status of gh and doppler CLIs',\n inputSchema: {},\n outputSchema: {\n checks: z\n .array(\n z.object({\n name: z.string().describe('Name of the check'),\n status: z.enum(['pass', 'fail']).describe('Check result'),\n message: z.string().describe('Details about the check result'),\n }),\n )\n .describe('List of all check results'),\n allPassed: z.boolean().describe('Whether all checks passed'),\n },\n handler: doctor,\n}\n", "import process from 'node:process'\nimport pino from 'pino'\nimport pretty from 'pino-pretty'\n\n// eslint-disable-next-line sonarjs/publicly-writable-directories\nexport const LOG_FILE_PATH = '/tmp/mcp-infra-kit.log'\n\nexport const initLoggerMcp = () => {\n const logLevel = process.argv.includes('--debug') ? 'debug' : 'info'\n\n const logger = pino({ level: logLevel }, pino.destination({ dest: LOG_FILE_PATH }))\n\n logger.info(`Logger initialized with level: ${logLevel}. Logging to: ${LOG_FILE_PATH}`)\n\n return logger\n}\n\nexport const initLoggerCLI = () => {\n const logLevel = process.argv.includes('--debug') ? 'debug' : 'info'\n\n const ignoreFields = ['time', 'pid', 'hostname']\n\n if (logLevel === 'debug') {\n ignoreFields.push('level')\n }\n\n const logger = pino(\n { level: logLevel },\n pretty({\n destination: 2,\n ignore: ignoreFields.join(','),\n colorize: true,\n }),\n )\n\n return logger\n}\n\n// Singleton logger instance for CLI usage\nexport const logger = initLoggerCLI()\n", "import fs from 'node:fs'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { z } from 'zod'\n\nimport {\n ENV_CLEAR_FILE,\n ENV_LOAD_FILE,\n getSessionCacheDir,\n INFRA_KIT_ENV_CONFIG_VAR,\n INFRA_KIT_ENV_LOADED_AT_VAR,\n INFRA_KIT_ENV_PROJECT_VAR,\n parseVarNamesFromEnvFile,\n} from 'src/lib/constants'\nimport { logger } from 'src/lib/logger'\nimport type { ToolsExecutionResult } from 'src/types'\n\n/**\n * Clear previously loaded environment variables. Usage: env-clear (after running eval \"$(infra-kit env-init)\" in shell)\n */\nexport const envClear = async (): Promise<ToolsExecutionResult> => {\n const cacheDir = getSessionCacheDir()\n const envLoadPath = path.join(cacheDir, ENV_LOAD_FILE)\n\n if (!fs.existsSync(envLoadPath)) {\n logger.error('No loaded environment found. Run `env-load` first.')\n\n return {\n content: [\n {\n type: 'text',\n text: 'No loaded environment found. Run `env-load` first.',\n },\n ],\n }\n }\n\n const varNames = parseVarNamesFromEnvFile(envLoadPath)\n\n // Build unset script\n const unsetLines = [\n ...varNames.map((v) => {\n return `unset ${v}`\n }),\n `unset ${INFRA_KIT_ENV_CONFIG_VAR}`,\n `unset ${INFRA_KIT_ENV_PROJECT_VAR}`,\n `unset ${INFRA_KIT_ENV_LOADED_AT_VAR}`,\n ]\n\n // Write unset script to cache\n const clearFilePath = path.resolve(cacheDir, ENV_CLEAR_FILE)\n\n fs.mkdirSync(cacheDir, { recursive: true })\n fs.writeFileSync(clearFilePath, `${unsetLines.join('\\n')}\\n`)\n\n // REQUIRED\n process.stdout.write(`${clearFilePath}\\n`)\n\n // Remove env load file so env-clear can detect \"no env loaded\" next time\n fs.unlinkSync(envLoadPath)\n\n logger.info(`Cleared ${varNames.length} environment variables`)\n\n const structuredContent = {\n variableCount: varNames.length,\n unsetStatements: unsetLines,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n}\n\n// MCP Tool Registration\nexport const envClearMcpTool = {\n name: 'env-clear',\n description:\n 'Clear previously loaded environment variables. Usage: env-clear (after running eval \"$(infra-kit env-init)\" in shell)',\n inputSchema: {},\n outputSchema: {\n variableCount: z.number().describe('Number of variables cleared'),\n unsetStatements: z.array(z.string()).describe('Unset statements generated'),\n },\n handler: envClear,\n}\n", "import fs from 'node:fs'\nimport path from 'node:path'\nimport process from 'node:process'\n\n/**\n * List of environments for the project deployment\n */\nexport const ENVs = ['dev', 'arthur', 'renana', 'roman', 'eliran', 'oriana']\n\nexport const DOPPLER_PROJECT_MAP: Record<string, string> = {\n 'hulyo-monorepo': 'hulyo',\n 'travelist-monorepo': 'travelist',\n}\n\nexport const ENV_CACHE_DIR = './node_modules/.cache/infra-kit'\nexport const ENV_LOAD_FILE = 'env-load.env'\nexport const ENV_CLEAR_FILE = 'env-clear.sh'\n\nexport const INFRA_KIT_SESSION_VAR = 'INFRA_KIT_SESSION'\nexport const INFRA_KIT_ENV_CONFIG_VAR = 'INFRA_KIT_ENV_CONFIG'\nexport const INFRA_KIT_ENV_PROJECT_VAR = 'INFRA_KIT_ENV_PROJECT'\nexport const INFRA_KIT_ENV_LOADED_AT_VAR = 'INFRA_KIT_ENV_LOADED_AT'\n\nexport const parseVarNamesFromEnvFile = (filePath: string): string[] => {\n if (!fs.existsSync(filePath)) return []\n\n const content = fs.readFileSync(filePath, 'utf-8')\n\n return content\n .split('\\n')\n .filter((line) => line.includes('=') && !line.startsWith('set '))\n .map((line) => line.split('=')[0]!)\n}\n\nexport const getSessionCacheDir = (): string => {\n const session = process.env[INFRA_KIT_SESSION_VAR]\n\n if (!session) {\n throw new Error('INFRA_KIT_SESSION is not set. Run `source ~/.zshrc` or `infra-kit env-init` first.')\n }\n\n return path.join(ENV_CACHE_DIR, session)\n}\n\nexport const WORKTREES_DIR_SUFFIX = '-worktrees'\n// eslint-disable-next-line sonarjs/publicly-writable-directories\nexport const LOG_FILE_PATH = '/tmp/mcp-infra-kit.log'\n", "import fs from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\nimport process from 'node:process'\n\nimport { logger } from 'src/lib/logger'\n\nconst MARKER_COMMENT = '# infra-kit shell functions'\n\n/**\n * Append infra-kit shell functions directly to .zshrc.\n */\nexport const envInit = async (): Promise<void> => {\n const zshrcPath = path.join(os.homedir(), '.zshrc')\n const binPath = getBinPath()\n\n if (!fs.existsSync(binPath)) {\n logger.error(`Could not find infra-kit binary at ${binPath}`)\n\n return\n }\n\n const shellBlock = buildShellBlock(binPath)\n\n if (fs.existsSync(zshrcPath)) {\n const content = fs.readFileSync(zshrcPath, 'utf-8')\n const cleaned = removeExistingBlock(content)\n\n fs.writeFileSync(zshrcPath, cleaned)\n }\n\n fs.appendFileSync(zshrcPath, `\\n${shellBlock}\\n`)\n logger.info(`Added infra-kit shell functions to ${zshrcPath}`)\n logger.info('Run `source ~/.zshrc` or open a new terminal to activate.')\n}\n\nconst getBinPath = (): string => {\n // resolve the absolute path to the infra-kit binary\n return path.resolve(path.join(path.dirname(process.argv[1]!), 'cli.js'))\n}\n\nconst isBlockLine = (line: string): boolean => {\n return (\n line.startsWith('#') ||\n line.startsWith('env-load') ||\n line.startsWith('env-clear') ||\n line.startsWith('if ') ||\n line.startsWith(' export INFRA_KIT_SESSION') ||\n line.startsWith('fi')\n )\n}\n\nconst removeExistingBlock = (content: string): string => {\n const markerIdx = content.indexOf(MARKER_COMMENT)\n\n if (markerIdx === -1) return content\n\n const before = content.slice(0, markerIdx).replace(/\\n+$/, '')\n const afterLines = content.slice(markerIdx).split('\\n')\n\n let i = 0\n\n while (i < afterLines.length && isBlockLine(afterLines[i]!)) {\n i++\n }\n\n const remaining = afterLines.slice(i).join('\\n')\n\n return before + (remaining ? `\\n${remaining}` : '')\n}\n\nconst buildShellBlock = (binPath: string): string => {\n const runCmd = `node ${binPath}`\n\n return [\n MARKER_COMMENT,\n 'if [[ -z \"${INFRA_KIT_SESSION}\" ]]; then',\n ' export INFRA_KIT_SESSION=$(head -c 4 /dev/urandom | xxd -p)',\n 'fi',\n `env-load() { local f; f=$(${runCmd} env-load \"$@\") && source \"$f\"; }`,\n `env-clear() { local f; f=$(${runCmd} env-clear) && source \"$f\"; }`,\n ].join('\\n')\n}\n", "import { z } from 'zod'\n\nimport { validateDopplerCliAndAuth } from 'src/integrations/doppler'\nimport { getDopplerProject } from 'src/integrations/doppler/doppler-project'\nimport { ENVs } from 'src/lib/constants'\nimport { logger } from 'src/lib/logger'\nimport type { ToolsExecutionResult } from 'src/types'\n\n/**\n * List available Doppler configs for the detected project\n */\nexport const envList = async (): Promise<ToolsExecutionResult> => {\n await validateDopplerCliAndAuth()\n\n const project = await getDopplerProject()\n\n logger.info(`Doppler Project: ${project}\\n`)\n logger.info('Available Configs:')\n\n for (const env of ENVs) {\n logger.info(` - ${env}`)\n }\n\n const structuredContent = {\n project,\n configs: ENVs,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n}\n\n// MCP Tool Registration\nexport const envListMcpTool = {\n name: 'env-list',\n description: 'List available Doppler configs for the detected project',\n inputSchema: {},\n outputSchema: {\n project: z.string().describe('Detected Doppler project name'),\n configs: z.array(z.string()).describe('Available environment configs'),\n },\n handler: envList,\n}\n", "import process from 'node:process'\nimport { $ } from 'zx'\n\nimport { logger } from 'src/lib/logger'\n\n/**\n * Validate Doppler CLI installation and authentication status and throw an error if not valid\n */\nexport const validateDopplerCliAndAuth = async () => {\n try {\n await $`doppler --version`\n } catch (error: unknown) {\n logger.error({ error }, 'Error: Doppler CLI is not installed.')\n logger.error('Please install it from: https://docs.doppler.com/docs/install-cli')\n process.exit(1)\n }\n\n try {\n await $`doppler me`\n } catch (error: unknown) {\n logger.error({ error }, 'Error: Doppler CLI is not authenticated.')\n logger.error('Please authenticate by running: doppler login')\n process.exit(1)\n }\n}\n", "import path from 'node:path'\n\nimport { DOPPLER_PROJECT_MAP } from 'src/lib/constants'\nimport { getProjectRoot } from 'src/lib/git-utils'\n\n/**\n * Resolve Doppler project name from the current working directory\n */\nexport const getDopplerProject = async (): Promise<string> => {\n const projectRoot = await getProjectRoot()\n\n const dirName = path.basename(projectRoot)\n const dopplerProject = DOPPLER_PROJECT_MAP[dirName]\n\n if (!dopplerProject) {\n throw new Error(\n `Could not determine Doppler project for directory \"${dirName}\". ` +\n `Expected one of: ${Object.keys(DOPPLER_PROJECT_MAP).join(', ')}`,\n )\n }\n\n return dopplerProject\n}\n", "import { $ } from 'zx'\n\n/**\n * Get current git worktrees\n *\n * @returns [release/v1.18.22, release/v1.18.23, release/v1.18.24] or [feature/mobile-app, feature/explore-page, feature/login-page]\n */\nexport const getCurrentWorktrees = async (type: 'release' | 'feature'): Promise<string[]> => {\n const worktreesOutput = await $`git worktree list`\n\n const worktreeLines = worktreesOutput.stdout.split('\\n').filter(Boolean)\n\n const worktreePredicateMap = {\n release: releaseWorktreePredicate,\n feature: featureWorktreePredicate,\n }\n\n return worktreeLines.map(worktreePredicateMap[type]).filter((branch) => {\n return branch !== null\n })\n}\n\nconst releaseWorktreePredicate = (line: string): string | null => {\n const parts = line.split(' ').filter(Boolean)\n\n if (parts.length < 3 || !parts[0]?.includes('release/v')) return null\n\n return `release/${parts[0]?.split('/').pop() || ''}`\n}\n\nconst featureWorktreePredicate = (line: string): string | null => {\n const parts = line.split(' ').filter(Boolean)\n\n if (parts.length < 3 || !parts[0]?.includes('feature/')) return null\n\n return `feature/${parts[0]?.split('/').pop() || ''}`\n}\n\n/**\n * Get the current project root directory\n */\nexport const getProjectRoot = async (): Promise<string> => {\n const result = await $`git rev-parse --show-toplevel`\n\n return result.stdout.trim()\n}\n", "import select from '@inquirer/select'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { z } from 'zod'\nimport { $ } from 'zx'\n\nimport { validateDopplerCliAndAuth } from 'src/integrations/doppler'\nimport { getDopplerProject } from 'src/integrations/doppler/doppler-project'\nimport { commandEcho } from 'src/lib/command-echo'\nimport {\n ENV_LOAD_FILE,\n ENVs,\n INFRA_KIT_ENV_CONFIG_VAR,\n INFRA_KIT_ENV_LOADED_AT_VAR,\n INFRA_KIT_ENV_PROJECT_VAR,\n getSessionCacheDir,\n} from 'src/lib/constants'\nimport { logger } from 'src/lib/logger'\nimport type { ToolsExecutionResult } from 'src/types'\n\ninterface EnvLoadArgs {\n config?: string\n quiet?: boolean\n}\n\n/**\n * Load environment variables from Doppler for the given config\n */\nexport const envLoad = async (args: EnvLoadArgs): Promise<ToolsExecutionResult> => {\n await validateDopplerCliAndAuth()\n\n const { config, quiet } = args\n\n commandEcho.start('env-load')\n\n let selectedConfig = ''\n\n if (config) {\n selectedConfig = config\n } else {\n commandEcho.setInteractive()\n selectedConfig = await select({\n message: 'Select environment config',\n choices: ENVs.map((env) => {\n return { name: env, value: env }\n }),\n })\n }\n\n commandEcho.addOption('--config', selectedConfig)\n\n const project = await getDopplerProject()\n\n $.quiet = true\n const result =\n await $`doppler secrets download --no-file --format env --project ${project} --config ${selectedConfig}`\n\n $.quiet = false\n const envContent = result.stdout.trim()\n\n // Build env file content in dotenv format\n const loadedAt = new Date().toISOString()\n const envFileLines = [\n 'set -a',\n envContent,\n `${INFRA_KIT_ENV_CONFIG_VAR}=${selectedConfig}`,\n `${INFRA_KIT_ENV_PROJECT_VAR}=${project}`,\n `${INFRA_KIT_ENV_LOADED_AT_VAR}=${loadedAt}`,\n 'set +a',\n ]\n\n // Write env file to cache\n const cacheDir = getSessionCacheDir()\n const envFilePath = path.resolve(cacheDir, ENV_LOAD_FILE)\n\n fs.mkdirSync(cacheDir, { recursive: true })\n fs.writeFileSync(envFilePath, `${envFileLines.join('\\n')}\\n`)\n\n // REQUIRED\n process.stdout.write(`${envFilePath}\\n`)\n\n const varCount = envContent.split('\\n').filter((line) => line.includes('=')).length\n\n if (!quiet) {\n logger.info(`Loaded ${varCount} variables from ${project}/${selectedConfig}`)\n }\n\n const structuredContent = {\n variableCount: varCount,\n project,\n config: selectedConfig,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n}\n\n// MCP Tool Registration\nexport const envLoadMcpTool = {\n name: 'env-load',\n description:\n 'Load environment variables from Doppler for a given config. Usage: env-load -c dev (after running eval \"$(infra-kit env-init)\" in shell)',\n inputSchema: {\n config: z.string().describe('Environment config name to load (e.g. dev, arthur, renana)'),\n },\n outputSchema: {\n variableCount: z.number().describe('Number of variables loaded'),\n project: z.string().describe('Doppler project name'),\n config: z.string().describe('Doppler config name'),\n },\n handler: envLoad,\n}\n", "import { logger } from 'src/lib/logger'\n\ninterface CommandOption {\n flag: string\n value: string | string[] | boolean\n}\n\nconst createCommandEcho = () => {\n let commandName = ''\n let options: CommandOption[] = []\n let isInteractive = false\n\n return {\n /**\n * Initialize command echo for a new command\n */\n start(name: string): void {\n commandName = name\n options = []\n isInteractive = false\n },\n\n /**\n * Mark that the command had interactive input (prompts)\n * Call this once when ANY prompt happens\n */\n setInteractive(): void {\n isInteractive = true\n },\n\n /**\n * Track an option selection\n * @param flag The CLI flag (e.g., \"--version\")\n * @param value The selected value\n */\n addOption(flag: string, value: string | string[] | boolean): void {\n options.push({ flag, value })\n },\n\n /**\n * Print the equivalent CLI command if there was interactive input\n */\n print(): void {\n if (!isInteractive || options.length === 0) {\n return\n }\n\n const formattedOptions = options\n .map((opt) => {\n if (typeof opt.value === 'boolean') {\n return opt.value ? opt.flag : ''\n }\n\n if (Array.isArray(opt.value)) {\n return `${opt.flag} \"${opt.value.join(', ')}\"`\n }\n\n return `${opt.flag} ${opt.value}`\n })\n .filter(Boolean)\n .join(' ')\n\n logger.info('')\n logger.info('# Equivalent command:')\n logger.info(`pnpm exec infra-kit ${commandName} ${formattedOptions}`)\n },\n\n /**\n * Reset state (useful for testing)\n */\n reset(): void {\n commandName = ''\n options = []\n isInteractive = false\n },\n }\n}\n\n// Singleton instance (same pattern as logger)\nexport const commandEcho = createCommandEcho()\n", "import path from 'node:path'\nimport process from 'node:process'\nimport { z } from 'zod'\n\nimport { validateDopplerCliAndAuth } from 'src/integrations/doppler'\nimport { getDopplerProject } from 'src/integrations/doppler/doppler-project'\nimport {\n ENV_LOAD_FILE,\n ENVs,\n INFRA_KIT_ENV_CONFIG_VAR,\n INFRA_KIT_ENV_LOADED_AT_VAR,\n INFRA_KIT_ENV_PROJECT_VAR,\n INFRA_KIT_SESSION_VAR,\n getSessionCacheDir,\n parseVarNamesFromEnvFile,\n} from 'src/lib/constants'\nimport { logger } from 'src/lib/logger'\nimport type { ToolsExecutionResult } from 'src/types'\n\n/**\n * Show Doppler authentication status and detected project info\n */\nexport const envStatus = async (): Promise<ToolsExecutionResult> => {\n await validateDopplerCliAndAuth()\n\n const project = await getDopplerProject()\n\n logger.info('Doppler Environment Status:\\n')\n logger.info(` Authenticated: yes`)\n logger.info(` Detected Project: ${project}`)\n logger.info(` Available Configs: ${ENVs.join(', ')}`)\n\n // Check session-loaded vars \u2014 getSessionCacheDir() throws if INFRA_KIT_SESSION is unset\n const cacheDir = getSessionCacheDir()\n\n const sessionId = process.env[INFRA_KIT_SESSION_VAR]!\n const envLoadPath = path.join(cacheDir, ENV_LOAD_FILE)\n\n let sessionLoadedCount = 0\n let sessionTotalCount = 0\n const sessionConfig = process.env[INFRA_KIT_ENV_CONFIG_VAR] ?? null\n const sessionProject = process.env[INFRA_KIT_ENV_PROJECT_VAR] ?? null\n const sessionLoadedAt = process.env[INFRA_KIT_ENV_LOADED_AT_VAR] ?? null\n\n if (sessionConfig) {\n const varNames = parseVarNamesFromEnvFile(envLoadPath)\n\n if (varNames.length > 0) {\n sessionTotalCount = varNames.length\n sessionLoadedCount = varNames.filter((v) => {\n return v in process.env\n }).length\n }\n\n logger.info(\n ` Session: ${sessionLoadedCount} of ${sessionTotalCount} vars loaded (project: ${sessionProject}, config: ${sessionConfig}, loaded at: ${sessionLoadedAt})`,\n )\n logger.info(` Session ID: ${sessionId}`)\n } else {\n logger.info(' Session: no env loaded')\n }\n\n const structuredContent = {\n authenticated: true,\n project,\n configs: ENVs,\n sessionId,\n sessionLoadedCount,\n sessionTotalCount,\n sessionConfig,\n sessionProject,\n sessionLoadedAt,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n}\n\n// MCP Tool Registration\nexport const envStatusMcpTool = {\n name: 'env-status',\n description: 'Show Doppler authentication status and detected project info',\n inputSchema: {},\n outputSchema: {\n authenticated: z.boolean().describe('Whether the user is authenticated'),\n project: z.string().describe('Detected Doppler project name'),\n configs: z.array(z.string()).describe('Available environment configs'),\n sessionId: z.string().describe('Current terminal session ID'),\n sessionLoadedCount: z.number().describe('Number of cached vars active in the current session'),\n sessionTotalCount: z.number().describe('Total number of cached var names'),\n sessionConfig: z.string().nullable().describe('Doppler config name of the loaded session'),\n sessionProject: z.string().nullable().describe('Doppler project name of the loaded session'),\n sessionLoadedAt: z.string().nullable().describe('ISO 8601 timestamp of when the env was loaded'),\n },\n handler: envStatus,\n}\n", "/* eslint-disable sonarjs/cognitive-complexity */\nimport checkbox from '@inquirer/checkbox'\nimport confirm from '@inquirer/confirm'\nimport process from 'node:process'\nimport { z } from 'zod'\nimport { $ } from 'zx'\n\nimport { getReleasePRs } from 'src/integrations/gh'\nimport { commandEcho } from 'src/lib/command-echo'\nimport { logger } from 'src/lib/logger'\nimport type { RequiredConfirmedOptionArg, ToolsExecutionResult } from 'src/types'\n\ninterface GhMergeDevArgs extends RequiredConfirmedOptionArg {\n all: boolean\n}\n\n/**\n * Merge dev into every release branch\n */\nexport const ghMergeDev = async (args: GhMergeDevArgs): Promise<ToolsExecutionResult> => {\n const { all, confirmedCommand } = args\n\n commandEcho.start('merge-dev')\n\n const releasePRsList = await getReleasePRs()\n\n if (releasePRsList.length === 0) {\n logger.info('\u2139\uFE0F No open release branches found')\n\n commandEcho.print()\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({ successfulMerges: 0, failedMerges: 0, failedBranches: [], totalBranches: 0 }, null, 2),\n },\n ],\n structuredContent: { successfulMerges: 0, failedMerges: 0, failedBranches: [], totalBranches: 0 },\n }\n }\n\n let selectedReleaseBranches: string[] = []\n\n if (all) {\n selectedReleaseBranches = releasePRsList\n } else {\n commandEcho.setInteractive()\n\n selectedReleaseBranches = await checkbox({\n required: true,\n message: '\uD83C\uDF3F Select release branches',\n choices: releasePRsList.map((pr) => {\n return {\n name: pr.replace('release/v', ''),\n value: pr,\n }\n }),\n })\n }\n\n // Track --all flag if all branches were selected (either via flag or interactively)\n const allSelected = selectedReleaseBranches.length === releasePRsList.length\n\n if (allSelected) {\n commandEcho.addOption('--all', true)\n } else {\n commandEcho.addOption('--branches', selectedReleaseBranches)\n }\n\n // Validate input\n // if (selectedReleaseBranches.length === 0) {\n // console.error('No branches provided. Exiting...')\n // process.exit(1)\n // }\n\n const answer = confirmedCommand\n ? true\n : await confirm({\n message: `Are you sure you want to merge dev into these branches: ${selectedReleaseBranches.join(', ')}?`,\n })\n\n if (!confirmedCommand) {\n commandEcho.setInteractive()\n }\n\n if (!answer) {\n logger.info('Operation cancelled. Exiting...')\n process.exit(0)\n }\n\n // Track --yes flag if confirmation was interactive (user confirmed)\n if (allSelected) {\n commandEcho.addOption('--yes', true)\n }\n\n $.quiet = true\n\n await $`git fetch origin`\n await $`git switch dev`\n await $`git pull origin dev`\n\n const failedBranches: string[] = []\n\n // Merge dev into each branch\n for (const branch of selectedReleaseBranches) {\n const success = await mergeDev(branch)\n\n if (!success) {\n failedBranches.push(branch)\n }\n }\n\n $.quiet = false\n\n if (failedBranches.length > 0) {\n logger.info(`\\n\u26A0\uFE0F ${failedBranches.length} branch(es) failed to merge automatically.\\n`)\n logger.info('\uD83D\uDCCB Manual merge script for failed branches:\\n')\n logger.info('```bash')\n for (const branch of failedBranches) {\n logger.info(`# Phase #1: Merge dev into ${branch}`)\n logger.info(`git switch ${branch} && git pull origin ${branch} && git merge origin/dev`)\n logger.info(`# Phase #2:Resolve conflicts if any, then:`)\n logger.info(`git push origin ${branch} && git switch dev`)\n }\n logger.info(\n `\u2705 ${selectedReleaseBranches.length - failedBranches.length}/${selectedReleaseBranches.length} merges completed successfully.`,\n )\n } else {\n logger.info('\u2705 All merges completed successfully!')\n }\n\n commandEcho.print()\n\n const structuredContent = {\n successfulMerges: selectedReleaseBranches.length - failedBranches.length,\n failedMerges: failedBranches.length,\n failedBranches,\n totalBranches: selectedReleaseBranches.length,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n}\n\nconst mergeDev = async (branch: string): Promise<boolean> => {\n try {\n await $`git switch ${branch}`\n\n await $`git pull origin ${branch}`\n\n await $`git merge origin/dev --no-edit`\n\n await $`git push origin ${branch}`\n\n await $`git switch dev`\n\n logger.info(`Successfully merged dev into ${branch}`)\n\n return true\n } catch (error: unknown) {\n logger.error({ error, branch }, `Error merging dev into ${branch}`)\n\n await $`git reset --merge HEAD~1`\n\n return false\n }\n}\n\n// MCP Tool Registration\nexport const ghMergeDevMcpTool = {\n name: 'gh-merge-dev',\n description: 'Merge dev branch into selected release branches',\n inputSchema: {\n all: z.boolean().describe('Merge dev into all release branches without prompting'),\n },\n outputSchema: {\n successfulMerges: z.number().describe('Number of successful merges'),\n failedMerges: z.number().describe('Number of failed merges'),\n failedBranches: z.array(z.string()).describe('List of branches that failed to merge'),\n totalBranches: z.number().describe('Total number of branches processed'),\n },\n handler: ghMergeDev,\n}\n", "import process from 'node:process'\nimport { $ } from 'zx'\n\nimport { logger } from 'src/lib/logger'\n\n/**\n * Validate GitHub CLI installation and authentication status and throw an error if not valid\n */\nexport const validateGitHubCliAndAuth = async () => {\n try {\n await $`gh --version`\n } catch (error: unknown) {\n logger.error({ error }, 'Error: GitHub CLI (gh) is not installed.')\n logger.error('Please install it from: https://cli.github.com/')\n process.exit(1)\n }\n\n try {\n await $`gh auth status`\n } catch (error: unknown) {\n logger.error({ error }, 'Error: GitHub CLI (gh) is not authenticated.')\n logger.error('Please authenticate it from: https://cli.github.com/manual/gh_auth_login or type \"gh auth login\"')\n process.exit(1)\n }\n}\n", "import process from 'node:process'\nimport { $ } from 'zx'\n\nimport { logger } from 'src/lib/logger'\nimport { sortVersions } from 'src/lib/version-utils'\n\ninterface ReleasePR {\n headRefName: string\n number: number\n state: string\n title: string\n baseRefName: string\n}\n\n/**\n * Fetch open release PRs from GitHub with 'Release' in the title and base 'dev'.\n * Returns an array of headRefName strings sorted by semver in ascending order.\n * Throws an error if fetching fails.\n *\n * @returns [release/v1.18.22, release/v1.18.23, release/v1.18.24] (sorted by semver)\n */\nexport const getReleasePRs = async (): Promise<string[]> => {\n try {\n // Example of releasePRs.output: {\"headRefName\":\"release/v1.8.0\",\"number\":665,\"state\":\"OPEN\",\"title\":\"WIP Release/v1.8.0\"}\n const releasePRs =\n await $`gh pr list --search \"Release in:title\" --base dev --json number,title,headRefName,state,baseRefName`\n\n const releasePRsArray: ReleasePR[] = JSON.parse(releasePRs.stdout)\n\n if (releasePRsArray.length === 0) {\n logger.error('\u274C No release PRs found. Check the project folder for the script. Exiting...')\n process.exit(1)\n }\n\n const headRefNames = releasePRsArray.map((pr) => {\n return pr.headRefName\n })\n\n return sortVersions(headRefNames)\n } catch (error) {\n logger.error({ error }, '\u274C Error fetching release PRs')\n process.exit(1)\n }\n}\n\ninterface CreateReleaseBranchArgs {\n version: string\n jiraVersionUrl: string\n}\n\n// Function to create a release branch\nexport const createReleaseBranch = async (\n args: CreateReleaseBranchArgs,\n): Promise<{ branchName: string; prUrl: string }> => {\n const { version, jiraVersionUrl } = args\n\n const branchName = `release/v${version}`\n\n try {\n $.quiet = true\n\n await $`git switch dev`\n await $`git pull origin dev`\n await $`git checkout -b ${branchName}`\n await $`git push -u origin ${branchName}`\n await $`git commit --allow-empty-message --allow-empty --message ''`\n await $`git push origin ${branchName}`\n\n // Create PR and capture URL\n const prResult =\n await $`gh pr create --title \"Release v${version}\" --body \"${jiraVersionUrl} \\n\" --base dev --head ${branchName}`\n\n const prLink = prResult.stdout.trim()\n\n await $`git switch dev`\n\n $.quiet = false\n\n return {\n branchName,\n prUrl: prLink,\n }\n } catch (error: unknown) {\n logger.error({ error, branchName }, `Error creating release branch ${branchName}`)\n\n throw error\n }\n}\n", "/**\n * Parse version string into major, minor, patch numbers\n */\nexport const parseVersion = (versionStr: string): [number, number, number] => {\n return versionStr.replace('release/', '').slice(1).split('.').map(Number) as [number, number, number]\n}\n\n/**\n * Sort version strings in ascending order\n * Note: Returns a new sorted array without mutating the original\n */\nexport const sortVersions = (versions: string[]): string[] => {\n return [...versions].sort((a, b) => {\n const [majA, minA, patchA] = parseVersion(a)\n const [majB, minB, patchB] = parseVersion(b)\n\n if (majA !== majB) return (majA ?? 0) - (majB ?? 0)\n if (minA !== minB) return (minA ?? 0) - (minB ?? 0)\n\n return (patchA ?? 0) - (patchB ?? 0)\n })\n}\n", "import confirm from '@inquirer/confirm'\nimport select from '@inquirer/select'\nimport process from 'node:process'\nimport { z } from 'zod'\nimport { $ } from 'zx'\n\nimport { getReleasePRs } from 'src/integrations/gh'\nimport { deliverJiraRelease, loadJiraConfigOptional } from 'src/integrations/jira'\nimport { commandEcho } from 'src/lib/command-echo'\nimport { logger } from 'src/lib/logger'\nimport type { RequiredConfirmedOptionArg, ToolsExecutionResult } from 'src/types'\n\ninterface GhReleaseDeliverArgs extends RequiredConfirmedOptionArg {\n version: string\n}\n\n/**\n * Deliver a release branch to production\n */\nexport const ghReleaseDeliver = async (args: GhReleaseDeliverArgs): Promise<ToolsExecutionResult> => {\n const { version, confirmedCommand } = args\n\n commandEcho.start('release-deliver')\n\n const releasePRsList = await getReleasePRs()\n\n let selectedReleaseBranch = '' // \"release/v1.8.0\"\n\n if (version) {\n selectedReleaseBranch = `release/v${version}`\n } else {\n commandEcho.setInteractive()\n\n selectedReleaseBranch = await select({\n message: '\uD83C\uDF3F Select release branch',\n choices: releasePRsList.map((pr) => {\n return {\n name: pr.replace('release/v', ''),\n value: pr,\n }\n }),\n })\n }\n\n const selectedVersion = selectedReleaseBranch.replace('release/v', '')\n\n commandEcho.addOption('--version', selectedVersion)\n\n // Check if release branch exists in the list\n if (!releasePRsList.includes(selectedReleaseBranch)) {\n logger.error(`\u274C Release branch ${selectedReleaseBranch} not found in open PRs. Exiting...`)\n process.exit(1)\n }\n\n const answer = confirmedCommand\n ? true\n : await confirm({\n message: `Are you sure you want to deliver version ${selectedReleaseBranch} to production?`,\n })\n\n if (!confirmedCommand) {\n commandEcho.setInteractive()\n }\n\n if (!answer) {\n logger.info('Operation cancelled. Exiting...')\n process.exit(0)\n }\n\n // Track --yes flag if confirmation was interactive (user confirmed)\n commandEcho.addOption('--yes', true)\n\n try {\n $.quiet = true\n\n await $`gh pr merge ${selectedReleaseBranch} --squash --admin --delete-branch` // TODO: add --body (AI for generate message)\n await $`gh pr create --base main --head dev --title \"Release v${selectedReleaseBranch.replace('release/v', '')} (RC)\" --body \"\"`\n await $`gh pr merge dev --squash --admin`\n\n $.quiet = false\n\n await $`gh workflow run deploy-all.yml --ref main -f environment=prod`\n\n $.quiet = true\n\n // Merge main into dev\n await $`git switch main && git pull && git switch dev && git pull && git merge main --no-edit && git push`\n\n $.quiet = false\n\n // Deliver Jira release if Jira is configured\n const jiraConfig = await loadJiraConfigOptional()\n\n if (jiraConfig) {\n try {\n const versionName = selectedReleaseBranch.replace('release/', '')\n\n await deliverJiraRelease({ versionName }, jiraConfig)\n // const result = await deliverJiraRelease({ versionName }, jiraConfig)\n\n // logger.info(\n // {\n // // versionId: result.version.id,\n // versionName: result.version.name,\n // // releaseDate: result.version.releaseDate,\n // },\n // 'Successfully delivered Jira release',\n // )\n } catch (error) {\n logger.error({ error }, 'Failed to deliver Jira release (non-blocking)')\n }\n } else {\n logger.info('\uD83D\uDD14 Jira is not configured, skipping Jira release delivery')\n }\n\n logger.info(`Successfully delivered ${selectedReleaseBranch} to production!`)\n\n commandEcho.print()\n\n const structuredContent = {\n releaseBranch: selectedReleaseBranch,\n version: selectedReleaseBranch.replace('release/v', ''),\n success: true,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n } catch (error: unknown) {\n logger.error({ error }, '\u274C Error merging release branch into dev')\n process.exit(1)\n }\n}\n\n// MCP Tool Registration\nexport const ghReleaseDeliverMcpTool = {\n name: 'gh-release-deliver',\n description: 'Deliver a release branch to production',\n inputSchema: {\n version: z.string().describe('Version to deliver to production (e.g., \"1.2.5\")'),\n },\n outputSchema: {\n releaseBranch: z.string().describe('The release branch that was delivered'),\n version: z.string().describe('The version that was delivered'),\n success: z.boolean().describe('Whether the delivery was successful'),\n },\n handler: ghReleaseDeliver,\n}\n", "import process from 'node:process'\n\nimport { logger } from 'src/lib/logger'\n\nimport type {\n CreateJiraVersionParams,\n CreateJiraVersionResult,\n DeliverJiraReleaseParams,\n DeliverJiraReleaseResult,\n JiraConfig,\n JiraVersion,\n UpdateJiraVersionParams,\n UpdateJiraVersionResult,\n} from './types.js'\n\n/**\n * Creates a new version in Jira using the REST API\n * @param params - Version creation parameters\n * @param config - Jira configuration (baseUrl, token, projectId)\n * @returns Result containing created version or error\n */\nexport const createJiraVersion = async (\n params: CreateJiraVersionParams,\n config: JiraConfig,\n): Promise<CreateJiraVersionResult> => {\n try {\n const { baseUrl, token, email, projectId } = config\n\n // Use current date if not provided\n // const releaseDate =\n // params.releaseDate || new Date().toISOString().split('T')[0] // 2025-12-06\n\n // Prepare request body\n const requestBody = {\n name: params.name,\n projectId: params.projectId || projectId,\n description: params.description || '',\n // releaseDate,\n released: params.released || false,\n archived: params.archived || false,\n }\n\n // logger.info(\n // { version: params.name, projectId: requestBody.projectId },\n // 'Creating Jira version',\n // )\n\n // Make API request\n const url = `${baseUrl}/rest/api/3/version`\n\n // Create Basic auth credentials\n const credentials = btoa(`${email}:${token}`)\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n Authorization: `Basic ${credentials}`,\n },\n body: JSON.stringify(requestBody),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n\n logger.error(\n {\n status: response.status,\n statusText: response.statusText,\n error: errorText,\n },\n 'Failed to create Jira version',\n )\n\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n const version = (await response.json()) as JiraVersion\n\n // logger.info(\n // { versionId: version.id, versionName: version.name },\n // 'Successfully created Jira version',\n // )\n\n return {\n success: true,\n version,\n }\n } catch (error) {\n logger.error({ error }, 'Error creating Jira version')\n\n throw error\n }\n}\n\n/**\n * Gets all versions for a project from Jira\n * @param config - Jira configuration\n * @returns Array of JiraVersion objects\n */\nconst getProjectVersions = async (config: JiraConfig): Promise<JiraVersion[]> => {\n try {\n const { baseUrl, token, email, projectId } = config\n\n const url = `${baseUrl}/rest/api/3/project/${projectId}/versions`\n const credentials = btoa(`${email}:${token}`)\n\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n Authorization: `Basic ${credentials}`,\n },\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n\n logger.error(\n {\n status: response.status,\n statusText: response.statusText,\n error: errorText,\n },\n 'Failed to get Jira project versions',\n )\n\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n const versions = (await response.json()) as JiraVersion[]\n\n return versions\n } catch (error) {\n logger.error({ error }, 'Error getting Jira project versions')\n\n throw error\n }\n}\n\n/**\n * Finds a Jira version by name in the project\n * @param versionName - Name of the version to find (e.g., \"v1.33.10\")\n * @param config - Jira configuration\n * @returns JiraVersion if found, null otherwise\n */\nconst findVersionByName = async (versionName: string, config: JiraConfig): Promise<JiraVersion | null> => {\n try {\n const versions = await getProjectVersions(config)\n const version = versions.find((v) => {\n return v.name === versionName\n })\n\n return version || null\n } catch (error) {\n logger.error({ error, versionName }, 'Error finding Jira version by name')\n\n throw error\n }\n}\n\n/**\n * Updates an existing Jira version\n * @param params - Update parameters\n * @param config - Jira configuration\n * @returns Result containing updated version or error\n */\nconst updateJiraVersion = async (\n params: UpdateJiraVersionParams,\n config: JiraConfig,\n): Promise<UpdateJiraVersionResult> => {\n try {\n const { baseUrl, token, email } = config\n\n // Prepare request body - only include fields that are provided\n const requestBody: Record<string, any> = {\n released: params.released ?? true,\n archived: params.archived ?? false,\n }\n\n // Add releaseDate if provided, otherwise use current date when releasing\n if (params.releaseDate) {\n requestBody.releaseDate = params.releaseDate\n } else if (params.released !== false) {\n requestBody.releaseDate = new Date().toISOString().split('T')[0] // YYYY-MM-DD\n }\n\n if (params.description !== undefined) {\n requestBody.description = params.description\n }\n\n const url = `${baseUrl}/rest/api/3/version/${params.versionId}`\n const credentials = btoa(`${email}:${token}`)\n\n const response = await fetch(url, {\n method: 'PUT',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n Authorization: `Basic ${credentials}`,\n },\n body: JSON.stringify(requestBody),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n\n logger.error(\n {\n status: response.status,\n statusText: response.statusText,\n error: errorText,\n },\n 'Failed to update Jira version',\n )\n\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n const version = (await response.json()) as JiraVersion\n\n return {\n success: true,\n version,\n }\n } catch (error) {\n logger.error({ error }, 'Error updating Jira version')\n\n throw error\n }\n}\n\n/**\n * Delivers a Jira release by marking it as released with the current date\n * @param params - Parameters containing the version name\n * @param config - Jira configuration\n * @returns Result containing updated version\n * @throws Error if version not found or update fails\n */\nexport const deliverJiraRelease = async (\n params: DeliverJiraReleaseParams,\n config: JiraConfig,\n): Promise<DeliverJiraReleaseResult> => {\n try {\n const { versionName } = params\n\n // Find the version by name\n const version = await findVersionByName(versionName, config)\n\n if (!version) {\n logger.error({ versionName }, 'Jira version not found')\n throw new Error(`Version \"${versionName}\" not found in Jira project`)\n }\n\n // Update the version to mark it as released\n const result = await updateJiraVersion(\n {\n versionId: version.id,\n released: true,\n releaseDate: new Date().toISOString().split('T')[0], // Current date in YYYY-MM-DD format\n },\n config,\n )\n\n return result\n } catch (error) {\n logger.error({ error }, 'Error delivering Jira release')\n throw error\n }\n}\n\n/**\n * Loads Jira configuration from environment variables\n * @throws Error with detailed message if configuration is missing or invalid\n * @returns Promise<JiraConfig>\n */\nexport const loadJiraConfig = async (): Promise<JiraConfig> => {\n const baseUrl = process.env.JIRA_BASE_URL\n const token = process.env.JIRA_TOKEN || process.env.JIRA_API_TOKEN\n const projectIdStr = process.env.JIRA_PROJECT_ID\n const email = process.env.JIRA_EMAIL\n\n const missingVars: string[] = []\n\n if (!baseUrl) missingVars.push('JIRA_BASE_URL (e.g., https://your-domain.atlassian.net)')\n if (!token) missingVars.push('JIRA_TOKEN or JIRA_API_TOKEN (your Jira API token)')\n if (!projectIdStr) missingVars.push('JIRA_PROJECT_ID (numeric project ID)')\n if (!email) missingVars.push('JIRA_EMAIL (your Jira email address)')\n\n if (missingVars.length > 0) {\n const errorMessage = [\n 'Jira configuration is required but incomplete.',\n 'Please configure the following environment variables:',\n ...missingVars.map((v) => {\n return ` - ${v}`\n }),\n '',\n 'You can set these in your .env file or as environment variables.',\n ].join('\\n')\n\n throw new Error(errorMessage)\n }\n\n const projectId = Number.parseInt(projectIdStr!, 10)\n\n if (Number.isNaN(projectId)) {\n throw new TypeError(`Invalid JIRA_PROJECT_ID: \"${projectIdStr}\" must be a numeric value (e.g., 10001)`)\n }\n\n return {\n baseUrl: baseUrl!.replace(/\\/$/, ''), // Remove trailing slash\n token: token!,\n projectId,\n email: email!,\n }\n}\n\n/**\n * Attempts to load Jira configuration from environment variables\n * Returns null if configuration is missing or invalid (for optional Jira integration)\n * @returns Promise<JiraConfig | null>\n */\nexport const loadJiraConfigOptional = async (): Promise<JiraConfig | null> => {\n try {\n const config = await loadJiraConfig()\n\n return config\n } catch (error) {\n logger.warn({ error }, 'Jira configuration not available, skipping Jira integration')\n\n return null\n }\n}\n", "import select from '@inquirer/select'\nimport process from 'node:process'\nimport { z } from 'zod'\nimport { $ } from 'zx'\n\nimport { getReleasePRs } from 'src/integrations/gh'\nimport { commandEcho } from 'src/lib/command-echo'\nimport { ENVs } from 'src/lib/constants'\nimport { logger } from 'src/lib/logger'\nimport type { ToolsExecutionResult } from 'src/types'\n\ninterface GhReleaseDeployAllArgs {\n version: string\n env: string\n skipTerraform?: boolean\n}\n\n/**\n * Deploy a release branch to an environment\n */\nexport const ghReleaseDeployAll = async (args: GhReleaseDeployAllArgs): Promise<ToolsExecutionResult> => {\n const { version, env, skipTerraform } = args\n\n commandEcho.start('release-deploy-all')\n\n // TODO: add validation for semver version for version variable\n\n const releasePRsList: string[] = ['dev'] // [\"release/v1.8.0\", \"release/v1.9.0\"]\n\n const releasePRs = await getReleasePRs()\n\n releasePRsList.push(...releasePRs)\n\n let selectedReleaseBranch = '' // \"release/v1.8.0\"\n\n if (version) {\n selectedReleaseBranch = version === 'dev' ? 'dev' : `release/v${version}`\n } else {\n commandEcho.setInteractive()\n\n selectedReleaseBranch = await select({\n message: '\uD83C\uDF3F Select release branch',\n choices: releasePRsList.map((pr) => {\n return {\n name: pr.replace('release/v', ''),\n value: pr,\n }\n }),\n })\n }\n\n const selectedVersion = selectedReleaseBranch === 'dev' ? 'dev' : selectedReleaseBranch.replace('release/v', '')\n\n commandEcho.addOption('--version', selectedVersion)\n\n // Check if release branch exists in the list\n if (!releasePRsList.includes(selectedReleaseBranch)) {\n logger.error(`\u274C Release branch ${selectedReleaseBranch} not found in open PRs. Exiting...`)\n process.exit(1)\n }\n\n let selectedEnv = ''\n\n if (env) {\n selectedEnv = env\n } else {\n commandEcho.setInteractive()\n\n selectedEnv = await select({\n message: '\uD83E\uDDEA Select environment',\n choices: ENVs.map((env) => {\n return {\n name: env,\n value: env,\n }\n }),\n })\n }\n\n commandEcho.addOption('--env', selectedEnv)\n\n if (!ENVs.includes(selectedEnv)) {\n logger.error(`\u274C Invalid environment: ${selectedEnv}. Exiting...`)\n process.exit(1)\n }\n\n const shouldSkipTerraform = skipTerraform ?? false\n\n if (shouldSkipTerraform) {\n commandEcho.addOption('--skip-terraform', true)\n }\n\n try {\n $.quiet = true\n\n const skipTerraformFlag = shouldSkipTerraform ? ['-f', 'skip_terraform_deploy=true'] : []\n\n await $`gh workflow run deploy-all.yml --ref ${selectedReleaseBranch} -f environment=${selectedEnv} ${skipTerraformFlag}`\n\n $.quiet = false\n\n logger.info(\n `Successfully launched deploy-all workflow_dispatch for release branch: ${selectedReleaseBranch} and environment: ${selectedEnv}`,\n )\n\n commandEcho.print()\n\n const structuredContent = {\n releaseBranch: selectedReleaseBranch,\n version: selectedReleaseBranch.replace('release/v', ''),\n environment: selectedEnv,\n skipTerraformDeploy: shouldSkipTerraform,\n success: true,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n } catch (error: unknown) {\n logger.error({ error }, '\u274C Error launching workflow')\n process.exit(1)\n }\n}\n\n// MCP Tool Registration\nexport const ghReleaseDeployAllMcpTool = {\n name: 'gh-release-deploy-all',\n description: 'Deploy a release branch to a specified environment',\n inputSchema: {\n version: z.string().describe('Version to deploy (e.g., \"1.2.5\")'),\n env: z.string().describe('Environment to deploy to (e.g., \"dev\", \"renana\", \"oriana\")'),\n skipTerraform: z.boolean().optional().describe('Skip terraform deployment step'),\n },\n outputSchema: {\n releaseBranch: z.string().describe('The release branch that was deployed'),\n version: z.string().describe('The version that was deployed'),\n environment: z.string().describe('The environment deployed to'),\n skipTerraformDeploy: z.boolean().describe('Whether terraform deployment was skipped'),\n success: z.boolean().describe('Whether the deployment was successful'),\n },\n handler: ghReleaseDeployAll,\n}\n", "import checkbox from '@inquirer/checkbox'\nimport select from '@inquirer/select'\nimport fs from 'node:fs/promises'\nimport { resolve } from 'node:path'\nimport process from 'node:process'\nimport yaml from 'yaml'\nimport { z } from 'zod'\nimport { $ } from 'zx'\n\nimport { getReleasePRs } from 'src/integrations/gh'\nimport { commandEcho } from 'src/lib/command-echo'\nimport { ENVs } from 'src/lib/constants'\nimport { getProjectRoot } from 'src/lib/git-utils'\nimport { logger } from 'src/lib/logger'\nimport type { ToolsExecutionResult } from 'src/types'\n\ninterface GhReleaseDeploySelectedArgs {\n version: string\n env: string\n services: string[]\n skipTerraform?: boolean\n}\n\n/**\n * Deploy selected services from a release branch to an environment\n */\n// eslint-disable-next-line sonarjs/cognitive-complexity\nexport const ghReleaseDeploySelected = async (args: GhReleaseDeploySelectedArgs): Promise<ToolsExecutionResult> => {\n const { version, env, services, skipTerraform } = args\n\n commandEcho.start('release-deploy-selected')\n\n const releasePRsList: string[] = ['dev']\n\n const releasePRs = await getReleasePRs()\n\n releasePRsList.push(...releasePRs)\n\n let selectedReleaseBranch = ''\n\n if (version) {\n selectedReleaseBranch = version === 'dev' ? 'dev' : `release/v${version}`\n } else {\n commandEcho.setInteractive()\n\n selectedReleaseBranch = await select({\n message: '\uD83C\uDF3F Select release branch',\n choices: releasePRsList.map((pr) => {\n return {\n name: pr.replace('release/v', ''),\n value: pr,\n }\n }),\n })\n }\n\n const selectedVersion = selectedReleaseBranch === 'dev' ? 'dev' : selectedReleaseBranch.replace('release/v', '')\n\n commandEcho.addOption('--version', selectedVersion)\n\n // Check if release branch exists in the list\n if (!releasePRsList.includes(selectedReleaseBranch)) {\n logger.error(`\u274C Release branch ${selectedReleaseBranch} not found in open PRs. Exiting...`)\n process.exit(1)\n }\n\n let selectedEnv = ''\n\n if (env) {\n selectedEnv = env\n } else {\n commandEcho.setInteractive()\n\n selectedEnv = await select({\n message: '\uD83E\uDDEA Select environment',\n choices: ENVs.map((env) => {\n return {\n name: env,\n value: env,\n }\n }),\n })\n }\n\n commandEcho.addOption('--env', selectedEnv)\n\n if (!ENVs.includes(selectedEnv)) {\n logger.error(`\u274C Invalid environment: ${selectedEnv}. Exiting...`)\n process.exit(1)\n }\n\n // Parse available services from workflow file\n const availableServices = await parseServicesFromWorkflow()\n\n if (availableServices.length === 0) {\n logger.error('\u274C No services found in workflow file. Exiting...')\n\n process.exit(1)\n }\n\n let selectedServices: string[] = []\n\n if (services && services.length > 0) {\n selectedServices = services\n } else {\n commandEcho.setInteractive()\n\n selectedServices = await checkbox({\n message: '\uD83D\uDE80 Select services to deploy (space to select, enter to confirm)',\n choices: availableServices.map((svc) => {\n return {\n name: svc,\n value: svc,\n }\n }),\n })\n }\n\n commandEcho.addOption('--services', selectedServices)\n\n if (selectedServices.length === 0) {\n logger.error('\u274C No services selected. Exiting...')\n process.exit(1)\n }\n\n // Validate all selected services\n const invalidServices = selectedServices.filter((svc) => {\n return !availableServices.includes(svc)\n })\n\n if (invalidServices.length > 0) {\n logger.error(\n `\u274C Invalid services: ${invalidServices.join(', ')}. Available services: ${availableServices.join(', ')}`,\n )\n process.exit(1)\n }\n\n const shouldSkipTerraform = skipTerraform ?? false\n\n if (shouldSkipTerraform) {\n commandEcho.addOption('--skip-terraform', true)\n }\n\n try {\n $.quiet = true\n\n // Build the workflow command with boolean flags for each selected service\n const serviceFlags = selectedServices.flatMap((svc) => {\n return ['-f', `${svc}=true`]\n })\n const skipTerraformFlag = shouldSkipTerraform ? ['-f', 'skip_terraform_deploy=true'] : []\n\n await $`gh workflow run deploy-selected-services.yml --ref ${selectedReleaseBranch} -f environment=${selectedEnv} ${serviceFlags} ${skipTerraformFlag}`\n\n $.quiet = false\n\n logger.info(\n `Successfully launched deploy-selected-services workflow_dispatch for release branch: ${selectedReleaseBranch}, environment: ${selectedEnv}, services: ${selectedServices.join(', ')}`,\n )\n\n commandEcho.print()\n\n const structuredContent = {\n releaseBranch: selectedReleaseBranch,\n version: selectedReleaseBranch.replace('release/v', ''),\n environment: selectedEnv,\n services: selectedServices,\n skipTerraformDeploy: shouldSkipTerraform,\n success: true,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n } catch (error: unknown) {\n logger.error({ error }, '\u274C Error launching workflow')\n process.exit(1)\n }\n}\n\n/**\n * Parse available services from the workflow file\n * Services are defined as boolean inputs (excluding skip_terraform_deploy)\n */\nconst parseServicesFromWorkflow = async (): Promise<string[]> => {\n const projectRoot = await getProjectRoot()\n\n const workflowPath = resolve(projectRoot, '.github/workflows/deploy-selected-services.yml')\n\n const content = await fs.readFile(workflowPath, 'utf-8')\n const parsed = yaml.parse(content)\n\n const inputs = parsed.on.workflow_dispatch.inputs\n const services: string[] = []\n\n for (const [key, value] of Object.entries(inputs)) {\n // Filter for boolean type inputs, excluding non-service flags\n if ((value as { type: string }).type === 'boolean' && key !== 'skip_terraform_deploy') {\n services.push(key)\n }\n }\n\n return services\n}\n\n// MCP Tool Registration\nexport const ghReleaseDeploySelectedMcpTool = {\n name: 'gh-release-deploy-selected',\n description: 'Deploy selected services from a release branch to a specified environment',\n inputSchema: {\n version: z.string().describe('Version to deploy (e.g., \"1.2.5\")'),\n env: z.string().describe('Environment to deploy to (e.g., \"dev\", \"renana\", \"oriana\")'),\n services: z.array(z.string()).describe('List of services to deploy (e.g., [\"client-be\", \"client-fe\"])'),\n skipTerraform: z.boolean().optional().describe('Skip terraform deployment step'),\n },\n outputSchema: {\n releaseBranch: z.string().describe('The release branch that was deployed'),\n version: z.string().describe('The version that was deployed'),\n environment: z.string().describe('The environment deployed to'),\n services: z.array(z.string()).describe('The services that were deployed'),\n skipTerraformDeploy: z.boolean().describe('Whether terraform deployment was skipped'),\n success: z.boolean().describe('Whether the deployment was successful'),\n },\n handler: ghReleaseDeploySelected,\n}\n", "import select from '@inquirer/select'\nimport fs from 'node:fs/promises'\nimport { resolve } from 'node:path'\nimport process from 'node:process'\nimport yaml from 'yaml'\nimport { z } from 'zod'\nimport { $ } from 'zx'\n\nimport { getReleasePRs } from 'src/integrations/gh'\nimport { commandEcho } from 'src/lib/command-echo'\nimport { ENVs } from 'src/lib/constants'\nimport { getProjectRoot } from 'src/lib/git-utils'\nimport { logger } from 'src/lib/logger'\nimport type { ToolsExecutionResult } from 'src/types'\n\ninterface GhReleaseDeployServiceArgs {\n version: string\n env: string\n service: string\n skipTerraform?: boolean\n}\n\n/**\n * Deploy a specific service in a release branch to an environment\n */\nexport const ghReleaseDeployService = async (args: GhReleaseDeployServiceArgs): Promise<ToolsExecutionResult> => {\n const { version, env, service, skipTerraform } = args\n\n commandEcho.start('release-deploy-service')\n\n // TODO: add validation for semver version for version variable\n\n const releasePRsList: string[] = ['dev'] // [\"release/v1.8.0\", \"release/v1.9.0\"]\n\n const releasePRs = await getReleasePRs()\n\n releasePRsList.push(...releasePRs)\n\n let selectedReleaseBranch = '' // \"release/v1.8.0\"\n\n if (version) {\n selectedReleaseBranch = version === 'dev' ? 'dev' : `release/v${version}`\n } else {\n commandEcho.setInteractive()\n\n selectedReleaseBranch = await select({\n message: '\uD83C\uDF3F Select release branch',\n choices: releasePRsList.map((pr) => {\n return {\n name: pr.replace('release/v', ''),\n value: pr,\n }\n }),\n })\n }\n\n const selectedVersion = selectedReleaseBranch === 'dev' ? 'dev' : selectedReleaseBranch.replace('release/v', '')\n\n commandEcho.addOption('--version', selectedVersion)\n\n // Check if release branch exists in the list\n if (!releasePRsList.includes(selectedReleaseBranch)) {\n logger.error(`\u274C Release branch ${selectedReleaseBranch} not found in open PRs. Exiting...`)\n process.exit(1)\n }\n\n let selectedEnv = ''\n\n if (env) {\n selectedEnv = env\n } else {\n commandEcho.setInteractive()\n\n selectedEnv = await select({\n message: '\uD83E\uDDEA Select environment',\n choices: ENVs.map((env) => {\n return {\n name: env,\n value: env,\n }\n }),\n })\n }\n\n commandEcho.addOption('--env', selectedEnv)\n\n if (!ENVs.includes(selectedEnv)) {\n logger.error(`\u274C Invalid environment: ${selectedEnv}. Exiting...`)\n process.exit(1)\n }\n\n // Parse available services from workflow file\n const availableServices = await parseServicesFromWorkflow()\n\n let selectedService = ''\n\n if (service) {\n selectedService = service\n } else {\n commandEcho.setInteractive()\n\n selectedService = await select({\n message: '\uD83D\uDE80 Select service to deploy',\n choices: availableServices.map((svc) => {\n return {\n name: svc,\n value: svc,\n }\n }),\n })\n }\n\n commandEcho.addOption('--service', selectedService)\n\n if (!availableServices.includes(selectedService)) {\n logger.error(`\u274C Invalid service: ${selectedService}. Available services: ${availableServices.join(', ')}`)\n process.exit(1)\n }\n\n const shouldSkipTerraform = skipTerraform ?? false\n\n if (shouldSkipTerraform) {\n commandEcho.addOption('--skip-terraform', true)\n }\n\n try {\n $.quiet = true\n\n const skipTerraformFlag = shouldSkipTerraform ? ['-f', 'skip_terraform_deploy=true'] : []\n\n await $`gh workflow run deploy-single-service.yml --ref ${selectedReleaseBranch} -f environment=${selectedEnv} -f service=${selectedService} ${skipTerraformFlag}`\n\n $.quiet = false\n\n logger.info(\n `Successfully launched deploy-single-service workflow_dispatch for release branch: ${selectedReleaseBranch}, environment: ${selectedEnv}, service: ${selectedService}`,\n )\n\n commandEcho.print()\n\n const structuredContent = {\n releaseBranch: selectedReleaseBranch,\n version: selectedReleaseBranch.replace('release/v', ''),\n environment: selectedEnv,\n service: selectedService,\n skipTerraformDeploy: shouldSkipTerraform,\n success: true,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n } catch (error: unknown) {\n logger.error({ error }, '\u274C Error launching workflow')\n process.exit(1)\n }\n}\n\n/**\n * Parse available services from the workflow file\n */\nconst parseServicesFromWorkflow = async (): Promise<string[]> => {\n const projectRoot = await getProjectRoot()\n const workflowPath = resolve(projectRoot, '.github/workflows/deploy-single-service.yml')\n const content = await fs.readFile(workflowPath, 'utf-8')\n const parsed = yaml.parse(content)\n\n return parsed.on.workflow_dispatch.inputs.service.options\n}\n\n// MCP Tool Registration\nexport const ghReleaseDeployServiceMcpTool = {\n name: 'gh-release-deploy-service',\n description: 'Deploy a specific service in a release branch to a specified environment',\n inputSchema: {\n version: z.string().describe('Version to deploy (e.g., \"1.2.5\")'),\n env: z.string().describe('Environment to deploy to (e.g., \"dev\", \"renana\", \"oriana\")'),\n service: z.string().describe('Service to deploy (e.g., \"client-be\", \"client-fe\")'),\n skipTerraform: z.boolean().optional().describe('Skip terraform deployment step'),\n },\n outputSchema: {\n releaseBranch: z.string().describe('The release branch that was deployed'),\n version: z.string().describe('The version that was deployed'),\n environment: z.string().describe('The environment deployed to'),\n service: z.string().describe('The service that was deployed'),\n skipTerraformDeploy: z.boolean().describe('Whether terraform deployment was skipped'),\n success: z.boolean().describe('Whether the deployment was successful'),\n },\n handler: ghReleaseDeployService,\n}\n", "import { z } from 'zod'\n\nimport { getReleasePRs } from 'src/integrations/gh'\nimport { logger } from 'src/lib/logger'\nimport type { ToolsExecutionResult } from 'src/types'\n\n/**\n * List all open release branches\n */\nexport const ghReleaseList = async (): Promise<ToolsExecutionResult> => {\n const releasePRs = await getReleasePRs()\n\n const releasePRsList = releasePRs.map((pr) => {\n return pr.replace('release/', '')\n })\n\n logger.info('All release branches: \\n')\n logger.info(`\\n${releasePRsList.join('\\n')}`)\n\n const structuredContent = {\n releases: releasePRsList,\n count: releasePRsList.length,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n}\n\n// MCP Tool Registration\nexport const ghReleaseListMcpTool = {\n name: 'gh-release-list',\n description: 'List all open release branches',\n inputSchema: {},\n outputSchema: {\n releases: z.array(z.string()).describe('List of all release branches'),\n count: z.number().describe('Number of release branches'),\n },\n handler: ghReleaseList,\n}\n", "import confirm from '@inquirer/confirm'\nimport process from 'node:process'\nimport { z } from 'zod'\nimport { $, question } from 'zx'\n\nimport { loadJiraConfig } from 'src/integrations/jira'\nimport { commandEcho } from 'src/lib/command-echo'\nimport { logger } from 'src/lib/logger'\nimport { createSingleRelease, prepareGitForRelease } from 'src/lib/release-utils'\nimport type { RequiredConfirmedOptionArg, ToolsExecutionResult } from 'src/types'\n\ninterface ReleaseCreateArgs extends RequiredConfirmedOptionArg {\n version?: string\n description?: string\n checkout?: boolean\n}\n\n/**\n * Create a single release branch for the specified version\n * Includes Jira version creation and GitHub release branch creation\n */\nexport const releaseCreate = async (args: ReleaseCreateArgs): Promise<ToolsExecutionResult> => {\n const { version: inputVersion, description: inputDescription, confirmedCommand, checkout: inputCheckout } = args\n\n commandEcho.start('release-create')\n\n let version = inputVersion\n let description = inputDescription\n let checkout = inputCheckout\n\n // Load Jira config - it is now mandatory\n const jiraConfig = await loadJiraConfig()\n\n if (!version) {\n commandEcho.setInteractive()\n version = await question('Enter version (e.g. 1.2.5): ')\n }\n\n // Validate input (validate the version is a valid semver)\n if (!version || version.trim() === '') {\n logger.error('No version provided. Exiting...')\n process.exit(1)\n }\n\n const trimmedVersion = version.trim()\n\n commandEcho.addOption('--version', trimmedVersion)\n\n if (description === undefined) {\n commandEcho.setInteractive()\n description = await question('Enter description (optional, press Enter to skip): ')\n\n if (description.trim() === '') {\n description = ''\n }\n }\n\n if (description) {\n commandEcho.addOption('--description', description)\n }\n\n const answer = confirmedCommand\n ? true\n : await confirm({\n message: `Are you sure you want to create release branch for version ${trimmedVersion}?`,\n })\n\n if (!confirmedCommand) {\n commandEcho.setInteractive()\n }\n\n if (!answer) {\n logger.info('Operation cancelled. Exiting...')\n process.exit(0)\n }\n\n // Track --yes flag if confirmation was interactive (user confirmed)\n commandEcho.addOption('--yes', true)\n\n await prepareGitForRelease()\n\n // Create the release\n const release = await createSingleRelease(trimmedVersion, jiraConfig, description)\n\n logger.info(`\u2705 Successfully created release: v${trimmedVersion}`)\n logger.info(`\uD83D\uDD17 GitHub PR: ${release.prUrl}`)\n logger.info(`\uD83D\uDD17 Jira Version: ${release.jiraVersionUrl}`)\n\n // Ask about checkout if not specified\n if (checkout === undefined) {\n commandEcho.setInteractive()\n\n checkout = await confirm({\n message: `Do you want to checkout to the created branch ${release.branchName}?`,\n default: true,\n })\n }\n\n // Track checkout option (--no-checkout if false)\n if (!checkout) {\n commandEcho.addOption('--no-checkout', true)\n }\n\n // Checkout to the created branch by default\n if (checkout) {\n $.quiet = true\n await $`git switch ${release.branchName}`\n $.quiet = false\n\n logger.info(`\uD83D\uDD04 Switched to branch ${release.branchName}`)\n }\n\n commandEcho.print()\n\n const structuredContent = {\n version: trimmedVersion,\n branchName: release.branchName,\n prUrl: release.prUrl,\n jiraVersionUrl: release.jiraVersionUrl,\n isCheckedOut: checkout,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n}\n\n// MCP Tool Registration\nexport const releaseCreateMcpTool = {\n name: 'release-create',\n description: 'Create a single release branch for specified version with Jira version creation',\n inputSchema: {\n version: z.string().describe('Version to create (e.g., \"1.2.5\")'),\n description: z.string().optional().describe('Optional description for the Jira version'),\n checkout: z.boolean().optional().default(true).describe('Checkout to the created branch (default: true)'),\n },\n outputSchema: {\n version: z.string().describe('Version number'),\n branchName: z.string().describe('Release branch name'),\n prUrl: z.string().describe('GitHub PR URL'),\n jiraVersionUrl: z.string().describe('Jira version URL'),\n isCheckedOut: z.boolean().describe('Whether the branch was checked out'),\n },\n handler: releaseCreate,\n}\n", "import { $ } from 'zx'\n\nimport { createReleaseBranch } from 'src/integrations/gh'\nimport { createJiraVersion } from 'src/integrations/jira'\nimport type { JiraConfig } from 'src/integrations/jira'\n\nexport interface ReleaseCreationResult {\n version: string\n branchName: string\n prUrl: string\n jiraVersionUrl: string\n}\n\n/**\n * Prepare git repository for release creation\n * Fetches latest changes, switches to dev branch, and pulls latest\n */\nexport const prepareGitForRelease = async (): Promise<void> => {\n $.quiet = true\n\n await $`git fetch origin`\n await $`git switch dev`\n await $`git pull origin dev`\n\n $.quiet = false\n}\n\n/**\n * Create a single release by creating both Jira version and GitHub release branch\n * @param version - Version number (e.g., \"1.2.5\")\n * @param jiraConfig - Jira configuration object\n * @param description - Optional description for the Jira version\n * @returns Release creation result with URLs and metadata\n */\nexport const createSingleRelease = async (\n version: string,\n jiraConfig: JiraConfig,\n description?: string,\n): Promise<ReleaseCreationResult> => {\n // 1. Create Jira version (mandatory)\n const versionName = `v${version}`\n\n const result = await createJiraVersion(\n {\n name: versionName,\n projectId: jiraConfig.projectId,\n description: description || '',\n released: false,\n archived: false,\n },\n jiraConfig,\n )\n\n // Construct user-friendly Jira URL using project key from API response\n const jiraVersionUrl = `${jiraConfig.baseUrl}/projects/${result.version!.projectId}/versions/${result.version!.id}/tab/release-report-all-issues`\n\n // 2. Create GitHub release branch\n const releaseInfo = await createReleaseBranch({ version, jiraVersionUrl })\n\n return {\n version,\n branchName: releaseInfo.branchName,\n prUrl: releaseInfo.prUrl,\n jiraVersionUrl,\n }\n}\n", "import confirm from '@inquirer/confirm'\nimport process from 'node:process'\nimport { z } from 'zod'\nimport { question } from 'zx'\n\nimport { loadJiraConfig } from 'src/integrations/jira'\nimport { commandEcho } from 'src/lib/command-echo'\nimport { logger } from 'src/lib/logger'\nimport { createSingleRelease, prepareGitForRelease } from 'src/lib/release-utils'\nimport type { ReleaseCreationResult } from 'src/lib/release-utils'\nimport type { RequiredConfirmedOptionArg, ToolsExecutionResult } from 'src/types'\n\ninterface ReleaseCreateBatchArgs extends RequiredConfirmedOptionArg {\n versions: string\n description?: string\n}\n\n/**\n * Create multiple release branches for the specified versions\n * Includes Jira version creation and GitHub release branch creation for each version\n */\n// eslint-disable-next-line sonarjs/cognitive-complexity\nexport const releaseCreateBatch = async (args: ReleaseCreateBatchArgs): Promise<ToolsExecutionResult> => {\n const { versions: inputVersions, description, confirmedCommand } = args\n\n commandEcho.start('release-create-batch')\n\n let versionInput = inputVersions\n\n // Load Jira config - it is now mandatory\n const jiraConfig = await loadJiraConfig()\n\n if (!versionInput) {\n commandEcho.setInteractive()\n versionInput = await question('Enter versions by comma (e.g. 1.2.5, 1.2.6): ')\n }\n\n const versionsList = versionInput.split(',').map((version) => {\n return version.trim()\n })\n\n commandEcho.addOption('--versions', versionsList.join(', '))\n\n // Validate input\n if (versionsList.length === 0) {\n logger.error('No versions provided. Exiting...')\n process.exit(1)\n }\n\n // Inform user if they only provided one version\n if (versionsList.length === 1) {\n logger.warn('\uD83D\uDCA1 You are creating only one release. Consider using \"create-release\" command for single releases.')\n }\n\n const answer = confirmedCommand\n ? true\n : await confirm({\n message: `Are you sure you want to create release branches for these versions: ${versionsList.join(', ')}?`,\n })\n\n if (!confirmedCommand) {\n commandEcho.setInteractive()\n }\n\n if (!answer) {\n logger.info('Operation cancelled. Exiting...')\n process.exit(0)\n }\n\n // Track --yes flag if confirmation was interactive (user confirmed)\n commandEcho.addOption('--yes', true)\n\n if (description) {\n commandEcho.addOption('--description', description)\n }\n\n await prepareGitForRelease()\n\n const releases: ReleaseCreationResult[] = []\n const failedReleases: Array<{ version: string; error: string }> = []\n\n for (const version of versionsList) {\n try {\n // Create each release\n const release = await createSingleRelease(version, jiraConfig, description)\n\n releases.push(release)\n\n logger.info(`\u2705 Successfully created release: v${version}`)\n logger.info(`\uD83D\uDD17 GitHub PR: ${release.prUrl}`)\n logger.info(`\uD83D\uDD17 Jira Version: ${release.jiraVersionUrl}\\n`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n\n failedReleases.push({ version, error: errorMessage })\n\n logger.error(`\u274C Failed to create release: v${version}`)\n logger.error(` Error: ${errorMessage}\\n`)\n }\n }\n\n // Final summary\n const successCount = releases.length\n const failureCount = failedReleases.length\n\n if (successCount === versionsList.length) {\n logger.info(`\u2705 All ${versionsList.length} release branches were created successfully.`)\n } else if (successCount > 0) {\n logger.warn(`\u26A0\uFE0F ${successCount} of ${versionsList.length} release branches were created successfully.`)\n logger.warn(`\u274C ${failureCount} release(s) failed.`)\n } else {\n logger.error(`\u274C All ${versionsList.length} release branches failed to create.`)\n }\n\n commandEcho.print()\n\n const structuredContent = {\n createdBranches: releases.map((r) => {\n return r.branchName\n }),\n successCount,\n failureCount,\n releases,\n failedReleases,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n}\n\n// MCP Tool Registration\nexport const releaseCreateBatchMcpTool = {\n name: 'release-create-batch',\n description: 'Create multiple release branches for specified versions with Jira version creation (batch operation)',\n inputSchema: {\n versions: z.string().describe('Comma-separated list of versions to create (e.g., \"1.2.5, 1.2.6\")'),\n description: z.string().optional().describe('Optional description for the Jira versions'),\n },\n outputSchema: {\n createdBranches: z.array(z.string()).describe('List of created release branches'),\n successCount: z.number().describe('Number of releases created successfully'),\n failureCount: z.number().describe('Number of releases that failed'),\n releases: z\n .array(\n z.object({\n version: z.string().describe('Version number'),\n branchName: z.string().describe('Release branch name'),\n prUrl: z.string().describe('GitHub PR URL'),\n jiraVersionUrl: z.string().describe('Jira version URL'),\n }),\n )\n .describe('Detailed information for each created release with URLs'),\n failedReleases: z\n .array(\n z.object({\n version: z.string().describe('Version number that failed'),\n error: z.string().describe('Error message'),\n }),\n )\n .describe('List of releases that failed with error messages'),\n },\n handler: releaseCreateBatch,\n}\n", "/* eslint-disable sonarjs/cognitive-complexity */\nimport checkbox from '@inquirer/checkbox'\nimport confirm from '@inquirer/confirm'\nimport { copyFileSync, existsSync } from 'node:fs'\nimport process from 'node:process'\nimport { z } from 'zod'\nimport { $ } from 'zx'\n\nimport { getReleasePRs } from 'src/integrations/gh'\nimport { commandEcho } from 'src/lib/command-echo'\nimport { WORKTREES_DIR_SUFFIX } from 'src/lib/constants'\nimport { getCurrentWorktrees, getProjectRoot } from 'src/lib/git-utils'\nimport { logger } from 'src/lib/logger'\nimport type { RequiredConfirmedOptionArg, ToolsExecutionResult } from 'src/types'\n\n// Constants\nconst FEATURE_DIR = 'feature'\nconst RELEASE_DIR = 'release'\nconst RELEASE_BRANCH_PREFIX = 'release/v'\n\ninterface WorktreeManagementArgs extends RequiredConfirmedOptionArg {\n all: boolean\n cursor?: boolean\n}\n\n/**\n * Manage git worktrees for release branches\n * Creates worktrees for active release branches and removes unused ones\n */\nexport const worktreesAdd = async (options: WorktreeManagementArgs): Promise<ToolsExecutionResult> => {\n const { confirmedCommand, all, cursor } = options\n\n commandEcho.start('worktrees-add')\n\n try {\n const currentWorktrees = await getCurrentWorktrees('release')\n const projectRoot = await getProjectRoot()\n\n const worktreeDir = `${projectRoot}${WORKTREES_DIR_SUFFIX}`\n\n await ensureWorktreeDirectory(`${worktreeDir}/${RELEASE_DIR}`)\n await ensureWorktreeDirectory(`${worktreeDir}/${FEATURE_DIR}`)\n\n const releasePRsList = await getReleasePRs()\n\n if (releasePRsList.length === 0) {\n logger.info('\u2139\uFE0F No open release branches found')\n\n commandEcho.print()\n\n return {\n content: [{ type: 'text', text: JSON.stringify({ createdWorktrees: [], count: 0 }, null, 2) }],\n structuredContent: { createdWorktrees: [], count: 0 },\n }\n }\n\n let selectedReleaseBranches: string[] = []\n\n if (all) {\n selectedReleaseBranches = releasePRsList\n } else {\n commandEcho.setInteractive()\n\n selectedReleaseBranches = await checkbox({\n required: true,\n message: '\uD83C\uDF3F Select release branches',\n choices: releasePRsList.map((pr) => {\n return {\n name: pr.replace('release/v', ''),\n value: pr,\n }\n }),\n })\n }\n\n // Track --all flag if all branches were selected (either via flag or interactively)\n const allSelected = selectedReleaseBranches.length === releasePRsList.length\n\n if (allSelected) {\n commandEcho.addOption('--all', true)\n } else {\n commandEcho.addOption('--branches', selectedReleaseBranches)\n }\n\n // Ask for confirmation\n const answer = confirmedCommand\n ? true\n : await confirm({\n message: 'Are you sure you want to proceed with these worktree changes?',\n })\n\n if (!confirmedCommand) {\n commandEcho.setInteractive()\n }\n\n if (!answer) {\n logger.info('Operation cancelled. Exiting...')\n process.exit(0)\n }\n\n // Track --yes flag if confirmation was interactive (user confirmed)\n if (allSelected) {\n commandEcho.addOption('--yes', true)\n }\n\n const openInCursor = cursor ? true : await confirm({ message: 'Open created worktrees in Cursor?' })\n\n if (!openInCursor) {\n commandEcho.setInteractive()\n }\n\n if (openInCursor) {\n commandEcho.addOption('--cursor', true)\n }\n\n const { branchesToCreate } = categorizeWorktrees({\n selectedReleaseBranches,\n currentWorktrees,\n })\n\n const createdWorktrees = await createWorktrees(branchesToCreate, worktreeDir, projectRoot)\n\n logResults(createdWorktrees)\n\n if (openInCursor) {\n for (const branch of createdWorktrees) {\n await $`cursor ${worktreeDir}/${branch}`\n }\n }\n\n commandEcho.print()\n\n const structuredContent = {\n createdWorktrees,\n count: createdWorktrees.length,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n } catch (error) {\n logger.error({ error }, '\u274C Error managing worktrees')\n throw error\n }\n}\n\n/**\n * Ensure the worktree directory exists\n */\nconst ensureWorktreeDirectory = async (worktreeDir: string): Promise<void> => {\n await $`mkdir -p ${worktreeDir}`\n}\n\ninterface CategorizeWorktreesArgs {\n selectedReleaseBranches: string[]\n currentWorktrees: string[]\n}\n\n/**\n * Categorize release worktrees into those that need to be created or removed\n */\nconst categorizeWorktrees = (args: CategorizeWorktreesArgs): { branchesToCreate: string[] } => {\n const { selectedReleaseBranches, currentWorktrees } = args\n\n const currentBranchNames = currentWorktrees.filter((branch) => {\n return branch.startsWith(RELEASE_BRANCH_PREFIX)\n })\n\n const branchesToCreate = selectedReleaseBranches.filter((branch) => {\n return !currentBranchNames.includes(branch)\n })\n\n return { branchesToCreate }\n}\n\n/**\n * Create worktrees for the specified branches\n */\nconst createWorktrees = async (branches: string[], worktreeDir: string, projectRoot: string): Promise<string[]> => {\n const created: string[] = []\n\n for (const branch of branches) {\n try {\n const worktreePath = `${worktreeDir}/${branch}`\n\n await $`git worktree add ${worktreePath} ${branch}`\n\n const rootEnvPath = `${projectRoot}/.env`\n\n if (existsSync(rootEnvPath)) {\n copyFileSync(rootEnvPath, `${worktreePath}/.env`)\n\n logger.info('\uD83D\uDCCB Copied .env to worktree')\n }\n\n created.push(branch)\n } catch (error) {\n logger.error({ error, branch }, `\u274C Failed to create worktree for ${branch}`)\n }\n }\n\n return created\n}\n\n/**\n * Log the results of worktree management\n */\nconst logResults = (created: string[]): void => {\n if (created.length > 0) {\n logger.info('\\n')\n logger.info('\u2705 Created worktrees:')\n logger.info(created.join('\\n'))\n logger.info('')\n } else {\n logger.info('\u2139\uFE0F No new worktrees to create')\n }\n}\n\n// MCP Tool Registration\nexport const worktreesAddMcpTool = {\n name: 'worktrees-add',\n description: 'Create worktrees for selected release branches',\n inputSchema: {\n all: z.boolean().describe('Add worktrees for all release branches without prompting'),\n cursor: z.boolean().optional().describe('Open created worktrees in Cursor'),\n },\n outputSchema: {\n createdWorktrees: z.array(z.string()).describe('List of created worktree branches'),\n count: z.number().describe('Number of worktrees created'),\n },\n handler: worktreesAdd,\n}\n", "import { z } from 'zod'\nimport { $ } from 'zx'\n\nimport { getCurrentWorktrees, getProjectRoot } from 'src/lib/git-utils'\nimport { logger } from 'src/lib/logger'\nimport type { ToolsExecutionResult } from 'src/types'\n\ninterface WorktreeInfo {\n branch: string\n path: string\n commit: string\n isCurrent: boolean\n type: 'release' | 'feature'\n status: string\n lastCommitMessage: string\n aheadBehind: string\n}\n\n/**\n * List all (features and releases) git worktrees with detailed information\n */\nexport const worktreesList = async (): Promise<ToolsExecutionResult> => {\n try {\n const [releaseWorktrees, featureWorktrees] = await Promise.all([\n getCurrentWorktrees('release'),\n getCurrentWorktrees('feature'),\n ])\n\n const projectRoot = await getProjectRoot()\n const worktreesInfo = await processWorktrees(releaseWorktrees, featureWorktrees, projectRoot)\n\n logResults(worktreesInfo)\n\n const structuredContent = {\n worktrees: worktreesInfo,\n totalCount: worktreesInfo.length,\n releaseCount: releaseWorktrees.length,\n featureCount: featureWorktrees.length,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n } catch (error) {\n logger.error({ error }, '\u274C Error listing worktrees')\n throw error\n }\n}\n\n/**\n * Process worktrees to get detailed information\n */\nconst processWorktrees = async (\n releaseWorktrees: string[],\n featureWorktrees: string[],\n projectRoot: string,\n): Promise<WorktreeInfo[]> => {\n const allWorktrees = [\n ...releaseWorktrees.map((branch) => {\n return { branch, type: 'release' as const }\n }),\n ...featureWorktrees.map((branch) => {\n return { branch, type: 'feature' as const }\n }),\n ]\n\n const worktreesInfo: WorktreeInfo[] = []\n\n for (const { branch, type } of allWorktrees) {\n try {\n const worktreePath = `${projectRoot}/${branch}`\n const isCurrent = await isCurrentWorktree(branch)\n const commit = await getWorktreeCommit(worktreePath)\n const status = await getWorktreeStatus(worktreePath)\n const lastCommitMessage = await getLastCommitMessage(worktreePath)\n const aheadBehind = await getAheadBehind(worktreePath)\n\n worktreesInfo.push({\n branch,\n path: worktreePath,\n commit: commit.substring(0, 8),\n isCurrent,\n type,\n status,\n lastCommitMessage: lastCommitMessage.substring(0, 60) + (lastCommitMessage.length > 60 ? '...' : ''),\n aheadBehind,\n })\n } catch (error) {\n logger.warn({ error, branch }, `\u26A0\uFE0F Could not process worktree ${branch}`)\n }\n }\n\n return worktreesInfo.sort((a, b) => {\n // Sort by type first (releases before features), then by branch name\n if (a.type !== b.type) {\n return a.type === 'release' ? -1 : 1\n }\n\n return a.branch.localeCompare(b.branch)\n })\n}\n\n/**\n * Check if a worktree is currently active\n */\nconst isCurrentWorktree = async (branch: string): Promise<boolean> => {\n try {\n const currentBranch = await $`git branch --show-current`\n\n return currentBranch.stdout.trim() === branch\n } catch {\n return false\n }\n}\n\n/**\n * Get the commit hash for a worktree\n */\nconst getWorktreeCommit = async (worktreePath: string): Promise<string> => {\n try {\n const result = await $`cd ${worktreePath} && git rev-parse HEAD`\n\n return result.stdout.trim()\n } catch {\n return 'unknown'\n }\n}\n\n/**\n * Get the status of a worktree\n */\nconst getWorktreeStatus = async (worktreePath: string): Promise<string> => {\n try {\n const result = await $`cd ${worktreePath} && git status --porcelain`\n const changes = result.stdout.trim().split('\\n').filter(Boolean)\n\n if (changes.length === 0) return 'clean'\n if (changes.length <= 3) return 'modified'\n\n return 'dirty'\n } catch {\n return 'unknown'\n }\n}\n\n/**\n * Get the last commit message for a worktree\n */\nconst getLastCommitMessage = async (worktreePath: string): Promise<string> => {\n try {\n const result = await $`cd ${worktreePath} && git log -1 --pretty=format:\"%s\"`\n\n return result.stdout.trim()\n } catch {\n return 'No commit message available'\n }\n}\n\n/**\n * Get ahead/behind information for a worktree\n */\nconst getAheadBehind = async (worktreePath: string): Promise<string> => {\n try {\n const result =\n await $`cd ${worktreePath} && git rev-list --count --left-right @{u}...HEAD 2>/dev/null || echo \"0 0\"`\n\n const parts = result.stdout.trim().split('\\t').map(Number)\n const behind = parts[0] || 0\n const ahead = parts[1] || 0\n\n if (ahead === 0 && behind === 0) return 'up to date'\n if (ahead > 0 && behind === 0) return `\u2191${ahead} ahead`\n if (behind > 0 && ahead === 0) return `\u2193${behind} behind`\n\n return `\u2191${ahead} \u2193${behind}`\n } catch {\n return 'unknown'\n }\n}\n\n/**\n * Log the worktrees list in a beautiful formatted way\n */\nconst logResults = (worktrees: WorktreeInfo[]): void => {\n if (worktrees.length === 0) {\n logger.info('\\n\uD83C\uDF3F Git Worktrees')\n logger.info('\u2500'.repeat(80))\n logger.info('\u2139\uFE0F No worktrees found')\n logger.info('\u2500'.repeat(80))\n\n return\n }\n\n logger.info('\\n\uD83C\uDF3F Git Worktrees')\n logger.info('\u2550'.repeat(100))\n\n // Separate releases and features\n const releases = worktrees.filter((w) => {\n return w.type === 'release'\n })\n const features = worktrees.filter((w) => {\n return w.type === 'feature'\n })\n\n // Display releases first\n displayWorktreeSection('\uD83D\uDE80 Releases', releases)\n\n // Display features second\n if (features.length > 0 && releases.length > 0) {\n logger.info('')\n }\n\n displayWorktreeSection('\u2728 Features', features)\n\n // Summary\n const current = worktrees.find((w) => {\n return w.isCurrent\n })\n\n logger.info(`\\n${'\u2550'.repeat(100)}`)\n logger.info(\n `\uD83D\uDCCA Summary: ${worktrees.length} total worktrees (${releases.length} releases, ${features.length} features)`,\n )\n\n if (current) {\n logger.info(`\uD83D\uDCCD Currently on: ${current.branch}`)\n }\n\n logger.info('')\n}\n\n/**\n * Display a section of worktrees\n */\nconst displayWorktreeSection = (sectionTitle: string, worktrees: WorktreeInfo[]): void => {\n if (worktrees.length === 0) return\n\n logger.info(`\\n${sectionTitle}`)\n logger.info('\u2500'.repeat(50))\n\n for (const [index, worktree] of worktrees.entries()) {\n displayWorktree(worktree)\n\n if (index < worktrees.length - 1) {\n logger.info('')\n }\n }\n}\n\n/**\n * Display a single worktree entry\n */\nconst displayWorktree = (worktree: WorktreeInfo): void => {\n // Worktree status indicators\n const currentIndicator = worktree.isCurrent ? '\uD83D\uDCCD' : ' '\n const statusIndicator = getStatusIndicator(worktree.status)\n\n const typeIcon = worktree.type === 'release' ? '\uD83D\uDE80' : '\u2728'\n\n // Branch name with color coding\n const branchDisplay = `${typeIcon} ${worktree.branch}`\n\n logger.info(`${currentIndicator} ${statusIndicator} ${branchDisplay}`)\n\n // Commit and sync info\n const syncInfo = worktree.aheadBehind !== 'unknown' ? ` | ${worktree.aheadBehind}` : ''\n\n logger.info(` \uD83D\uDCDD ${worktree.commit}${syncInfo}`)\n\n // Last commit message\n logger.info(` \uD83D\uDCAC ${worktree.lastCommitMessage}`)\n\n // Path (shortened for display)\n const shortPath = worktree.path.split('/').slice(-2).join('/')\n\n logger.info(` \uD83D\uDCC1 ${shortPath}`)\n}\n\n/**\n * Get status indicator based on worktree status\n */\nconst getStatusIndicator = (status: string): string => {\n switch (status) {\n case 'clean':\n return '\u2705'\n case 'modified':\n return '\u26A0\uFE0F '\n case 'dirty':\n return '\uD83D\uDD34'\n default:\n return '\u2753'\n }\n}\n\n// MCP Tool Registration\nexport const worktreesListMcpTool = {\n name: 'worktrees-list',\n description: 'List all git worktrees with detailed information',\n inputSchema: {},\n outputSchema: {\n worktrees: z\n .array(\n z.object({\n branch: z.string(),\n path: z.string(),\n commit: z.string(),\n isCurrent: z.boolean(),\n type: z.enum(['release', 'feature']),\n status: z.string(),\n lastCommitMessage: z.string(),\n aheadBehind: z.string(),\n }),\n )\n .describe('List of all worktrees with details'),\n totalCount: z.number().describe('Total number of worktrees'),\n releaseCount: z.number().describe('Number of release worktrees'),\n featureCount: z.number().describe('Number of feature worktrees'),\n },\n handler: worktreesList,\n}\n", "import checkbox from '@inquirer/checkbox'\nimport confirm from '@inquirer/confirm'\nimport process from 'node:process'\nimport { z } from 'zod'\nimport { $ } from 'zx'\n\nimport { commandEcho } from 'src/lib/command-echo'\nimport { WORKTREES_DIR_SUFFIX } from 'src/lib/constants'\nimport { getCurrentWorktrees, getProjectRoot } from 'src/lib/git-utils'\nimport { logger } from 'src/lib/logger'\nimport type { RequiredConfirmedOptionArg, ToolsExecutionResult } from 'src/types'\n\n// Constants\ninterface WorktreeManagementArgs extends RequiredConfirmedOptionArg {\n all: boolean\n}\n\n/**\n * Manage git worktrees for release branches\n * Creates worktrees for active release branches and removes unused ones\n */\nexport const worktreesRemove = async (options: WorktreeManagementArgs): Promise<ToolsExecutionResult> => {\n const { confirmedCommand, all } = options\n\n commandEcho.start('worktrees-remove')\n\n try {\n const currentWorktrees = await getCurrentWorktrees('release')\n\n if (currentWorktrees.length === 0) {\n logger.info('\u2139\uFE0F No active worktrees to remove')\n\n commandEcho.print()\n\n return {\n content: [{ type: 'text', text: JSON.stringify({ removedWorktrees: [], count: 0 }, null, 2) }],\n structuredContent: { removedWorktrees: [], count: 0 },\n }\n }\n\n const projectRoot = await getProjectRoot()\n\n const worktreeDir = `${projectRoot}${WORKTREES_DIR_SUFFIX}`\n\n let selectedReleaseBranches: string[] = []\n\n if (all) {\n selectedReleaseBranches = currentWorktrees\n } else {\n commandEcho.setInteractive()\n\n selectedReleaseBranches = await checkbox({\n required: true,\n message: '\uD83C\uDF3F Select release branches',\n choices: currentWorktrees.map((pr) => {\n return {\n name: pr.replace('release/v', ''),\n value: pr,\n }\n }),\n })\n }\n\n // Track --all flag if all branches were selected (either via flag or interactively)\n const allSelected = selectedReleaseBranches.length === currentWorktrees.length\n\n if (allSelected) {\n commandEcho.addOption('--all', true)\n } else {\n commandEcho.addOption('--branches', selectedReleaseBranches)\n }\n\n // Ask for confirmation\n const answer = confirmedCommand\n ? true\n : await confirm({\n message: 'Are you sure you want to proceed with these worktree changes?',\n })\n\n if (!confirmedCommand) {\n commandEcho.setInteractive()\n }\n\n if (!answer) {\n logger.info('Operation cancelled. Exiting...')\n process.exit(0)\n }\n\n // Track --yes flag if confirmation was interactive (user confirmed)\n if (allSelected) {\n commandEcho.addOption('--yes', true)\n }\n\n const removedWorktrees = await removeWorktrees(selectedReleaseBranches, worktreeDir)\n\n logResults(removedWorktrees)\n\n commandEcho.print()\n\n const structuredContent = {\n removedWorktrees,\n count: removedWorktrees.length,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n } catch (error) {\n logger.error({ error }, '\u274C Error managing worktrees')\n throw error\n }\n}\n\n/**\n * Remove worktrees for the specified branches\n */\nconst removeWorktrees = async (branches: string[], worktreeDir: string): Promise<string[]> => {\n const removed: string[] = []\n\n for (const branch of branches) {\n try {\n const worktreePath = `${worktreeDir}/${branch}`\n\n await $`git worktree remove ${worktreePath}`\n removed.push(branch)\n } catch (error) {\n logger.error({ error, branch }, `\u274C Failed to remove worktree for ${branch}`)\n }\n }\n\n return removed\n}\n\n/**\n * Log the results of worktree management\n */\nconst logResults = (removed: string[]): void => {\n if (removed.length > 0) {\n logger.info('\u274C Removed worktrees:')\n logger.info(removed.join('\\n'))\n logger.info('')\n } else {\n logger.info('\u2139\uFE0F No unused worktrees to remove')\n }\n}\n\n// MCP Tool Registration\nexport const worktreesRemoveMcpTool = {\n name: 'worktrees-remove',\n description: 'Remove selected worktrees',\n inputSchema: {\n all: z.boolean().describe('Remove all worktrees without prompting'),\n },\n outputSchema: {\n removedWorktrees: z.array(z.string()).describe('List of removed worktree branches'),\n count: z.number().describe('Number of worktrees removed'),\n },\n handler: worktreesRemove,\n}\n", "import confirm from '@inquirer/confirm'\nimport process from 'node:process'\nimport { z } from 'zod'\nimport { $ } from 'zx'\n\nimport { getReleasePRs } from 'src/integrations/gh'\nimport { commandEcho } from 'src/lib/command-echo'\nimport { WORKTREES_DIR_SUFFIX } from 'src/lib/constants'\nimport { getCurrentWorktrees, getProjectRoot } from 'src/lib/git-utils'\nimport { logger } from 'src/lib/logger'\nimport type { RequiredConfirmedOptionArg, ToolsExecutionResult } from 'src/types'\n\n// Constants\nconst RELEASE_BRANCH_PREFIX = 'release/v'\n\ninterface WorktreeSyncArgs extends RequiredConfirmedOptionArg {}\n\n/**\n * Manage git worktrees for release branches.\n *\n * Creates worktrees for active release branches and removes unused ones\n */\nexport const worktreesSync = async (options: WorktreeSyncArgs): Promise<ToolsExecutionResult> => {\n const { confirmedCommand } = options\n\n commandEcho.start('worktrees-sync')\n\n try {\n const currentWorktrees = await getCurrentWorktrees('release')\n const projectRoot = await getProjectRoot()\n\n const worktreeDir = `${projectRoot}${WORKTREES_DIR_SUFFIX}`\n\n const releasePRsList = await getReleasePRs()\n\n // Ask for confirmation\n const answer = confirmedCommand\n ? true\n : await confirm({\n message: 'Are you sure you want to proceed with these worktree changes?',\n })\n\n if (!confirmedCommand) {\n commandEcho.setInteractive()\n }\n\n if (!answer) {\n logger.info('Operation cancelled. Exiting...')\n process.exit(0)\n }\n\n // Track --yes flag if confirmation was interactive (user confirmed)\n if (!confirmedCommand) {\n commandEcho.addOption('--yes', true)\n }\n\n const { branchesToRemove } = categorizeWorktrees({\n releasePRsList,\n currentWorktrees,\n })\n\n const removedWorktrees = await removeWorktrees(branchesToRemove, worktreeDir)\n\n logResults(removedWorktrees)\n\n commandEcho.print()\n\n const structuredContent = {\n removedWorktrees,\n count: removedWorktrees.length,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n } catch (error) {\n logger.error({ error }, '\u274C Error managing worktrees')\n throw error\n }\n}\n\ninterface CategorizeWorktreesArgs {\n releasePRsList: string[]\n currentWorktrees: string[]\n}\n\n/**\n * Categorize worktrees into those that need to be created or removed\n */\nconst categorizeWorktrees = (args: CategorizeWorktreesArgs): { branchesToRemove: string[] } => {\n const { releasePRsList, currentWorktrees } = args\n\n const currentBranchNames = currentWorktrees.filter((branch) => {\n return branch.startsWith(RELEASE_BRANCH_PREFIX)\n })\n\n const branchesToRemove = currentBranchNames.filter((branch) => {\n return !releasePRsList.includes(branch)\n })\n\n return { branchesToRemove }\n}\n\n/**\n * Remove worktrees for the specified branches\n */\nconst removeWorktrees = async (branches: string[], worktreeDir: string): Promise<string[]> => {\n const removed: string[] = []\n\n for (const branch of branches) {\n try {\n const worktreePath = `${worktreeDir}/${branch}`\n\n await $`git worktree remove ${worktreePath}`\n removed.push(branch)\n } catch (error) {\n logger.error({ error, branch }, `\u274C Failed to remove worktree for ${branch}`)\n }\n }\n\n return removed\n}\n\n/**\n * Log the results of worktree management\n */\nconst logResults = (removed: string[]): void => {\n if (removed.length > 0) {\n logger.info('\u274C Removed worktrees:')\n logger.info(removed.join('\\n'))\n logger.info('')\n } else {\n logger.info('\u2139\uFE0F No unused worktrees to remove')\n }\n}\n\n// MCP Tool Registration\nexport const worktreesSyncMcpTool = {\n name: 'worktrees-sync',\n description: 'Synchronize worktrees with active release branches',\n inputSchema: {},\n outputSchema: {\n removedWorktrees: z.array(z.string()).describe('List of removed worktree branches'),\n count: z.number().describe('Number of worktrees removed during sync'),\n },\n handler: worktreesSync,\n}\n"],
5
- "mappings": "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",
6
- "names": ["Command", "z", "$", "process", "pino", "pretty", "initLoggerCLI", "logLevel", "process", "ignoreFields", "pino", "pretty", "logger", "checkCommand", "name", "command", "successMsg", "failMsg", "$", "doctor", "checks", "logger", "check", "icon", "structuredContent", "c", "doctorMcpTool", "z", "fs", "path", "process", "z", "fs", "path", "process", "ENVs", "DOPPLER_PROJECT_MAP", "ENV_CACHE_DIR", "ENV_LOAD_FILE", "ENV_CLEAR_FILE", "INFRA_KIT_SESSION_VAR", "INFRA_KIT_ENV_CONFIG_VAR", "INFRA_KIT_ENV_PROJECT_VAR", "INFRA_KIT_ENV_LOADED_AT_VAR", "parseVarNamesFromEnvFile", "filePath", "line", "getSessionCacheDir", "session", "WORKTREES_DIR_SUFFIX", "envClear", "cacheDir", "getSessionCacheDir", "envLoadPath", "path", "ENV_LOAD_FILE", "fs", "logger", "varNames", "parseVarNamesFromEnvFile", "unsetLines", "v", "INFRA_KIT_ENV_CONFIG_VAR", "INFRA_KIT_ENV_PROJECT_VAR", "INFRA_KIT_ENV_LOADED_AT_VAR", "clearFilePath", "ENV_CLEAR_FILE", "process", "structuredContent", "envClearMcpTool", "z", "fs", "os", "path", "process", "MARKER_COMMENT", "envInit", "zshrcPath", "path", "os", "binPath", "getBinPath", "fs", "logger", "shellBlock", "buildShellBlock", "content", "cleaned", "removeExistingBlock", "process", "isBlockLine", "line", "markerIdx", "before", "afterLines", "i", "remaining", "runCmd", "z", "process", "$", "validateDopplerCliAndAuth", "$", "error", "logger", "process", "path", "$", "getCurrentWorktrees", "type", "worktreeLines", "worktreePredicateMap", "releaseWorktreePredicate", "featureWorktreePredicate", "branch", "line", "parts", "getProjectRoot", "getDopplerProject", "projectRoot", "getProjectRoot", "dirName", "path", "dopplerProject", "DOPPLER_PROJECT_MAP", "envList", "validateDopplerCliAndAuth", "project", "getDopplerProject", "logger", "env", "ENVs", "structuredContent", "envListMcpTool", "z", "select", "fs", "path", "process", "z", "$", "createCommandEcho", "commandName", "options", "isInteractive", "name", "flag", "value", "formattedOptions", "opt", "logger", "commandEcho", "envLoad", "args", "validateDopplerCliAndAuth", "config", "quiet", "commandEcho", "selectedConfig", "select", "ENVs", "env", "project", "getDopplerProject", "$", "result", "envContent", "loadedAt", "envFileLines", "INFRA_KIT_ENV_CONFIG_VAR", "INFRA_KIT_ENV_PROJECT_VAR", "INFRA_KIT_ENV_LOADED_AT_VAR", "cacheDir", "getSessionCacheDir", "envFilePath", "path", "ENV_LOAD_FILE", "fs", "process", "varCount", "line", "logger", "structuredContent", "envLoadMcpTool", "z", "path", "process", "z", "envStatus", "validateDopplerCliAndAuth", "project", "getDopplerProject", "logger", "ENVs", "cacheDir", "getSessionCacheDir", "sessionId", "process", "INFRA_KIT_SESSION_VAR", "envLoadPath", "path", "ENV_LOAD_FILE", "sessionLoadedCount", "sessionTotalCount", "sessionConfig", "INFRA_KIT_ENV_CONFIG_VAR", "sessionProject", "INFRA_KIT_ENV_PROJECT_VAR", "sessionLoadedAt", "INFRA_KIT_ENV_LOADED_AT_VAR", "varNames", "parseVarNamesFromEnvFile", "v", "structuredContent", "envStatusMcpTool", "z", "checkbox", "confirm", "process", "z", "$", "process", "$", "parseVersion", "versionStr", "sortVersions", "versions", "a", "b", "majA", "minA", "patchA", "majB", "minB", "patchB", "getReleasePRs", "releasePRs", "$", "releasePRsArray", "logger", "process", "headRefNames", "pr", "sortVersions", "error", "createReleaseBranch", "args", "version", "jiraVersionUrl", "branchName", "prLink", "ghMergeDev", "args", "all", "confirmedCommand", "commandEcho", "releasePRsList", "getReleasePRs", "logger", "selectedReleaseBranches", "checkbox", "pr", "allSelected", "answer", "confirm", "process", "failedBranches", "branch", "mergeDev", "structuredContent", "error", "ghMergeDevMcpTool", "z", "confirm", "select", "process", "z", "$", "process", "createJiraVersion", "params", "config", "baseUrl", "token", "email", "projectId", "requestBody", "url", "credentials", "response", "errorText", "logger", "error", "getProjectVersions", "findVersionByName", "versionName", "v", "updateJiraVersion", "deliverJiraRelease", "version", "loadJiraConfig", "process", "projectIdStr", "missingVars", "errorMessage", "loadJiraConfigOptional", "ghReleaseDeliver", "args", "version", "confirmedCommand", "commandEcho", "releasePRsList", "getReleasePRs", "selectedReleaseBranch", "select", "pr", "selectedVersion", "logger", "process", "answer", "confirm", "$", "jiraConfig", "loadJiraConfigOptional", "versionName", "deliverJiraRelease", "error", "structuredContent", "ghReleaseDeliverMcpTool", "z", "select", "process", "z", "$", "ghReleaseDeployAll", "args", "version", "env", "skipTerraform", "commandEcho", "releasePRsList", "releasePRs", "getReleasePRs", "selectedReleaseBranch", "select", "pr", "selectedVersion", "logger", "process", "selectedEnv", "ENVs", "shouldSkipTerraform", "$", "structuredContent", "error", "ghReleaseDeployAllMcpTool", "z", "checkbox", "select", "fs", "resolve", "process", "yaml", "z", "$", "ghReleaseDeploySelected", "args", "version", "env", "services", "skipTerraform", "commandEcho", "releasePRsList", "releasePRs", "getReleasePRs", "selectedReleaseBranch", "select", "pr", "selectedVersion", "logger", "process", "selectedEnv", "ENVs", "availableServices", "parseServicesFromWorkflow", "selectedServices", "checkbox", "svc", "invalidServices", "shouldSkipTerraform", "$", "serviceFlags", "structuredContent", "error", "projectRoot", "getProjectRoot", "workflowPath", "resolve", "content", "fs", "inputs", "yaml", "key", "value", "ghReleaseDeploySelectedMcpTool", "z", "select", "fs", "resolve", "process", "yaml", "z", "$", "ghReleaseDeployService", "args", "version", "env", "service", "skipTerraform", "commandEcho", "releasePRsList", "releasePRs", "getReleasePRs", "selectedReleaseBranch", "select", "pr", "selectedVersion", "logger", "process", "selectedEnv", "ENVs", "availableServices", "parseServicesFromWorkflow", "selectedService", "svc", "shouldSkipTerraform", "$", "structuredContent", "error", "projectRoot", "getProjectRoot", "workflowPath", "resolve", "content", "fs", "yaml", "ghReleaseDeployServiceMcpTool", "z", "z", "ghReleaseList", "releasePRsList", "getReleasePRs", "pr", "logger", "structuredContent", "ghReleaseListMcpTool", "z", "confirm", "process", "z", "$", "question", "$", "prepareGitForRelease", "$", "createSingleRelease", "version", "jiraConfig", "description", "versionName", "result", "createJiraVersion", "jiraVersionUrl", "releaseInfo", "createReleaseBranch", "releaseCreate", "args", "inputVersion", "inputDescription", "confirmedCommand", "inputCheckout", "commandEcho", "version", "description", "checkout", "jiraConfig", "loadJiraConfig", "question", "logger", "process", "trimmedVersion", "answer", "confirm", "prepareGitForRelease", "release", "createSingleRelease", "$", "structuredContent", "releaseCreateMcpTool", "z", "confirm", "process", "z", "question", "releaseCreateBatch", "args", "inputVersions", "description", "confirmedCommand", "commandEcho", "versionInput", "jiraConfig", "loadJiraConfig", "question", "versionsList", "version", "logger", "process", "answer", "confirm", "prepareGitForRelease", "releases", "failedReleases", "release", "createSingleRelease", "error", "errorMessage", "successCount", "failureCount", "structuredContent", "r", "releaseCreateBatchMcpTool", "z", "checkbox", "confirm", "copyFileSync", "existsSync", "process", "z", "$", "FEATURE_DIR", "RELEASE_DIR", "RELEASE_BRANCH_PREFIX", "worktreesAdd", "options", "confirmedCommand", "all", "cursor", "commandEcho", "currentWorktrees", "getCurrentWorktrees", "projectRoot", "getProjectRoot", "worktreeDir", "WORKTREES_DIR_SUFFIX", "ensureWorktreeDirectory", "releasePRsList", "getReleasePRs", "logger", "selectedReleaseBranches", "checkbox", "pr", "allSelected", "answer", "confirm", "process", "openInCursor", "branchesToCreate", "categorizeWorktrees", "createdWorktrees", "createWorktrees", "logResults", "branch", "$", "structuredContent", "error", "args", "currentBranchNames", "branches", "created", "worktreePath", "rootEnvPath", "existsSync", "copyFileSync", "worktreesAddMcpTool", "z", "z", "$", "worktreesList", "releaseWorktrees", "featureWorktrees", "getCurrentWorktrees", "projectRoot", "getProjectRoot", "worktreesInfo", "processWorktrees", "logResults", "structuredContent", "error", "logger", "allWorktrees", "branch", "type", "worktreePath", "isCurrent", "isCurrentWorktree", "commit", "getWorktreeCommit", "status", "getWorktreeStatus", "lastCommitMessage", "getLastCommitMessage", "aheadBehind", "getAheadBehind", "b", "$", "changes", "parts", "behind", "ahead", "worktrees", "releases", "w", "features", "displayWorktreeSection", "current", "sectionTitle", "index", "worktree", "displayWorktree", "currentIndicator", "statusIndicator", "getStatusIndicator", "branchDisplay", "syncInfo", "shortPath", "worktreesListMcpTool", "z", "checkbox", "confirm", "process", "z", "$", "worktreesRemove", "options", "confirmedCommand", "all", "commandEcho", "currentWorktrees", "getCurrentWorktrees", "logger", "worktreeDir", "getProjectRoot", "WORKTREES_DIR_SUFFIX", "selectedReleaseBranches", "checkbox", "pr", "allSelected", "answer", "confirm", "process", "removedWorktrees", "removeWorktrees", "logResults", "structuredContent", "error", "branches", "removed", "branch", "worktreePath", "$", "worktreesRemoveMcpTool", "z", "confirm", "process", "z", "$", "RELEASE_BRANCH_PREFIX", "worktreesSync", "options", "confirmedCommand", "commandEcho", "currentWorktrees", "getCurrentWorktrees", "worktreeDir", "getProjectRoot", "WORKTREES_DIR_SUFFIX", "releasePRsList", "getReleasePRs", "answer", "confirm", "logger", "process", "branchesToRemove", "categorizeWorktrees", "removedWorktrees", "removeWorktrees", "logResults", "structuredContent", "error", "args", "branch", "branches", "removed", "worktreePath", "$", "worktreesSyncMcpTool", "z", "program", "Command", "options", "ghMergeDev", "ghReleaseList", "releaseCreate", "releaseCreateBatch", "ghReleaseDeployAll", "ghReleaseDeployService", "ghReleaseDeploySelected", "ghReleaseDeliver", "worktreesSync", "worktreesAdd", "worktreesList", "worktreesRemove", "doctor", "envStatus", "envList", "envInit", "envLoad", "envClear"]
4
+ "sourcesContent": ["import { Command } from 'commander'\n\nimport { doctor } from 'src/commands/doctor'\nimport { envClear } from 'src/commands/env-clear'\nimport { envInit } from 'src/commands/env-init'\nimport { envList } from 'src/commands/env-list'\nimport { envLoad } from 'src/commands/env-load'\nimport { envStatus } from 'src/commands/env-status'\n// Commands\nimport { ghMergeDev } from 'src/commands/gh-merge-dev'\nimport { ghReleaseDeliver } from 'src/commands/gh-release-deliver'\nimport { ghReleaseDeployAll } from 'src/commands/gh-release-deploy-all'\nimport { ghReleaseDeploySelected } from 'src/commands/gh-release-deploy-selected'\nimport { ghReleaseDeployService } from 'src/commands/gh-release-deploy-service'\nimport { ghReleaseList } from 'src/commands/gh-release-list'\nimport { releaseCreate } from 'src/commands/release-create'\nimport { releaseCreateBatch } from 'src/commands/release-create-batch'\nimport { worktreesAdd } from 'src/commands/worktrees-add'\nimport { worktreesList } from 'src/commands/worktrees-list'\nimport { worktreesRemove } from 'src/commands/worktrees-remove'\nimport { worktreesSync } from 'src/commands/worktrees-sync'\n\nconst program = new Command()\n\nprogram\n .command('merge-dev')\n .description('Merge dev branch into every release branch')\n .option('-a, --all', 'Select all active release branches')\n .option('-y, --yes', 'Skip confirmation prompt')\n .action(async (options) => {\n await ghMergeDev({ all: options.all, confirmedCommand: options.yes })\n })\n\nprogram\n .command('release-list')\n .description('List all release branches')\n .action(async () => {\n await ghReleaseList()\n })\n\nprogram\n .command('release-create')\n .description('Create a single release branch')\n .option('-v, --version <version>', 'Specify the version to create, e.g. 1.2.5')\n .option('-d, --description <description>', 'Optional description for the Jira version')\n .option('-y, --yes', 'Skip confirmation prompt')\n .option('--no-checkout', 'Do not checkout the created branch after creation (checkout is default)')\n .action(async (options) => {\n await releaseCreate({\n version: options.version,\n description: options.description,\n confirmedCommand: options.yes,\n checkout: options.checkout,\n })\n })\n\nprogram\n .command('release-create-batch')\n .description('Create multiple release branches (batch operation)')\n .option('-v, --versions <versions>', 'Specify the versions to create by comma, e.g. 1.2.5, 1.2.6')\n .option('-d, --description <description>', 'Optional description for the Jira versions')\n .option('-y, --yes', 'Skip confirmation prompt')\n .action(async (options) => {\n await releaseCreateBatch({\n versions: options.versions,\n description: options.description,\n confirmedCommand: options.yes,\n })\n })\n\nprogram\n .command('release-deploy-all')\n .description('Deploy any release branch to any environment')\n .option('-v, --version <version>', 'Specify the version to deploy, e.g. 1.2.5')\n .option('-e, --env <env>', 'Specify the environment to deploy to, e.g. dev')\n .option('--skip-terraform', 'Skip terraform deployment step')\n .action(async (options) => {\n await ghReleaseDeployAll({ version: options.version, env: options.env, skipTerraform: options.skipTerraform })\n })\n\nprogram\n .command('release-deploy-service')\n .description('Deploy specific service in release branch to any environment')\n .option('-v, --version <version>', 'Specify the version to deploy, e.g. 1.2.5')\n .option('-e, --env <env>', 'Specify the environment to deploy to, e.g. dev')\n .option('-s, --service <service>', 'Specify the service to deploy, e.g. client-be')\n .option('--skip-terraform', 'Skip terraform deployment step')\n .action(async (options) => {\n await ghReleaseDeployService({\n version: options.version,\n env: options.env,\n service: options.service,\n skipTerraform: options.skipTerraform,\n })\n })\n\nprogram\n .command('release-deploy-selected')\n .description('Deploy selected services from release branch to any environment')\n .option('-v, --version <version>', 'Specify the version to deploy, e.g. 1.2.5')\n .option('-e, --env <env>', 'Specify the environment to deploy to, e.g. dev')\n .option('-s, --services <services...>', 'Specify services to deploy, e.g. client-be client-fe')\n .option('--skip-terraform', 'Skip terraform deployment step')\n .action(async (options) => {\n await ghReleaseDeploySelected({\n version: options.version,\n env: options.env,\n services: options.services,\n skipTerraform: options.skipTerraform,\n })\n })\n\nprogram\n .command('release-deliver')\n .description('Release a new version to production')\n .option('-v, --version <version>', 'Specify the version to release, e.g. 1.2.5')\n .option('-y, --yes', 'Skip confirmation prompt')\n .action(async (options) => {\n await ghReleaseDeliver({ version: options.version, confirmedCommand: options.yes })\n })\n\nprogram\n .command('worktrees-sync')\n .description('Remove release worktrees whose PRs are no longer open')\n .option('-y, --yes', 'Skip confirmation prompt')\n .action(async (options) => {\n await worktreesSync({ confirmedCommand: options.yes })\n })\n\nprogram\n .command('worktrees-add')\n .description('Add git worktrees for release branches')\n .option('-y, --yes', 'Skip confirmation prompt')\n .option('-a, --all', 'Select all active release branches')\n .option('-c, --cursor', 'Open created worktrees in Cursor')\n .action(async (options) => {\n await worktreesAdd({ confirmedCommand: options.yes, all: options.all, cursor: options.cursor })\n })\n\nprogram\n .command('worktrees-list')\n .description('List all git worktrees with detailed information')\n .action(async () => {\n await worktreesList()\n })\n\nprogram\n .command('worktrees-remove')\n .description('Remove git worktrees for release branches')\n .option('-y, --yes', 'Skip confirmation prompt')\n .option('-a, --all', 'Select all active release branches')\n .action(async (options) => {\n await worktreesRemove({ confirmedCommand: options.yes, all: options.all })\n })\n\nprogram\n .command('doctor')\n .description('Check installation and authentication status of gh and doppler CLIs')\n .action(async () => {\n await doctor()\n })\n\nprogram\n .command('env-status')\n .description('Show Doppler authentication status and detected project info')\n .action(async () => {\n await envStatus()\n })\n\nprogram\n .command('env-list')\n .description('List available Doppler configs for the detected project')\n .action(async () => {\n await envList()\n })\n\nprogram\n .command('env-init')\n .description('Set up shell functions for env-load/env-clear in .zshrc')\n .action(async () => {\n await envInit()\n })\n\nprogram\n .command('env-load')\n .description('Load Doppler env vars for a config. Prints a file path to stdout \u2014 auto-sourced by the env-load shell alias, or run source <path> manually')\n .option('-c, --config <config>', 'Environment config name to load (e.g. dev, arthur)')\n .action(async (options) => {\n await envLoad({ config: options.config })\n })\n\nprogram\n .command('env-clear')\n .description('Clear loaded env vars. Prints a file path to stdout \u2014 auto-sourced by the env-clear shell alias, or run source <path> manually')\n .action(async () => {\n await envClear()\n })\n\nprogram.parse()\n", "import { z } from 'zod'\nimport { $ } from 'zx'\n\nimport { logger } from 'src/lib/logger'\nimport type { ToolsExecutionResult } from 'src/types'\n\ninterface CheckResult {\n name: string\n status: 'pass' | 'fail'\n message: string\n}\n\nconst checkCommand = async (\n name: string,\n command: string[],\n successMsg: string,\n failMsg: string,\n): Promise<CheckResult> => {\n try {\n await $`${command}`\n\n return { name, status: 'pass', message: successMsg }\n } catch {\n return { name, status: 'fail', message: failMsg }\n }\n}\n\n/**\n * Check installation and authentication status of gh and doppler CLIs\n */\nexport const doctor = async (): Promise<ToolsExecutionResult> => {\n const checks: CheckResult[] = await Promise.all([\n checkCommand(\n 'gh installed',\n ['gh', '--version'],\n 'GitHub CLI is installed',\n 'GitHub CLI is not installed. Install from: https://cli.github.com/',\n ),\n checkCommand(\n 'gh authenticated',\n ['gh', 'auth', 'status'],\n 'GitHub CLI is authenticated',\n 'GitHub CLI is not authenticated. Run: gh auth login',\n ),\n checkCommand(\n 'doppler installed',\n ['doppler', '--version'],\n 'Doppler CLI is installed',\n 'Doppler CLI is not installed. Install from: https://docs.doppler.com/docs/install-cli',\n ),\n checkCommand(\n 'doppler authenticated',\n ['doppler', 'me'],\n 'Doppler CLI is authenticated',\n 'Doppler CLI is not authenticated. Run: doppler login',\n ),\n ])\n\n logger.info('Doctor check results:\\n')\n\n for (const check of checks) {\n const icon = check.status === 'pass' ? '[PASS]' : '[FAIL]'\n\n logger.info(` ${icon} ${check.name}: ${check.message}`)\n }\n\n const structuredContent = {\n checks: checks.map((c) => {\n return { name: c.name, status: c.status, message: c.message }\n }),\n allPassed: checks.every((c) => {\n return c.status === 'pass'\n }),\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n}\n\n// MCP Tool Registration\nexport const doctorMcpTool = {\n name: 'doctor',\n description: 'Check installation and authentication status of gh and doppler CLIs',\n inputSchema: {},\n outputSchema: {\n checks: z\n .array(\n z.object({\n name: z.string().describe('Name of the check'),\n status: z.enum(['pass', 'fail']).describe('Check result'),\n message: z.string().describe('Details about the check result'),\n }),\n )\n .describe('List of all check results'),\n allPassed: z.boolean().describe('Whether all checks passed'),\n },\n handler: doctor,\n}\n", "import process from 'node:process'\nimport pino from 'pino'\nimport pretty from 'pino-pretty'\n\n// eslint-disable-next-line sonarjs/publicly-writable-directories\nexport const LOG_FILE_PATH = '/tmp/mcp-infra-kit.log'\n\nexport const initLoggerMcp = () => {\n const logLevel = process.argv.includes('--debug') ? 'debug' : 'info'\n\n const logger = pino({ level: logLevel }, pino.destination({ dest: LOG_FILE_PATH }))\n\n logger.info(`Logger initialized with level: ${logLevel}. Logging to: ${LOG_FILE_PATH}`)\n\n return logger\n}\n\nexport const initLoggerCLI = () => {\n const logLevel = process.argv.includes('--debug') ? 'debug' : 'info'\n\n const ignoreFields = ['time', 'pid', 'hostname']\n\n if (logLevel === 'debug') {\n ignoreFields.push('level')\n }\n\n const logger = pino(\n { level: logLevel },\n pretty({\n destination: 2,\n ignore: ignoreFields.join(','),\n colorize: true,\n }),\n )\n\n return logger\n}\n\n// Singleton logger instance for CLI usage\nexport const logger = initLoggerCLI()\n", "import fs from 'node:fs'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { z } from 'zod'\n\nimport {\n ENV_CLEAR_FILE,\n ENV_LOAD_FILE,\n INFRA_KIT_ENV_CONFIG_VAR,\n INFRA_KIT_ENV_LOADED_AT_VAR,\n INFRA_KIT_ENV_PROJECT_VAR,\n getSessionCacheDir,\n parseVarNamesFromEnvFile,\n} from 'src/lib/constants'\nimport { logger } from 'src/lib/logger'\nimport type { ToolsExecutionResult } from 'src/types'\n\n/**\n * Clear loaded env vars. Prints a file path to stdout that must be sourced to apply. The env-clear shell alias does this automatically.\n */\nexport const envClear = async (): Promise<ToolsExecutionResult> => {\n const cacheDir = getSessionCacheDir()\n const envLoadPath = path.join(cacheDir, ENV_LOAD_FILE)\n\n if (!fs.existsSync(envLoadPath)) {\n logger.error('No loaded environment found. Run `env-load` first.')\n\n return {\n content: [\n {\n type: 'text',\n text: 'No loaded environment found. Run `env-load` first.',\n },\n ],\n }\n }\n\n const varNames = parseVarNamesFromEnvFile(envLoadPath)\n\n // Build unset script\n const unsetLines = [\n ...varNames.map((v) => {\n return `unset ${v}`\n }),\n `unset ${INFRA_KIT_ENV_CONFIG_VAR}`,\n `unset ${INFRA_KIT_ENV_PROJECT_VAR}`,\n `unset ${INFRA_KIT_ENV_LOADED_AT_VAR}`,\n ]\n\n // Write unset script to cache\n const clearFilePath = path.resolve(cacheDir, ENV_CLEAR_FILE)\n\n fs.mkdirSync(cacheDir, { recursive: true })\n fs.writeFileSync(clearFilePath, `${unsetLines.join('\\n')}\\n`)\n\n // REQUIRED\n process.stdout.write(`${clearFilePath}\\n`)\n\n // Remove env load file so env-clear can detect \"no env loaded\" next time\n fs.unlinkSync(envLoadPath)\n\n const structuredContent = {\n variableCount: varNames.length,\n unsetStatements: unsetLines,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n}\n\n// MCP Tool Registration\nexport const envClearMcpTool = {\n name: 'env-clear',\n description:\n 'Clear loaded env vars. Returns a file path that must be sourced (source <path>) to apply. The env-clear shell alias does this automatically.',\n inputSchema: {},\n outputSchema: {\n filePath: z.string().describe('Path to the file that must be sourced to apply'),\n variableCount: z.number().describe('Number of variables cleared'),\n unsetStatements: z.array(z.string()).describe('Unset statements generated'),\n },\n handler: envClear,\n}\n", "import fs from 'node:fs'\nimport path from 'node:path'\nimport process from 'node:process'\n\n/**\n * List of environments for the project deployment\n */\nexport const ENVs = ['dev', 'arthur', 'renana', 'roman', 'eliran', 'oriana']\n\nexport const DOPPLER_PROJECT_MAP: Record<string, string> = {\n 'hulyo-monorepo': 'hulyo',\n 'travelist-monorepo': 'travelist',\n}\n\nexport const ENV_CACHE_DIR = './node_modules/.cache/infra-kit'\nexport const ENV_LOAD_FILE = 'env-load.sh'\nexport const ENV_CLEAR_FILE = 'env-clear.sh'\n\nexport const INFRA_KIT_SESSION_VAR = 'INFRA_KIT_SESSION'\nexport const INFRA_KIT_ENV_CONFIG_VAR = 'INFRA_KIT_ENV_CONFIG'\nexport const INFRA_KIT_ENV_PROJECT_VAR = 'INFRA_KIT_ENV_PROJECT'\nexport const INFRA_KIT_ENV_LOADED_AT_VAR = 'INFRA_KIT_ENV_LOADED_AT'\n\nexport const parseVarNamesFromEnvFile = (filePath: string): string[] => {\n if (!fs.existsSync(filePath)) return []\n\n const content = fs.readFileSync(filePath, 'utf-8')\n\n return content\n .split('\\n')\n .filter((line) => {\n return line.includes('=') && !line.startsWith('set ')\n })\n .map((line) => {\n return line.split('=')[0]!\n })\n}\n\nexport const getSessionCacheDir = (): string => {\n const session = process.env[INFRA_KIT_SESSION_VAR]\n\n if (!session) {\n throw new Error('INFRA_KIT_SESSION is not set. Run `source ~/.zshrc` or `infra-kit env-init` first.')\n }\n\n return path.join(ENV_CACHE_DIR, session)\n}\n\nexport const WORKTREES_DIR_SUFFIX = '-worktrees'\n// eslint-disable-next-line sonarjs/publicly-writable-directories\nexport const LOG_FILE_PATH = '/tmp/mcp-infra-kit.log'\n", "import fs from 'node:fs'\nimport os from 'node:os'\nimport path from 'node:path'\n\nimport { logger } from 'src/lib/logger'\n\nconst MARKER_COMMENT = '# infra-kit shell functions'\n\n/**\n * Append infra-kit shell functions directly to .zshrc.\n */\nexport const envInit = async (): Promise<void> => {\n const zshrcPath = path.join(os.homedir(), '.zshrc')\n const shellBlock = buildShellBlock()\n\n if (fs.existsSync(zshrcPath)) {\n const content = fs.readFileSync(zshrcPath, 'utf-8')\n const cleaned = removeExistingBlock(content)\n\n fs.writeFileSync(zshrcPath, cleaned)\n }\n\n fs.appendFileSync(zshrcPath, `\\n${shellBlock}\\n`)\n logger.info(`Added infra-kit shell functions to ${zshrcPath}`)\n logger.info('Run `source ~/.zshrc` or open a new terminal to activate.')\n}\n\nconst isBlockLine = (line: string): boolean => {\n return (\n line.startsWith('#') ||\n line.startsWith('env-load') ||\n line.startsWith('env-clear') ||\n line.startsWith('if ') ||\n line.startsWith(' export INFRA_KIT_SESSION') ||\n line.startsWith('fi')\n )\n}\n\nconst removeExistingBlock = (content: string): string => {\n const markerIdx = content.indexOf(MARKER_COMMENT)\n\n if (markerIdx === -1) return content\n\n const before = content.slice(0, markerIdx).replace(/\\n+$/, '')\n const afterLines = content.slice(markerIdx).split('\\n')\n\n let i = 0\n\n while (i < afterLines.length && isBlockLine(afterLines[i]!)) {\n i++\n }\n\n const remaining = afterLines.slice(i).join('\\n')\n\n return before + (remaining ? `\\n${remaining}` : '')\n}\n\nconst buildShellBlock = (): string => {\n const runCmd = 'pnpm exec infra-kit'\n\n return [\n MARKER_COMMENT,\n 'if [[ -z \"${INFRA_KIT_SESSION}\" ]]; then',\n ' export INFRA_KIT_SESSION=$(head -c 4 /dev/urandom | xxd -p)',\n 'fi',\n `env-load() { local f; f=$(${runCmd} env-load \"$@\") && source \"$f\" && ${runCmd} env-status; }`,\n `env-clear() { local f; f=$(${runCmd} env-clear) && source \"$f\" && ${runCmd} env-status; }`,\n ].join('\\n')\n}\n", "import { z } from 'zod'\n\nimport { validateDopplerCliAndAuth } from 'src/integrations/doppler'\nimport { getDopplerProject } from 'src/integrations/doppler/doppler-project'\nimport { ENVs } from 'src/lib/constants'\nimport { logger } from 'src/lib/logger'\nimport type { ToolsExecutionResult } from 'src/types'\n\n/**\n * List available Doppler configs for the detected project\n */\nexport const envList = async (): Promise<ToolsExecutionResult> => {\n await validateDopplerCliAndAuth()\n\n const project = await getDopplerProject()\n\n logger.info(`Doppler Project: ${project}\\n`)\n logger.info('Available Configs:')\n\n for (const env of ENVs) {\n logger.info(` - ${env}`)\n }\n\n const structuredContent = {\n project,\n configs: ENVs,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n}\n\n// MCP Tool Registration\nexport const envListMcpTool = {\n name: 'env-list',\n description: 'List available Doppler configs for the detected project',\n inputSchema: {},\n outputSchema: {\n project: z.string().describe('Detected Doppler project name'),\n configs: z.array(z.string()).describe('Available environment configs'),\n },\n handler: envList,\n}\n", "import process from 'node:process'\nimport { $ } from 'zx'\n\nimport { logger } from 'src/lib/logger'\n\n/**\n * Validate Doppler CLI installation and authentication status and throw an error if not valid\n */\nexport const validateDopplerCliAndAuth = async () => {\n try {\n await $`doppler --version`\n } catch (error: unknown) {\n logger.error({ error }, 'Error: Doppler CLI is not installed.')\n logger.error('Please install it from: https://docs.doppler.com/docs/install-cli')\n process.exit(1)\n }\n\n try {\n await $`doppler me`\n } catch (error: unknown) {\n logger.error({ error }, 'Error: Doppler CLI is not authenticated.')\n logger.error('Please authenticate by running: doppler login')\n process.exit(1)\n }\n}\n", "import path from 'node:path'\n\nimport { DOPPLER_PROJECT_MAP } from 'src/lib/constants'\nimport { getProjectRoot } from 'src/lib/git-utils'\n\n/**\n * Resolve Doppler project name from the current working directory\n */\nexport const getDopplerProject = async (): Promise<string> => {\n const projectRoot = await getProjectRoot()\n\n const dirName = path.basename(projectRoot)\n const dopplerProject = DOPPLER_PROJECT_MAP[dirName]\n\n if (!dopplerProject) {\n throw new Error(\n `Could not determine Doppler project for directory \"${dirName}\". ` +\n `Expected one of: ${Object.keys(DOPPLER_PROJECT_MAP).join(', ')}`,\n )\n }\n\n return dopplerProject\n}\n", "import { $ } from 'zx'\n\n/**\n * Get current git worktrees\n *\n * @returns [release/v1.18.22, release/v1.18.23, release/v1.18.24] or [feature/mobile-app, feature/explore-page, feature/login-page]\n */\nexport const getCurrentWorktrees = async (type: 'release' | 'feature'): Promise<string[]> => {\n const worktreesOutput = await $`git worktree list`\n\n const worktreeLines = worktreesOutput.stdout.split('\\n').filter(Boolean)\n\n const worktreePredicateMap = {\n release: releaseWorktreePredicate,\n feature: featureWorktreePredicate,\n }\n\n return worktreeLines.map(worktreePredicateMap[type]).filter((branch) => {\n return branch !== null\n })\n}\n\nconst releaseWorktreePredicate = (line: string): string | null => {\n const parts = line.split(' ').filter(Boolean)\n\n if (parts.length < 3 || !parts[0]?.includes('release/v')) return null\n\n return `release/${parts[0]?.split('/').pop() || ''}`\n}\n\nconst featureWorktreePredicate = (line: string): string | null => {\n const parts = line.split(' ').filter(Boolean)\n\n if (parts.length < 3 || !parts[0]?.includes('feature/')) return null\n\n return `feature/${parts[0]?.split('/').pop() || ''}`\n}\n\n/**\n * Get the current project root directory\n */\nexport const getProjectRoot = async (): Promise<string> => {\n const result = await $`git rev-parse --show-toplevel`\n\n return result.stdout.trim()\n}\n", "import select from '@inquirer/select'\nimport fs from 'node:fs'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { z } from 'zod'\nimport { $ } from 'zx'\n\nimport { validateDopplerCliAndAuth } from 'src/integrations/doppler'\nimport { getDopplerProject } from 'src/integrations/doppler/doppler-project'\nimport { commandEcho } from 'src/lib/command-echo'\nimport {\n ENV_LOAD_FILE,\n ENVs,\n INFRA_KIT_ENV_CONFIG_VAR,\n INFRA_KIT_ENV_LOADED_AT_VAR,\n INFRA_KIT_ENV_PROJECT_VAR,\n getSessionCacheDir,\n} from 'src/lib/constants'\nimport type { ToolsExecutionResult } from 'src/types'\n\ninterface EnvLoadArgs {\n config?: string\n}\n\n/**\n * Load environment variables from Doppler for the given config\n */\nexport const envLoad = async (args: EnvLoadArgs): Promise<ToolsExecutionResult> => {\n await validateDopplerCliAndAuth()\n\n const { config } = args\n\n commandEcho.start('env-load')\n\n let selectedConfig = ''\n\n if (config) {\n selectedConfig = config\n } else {\n commandEcho.setInteractive()\n selectedConfig = await select(\n {\n message: 'Select environment config',\n choices: ENVs.map((env) => {\n return { name: env, value: env }\n }),\n },\n // Render to stderr so the prompt is visible when stdout is captured via $() in the shell function.\n // Only env-load and env-clear use the $() stdout-capture shell pattern.\n { output: process.stderr },\n )\n }\n\n commandEcho.addOption('--config', selectedConfig)\n\n const project = await getDopplerProject()\n\n $.quiet = true\n const result =\n await $`doppler secrets download --no-file --format env --project ${project} --config ${selectedConfig}`\n\n $.quiet = false\n const envContent = result.stdout.trim()\n\n // Build env file content in dotenv format\n const loadedAt = new Date().toISOString()\n const envFileLines = [\n 'set -a',\n envContent,\n `${INFRA_KIT_ENV_CONFIG_VAR}=${selectedConfig}`,\n `${INFRA_KIT_ENV_PROJECT_VAR}=${project}`,\n `${INFRA_KIT_ENV_LOADED_AT_VAR}=${loadedAt}`,\n 'set +a',\n ]\n\n // Write env file to cache\n const cacheDir = getSessionCacheDir()\n const envFilePath = path.resolve(cacheDir, ENV_LOAD_FILE)\n\n fs.mkdirSync(cacheDir, { recursive: true })\n fs.writeFileSync(envFilePath, `${envFileLines.join('\\n')}\\n`)\n\n // REQUIRED\n process.stdout.write(`${envFilePath}\\n`)\n\n const varCount = envContent.split('\\n').filter((line) => {\n return line.includes('=')\n }).length\n\n const structuredContent = {\n variableCount: varCount,\n project,\n config: selectedConfig,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n}\n\n// MCP Tool Registration\nexport const envLoadMcpTool = {\n name: 'env-load',\n description:\n 'Load Doppler env vars for a config. Returns a file path that must be sourced (source <path>) to apply variables. The env-load shell alias does this automatically.',\n inputSchema: {\n config: z.string().describe('Environment config name to load (e.g. dev, arthur, renana)'),\n },\n outputSchema: {\n filePath: z.string().describe('Path to the file that must be sourced to apply variables'),\n variableCount: z.number().describe('Number of variables loaded'),\n project: z.string().describe('Doppler project name'),\n config: z.string().describe('Doppler config name'),\n },\n handler: envLoad,\n}\n", "import { logger } from 'src/lib/logger'\n\ninterface CommandOption {\n flag: string\n value: string | string[] | boolean\n}\n\nconst createCommandEcho = () => {\n let commandName = ''\n let options: CommandOption[] = []\n let isInteractive = false\n\n return {\n /**\n * Initialize command echo for a new command\n */\n start(name: string): void {\n commandName = name\n options = []\n isInteractive = false\n },\n\n /**\n * Mark that the command had interactive input (prompts)\n * Call this once when ANY prompt happens\n */\n setInteractive(): void {\n isInteractive = true\n },\n\n /**\n * Track an option selection\n * @param flag The CLI flag (e.g., \"--version\")\n * @param value The selected value\n */\n addOption(flag: string, value: string | string[] | boolean): void {\n options.push({ flag, value })\n },\n\n /**\n * Print the equivalent CLI command if there was interactive input\n */\n print(): void {\n if (!isInteractive || options.length === 0) {\n return\n }\n\n const formattedOptions = options\n .map((opt) => {\n if (typeof opt.value === 'boolean') {\n return opt.value ? opt.flag : ''\n }\n\n if (Array.isArray(opt.value)) {\n return `${opt.flag} \"${opt.value.join(', ')}\"`\n }\n\n return `${opt.flag} ${opt.value}`\n })\n .filter(Boolean)\n .join(' ')\n\n logger.info('')\n logger.info('# Equivalent command:')\n logger.info(`pnpm exec infra-kit ${commandName} ${formattedOptions}`)\n },\n\n /**\n * Reset state (useful for testing)\n */\n reset(): void {\n commandName = ''\n options = []\n isInteractive = false\n },\n }\n}\n\n// Singleton instance (same pattern as logger)\nexport const commandEcho = createCommandEcho()\n", "import path from 'node:path'\nimport process from 'node:process'\nimport { z } from 'zod'\n\nimport { validateDopplerCliAndAuth } from 'src/integrations/doppler'\nimport {\n ENV_LOAD_FILE,\n INFRA_KIT_ENV_CONFIG_VAR,\n INFRA_KIT_ENV_LOADED_AT_VAR,\n INFRA_KIT_ENV_PROJECT_VAR,\n INFRA_KIT_SESSION_VAR,\n getSessionCacheDir,\n parseVarNamesFromEnvFile,\n} from 'src/lib/constants'\nimport { logger } from 'src/lib/logger'\nimport type { ToolsExecutionResult } from 'src/types'\n\n/**\n * Show Doppler authentication status and detected project info\n */\nexport const envStatus = async (): Promise<ToolsExecutionResult> => {\n await validateDopplerCliAndAuth()\n\n logger.info('Environment Session Status:\\n')\n\n // Check session-loaded vars \u2014 getSessionCacheDir() throws if INFRA_KIT_SESSION is unset\n const cacheDir = getSessionCacheDir()\n\n const sessionId = process.env[INFRA_KIT_SESSION_VAR]!\n const envLoadPath = path.join(cacheDir, ENV_LOAD_FILE)\n\n let sessionLoadedCount = 0\n let sessionTotalCount = 0\n const sessionConfig = process.env[INFRA_KIT_ENV_CONFIG_VAR] ?? null\n const sessionProject = process.env[INFRA_KIT_ENV_PROJECT_VAR] ?? null\n const sessionLoadedAt = process.env[INFRA_KIT_ENV_LOADED_AT_VAR] ?? null\n\n if (sessionConfig) {\n const varNames = parseVarNamesFromEnvFile(envLoadPath)\n\n if (varNames.length > 0) {\n sessionTotalCount = varNames.length\n sessionLoadedCount = varNames.filter((v) => {\n return v in process.env\n }).length\n }\n\n logger.info(\n ` Session: ${sessionLoadedCount} of ${sessionTotalCount} vars loaded (project: ${sessionProject}, config: ${sessionConfig}, loaded at: ${sessionLoadedAt})`,\n )\n } else {\n logger.info(' Session: no env loaded')\n }\n logger.info(` Session ID: ${sessionId}`)\n\n const structuredContent = {\n sessionId,\n sessionLoadedCount,\n sessionTotalCount,\n sessionConfig,\n sessionProject,\n sessionLoadedAt,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n}\n\n// MCP Tool Registration\nexport const envStatusMcpTool = {\n name: 'env-status',\n description: 'Show Doppler authentication status and detected project info',\n inputSchema: {},\n outputSchema: {\n sessionId: z.string().describe('Current terminal session ID'),\n sessionLoadedCount: z.number().describe('Number of cached vars active in the current session'),\n sessionTotalCount: z.number().describe('Total number of cached var names'),\n sessionConfig: z.string().nullable().describe('Doppler config name of the loaded session'),\n sessionProject: z.string().nullable().describe('Doppler project name of the loaded session'),\n sessionLoadedAt: z.string().nullable().describe('ISO 8601 timestamp of when the env was loaded'),\n },\n handler: envStatus,\n}\n", "/* eslint-disable sonarjs/cognitive-complexity */\nimport checkbox from '@inquirer/checkbox'\nimport confirm from '@inquirer/confirm'\nimport process from 'node:process'\nimport { z } from 'zod'\nimport { $ } from 'zx'\n\nimport { getReleasePRs } from 'src/integrations/gh'\nimport { commandEcho } from 'src/lib/command-echo'\nimport { logger } from 'src/lib/logger'\nimport type { RequiredConfirmedOptionArg, ToolsExecutionResult } from 'src/types'\n\ninterface GhMergeDevArgs extends RequiredConfirmedOptionArg {\n all: boolean\n}\n\n/**\n * Merge dev into every release branch\n */\nexport const ghMergeDev = async (args: GhMergeDevArgs): Promise<ToolsExecutionResult> => {\n const { all, confirmedCommand } = args\n\n commandEcho.start('merge-dev')\n\n const releasePRsList = await getReleasePRs()\n\n if (releasePRsList.length === 0) {\n logger.info('\u2139\uFE0F No open release branches found')\n\n commandEcho.print()\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({ successfulMerges: 0, failedMerges: 0, failedBranches: [], totalBranches: 0 }, null, 2),\n },\n ],\n structuredContent: { successfulMerges: 0, failedMerges: 0, failedBranches: [], totalBranches: 0 },\n }\n }\n\n let selectedReleaseBranches: string[] = []\n\n if (all) {\n selectedReleaseBranches = releasePRsList\n } else {\n commandEcho.setInteractive()\n\n selectedReleaseBranches = await checkbox({\n required: true,\n message: '\uD83C\uDF3F Select release branches',\n choices: releasePRsList.map((pr) => {\n return {\n name: pr.replace('release/v', ''),\n value: pr,\n }\n }),\n })\n }\n\n // Track --all flag if all branches were selected (either via flag or interactively)\n const allSelected = selectedReleaseBranches.length === releasePRsList.length\n\n if (allSelected) {\n commandEcho.addOption('--all', true)\n } else {\n commandEcho.addOption('--branches', selectedReleaseBranches)\n }\n\n // Validate input\n // if (selectedReleaseBranches.length === 0) {\n // console.error('No branches provided. Exiting...')\n // process.exit(1)\n // }\n\n const answer = confirmedCommand\n ? true\n : await confirm({\n message: `Are you sure you want to merge dev into these branches: ${selectedReleaseBranches.join(', ')}?`,\n })\n\n if (!confirmedCommand) {\n commandEcho.setInteractive()\n }\n\n if (!answer) {\n logger.info('Operation cancelled. Exiting...')\n process.exit(0)\n }\n\n // Track --yes flag if confirmation was interactive (user confirmed)\n if (allSelected) {\n commandEcho.addOption('--yes', true)\n }\n\n $.quiet = true\n\n await $`git fetch origin`\n await $`git switch dev`\n await $`git pull origin dev`\n\n const failedBranches: string[] = []\n\n // Merge dev into each branch\n for (const branch of selectedReleaseBranches) {\n const success = await mergeDev(branch)\n\n if (!success) {\n failedBranches.push(branch)\n }\n }\n\n $.quiet = false\n\n if (failedBranches.length > 0) {\n logger.info(`\\n\u26A0\uFE0F ${failedBranches.length} branch(es) failed to merge automatically.\\n`)\n logger.info('\uD83D\uDCCB Manual merge script for failed branches:\\n')\n logger.info('```bash')\n for (const branch of failedBranches) {\n logger.info(`# Phase #1: Merge dev into ${branch}`)\n logger.info(`git switch ${branch} && git pull origin ${branch} && git merge origin/dev`)\n logger.info(`# Phase #2:Resolve conflicts if any, then:`)\n logger.info(`git push origin ${branch} && git switch dev`)\n }\n logger.info(\n `\u2705 ${selectedReleaseBranches.length - failedBranches.length}/${selectedReleaseBranches.length} merges completed successfully.`,\n )\n } else {\n logger.info('\u2705 All merges completed successfully!')\n }\n\n commandEcho.print()\n\n const structuredContent = {\n successfulMerges: selectedReleaseBranches.length - failedBranches.length,\n failedMerges: failedBranches.length,\n failedBranches,\n totalBranches: selectedReleaseBranches.length,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n}\n\nconst mergeDev = async (branch: string): Promise<boolean> => {\n try {\n await $`git switch ${branch}`\n\n await $`git pull origin ${branch}`\n\n await $`git merge origin/dev --no-edit`\n\n await $`git push origin ${branch}`\n\n await $`git switch dev`\n\n logger.info(`Successfully merged dev into ${branch}`)\n\n return true\n } catch (error: unknown) {\n logger.error({ error, branch }, `Error merging dev into ${branch}`)\n\n await $`git reset --merge HEAD~1`\n\n return false\n }\n}\n\n// MCP Tool Registration\nexport const ghMergeDevMcpTool = {\n name: 'gh-merge-dev',\n description: 'Merge dev branch into selected release branches',\n inputSchema: {\n all: z.boolean().describe('Merge dev into all release branches without prompting'),\n },\n outputSchema: {\n successfulMerges: z.number().describe('Number of successful merges'),\n failedMerges: z.number().describe('Number of failed merges'),\n failedBranches: z.array(z.string()).describe('List of branches that failed to merge'),\n totalBranches: z.number().describe('Total number of branches processed'),\n },\n handler: ghMergeDev,\n}\n", "import process from 'node:process'\nimport { $ } from 'zx'\n\nimport { logger } from 'src/lib/logger'\n\n/**\n * Validate GitHub CLI installation and authentication status and throw an error if not valid\n */\nexport const validateGitHubCliAndAuth = async () => {\n try {\n await $`gh --version`\n } catch (error: unknown) {\n logger.error({ error }, 'Error: GitHub CLI (gh) is not installed.')\n logger.error('Please install it from: https://cli.github.com/')\n process.exit(1)\n }\n\n try {\n await $`gh auth status`\n } catch (error: unknown) {\n logger.error({ error }, 'Error: GitHub CLI (gh) is not authenticated.')\n logger.error('Please authenticate it from: https://cli.github.com/manual/gh_auth_login or type \"gh auth login\"')\n process.exit(1)\n }\n}\n", "import process from 'node:process'\nimport { $ } from 'zx'\n\nimport { logger } from 'src/lib/logger'\nimport { sortVersions } from 'src/lib/version-utils'\n\ninterface ReleasePR {\n headRefName: string\n number: number\n state: string\n title: string\n baseRefName: string\n}\n\n/**\n * Fetch open release PRs from GitHub with 'Release' in the title and base 'dev'.\n * Returns an array of headRefName strings sorted by semver in ascending order.\n * Throws an error if fetching fails.\n *\n * @returns [release/v1.18.22, release/v1.18.23, release/v1.18.24] (sorted by semver)\n */\nexport const getReleasePRs = async (): Promise<string[]> => {\n try {\n // Example of releasePRs.output: {\"headRefName\":\"release/v1.8.0\",\"number\":665,\"state\":\"OPEN\",\"title\":\"WIP Release/v1.8.0\"}\n const releasePRs =\n await $`gh pr list --search \"Release in:title\" --base dev --json number,title,headRefName,state,baseRefName`\n\n const releasePRsArray: ReleasePR[] = JSON.parse(releasePRs.stdout)\n\n if (releasePRsArray.length === 0) {\n logger.error('\u274C No release PRs found. Check the project folder for the script. Exiting...')\n process.exit(1)\n }\n\n const headRefNames = releasePRsArray.map((pr) => {\n return pr.headRefName\n })\n\n return sortVersions(headRefNames)\n } catch (error) {\n logger.error({ error }, '\u274C Error fetching release PRs')\n process.exit(1)\n }\n}\n\ninterface CreateReleaseBranchArgs {\n version: string\n jiraVersionUrl: string\n}\n\n// Function to create a release branch\nexport const createReleaseBranch = async (\n args: CreateReleaseBranchArgs,\n): Promise<{ branchName: string; prUrl: string }> => {\n const { version, jiraVersionUrl } = args\n\n const branchName = `release/v${version}`\n\n try {\n $.quiet = true\n\n await $`git switch dev`\n await $`git pull origin dev`\n await $`git checkout -b ${branchName}`\n await $`git push -u origin ${branchName}`\n await $`git commit --allow-empty-message --allow-empty --message ''`\n await $`git push origin ${branchName}`\n\n // Create PR and capture URL\n const prResult =\n await $`gh pr create --title \"Release v${version}\" --body \"${jiraVersionUrl} \\n\" --base dev --head ${branchName}`\n\n const prLink = prResult.stdout.trim()\n\n await $`git switch dev`\n\n $.quiet = false\n\n return {\n branchName,\n prUrl: prLink,\n }\n } catch (error: unknown) {\n logger.error({ error, branchName }, `Error creating release branch ${branchName}`)\n\n throw error\n }\n}\n", "/**\n * Parse version string into major, minor, patch numbers\n */\nexport const parseVersion = (versionStr: string): [number, number, number] => {\n return versionStr.replace('release/', '').slice(1).split('.').map(Number) as [number, number, number]\n}\n\n/**\n * Sort version strings in ascending order\n * Note: Returns a new sorted array without mutating the original\n */\nexport const sortVersions = (versions: string[]): string[] => {\n return [...versions].sort((a, b) => {\n const [majA, minA, patchA] = parseVersion(a)\n const [majB, minB, patchB] = parseVersion(b)\n\n if (majA !== majB) return (majA ?? 0) - (majB ?? 0)\n if (minA !== minB) return (minA ?? 0) - (minB ?? 0)\n\n return (patchA ?? 0) - (patchB ?? 0)\n })\n}\n", "import confirm from '@inquirer/confirm'\nimport select from '@inquirer/select'\nimport process from 'node:process'\nimport { z } from 'zod'\nimport { $ } from 'zx'\n\nimport { getReleasePRs } from 'src/integrations/gh'\nimport { deliverJiraRelease, loadJiraConfigOptional } from 'src/integrations/jira'\nimport { commandEcho } from 'src/lib/command-echo'\nimport { logger } from 'src/lib/logger'\nimport type { RequiredConfirmedOptionArg, ToolsExecutionResult } from 'src/types'\n\ninterface GhReleaseDeliverArgs extends RequiredConfirmedOptionArg {\n version: string\n}\n\n/**\n * Deliver a release branch to production\n */\nexport const ghReleaseDeliver = async (args: GhReleaseDeliverArgs): Promise<ToolsExecutionResult> => {\n const { version, confirmedCommand } = args\n\n commandEcho.start('release-deliver')\n\n const releasePRsList = await getReleasePRs()\n\n let selectedReleaseBranch = '' // \"release/v1.8.0\"\n\n if (version) {\n selectedReleaseBranch = `release/v${version}`\n } else {\n commandEcho.setInteractive()\n\n selectedReleaseBranch = await select({\n message: '\uD83C\uDF3F Select release branch',\n choices: releasePRsList.map((pr) => {\n return {\n name: pr.replace('release/v', ''),\n value: pr,\n }\n }),\n })\n }\n\n const selectedVersion = selectedReleaseBranch.replace('release/v', '')\n\n commandEcho.addOption('--version', selectedVersion)\n\n // Check if release branch exists in the list\n if (!releasePRsList.includes(selectedReleaseBranch)) {\n logger.error(`\u274C Release branch ${selectedReleaseBranch} not found in open PRs. Exiting...`)\n process.exit(1)\n }\n\n const answer = confirmedCommand\n ? true\n : await confirm({\n message: `Are you sure you want to deliver version ${selectedReleaseBranch} to production?`,\n })\n\n if (!confirmedCommand) {\n commandEcho.setInteractive()\n }\n\n if (!answer) {\n logger.info('Operation cancelled. Exiting...')\n process.exit(0)\n }\n\n // Track --yes flag if confirmation was interactive (user confirmed)\n commandEcho.addOption('--yes', true)\n\n try {\n $.quiet = true\n\n await $`gh pr merge ${selectedReleaseBranch} --squash --admin --delete-branch` // TODO: add --body (AI for generate message)\n await $`gh pr create --base main --head dev --title \"Release v${selectedReleaseBranch.replace('release/v', '')} (RC)\" --body \"\"`\n await $`gh pr merge dev --squash --admin`\n\n $.quiet = false\n\n await $`gh workflow run deploy-all.yml --ref main -f environment=prod`\n\n $.quiet = true\n\n // Merge main into dev\n await $`git switch main && git pull && git switch dev && git pull && git merge main --no-edit && git push`\n\n $.quiet = false\n\n // Deliver Jira release if Jira is configured\n const jiraConfig = await loadJiraConfigOptional()\n\n if (jiraConfig) {\n try {\n const versionName = selectedReleaseBranch.replace('release/', '')\n\n await deliverJiraRelease({ versionName }, jiraConfig)\n // const result = await deliverJiraRelease({ versionName }, jiraConfig)\n\n // logger.info(\n // {\n // // versionId: result.version.id,\n // versionName: result.version.name,\n // // releaseDate: result.version.releaseDate,\n // },\n // 'Successfully delivered Jira release',\n // )\n } catch (error) {\n logger.error({ error }, 'Failed to deliver Jira release (non-blocking)')\n }\n } else {\n logger.info('\uD83D\uDD14 Jira is not configured, skipping Jira release delivery')\n }\n\n logger.info(`Successfully delivered ${selectedReleaseBranch} to production!`)\n\n commandEcho.print()\n\n const structuredContent = {\n releaseBranch: selectedReleaseBranch,\n version: selectedReleaseBranch.replace('release/v', ''),\n success: true,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n } catch (error: unknown) {\n logger.error({ error }, '\u274C Error merging release branch into dev')\n process.exit(1)\n }\n}\n\n// MCP Tool Registration\nexport const ghReleaseDeliverMcpTool = {\n name: 'gh-release-deliver',\n description: 'Deliver a release branch to production',\n inputSchema: {\n version: z.string().describe('Version to deliver to production (e.g., \"1.2.5\")'),\n },\n outputSchema: {\n releaseBranch: z.string().describe('The release branch that was delivered'),\n version: z.string().describe('The version that was delivered'),\n success: z.boolean().describe('Whether the delivery was successful'),\n },\n handler: ghReleaseDeliver,\n}\n", "import process from 'node:process'\n\nimport { logger } from 'src/lib/logger'\n\nimport type {\n CreateJiraVersionParams,\n CreateJiraVersionResult,\n DeliverJiraReleaseParams,\n DeliverJiraReleaseResult,\n JiraConfig,\n JiraVersion,\n UpdateJiraVersionParams,\n UpdateJiraVersionResult,\n} from './types.js'\n\n/**\n * Creates a new version in Jira using the REST API\n * @param params - Version creation parameters\n * @param config - Jira configuration (baseUrl, token, projectId)\n * @returns Result containing created version or error\n */\nexport const createJiraVersion = async (\n params: CreateJiraVersionParams,\n config: JiraConfig,\n): Promise<CreateJiraVersionResult> => {\n try {\n const { baseUrl, token, email, projectId } = config\n\n // Use current date if not provided\n // const releaseDate =\n // params.releaseDate || new Date().toISOString().split('T')[0] // 2025-12-06\n\n // Prepare request body\n const requestBody = {\n name: params.name,\n projectId: params.projectId || projectId,\n description: params.description || '',\n // releaseDate,\n released: params.released || false,\n archived: params.archived || false,\n }\n\n // logger.info(\n // { version: params.name, projectId: requestBody.projectId },\n // 'Creating Jira version',\n // )\n\n // Make API request\n const url = `${baseUrl}/rest/api/3/version`\n\n // Create Basic auth credentials\n const credentials = btoa(`${email}:${token}`)\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n Authorization: `Basic ${credentials}`,\n },\n body: JSON.stringify(requestBody),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n\n logger.error(\n {\n status: response.status,\n statusText: response.statusText,\n error: errorText,\n },\n 'Failed to create Jira version',\n )\n\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n const version = (await response.json()) as JiraVersion\n\n // logger.info(\n // { versionId: version.id, versionName: version.name },\n // 'Successfully created Jira version',\n // )\n\n return {\n success: true,\n version,\n }\n } catch (error) {\n logger.error({ error }, 'Error creating Jira version')\n\n throw error\n }\n}\n\n/**\n * Gets all versions for a project from Jira\n * @param config - Jira configuration\n * @returns Array of JiraVersion objects\n */\nconst getProjectVersions = async (config: JiraConfig): Promise<JiraVersion[]> => {\n try {\n const { baseUrl, token, email, projectId } = config\n\n const url = `${baseUrl}/rest/api/3/project/${projectId}/versions`\n const credentials = btoa(`${email}:${token}`)\n\n const response = await fetch(url, {\n method: 'GET',\n headers: {\n Accept: 'application/json',\n Authorization: `Basic ${credentials}`,\n },\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n\n logger.error(\n {\n status: response.status,\n statusText: response.statusText,\n error: errorText,\n },\n 'Failed to get Jira project versions',\n )\n\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n const versions = (await response.json()) as JiraVersion[]\n\n return versions\n } catch (error) {\n logger.error({ error }, 'Error getting Jira project versions')\n\n throw error\n }\n}\n\n/**\n * Finds a Jira version by name in the project\n * @param versionName - Name of the version to find (e.g., \"v1.33.10\")\n * @param config - Jira configuration\n * @returns JiraVersion if found, null otherwise\n */\nconst findVersionByName = async (versionName: string, config: JiraConfig): Promise<JiraVersion | null> => {\n try {\n const versions = await getProjectVersions(config)\n const version = versions.find((v) => {\n return v.name === versionName\n })\n\n return version || null\n } catch (error) {\n logger.error({ error, versionName }, 'Error finding Jira version by name')\n\n throw error\n }\n}\n\n/**\n * Updates an existing Jira version\n * @param params - Update parameters\n * @param config - Jira configuration\n * @returns Result containing updated version or error\n */\nconst updateJiraVersion = async (\n params: UpdateJiraVersionParams,\n config: JiraConfig,\n): Promise<UpdateJiraVersionResult> => {\n try {\n const { baseUrl, token, email } = config\n\n // Prepare request body - only include fields that are provided\n const requestBody: Record<string, any> = {\n released: params.released ?? true,\n archived: params.archived ?? false,\n }\n\n // Add releaseDate if provided, otherwise use current date when releasing\n if (params.releaseDate) {\n requestBody.releaseDate = params.releaseDate\n } else if (params.released !== false) {\n requestBody.releaseDate = new Date().toISOString().split('T')[0] // YYYY-MM-DD\n }\n\n if (params.description !== undefined) {\n requestBody.description = params.description\n }\n\n const url = `${baseUrl}/rest/api/3/version/${params.versionId}`\n const credentials = btoa(`${email}:${token}`)\n\n const response = await fetch(url, {\n method: 'PUT',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n Authorization: `Basic ${credentials}`,\n },\n body: JSON.stringify(requestBody),\n })\n\n if (!response.ok) {\n const errorText = await response.text()\n\n logger.error(\n {\n status: response.status,\n statusText: response.statusText,\n error: errorText,\n },\n 'Failed to update Jira version',\n )\n\n throw new Error(`HTTP ${response.status}: ${response.statusText}`)\n }\n\n const version = (await response.json()) as JiraVersion\n\n return {\n success: true,\n version,\n }\n } catch (error) {\n logger.error({ error }, 'Error updating Jira version')\n\n throw error\n }\n}\n\n/**\n * Delivers a Jira release by marking it as released with the current date\n * @param params - Parameters containing the version name\n * @param config - Jira configuration\n * @returns Result containing updated version\n * @throws Error if version not found or update fails\n */\nexport const deliverJiraRelease = async (\n params: DeliverJiraReleaseParams,\n config: JiraConfig,\n): Promise<DeliverJiraReleaseResult> => {\n try {\n const { versionName } = params\n\n // Find the version by name\n const version = await findVersionByName(versionName, config)\n\n if (!version) {\n logger.error({ versionName }, 'Jira version not found')\n throw new Error(`Version \"${versionName}\" not found in Jira project`)\n }\n\n // Update the version to mark it as released\n const result = await updateJiraVersion(\n {\n versionId: version.id,\n released: true,\n releaseDate: new Date().toISOString().split('T')[0], // Current date in YYYY-MM-DD format\n },\n config,\n )\n\n return result\n } catch (error) {\n logger.error({ error }, 'Error delivering Jira release')\n throw error\n }\n}\n\n/**\n * Loads Jira configuration from environment variables\n * @throws Error with detailed message if configuration is missing or invalid\n * @returns Promise<JiraConfig>\n */\nexport const loadJiraConfig = async (): Promise<JiraConfig> => {\n const baseUrl = process.env.JIRA_BASE_URL\n const token = process.env.JIRA_TOKEN || process.env.JIRA_API_TOKEN\n const projectIdStr = process.env.JIRA_PROJECT_ID\n const email = process.env.JIRA_EMAIL\n\n const missingVars: string[] = []\n\n if (!baseUrl) missingVars.push('JIRA_BASE_URL (e.g., https://your-domain.atlassian.net)')\n if (!token) missingVars.push('JIRA_TOKEN or JIRA_API_TOKEN (your Jira API token)')\n if (!projectIdStr) missingVars.push('JIRA_PROJECT_ID (numeric project ID)')\n if (!email) missingVars.push('JIRA_EMAIL (your Jira email address)')\n\n if (missingVars.length > 0) {\n const errorMessage = [\n 'Jira configuration is required but incomplete.',\n 'Please configure the following environment variables:',\n ...missingVars.map((v) => {\n return ` - ${v}`\n }),\n '',\n 'You can set these in your .env file or as environment variables.',\n ].join('\\n')\n\n throw new Error(errorMessage)\n }\n\n const projectId = Number.parseInt(projectIdStr!, 10)\n\n if (Number.isNaN(projectId)) {\n throw new TypeError(`Invalid JIRA_PROJECT_ID: \"${projectIdStr}\" must be a numeric value (e.g., 10001)`)\n }\n\n return {\n baseUrl: baseUrl!.replace(/\\/$/, ''), // Remove trailing slash\n token: token!,\n projectId,\n email: email!,\n }\n}\n\n/**\n * Attempts to load Jira configuration from environment variables\n * Returns null if configuration is missing or invalid (for optional Jira integration)\n * @returns Promise<JiraConfig | null>\n */\nexport const loadJiraConfigOptional = async (): Promise<JiraConfig | null> => {\n try {\n const config = await loadJiraConfig()\n\n return config\n } catch (error) {\n logger.warn({ error }, 'Jira configuration not available, skipping Jira integration')\n\n return null\n }\n}\n", "import select from '@inquirer/select'\nimport process from 'node:process'\nimport { z } from 'zod'\nimport { $ } from 'zx'\n\nimport { getReleasePRs } from 'src/integrations/gh'\nimport { commandEcho } from 'src/lib/command-echo'\nimport { ENVs } from 'src/lib/constants'\nimport { logger } from 'src/lib/logger'\nimport type { ToolsExecutionResult } from 'src/types'\n\ninterface GhReleaseDeployAllArgs {\n version: string\n env: string\n skipTerraform?: boolean\n}\n\n/**\n * Deploy a release branch to an environment\n */\nexport const ghReleaseDeployAll = async (args: GhReleaseDeployAllArgs): Promise<ToolsExecutionResult> => {\n const { version, env, skipTerraform } = args\n\n commandEcho.start('release-deploy-all')\n\n // TODO: add validation for semver version for version variable\n\n const releasePRsList: string[] = ['dev'] // [\"release/v1.8.0\", \"release/v1.9.0\"]\n\n const releasePRs = await getReleasePRs()\n\n releasePRsList.push(...releasePRs)\n\n let selectedReleaseBranch = '' // \"release/v1.8.0\"\n\n if (version) {\n selectedReleaseBranch = version === 'dev' ? 'dev' : `release/v${version}`\n } else {\n commandEcho.setInteractive()\n\n selectedReleaseBranch = await select({\n message: '\uD83C\uDF3F Select release branch',\n choices: releasePRsList.map((pr) => {\n return {\n name: pr.replace('release/v', ''),\n value: pr,\n }\n }),\n })\n }\n\n const selectedVersion = selectedReleaseBranch === 'dev' ? 'dev' : selectedReleaseBranch.replace('release/v', '')\n\n commandEcho.addOption('--version', selectedVersion)\n\n // Check if release branch exists in the list\n if (!releasePRsList.includes(selectedReleaseBranch)) {\n logger.error(`\u274C Release branch ${selectedReleaseBranch} not found in open PRs. Exiting...`)\n process.exit(1)\n }\n\n let selectedEnv = ''\n\n if (env) {\n selectedEnv = env\n } else {\n commandEcho.setInteractive()\n\n selectedEnv = await select({\n message: '\uD83E\uDDEA Select environment',\n choices: ENVs.map((env) => {\n return {\n name: env,\n value: env,\n }\n }),\n })\n }\n\n commandEcho.addOption('--env', selectedEnv)\n\n if (!ENVs.includes(selectedEnv)) {\n logger.error(`\u274C Invalid environment: ${selectedEnv}. Exiting...`)\n process.exit(1)\n }\n\n const shouldSkipTerraform = skipTerraform ?? false\n\n if (shouldSkipTerraform) {\n commandEcho.addOption('--skip-terraform', true)\n }\n\n try {\n $.quiet = true\n\n const skipTerraformFlag = shouldSkipTerraform ? ['-f', 'skip_terraform_deploy=true'] : []\n\n await $`gh workflow run deploy-all.yml --ref ${selectedReleaseBranch} -f environment=${selectedEnv} ${skipTerraformFlag}`\n\n $.quiet = false\n\n logger.info(\n `Successfully launched deploy-all workflow_dispatch for release branch: ${selectedReleaseBranch} and environment: ${selectedEnv}`,\n )\n\n commandEcho.print()\n\n const structuredContent = {\n releaseBranch: selectedReleaseBranch,\n version: selectedReleaseBranch.replace('release/v', ''),\n environment: selectedEnv,\n skipTerraformDeploy: shouldSkipTerraform,\n success: true,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n } catch (error: unknown) {\n logger.error({ error }, '\u274C Error launching workflow')\n process.exit(1)\n }\n}\n\n// MCP Tool Registration\nexport const ghReleaseDeployAllMcpTool = {\n name: 'gh-release-deploy-all',\n description: 'Deploy a release branch to a specified environment',\n inputSchema: {\n version: z.string().describe('Version to deploy (e.g., \"1.2.5\")'),\n env: z.string().describe('Environment to deploy to (e.g., \"dev\", \"renana\", \"oriana\")'),\n skipTerraform: z.boolean().optional().describe('Skip terraform deployment step'),\n },\n outputSchema: {\n releaseBranch: z.string().describe('The release branch that was deployed'),\n version: z.string().describe('The version that was deployed'),\n environment: z.string().describe('The environment deployed to'),\n skipTerraformDeploy: z.boolean().describe('Whether terraform deployment was skipped'),\n success: z.boolean().describe('Whether the deployment was successful'),\n },\n handler: ghReleaseDeployAll,\n}\n", "import checkbox from '@inquirer/checkbox'\nimport select from '@inquirer/select'\nimport fs from 'node:fs/promises'\nimport { resolve } from 'node:path'\nimport process from 'node:process'\nimport yaml from 'yaml'\nimport { z } from 'zod'\nimport { $ } from 'zx'\n\nimport { getReleasePRs } from 'src/integrations/gh'\nimport { commandEcho } from 'src/lib/command-echo'\nimport { ENVs } from 'src/lib/constants'\nimport { getProjectRoot } from 'src/lib/git-utils'\nimport { logger } from 'src/lib/logger'\nimport type { ToolsExecutionResult } from 'src/types'\n\ninterface GhReleaseDeploySelectedArgs {\n version: string\n env: string\n services: string[]\n skipTerraform?: boolean\n}\n\n/**\n * Deploy selected services from a release branch to an environment\n */\n// eslint-disable-next-line sonarjs/cognitive-complexity\nexport const ghReleaseDeploySelected = async (args: GhReleaseDeploySelectedArgs): Promise<ToolsExecutionResult> => {\n const { version, env, services, skipTerraform } = args\n\n commandEcho.start('release-deploy-selected')\n\n const releasePRsList: string[] = ['dev']\n\n const releasePRs = await getReleasePRs()\n\n releasePRsList.push(...releasePRs)\n\n let selectedReleaseBranch = ''\n\n if (version) {\n selectedReleaseBranch = version === 'dev' ? 'dev' : `release/v${version}`\n } else {\n commandEcho.setInteractive()\n\n selectedReleaseBranch = await select({\n message: '\uD83C\uDF3F Select release branch',\n choices: releasePRsList.map((pr) => {\n return {\n name: pr.replace('release/v', ''),\n value: pr,\n }\n }),\n })\n }\n\n const selectedVersion = selectedReleaseBranch === 'dev' ? 'dev' : selectedReleaseBranch.replace('release/v', '')\n\n commandEcho.addOption('--version', selectedVersion)\n\n // Check if release branch exists in the list\n if (!releasePRsList.includes(selectedReleaseBranch)) {\n logger.error(`\u274C Release branch ${selectedReleaseBranch} not found in open PRs. Exiting...`)\n process.exit(1)\n }\n\n let selectedEnv = ''\n\n if (env) {\n selectedEnv = env\n } else {\n commandEcho.setInteractive()\n\n selectedEnv = await select({\n message: '\uD83E\uDDEA Select environment',\n choices: ENVs.map((env) => {\n return {\n name: env,\n value: env,\n }\n }),\n })\n }\n\n commandEcho.addOption('--env', selectedEnv)\n\n if (!ENVs.includes(selectedEnv)) {\n logger.error(`\u274C Invalid environment: ${selectedEnv}. Exiting...`)\n process.exit(1)\n }\n\n // Parse available services from workflow file\n const availableServices = await parseServicesFromWorkflow()\n\n if (availableServices.length === 0) {\n logger.error('\u274C No services found in workflow file. Exiting...')\n\n process.exit(1)\n }\n\n let selectedServices: string[] = []\n\n if (services && services.length > 0) {\n selectedServices = services\n } else {\n commandEcho.setInteractive()\n\n selectedServices = await checkbox({\n message: '\uD83D\uDE80 Select services to deploy (space to select, enter to confirm)',\n choices: availableServices.map((svc) => {\n return {\n name: svc,\n value: svc,\n }\n }),\n })\n }\n\n commandEcho.addOption('--services', selectedServices)\n\n if (selectedServices.length === 0) {\n logger.error('\u274C No services selected. Exiting...')\n process.exit(1)\n }\n\n // Validate all selected services\n const invalidServices = selectedServices.filter((svc) => {\n return !availableServices.includes(svc)\n })\n\n if (invalidServices.length > 0) {\n logger.error(\n `\u274C Invalid services: ${invalidServices.join(', ')}. Available services: ${availableServices.join(', ')}`,\n )\n process.exit(1)\n }\n\n const shouldSkipTerraform = skipTerraform ?? false\n\n if (shouldSkipTerraform) {\n commandEcho.addOption('--skip-terraform', true)\n }\n\n try {\n $.quiet = true\n\n // Build the workflow command with boolean flags for each selected service\n const serviceFlags = selectedServices.flatMap((svc) => {\n return ['-f', `${svc}=true`]\n })\n const skipTerraformFlag = shouldSkipTerraform ? ['-f', 'skip_terraform_deploy=true'] : []\n\n await $`gh workflow run deploy-selected-services.yml --ref ${selectedReleaseBranch} -f environment=${selectedEnv} ${serviceFlags} ${skipTerraformFlag}`\n\n $.quiet = false\n\n logger.info(\n `Successfully launched deploy-selected-services workflow_dispatch for release branch: ${selectedReleaseBranch}, environment: ${selectedEnv}, services: ${selectedServices.join(', ')}`,\n )\n\n commandEcho.print()\n\n const structuredContent = {\n releaseBranch: selectedReleaseBranch,\n version: selectedReleaseBranch.replace('release/v', ''),\n environment: selectedEnv,\n services: selectedServices,\n skipTerraformDeploy: shouldSkipTerraform,\n success: true,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n } catch (error: unknown) {\n logger.error({ error }, '\u274C Error launching workflow')\n process.exit(1)\n }\n}\n\n/**\n * Parse available services from the workflow file\n * Services are defined as boolean inputs (excluding skip_terraform_deploy)\n */\nconst parseServicesFromWorkflow = async (): Promise<string[]> => {\n const projectRoot = await getProjectRoot()\n\n const workflowPath = resolve(projectRoot, '.github/workflows/deploy-selected-services.yml')\n\n const content = await fs.readFile(workflowPath, 'utf-8')\n const parsed = yaml.parse(content)\n\n const inputs = parsed.on.workflow_dispatch.inputs\n const services: string[] = []\n\n for (const [key, value] of Object.entries(inputs)) {\n // Filter for boolean type inputs, excluding non-service flags\n if ((value as { type: string }).type === 'boolean' && key !== 'skip_terraform_deploy') {\n services.push(key)\n }\n }\n\n return services\n}\n\n// MCP Tool Registration\nexport const ghReleaseDeploySelectedMcpTool = {\n name: 'gh-release-deploy-selected',\n description: 'Deploy selected services from a release branch to a specified environment',\n inputSchema: {\n version: z.string().describe('Version to deploy (e.g., \"1.2.5\")'),\n env: z.string().describe('Environment to deploy to (e.g., \"dev\", \"renana\", \"oriana\")'),\n services: z.array(z.string()).describe('List of services to deploy (e.g., [\"client-be\", \"client-fe\"])'),\n skipTerraform: z.boolean().optional().describe('Skip terraform deployment step'),\n },\n outputSchema: {\n releaseBranch: z.string().describe('The release branch that was deployed'),\n version: z.string().describe('The version that was deployed'),\n environment: z.string().describe('The environment deployed to'),\n services: z.array(z.string()).describe('The services that were deployed'),\n skipTerraformDeploy: z.boolean().describe('Whether terraform deployment was skipped'),\n success: z.boolean().describe('Whether the deployment was successful'),\n },\n handler: ghReleaseDeploySelected,\n}\n", "import select from '@inquirer/select'\nimport fs from 'node:fs/promises'\nimport { resolve } from 'node:path'\nimport process from 'node:process'\nimport yaml from 'yaml'\nimport { z } from 'zod'\nimport { $ } from 'zx'\n\nimport { getReleasePRs } from 'src/integrations/gh'\nimport { commandEcho } from 'src/lib/command-echo'\nimport { ENVs } from 'src/lib/constants'\nimport { getProjectRoot } from 'src/lib/git-utils'\nimport { logger } from 'src/lib/logger'\nimport type { ToolsExecutionResult } from 'src/types'\n\ninterface GhReleaseDeployServiceArgs {\n version: string\n env: string\n service: string\n skipTerraform?: boolean\n}\n\n/**\n * Deploy a specific service in a release branch to an environment\n */\nexport const ghReleaseDeployService = async (args: GhReleaseDeployServiceArgs): Promise<ToolsExecutionResult> => {\n const { version, env, service, skipTerraform } = args\n\n commandEcho.start('release-deploy-service')\n\n // TODO: add validation for semver version for version variable\n\n const releasePRsList: string[] = ['dev'] // [\"release/v1.8.0\", \"release/v1.9.0\"]\n\n const releasePRs = await getReleasePRs()\n\n releasePRsList.push(...releasePRs)\n\n let selectedReleaseBranch = '' // \"release/v1.8.0\"\n\n if (version) {\n selectedReleaseBranch = version === 'dev' ? 'dev' : `release/v${version}`\n } else {\n commandEcho.setInteractive()\n\n selectedReleaseBranch = await select({\n message: '\uD83C\uDF3F Select release branch',\n choices: releasePRsList.map((pr) => {\n return {\n name: pr.replace('release/v', ''),\n value: pr,\n }\n }),\n })\n }\n\n const selectedVersion = selectedReleaseBranch === 'dev' ? 'dev' : selectedReleaseBranch.replace('release/v', '')\n\n commandEcho.addOption('--version', selectedVersion)\n\n // Check if release branch exists in the list\n if (!releasePRsList.includes(selectedReleaseBranch)) {\n logger.error(`\u274C Release branch ${selectedReleaseBranch} not found in open PRs. Exiting...`)\n process.exit(1)\n }\n\n let selectedEnv = ''\n\n if (env) {\n selectedEnv = env\n } else {\n commandEcho.setInteractive()\n\n selectedEnv = await select({\n message: '\uD83E\uDDEA Select environment',\n choices: ENVs.map((env) => {\n return {\n name: env,\n value: env,\n }\n }),\n })\n }\n\n commandEcho.addOption('--env', selectedEnv)\n\n if (!ENVs.includes(selectedEnv)) {\n logger.error(`\u274C Invalid environment: ${selectedEnv}. Exiting...`)\n process.exit(1)\n }\n\n // Parse available services from workflow file\n const availableServices = await parseServicesFromWorkflow()\n\n let selectedService = ''\n\n if (service) {\n selectedService = service\n } else {\n commandEcho.setInteractive()\n\n selectedService = await select({\n message: '\uD83D\uDE80 Select service to deploy',\n choices: availableServices.map((svc) => {\n return {\n name: svc,\n value: svc,\n }\n }),\n })\n }\n\n commandEcho.addOption('--service', selectedService)\n\n if (!availableServices.includes(selectedService)) {\n logger.error(`\u274C Invalid service: ${selectedService}. Available services: ${availableServices.join(', ')}`)\n process.exit(1)\n }\n\n const shouldSkipTerraform = skipTerraform ?? false\n\n if (shouldSkipTerraform) {\n commandEcho.addOption('--skip-terraform', true)\n }\n\n try {\n $.quiet = true\n\n const skipTerraformFlag = shouldSkipTerraform ? ['-f', 'skip_terraform_deploy=true'] : []\n\n await $`gh workflow run deploy-single-service.yml --ref ${selectedReleaseBranch} -f environment=${selectedEnv} -f service=${selectedService} ${skipTerraformFlag}`\n\n $.quiet = false\n\n logger.info(\n `Successfully launched deploy-single-service workflow_dispatch for release branch: ${selectedReleaseBranch}, environment: ${selectedEnv}, service: ${selectedService}`,\n )\n\n commandEcho.print()\n\n const structuredContent = {\n releaseBranch: selectedReleaseBranch,\n version: selectedReleaseBranch.replace('release/v', ''),\n environment: selectedEnv,\n service: selectedService,\n skipTerraformDeploy: shouldSkipTerraform,\n success: true,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n } catch (error: unknown) {\n logger.error({ error }, '\u274C Error launching workflow')\n process.exit(1)\n }\n}\n\n/**\n * Parse available services from the workflow file\n */\nconst parseServicesFromWorkflow = async (): Promise<string[]> => {\n const projectRoot = await getProjectRoot()\n const workflowPath = resolve(projectRoot, '.github/workflows/deploy-single-service.yml')\n const content = await fs.readFile(workflowPath, 'utf-8')\n const parsed = yaml.parse(content)\n\n return parsed.on.workflow_dispatch.inputs.service.options\n}\n\n// MCP Tool Registration\nexport const ghReleaseDeployServiceMcpTool = {\n name: 'gh-release-deploy-service',\n description: 'Deploy a specific service in a release branch to a specified environment',\n inputSchema: {\n version: z.string().describe('Version to deploy (e.g., \"1.2.5\")'),\n env: z.string().describe('Environment to deploy to (e.g., \"dev\", \"renana\", \"oriana\")'),\n service: z.string().describe('Service to deploy (e.g., \"client-be\", \"client-fe\")'),\n skipTerraform: z.boolean().optional().describe('Skip terraform deployment step'),\n },\n outputSchema: {\n releaseBranch: z.string().describe('The release branch that was deployed'),\n version: z.string().describe('The version that was deployed'),\n environment: z.string().describe('The environment deployed to'),\n service: z.string().describe('The service that was deployed'),\n skipTerraformDeploy: z.boolean().describe('Whether terraform deployment was skipped'),\n success: z.boolean().describe('Whether the deployment was successful'),\n },\n handler: ghReleaseDeployService,\n}\n", "import { z } from 'zod'\n\nimport { getReleasePRs } from 'src/integrations/gh'\nimport { logger } from 'src/lib/logger'\nimport type { ToolsExecutionResult } from 'src/types'\n\n/**\n * List all open release branches\n */\nexport const ghReleaseList = async (): Promise<ToolsExecutionResult> => {\n const releasePRs = await getReleasePRs()\n\n const releasePRsList = releasePRs.map((pr) => {\n return pr.replace('release/', '')\n })\n\n logger.info('All release branches: \\n')\n logger.info(`\\n${releasePRsList.join('\\n')}`)\n\n const structuredContent = {\n releases: releasePRsList,\n count: releasePRsList.length,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n}\n\n// MCP Tool Registration\nexport const ghReleaseListMcpTool = {\n name: 'gh-release-list',\n description: 'List all open release branches',\n inputSchema: {},\n outputSchema: {\n releases: z.array(z.string()).describe('List of all release branches'),\n count: z.number().describe('Number of release branches'),\n },\n handler: ghReleaseList,\n}\n", "import confirm from '@inquirer/confirm'\nimport process from 'node:process'\nimport { z } from 'zod'\nimport { $, question } from 'zx'\n\nimport { loadJiraConfig } from 'src/integrations/jira'\nimport { commandEcho } from 'src/lib/command-echo'\nimport { logger } from 'src/lib/logger'\nimport { createSingleRelease, prepareGitForRelease } from 'src/lib/release-utils'\nimport type { RequiredConfirmedOptionArg, ToolsExecutionResult } from 'src/types'\n\ninterface ReleaseCreateArgs extends RequiredConfirmedOptionArg {\n version?: string\n description?: string\n checkout?: boolean\n}\n\n/**\n * Create a single release branch for the specified version\n * Includes Jira version creation and GitHub release branch creation\n */\nexport const releaseCreate = async (args: ReleaseCreateArgs): Promise<ToolsExecutionResult> => {\n const { version: inputVersion, description: inputDescription, confirmedCommand, checkout: inputCheckout } = args\n\n commandEcho.start('release-create')\n\n let version = inputVersion\n let description = inputDescription\n let checkout = inputCheckout\n\n // Load Jira config - it is now mandatory\n const jiraConfig = await loadJiraConfig()\n\n if (!version) {\n commandEcho.setInteractive()\n version = await question('Enter version (e.g. 1.2.5): ')\n }\n\n // Validate input (validate the version is a valid semver)\n if (!version || version.trim() === '') {\n logger.error('No version provided. Exiting...')\n process.exit(1)\n }\n\n const trimmedVersion = version.trim()\n\n commandEcho.addOption('--version', trimmedVersion)\n\n if (description === undefined) {\n commandEcho.setInteractive()\n description = await question('Enter description (optional, press Enter to skip): ')\n\n if (description.trim() === '') {\n description = ''\n }\n }\n\n if (description) {\n commandEcho.addOption('--description', description)\n }\n\n const answer = confirmedCommand\n ? true\n : await confirm({\n message: `Are you sure you want to create release branch for version ${trimmedVersion}?`,\n })\n\n if (!confirmedCommand) {\n commandEcho.setInteractive()\n }\n\n if (!answer) {\n logger.info('Operation cancelled. Exiting...')\n process.exit(0)\n }\n\n // Track --yes flag if confirmation was interactive (user confirmed)\n commandEcho.addOption('--yes', true)\n\n await prepareGitForRelease()\n\n // Create the release\n const release = await createSingleRelease(trimmedVersion, jiraConfig, description)\n\n logger.info(`\u2705 Successfully created release: v${trimmedVersion}`)\n logger.info(`\uD83D\uDD17 GitHub PR: ${release.prUrl}`)\n logger.info(`\uD83D\uDD17 Jira Version: ${release.jiraVersionUrl}`)\n\n // Ask about checkout if not specified\n if (checkout === undefined) {\n commandEcho.setInteractive()\n\n checkout = await confirm({\n message: `Do you want to checkout to the created branch ${release.branchName}?`,\n default: true,\n })\n }\n\n // Track checkout option (--no-checkout if false)\n if (!checkout) {\n commandEcho.addOption('--no-checkout', true)\n }\n\n // Checkout to the created branch by default\n if (checkout) {\n $.quiet = true\n await $`git switch ${release.branchName}`\n $.quiet = false\n\n logger.info(`\uD83D\uDD04 Switched to branch ${release.branchName}`)\n }\n\n commandEcho.print()\n\n const structuredContent = {\n version: trimmedVersion,\n branchName: release.branchName,\n prUrl: release.prUrl,\n jiraVersionUrl: release.jiraVersionUrl,\n isCheckedOut: checkout,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n}\n\n// MCP Tool Registration\nexport const releaseCreateMcpTool = {\n name: 'release-create',\n description: 'Create a single release branch for specified version with Jira version creation',\n inputSchema: {\n version: z.string().describe('Version to create (e.g., \"1.2.5\")'),\n description: z.string().optional().describe('Optional description for the Jira version'),\n checkout: z.boolean().optional().default(true).describe('Checkout to the created branch (default: true)'),\n },\n outputSchema: {\n version: z.string().describe('Version number'),\n branchName: z.string().describe('Release branch name'),\n prUrl: z.string().describe('GitHub PR URL'),\n jiraVersionUrl: z.string().describe('Jira version URL'),\n isCheckedOut: z.boolean().describe('Whether the branch was checked out'),\n },\n handler: releaseCreate,\n}\n", "import { $ } from 'zx'\n\nimport { createReleaseBranch } from 'src/integrations/gh'\nimport { createJiraVersion } from 'src/integrations/jira'\nimport type { JiraConfig } from 'src/integrations/jira'\n\nexport interface ReleaseCreationResult {\n version: string\n branchName: string\n prUrl: string\n jiraVersionUrl: string\n}\n\n/**\n * Prepare git repository for release creation\n * Fetches latest changes, switches to dev branch, and pulls latest\n */\nexport const prepareGitForRelease = async (): Promise<void> => {\n $.quiet = true\n\n await $`git fetch origin`\n await $`git switch dev`\n await $`git pull origin dev`\n\n $.quiet = false\n}\n\n/**\n * Create a single release by creating both Jira version and GitHub release branch\n * @param version - Version number (e.g., \"1.2.5\")\n * @param jiraConfig - Jira configuration object\n * @param description - Optional description for the Jira version\n * @returns Release creation result with URLs and metadata\n */\nexport const createSingleRelease = async (\n version: string,\n jiraConfig: JiraConfig,\n description?: string,\n): Promise<ReleaseCreationResult> => {\n // 1. Create Jira version (mandatory)\n const versionName = `v${version}`\n\n const result = await createJiraVersion(\n {\n name: versionName,\n projectId: jiraConfig.projectId,\n description: description || '',\n released: false,\n archived: false,\n },\n jiraConfig,\n )\n\n // Construct user-friendly Jira URL using project key from API response\n const jiraVersionUrl = `${jiraConfig.baseUrl}/projects/${result.version!.projectId}/versions/${result.version!.id}/tab/release-report-all-issues`\n\n // 2. Create GitHub release branch\n const releaseInfo = await createReleaseBranch({ version, jiraVersionUrl })\n\n return {\n version,\n branchName: releaseInfo.branchName,\n prUrl: releaseInfo.prUrl,\n jiraVersionUrl,\n }\n}\n", "import confirm from '@inquirer/confirm'\nimport process from 'node:process'\nimport { z } from 'zod'\nimport { question } from 'zx'\n\nimport { loadJiraConfig } from 'src/integrations/jira'\nimport { commandEcho } from 'src/lib/command-echo'\nimport { logger } from 'src/lib/logger'\nimport { createSingleRelease, prepareGitForRelease } from 'src/lib/release-utils'\nimport type { ReleaseCreationResult } from 'src/lib/release-utils'\nimport type { RequiredConfirmedOptionArg, ToolsExecutionResult } from 'src/types'\n\ninterface ReleaseCreateBatchArgs extends RequiredConfirmedOptionArg {\n versions: string\n description?: string\n}\n\n/**\n * Create multiple release branches for the specified versions\n * Includes Jira version creation and GitHub release branch creation for each version\n */\n// eslint-disable-next-line sonarjs/cognitive-complexity\nexport const releaseCreateBatch = async (args: ReleaseCreateBatchArgs): Promise<ToolsExecutionResult> => {\n const { versions: inputVersions, description, confirmedCommand } = args\n\n commandEcho.start('release-create-batch')\n\n let versionInput = inputVersions\n\n // Load Jira config - it is now mandatory\n const jiraConfig = await loadJiraConfig()\n\n if (!versionInput) {\n commandEcho.setInteractive()\n versionInput = await question('Enter versions by comma (e.g. 1.2.5, 1.2.6): ')\n }\n\n const versionsList = versionInput.split(',').map((version) => {\n return version.trim()\n })\n\n commandEcho.addOption('--versions', versionsList.join(', '))\n\n // Validate input\n if (versionsList.length === 0) {\n logger.error('No versions provided. Exiting...')\n process.exit(1)\n }\n\n // Inform user if they only provided one version\n if (versionsList.length === 1) {\n logger.warn('\uD83D\uDCA1 You are creating only one release. Consider using \"create-release\" command for single releases.')\n }\n\n const answer = confirmedCommand\n ? true\n : await confirm({\n message: `Are you sure you want to create release branches for these versions: ${versionsList.join(', ')}?`,\n })\n\n if (!confirmedCommand) {\n commandEcho.setInteractive()\n }\n\n if (!answer) {\n logger.info('Operation cancelled. Exiting...')\n process.exit(0)\n }\n\n // Track --yes flag if confirmation was interactive (user confirmed)\n commandEcho.addOption('--yes', true)\n\n if (description) {\n commandEcho.addOption('--description', description)\n }\n\n await prepareGitForRelease()\n\n const releases: ReleaseCreationResult[] = []\n const failedReleases: Array<{ version: string; error: string }> = []\n\n for (const version of versionsList) {\n try {\n // Create each release\n const release = await createSingleRelease(version, jiraConfig, description)\n\n releases.push(release)\n\n logger.info(`\u2705 Successfully created release: v${version}`)\n logger.info(`\uD83D\uDD17 GitHub PR: ${release.prUrl}`)\n logger.info(`\uD83D\uDD17 Jira Version: ${release.jiraVersionUrl}\\n`)\n } catch (error) {\n const errorMessage = error instanceof Error ? error.message : String(error)\n\n failedReleases.push({ version, error: errorMessage })\n\n logger.error(`\u274C Failed to create release: v${version}`)\n logger.error(` Error: ${errorMessage}\\n`)\n }\n }\n\n // Final summary\n const successCount = releases.length\n const failureCount = failedReleases.length\n\n if (successCount === versionsList.length) {\n logger.info(`\u2705 All ${versionsList.length} release branches were created successfully.`)\n } else if (successCount > 0) {\n logger.warn(`\u26A0\uFE0F ${successCount} of ${versionsList.length} release branches were created successfully.`)\n logger.warn(`\u274C ${failureCount} release(s) failed.`)\n } else {\n logger.error(`\u274C All ${versionsList.length} release branches failed to create.`)\n }\n\n commandEcho.print()\n\n const structuredContent = {\n createdBranches: releases.map((r) => {\n return r.branchName\n }),\n successCount,\n failureCount,\n releases,\n failedReleases,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n}\n\n// MCP Tool Registration\nexport const releaseCreateBatchMcpTool = {\n name: 'release-create-batch',\n description: 'Create multiple release branches for specified versions with Jira version creation (batch operation)',\n inputSchema: {\n versions: z.string().describe('Comma-separated list of versions to create (e.g., \"1.2.5, 1.2.6\")'),\n description: z.string().optional().describe('Optional description for the Jira versions'),\n },\n outputSchema: {\n createdBranches: z.array(z.string()).describe('List of created release branches'),\n successCount: z.number().describe('Number of releases created successfully'),\n failureCount: z.number().describe('Number of releases that failed'),\n releases: z\n .array(\n z.object({\n version: z.string().describe('Version number'),\n branchName: z.string().describe('Release branch name'),\n prUrl: z.string().describe('GitHub PR URL'),\n jiraVersionUrl: z.string().describe('Jira version URL'),\n }),\n )\n .describe('Detailed information for each created release with URLs'),\n failedReleases: z\n .array(\n z.object({\n version: z.string().describe('Version number that failed'),\n error: z.string().describe('Error message'),\n }),\n )\n .describe('List of releases that failed with error messages'),\n },\n handler: releaseCreateBatch,\n}\n", "/* eslint-disable sonarjs/cognitive-complexity */\nimport checkbox from '@inquirer/checkbox'\nimport confirm from '@inquirer/confirm'\nimport { copyFileSync, existsSync } from 'node:fs'\nimport process from 'node:process'\nimport { z } from 'zod'\nimport { $ } from 'zx'\n\nimport { getReleasePRs } from 'src/integrations/gh'\nimport { commandEcho } from 'src/lib/command-echo'\nimport { WORKTREES_DIR_SUFFIX } from 'src/lib/constants'\nimport { getCurrentWorktrees, getProjectRoot } from 'src/lib/git-utils'\nimport { logger } from 'src/lib/logger'\nimport type { RequiredConfirmedOptionArg, ToolsExecutionResult } from 'src/types'\n\n// Constants\nconst FEATURE_DIR = 'feature'\nconst RELEASE_DIR = 'release'\nconst RELEASE_BRANCH_PREFIX = 'release/v'\n\ninterface WorktreeManagementArgs extends RequiredConfirmedOptionArg {\n all: boolean\n cursor?: boolean\n}\n\n/**\n * Manage git worktrees for release branches\n * Creates worktrees for active release branches and removes unused ones\n */\nexport const worktreesAdd = async (options: WorktreeManagementArgs): Promise<ToolsExecutionResult> => {\n const { confirmedCommand, all, cursor } = options\n\n commandEcho.start('worktrees-add')\n\n try {\n const currentWorktrees = await getCurrentWorktrees('release')\n const projectRoot = await getProjectRoot()\n\n const worktreeDir = `${projectRoot}${WORKTREES_DIR_SUFFIX}`\n\n await ensureWorktreeDirectory(`${worktreeDir}/${RELEASE_DIR}`)\n await ensureWorktreeDirectory(`${worktreeDir}/${FEATURE_DIR}`)\n\n const releasePRsList = await getReleasePRs()\n\n if (releasePRsList.length === 0) {\n logger.info('\u2139\uFE0F No open release branches found')\n\n commandEcho.print()\n\n return {\n content: [{ type: 'text', text: JSON.stringify({ createdWorktrees: [], count: 0 }, null, 2) }],\n structuredContent: { createdWorktrees: [], count: 0 },\n }\n }\n\n let selectedReleaseBranches: string[] = []\n\n if (all) {\n selectedReleaseBranches = releasePRsList\n } else {\n commandEcho.setInteractive()\n\n selectedReleaseBranches = await checkbox({\n required: true,\n message: '\uD83C\uDF3F Select release branches',\n choices: releasePRsList.map((pr) => {\n return {\n name: pr.replace('release/v', ''),\n value: pr,\n }\n }),\n })\n }\n\n // Track --all flag if all branches were selected (either via flag or interactively)\n const allSelected = selectedReleaseBranches.length === releasePRsList.length\n\n if (allSelected) {\n commandEcho.addOption('--all', true)\n } else {\n commandEcho.addOption('--branches', selectedReleaseBranches)\n }\n\n // Ask for confirmation\n const answer = confirmedCommand\n ? true\n : await confirm({\n message: 'Are you sure you want to proceed with these worktree changes?',\n })\n\n if (!confirmedCommand) {\n commandEcho.setInteractive()\n }\n\n if (!answer) {\n logger.info('Operation cancelled. Exiting...')\n process.exit(0)\n }\n\n // Track --yes flag if confirmation was interactive (user confirmed)\n if (allSelected) {\n commandEcho.addOption('--yes', true)\n }\n\n const openInCursor = cursor ? true : await confirm({ message: 'Open created worktrees in Cursor?' })\n\n if (!openInCursor) {\n commandEcho.setInteractive()\n }\n\n if (openInCursor) {\n commandEcho.addOption('--cursor', true)\n }\n\n const { branchesToCreate } = categorizeWorktrees({\n selectedReleaseBranches,\n currentWorktrees,\n })\n\n const createdWorktrees = await createWorktrees(branchesToCreate, worktreeDir, projectRoot)\n\n logResults(createdWorktrees)\n\n if (openInCursor) {\n for (const branch of createdWorktrees) {\n await $`cursor ${worktreeDir}/${branch}`\n }\n }\n\n commandEcho.print()\n\n const structuredContent = {\n createdWorktrees,\n count: createdWorktrees.length,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n } catch (error) {\n logger.error({ error }, '\u274C Error managing worktrees')\n throw error\n }\n}\n\n/**\n * Ensure the worktree directory exists\n */\nconst ensureWorktreeDirectory = async (worktreeDir: string): Promise<void> => {\n await $`mkdir -p ${worktreeDir}`\n}\n\ninterface CategorizeWorktreesArgs {\n selectedReleaseBranches: string[]\n currentWorktrees: string[]\n}\n\n/**\n * Categorize release worktrees into those that need to be created or removed\n */\nconst categorizeWorktrees = (args: CategorizeWorktreesArgs): { branchesToCreate: string[] } => {\n const { selectedReleaseBranches, currentWorktrees } = args\n\n const currentBranchNames = currentWorktrees.filter((branch) => {\n return branch.startsWith(RELEASE_BRANCH_PREFIX)\n })\n\n const branchesToCreate = selectedReleaseBranches.filter((branch) => {\n return !currentBranchNames.includes(branch)\n })\n\n return { branchesToCreate }\n}\n\n/**\n * Create worktrees for the specified branches\n */\nconst createWorktrees = async (branches: string[], worktreeDir: string, projectRoot: string): Promise<string[]> => {\n const created: string[] = []\n\n for (const branch of branches) {\n try {\n const worktreePath = `${worktreeDir}/${branch}`\n\n await $`git worktree add ${worktreePath} ${branch}`\n\n const rootEnvPath = `${projectRoot}/.env`\n\n if (existsSync(rootEnvPath)) {\n copyFileSync(rootEnvPath, `${worktreePath}/.env`)\n\n logger.info('\uD83D\uDCCB Copied .env to worktree')\n }\n\n created.push(branch)\n } catch (error) {\n logger.error({ error, branch }, `\u274C Failed to create worktree for ${branch}`)\n }\n }\n\n return created\n}\n\n/**\n * Log the results of worktree management\n */\nconst logResults = (created: string[]): void => {\n if (created.length > 0) {\n logger.info('\\n')\n logger.info('\u2705 Created worktrees:')\n logger.info(created.join('\\n'))\n logger.info('')\n } else {\n logger.info('\u2139\uFE0F No new worktrees to create')\n }\n}\n\n// MCP Tool Registration\nexport const worktreesAddMcpTool = {\n name: 'worktrees-add',\n description: 'Create worktrees for selected release branches',\n inputSchema: {\n all: z.boolean().describe('Add worktrees for all release branches without prompting'),\n cursor: z.boolean().optional().describe('Open created worktrees in Cursor'),\n },\n outputSchema: {\n createdWorktrees: z.array(z.string()).describe('List of created worktree branches'),\n count: z.number().describe('Number of worktrees created'),\n },\n handler: worktreesAdd,\n}\n", "import { z } from 'zod'\nimport { $ } from 'zx'\n\nimport { getCurrentWorktrees, getProjectRoot } from 'src/lib/git-utils'\nimport { logger } from 'src/lib/logger'\nimport type { ToolsExecutionResult } from 'src/types'\n\ninterface WorktreeInfo {\n branch: string\n path: string\n commit: string\n isCurrent: boolean\n type: 'release' | 'feature'\n status: string\n lastCommitMessage: string\n aheadBehind: string\n}\n\n/**\n * List all (features and releases) git worktrees with detailed information\n */\nexport const worktreesList = async (): Promise<ToolsExecutionResult> => {\n try {\n const [releaseWorktrees, featureWorktrees] = await Promise.all([\n getCurrentWorktrees('release'),\n getCurrentWorktrees('feature'),\n ])\n\n const projectRoot = await getProjectRoot()\n const worktreesInfo = await processWorktrees(releaseWorktrees, featureWorktrees, projectRoot)\n\n logResults(worktreesInfo)\n\n const structuredContent = {\n worktrees: worktreesInfo,\n totalCount: worktreesInfo.length,\n releaseCount: releaseWorktrees.length,\n featureCount: featureWorktrees.length,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n } catch (error) {\n logger.error({ error }, '\u274C Error listing worktrees')\n throw error\n }\n}\n\n/**\n * Process worktrees to get detailed information\n */\nconst processWorktrees = async (\n releaseWorktrees: string[],\n featureWorktrees: string[],\n projectRoot: string,\n): Promise<WorktreeInfo[]> => {\n const allWorktrees = [\n ...releaseWorktrees.map((branch) => {\n return { branch, type: 'release' as const }\n }),\n ...featureWorktrees.map((branch) => {\n return { branch, type: 'feature' as const }\n }),\n ]\n\n const worktreesInfo: WorktreeInfo[] = []\n\n for (const { branch, type } of allWorktrees) {\n try {\n const worktreePath = `${projectRoot}/${branch}`\n const isCurrent = await isCurrentWorktree(branch)\n const commit = await getWorktreeCommit(worktreePath)\n const status = await getWorktreeStatus(worktreePath)\n const lastCommitMessage = await getLastCommitMessage(worktreePath)\n const aheadBehind = await getAheadBehind(worktreePath)\n\n worktreesInfo.push({\n branch,\n path: worktreePath,\n commit: commit.substring(0, 8),\n isCurrent,\n type,\n status,\n lastCommitMessage: lastCommitMessage.substring(0, 60) + (lastCommitMessage.length > 60 ? '...' : ''),\n aheadBehind,\n })\n } catch (error) {\n logger.warn({ error, branch }, `\u26A0\uFE0F Could not process worktree ${branch}`)\n }\n }\n\n return worktreesInfo.sort((a, b) => {\n // Sort by type first (releases before features), then by branch name\n if (a.type !== b.type) {\n return a.type === 'release' ? -1 : 1\n }\n\n return a.branch.localeCompare(b.branch)\n })\n}\n\n/**\n * Check if a worktree is currently active\n */\nconst isCurrentWorktree = async (branch: string): Promise<boolean> => {\n try {\n const currentBranch = await $`git branch --show-current`\n\n return currentBranch.stdout.trim() === branch\n } catch {\n return false\n }\n}\n\n/**\n * Get the commit hash for a worktree\n */\nconst getWorktreeCommit = async (worktreePath: string): Promise<string> => {\n try {\n const result = await $`cd ${worktreePath} && git rev-parse HEAD`\n\n return result.stdout.trim()\n } catch {\n return 'unknown'\n }\n}\n\n/**\n * Get the status of a worktree\n */\nconst getWorktreeStatus = async (worktreePath: string): Promise<string> => {\n try {\n const result = await $`cd ${worktreePath} && git status --porcelain`\n const changes = result.stdout.trim().split('\\n').filter(Boolean)\n\n if (changes.length === 0) return 'clean'\n if (changes.length <= 3) return 'modified'\n\n return 'dirty'\n } catch {\n return 'unknown'\n }\n}\n\n/**\n * Get the last commit message for a worktree\n */\nconst getLastCommitMessage = async (worktreePath: string): Promise<string> => {\n try {\n const result = await $`cd ${worktreePath} && git log -1 --pretty=format:\"%s\"`\n\n return result.stdout.trim()\n } catch {\n return 'No commit message available'\n }\n}\n\n/**\n * Get ahead/behind information for a worktree\n */\nconst getAheadBehind = async (worktreePath: string): Promise<string> => {\n try {\n const result =\n await $`cd ${worktreePath} && git rev-list --count --left-right @{u}...HEAD 2>/dev/null || echo \"0 0\"`\n\n const parts = result.stdout.trim().split('\\t').map(Number)\n const behind = parts[0] || 0\n const ahead = parts[1] || 0\n\n if (ahead === 0 && behind === 0) return 'up to date'\n if (ahead > 0 && behind === 0) return `\u2191${ahead} ahead`\n if (behind > 0 && ahead === 0) return `\u2193${behind} behind`\n\n return `\u2191${ahead} \u2193${behind}`\n } catch {\n return 'unknown'\n }\n}\n\n/**\n * Log the worktrees list in a beautiful formatted way\n */\nconst logResults = (worktrees: WorktreeInfo[]): void => {\n if (worktrees.length === 0) {\n logger.info('\\n\uD83C\uDF3F Git Worktrees')\n logger.info('\u2500'.repeat(80))\n logger.info('\u2139\uFE0F No worktrees found')\n logger.info('\u2500'.repeat(80))\n\n return\n }\n\n logger.info('\\n\uD83C\uDF3F Git Worktrees')\n logger.info('\u2550'.repeat(100))\n\n // Separate releases and features\n const releases = worktrees.filter((w) => {\n return w.type === 'release'\n })\n const features = worktrees.filter((w) => {\n return w.type === 'feature'\n })\n\n // Display releases first\n displayWorktreeSection('\uD83D\uDE80 Releases', releases)\n\n // Display features second\n if (features.length > 0 && releases.length > 0) {\n logger.info('')\n }\n\n displayWorktreeSection('\u2728 Features', features)\n\n // Summary\n const current = worktrees.find((w) => {\n return w.isCurrent\n })\n\n logger.info(`\\n${'\u2550'.repeat(100)}`)\n logger.info(\n `\uD83D\uDCCA Summary: ${worktrees.length} total worktrees (${releases.length} releases, ${features.length} features)`,\n )\n\n if (current) {\n logger.info(`\uD83D\uDCCD Currently on: ${current.branch}`)\n }\n\n logger.info('')\n}\n\n/**\n * Display a section of worktrees\n */\nconst displayWorktreeSection = (sectionTitle: string, worktrees: WorktreeInfo[]): void => {\n if (worktrees.length === 0) return\n\n logger.info(`\\n${sectionTitle}`)\n logger.info('\u2500'.repeat(50))\n\n for (const [index, worktree] of worktrees.entries()) {\n displayWorktree(worktree)\n\n if (index < worktrees.length - 1) {\n logger.info('')\n }\n }\n}\n\n/**\n * Display a single worktree entry\n */\nconst displayWorktree = (worktree: WorktreeInfo): void => {\n // Worktree status indicators\n const currentIndicator = worktree.isCurrent ? '\uD83D\uDCCD' : ' '\n const statusIndicator = getStatusIndicator(worktree.status)\n\n const typeIcon = worktree.type === 'release' ? '\uD83D\uDE80' : '\u2728'\n\n // Branch name with color coding\n const branchDisplay = `${typeIcon} ${worktree.branch}`\n\n logger.info(`${currentIndicator} ${statusIndicator} ${branchDisplay}`)\n\n // Commit and sync info\n const syncInfo = worktree.aheadBehind !== 'unknown' ? ` | ${worktree.aheadBehind}` : ''\n\n logger.info(` \uD83D\uDCDD ${worktree.commit}${syncInfo}`)\n\n // Last commit message\n logger.info(` \uD83D\uDCAC ${worktree.lastCommitMessage}`)\n\n // Path (shortened for display)\n const shortPath = worktree.path.split('/').slice(-2).join('/')\n\n logger.info(` \uD83D\uDCC1 ${shortPath}`)\n}\n\n/**\n * Get status indicator based on worktree status\n */\nconst getStatusIndicator = (status: string): string => {\n switch (status) {\n case 'clean':\n return '\u2705'\n case 'modified':\n return '\u26A0\uFE0F '\n case 'dirty':\n return '\uD83D\uDD34'\n default:\n return '\u2753'\n }\n}\n\n// MCP Tool Registration\nexport const worktreesListMcpTool = {\n name: 'worktrees-list',\n description: 'List all git worktrees with detailed information',\n inputSchema: {},\n outputSchema: {\n worktrees: z\n .array(\n z.object({\n branch: z.string(),\n path: z.string(),\n commit: z.string(),\n isCurrent: z.boolean(),\n type: z.enum(['release', 'feature']),\n status: z.string(),\n lastCommitMessage: z.string(),\n aheadBehind: z.string(),\n }),\n )\n .describe('List of all worktrees with details'),\n totalCount: z.number().describe('Total number of worktrees'),\n releaseCount: z.number().describe('Number of release worktrees'),\n featureCount: z.number().describe('Number of feature worktrees'),\n },\n handler: worktreesList,\n}\n", "import checkbox from '@inquirer/checkbox'\nimport confirm from '@inquirer/confirm'\nimport process from 'node:process'\nimport { z } from 'zod'\nimport { $ } from 'zx'\n\nimport { commandEcho } from 'src/lib/command-echo'\nimport { WORKTREES_DIR_SUFFIX } from 'src/lib/constants'\nimport { getCurrentWorktrees, getProjectRoot } from 'src/lib/git-utils'\nimport { logger } from 'src/lib/logger'\nimport type { RequiredConfirmedOptionArg, ToolsExecutionResult } from 'src/types'\n\n// Constants\ninterface WorktreeManagementArgs extends RequiredConfirmedOptionArg {\n all: boolean\n}\n\n/**\n * Manage git worktrees for release branches\n * Creates worktrees for active release branches and removes unused ones\n */\nexport const worktreesRemove = async (options: WorktreeManagementArgs): Promise<ToolsExecutionResult> => {\n const { confirmedCommand, all } = options\n\n commandEcho.start('worktrees-remove')\n\n try {\n const currentWorktrees = await getCurrentWorktrees('release')\n\n if (currentWorktrees.length === 0) {\n logger.info('\u2139\uFE0F No active worktrees to remove')\n\n commandEcho.print()\n\n return {\n content: [{ type: 'text', text: JSON.stringify({ removedWorktrees: [], count: 0 }, null, 2) }],\n structuredContent: { removedWorktrees: [], count: 0 },\n }\n }\n\n const projectRoot = await getProjectRoot()\n\n const worktreeDir = `${projectRoot}${WORKTREES_DIR_SUFFIX}`\n\n let selectedReleaseBranches: string[] = []\n\n if (all) {\n selectedReleaseBranches = currentWorktrees\n } else {\n commandEcho.setInteractive()\n\n selectedReleaseBranches = await checkbox({\n required: true,\n message: '\uD83C\uDF3F Select release branches',\n choices: currentWorktrees.map((pr) => {\n return {\n name: pr.replace('release/v', ''),\n value: pr,\n }\n }),\n })\n }\n\n // Track --all flag if all branches were selected (either via flag or interactively)\n const allSelected = selectedReleaseBranches.length === currentWorktrees.length\n\n if (allSelected) {\n commandEcho.addOption('--all', true)\n } else {\n commandEcho.addOption('--branches', selectedReleaseBranches)\n }\n\n // Ask for confirmation\n const answer = confirmedCommand\n ? true\n : await confirm({\n message: 'Are you sure you want to proceed with these worktree changes?',\n })\n\n if (!confirmedCommand) {\n commandEcho.setInteractive()\n }\n\n if (!answer) {\n logger.info('Operation cancelled. Exiting...')\n process.exit(0)\n }\n\n // Track --yes flag if confirmation was interactive (user confirmed)\n if (allSelected) {\n commandEcho.addOption('--yes', true)\n }\n\n const removedWorktrees = await removeWorktrees(selectedReleaseBranches, worktreeDir)\n\n logResults(removedWorktrees)\n\n commandEcho.print()\n\n const structuredContent = {\n removedWorktrees,\n count: removedWorktrees.length,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n } catch (error) {\n logger.error({ error }, '\u274C Error managing worktrees')\n throw error\n }\n}\n\n/**\n * Remove worktrees for the specified branches\n */\nconst removeWorktrees = async (branches: string[], worktreeDir: string): Promise<string[]> => {\n const removed: string[] = []\n\n for (const branch of branches) {\n try {\n const worktreePath = `${worktreeDir}/${branch}`\n\n await $`git worktree remove ${worktreePath}`\n removed.push(branch)\n } catch (error) {\n logger.error({ error, branch }, `\u274C Failed to remove worktree for ${branch}`)\n }\n }\n\n return removed\n}\n\n/**\n * Log the results of worktree management\n */\nconst logResults = (removed: string[]): void => {\n if (removed.length > 0) {\n logger.info('\u274C Removed worktrees:')\n logger.info(removed.join('\\n'))\n logger.info('')\n } else {\n logger.info('\u2139\uFE0F No unused worktrees to remove')\n }\n}\n\n// MCP Tool Registration\nexport const worktreesRemoveMcpTool = {\n name: 'worktrees-remove',\n description: 'Remove selected worktrees',\n inputSchema: {\n all: z.boolean().describe('Remove all worktrees without prompting'),\n },\n outputSchema: {\n removedWorktrees: z.array(z.string()).describe('List of removed worktree branches'),\n count: z.number().describe('Number of worktrees removed'),\n },\n handler: worktreesRemove,\n}\n", "import confirm from '@inquirer/confirm'\nimport process from 'node:process'\nimport { z } from 'zod'\nimport { $ } from 'zx'\n\nimport { getReleasePRs } from 'src/integrations/gh'\nimport { commandEcho } from 'src/lib/command-echo'\nimport { WORKTREES_DIR_SUFFIX } from 'src/lib/constants'\nimport { getCurrentWorktrees, getProjectRoot } from 'src/lib/git-utils'\nimport { logger } from 'src/lib/logger'\nimport type { RequiredConfirmedOptionArg, ToolsExecutionResult } from 'src/types'\n\n// Constants\nconst RELEASE_BRANCH_PREFIX = 'release/v'\n\ninterface WorktreeSyncArgs extends RequiredConfirmedOptionArg {}\n\n/**\n * Manage git worktrees for release branches.\n *\n * Creates worktrees for active release branches and removes unused ones\n */\nexport const worktreesSync = async (options: WorktreeSyncArgs): Promise<ToolsExecutionResult> => {\n const { confirmedCommand } = options\n\n commandEcho.start('worktrees-sync')\n\n try {\n const currentWorktrees = await getCurrentWorktrees('release')\n const projectRoot = await getProjectRoot()\n\n const worktreeDir = `${projectRoot}${WORKTREES_DIR_SUFFIX}`\n\n const releasePRsList = await getReleasePRs()\n\n // Ask for confirmation\n const answer = confirmedCommand\n ? true\n : await confirm({\n message: 'Are you sure you want to proceed with these worktree changes?',\n })\n\n if (!confirmedCommand) {\n commandEcho.setInteractive()\n }\n\n if (!answer) {\n logger.info('Operation cancelled. Exiting...')\n process.exit(0)\n }\n\n // Track --yes flag if confirmation was interactive (user confirmed)\n if (!confirmedCommand) {\n commandEcho.addOption('--yes', true)\n }\n\n const { branchesToRemove } = categorizeWorktrees({\n releasePRsList,\n currentWorktrees,\n })\n\n const removedWorktrees = await removeWorktrees(branchesToRemove, worktreeDir)\n\n logResults(removedWorktrees)\n\n commandEcho.print()\n\n const structuredContent = {\n removedWorktrees,\n count: removedWorktrees.length,\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify(structuredContent, null, 2),\n },\n ],\n structuredContent,\n }\n } catch (error) {\n logger.error({ error }, '\u274C Error managing worktrees')\n throw error\n }\n}\n\ninterface CategorizeWorktreesArgs {\n releasePRsList: string[]\n currentWorktrees: string[]\n}\n\n/**\n * Categorize worktrees into those that need to be created or removed\n */\nconst categorizeWorktrees = (args: CategorizeWorktreesArgs): { branchesToRemove: string[] } => {\n const { releasePRsList, currentWorktrees } = args\n\n const currentBranchNames = currentWorktrees.filter((branch) => {\n return branch.startsWith(RELEASE_BRANCH_PREFIX)\n })\n\n const branchesToRemove = currentBranchNames.filter((branch) => {\n return !releasePRsList.includes(branch)\n })\n\n return { branchesToRemove }\n}\n\n/**\n * Remove worktrees for the specified branches\n */\nconst removeWorktrees = async (branches: string[], worktreeDir: string): Promise<string[]> => {\n const removed: string[] = []\n\n for (const branch of branches) {\n try {\n const worktreePath = `${worktreeDir}/${branch}`\n\n await $`git worktree remove ${worktreePath}`\n removed.push(branch)\n } catch (error) {\n logger.error({ error, branch }, `\u274C Failed to remove worktree for ${branch}`)\n }\n }\n\n return removed\n}\n\n/**\n * Log the results of worktree management\n */\nconst logResults = (removed: string[]): void => {\n if (removed.length > 0) {\n logger.info('\u274C Removed worktrees:')\n logger.info(removed.join('\\n'))\n logger.info('')\n } else {\n logger.info('\u2139\uFE0F No unused worktrees to remove')\n }\n}\n\n// MCP Tool Registration\nexport const worktreesSyncMcpTool = {\n name: 'worktrees-sync',\n description: 'Synchronize worktrees with active release branches',\n inputSchema: {},\n outputSchema: {\n removedWorktrees: z.array(z.string()).describe('List of removed worktree branches'),\n count: z.number().describe('Number of worktrees removed during sync'),\n },\n handler: worktreesSync,\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Command", "z", "$", "process", "pino", "pretty", "initLoggerCLI", "logLevel", "process", "ignoreFields", "pino", "pretty", "logger", "checkCommand", "name", "command", "successMsg", "failMsg", "$", "doctor", "checks", "logger", "check", "icon", "structuredContent", "c", "doctorMcpTool", "z", "fs", "path", "process", "z", "fs", "path", "process", "ENVs", "DOPPLER_PROJECT_MAP", "ENV_CACHE_DIR", "ENV_LOAD_FILE", "ENV_CLEAR_FILE", "INFRA_KIT_SESSION_VAR", "INFRA_KIT_ENV_CONFIG_VAR", "INFRA_KIT_ENV_PROJECT_VAR", "INFRA_KIT_ENV_LOADED_AT_VAR", "parseVarNamesFromEnvFile", "filePath", "line", "getSessionCacheDir", "session", "WORKTREES_DIR_SUFFIX", "envClear", "cacheDir", "getSessionCacheDir", "envLoadPath", "path", "ENV_LOAD_FILE", "fs", "logger", "varNames", "parseVarNamesFromEnvFile", "unsetLines", "v", "INFRA_KIT_ENV_CONFIG_VAR", "INFRA_KIT_ENV_PROJECT_VAR", "INFRA_KIT_ENV_LOADED_AT_VAR", "clearFilePath", "ENV_CLEAR_FILE", "process", "structuredContent", "envClearMcpTool", "z", "fs", "os", "path", "MARKER_COMMENT", "envInit", "zshrcPath", "path", "os", "shellBlock", "buildShellBlock", "fs", "content", "cleaned", "removeExistingBlock", "logger", "isBlockLine", "line", "markerIdx", "before", "afterLines", "i", "remaining", "runCmd", "z", "process", "$", "validateDopplerCliAndAuth", "$", "error", "logger", "process", "path", "$", "getCurrentWorktrees", "type", "worktreeLines", "worktreePredicateMap", "releaseWorktreePredicate", "featureWorktreePredicate", "branch", "line", "parts", "getProjectRoot", "getDopplerProject", "projectRoot", "getProjectRoot", "dirName", "path", "dopplerProject", "DOPPLER_PROJECT_MAP", "envList", "validateDopplerCliAndAuth", "project", "getDopplerProject", "logger", "env", "ENVs", "structuredContent", "envListMcpTool", "z", "select", "fs", "path", "process", "z", "$", "createCommandEcho", "commandName", "options", "isInteractive", "name", "flag", "value", "formattedOptions", "opt", "logger", "commandEcho", "envLoad", "args", "validateDopplerCliAndAuth", "config", "commandEcho", "selectedConfig", "select", "ENVs", "env", "process", "project", "getDopplerProject", "$", "result", "envContent", "loadedAt", "envFileLines", "INFRA_KIT_ENV_CONFIG_VAR", "INFRA_KIT_ENV_PROJECT_VAR", "INFRA_KIT_ENV_LOADED_AT_VAR", "cacheDir", "getSessionCacheDir", "envFilePath", "path", "ENV_LOAD_FILE", "fs", "structuredContent", "line", "envLoadMcpTool", "z", "path", "process", "z", "envStatus", "validateDopplerCliAndAuth", "logger", "cacheDir", "getSessionCacheDir", "sessionId", "process", "INFRA_KIT_SESSION_VAR", "envLoadPath", "path", "ENV_LOAD_FILE", "sessionLoadedCount", "sessionTotalCount", "sessionConfig", "INFRA_KIT_ENV_CONFIG_VAR", "sessionProject", "INFRA_KIT_ENV_PROJECT_VAR", "sessionLoadedAt", "INFRA_KIT_ENV_LOADED_AT_VAR", "varNames", "parseVarNamesFromEnvFile", "v", "structuredContent", "envStatusMcpTool", "z", "checkbox", "confirm", "process", "z", "$", "process", "$", "parseVersion", "versionStr", "sortVersions", "versions", "a", "b", "majA", "minA", "patchA", "majB", "minB", "patchB", "getReleasePRs", "releasePRs", "$", "releasePRsArray", "logger", "process", "headRefNames", "pr", "sortVersions", "error", "createReleaseBranch", "args", "version", "jiraVersionUrl", "branchName", "prLink", "ghMergeDev", "args", "all", "confirmedCommand", "commandEcho", "releasePRsList", "getReleasePRs", "logger", "selectedReleaseBranches", "checkbox", "pr", "allSelected", "answer", "confirm", "process", "failedBranches", "branch", "mergeDev", "structuredContent", "error", "ghMergeDevMcpTool", "z", "confirm", "select", "process", "z", "$", "process", "createJiraVersion", "params", "config", "baseUrl", "token", "email", "projectId", "requestBody", "url", "credentials", "response", "errorText", "logger", "error", "getProjectVersions", "findVersionByName", "versionName", "v", "updateJiraVersion", "deliverJiraRelease", "version", "loadJiraConfig", "process", "projectIdStr", "missingVars", "errorMessage", "loadJiraConfigOptional", "ghReleaseDeliver", "args", "version", "confirmedCommand", "commandEcho", "releasePRsList", "getReleasePRs", "selectedReleaseBranch", "select", "pr", "selectedVersion", "logger", "process", "answer", "confirm", "$", "jiraConfig", "loadJiraConfigOptional", "versionName", "deliverJiraRelease", "error", "structuredContent", "ghReleaseDeliverMcpTool", "z", "select", "process", "z", "$", "ghReleaseDeployAll", "args", "version", "env", "skipTerraform", "commandEcho", "releasePRsList", "releasePRs", "getReleasePRs", "selectedReleaseBranch", "select", "pr", "selectedVersion", "logger", "process", "selectedEnv", "ENVs", "shouldSkipTerraform", "$", "structuredContent", "error", "ghReleaseDeployAllMcpTool", "z", "checkbox", "select", "fs", "resolve", "process", "yaml", "z", "$", "ghReleaseDeploySelected", "args", "version", "env", "services", "skipTerraform", "commandEcho", "releasePRsList", "releasePRs", "getReleasePRs", "selectedReleaseBranch", "select", "pr", "selectedVersion", "logger", "process", "selectedEnv", "ENVs", "availableServices", "parseServicesFromWorkflow", "selectedServices", "checkbox", "svc", "invalidServices", "shouldSkipTerraform", "$", "serviceFlags", "structuredContent", "error", "projectRoot", "getProjectRoot", "workflowPath", "resolve", "content", "fs", "inputs", "yaml", "key", "value", "ghReleaseDeploySelectedMcpTool", "z", "select", "fs", "resolve", "process", "yaml", "z", "$", "ghReleaseDeployService", "args", "version", "env", "service", "skipTerraform", "commandEcho", "releasePRsList", "releasePRs", "getReleasePRs", "selectedReleaseBranch", "select", "pr", "selectedVersion", "logger", "process", "selectedEnv", "ENVs", "availableServices", "parseServicesFromWorkflow", "selectedService", "svc", "shouldSkipTerraform", "$", "structuredContent", "error", "projectRoot", "getProjectRoot", "workflowPath", "resolve", "content", "fs", "yaml", "ghReleaseDeployServiceMcpTool", "z", "z", "ghReleaseList", "releasePRsList", "getReleasePRs", "pr", "logger", "structuredContent", "ghReleaseListMcpTool", "z", "confirm", "process", "z", "$", "question", "$", "prepareGitForRelease", "$", "createSingleRelease", "version", "jiraConfig", "description", "versionName", "result", "createJiraVersion", "jiraVersionUrl", "releaseInfo", "createReleaseBranch", "releaseCreate", "args", "inputVersion", "inputDescription", "confirmedCommand", "inputCheckout", "commandEcho", "version", "description", "checkout", "jiraConfig", "loadJiraConfig", "question", "logger", "process", "trimmedVersion", "answer", "confirm", "prepareGitForRelease", "release", "createSingleRelease", "$", "structuredContent", "releaseCreateMcpTool", "z", "confirm", "process", "z", "question", "releaseCreateBatch", "args", "inputVersions", "description", "confirmedCommand", "commandEcho", "versionInput", "jiraConfig", "loadJiraConfig", "question", "versionsList", "version", "logger", "process", "answer", "confirm", "prepareGitForRelease", "releases", "failedReleases", "release", "createSingleRelease", "error", "errorMessage", "successCount", "failureCount", "structuredContent", "r", "releaseCreateBatchMcpTool", "z", "checkbox", "confirm", "copyFileSync", "existsSync", "process", "z", "$", "FEATURE_DIR", "RELEASE_DIR", "RELEASE_BRANCH_PREFIX", "worktreesAdd", "options", "confirmedCommand", "all", "cursor", "commandEcho", "currentWorktrees", "getCurrentWorktrees", "projectRoot", "getProjectRoot", "worktreeDir", "WORKTREES_DIR_SUFFIX", "ensureWorktreeDirectory", "releasePRsList", "getReleasePRs", "logger", "selectedReleaseBranches", "checkbox", "pr", "allSelected", "answer", "confirm", "process", "openInCursor", "branchesToCreate", "categorizeWorktrees", "createdWorktrees", "createWorktrees", "logResults", "branch", "$", "structuredContent", "error", "args", "currentBranchNames", "branches", "created", "worktreePath", "rootEnvPath", "existsSync", "copyFileSync", "worktreesAddMcpTool", "z", "z", "$", "worktreesList", "releaseWorktrees", "featureWorktrees", "getCurrentWorktrees", "projectRoot", "getProjectRoot", "worktreesInfo", "processWorktrees", "logResults", "structuredContent", "error", "logger", "allWorktrees", "branch", "type", "worktreePath", "isCurrent", "isCurrentWorktree", "commit", "getWorktreeCommit", "status", "getWorktreeStatus", "lastCommitMessage", "getLastCommitMessage", "aheadBehind", "getAheadBehind", "a", "b", "$", "changes", "parts", "behind", "ahead", "worktrees", "releases", "w", "features", "displayWorktreeSection", "current", "sectionTitle", "index", "worktree", "displayWorktree", "currentIndicator", "statusIndicator", "getStatusIndicator", "branchDisplay", "syncInfo", "shortPath", "worktreesListMcpTool", "z", "checkbox", "confirm", "process", "z", "$", "worktreesRemove", "options", "confirmedCommand", "all", "commandEcho", "currentWorktrees", "getCurrentWorktrees", "logger", "worktreeDir", "getProjectRoot", "WORKTREES_DIR_SUFFIX", "selectedReleaseBranches", "checkbox", "pr", "allSelected", "answer", "confirm", "process", "removedWorktrees", "removeWorktrees", "logResults", "structuredContent", "error", "branches", "removed", "branch", "worktreePath", "$", "worktreesRemoveMcpTool", "z", "confirm", "process", "z", "$", "RELEASE_BRANCH_PREFIX", "worktreesSync", "options", "confirmedCommand", "commandEcho", "currentWorktrees", "getCurrentWorktrees", "worktreeDir", "getProjectRoot", "WORKTREES_DIR_SUFFIX", "releasePRsList", "getReleasePRs", "answer", "confirm", "logger", "process", "branchesToRemove", "categorizeWorktrees", "removedWorktrees", "removeWorktrees", "logResults", "structuredContent", "error", "args", "branch", "branches", "removed", "worktreePath", "$", "worktreesSyncMcpTool", "z", "program", "Command", "options", "ghMergeDev", "ghReleaseList", "releaseCreate", "releaseCreateBatch", "ghReleaseDeployAll", "ghReleaseDeployService", "ghReleaseDeploySelected", "ghReleaseDeliver", "worktreesSync", "worktreesAdd", "worktreesList", "worktreesRemove", "doctor", "envStatus", "envList", "envInit", "envLoad", "envClear"]
7
7
  }