UNPKG

relaycode

Version:

A developer assistant that automates applying code changes from LLMs.

1 lines 5.28 kB
{"version":3,"sources":["../../src/utils/shell.ts"],"names":["executeShellCommand","command","cwd","normalizedCwd","path","resolve","logger","child","spawn","stdout","stderr","data","code","err","getErrorCount","linterCommand","apiErrorCount","getTypeScriptErrorCount","e","exitCode","errorMatches"],"mappings":"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","file":"shell.cjs","sourcesContent":["import { spawn } from 'child_process';\nimport path from 'path';\nimport { logger } from './logger';\nimport { getTypeScriptErrorCount } from './typescript';\n\ntype ExecutionResult = {\n exitCode: number;\n stdout: string;\n stderr: string;\n};\n\nexport const executeShellCommand = (command: string, cwd = process.cwd()): Promise<ExecutionResult> => {\n if (!command || command.trim() === '') {\n return Promise.resolve({ exitCode: 0, stdout: '', stderr: '' });\n }\n\n const normalizedCwd = path.resolve(cwd);\n\n return new Promise((resolve) => {\n logger.debug(`Executing command: ${command} in directory: ${normalizedCwd}`);\n \n const child = spawn(command, {\n cwd: normalizedCwd,\n shell: true, // Use shell to interpret the command (e.g., cmd.exe on Windows, /bin/sh on Linux)\n stdio: ['ignore', 'pipe', 'pipe'], // stdin, stdout, stderr\n });\n\n let stdout = '';\n let stderr = '';\n\n child.stdout.on('data', (data) => {\n stdout += data.toString();\n });\n\n child.stderr.on('data', (data) => {\n stderr += data.toString();\n });\n \n child.on('close', (code) => {\n resolve({\n exitCode: code ?? 1,\n stdout: stdout.trim(),\n stderr: stderr.trim(),\n });\n });\n\n child.on('error', (err) => {\n // e.g., command not found\n resolve({\n exitCode: 1,\n stdout: '',\n stderr: err.message,\n });\n });\n });\n};\n\nexport const getErrorCount = async (linterCommand: string, cwd = process.cwd()): Promise<number> => {\n if (!linterCommand || linterCommand.trim() === '') {\n return 0;\n }\n \n if (linterCommand.includes('tsc')) {\n logger.debug('Detected tsc command, attempting to use TypeScript API for error counting.');\n try {\n const apiErrorCount = getTypeScriptErrorCount(linterCommand, cwd);\n if (apiErrorCount !== -1) {\n logger.debug(`TypeScript API returned ${apiErrorCount} errors.`);\n return apiErrorCount;\n }\n } catch (e) {\n logger.debug(`TypeScript API error counting threw an exception, falling back to shell execution. Error: ${e instanceof Error ? e.message : String(e)}`);\n }\n logger.debug('TypeScript API error counting failed or was not applicable, falling back to shell execution.');\n }\n\n const { exitCode, stderr } = await executeShellCommand(linterCommand, cwd);\n if (exitCode === 0) return 0;\n\n // Try to extract a number of errors from stderr or assume 1 if non-zero exit code\n const errorMatches = stderr.match(/(\\d+) error/i);\n if (errorMatches && errorMatches[1]) {\n return parseInt(errorMatches[1], 10);\n }\n // Assume at least one error if exit code is non-zero and we can't parse stderr.\n return 1;\n};"]}