sales-frontend-gemini-cli 0.4.3 โ†’ 0.4.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/dist/common/helper.cjs +119 -3
  2. package/dist/common/helper.cjs.map +1 -1
  3. package/dist/common/helper.d.cts +30 -1
  4. package/dist/common/helper.d.ts +30 -1
  5. package/dist/common/helper.js +118 -4
  6. package/dist/common/helper.js.map +1 -1
  7. package/dist/pr-review/claude/claude-commander.cjs +10 -3
  8. package/dist/pr-review/claude/claude-commander.cjs.map +1 -1
  9. package/dist/pr-review/claude/claude-commander.js +10 -3
  10. package/dist/pr-review/claude/claude-commander.js.map +1 -1
  11. package/dist/pr-review/claude/installation-claude.cjs +1 -1
  12. package/dist/pr-review/claude/installation-claude.cjs.map +1 -1
  13. package/dist/pr-review/claude/installation-claude.js +1 -1
  14. package/dist/pr-review/claude/installation-claude.js.map +1 -1
  15. package/dist/pr-review/codex/codex-commander.cjs +14 -4
  16. package/dist/pr-review/codex/codex-commander.cjs.map +1 -1
  17. package/dist/pr-review/codex/codex-commander.d.cts +1 -1
  18. package/dist/pr-review/codex/codex-commander.d.ts +1 -1
  19. package/dist/pr-review/codex/codex-commander.js +14 -4
  20. package/dist/pr-review/codex/codex-commander.js.map +1 -1
  21. package/dist/pr-review/codex/installation-codex.cjs +1 -1
  22. package/dist/pr-review/codex/installation-codex.cjs.map +1 -1
  23. package/dist/pr-review/codex/installation-codex.js +1 -1
  24. package/dist/pr-review/codex/installation-codex.js.map +1 -1
  25. package/dist/pr-review/gemini/gemini-commander.cjs +12 -12
  26. package/dist/pr-review/gemini/gemini-commander.cjs.map +1 -1
  27. package/dist/pr-review/gemini/gemini-commander.js +12 -12
  28. package/dist/pr-review/gemini/gemini-commander.js.map +1 -1
  29. package/dist/pr-review/gemini/installation-gemini.cjs +1 -1
  30. package/dist/pr-review/gemini/installation-gemini.cjs.map +1 -1
  31. package/dist/pr-review/gemini/installation-gemini.js +1 -1
  32. package/dist/pr-review/gemini/installation-gemini.js.map +1 -1
  33. package/dist/pr-review/review-one-by-one.cjs +223 -24
  34. package/dist/pr-review/review-one-by-one.cjs.map +1 -1
  35. package/dist/pr-review/review-one-by-one.js +223 -24
  36. package/dist/pr-review/review-one-by-one.js.map +1 -1
  37. package/dist/pr-review/review.cjs +220 -26
  38. package/dist/pr-review/review.cjs.map +1 -1
  39. package/dist/pr-review/review.js +220 -26
  40. package/dist/pr-review/review.js.map +1 -1
  41. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/common/helper.ts","../../src/pr-review/claude/claude-commander.ts","../../src/pr-review/claude/installation-claude.ts","../../src/pr-review/codex/codex-commander.ts","../../src/pr-review/codex/installation-codex.ts","../../src/pr-review/gemini/gemini-commander.ts","../../src/pr-review/gemini/installation-gemini.ts","../../src/pr-review/review.ts"],"names":["__dirname","path","fileURLToPath","fs","args","execFileSync","inspect","execSync","readline","tempDiffPath","reviewFormPath","trace","ALLOWED_REASONING_EFFORTS","shellQuote","getArgValue","printNotice","resolveReasoningEffort","toUnique","resolvePrimaryAlias","getAliasFallbacks"],"mappings":"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","file":"review.cjs","sourcesContent":["import { execFileSync, execSync } from 'child_process';\nimport fs from 'fs';\nimport path from 'path';\nimport readline from 'readline';\nimport { fileURLToPath } from 'url';\nimport { inspect } from 'util';\n\nimport { AIServiceType, CommitOption, MultiSelectOption } from './types';\n\ntype ErrorReportSection = {\n heading: string;\n markdown: string;\n};\n\ntype WriteErrorReportOptions = {\n title?: string;\n scope?: string;\n args?: string[];\n traceMessages?: string[];\n extraSections?: ErrorReportSection[];\n};\n\ntype GitCommandOptions = {\n allowFailure?: boolean;\n trimOutput?: boolean;\n};\n\ntype ShellCommandProgressOptions = {\n progressIntervalMs?: number;\n progressMessage?: string;\n streamOutput?: boolean;\n};\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst traceMessages: string[] = [];\nconst GEMINI_CLI_PACKAGE_NAME = 'sales-frontend-gemini-cli';\nlet cachedPackageRootPath = '';\n\n/**\n * @description\n * ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ gemini-cli ํŒจํ‚ค์ง€ ๋ฃจํŠธ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.\n * ๋ฒˆ๋“ค ๊ฒฐ๊ณผ๋ฌผ์—์„œ helper ์ฝ”๋“œ๊ฐ€ ๊ฐ ์—”ํŠธ๋ฆฌ ํŒŒ์ผ๋กœ ์ธ๋ผ์ธ๋˜๋ฉด `__dirname` ๊ธฐ์ค€์ ์ด ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ,\n * package.json ์ด๋ฆ„์œผ๋กœ ์‹ค์ œ ํŒจํ‚ค์ง€ ๋ฃจํŠธ๋ฅผ ์‹๋ณ„ํ•ด์•ผ ๊ทœ์น™/์–‘์‹ ํŒŒ์ผ ๊ฒฝ๋กœ๊ฐ€ ๊นจ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.\n * @param directory ๊ฒ€์‚ฌํ•  ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ฒฝ๋กœ\n * @returns ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ gemini-cli ํŒจํ‚ค์ง€ ๋ฃจํŠธ์ด๋ฉด true\n */\nfunction isGeminiCliPackageRoot(directory: string) {\n const packageJsonPath = path.join(directory, 'package.json');\n\n if (!fs.existsSync(packageJsonPath)) {\n return false;\n }\n\n try {\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')) as { name?: string };\n\n return packageJson.name === GEMINI_CLI_PACKAGE_NAME;\n } catch {\n return false;\n }\n}\n\n/**\n * @description\n * ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ๋ฒˆ๋“ค ์—”ํŠธ๋ฆฌ ๊ธฐ์ค€์œผ๋กœ gemini-cli ํŒจํ‚ค์ง€ ๋ฃจํŠธ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.\n * `dist/pr-review/review.js`, `dist/pr-review/gemini/gemini-commander.js`์ฒ˜๋Ÿผ\n * ์—”ํŠธ๋ฆฌ ์œ„์น˜๊ฐ€ ๋‹ฌ๋ผ๋„ ์ƒ์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ package root๋ฅผ ์ฐพ๋„๋ก ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค.\n * @param startDirectory ํŒจํ‚ค์ง€ ๋ฃจํŠธ ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•  ๋””๋ ‰ํ„ฐ๋ฆฌ\n * @returns ๊ทœ์น™/์–‘์‹ ํŒŒ์ผ์ด ์กด์žฌํ•˜๋Š” gemini-cli ํŒจํ‚ค์ง€ ๋ฃจํŠธ ๊ฒฝ๋กœ\n */\nfunction resolveGeminiCliPackageRoot(startDirectory: string = __dirname) {\n if (cachedPackageRootPath) {\n return cachedPackageRootPath;\n }\n\n let currentDirectory = startDirectory;\n\n while (true) {\n if (isGeminiCliPackageRoot(currentDirectory)) {\n cachedPackageRootPath = currentDirectory;\n\n return cachedPackageRootPath;\n }\n\n const parentDirectory = path.dirname(currentDirectory);\n\n if (parentDirectory === currentDirectory) {\n break;\n }\n\n currentDirectory = parentDirectory;\n }\n\n /**\n * @description\n * package.json ํƒ์ƒ‰์ด ์‹คํŒจํ•ด๋„ ๊ธฐ์กด ์„ค์น˜ ๊ตฌ์กฐ(dist/common -> package root)๋ฅผ ์šฐ์„  fallback์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.\n * ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ๋„ ์ตœ๋Œ€ํ•œ ๊ธฐ์กด ๋™์ž‘์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ณด์ˆ˜์  ์•ˆ์ „์žฅ์น˜์ž…๋‹ˆ๋‹ค.\n */\n cachedPackageRootPath = path.resolve(startDirectory, '../..');\n\n return cachedPackageRootPath;\n}\n\n/**\n * @description\n * gemini-cli ํŒจํ‚ค์ง€ ๋ฃจํŠธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •์  asset ํŒŒ์ผ์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.\n * ๋ฒˆ๋“ค ๊ณผ์ •์—์„œ helper ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅธ ์—”ํŠธ๋ฆฌ์— ์ธ๋ผ์ธ๋˜์–ด๋„ ํ•ญ์ƒ ๊ฐ™์€ ์‹ค์ œ ํŒŒ์ผ์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.\n * @param relativeFilePath ํŒจํ‚ค์ง€ ๋ฃจํŠธ ๊ธฐ์ค€ ์ƒ๋Œ€ ๊ฒฝ๋กœ\n * @returns asset ํŒŒ์ผ์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ\n */\nfunction resolvePackageAssetPath(relativeFilePath: string) {\n return path.resolve(resolveGeminiCliPackageRoot(), relativeFilePath);\n}\n\nexport const rulesPath = resolvePackageAssetPath('src/common/rules/review-rules.md');\nexport const namingRulesPath = resolvePackageAssetPath('src/common/rules/naming-rule.md');\nexport const codingConventionRulesPath = resolvePackageAssetPath('src/common/rules/coding-convention.md');\nexport const reviewFormPath = resolvePackageAssetPath('src/common/form/review-form.md');\nexport const reviewFormOneByOnePath = resolvePackageAssetPath('src/common/form/review-form-one-by-one.md');\nexport const REPORT_DIR = '.review-report';\nexport const tempDiffPath = 'temp_diff.txt';\nexport const AIServices: AIServiceType[] = ['gemini', 'claude', 'codex'];\nexport const COMMIT_FETCH_LIMIT = 20;\nexport const COMMIT_SELECTION_WINDOW = 8;\nexport const ignoreList = [\n 'package.json',\n '*.yml',\n '*.md',\n '*.lock',\n 'dist/',\n 'node_modules/',\n 'assets/',\n 'public/',\n '*.json',\n '*.yaml',\n '.review-report/' // ์ƒ์„ฑ๋˜๋Š” ๋ฆฌํฌํŠธ ํด๋”๋„ ์ œ์™ธ\n];\n\nexport function isTestMode(args: string[] = process.argv.slice(2)) {\n return args.includes('--test');\n}\n\nexport function clearTraceMessages() {\n traceMessages.length = 0;\n}\n\nexport function getTraceMessages() {\n return [...traceMessages];\n}\n\n/**\n * @description\n * ํ„ฐ๋ฏธ๋„ ์„ ํƒ UI์—์„œ ๋™์ผํ•œ ์ƒ‰์ƒ ํ† ํฐ์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ANSI escape code๋ฅผ ์ƒ์ˆ˜ํ™”ํ•ฉ๋‹ˆ๋‹ค.\n * ์„œ๋น„์Šค ์„ ํƒ๊ณผ ์ปค๋ฐ‹ ์„ ํƒ์ด ๊ฐ™์€ ์‹œ๊ฐ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก helper ๋‚ด๋ถ€์—์„œ๋งŒ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.\n */\nconst ANSI = {\n bold: '\\u001b[1m',\n cyan: '\\u001b[36m',\n dim: '\\u001b[2m',\n green: '\\u001b[32m',\n reset: '\\u001b[0m',\n yellow: '\\u001b[33m'\n} as const;\nconst ANSI_PATTERN = new RegExp(`${String.fromCharCode(27)}\\\\[[0-9;]*m`, 'g');\nconst COMBINING_MARK_PATTERN = /\\p{Mark}/u;\nconst GRAPHEME_SEGMENTER =\n typeof Intl !== 'undefined' && 'Segmenter' in Intl ? new Intl.Segmenter('ko', { granularity: 'grapheme' }) : null;\n\ntype VisibleToken = {\n value: string;\n visibleWidth: number;\n};\n\n/**\n * @description\n * ๋ฆฌ๋ทฐ ๋Œ€์ƒ ํŒŒ์ผ ํ•„ํ„ฐ๋ฅผ pathspec ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.\n * ๋ฌธ์ž์—ด ์ปค๋งจ๋“œ์™€ argv ๊ธฐ๋ฐ˜ git ์‹คํ–‰์ด ๋ชจ๋‘ ๊ฐ™์€ ๊ธฐ์ค€์„ ๊ณต์œ ํ•˜๋„๋ก ์›๋ณธ ํŒจํ„ด์€ ๋ฐฐ์—ด๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.\n */\nfunction getGitDiffPathspecs() {\n return {\n excludePatterns: ignoreList.map((item) => `:(exclude)${item}`),\n includePatterns: ['*.ts', '*.tsx', '*.js', '*.jsx']\n };\n}\n\nfunction segmentGraphemes(value: string) {\n if (!GRAPHEME_SEGMENTER) {\n return [...value];\n }\n\n return [...GRAPHEME_SEGMENTER.segment(value)].map(({ segment }) => segment);\n}\n\nfunction isWideCodePoint(codePoint: number) {\n return (\n codePoint >= 0x1100 &&\n (codePoint <= 0x115f ||\n codePoint === 0x2329 ||\n codePoint === 0x232a ||\n (codePoint >= 0x2e80 && codePoint <= 0x3247 && codePoint !== 0x303f) ||\n (codePoint >= 0x3250 && codePoint <= 0x4dbf) ||\n (codePoint >= 0x4e00 && codePoint <= 0xa4c6) ||\n (codePoint >= 0xa960 && codePoint <= 0xa97c) ||\n (codePoint >= 0xac00 && codePoint <= 0xd7a3) ||\n (codePoint >= 0xf900 && codePoint <= 0xfaff) ||\n (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||\n (codePoint >= 0xfe30 && codePoint <= 0xfe6b) ||\n (codePoint >= 0xff01 && codePoint <= 0xff60) ||\n (codePoint >= 0xffe0 && codePoint <= 0xffe6) ||\n (codePoint >= 0x1f200 && codePoint <= 0x1f251) ||\n (codePoint >= 0x20000 && codePoint <= 0x3fffd))\n );\n}\n\nfunction isEmojiCodePoint(codePoint: number) {\n return (\n (codePoint >= 0x1f1e6 && codePoint <= 0x1f1ff) ||\n (codePoint >= 0x1f300 && codePoint <= 0x1faff) ||\n (codePoint >= 0x2600 && codePoint <= 0x27bf)\n );\n}\n\nfunction getGraphemeWidth(grapheme: string) {\n let width = 0;\n\n for (const character of grapheme) {\n const codePoint = character.codePointAt(0);\n\n if (!codePoint || COMBINING_MARK_PATTERN.test(character) || codePoint === 0x200d) {\n continue;\n }\n\n if ((codePoint >= 0xfe00 && codePoint <= 0xfe0f) || (codePoint >= 0xe0100 && codePoint <= 0xe01ef)) {\n continue;\n }\n\n if (isWideCodePoint(codePoint) || isEmojiCodePoint(codePoint)) {\n width = Math.max(width, 2);\n\n continue;\n }\n\n width = Math.max(width, 1);\n }\n\n return width;\n}\n\nfunction tokenizePlainText(value: string) {\n return segmentGraphemes(value).map((segment) => ({\n value: segment,\n visibleWidth: getGraphemeWidth(segment)\n }));\n}\n\nfunction tokenizeVisibleText(value: string) {\n const tokens: VisibleToken[] = [];\n let lastIndex = 0;\n\n for (const match of value.matchAll(ANSI_PATTERN)) {\n const index = match.index ?? 0;\n\n if (index > lastIndex) {\n tokens.push(...tokenizePlainText(value.slice(lastIndex, index)));\n }\n\n tokens.push({\n value: match[0],\n visibleWidth: 0\n });\n lastIndex = index + match[0].length;\n }\n\n if (lastIndex < value.length) {\n tokens.push(...tokenizePlainText(value.slice(lastIndex)));\n }\n\n return tokens;\n}\n\n/**\n * @description\n * ๋ชจ๋‹ฌ ๊ฐ ์ค„์ด ํ„ฐ๋ฏธ๋„ ์‹ค์ œ ํญ์„ ๋„˜์ง€ ์•Š๋„๋ก ANSI ์ฝ”๋“œ๋ฅผ ๋ณด์กดํ•œ ์ฑ„ ์ž˜๋ผ๋ƒ…๋‹ˆ๋‹ค.\n * ์ค„๋ฐ”๊ฟˆ์ด ๋ฐœ์ƒํ•˜๋ฉด ๋ Œ๋” ์ค„ ์ˆ˜ ๊ณ„์‚ฐ์ด ์–ด๊ธ‹๋‚˜๋ฏ€๋กœ, ๋ชจ๋“  ์„ ํƒ ์ค„์„ 1 physical line๋กœ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค.\n * @param value ๋ Œ๋”ํ•  ๋ฌธ์ž์—ด\n * @param maxWidth ํ—ˆ์šฉ ์ตœ๋Œ€ ํ‘œ์‹œ ํญ\n * @returns ํ„ฐ๋ฏธ๋„ ํญ ์•ˆ์œผ๋กœ ์ •๋ฆฌ๋œ ๋ฌธ์ž์—ด\n */\nfunction truncateLineForTerminal(value: string, maxWidth: number) {\n if (maxWidth <= 0) {\n return '';\n }\n\n const tokens = tokenizeVisibleText(value);\n const totalWidth = tokens.reduce((sum, token) => sum + token.visibleWidth, 0);\n\n if (totalWidth <= maxWidth) {\n return value;\n }\n\n const ellipsis = '...';\n const ellipsisWidth = 3;\n const targetWidth = Math.max(0, maxWidth - ellipsisWidth);\n let usedWidth = 0;\n let result = '';\n\n for (const token of tokens) {\n if (token.visibleWidth === 0) {\n result += token.value;\n\n continue;\n }\n\n if (usedWidth + token.visibleWidth > targetWidth) {\n break;\n }\n\n result += token.value;\n usedWidth += token.visibleWidth;\n }\n\n return `${result}${ellipsis}${ANSI.reset}`;\n}\n\nfunction fitLinesToTerminal(lines: string[]) {\n const maxWidth = Math.max(20, (process.stdout.columns || 120) - 1);\n\n return lines.map((line) => truncateLineForTerminal(line, maxWidth));\n}\n\n/**\n * @description\n * git ์„œ๋ธŒํ”„๋กœ์„ธ์Šค๋ฅผ argv ๋ฐฐ์—ด ๊ธฐ๋ฐ˜์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.\n * ์ปค๋ฐ‹ ํ•ด์‹œ๋‚˜ ํŒŒ์ผ ๊ฒฝ๋กœ์— ๊ณต๋ฐฑ์ด ์„ž์—ฌ๋„ shell quoting ๋ฌธ์ œ ์—†์ด ๋™์ผํ•œ ๋™์ž‘์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๊ณตํ†ต helper๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.\n * @param args git ์ธ์ž ๋ฐฐ์—ด\n * @param options ์‹คํŒจ ํ—ˆ์šฉ ์—ฌ๋ถ€์™€ ์ถœ๋ ฅ trim ์—ฌ๋ถ€\n * @returns git ํ‘œ์ค€์ถœ๋ ฅ ๋ฌธ์ž์—ด\n */\nfunction runGitCommand(args: string[], options: GitCommandOptions = {}) {\n const { allowFailure = false, trimOutput = true } = options;\n\n try {\n const output = execFileSync('git', args, {\n encoding: 'utf8',\n maxBuffer: 1024 * 1024 * 20,\n stdio: ['ignore', 'pipe', 'pipe']\n });\n\n return trimOutput ? output.trim() : output;\n } catch (error) {\n helperTrace('git-command:failed', `${args.join(' ')} | ${getErrorSummary(error)}`);\n\n if (allowFailure) {\n return '';\n }\n\n throw error;\n }\n}\n\n/**\n * @description\n * shell ๋ช…๋ น์„ ๋น„๋™๊ธฐ๋กœ ์‹คํ–‰ํ•˜๋ฉด์„œ stdout/stderr๋ฅผ ๊ทธ๋Œ€๋กœ ํ˜๋ ค๋ณด๋‚ด๊ณ , ์žฅ์‹œ๊ฐ„ ์ž‘์—…์—๋Š” ๊ฒฝ๊ณผ ์‹œ๊ฐ„์„ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.\n * review ์‹คํ–‰์ฒ˜๋Ÿผ ์‘๋‹ต ์ƒ์„ฑ๊นŒ์ง€ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” CLI๋ฅผ ๋ฒ„ํผ๋ง ์—†์ด ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ๋ฉˆ์ถค์œผ๋กœ ์˜คํ•ดํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.\n * @param command ์‹คํ–‰ํ•  shell command ๋ฌธ์ž์—ด\n * @param options ์ง„ํ–‰ ๋ฉ”์‹œ์ง€์™€ ์ถœ๋ ฅ ์ฃผ๊ธฐ ์˜ต์…˜\n * @returns ์ตœ์ข… stdout/stderr ์บก์ฒ˜ ๊ฒฐ๊ณผ\n */\nexport async function executeShellCommandWithProgress(command: string, options: ShellCommandProgressOptions = {}) {\n const { progressIntervalMs = 10000, progressMessage = 'โณ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค...', streamOutput = false } = options;\n const { spawn } = await import('child_process');\n\n return new Promise<{ stderr: string; stdout: string }>((resolve, reject) => {\n let stdout = '';\n let stderr = '';\n const startedAt = Date.now();\n console.log(progressMessage);\n\n const child = spawn('/bin/zsh', ['-lc', command], {\n stdio: ['ignore', 'pipe', 'pipe']\n });\n\n const progressTimer = setInterval(() => {\n const elapsedSeconds = Math.max(1, Math.floor((Date.now() - startedAt) / 1000));\n console.log(`${progressMessage} (${elapsedSeconds}s ๊ฒฝ๊ณผ)`);\n }, progressIntervalMs);\n\n child.stdout.on('data', (chunk: Buffer | string) => {\n const text = chunk.toString();\n stdout += text;\n\n if (streamOutput) {\n process.stdout.write(text);\n }\n });\n\n child.stderr.on('data', (chunk: Buffer | string) => {\n const text = chunk.toString();\n stderr += text;\n\n if (streamOutput) {\n process.stderr.write(text);\n }\n });\n\n child.on('error', (error) => {\n clearInterval(progressTimer);\n reject(error);\n });\n\n child.on('close', (code, signal) => {\n clearInterval(progressTimer);\n\n if (code === 0) {\n resolve({\n stderr,\n stdout\n });\n\n return;\n }\n\n const exitSummary = signal ? `signal=${signal}` : `code=${String(code ?? 'unknown')}`;\n reject(new Error(`์‰˜ ๋ช…๋ น ์‹คํ–‰ ์‹คํŒจ (${exitSummary})${stderr.trim() ? `\\n${stderr.trim()}` : ''}`));\n });\n });\n}\n\n/**\n * @description\n * ๋ฆฌ๋ทฐ ๋Œ€์ƒ ํŒŒ์ผ ๋ชฉ๋ก์„ ํ•œ ์ค„ ์š”์•ฝ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.\n * ํŒŒ์ผ์ด ๋งŽ์„ ๋•Œ๋Š” ์ผ๋ถ€๋งŒ ๋…ธ์ถœํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๊ฐœ์ˆ˜๋กœ ์ถ•์•ฝํ•ด ํ„ฐ๋ฏธ๋„ ์ถœ๋ ฅ์ด ๊ณผ๋„ํ•˜๊ฒŒ ๊ธธ์–ด์ง€์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.\n * @param files ๋ฆฌ๋ทฐ ๋Œ€์ƒ ํŒŒ์ผ ๋ชฉ๋ก\n * @param visibleCount ํ„ฐ๋ฏธ๋„์— ์ง์ ‘ ๋ณด์—ฌ์ค„ ์ตœ๋Œ€ ํŒŒ์ผ ์ˆ˜\n * @returns ํ™”๋ฉด ํ‘œ์‹œ์šฉ ์š”์•ฝ ๋ฌธ์ž์—ด\n */\nexport function formatReviewTargetFiles(files: string[], visibleCount = 5) {\n if (files.length === 0) {\n return '(์—†์Œ)';\n }\n\n const visibleFiles = files.slice(0, visibleCount);\n const hiddenCount = Math.max(0, files.length - visibleFiles.length);\n\n if (hiddenCount === 0) {\n return visibleFiles.join(', ');\n }\n\n return `${visibleFiles.join(', ')} ์™ธ ${hiddenCount}๊ฐœ`;\n}\n\nexport function createTraceLogger(scope: string, args: string[] = process.argv.slice(2)) {\n const enabled = isTestMode(args);\n\n return (step: string, detail?: string) => {\n const timestamp = new Date().toISOString();\n const message = `[${timestamp}][TRACE][${scope}] ${step}${detail ? ` | ${detail}` : ''}`;\n traceMessages.push(message);\n\n if (!enabled) {\n return;\n }\n\n console.log(message);\n };\n}\n\nconst helperTrace = createTraceLogger('helper');\n\nfunction getTimestampParts(now = new Date()) {\n return {\n YYYY: now.getFullYear(),\n MM: String(now.getMonth() + 1).padStart(2, '0'),\n DD: String(now.getDate()).padStart(2, '0'),\n HH: String(now.getHours()).padStart(2, '0'),\n mm: String(now.getMinutes()).padStart(2, '0'),\n ss: String(now.getSeconds()).padStart(2, '0')\n };\n}\n\nfunction getHumanReadableNowString(now = new Date()) {\n const { YYYY, MM, DD, HH, mm, ss } = getTimestampParts(now);\n\n return `${YYYY}-${MM}-${DD} ${HH}:${mm}:${ss}`;\n}\n\nfunction stringifyUnknown(value: unknown) {\n if (value === undefined || value === null) {\n return '';\n }\n\n if (typeof value === 'string') {\n return value;\n }\n\n if (Buffer.isBuffer(value)) {\n return value.toString();\n }\n\n if (value instanceof Error) {\n return value.stack || value.message;\n }\n\n return inspect(value, { depth: 5, breakLength: 120 });\n}\n\nexport function getErrorSummary(error: unknown) {\n if (error instanceof Error) {\n return `${error.name}: ${error.message}`;\n }\n\n return stringifyUnknown(error) || 'Unknown error';\n}\n\nfunction serializeError(error: unknown) {\n const serialized: Record<string, unknown> = {\n summary: getErrorSummary(error)\n };\n\n if (error instanceof Error) {\n serialized.name = error.name;\n serialized.message = error.message;\n serialized.stack = error.stack;\n } else {\n serialized.value = stringifyUnknown(error);\n }\n\n if (error && typeof error === 'object') {\n const errorLike = error as Record<string, unknown>;\n const extraKeys = ['code', 'errno', 'syscall', 'path', 'cmd', 'status', 'signal', 'spawnargs'];\n\n extraKeys.forEach((key) => {\n if (errorLike[key] !== undefined) {\n serialized[key] = errorLike[key];\n }\n });\n\n const stdout = stringifyUnknown(errorLike.stdout);\n if (stdout) {\n serialized.stdout = stdout;\n }\n\n const stderr = stringifyUnknown(errorLike.stderr);\n if (stderr) {\n serialized.stderr = stderr;\n }\n\n const cause = stringifyUnknown(errorLike.cause);\n if (cause) {\n serialized.cause = cause;\n }\n }\n\n return serialized;\n}\n\nexport function getNextFilePath(dir: string, baseName: string, extension: string) {\n let counter = 1;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const filePath = path.join(dir, `${baseName}-${counter}${extension}`);\n if (!fs.existsSync(filePath)) {\n return filePath;\n }\n counter++;\n }\n}\n\nexport function getAvailableFilePath(dir: string, baseName: string, extension: string) {\n const firstFilePath = path.join(dir, `${baseName}${extension}`);\n if (!fs.existsSync(firstFilePath)) {\n return firstFilePath;\n }\n\n return getNextFilePath(dir, baseName, extension);\n}\n\nexport function deleteFile(filePath: string) {\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n }\n}\n\n/**\n * ์ž„์‹œํŒŒ์ผ ์‚ญ์ œ\n */\nexport function deleteTempDiff() {\n deleteFile(tempDiffPath);\n}\n\n/**\n * ๋ฆฌ๋ทฐ ๊ฒฐ๊ณผ ํด๋” ์ƒ์„ฑ\n */\nexport function createReportDirectory() {\n if (!fs.existsSync(REPORT_DIR)) {\n fs.mkdirSync(REPORT_DIR, { recursive: true });\n }\n}\n\n/**\n * ํ˜„์žฌ ์‹œ๊ฐ„ ๋ฌธ์ž์—ด ์ƒ์„ฑ\n */\nexport function getNowString(now = new Date()) {\n const { YYYY, MM, DD, HH, mm, ss } = getTimestampParts(now);\n\n return `${YYYY}-${MM}-${DD}_${HH}-${mm}-${ss}`;\n}\n\nexport function getErrorLogTimestamp(now = new Date()) {\n const { YYYY, MM, DD, HH, mm, ss } = getTimestampParts(now);\n\n return `${YYYY}-${MM}-${DD}-${HH}์‹œ-${mm}๋ถ„-${ss}์ดˆ`;\n}\n\nexport function writeErrorReport(error: unknown, options: WriteErrorReportOptions = {}) {\n try {\n const now = new Date();\n helperTrace('error-report:write:start', options.scope || 'unknown');\n createReportDirectory();\n\n const reportPath = getAvailableFilePath(REPORT_DIR, `error-log-${getErrorLogTimestamp(now)}`, '.md');\n const serializedError = serializeError(error);\n const traceSnapshot = options.traceMessages ?? getTraceMessages();\n const extraSections = options.extraSections || [];\n\n const report = `# Error Log\n\n- ๋ฐœ์ƒ ์‹œ๊ฐ: ${getHumanReadableNowString(now)}\n- Scope: \\`${options.scope || 'unknown'}\\`\n- ์ž‘์—… ๊ฒฝ๋กœ: \\`${process.cwd()}\\`\n- ์‹คํ–‰ ์ธ์ž: \\`${JSON.stringify(options.args ?? process.argv.slice(2))}\\`\n- ์‹คํ–‰ ํ™˜๊ฒฝ: \\`${process.platform} ${process.arch} / Node ${process.version}\\`\n\n## Summary\n\n${options.title || serializedError.summary || 'Unknown error'}\n\n## Error\n\n\\`\\`\\`json\n${JSON.stringify(serializedError, null, 2)}\n\\`\\`\\`\n\n## Trace\n\n\\`\\`\\`json\n${JSON.stringify(traceSnapshot, null, 2)}\n\\`\\`\\`${extraSections.length ? `\\n${extraSections.map((section) => `\\n## ${section.heading}\\n\\n${section.markdown}`).join('\\n')}\\n` : '\\n'}\n`;\n\n fs.writeFileSync(reportPath, report);\n helperTrace('error-report:write:done', reportPath);\n\n return reportPath;\n } catch (writeError) {\n console.error('โš ๏ธ ์—๋Ÿฌ ๋กœ๊ทธ ํŒŒ์ผ ์ƒ์„ฑ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.');\n console.error(writeError);\n\n return '';\n }\n}\n\nexport function exitWithError(\n message: string,\n options: Omit<WriteErrorReportOptions, 'title'> & { error?: unknown } = {}\n): never {\n const reportPath = writeErrorReport(options.error || new Error(message), {\n ...options,\n title: message\n });\n\n console.error(message);\n\n if (options.error) {\n console.error(options.error);\n }\n\n if (reportPath) {\n console.error(`๐Ÿ“„ ์—๋Ÿฌ ๋กœ๊ทธ ์ €์žฅ ์œ„์น˜: ${reportPath}`);\n }\n\n process.exit(1);\n}\n\nfunction parseServiceFromArgs(args: string[] = process.argv.slice(2)): AIServiceType | '' {\n helperTrace('parse-service:start', `args=${JSON.stringify(args)}`);\n const serviceIndex = args.indexOf('--service');\n const rawService = serviceIndex !== -1 ? args[serviceIndex + 1] : '';\n\n if (!rawService) {\n helperTrace('parse-service:empty');\n\n return '';\n }\n\n const normalizedService = rawService.toLowerCase();\n\n if (AIServices.includes(normalizedService as AIServiceType)) {\n helperTrace('parse-service:resolved', normalizedService);\n\n return normalizedService as AIServiceType;\n }\n\n helperTrace('parse-service:invalid', rawService);\n exitWithError(\n `โŒ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค: ${rawService}. ์‚ฌ์šฉ ๊ฐ€๋Šฅ ๊ฐ’: ${AIServices.join(', ')} (์˜ˆ: --service codex)`,\n {\n scope: 'helper:parseServiceFromArgs',\n args,\n extraSections: [\n {\n heading: 'Allowed Services',\n markdown: `\\`\\`\\`json\\n${JSON.stringify(AIServices, null, 2)}\\n\\`\\`\\``\n }\n ]\n }\n );\n}\n\nexport function getGitDiffFilter() {\n const { includePatterns, excludePatterns } = getGitDiffPathspecs();\n const quote = (pattern: string) => `\"${pattern}\"`;\n const includeParams = includePatterns.map(quote).join(' ');\n const excludeParams = excludePatterns.map(quote).join(' ');\n\n return { includeParams, excludeParams };\n}\n\n/**\n * @description\n * ์ปค๋ฐ‹ ์„ ํƒ ๋ชฉ๋ก์—์„œ subject๊ฐ€ ๊ณผํ•˜๊ฒŒ ๊ธธ์–ด์ง€๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ํ‘œ์‹œ ๊ธธ์ด๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.\n * commit hash์™€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ๋ณ„๋„ ํ•„๋“œ๋กœ ์œ ์ง€ํ•˜๋ฏ€๋กœ UI ๊ฐ€๋…์„ฑ์— ํ•„์š”ํ•œ subject๋งŒ ์ž๋ฆ…๋‹ˆ๋‹ค.\n * @param subject ์›๋ณธ ์ปค๋ฐ‹ ์ œ๋ชฉ\n * @returns ํ™”๋ฉด ํ‘œ์‹œ์šฉ ์ œ๋ชฉ\n */\nfunction truncateCommitSubject(subject: string) {\n if (subject.length <= 72) {\n return subject;\n }\n\n return `${subject.slice(0, 69)}...`;\n}\n\n/**\n * @description\n * ์ตœ๊ทผ ์ปค๋ฐ‹ ๋ชฉ๋ก์„ ๋ฆฌ๋ทฐ ์„ ํƒ UI์—์„œ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.\n * git log ํฌ๋งท์„ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•ด main review์™€ one-by-one review๊ฐ€ ๊ฐ™์€ ์ปค๋ฐ‹ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.\n * @returns ์ตœ๊ทผ ์ปค๋ฐ‹ ์˜ต์…˜ ๋ชฉ๋ก\n */\nexport function getRecentCommitOptions(): CommitOption[] {\n const output = runGitCommand(\n ['log', `-${COMMIT_FETCH_LIMIT}`, '--date=relative', '--pretty=format:%h%x09%an%x09%ar%x09%s'],\n { allowFailure: true }\n );\n\n if (!output) {\n return [];\n }\n\n return output.split('\\n').map((line) => {\n const [hash = '', author = '', relativeDate = '', ...subjectParts] = line.split('\\t');\n const subject = subjectParts.join('\\t').trim();\n\n return {\n author,\n description: `${author} | ${relativeDate}`,\n hash,\n label: `${hash} | ${truncateCommitSubject(subject)}`,\n relativeDate,\n subject\n };\n });\n}\n\n/**\n * @description\n * ์„ ํƒ๋œ ์ปค๋ฐ‹ ๋ชฉ๋ก์„ ๋ฆฌํฌํŠธ ๋ฐ diff ํ—ค๋”์— ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” markdown bullet ๋ฌธ์ž์—ด๋กœ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.\n * @param commits ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ ๋ฅธ ์ปค๋ฐ‹ ๋ชฉ๋ก\n * @returns ์ปค๋ฐ‹ ์š”์•ฝ markdown\n */\nexport function buildSelectedCommitSummary(commits: CommitOption[]) {\n return commits.map((commit) => `- ${commit.hash} | ${commit.subject} | ${commit.author} | ${commit.relativeDate}`).join('\\n');\n}\n\n/**\n * @description\n * ๋ฆฌ๋ทฐ ๋Œ€์ƒ pathspec ๋ฐฐ์—ด์„ git argv์— ๋ฐ”๋กœ ๋ถ™์ผ ์ˆ˜ ์žˆ๊ฒŒ ํ‰ํƒ„ํ™”ํ•ฉ๋‹ˆ๋‹ค.\n * ๋ฌธ์ž์—ด ์ปค๋งจ๋“œ์™€ ๋‹ค๋ฅธ ๊ฒฝ๋กœ ๊ธฐ๋ฐ˜ helper๋„ ๊ฐ™์€ ํ•„ํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๋„๋ก helper ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.\n * @returns include/exclude pathspec ๋ฐฐ์—ด\n */\nfunction getReviewPathspecArgs() {\n const { includePatterns, excludePatterns } = getGitDiffPathspecs();\n\n return [...includePatterns, ...excludePatterns];\n}\n\n/**\n * @description\n * ์„ ํƒ๋œ ์—ฌ๋Ÿฌ ์ปค๋ฐ‹์˜ ์ „์ฒด diff๋ฅผ ํ•œ ํŒŒ์ผ์— ํ•ฉ์นฉ๋‹ˆ๋‹ค.\n * ๊ฐ ์ปค๋ฐ‹์„ ๋ณ„๋„ ์„น์…˜์œผ๋กœ ๊ฐ์‹ธ AI๊ฐ€ ์ปค๋ฐ‹ ๊ฒฝ๊ณ„๋ฅผ ์žƒ์ง€ ์•Š๋„๋ก ํ•˜๋ฉฐ, ๊ธฐ์กด ๋ฆฌ๋ทฐ ๋Œ€์ƒ ํ™•์žฅ์ž ํ•„ํ„ฐ๋„ ๊ทธ๋Œ€๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.\n * @param commits ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ ๋ฅธ ์ปค๋ฐ‹ ๋ชฉ๋ก\n * @returns ๋ฆฌ๋ทฐ์šฉ ํ†ตํ•ฉ diff ํ…์ŠคํŠธ\n */\nexport function buildSelectedCommitDiff(commits: CommitOption[]) {\n const reviewPathspecArgs = getReviewPathspecArgs();\n const sections = commits\n .map((commit) => {\n const diff = runGitCommand(['show', '--stat', '--patch', '--format=', commit.hash, '--', ...reviewPathspecArgs], {\n allowFailure: true,\n trimOutput: false\n }).trim();\n\n if (!diff) {\n return '';\n }\n\n return [`## ${commit.hash} ${commit.subject}`, diff].join('\\n\\n');\n })\n .filter(Boolean)\n .join('\\n\\n');\n\n if (!sections) {\n return '';\n }\n\n return ['# ์„ ํƒํ•œ ์ปค๋ฐ‹', buildSelectedCommitSummary(commits), '', '# ๋ฆฌ๋ทฐ ๋Œ€์ƒ diff', sections].join('\\n');\n}\n\n/**\n * @description\n * ์„ ํƒ๋œ ์ปค๋ฐ‹์—์„œ ์‹ค์ œ ๋ฆฌ๋ทฐ ๋Œ€์ƒ ํŒŒ์ผ ๋ชฉ๋ก๋งŒ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.\n * one-by-one ๋ฆฌ๋ทฐ๊ฐ€ ํ˜„์žฌ ์„ ํƒ๋œ ์ปค๋ฐ‹ ์ง‘ํ•ฉ์—๋งŒ ๋ฐ˜์‘ํ•˜๋„๋ก commit๋ณ„ name-only ๊ฒฐ๊ณผ๋ฅผ ํ•ฉ์ง‘ํ•ฉ์œผ๋กœ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.\n * @param commits ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ ๋ฅธ ์ปค๋ฐ‹ ๋ชฉ๋ก\n * @returns ์ค‘๋ณต ์ œ๊ฑฐ๋œ ํŒŒ์ผ ๋ชฉ๋ก\n */\nexport function getSelectedCommitFiles(commits: CommitOption[]) {\n const reviewPathspecArgs = getReviewPathspecArgs();\n const files = new Set<string>();\n\n commits.forEach((commit) => {\n const output = runGitCommand(['show', '--pretty=format:', '--name-only', commit.hash, '--', ...reviewPathspecArgs], {\n allowFailure: true\n });\n\n output\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean)\n .forEach((filePath) => files.add(filePath));\n });\n\n return [...files];\n}\n\n/**\n * @description\n * ํŠน์ • ํŒŒ์ผ์— ๋Œ€ํ•œ ์„ ํƒ ์ปค๋ฐ‹๋“ค์˜ diff๋งŒ ๋ชจ์•„์„œ one-by-one ๋ฆฌ๋ทฐ ์ž…๋ ฅ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.\n * ๋™์ผ ํŒŒ์ผ์ด ์—ฌ๋Ÿฌ ์ปค๋ฐ‹์—์„œ ๋ฐ”๋€ ๊ฒฝ์šฐ commit section์„ ๋‚˜๋ˆ  ๋ณด์—ฌ์ค˜ ํŒŒ์ผ ๋ฆฌ๋ทฐ ์‘๋‹ต์ด ์–ด๋А ๋ณ€๊ฒฝ์„ ๋‹ค๋ฃจ๋Š”์ง€ ์ถ”์  ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.\n * @param commits ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ ๋ฅธ ์ปค๋ฐ‹ ๋ชฉ๋ก\n * @param filePath ๋ฆฌ๋ทฐํ•  ํŒŒ์ผ ๊ฒฝ๋กœ\n * @returns ๋‹จ์ผ ํŒŒ์ผ ๋ฆฌ๋ทฐ์šฉ diff ํ…์ŠคํŠธ\n */\nexport function buildSelectedFileDiff(commits: CommitOption[], filePath: string) {\n const sections = commits\n .map((commit) => {\n const diff = runGitCommand(['show', '--stat', '--patch', '--format=', commit.hash, '--', filePath], {\n allowFailure: true,\n trimOutput: false\n }).trim();\n\n if (!diff) {\n return '';\n }\n\n return [`## ${commit.hash} ${commit.subject}`, diff].join('\\n\\n');\n })\n .filter(Boolean)\n .join('\\n\\n');\n\n if (!sections) {\n return '';\n }\n\n return ['# ์„ ํƒํ•œ ์ปค๋ฐ‹', buildSelectedCommitSummary(commits), '', `# ํŒŒ์ผ: ${filePath}`, sections].join('\\n\\n');\n}\n\n/**\n * openReport๋ฅผ OS๋ณ„๋กœ ๋™์ž‘ํ•˜๋„๋ก ๋ณ€๊ฒฝ\n * ์šฐ์„ ์ˆœ์œ„:\n * 1. Chrome ์‹œ๋„\n * - macOS: open -a \"Google Chrome\" \"<path>\"\n * - Ubuntu/Linux: google-chrome \"<path>\"\n * 2. ์‹คํŒจ ์‹œ ๊ธฐ๋ณธ ๋ธŒ๋ผ์šฐ์ €๋กœ ํด๋ฐฑ\n * - macOS: open \"<path>\"\n * - Ubuntu/Linux: xdg-open \"<path>\"\n * 3. ๋‘˜ ๋‹ค ์‹คํŒจํ•˜๋ฉด ์—๋Ÿฌ ์ถœ๋ ฅ\n * 4. ๋ฏธ์ง€์› ํ”Œ๋žซํผ์ด๋ฉด ํ”Œ๋žซํผ ๊ฒฝ๊ณ  ์ถœ๋ ฅ\n */\nexport function openReport(reportPath: string) {\n const resolvedPath = path.resolve(reportPath);\n const { platform } = process;\n helperTrace('open-report:start', resolvedPath);\n\n const openWithChrome = () => {\n if (platform === 'darwin') {\n execSync(`open -a \"Google Chrome\" \"${resolvedPath}\"`, { stdio: 'ignore' });\n\n return true;\n }\n\n if (platform === 'linux') {\n execSync(`google-chrome \"${resolvedPath}\"`, { stdio: 'ignore' });\n\n return true;\n }\n\n return false;\n };\n\n const openWithDefaultBrowser = () => {\n if (platform === 'darwin') {\n execSync(`open \"${resolvedPath}\"`, { stdio: 'ignore' });\n\n return true;\n }\n\n if (platform === 'linux') {\n execSync(`xdg-open \"${resolvedPath}\"`, { stdio: 'ignore' });\n\n return true;\n }\n\n return false;\n };\n\n try {\n if (openWithChrome()) {\n helperTrace('open-report:chrome:success', platform);\n console.log('๐Ÿš€ Google Chrome์—์„œ ๋ฆฌํฌํŠธ๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.');\n\n return;\n }\n } catch (error) {\n helperTrace('open-report:chrome:failed', getErrorSummary(error));\n // Chrome ์‹คํ–‰ ์‹คํŒจ ์‹œ ๊ธฐ๋ณธ ๋ธŒ๋ผ์šฐ์ €๋กœ ํด๋ฐฑ\n }\n\n try {\n if (openWithDefaultBrowser()) {\n helperTrace('open-report:default-browser:success', platform);\n console.log('๐Ÿš€ ๊ธฐ๋ณธ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฆฌํฌํŠธ๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.');\n\n return;\n }\n } catch (error) {\n helperTrace('open-report:default-browser:failed', getErrorSummary(error));\n console.error('โš ๏ธ ๋ธŒ๋ผ์šฐ์ € ์—ด๊ธฐ ์‹คํŒจ:', error);\n\n return;\n }\n\n helperTrace('open-report:unsupported-platform', platform);\n console.error(`โš ๏ธ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค: ${platform}`);\n}\n\n/**\n * @description\n * raw mode ๊ธฐ๋ฐ˜ ์„ ํƒ UI๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์—ด ์ˆ˜ ์žˆ๋Š” TTY ํ™˜๊ฒฝ์ธ์ง€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.\n * CI๋‚˜ pipe ํ™˜๊ฒฝ์—์„œ๋Š” ์ปค์„œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ฆ‰์‹œ ์—๋Ÿฌ ๋ฆฌํฌํŠธ๋ฅผ ๋‚จ๊ธฐ๊ณ  ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.\n * @param scope ์—๋Ÿฌ ๋ฆฌํฌํŠธ ๊ตฌ๋ถ„์šฉ scope\n * @param message ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค„ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€\n */\nfunction ensureInteractiveSelectionAvailable(scope: string, message: string) {\n if (process.stdin.isTTY && process.stdout.isTTY && typeof process.stdin.setRawMode === 'function') {\n return;\n }\n\n helperTrace(`${scope}:tty-missing`);\n exitWithError(message, {\n scope: `helper:${scope}`\n });\n}\n\n/**\n * @description\n * ์„ ํƒ ๋ชจ๋‹ฌ์„ ํ˜„์žฌ ์œ„์น˜์—์„œ ๋‹ค์‹œ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.\n * ๊ฐ ์ค„์€ ๋ฏธ๋ฆฌ ํ„ฐ๋ฏธ๋„ ํญ ์•ˆ์œผ๋กœ ์ž˜๋ผ physical line์ด 1์ค„๋กœ ์œ ์ง€๋˜๋ฏ€๋กœ,\n * ์ง์ „ ๋ Œ๋” ์ค„ ์ˆ˜๋งŒํผ ์œ„๋กœ ์ด๋™ํ•œ ๋’ค clearScreenDown ํ•ด๋„ ์ค‘๋ณต ์—†์ด ์•ˆ์ •์ ์œผ๋กœ ๊ฐฑ์‹ ๋ฉ๋‹ˆ๋‹ค.\n * @param lines ์ƒˆ๋กœ ๋ Œ๋”ํ•  ๋ฌธ์ž์—ด ์ค„ ๋ชฉ๋ก\n * @param previousLineCount ์ง์ „ ๋ Œ๋” ์ค„ ์ˆ˜\n * @returns ํ˜„์žฌ ๋ Œ๋” ์ค„ ์ˆ˜\n */\nfunction renderSelectionBlock(lines: string[], previousLineCount: number) {\n if (previousLineCount > 0) {\n readline.moveCursor(process.stdout, 0, -previousLineCount);\n readline.clearScreenDown(process.stdout);\n }\n\n const fittedLines = fitLinesToTerminal(lines);\n process.stdout.write(`${fittedLines.join('\\n')}\\n`);\n\n return fittedLines.length;\n}\n\n/**\n * @description\n * ํ˜„์žฌ ์ปค์„œ ๊ธฐ์ค€ visible window๋ฅผ ๊ณ„์‚ฐํ•ด ๊ธด ์ปค๋ฐ‹ ๋ชฉ๋ก๋„ ๊ณ ์ • ๋†’์ด๋กœ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.\n * @param optionCount ์ „์ฒด ์˜ต์…˜ ๊ฐœ์ˆ˜\n * @param selectedIndex ํ˜„์žฌ ํฌ์ปค์Šค ์ธ๋ฑ์Šค\n * @param windowSize ๋™์‹œ์— ๋ณด์—ฌ์ค„ ์ตœ๋Œ€ ์˜ต์…˜ ๊ฐœ์ˆ˜\n * @returns ์‹œ์ž‘/๋ ์ธ๋ฑ์Šค\n */\nfunction getSelectionWindowRange(optionCount: number, selectedIndex: number, windowSize: number) {\n if (optionCount <= windowSize) {\n return {\n end: optionCount,\n start: 0\n };\n }\n\n const halfWindow = Math.floor(windowSize / 2);\n const maxStart = optionCount - windowSize;\n const start = Math.max(0, Math.min(selectedIndex - halfWindow, maxStart));\n\n return {\n end: Math.min(optionCount, start + windowSize),\n start\n };\n}\n\n/**\n * @description\n * ๊ณตํ†ต multi-select UI ๋ Œ๋”๋ง์— ํ•„์š”ํ•œ ๋ฌธ์ž์—ด ๋ชฉ๋ก์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.\n * ์„ค๋ช… ํ…์ŠคํŠธ๋Š” dim ์ฒ˜๋ฆฌํ•ด subject์™€ author/date๊ฐ€ ํ•œ ์ค„์—์„œ ๊ตฌ๋ถ„๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.\n * @param question ์งˆ๋ฌธ ํ—ค๋”\n * @param options ํ‘œ์‹œํ•  ์˜ต์…˜ ๋ชฉ๋ก\n * @param selectedIndex ํ˜„์žฌ ํฌ์ปค์Šค ์ธ๋ฑ์Šค\n * @param toggled ์„ ํƒ๋œ ์ธ๋ฑ์Šค Set\n * @param windowSize ๋™์‹œ์— ๋ณด์—ฌ์ค„ ์ตœ๋Œ€ ์˜ต์…˜ ๊ฐœ์ˆ˜\n * @returns ์ถœ๋ ฅ ์ค„ ๋ชฉ๋ก\n */\nfunction buildMultiSelectLines<T>(\n question: string,\n options: MultiSelectOption<T>[],\n selectedIndex: number,\n toggled: Set<number>,\n windowSize: number\n) {\n const { start, end } = getSelectionWindowRange(options.length, selectedIndex, windowSize);\n const lines = [\n `${ANSI.bold}${question}${ANSI.reset}`,\n `${ANSI.dim}โ†‘โ†“ ์ด๋™ | Space ์„ ํƒ/ํ•ด์ œ | Enter ์™„๋ฃŒ | Esc ์ทจ์†Œ${ANSI.reset}`,\n `${ANSI.dim}์„ ํƒ๋จ: ${toggled.size}๊ฐœ / ์ „์ฒด: ${options.length}๊ฐœ${ANSI.reset}`\n ];\n\n for (let index = start; index < end; index += 1) {\n const option = options[index];\n\n if (!option) {\n continue;\n }\n\n const cursor = index === selectedIndex ? `${ANSI.cyan}>${ANSI.reset}` : ' ';\n const checked = toggled.has(index) ? `${ANSI.green}โ˜‘${ANSI.reset}` : 'โ˜';\n const description = option.description ? ` ${ANSI.dim}${option.description}${ANSI.reset}` : '';\n lines.push(`${cursor} ${checked} ${option.label}${description}`);\n }\n\n if (options.length > windowSize) {\n lines.push(`${ANSI.dim}ํ‘œ์‹œ ๋ฒ”์œ„: ${start + 1}-${end} / ${options.length}${ANSI.reset}`);\n }\n\n return lines;\n}\n\n/**\n * @description\n * ์ปค๋ฐ‹ ์„ ํƒ์ฒ˜๋Ÿผ ๋ณต์ˆ˜ ์„ ํƒ์ด ํ•„์š”ํ•œ ํ„ฐ๋ฏธ๋„ ๋ชจ๋‹ฌ์„ ๊ณตํ†ต์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.\n * raw mode๋ฅผ ์ง์ ‘ ์ œ์–ดํ•ด ๋ฐฉํ–ฅํ‚ค, Space, Enter, Esc๋ฅผ ์ฝ๊ณ  ์„ ํƒ๋œ value ๋ชฉ๋ก๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.\n * @param question ์‚ฌ์šฉ์ž ์•ˆ๋‚ด ๋ฌธ๊ตฌ\n * @param options ์„ ํƒ ์˜ต์…˜ ๋ชฉ๋ก\n * @param windowSize ๋™์‹œ์— ๋ณด์—ฌ์ค„ ์ตœ๋Œ€ ์˜ต์…˜ ๊ฐœ์ˆ˜\n * @returns ์‚ฌ์šฉ์ž๊ฐ€ ํ™•์ •ํ•œ ์„ ํƒ ๊ฐ’ ๋ฐฐ์—ด\n */\nexport async function showMultiSelect<T>(question: string, options: MultiSelectOption<T>[], windowSize = COMMIT_SELECTION_WINDOW) {\n ensureInteractiveSelectionAvailable('showMultiSelect', 'โŒ ์ปค๋ฐ‹ ์„ ํƒ ๋ชจ๋‹ฌ์€ TTY ํ™˜๊ฒฝ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.');\n let selectedIndex = 0;\n let renderedLineCount = 0;\n const toggled = new Set<number>();\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: true\n });\n\n process.stdout.write('\\u001b[?25l');\n\n const cleanup = () => {\n if (renderedLineCount > 0) {\n readline.moveCursor(process.stdout, 0, -renderedLineCount);\n readline.clearScreenDown(process.stdout);\n renderedLineCount = 0;\n }\n process.stdin.removeListener('data', onData);\n process.stdin.setRawMode(false);\n process.stdin.pause();\n rl.close();\n process.stdout.write('\\u001b[?25h');\n };\n\n const render = () => {\n const lines = buildMultiSelectLines(question, options, selectedIndex, toggled, windowSize);\n renderedLineCount = renderSelectionBlock(lines, renderedLineCount);\n };\n\n const confirmSelection = (resolve: (value: T[]) => void) => {\n const values = [...toggled]\n .sort((left, right) => left - right)\n .map((index) => options[index]?.value)\n .filter((value): value is T => value !== undefined);\n\n cleanup();\n resolve(values);\n };\n\n const cancelSelection = (resolve: (value: T[]) => void) => {\n cleanup();\n resolve([]);\n };\n\n let onData = (_data: Buffer) => {\n // ์‹ค์ œ ๊ตฌํ˜„์€ Promise ์ƒ์„ฑ ์‹œ์ ์— ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค.\n };\n\n render();\n\n return new Promise<T[]>((resolve) => {\n onData = (data: Buffer) => {\n const key = data.toString();\n\n if (key === '\\u0003') {\n cleanup();\n process.exit(0);\n }\n\n if (key === '\\u001b') {\n cancelSelection(resolve);\n\n return;\n }\n\n if (key === '\\x1b[A') {\n selectedIndex = (selectedIndex - 1 + options.length) % options.length;\n render();\n\n return;\n }\n\n if (key === '\\x1b[B') {\n selectedIndex = (selectedIndex + 1) % options.length;\n render();\n\n return;\n }\n\n if (key === ' ') {\n if (toggled.has(selectedIndex)) {\n toggled.delete(selectedIndex);\n } else {\n toggled.add(selectedIndex);\n }\n render();\n\n return;\n }\n\n if (key === '\\r' || key === '\\n') {\n confirmSelection(resolve);\n }\n };\n\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.on('data', onData);\n });\n}\n\n/**\n * @description\n * ์ตœ๊ทผ ์ปค๋ฐ‹ ๋ชฉ๋ก์„ modal UI๋กœ ์„ ํƒ๋ฐ›์•„ review ์—”ํŠธ๋ฆฌํฌ์ธํŠธ์—์„œ ๋ฐ”๋กœ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.\n * @returns ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ ๋ฅธ ์ปค๋ฐ‹ ๋ชฉ๋ก\n */\nexport async function selectReviewCommits() {\n const commits = getRecentCommitOptions();\n\n if (commits.length === 0) {\n console.log('โ„น๏ธ ๋ฆฌ๋ทฐํ•  ์ตœ๊ทผ ์ปค๋ฐ‹์ด ์—†์Šต๋‹ˆ๋‹ค.');\n\n return [];\n }\n\n return showMultiSelect<CommitOption>(\n '๋ฆฌ๋ทฐํ•  ์ปค๋ฐ‹์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”.',\n commits.map((commit) => ({\n description: commit.description,\n label: commit.label,\n value: commit\n })),\n COMMIT_SELECTION_WINDOW\n );\n}\n\n/**\n * AI ์„œ๋น„์Šค ์„ ํƒ\n */\nexport function selectAIService() {\n const service = parseServiceFromArgs();\n\n if (!service) {\n helperTrace('select-service:missing');\n exitWithError('โŒ ์„œ๋น„์Šค๊ฐ€ ์„ ํƒ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.', {\n scope: 'helper:selectAIService'\n });\n }\n\n helperTrace('select-service:done', service);\n\n return service;\n}\n\n/**\n * ํ„ฐ๋ฏธ๋„์—์„œ ๋ผ๋””์˜ค ๋ฒ„ํŠผ ํ˜•ํƒœ๋กœ AI ์„œ๋น„์Šค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.\n */\nexport async function showSelectionAIService(): Promise<AIServiceType> {\n const selectedServiceFromArgs = parseServiceFromArgs();\n\n if (selectedServiceFromArgs) {\n helperTrace('show-selection:from-args', selectedServiceFromArgs);\n console.log(`\\nโœ… ${ANSI.green}${selectedServiceFromArgs}${ANSI.reset} ์„œ๋น„์Šค๊ฐ€ ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. (--service)\\n`);\n\n return selectedServiceFromArgs;\n }\n\n ensureInteractiveSelectionAvailable('showSelectionAIService', 'โŒ AI ์„œ๋น„์Šค ์„ ํƒ UI๋Š” TTY ํ™˜๊ฒฝ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.');\n helperTrace('show-selection:interactive:start');\n let selectedIndex = 0;\n\n // Use readline to handle keypresses\n // ํ‚ค ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด readline ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: true\n });\n\n let firstRender = true;\n\n // Hide cursor\n process.stdout.write('\\u001b[?25l');\n\n const render = () => {\n if (!firstRender) {\n // Move cursor back to the starting line of the selection UI\n // We print (1 question line + services.length lines)\n // ์„ ํƒ UI์˜ ์‹œ์ž‘ ๋ผ์ธ์œผ๋กœ ์ปค์„œ ์ด๋™ (์งˆ๋ฌธ 1์ค„ + ์„œ๋น„์Šค ๋ชฉ๋ก N์ค„)\n readline.moveCursor(process.stdout, 0, -(AIServices.length + 1));\n }\n firstRender = false;\n helperTrace('show-selection:interactive:render', AIServices[selectedIndex] || 'unknown');\n\n // Clear everything from cursor down to avoid ghosting/overlaps\n // ์ž”์ƒ์ด๋‚˜ ๊ฒน์นจ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ปค์„œ ์œ„์น˜๋ถ€ํ„ฐ ์•„๋ž˜์ชฝ ๋ชจ๋‘ ์ง€์›€\n readline.clearScreenDown(process.stdout);\n\n process.stdout.write(\n `๐Ÿค– AI ์„œ๋น„์Šค๋ฅผ ์„ ํƒํ•ด์ฃผ์„ธ์š” (${ANSI.yellow}โ†‘โ†“ ๋ฐฉํ–ฅํ‚ค${ANSI.reset} ์ด๋™, ${ANSI.yellow}Enter${ANSI.reset} ์„ ํƒ):\\n`\n );\n AIServices.forEach((service, index) => {\n if (index === selectedIndex) {\n process.stdout.write(` ${ANSI.cyan}>${ANSI.reset} ${ANSI.cyan}โ—‰${ANSI.reset} ${ANSI.bold}${service}${ANSI.reset}\\n`);\n } else {\n process.stdout.write(` โ—ฏ ${service}\\n`);\n }\n });\n };\n\n render();\n\n return new Promise((resolve) => {\n const onData = (data: Buffer) => {\n const key = data.toString();\n if (key === '\\u0003') {\n // Ctrl+C\n helperTrace('show-selection:interactive:ctrl-c');\n process.stdout.write('\\u001b[?25h'); // Show cursor\n process.exit(0);\n }\n if (key === '\\x1b[A') {\n // Up arrow\n selectedIndex = (selectedIndex - 1 + AIServices.length) % AIServices.length;\n render();\n } else if (key === '\\x1b[B') {\n // Down arrow\n selectedIndex = (selectedIndex + 1) % AIServices.length;\n render();\n } else if (key === '\\r' || key === '\\n') {\n // Enter\n process.stdin.removeListener('data', onData);\n process.stdin.setRawMode(false);\n process.stdin.pause();\n rl.close();\n\n // Show cursor\n process.stdout.write('\\u001b[?25h');\n\n console.log(`\\nโœ… ${ANSI.green}${AIServices[selectedIndex]}${ANSI.reset} ์„œ๋น„์Šค๊ฐ€ ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.\\n`);\n const result = AIServices[selectedIndex];\n if (result) {\n helperTrace('show-selection:interactive:confirmed', result);\n resolve(result);\n }\n }\n };\n\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.on('data', onData);\n });\n}\n","import fs from 'fs';\n\nimport { codingConventionRulesPath, createTraceLogger, namingRulesPath, rulesPath } from '../../common/helper';\n\nconst args = process.argv.slice(2);\nconst trace = createTraceLogger('claude-commander', args);\nconst ALLOWED_REASONING_EFFORTS = ['minimal', 'low', 'medium', 'high'] as const;\n\ntype ReasoningEffort = (typeof ALLOWED_REASONING_EFFORTS)[number];\ntype ClaudeEffort = 'low' | 'medium' | 'high';\n\nfunction shellQuote(value: string) {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction getArgValue(flag: string) {\n const index = args.indexOf(flag);\n\n if (index === -1 || !args[index + 1]) {\n return '';\n }\n\n return args[index + 1];\n}\n\nfunction printNotice(message: string) {\n if (args.includes('--test')) {\n console.warn(message);\n }\n}\n\nfunction toUnique(values: string[]) {\n const seen = new Set<string>();\n\n return values.filter((value) => {\n if (!value || seen.has(value)) {\n return false;\n }\n seen.add(value);\n\n return true;\n });\n}\n\nfunction normalizeEffort(level: ReasoningEffort): ClaudeEffort {\n if (level === 'minimal') {\n return 'low';\n }\n\n return level;\n}\n\nfunction resolveReasoningEffort(): ClaudeEffort {\n const customReasoningEffort = getArgValue('--reasoning-effort') || getArgValue('--effort');\n\n if (customReasoningEffort) {\n if (ALLOWED_REASONING_EFFORTS.includes(customReasoningEffort as ReasoningEffort)) {\n const normalized = normalizeEffort(customReasoningEffort as ReasoningEffort);\n trace('reasoning:custom', `${customReasoningEffort} -> ${normalized}`);\n\n if (customReasoningEffort === 'minimal') {\n printNotice('โš ๏ธ Claude๋Š” minimal์„ ์ง์ ‘ ์ง€์›ํ•˜์ง€ ์•Š์•„ low๋กœ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.');\n }\n\n return normalized;\n }\n\n printNotice(\n `โš ๏ธ ์ง€์›๋˜์ง€ ์•Š๋Š” reasoning effort(${customReasoningEffort})์ž…๋‹ˆ๋‹ค. allowed: ${ALLOWED_REASONING_EFFORTS.join(\n ', '\n )}`\n );\n }\n\n if (args.includes('--flash')) {\n trace('reasoning:flash-default', 'low');\n\n return 'low';\n }\n\n if (args.includes('--review')) {\n trace('reasoning:review-default', 'high');\n\n return 'high';\n }\n\n trace('reasoning:default', 'medium');\n\n return 'medium';\n}\n\nfunction resolvePrimaryAlias() {\n if (args.includes('--review')) {\n trace('model:mode-alias', 'opus');\n\n return 'opus';\n }\n\n if (args.includes('--flash')) {\n trace('model:mode-alias', 'haiku');\n\n return 'haiku';\n }\n\n trace('model:default-alias', 'sonnet');\n\n return 'sonnet';\n}\n\nfunction getAliasFallbacks(primaryAlias: string) {\n if (primaryAlias === 'opus') {\n return ['opus', 'sonnet', 'haiku'];\n }\n\n if (primaryAlias === 'haiku') {\n return ['haiku', 'sonnet'];\n }\n\n return [primaryAlias, 'sonnet', 'haiku'];\n}\n\nfunction buildClaudeExecCommand(options: {\n tempDiffPath: string;\n prompt: string;\n systemPromptFiles: string[];\n effort: ClaudeEffort;\n model?: string;\n fallbackModel?: string;\n}) {\n const { tempDiffPath, prompt, systemPromptFiles, effort, model, fallbackModel } = options;\n const modelOption = model ? `--model ${shellQuote(model)}` : '';\n const fallbackOption = model && fallbackModel ? `--fallback-model ${shellQuote(fallbackModel)}` : '';\n const effortOption = `--effort ${shellQuote(effort)}`;\n\n const appendedPromptFiles = systemPromptFiles\n .map((path) => `--append-system-prompt-file ${shellQuote(path)}`)\n .join(' ');\n\n return `cat ${shellQuote(tempDiffPath)} | claude ${[\n modelOption,\n fallbackOption,\n effortOption,\n appendedPromptFiles,\n '-p',\n shellQuote(prompt)\n ]\n .filter(Boolean)\n .join(' ')}`;\n}\n\n/**\n * @description\n * Claude Code CLI๋ฅผ ํ™œ์šฉํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ช…๋ น์–ด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.\n *\n * ๋ชจ๋ธ ์ „๋žต:\n * 1) --model ์ปค์Šคํ…€ ๋ชจ๋ธ ์šฐ์„  ์‹œ๋„\n * 2) ์„œ๋น„์Šค alias ์ˆœ์ฐจ ํด๋ฐฑ (opus/sonnet/haiku ์กฐํ•ฉ)\n * 3) ๋งˆ์ง€๋ง‰์— --model ์—†์ด ๊ณ„์ •/CLI ๊ธฐ๋ณธ ๋ชจ๋ธ๋กœ ํด๋ฐฑ\n *\n * reasoning ์ „๋žต:\n * - --effort(low|medium|high)๋ฅผ ์‚ฌ์šฉ\n * - --reasoning-effort(minimal|low|medium|high) ์ž…๋ ฅ ์‹œ Claude ํ˜ธํ™˜ ๊ฐ’์œผ๋กœ ๋งคํ•‘\n */\nexport const createClaudeCommand = (tempDiffPath: string, reviewFormPath: string) => {\n trace('createClaudeCommand:start', `tempDiffPath=${tempDiffPath}, reviewFormPath=${reviewFormPath}`);\n const customModel = getArgValue('--model');\n const effort = resolveReasoningEffort();\n const primaryAlias = resolvePrimaryAlias();\n const aliasFallbacks = toUnique(getAliasFallbacks(primaryAlias));\n\n // ๋ฃฐ์…‹ ํŒŒ์ผ๋“ค์„ --append-system-prompt-file ๋กœ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์— ์ถ”๊ฐ€\n // Claude๊ฐ€ \"์ง€์นจ/๊ทœ์น™\"์œผ๋กœ ์ธ์‹ํ•˜๋„๋ก ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ๋ ˆ๋ฒจ์— ์ฃผ์ž…\n const rules = [\n { path: rulesPath, display: '๋ฃฐ์…‹' },\n { path: namingRulesPath, display: '๋„ค์ด๋ฐ ๊ทœ์น™' },\n { path: codingConventionRulesPath, display: '์ฝ”๋”ฉ ์ปจ๋ฒค์…˜' }\n ];\n const existingRuleFiles = rules.filter((rule) => fs.existsSync(rule.path)).map((rule) => rule.path);\n\n trace('rules:loaded', `count=${existingRuleFiles.length}`);\n\n // ๋ฆฌ๋ทฐ ์–‘์‹๋„ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์— ์ถ”๊ฐ€ (์ถœ๋ ฅ ํฌ๋งท ์ง€์นจ)\n const reviewFormExists = fs.existsSync(reviewFormPath);\n trace('reviewForm:status', reviewFormExists ? 'exists' : 'missing');\n const systemPromptFiles = reviewFormExists ? [...existingRuleFiles, reviewFormPath] : existingRuleFiles;\n\n const prompt = '์œ„ ๊ทœ์น™๋“ค์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ด diff๋ฅผ ์ฝ”๋“œ๋ฆฌ๋ทฐํ•ด์ค˜. ๋ฆฌ๋ทฐ์–‘์‹์— ๋งž์ถฐ์„œ ์ž‘์„ฑํ•ด์ค˜.';\n trace('prompt:prepared', `length=${prompt.length}`);\n trace('system-prompt-files', `count=${systemPromptFiles.length}`);\n const modelCandidates = toUnique(customModel ? [customModel, ...aliasFallbacks] : aliasFallbacks);\n trace('model:candidates', modelCandidates.join(', '));\n trace('command:candidates:count', String(modelCandidates.length + 1));\n\n if (customModel) {\n printNotice(\n `โš ๏ธ ์ปค์Šคํ…€ ๋ชจ๋ธ(${customModel})์„ ์šฐ์„  ์‹œ๋„ํ•˜๊ณ  ์‹คํŒจํ•˜๋ฉด alias(${aliasFallbacks.join(\n ' -> '\n )}) ๋ฐ ๊ธฐ๋ณธ ๋ชจ๋ธ ์ˆœ์œผ๋กœ ํด๋ฐฑํ•ฉ๋‹ˆ๋‹ค.`\n );\n } else {\n printNotice(\n `โš ๏ธ ๋ชจ๋ธ์ด ์ง€์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. alias(${aliasFallbacks.join(' -> ')})๋ฅผ ์ˆœ์ฐจ ์‹œ๋„ํ•˜๊ณ  ๋งˆ์ง€๋ง‰์— ๊ธฐ๋ณธ ๋ชจ๋ธ๋กœ ํด๋ฐฑํ•ฉ๋‹ˆ๋‹ค.`\n );\n }\n\n const commandCandidates = modelCandidates.map((model, index) => {\n const fallbackModel = modelCandidates[index + 1];\n\n return buildClaudeExecCommand({\n tempDiffPath,\n prompt,\n systemPromptFiles,\n effort,\n model,\n fallbackModel\n });\n });\n\n const command = [\n ...commandCandidates,\n buildClaudeExecCommand({\n tempDiffPath,\n prompt,\n systemPromptFiles,\n effort\n })\n ].join(' || ');\n\n trace('command:created');\n\n // test mode\n if (args.includes('--test')) {\n const safeCommand = command.replace(/\"/g, '\\\\\"');\n trace('test-mode:return-preview');\n\n return `echo \"[TEST MODE] Claude ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.\\n\\n์ƒ์„ฑ๋  ๋ช…๋ น์–ด ๋ฏธ๋ฆฌ๋ณด๊ธฐ:\\n${safeCommand}\"`;\n }\n\n trace('command:mode', 'execute');\n trace('createClaudeCommand:end');\n\n return command;\n};\n","import { execSync } from 'child_process';\n\nimport { createTraceLogger, exitWithError, getErrorSummary } from '../../common/helper';\n\nconst trace = createTraceLogger('installation-claude');\n\n// claude-cli ์„ค์น˜ ํ™•์ธ ๋ฐ ์„ค์น˜\nexport function checkClaudeCliInstalled() {\n trace('checkClaudeCliInstalled:start');\n try {\n trace('version-check:run', 'claude --version');\n execSync('claude --version', { stdio: 'ignore' });\n trace('version-check:ok');\n } catch (error) {\n trace('version-check:failed', getErrorSummary(error));\n trace('install:start', '@anthropic-ai/claude-code');\n console.log(\n 'โ„น๏ธ claude-cli๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ค์น˜๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค... npm install -g @anthropic-ai/claude-code'\n );\n try {\n execSync('npm install -g @anthropic-ai/claude-code', { stdio: 'inherit' });\n trace('install:ok', 'login-required');\n console.log('โœ… claude-cli ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');\n console.log('โš ๏ธ claude-cli ์‚ฌ์šฉ์„ ์œ„ํ•ด ์ธ์ฆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.');\n console.log(' ํ„ฐ๋ฏธ๋„์—์„œ \"claude\" ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ € ๋กœ๊ทธ์ธ์„ ์™„๋ฃŒํ•œ ํ›„, ๋‹ค์‹œ ์‹œ๋„ํ•ด์ฃผ์„ธ์š”.');\n process.exit(1);\n } catch (installError) {\n trace('install:failed', getErrorSummary(installError));\n exitWithError('โŒ claude-cli ์„ค์น˜ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ถŒํ•œ ๋ฌธ์ œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (sudo ํ•„์š”).', {\n scope: 'installation-claude',\n error: installError\n });\n }\n }\n trace('checkClaudeCliInstalled:end');\n}\n","import fs from 'fs';\n\nimport { codingConventionRulesPath, createTraceLogger, namingRulesPath, rulesPath } from '../../common/helper';\n\nconst args = process.argv.slice(2);\nconst trace = createTraceLogger('codex-commander', args);\nconst ALLOWED_REASONING_EFFORTS = ['minimal', 'low', 'medium', 'high'] as const;\n\ntype ReasoningEffort = (typeof ALLOWED_REASONING_EFFORTS)[number];\n\nfunction shellQuote(value: string) {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction getArgValue(flag: string) {\n const index = args.indexOf(flag);\n\n if (index === -1 || !args[index + 1]) {\n return '';\n }\n\n return args[index + 1];\n}\n\nfunction printNotice(message: string) {\n if (args.includes('--test')) {\n console.warn(message);\n }\n}\n\nfunction resolveReasoningEffort(): ReasoningEffort {\n const customReasoningEffort = getArgValue('--reasoning-effort');\n\n if (customReasoningEffort) {\n if (ALLOWED_REASONING_EFFORTS.includes(customReasoningEffort as ReasoningEffort)) {\n trace('reasoning:custom', customReasoningEffort);\n\n return customReasoningEffort as ReasoningEffort;\n }\n\n printNotice(\n `โš ๏ธ ์ง€์›๋˜์ง€ ์•Š๋Š” reasoning effort(${customReasoningEffort})์ž…๋‹ˆ๋‹ค. allowed: ${ALLOWED_REASONING_EFFORTS.join(\n ', '\n )}`\n );\n }\n\n if (args.includes('--flash')) {\n trace('reasoning:flash-default', 'minimal');\n\n return 'minimal';\n }\n\n if (args.includes('--review')) {\n trace('reasoning:review-default', 'high');\n\n return 'high';\n }\n\n trace('reasoning:default', 'medium');\n\n return 'medium';\n}\n\nfunction buildCodexExecCommand(prompt: string, reasoningEffort: ReasoningEffort, model?: string) {\n const modelOption = model ? `--model ${shellQuote(model)}` : '';\n const reasoningOption = `-c ${shellQuote(`model_reasoning_effort=\"${reasoningEffort}\"`)}`;\n\n return `codex exec ${[modelOption, reasoningOption, shellQuote(prompt)].filter(Boolean).join(' ')}`;\n}\n\n/**\n * @description\n * Codex CLI๋ฅผ ํ™œ์šฉํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ช…๋ น์–ด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.\n *\n * ๋ชจ๋ธ ๊ธฐ๋ณธ๊ฐ’:\n * - --review: gpt-5 alias ์šฐ์„  ์‹œ๋„ ํ›„ ๊ณ„์ • ๊ธฐ๋ณธ ๋ชจ๋ธ๋กœ ์ž๋™ ํด๋ฐฑ\n * - --flash: gpt-5 alias ์šฐ์„  ์‹œ๋„ ํ›„ ๊ณ„์ • ๊ธฐ๋ณธ ๋ชจ๋ธ๋กœ ์ž๋™ ํด๋ฐฑ\n * - ๋ฏธ์ง€์ •: gpt-5 alias ์šฐ์„  ์‹œ๋„ ํ›„ ๊ณ„์ • ๊ธฐ๋ณธ ๋ชจ๋ธ๋กœ ์ž๋™ ํด๋ฐฑ\n *\n * ์ถ”๋ก  ๊ฐ•๋„ ๊ธฐ๋ณธ๊ฐ’:\n * - --review: high\n * - --flash: minimal\n * - ๋ฏธ์ง€์ •: medium\n */\nexport const createCodexCommand = (tempDiffPath: string, reviewFormPath: string) => {\n trace('createCodexCommand:start', `tempDiffPath=${tempDiffPath}, reviewFormPath=${reviewFormPath}`);\n const customModel = getArgValue('--model');\n const reasoningEffort = resolveReasoningEffort();\n\n const rules = [rulesPath, namingRulesPath, codingConventionRulesPath]\n .filter((filePath) => fs.existsSync(filePath))\n .map((filePath) => `- ${filePath}`)\n .join('\\n');\n const rulesCount = rules ? rules.split('\\n').length : 0;\n trace('rules:loaded', `count=${rulesCount}`);\n\n const hasReviewForm = fs.existsSync(reviewFormPath);\n const reviewFormLine = hasReviewForm ? `- ${reviewFormPath}` : '';\n trace('reviewForm:status', reviewFormLine ? 'exists' : 'missing');\n\n const prompt = `์•„๋ž˜ ํŒŒ์ผ๋“ค์„ ์ฐธ๊ณ ํ•ด์„œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ์ง„ํ–‰ํ•ด์ค˜.\n๊ทœ์น™ ํŒŒ์ผ: \n${rules || '- (์—†์Œ)'}\n๋ฆฌ๋ทฐ ์–‘์‹ ํŒŒ์ผ:\n${reviewFormLine || '- (์—†์Œ)'}\n๋ฆฌ๋ทฐ ๋Œ€์ƒ diff ํŒŒ์ผ:\n- ${tempDiffPath}\n\n๋ฐ˜๋“œ์‹œ ๋ฆฌ๋ทฐ ์–‘์‹์— ๋งž์ถฐ ์ž‘์„ฑํ•ด์ค˜.`;\n trace('prompt:prepared', `length=${prompt.length}`);\n\n let command = '';\n\n if (customModel) {\n printNotice('โš ๏ธ ์ง€์ •ํ•œ ๋ชจ๋ธ์ด ์—†๋Š” ๊ฒฝ์šฐ, ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋‹ˆ ์ฃผ์˜ํ•˜์„ธ์š”.');\n trace('model:custom', customModel);\n command = buildCodexExecCommand(prompt, reasoningEffort, customModel);\n } else {\n const preferredModelAlias = 'gpt-5';\n const aliasCommand = buildCodexExecCommand(prompt, reasoningEffort, preferredModelAlias);\n const fallbackCommand = buildCodexExecCommand(prompt, reasoningEffort);\n\n printNotice(\n `โš ๏ธ ๋ชจ๋ธ์ด ์ง€์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. alias(${preferredModelAlias})๋ฅผ ์šฐ์„  ์‹œ๋„ํ•˜๊ณ  ์‹คํŒจํ•˜๋ฉด ๊ณ„์ • ๊ธฐ๋ณธ ๋ชจ๋ธ๋กœ ์ž๋™ ํด๋ฐฑํ•ฉ๋‹ˆ๋‹ค.`\n );\n trace('model:alias-first', preferredModelAlias);\n trace('model:fallback', 'account-default');\n command = `${aliasCommand} || ${fallbackCommand}`;\n }\n\n trace('command:created');\n\n if (args.includes('--test')) {\n const safeCommand = command.replace(/\"/g, '\\\\\"');\n trace('test-mode:return-preview');\n\n return `echo \"[TEST MODE] Codex ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.\\n\\n์ƒ์„ฑ๋  ๋ช…๋ น์–ด ๋ฏธ๋ฆฌ๋ณด๊ธฐ:\\n${safeCommand}\"`;\n }\n\n trace('command:mode', 'execute');\n trace('createCodexCommand:end');\n\n return command;\n};\n","import { execSync } from 'child_process';\n\nimport { createTraceLogger, exitWithError, getErrorSummary } from '../../common/helper';\n\nconst trace = createTraceLogger('installation-codex');\n\n// codex-cli ์„ค์น˜ ํ™•์ธ ๋ฐ ์„ค์น˜\nexport function checkCodexCliInstalled() {\n trace('checkCodexCliInstalled:start');\n try {\n trace('version-check:run', 'codex --version');\n execSync('codex --version', { stdio: 'ignore' });\n trace('version-check:ok');\n } catch (error) {\n trace('version-check:failed', getErrorSummary(error));\n trace('install:start', '@openai/codex');\n console.log('โ„น๏ธ codex-cli๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ค์น˜๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค... npm install -g @openai/codex');\n try {\n execSync('npm install -g @openai/codex', { stdio: 'inherit' });\n trace('install:ok', 'login-required');\n console.log('โœ… codex-cli ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');\n console.log('โš ๏ธ codex-cli ์‚ฌ์šฉ์„ ์œ„ํ•ด ์ธ์ฆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.');\n console.log(' ํ„ฐ๋ฏธ๋„์—์„œ \"codex login\" ์„ ์ž…๋ ฅํ•˜์—ฌ ๋กœ๊ทธ์ธ์„ ์™„๋ฃŒํ•œ ํ›„, ๋‹ค์‹œ ์‹œ๋„ํ•ด์ฃผ์„ธ์š”.');\n process.exit(1);\n } catch (installError) {\n trace('install:failed', getErrorSummary(installError));\n exitWithError('โŒ codex-cli ์„ค์น˜ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ถŒํ•œ ๋ฌธ์ œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (sudo ํ•„์š”).', {\n scope: 'installation-codex',\n error: installError\n });\n }\n }\n trace('checkCodexCliInstalled:end');\n}\n","import fs from 'fs';\nimport path from 'path';\n\nimport { codingConventionRulesPath, createTraceLogger, namingRulesPath, rulesPath } from '../../common/helper';\n// gemini ์‹คํ–‰ ๋ฐ ๊ฒฐ๊ณผ ์บก์ฒ˜\nconst args = process.argv.slice(2);\nconst trace = createTraceLogger('gemini-commander', args);\nconst ALLOWED_REASONING_EFFORTS = ['minimal', 'low', 'medium', 'high'] as const;\n\ntype ReasoningEffort = (typeof ALLOWED_REASONING_EFFORTS)[number];\ntype GeminiPromptFile = {\n path: string;\n display: string;\n};\n\nfunction shellQuote(value: string) {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction getArgValue(flag: string) {\n const index = args.indexOf(flag);\n\n if (index === -1 || !args[index + 1]) {\n return '';\n }\n\n return args[index + 1];\n}\n\nfunction printNotice(message: string) {\n if (args.includes('--test')) {\n console.warn(message);\n }\n}\n\nfunction toUnique(values: string[]) {\n const seen = new Set<string>();\n\n return values.filter((value) => {\n if (!value || seen.has(value)) {\n return false;\n }\n seen.add(value);\n\n return true;\n });\n}\n\nfunction resolveReasoningEffort(): ReasoningEffort {\n const customReasoningEffort = getArgValue('--reasoning-effort');\n\n if (customReasoningEffort) {\n if (ALLOWED_REASONING_EFFORTS.includes(customReasoningEffort as ReasoningEffort)) {\n trace('reasoning:custom', customReasoningEffort);\n\n return customReasoningEffort as ReasoningEffort;\n }\n\n printNotice(\n `โš ๏ธ ์ง€์›๋˜์ง€ ์•Š๋Š” reasoning effort(${customReasoningEffort})์ž…๋‹ˆ๋‹ค. allowed: ${ALLOWED_REASONING_EFFORTS.join(\n ', '\n )}`\n );\n }\n\n if (args.includes('--flash')) {\n trace('reasoning:flash-default', 'minimal');\n\n return 'minimal';\n }\n\n if (args.includes('--review')) {\n trace('reasoning:review-default', 'high');\n\n return 'high';\n }\n\n trace('reasoning:default', 'medium');\n\n return 'medium';\n}\n\nfunction resolvePrimaryAlias(reasoningEffort: ReasoningEffort) {\n if (args.includes('--review')) {\n trace('model:mode-alias', 'pro');\n\n return 'pro';\n }\n\n if (args.includes('--flash')) {\n trace('model:mode-alias', 'flash');\n\n return 'flash';\n }\n\n // ์ผ๋ฐ˜ ๋ชจ๋“œ์—์„œ๋Š” ์ถ”๋ก  ๊ฐ•๋„ ๊ธฐ์ค€์œผ๋กœ alias๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.\n if (reasoningEffort === 'high') {\n trace('model:reasoning-alias', 'pro');\n\n return 'pro';\n }\n\n if (reasoningEffort === 'minimal' || reasoningEffort === 'low') {\n trace('model:reasoning-alias', 'flash');\n\n return 'flash';\n }\n\n trace('model:default-alias', 'auto');\n\n return 'auto';\n}\n\nfunction getAliasFallbacks(primaryAlias: string) {\n if (primaryAlias === 'pro') {\n return ['pro', 'flash', 'auto'];\n }\n\n if (primaryAlias === 'flash') {\n return ['flash', 'auto', 'pro'];\n }\n\n return [primaryAlias, 'auto', 'flash', 'pro'];\n}\n\nfunction getReasoningInstruction(reasoningEffort: ReasoningEffort) {\n if (reasoningEffort === 'high') {\n return 'high (๊นŠ์ด ์žˆ๋Š” ๋ถ„์„, ์ž ์žฌ์  ๋ฆฌ์Šคํฌ๊นŒ์ง€ ์ ๊ฒ€)';\n }\n\n if (reasoningEffort === 'medium') {\n return 'medium (๊ท ํ˜• ์žกํžŒ ๋ถ„์„๊ณผ ํ•ต์‹ฌ ์ด์Šˆ ์ค‘์‹ฌ)';\n }\n\n if (reasoningEffort === 'low') {\n return 'low (ํ•ต์‹ฌ ๊ฒฐํ•จ ์œ„์ฃผ๋กœ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋ถ„์„)';\n }\n\n return 'minimal (์น˜๋ช…๋„ ๋†’์€ ์ด์Šˆ๋งŒ ๋งค์šฐ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋ถ„์„)';\n}\n\nfunction buildGeminiExecCommand(prompt: string, model?: string) {\n const modelOption = model ? `--model ${shellQuote(model)}` : '';\n\n return `gemini ${[modelOption, '-p', shellQuote(prompt)].filter(Boolean).join(' ')}`;\n}\n\n/**\n * @description\n * Gemini CLI ํ”„๋กฌํ”„ํŠธ์—์„œ ์‚ฌ์šฉํ•  ํŒŒ์ผ ์ฐธ์กฐ ํ† ํฐ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.\n * ํŒŒ์ผ ์ฐธ์กฐ๋ฅผ ์‰ผํ‘œ๋‚˜ ๊ด„ํ˜ธ์™€ ์ง์ ‘ ๋ถ™์ด์ง€ ์•Š๋„๋ก helper๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ,\n * Gemini๊ฐ€ ๊ฒฝ๋กœ์˜ ๋์„ ์•ˆ์ •์ ์œผ๋กœ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.\n * @param filePath Gemini๊ฐ€ ์ฝ์–ด์•ผ ํ•˜๋Š” ํŒŒ์ผ ๊ฒฝ๋กœ\n * @returns Gemini ํŒŒ์ผ ์ฐธ์กฐ ํ˜•์‹(@๊ฒฝ๋กœ)\n */\nfunction toGeminiFileReference(filePath: string) {\n return `@${filePath}`;\n}\n\n/**\n * @description\n * Gemini๊ฐ€ ์ฝ์„ ํŒŒ์ผ ๋ชฉ๋ก์„ ์ค„ ๋‹จ์œ„ bullet section์œผ๋กœ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.\n * ๊ธฐ์กด์ฒ˜๋Ÿผ ๋ฌธ์žฅ ์ค‘๊ฐ„์— `(@ํŒŒ์ผ1, @ํŒŒ์ผ2)` ํ˜•ํƒœ๋กœ ๋„ฃ์œผ๋ฉด ์‰ผํ‘œ๋‚˜ ๊ด„ํ˜ธ๊ฐ€\n * ํŒŒ์ผ ๊ฒฝ๋กœ ์ผ๋ถ€๋กœ ํ•ด์„๋  ์ˆ˜ ์žˆ์–ด, ๊ฐ ํŒŒ์ผ์„ ๋ณ„๋„ ์ค„์— ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.\n * @param files Gemini ํ”„๋กฌํ”„ํŠธ์— ํฌํ•จํ•  ํŒŒ์ผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ชฉ๋ก\n * @returns ์‹ค์ œ๋กœ ์กด์žฌํ•˜๋Š” ํŒŒ์ผ ๊ธฐ์ค€์˜ bullet line ๋ชฉ๋ก๊ณผ ๊ฐœ์ˆ˜\n */\nfunction buildGeminiFileReferenceSection(files: GeminiPromptFile[]) {\n const existingFiles = files.filter((file) => fs.existsSync(file.path));\n\n return {\n count: existingFiles.length,\n lines: existingFiles.map((file) => `- ${file.display}: ${toGeminiFileReference(file.path)}`)\n };\n}\n\n/**\n * @description\n * Gemini CLI๋ฅผ ํ™œ์šฉํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ช…๋ น์–ด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.\n *\n * ๋ชจ๋ธ ์ „๋žต:\n * 1) --model ์ปค์Šคํ…€ ๋ชจ๋ธ ์šฐ์„  ์‹œ๋„\n * 2) ์„œ๋น„์Šค alias ์ˆœ์ฐจ ํด๋ฐฑ (pro/flash/auto ์กฐํ•ฉ)\n * 3) ๋งˆ์ง€๋ง‰์— --model ์—†์ด ๊ณ„์ •/CLI ๊ธฐ๋ณธ ๋ชจ๋ธ๋กœ ํด๋ฐฑ\n *\n * reasoning ์ „๋žต:\n * - Gemini CLI๋Š” ํ˜„์žฌ reasoning effort ์ „์šฉ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์—†์–ด ํ”„๋กฌํ”„ํŠธ ์ง€์‹œ๋ฌธ์œผ๋กœ ๋ฐ˜์˜\n * - --reasoning-effort(minimal|low|medium|high) ์ง€์›\n */\nexport const createGeminiCommand = (tempDiffPath: string, reviewFormPath: string) => {\n trace('createGeminiCommand:start', `tempDiffPath=${tempDiffPath}, reviewFormPath=${reviewFormPath}`);\n const customModel = getArgValue('--model');\n const reasoningEffort = resolveReasoningEffort();\n const primaryAlias = resolvePrimaryAlias(reasoningEffort);\n const aliasFallbacks = toUnique(getAliasFallbacks(primaryAlias));\n const resolvedTempDiffPath = path.resolve(tempDiffPath);\n const resolvedReviewFormPath = path.resolve(reviewFormPath);\n\n // ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํŒŒ์ผ์€ ์ œ์™ธํ•˜์—ฌ ๋ช…๋ น์–ด ์ƒ์„ฑ\n const rules: GeminiPromptFile[] = [\n { path: rulesPath, display: '๋ฃฐ์…‹' },\n { path: namingRulesPath, display: '๋„ค์ด๋ฐ ๊ทœ์น™' },\n { path: codingConventionRulesPath, display: '์ฝ”๋”ฉ ์ปจ๋ฒค์…˜' }\n ];\n\n const ruleSection = buildGeminiFileReferenceSection(rules);\n trace('rules:loaded', `count=${ruleSection.count}`);\n\n const reviewFormExists = fs.existsSync(resolvedReviewFormPath);\n const reviewFormLine = reviewFormExists\n ? `- ๋ฆฌ๋ทฐ ์–‘์‹: ${toGeminiFileReference(resolvedReviewFormPath)}`\n : '- ๋ฆฌ๋ทฐ ์–‘์‹: (์—†์Œ)';\n trace('reviewForm:status', reviewFormExists ? 'exists' : 'missing');\n\n const reasoningInstruction = getReasoningInstruction(reasoningEffort);\n const prompt = `์•„๋ž˜ ํŒŒ์ผ๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ์ฝ๊ณ  ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ์ง„ํ–‰ํ•ด์ค˜.\n๊ทœ์น™ ํŒŒ์ผ:\n${ruleSection.lines.join('\\n') || '- (์—†์Œ)'}\n๋ฆฌ๋ทฐ ์–‘์‹ ํŒŒ์ผ:\n${reviewFormLine}\n๋ฆฌ๋ทฐ ๋Œ€์ƒ diff ํŒŒ์ผ:\n- ๋ฆฌ๋ทฐ ๋Œ€์ƒ diff: ${toGeminiFileReference(resolvedTempDiffPath)}\n\n๋ฐ˜๋“œ์‹œ ๋ฆฌ๋ทฐ ์–‘์‹์— ๋งž์ถฐ ์ž‘์„ฑํ•ด์ค˜.\n์ถ”๋ก  ๊ฐ•๋„ ์ง€์นจ: ${reasoningInstruction}`;\n trace('prompt:prepared', `length=${prompt.length}`);\n\n const modelCandidates = toUnique(customModel ? [customModel, ...aliasFallbacks] : aliasFallbacks);\n trace('model:candidates', modelCandidates.join(', '));\n trace('command:candidates:count', String(modelCandidates.length + 1));\n\n if (customModel) {\n printNotice(\n `โš ๏ธ ์ปค์Šคํ…€ ๋ชจ๋ธ(${customModel})์„ ์šฐ์„  ์‹œ๋„ํ•˜๊ณ  ์‹คํŒจํ•˜๋ฉด alias(${aliasFallbacks.join(\n ' -> '\n )}) ๋ฐ ๊ธฐ๋ณธ ๋ชจ๋ธ ์ˆœ์œผ๋กœ ํด๋ฐฑํ•ฉ๋‹ˆ๋‹ค.`\n );\n } else {\n printNotice(\n `โš ๏ธ ๋ชจ๋ธ์ด ์ง€์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. alias(${aliasFallbacks.join(' -> ')})๋ฅผ ์ˆœ์ฐจ ์‹œ๋„ํ•˜๊ณ  ๋งˆ์ง€๋ง‰์— ๊ธฐ๋ณธ ๋ชจ๋ธ๋กœ ํด๋ฐฑํ•ฉ๋‹ˆ๋‹ค.`\n );\n }\n\n const commandCandidates = modelCandidates.map((model) => buildGeminiExecCommand(prompt, model));\n const command = [...commandCandidates, buildGeminiExecCommand(prompt)].join(' || ');\n\n // gemini ์‹คํ–‰ ๋ฐ ๊ฒฐ๊ณผ ์บก์ฒ˜\n trace('command:created');\n\n // test mode\n if (args.includes('--test')) {\n const safeCommand = command.replace(/\"/g, '\\\\\"');\n trace('test-mode:return-preview');\n\n return `echo \"[TEST MODE] Gemini ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.\\n\\n์ƒ์„ฑ๋  ๋ช…๋ น์–ด ๋ฏธ๋ฆฌ๋ณด๊ธฐ:\\n${safeCommand}\"`;\n }\n\n trace('command:mode', 'execute');\n trace('createGeminiCommand:end');\n\n return command;\n};\n","import { execSync } from 'child_process';\n\nimport { createTraceLogger, exitWithError, getErrorSummary } from '../../common/helper';\n\nconst trace = createTraceLogger('installation-gemini');\n\n// gemini-cli ์„ค์น˜ ํ™•์ธ ๋ฐ ์„ค์น˜\nexport function checkGeminiCliInstalled() {\n trace('checkGeminiCliInstalled:start');\n try {\n trace('version-check:run', 'gemini --version');\n execSync('gemini --version', { stdio: 'ignore' });\n trace('version-check:ok');\n } catch (error) {\n trace('version-check:failed', getErrorSummary(error));\n trace('install:start', '@google/gemini-cli');\n console.log('โ„น๏ธ gemini-cli๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ค์น˜๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค... npm install -g @google/gemini-cli');\n try {\n execSync('npm install -g @google/gemini-cli', { stdio: 'inherit' });\n trace('install:ok', 'login-required');\n console.log('โœ… gemini-cli ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');\n console.log('โš ๏ธ Gemini API ์‚ฌ์šฉ์„ ์œ„ํ•ด ์ธ์ฆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.');\n console.log(' ํ„ฐ๋ฏธ๋„์—์„œ \"gemini\" ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ € ๋กœ๊ทธ์ธ์„ ์™„๋ฃŒํ•œ ํ›„, ๋‹ค์‹œ ์‹œ๋„ํ•ด์ฃผ์„ธ์š”.');\n process.exit(1);\n } catch (installError) {\n trace('install:failed', getErrorSummary(installError));\n exitWithError('โŒ gemini-cli ์„ค์น˜ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ถŒํ•œ ๋ฌธ์ œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (sudo ํ•„์š”).', {\n scope: 'installation-gemini',\n error: installError\n });\n }\n }\n trace('checkGeminiCliInstalled:end');\n}\n","#!/usr/bin/env node\nimport fs from 'fs';\n\nimport {\n buildSelectedCommitDiff,\n buildSelectedCommitSummary,\n clearTraceMessages,\n createReportDirectory,\n createTraceLogger,\n deleteTempDiff,\n executeShellCommandWithProgress,\n formatReviewTargetFiles,\n getErrorSummary,\n getNextFilePath,\n getNowString,\n getSelectedCommitFiles,\n isTestMode,\n openReport,\n REPORT_DIR,\n reviewFormPath,\n selectReviewCommits,\n tempDiffPath,\n writeErrorReport,\n showSelectionAIService\n} from '../common/helper';\n\nimport { createClaudeCommand } from './claude/claude-commander';\nimport { checkClaudeCliInstalled } from './claude/installation-claude';\nimport { createCodexCommand } from './codex/codex-commander';\nimport { checkCodexCliInstalled } from './codex/installation-codex';\nimport { createGeminiCommand } from './gemini/gemini-commander';\nimport { checkGeminiCliInstalled } from './gemini/installation-gemini';\n\nasync function main() {\n // gemini ์‹คํ–‰ ๋ฐ ๊ฒฐ๊ณผ ์บก์ฒ˜\n const args = process.argv.slice(2);\n clearTraceMessages();\n const isTest = isTestMode(args);\n const trace = createTraceLogger('review', args);\n trace('main:start', `args=${JSON.stringify(args)}`);\n let command = '';\n let savedDiffPath = '';\n let savedReportPath = '';\n let service = '';\n let selectedCommitSummary = '';\n let reviewTargetFiles: string[] = [];\n\n try {\n // AI ์„œ๋น„์Šค ์„ ํƒ\n trace('service-selection:start');\n service = await showSelectionAIService();\n trace('service-selection:done', `service=${service}`);\n\n switch (service) {\n case 'gemini':\n // gemini-cli ์„ค์น˜ ํ™•์ธ ๋ฐ ์„ค์น˜\n trace('install-check:start', 'service=gemini');\n checkGeminiCliInstalled();\n trace('install-check:done', 'service=gemini');\n break;\n case 'claude':\n // claude-cli ์„ค์น˜ ํ™•์ธ ๋ฐ ์„ค์น˜\n trace('install-check:start', 'service=claude');\n checkClaudeCliInstalled();\n trace('install-check:done', 'service=claude');\n break;\n case 'codex':\n // codex-cli ์„ค์น˜ ํ™•์ธ ๋ฐ ์„ค์น˜\n trace('install-check:start', 'service=codex');\n checkCodexCliInstalled();\n trace('install-check:done', 'service=codex');\n break;\n }\n\n trace('review-flow:start');\n console.log('๐Ÿš€ AI Code Review๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค...');\n\n trace('commit-selection:start');\n const selectedCommits = await selectReviewCommits();\n trace('commit-selection:done', `count=${selectedCommits.length}`);\n\n if (selectedCommits.length === 0) {\n trace('commit-selection:empty');\n console.log('โ„น๏ธ ์„ ํƒ๋œ ์ปค๋ฐ‹์ด ์—†์Šต๋‹ˆ๋‹ค.');\n deleteTempDiff();\n process.exit(0);\n }\n\n selectedCommitSummary = buildSelectedCommitSummary(selectedCommits);\n trace('commit-summary:prepared', selectedCommitSummary);\n\n reviewTargetFiles = getSelectedCommitFiles(selectedCommits);\n console.log(`๐Ÿ“‚ ๋ฆฌ๋ทฐ ๋Œ€์ƒ ํŒŒ์ผ(${reviewTargetFiles.length}๊ฐœ): ${formatReviewTargetFiles(reviewTargetFiles)}`);\n console.log('โณ ์„ ํƒํ•œ ์ปค๋ฐ‹ diff๋ฅผ ์ •๋ฆฌํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค...');\n trace('git-diff:build:start');\n const diff = buildSelectedCommitDiff(selectedCommits);\n trace('git-diff:build:done', `length=${diff.length}`);\n\n if (!diff.trim() && !isTest) {\n trace('empty-diff:exit');\n console.log('โ„น๏ธ ์„ ํƒํ•œ ์ปค๋ฐ‹์—์„œ ๋ฆฌ๋ทฐ ๋Œ€์ƒ ํŒŒ์ผ ๋ณ€๊ฒฝ์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.');\n // ์ž„์‹œ ํŒŒ์ผ ์‚ญ์ œ\n deleteTempDiff();\n process.exit(0);\n }\n\n const nowStr = getNowString();\n trace('timestamp:created', nowStr);\n\n // ๋ฆฌ๋ทฐ ๊ฒฐ๊ณผ ํด๋” ์ƒ์„ฑ\n trace('report-dir:create:start');\n createReportDirectory();\n trace('report-dir:create:done');\n\n trace('temp-diff:write:start', tempDiffPath);\n fs.writeFileSync(tempDiffPath, diff);\n trace('temp-diff:write:done');\n\n // diff ํŒŒ์ผ ์ €์žฅ (.review-report ์•ˆ์œผ๋กœ ๋ณต์‚ฌ)\n trace('saved-diff:copy:start');\n savedDiffPath = getNextFilePath(REPORT_DIR, `${nowStr}-diff`, '.txt');\n fs.copyFileSync(tempDiffPath, savedDiffPath);\n trace('saved-diff:copy:done', savedDiffPath);\n\n // ๋ช…๋ น์–ด ์ƒ์„ฑ\n trace('command:create:start', `service=${service}`);\n\n switch (service) {\n case 'gemini':\n // gemini-cli ์— ๋งž๊ฒŒ ํ”„๋กฌํ”„ํŠธ ๋ช…๋ น์–ด ์ƒ์„ฑ\n command = createGeminiCommand(tempDiffPath, reviewFormPath);\n break;\n case 'claude':\n // claude-cli ์— ๋งž๊ฒŒ ํ”„๋กฌํ”„ํŠธ ๋ช…๋ น์–ด ์ƒ์„ฑ\n command = createClaudeCommand(tempDiffPath, reviewFormPath);\n break;\n case 'codex':\n // codex-cli ์— ๋งž๊ฒŒ ํ”„๋กฌํ”„ํŠธ ๋ช…๋ น์–ด ์ƒ์„ฑ\n command = createCodexCommand(tempDiffPath, reviewFormPath);\n break;\n }\n trace('command:create:done');\n\n // ๊ฒฐ๊ณผ๊ฐ€ ๊ธธ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ buffer๋ฅผ ๋„‰๋„‰ํ•˜๊ฒŒ ์žก๊ฑฐ๋‚˜ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐ›์Œ. ์—ฌ๊ธฐ์„œ๋Š” ๊ฐ„๋‹จํžˆ toString()\n trace('command:exec:start');\n const result = (\n await executeShellCommandWithProgress(command, {\n progressMessage: `โณ [๋ฆฌ๋ทฐ ์ง„ํ–‰] ${service} | ๋Œ€์ƒ ${reviewTargetFiles.length}๊ฐœ ํŒŒ์ผ`,\n streamOutput: isTest\n })\n ).stdout;\n trace('command:exec:done', `resultLength=${result.length}`);\n\n // ๋ฆฌ๋ทฐ ๊ฒฐ๊ณผ ์ €์žฅ\n trace('report:write:start');\n savedReportPath = getNextFilePath(REPORT_DIR, nowStr, '.md');\n fs.writeFileSync(savedReportPath, result);\n trace('report:write:done', savedReportPath);\n\n //์‚ฌ์šฉํ•œ ๋ช…๋ น์–ด๋„ ์ €์žฅ(๋””๋ฒ„๊น…์šฉ)\n if (isTest) {\n trace('test-command:append:start');\n fs.appendFileSync(savedReportPath, `\\n\\n## ์‚ฌ์šฉ๋œ ๋ช…๋ น์–ด\\n\\n${command}`);\n trace('test-command:append:done');\n }\n\n console.log(`\\nโœ… ๋ฆฌ๋ทฐ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.`);\n console.log(`๐Ÿ“„ ๋ฆฌํฌํŠธ ์ €์žฅ ์œ„์น˜: ${savedReportPath}`);\n console.log(`diff ์ €์žฅ ์œ„์น˜: ${savedDiffPath}`);\n\n // ๋ธŒ๋ผ์šฐ์ € ์—ด๊ธฐ\n trace('open-report:start');\n openReport(savedReportPath);\n trace('open-report:done');\n\n // ์ž„์‹œ ํŒŒ์ผ ์‚ญ์ œ\n trace('cleanup-temp-diff:start');\n deleteTempDiff();\n trace('cleanup-temp-diff:done');\n trace('review-flow:end');\n } catch (error) {\n trace('review-flow:catch', getErrorSummary(error));\n let errorReportPath = '';\n\n trace('cleanup-temp-diff:start(catch)');\n try {\n deleteTempDiff();\n trace('cleanup-temp-diff:done(catch)');\n } catch (cleanupError) {\n trace('cleanup-temp-diff:failed(catch)', getErrorSummary(cleanupError));\n console.error('โš ๏ธ ์ž„์‹œ diff ์ •๋ฆฌ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.');\n console.error(cleanupError);\n }\n\n trace('error-report:prepare', `service=${service}`);\n errorReportPath = writeErrorReport(error, {\n scope: 'review',\n args,\n extraSections: [\n {\n heading: 'Execution Context',\n markdown: `\\`\\`\\`json\\n${JSON.stringify(\n {\n service,\n selectedCommitSummary: selectedCommitSummary || null,\n reviewTargetFiles,\n command: command || null,\n tempDiffPath,\n savedDiffPath: savedDiffPath || null,\n savedReportPath: savedReportPath || null\n },\n null,\n 2\n )}\\n\\`\\`\\``\n }\n ]\n });\n\n console.error('โŒ ๋ฆฌ๋ทฐ ๋„์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.');\n console.error(error);\n\n if (errorReportPath) {\n console.error(`๐Ÿ“„ ์—๋Ÿฌ ๋กœ๊ทธ ์ €์žฅ ์œ„์น˜: ${errorReportPath}`);\n }\n\n process.exit(1);\n }\n}\n\nmain();\n"]}
1
+ {"version":3,"sources":["../../src/common/helper.ts","../../src/pr-review/claude/claude-commander.ts","../../src/pr-review/claude/installation-claude.ts","../../src/pr-review/codex/codex-commander.ts","../../src/pr-review/codex/installation-codex.ts","../../src/pr-review/gemini/gemini-commander.ts","../../src/pr-review/gemini/installation-gemini.ts","../../src/pr-review/review.ts"],"names":["__dirname","path","fileURLToPath","fs","args","execFileSync","inspect","execSync","readline","tempDiffPath","reviewFormPath","trace","ALLOWED_REASONING_EFFORTS","shellQuote","getArgValue","printNotice","normalizeEffort","resolveReasoningEffort","toUnique","resolvePrimaryAlias","getAliasFallbacks"],"mappings":"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","file":"review.cjs","sourcesContent":["import { execFileSync, execSync } from 'child_process';\nimport fs from 'fs';\nimport path from 'path';\nimport readline from 'readline';\nimport { fileURLToPath } from 'url';\nimport { inspect } from 'util';\n\nimport { AIServiceType, CommitOption, MultiSelectOption } from './types';\n\ntype ErrorReportSection = {\n heading: string;\n markdown: string;\n};\n\ntype WriteErrorReportOptions = {\n title?: string;\n scope?: string;\n args?: string[];\n traceMessages?: string[];\n extraSections?: ErrorReportSection[];\n};\n\ntype ExecutionLogStatus = 'cancelled' | 'failed' | 'partial_failure' | 'success';\n\ntype WriteExecutionLogOptions = {\n title?: string;\n scope?: string;\n status?: ExecutionLogStatus;\n args?: string[];\n startedAt?: Date;\n finishedAt?: Date;\n traceMessages?: string[];\n extraSections?: ErrorReportSection[];\n error?: unknown;\n};\n\ntype GitCommandOptions = {\n allowFailure?: boolean;\n trimOutput?: boolean;\n};\n\ntype ShellCommandProgressOptions = {\n progressIntervalMs?: number;\n progressMessage?: string;\n streamOutput?: boolean;\n};\n\ntype ShellCommandFailureDetails = {\n code: number | null;\n command: string;\n signal: NodeJS.Signals | null;\n stderr: string;\n stdout: string;\n};\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst traceMessages: string[] = [];\nconst GEMINI_CLI_PACKAGE_NAME = 'sales-frontend-gemini-cli';\nlet cachedPackageRootPath = '';\n\n/**\n * @description\n * ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ gemini-cli ํŒจํ‚ค์ง€ ๋ฃจํŠธ์ธ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.\n * ๋ฒˆ๋“ค ๊ฒฐ๊ณผ๋ฌผ์—์„œ helper ์ฝ”๋“œ๊ฐ€ ๊ฐ ์—”ํŠธ๋ฆฌ ํŒŒ์ผ๋กœ ์ธ๋ผ์ธ๋˜๋ฉด `__dirname` ๊ธฐ์ค€์ ์ด ๋‹ฌ๋ผ์ง€๋ฏ€๋กœ,\n * package.json ์ด๋ฆ„์œผ๋กœ ์‹ค์ œ ํŒจํ‚ค์ง€ ๋ฃจํŠธ๋ฅผ ์‹๋ณ„ํ•ด์•ผ ๊ทœ์น™/์–‘์‹ ํŒŒ์ผ ๊ฒฝ๋กœ๊ฐ€ ๊นจ์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.\n * @param directory ๊ฒ€์‚ฌํ•  ๋””๋ ‰ํ„ฐ๋ฆฌ ๊ฒฝ๋กœ\n * @returns ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ gemini-cli ํŒจํ‚ค์ง€ ๋ฃจํŠธ์ด๋ฉด true\n */\nfunction isGeminiCliPackageRoot(directory: string) {\n const packageJsonPath = path.join(directory, 'package.json');\n\n if (!fs.existsSync(packageJsonPath)) {\n return false;\n }\n\n try {\n const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')) as { name?: string };\n\n return packageJson.name === GEMINI_CLI_PACKAGE_NAME;\n } catch {\n return false;\n }\n}\n\n/**\n * @description\n * ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ๋ฒˆ๋“ค ์—”ํŠธ๋ฆฌ ๊ธฐ์ค€์œผ๋กœ gemini-cli ํŒจํ‚ค์ง€ ๋ฃจํŠธ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.\n * `dist/pr-review/review.js`, `dist/pr-review/gemini/gemini-commander.js`์ฒ˜๋Ÿผ\n * ์—”ํŠธ๋ฆฌ ์œ„์น˜๊ฐ€ ๋‹ฌ๋ผ๋„ ์ƒ์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ์ˆœํšŒํ•˜๋ฉฐ package root๋ฅผ ์ฐพ๋„๋ก ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค.\n * @param startDirectory ํŒจํ‚ค์ง€ ๋ฃจํŠธ ํƒ์ƒ‰์„ ์‹œ์ž‘ํ•  ๋””๋ ‰ํ„ฐ๋ฆฌ\n * @returns ๊ทœ์น™/์–‘์‹ ํŒŒ์ผ์ด ์กด์žฌํ•˜๋Š” gemini-cli ํŒจํ‚ค์ง€ ๋ฃจํŠธ ๊ฒฝ๋กœ\n */\nfunction resolveGeminiCliPackageRoot(startDirectory: string = __dirname) {\n if (cachedPackageRootPath) {\n return cachedPackageRootPath;\n }\n\n let currentDirectory = startDirectory;\n\n while (true) {\n if (isGeminiCliPackageRoot(currentDirectory)) {\n cachedPackageRootPath = currentDirectory;\n\n return cachedPackageRootPath;\n }\n\n const parentDirectory = path.dirname(currentDirectory);\n\n if (parentDirectory === currentDirectory) {\n break;\n }\n\n currentDirectory = parentDirectory;\n }\n\n /**\n * @description\n * package.json ํƒ์ƒ‰์ด ์‹คํŒจํ•ด๋„ ๊ธฐ์กด ์„ค์น˜ ๊ตฌ์กฐ(dist/common -> package root)๋ฅผ ์šฐ์„  fallback์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.\n * ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ๋„ ์ตœ๋Œ€ํ•œ ๊ธฐ์กด ๋™์ž‘์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ณด์ˆ˜์  ์•ˆ์ „์žฅ์น˜์ž…๋‹ˆ๋‹ค.\n */\n cachedPackageRootPath = path.resolve(startDirectory, '../..');\n\n return cachedPackageRootPath;\n}\n\n/**\n * @description\n * gemini-cli ํŒจํ‚ค์ง€ ๋ฃจํŠธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •์  asset ํŒŒ์ผ์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ๋ฅผ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.\n * ๋ฒˆ๋“ค ๊ณผ์ •์—์„œ helper ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅธ ์—”ํŠธ๋ฆฌ์— ์ธ๋ผ์ธ๋˜์–ด๋„ ํ•ญ์ƒ ๊ฐ™์€ ์‹ค์ œ ํŒŒ์ผ์„ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.\n * @param relativeFilePath ํŒจํ‚ค์ง€ ๋ฃจํŠธ ๊ธฐ์ค€ ์ƒ๋Œ€ ๊ฒฝ๋กœ\n * @returns asset ํŒŒ์ผ์˜ ์ ˆ๋Œ€ ๊ฒฝ๋กœ\n */\nfunction resolvePackageAssetPath(relativeFilePath: string) {\n return path.resolve(resolveGeminiCliPackageRoot(), relativeFilePath);\n}\n\nexport const rulesPath = resolvePackageAssetPath('src/common/rules/review-rules.md');\nexport const namingRulesPath = resolvePackageAssetPath('src/common/rules/naming-rule.md');\nexport const codingConventionRulesPath = resolvePackageAssetPath('src/common/rules/coding-convention.md');\nexport const reviewFormPath = resolvePackageAssetPath('src/common/form/review-form.md');\nexport const reviewFormOneByOnePath = resolvePackageAssetPath('src/common/form/review-form-one-by-one.md');\nexport const REPORT_DIR = '.review-report';\nexport const tempDiffPath = 'temp_diff.txt';\nexport const AIServices: AIServiceType[] = ['gemini', 'claude', 'codex'];\nexport const COMMIT_FETCH_LIMIT = 20;\nexport const COMMIT_SELECTION_WINDOW = 8;\nexport const ignoreList = [\n 'package.json',\n '*.yml',\n '*.md',\n '*.lock',\n 'dist/',\n 'node_modules/',\n 'assets/',\n 'public/',\n '*.json',\n '*.yaml',\n '.review-report/' // ์ƒ์„ฑ๋˜๋Š” ๋ฆฌํฌํŠธ ํด๋”๋„ ์ œ์™ธ\n];\n\nexport function isTestMode(args: string[] = process.argv.slice(2)) {\n return args.includes('--test');\n}\n\n/**\n * @description\n * AI CLI์˜ ์ค‘๊ฐ„ stdout/stderr๋ฅผ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ„ฐ๋ฏธ๋„์— ๋…ธ์ถœํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค.\n * ๊ธฐ๋ณธ ์‹คํ–‰์€ ์กฐ์šฉํ•œ ๋ชจ๋“œ๋กœ ์œ ์ง€ํ•˜๊ณ , ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…์‹œ์ ์œผ๋กœ ํ”Œ๋ž˜๊ทธ๋ฅผ ์ค„ ๋•Œ๋งŒ\n * AI ์‘๋‹ต์„ ๊ทธ๋Œ€๋กœ ์ŠคํŠธ๋ฆฌ๋ฐํ•ฉ๋‹ˆ๋‹ค.\n * @param args ํ˜„์žฌ ์‹คํ–‰ ์ธ์ž ๋ชฉ๋ก\n * @returns ์‹ค์‹œ๊ฐ„ AI ์ถœ๋ ฅ ๋…ธ์ถœ ์—ฌ๋ถ€\n */\nexport function shouldStreamAIOutput(args: string[] = process.argv.slice(2)) {\n return args.includes('--stream-output');\n}\n\nexport function clearTraceMessages() {\n traceMessages.length = 0;\n}\n\nexport function getTraceMessages() {\n return [...traceMessages];\n}\n\n/**\n * @description\n * ํ„ฐ๋ฏธ๋„ ์„ ํƒ UI์—์„œ ๋™์ผํ•œ ์ƒ‰์ƒ ํ† ํฐ์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ANSI escape code๋ฅผ ์ƒ์ˆ˜ํ™”ํ•ฉ๋‹ˆ๋‹ค.\n * ์„œ๋น„์Šค ์„ ํƒ๊ณผ ์ปค๋ฐ‹ ์„ ํƒ์ด ๊ฐ™์€ ์‹œ๊ฐ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก helper ๋‚ด๋ถ€์—์„œ๋งŒ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.\n */\nconst ANSI = {\n bold: '\\u001b[1m',\n cyan: '\\u001b[36m',\n dim: '\\u001b[2m',\n green: '\\u001b[32m',\n reset: '\\u001b[0m',\n yellow: '\\u001b[33m'\n} as const;\nconst ANSI_PATTERN = new RegExp(`${String.fromCharCode(27)}\\\\[[0-9;]*m`, 'g');\nconst COMBINING_MARK_PATTERN = /\\p{Mark}/u;\nconst GRAPHEME_SEGMENTER =\n typeof Intl !== 'undefined' && 'Segmenter' in Intl ? new Intl.Segmenter('ko', { granularity: 'grapheme' }) : null;\n\ntype VisibleToken = {\n value: string;\n visibleWidth: number;\n};\n\n/**\n * @description\n * ๋ฆฌ๋ทฐ ๋Œ€์ƒ ํŒŒ์ผ ํ•„ํ„ฐ๋ฅผ pathspec ๋ฐฐ์—ด ํ˜•ํƒœ๋กœ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.\n * ๋ฌธ์ž์—ด ์ปค๋งจ๋“œ์™€ argv ๊ธฐ๋ฐ˜ git ์‹คํ–‰์ด ๋ชจ๋‘ ๊ฐ™์€ ๊ธฐ์ค€์„ ๊ณต์œ ํ•˜๋„๋ก ์›๋ณธ ํŒจํ„ด์€ ๋ฐฐ์—ด๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.\n */\nfunction getGitDiffPathspecs() {\n return {\n excludePatterns: ignoreList.map((item) => `:(exclude)${item}`),\n includePatterns: ['*.ts', '*.tsx', '*.js', '*.jsx']\n };\n}\n\nfunction segmentGraphemes(value: string) {\n if (!GRAPHEME_SEGMENTER) {\n return [...value];\n }\n\n return [...GRAPHEME_SEGMENTER.segment(value)].map(({ segment }) => segment);\n}\n\nfunction isWideCodePoint(codePoint: number) {\n return (\n codePoint >= 0x1100 &&\n (codePoint <= 0x115f ||\n codePoint === 0x2329 ||\n codePoint === 0x232a ||\n (codePoint >= 0x2e80 && codePoint <= 0x3247 && codePoint !== 0x303f) ||\n (codePoint >= 0x3250 && codePoint <= 0x4dbf) ||\n (codePoint >= 0x4e00 && codePoint <= 0xa4c6) ||\n (codePoint >= 0xa960 && codePoint <= 0xa97c) ||\n (codePoint >= 0xac00 && codePoint <= 0xd7a3) ||\n (codePoint >= 0xf900 && codePoint <= 0xfaff) ||\n (codePoint >= 0xfe10 && codePoint <= 0xfe19) ||\n (codePoint >= 0xfe30 && codePoint <= 0xfe6b) ||\n (codePoint >= 0xff01 && codePoint <= 0xff60) ||\n (codePoint >= 0xffe0 && codePoint <= 0xffe6) ||\n (codePoint >= 0x1f200 && codePoint <= 0x1f251) ||\n (codePoint >= 0x20000 && codePoint <= 0x3fffd))\n );\n}\n\nfunction isEmojiCodePoint(codePoint: number) {\n return (\n (codePoint >= 0x1f1e6 && codePoint <= 0x1f1ff) ||\n (codePoint >= 0x1f300 && codePoint <= 0x1faff) ||\n (codePoint >= 0x2600 && codePoint <= 0x27bf)\n );\n}\n\nfunction getGraphemeWidth(grapheme: string) {\n let width = 0;\n\n for (const character of grapheme) {\n const codePoint = character.codePointAt(0);\n\n if (!codePoint || COMBINING_MARK_PATTERN.test(character) || codePoint === 0x200d) {\n continue;\n }\n\n if ((codePoint >= 0xfe00 && codePoint <= 0xfe0f) || (codePoint >= 0xe0100 && codePoint <= 0xe01ef)) {\n continue;\n }\n\n if (isWideCodePoint(codePoint) || isEmojiCodePoint(codePoint)) {\n width = Math.max(width, 2);\n\n continue;\n }\n\n width = Math.max(width, 1);\n }\n\n return width;\n}\n\nfunction tokenizePlainText(value: string) {\n return segmentGraphemes(value).map((segment) => ({\n value: segment,\n visibleWidth: getGraphemeWidth(segment)\n }));\n}\n\nfunction tokenizeVisibleText(value: string) {\n const tokens: VisibleToken[] = [];\n let lastIndex = 0;\n\n for (const match of value.matchAll(ANSI_PATTERN)) {\n const index = match.index ?? 0;\n\n if (index > lastIndex) {\n tokens.push(...tokenizePlainText(value.slice(lastIndex, index)));\n }\n\n tokens.push({\n value: match[0],\n visibleWidth: 0\n });\n lastIndex = index + match[0].length;\n }\n\n if (lastIndex < value.length) {\n tokens.push(...tokenizePlainText(value.slice(lastIndex)));\n }\n\n return tokens;\n}\n\n/**\n * @description\n * ๋ชจ๋‹ฌ ๊ฐ ์ค„์ด ํ„ฐ๋ฏธ๋„ ์‹ค์ œ ํญ์„ ๋„˜์ง€ ์•Š๋„๋ก ANSI ์ฝ”๋“œ๋ฅผ ๋ณด์กดํ•œ ์ฑ„ ์ž˜๋ผ๋ƒ…๋‹ˆ๋‹ค.\n * ์ค„๋ฐ”๊ฟˆ์ด ๋ฐœ์ƒํ•˜๋ฉด ๋ Œ๋” ์ค„ ์ˆ˜ ๊ณ„์‚ฐ์ด ์–ด๊ธ‹๋‚˜๋ฏ€๋กœ, ๋ชจ๋“  ์„ ํƒ ์ค„์„ 1 physical line๋กœ ๊ฐ•์ œํ•ฉ๋‹ˆ๋‹ค.\n * @param value ๋ Œ๋”ํ•  ๋ฌธ์ž์—ด\n * @param maxWidth ํ—ˆ์šฉ ์ตœ๋Œ€ ํ‘œ์‹œ ํญ\n * @returns ํ„ฐ๋ฏธ๋„ ํญ ์•ˆ์œผ๋กœ ์ •๋ฆฌ๋œ ๋ฌธ์ž์—ด\n */\nfunction truncateLineForTerminal(value: string, maxWidth: number) {\n if (maxWidth <= 0) {\n return '';\n }\n\n const tokens = tokenizeVisibleText(value);\n const totalWidth = tokens.reduce((sum, token) => sum + token.visibleWidth, 0);\n\n if (totalWidth <= maxWidth) {\n return value;\n }\n\n const ellipsis = '...';\n const ellipsisWidth = 3;\n const targetWidth = Math.max(0, maxWidth - ellipsisWidth);\n let usedWidth = 0;\n let result = '';\n\n for (const token of tokens) {\n if (token.visibleWidth === 0) {\n result += token.value;\n\n continue;\n }\n\n if (usedWidth + token.visibleWidth > targetWidth) {\n break;\n }\n\n result += token.value;\n usedWidth += token.visibleWidth;\n }\n\n return `${result}${ellipsis}${ANSI.reset}`;\n}\n\nfunction fitLinesToTerminal(lines: string[]) {\n const maxWidth = Math.max(20, (process.stdout.columns || 120) - 1);\n\n return lines.map((line) => truncateLineForTerminal(line, maxWidth));\n}\n\n/**\n * @description\n * git ์„œ๋ธŒํ”„๋กœ์„ธ์Šค๋ฅผ argv ๋ฐฐ์—ด ๊ธฐ๋ฐ˜์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.\n * ์ปค๋ฐ‹ ํ•ด์‹œ๋‚˜ ํŒŒ์ผ ๊ฒฝ๋กœ์— ๊ณต๋ฐฑ์ด ์„ž์—ฌ๋„ shell quoting ๋ฌธ์ œ ์—†์ด ๋™์ผํ•œ ๋™์ž‘์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๊ณตํ†ต helper๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.\n * @param args git ์ธ์ž ๋ฐฐ์—ด\n * @param options ์‹คํŒจ ํ—ˆ์šฉ ์—ฌ๋ถ€์™€ ์ถœ๋ ฅ trim ์—ฌ๋ถ€\n * @returns git ํ‘œ์ค€์ถœ๋ ฅ ๋ฌธ์ž์—ด\n */\nfunction runGitCommand(args: string[], options: GitCommandOptions = {}) {\n const { allowFailure = false, trimOutput = true } = options;\n\n try {\n const output = execFileSync('git', args, {\n encoding: 'utf8',\n maxBuffer: 1024 * 1024 * 20,\n stdio: ['ignore', 'pipe', 'pipe']\n });\n\n return trimOutput ? output.trim() : output;\n } catch (error) {\n helperTrace('git-command:failed', `${args.join(' ')} | ${getErrorSummary(error)}`);\n\n if (allowFailure) {\n return '';\n }\n\n throw error;\n }\n}\n\n/**\n * @description\n * shell ๋ช…๋ น์„ ๋น„๋™๊ธฐ๋กœ ์‹คํ–‰ํ•˜๋ฉด์„œ stdout/stderr๋ฅผ ๊ทธ๋Œ€๋กœ ํ˜๋ ค๋ณด๋‚ด๊ณ , ์žฅ์‹œ๊ฐ„ ์ž‘์—…์—๋Š” ๊ฒฝ๊ณผ ์‹œ๊ฐ„์„ ์ฃผ๊ธฐ์ ์œผ๋กœ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.\n * review ์‹คํ–‰์ฒ˜๋Ÿผ ์‘๋‹ต ์ƒ์„ฑ๊นŒ์ง€ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” CLI๋ฅผ ๋ฒ„ํผ๋ง ์—†์ด ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ๋ฉˆ์ถค์œผ๋กœ ์˜คํ•ดํ•˜์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.\n * @param command ์‹คํ–‰ํ•  shell command ๋ฌธ์ž์—ด\n * @param options ์ง„ํ–‰ ๋ฉ”์‹œ์ง€์™€ ์ถœ๋ ฅ ์ฃผ๊ธฐ ์˜ต์…˜\n * @returns ์ตœ์ข… stdout/stderr ์บก์ฒ˜ ๊ฒฐ๊ณผ\n */\nexport async function executeShellCommandWithProgress(command: string, options: ShellCommandProgressOptions = {}) {\n const { progressIntervalMs = 10000, progressMessage = 'โณ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค...', streamOutput = false } = options;\n const { spawn } = await import('child_process');\n\n return new Promise<{ stderr: string; stdout: string }>((resolve, reject) => {\n let stdout = '';\n let stderr = '';\n const startedAt = Date.now();\n console.log(progressMessage);\n\n const child = spawn('/bin/zsh', ['-lc', command], {\n stdio: ['ignore', 'pipe', 'pipe']\n });\n\n const progressTimer = setInterval(() => {\n const elapsedSeconds = Math.max(1, Math.floor((Date.now() - startedAt) / 1000));\n console.log(`${progressMessage} (${elapsedSeconds}s ๊ฒฝ๊ณผ)`);\n }, progressIntervalMs);\n\n child.stdout.on('data', (chunk: Buffer | string) => {\n const text = chunk.toString();\n stdout += text;\n\n if (streamOutput) {\n process.stdout.write(text);\n }\n });\n\n child.stderr.on('data', (chunk: Buffer | string) => {\n const text = chunk.toString();\n stderr += text;\n\n if (streamOutput) {\n process.stderr.write(text);\n }\n });\n\n child.on('error', (error) => {\n clearInterval(progressTimer);\n reject(error);\n });\n\n child.on('close', (code, signal) => {\n clearInterval(progressTimer);\n\n if (code === 0) {\n resolve({\n stderr,\n stdout\n });\n\n return;\n }\n\n const exitSummary = signal ? `signal=${signal}` : `code=${String(code ?? 'unknown')}`;\n const failureDetails: ShellCommandFailureDetails = {\n code,\n command,\n signal,\n stderr,\n stdout\n };\n\n reject(createShellCommandExecutionError(failureDetails, exitSummary));\n });\n });\n}\n\n/**\n * @description\n * shell ๋ช…๋ น ์‹คํŒจ ์‹œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€์— ํฌํ•จํ•  ์ถœ๋ ฅ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.\n * ์ผ๋ถ€ CLI๋Š” ์‹คํŒจ ์‚ฌ์œ ๋ฅผ stderr๊ฐ€ ์•„๋‹ˆ๋ผ stdout์œผ๋กœ๋งŒ ์ถœ๋ ฅํ•˜๋ฏ€๋กœ, ๋‘ ์ฑ„๋„์„ ํ•จ๊ป˜ ํ™•์ธํ•ด์•ผ\n * ์›์ธ ํŒŒ์•…์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๊ธด ์‘๋‹ต์ด ๊ทธ๋Œ€๋กœ ์—๋Ÿฌ ์ œ๋ชฉ์— ๋ถ™์ง€ ์•Š๋„๋ก ๋งˆ์ง€๋ง‰ ์ผ๋ถ€๋งŒ ์ž˜๋ผ๋ƒ…๋‹ˆ๋‹ค.\n * @param failureDetails ์‹คํŒจํ•œ shell ๋ช…๋ น์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ\n * @returns ์—๋Ÿฌ ๋ฉ”์‹œ์ง€์— ๋ถ™์ผ ์ถœ๋ ฅ ์š”์•ฝ ๋ฌธ์ž์—ด\n */\nfunction getShellCommandFailurePreview(failureDetails: ShellCommandFailureDetails) {\n const stderrText = failureDetails.stderr.trim();\n const stdoutText = failureDetails.stdout.trim();\n const combinedOutput = stderrText || stdoutText;\n\n if (!combinedOutput) {\n return '';\n }\n\n const MAX_PREVIEW_LENGTH = 4000;\n\n if (combinedOutput.length <= MAX_PREVIEW_LENGTH) {\n return combinedOutput;\n }\n\n return combinedOutput.slice(-MAX_PREVIEW_LENGTH);\n}\n\n/**\n * @description\n * shell ๋ช…๋ น ์‹คํŒจ ์ •๋ณด๋ฅผ Error ๊ฐ์ฒด๋กœ ์Šน๊ฒฉํ•ฉ๋‹ˆ๋‹ค.\n * ์—๋Ÿฌ ๋ฆฌํฌํŠธ์—์„œ ์‹ค์ œ ์‹คํŒจ ์›์ธ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก stdout/stderr/command/exit code๋ฅผ\n * Error ์ธ์Šคํ„ด์Šค์— ์ง์ ‘ ๋ถ€์ฐฉํ•ฉ๋‹ˆ๋‹ค.\n * @param failureDetails ์‹คํŒจํ•œ shell ๋ช…๋ น์˜ ์‹คํ–‰ ๊ฒฐ๊ณผ\n * @param exitSummary ์ข…๋ฃŒ ์ฝ”๋“œ ๋˜๋Š” ์‹œ๊ทธ๋„ ์š”์•ฝ\n * @returns ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋ถ€์ฐฉ๋œ Error ๊ฐ์ฒด\n */\nfunction createShellCommandExecutionError(failureDetails: ShellCommandFailureDetails, exitSummary: string) {\n const failurePreview = getShellCommandFailurePreview(failureDetails);\n const error = new Error(`์‰˜ ๋ช…๋ น ์‹คํ–‰ ์‹คํŒจ (${exitSummary})${failurePreview ? `\\n${failurePreview}` : ''}`) as Error &\n Record<string, unknown>;\n\n error.code = failureDetails.code;\n error.signal = failureDetails.signal;\n error.stdout = failureDetails.stdout;\n error.stderr = failureDetails.stderr;\n error.command = failureDetails.command;\n\n return error;\n}\n\n/**\n * @description\n * ๋ฆฌ๋ทฐ ๋Œ€์ƒ ํŒŒ์ผ ๋ชฉ๋ก์„ ํ•œ ์ค„ ์š”์•ฝ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.\n * ํŒŒ์ผ์ด ๋งŽ์„ ๋•Œ๋Š” ์ผ๋ถ€๋งŒ ๋…ธ์ถœํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๊ฐœ์ˆ˜๋กœ ์ถ•์•ฝํ•ด ํ„ฐ๋ฏธ๋„ ์ถœ๋ ฅ์ด ๊ณผ๋„ํ•˜๊ฒŒ ๊ธธ์–ด์ง€์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.\n * @param files ๋ฆฌ๋ทฐ ๋Œ€์ƒ ํŒŒ์ผ ๋ชฉ๋ก\n * @param visibleCount ํ„ฐ๋ฏธ๋„์— ์ง์ ‘ ๋ณด์—ฌ์ค„ ์ตœ๋Œ€ ํŒŒ์ผ ์ˆ˜\n * @returns ํ™”๋ฉด ํ‘œ์‹œ์šฉ ์š”์•ฝ ๋ฌธ์ž์—ด\n */\nexport function formatReviewTargetFiles(files: string[], visibleCount = 5) {\n if (files.length === 0) {\n return '(์—†์Œ)';\n }\n\n const visibleFiles = files.slice(0, visibleCount);\n const hiddenCount = Math.max(0, files.length - visibleFiles.length);\n\n if (hiddenCount === 0) {\n return visibleFiles.join(', ');\n }\n\n return `${visibleFiles.join(', ')} ์™ธ ${hiddenCount}๊ฐœ`;\n}\n\nexport function createTraceLogger(scope: string, args: string[] = process.argv.slice(2)) {\n const enabled = isTestMode(args);\n\n return (step: string, detail?: string) => {\n const timestamp = new Date().toISOString();\n const message = `[${timestamp}][TRACE][${scope}] ${step}${detail ? ` | ${detail}` : ''}`;\n traceMessages.push(message);\n\n if (!enabled) {\n return;\n }\n\n console.log(message);\n };\n}\n\nconst helperTrace = createTraceLogger('helper');\n\nfunction getTimestampParts(now = new Date()) {\n return {\n YYYY: now.getFullYear(),\n MM: String(now.getMonth() + 1).padStart(2, '0'),\n DD: String(now.getDate()).padStart(2, '0'),\n HH: String(now.getHours()).padStart(2, '0'),\n mm: String(now.getMinutes()).padStart(2, '0'),\n ss: String(now.getSeconds()).padStart(2, '0')\n };\n}\n\nfunction getHumanReadableNowString(now = new Date()) {\n const { YYYY, MM, DD, HH, mm, ss } = getTimestampParts(now);\n\n return `${YYYY}-${MM}-${DD} ${HH}:${mm}:${ss}`;\n}\n\nfunction stringifyUnknown(value: unknown) {\n if (value === undefined || value === null) {\n return '';\n }\n\n if (typeof value === 'string') {\n return value;\n }\n\n if (Buffer.isBuffer(value)) {\n return value.toString();\n }\n\n if (value instanceof Error) {\n return value.stack || value.message;\n }\n\n return inspect(value, { depth: 5, breakLength: 120 });\n}\n\nexport function getErrorSummary(error: unknown) {\n if (error instanceof Error) {\n return `${error.name}: ${error.message}`;\n }\n\n return stringifyUnknown(error) || 'Unknown error';\n}\n\nfunction serializeError(error: unknown) {\n const serialized: Record<string, unknown> = {\n summary: getErrorSummary(error)\n };\n\n if (error instanceof Error) {\n serialized.name = error.name;\n serialized.message = error.message;\n serialized.stack = error.stack;\n } else {\n serialized.value = stringifyUnknown(error);\n }\n\n if (error && typeof error === 'object') {\n const errorLike = error as Record<string, unknown>;\n const extraKeys = ['code', 'errno', 'syscall', 'path', 'cmd', 'status', 'signal', 'spawnargs', 'command'];\n\n extraKeys.forEach((key) => {\n if (errorLike[key] !== undefined) {\n serialized[key] = errorLike[key];\n }\n });\n\n const stdout = stringifyUnknown(errorLike.stdout);\n if (stdout) {\n serialized.stdout = stdout;\n }\n\n const stderr = stringifyUnknown(errorLike.stderr);\n if (stderr) {\n serialized.stderr = stderr;\n }\n\n const cause = stringifyUnknown(errorLike.cause);\n if (cause) {\n serialized.cause = cause;\n }\n }\n\n return serialized;\n}\n\nexport function getNextFilePath(dir: string, baseName: string, extension: string) {\n let counter = 1;\n // eslint-disable-next-line no-constant-condition\n while (true) {\n const filePath = path.join(dir, `${baseName}-${counter}${extension}`);\n if (!fs.existsSync(filePath)) {\n return filePath;\n }\n counter++;\n }\n}\n\nexport function getAvailableFilePath(dir: string, baseName: string, extension: string) {\n const firstFilePath = path.join(dir, `${baseName}${extension}`);\n if (!fs.existsSync(firstFilePath)) {\n return firstFilePath;\n }\n\n return getNextFilePath(dir, baseName, extension);\n}\n\nexport function deleteFile(filePath: string) {\n if (fs.existsSync(filePath)) {\n fs.unlinkSync(filePath);\n }\n}\n\n/**\n * ์ž„์‹œํŒŒ์ผ ์‚ญ์ œ\n */\nexport function deleteTempDiff() {\n deleteFile(tempDiffPath);\n}\n\n/**\n * ๋ฆฌ๋ทฐ ๊ฒฐ๊ณผ ํด๋” ์ƒ์„ฑ\n */\nexport function createReportDirectory() {\n if (!fs.existsSync(REPORT_DIR)) {\n fs.mkdirSync(REPORT_DIR, { recursive: true });\n }\n}\n\n/**\n * ํ˜„์žฌ ์‹œ๊ฐ„ ๋ฌธ์ž์—ด ์ƒ์„ฑ\n */\nexport function getNowString(now = new Date()) {\n const { YYYY, MM, DD, HH, mm, ss } = getTimestampParts(now);\n\n return `${YYYY}-${MM}-${DD}_${HH}-${mm}-${ss}`;\n}\n\nexport function getErrorLogTimestamp(now = new Date()) {\n const { YYYY, MM, DD, HH, mm, ss } = getTimestampParts(now);\n\n return `${YYYY}-${MM}-${DD}-${HH}์‹œ-${mm}๋ถ„-${ss}์ดˆ`;\n}\n\nexport function writeErrorReport(error: unknown, options: WriteErrorReportOptions = {}) {\n try {\n const now = new Date();\n helperTrace('error-report:write:start', options.scope || 'unknown');\n createReportDirectory();\n\n const reportPath = getAvailableFilePath(REPORT_DIR, `error-log-${getErrorLogTimestamp(now)}`, '.md');\n const serializedError = serializeError(error);\n const traceSnapshot = options.traceMessages ?? getTraceMessages();\n const extraSections = options.extraSections || [];\n\n const report = `# Error Log\n\n- ๋ฐœ์ƒ ์‹œ๊ฐ: ${getHumanReadableNowString(now)}\n- Scope: \\`${options.scope || 'unknown'}\\`\n- ์ž‘์—… ๊ฒฝ๋กœ: \\`${process.cwd()}\\`\n- ์‹คํ–‰ ์ธ์ž: \\`${JSON.stringify(options.args ?? process.argv.slice(2))}\\`\n- ์‹คํ–‰ ํ™˜๊ฒฝ: \\`${process.platform} ${process.arch} / Node ${process.version}\\`\n\n## Summary\n\n${options.title || serializedError.summary || 'Unknown error'}\n\n## Error\n\n\\`\\`\\`json\n${JSON.stringify(serializedError, null, 2)}\n\\`\\`\\`\n\n## Trace\n\n\\`\\`\\`json\n${JSON.stringify(traceSnapshot, null, 2)}\n\\`\\`\\`${extraSections.length ? `\\n${extraSections.map((section) => `\\n## ${section.heading}\\n\\n${section.markdown}`).join('\\n')}\\n` : '\\n'}\n`;\n\n fs.writeFileSync(reportPath, report);\n helperTrace('error-report:write:done', reportPath);\n\n return reportPath;\n } catch (writeError) {\n console.error('โš ๏ธ ์—๋Ÿฌ ๋กœ๊ทธ ํŒŒ์ผ ์ƒ์„ฑ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.');\n console.error(writeError);\n\n return '';\n }\n}\n\nfunction getExecutionLogSummary(status: ExecutionLogStatus, title?: string) {\n if (title) {\n return title;\n }\n\n switch (status) {\n case 'success':\n return '๋ฆฌ๋ทฐ ์‹คํ–‰์ด ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.';\n case 'failed':\n return '๋ฆฌ๋ทฐ ์‹คํ–‰ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.';\n case 'partial_failure':\n return '๋ฆฌ๋ทฐ ์‹คํ–‰์€ ์™„๋ฃŒ๋˜์—ˆ์ง€๋งŒ ์ผ๋ถ€ ๋‹จ๊ณ„์—์„œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.';\n default:\n return '๋ฆฌ๋ทฐ ์‹คํ–‰์ด ์ทจ์†Œ๋˜์—ˆ๊ฑฐ๋‚˜ ๋ฆฌ๋ทฐ ๋Œ€์ƒ์ด ์—†์–ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.';\n }\n}\n\nfunction formatExecutionDuration(startedAt: Date, finishedAt: Date) {\n const durationMs = Math.max(0, finishedAt.getTime() - startedAt.getTime());\n\n if (durationMs < 1000) {\n return `${durationMs}ms`;\n }\n\n const durationSeconds = durationMs / 1000;\n\n if (durationSeconds < 60) {\n return `${durationSeconds.toFixed(1)}s`;\n }\n\n const minutes = Math.floor(durationSeconds / 60);\n const seconds = Math.round(durationSeconds % 60);\n\n return `${minutes}m ${seconds}s`;\n}\n\n/**\n * @description\n * ์„ฑ๊ณต/์‹คํŒจ ์—ฌ๋ถ€์™€ ๋ฌด๊ด€ํ•˜๊ฒŒ ๋ฆฌ๋ทฐ ์‹คํ–‰ ์ž์ฒด์˜ ์ง„๋‹จ ๋กœ๊ทธ๋ฅผ `.review-report`์— ๋‚จ๊น๋‹ˆ๋‹ค.\n * ์—๋Ÿฌ ๋กœ๊ทธ์™€ ๋ณ„๋„๋กœ ์‹คํ–‰ ๋งฅ๋ฝ, ์ƒ์„ฑ๋œ ๋ช…๋ น์–ด, trace๋ฅผ ํ•ญ์ƒ ๋ณด์กดํ•˜์—ฌ ์žฌํ˜„๊ณผ ์›์ธ ๋ถ„์„์— ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.\n * @param options ์‹คํ–‰ ์ƒํƒœ, ์‹œ์ž‘/์ข…๋ฃŒ ์‹œ๊ฐ, ์—๋Ÿฌ, ์ถ”๊ฐ€ ์„น์…˜ ๋“ฑ ์‹คํ–‰ ๋กœ๊ทธ ์ž‘์„ฑ ์˜ต์…˜\n * @returns ์ƒ์„ฑ๋œ ์‹คํ–‰ ๋กœ๊ทธ ํŒŒ์ผ ๊ฒฝ๋กœ. ์‹คํŒจ ์‹œ ๋นˆ ๋ฌธ์ž์—ด\n */\nexport function writeExecutionLog(options: WriteExecutionLogOptions = {}) {\n try {\n const startedAt = options.startedAt ?? new Date();\n const finishedAt = options.finishedAt ?? new Date();\n const status = options.status ?? 'success';\n helperTrace('execution-log:write:start', options.scope || 'unknown');\n createReportDirectory();\n\n const reportPath = getAvailableFilePath(REPORT_DIR, `${getNowString(finishedAt)}-execution-log`, '.md');\n const traceSnapshot = options.traceMessages ?? getTraceMessages();\n const extraSections = options.extraSections || [];\n const serializedError = options.error ? serializeError(options.error) : null;\n\n const report = `# Execution Log\n\n- ์‹œ์ž‘ ์‹œ๊ฐ: ${getHumanReadableNowString(startedAt)}\n- ์ข…๋ฃŒ ์‹œ๊ฐ: ${getHumanReadableNowString(finishedAt)}\n- ์‹คํ–‰ ์‹œ๊ฐ„: ${formatExecutionDuration(startedAt, finishedAt)}\n- ์ƒํƒœ: \\`${status}\\`\n- Scope: \\`${options.scope || 'unknown'}\\`\n- ์ž‘์—… ๊ฒฝ๋กœ: \\`${process.cwd()}\\`\n- ์‹คํ–‰ ์ธ์ž: \\`${JSON.stringify(options.args ?? process.argv.slice(2))}\\`\n- ์‹คํ–‰ ํ™˜๊ฒฝ: \\`${process.platform} ${process.arch} / Node ${process.version}\\`\n\n## Summary\n\n${getExecutionLogSummary(status, options.title)}\n${serializedError ? `\\n\\n## Error\\n\\n\\`\\`\\`json\\n${JSON.stringify(serializedError, null, 2)}\\n\\`\\`\\`` : ''}\n\n## Trace\n\n\\`\\`\\`json\n${JSON.stringify(traceSnapshot, null, 2)}\n\\`\\`\\`${extraSections.length ? `\\n${extraSections.map((section) => `\\n## ${section.heading}\\n\\n${section.markdown}`).join('\\n')}\\n` : '\\n'}\n`;\n\n fs.writeFileSync(reportPath, report);\n helperTrace('execution-log:write:done', reportPath);\n\n return reportPath;\n } catch (writeError) {\n console.error('โš ๏ธ ์‹คํ–‰ ๋กœ๊ทธ ํŒŒ์ผ ์ƒ์„ฑ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.');\n console.error(writeError);\n\n return '';\n }\n}\n\nexport function exitWithError(\n message: string,\n options: Omit<WriteErrorReportOptions, 'title'> & { error?: unknown } = {}\n): never {\n const reportPath = writeErrorReport(options.error || new Error(message), {\n ...options,\n title: message\n });\n\n console.error(message);\n\n if (options.error) {\n console.error(options.error);\n }\n\n if (reportPath) {\n console.error(`๐Ÿ“„ ์—๋Ÿฌ ๋กœ๊ทธ ์ €์žฅ ์œ„์น˜: ${reportPath}`);\n }\n\n process.exit(1);\n}\n\nfunction parseServiceFromArgs(args: string[] = process.argv.slice(2)): AIServiceType | '' {\n helperTrace('parse-service:start', `args=${JSON.stringify(args)}`);\n const serviceIndex = args.indexOf('--service');\n const rawService = serviceIndex !== -1 ? args[serviceIndex + 1] : '';\n\n if (!rawService) {\n helperTrace('parse-service:empty');\n\n return '';\n }\n\n const normalizedService = rawService.toLowerCase();\n\n if (AIServices.includes(normalizedService as AIServiceType)) {\n helperTrace('parse-service:resolved', normalizedService);\n\n return normalizedService as AIServiceType;\n }\n\n helperTrace('parse-service:invalid', rawService);\n exitWithError(\n `โŒ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค: ${rawService}. ์‚ฌ์šฉ ๊ฐ€๋Šฅ ๊ฐ’: ${AIServices.join(', ')} (์˜ˆ: --service codex)`,\n {\n scope: 'helper:parseServiceFromArgs',\n args,\n extraSections: [\n {\n heading: 'Allowed Services',\n markdown: `\\`\\`\\`json\\n${JSON.stringify(AIServices, null, 2)}\\n\\`\\`\\``\n }\n ]\n }\n );\n}\n\nexport function getGitDiffFilter() {\n const { includePatterns, excludePatterns } = getGitDiffPathspecs();\n const quote = (pattern: string) => `\"${pattern}\"`;\n const includeParams = includePatterns.map(quote).join(' ');\n const excludeParams = excludePatterns.map(quote).join(' ');\n\n return { includeParams, excludeParams };\n}\n\n/**\n * @description\n * ์ปค๋ฐ‹ ์„ ํƒ ๋ชฉ๋ก์—์„œ subject๊ฐ€ ๊ณผํ•˜๊ฒŒ ๊ธธ์–ด์ง€๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ํ‘œ์‹œ ๊ธธ์ด๋ฅผ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค.\n * commit hash์™€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ๋ณ„๋„ ํ•„๋“œ๋กœ ์œ ์ง€ํ•˜๋ฏ€๋กœ UI ๊ฐ€๋…์„ฑ์— ํ•„์š”ํ•œ subject๋งŒ ์ž๋ฆ…๋‹ˆ๋‹ค.\n * @param subject ์›๋ณธ ์ปค๋ฐ‹ ์ œ๋ชฉ\n * @returns ํ™”๋ฉด ํ‘œ์‹œ์šฉ ์ œ๋ชฉ\n */\nfunction truncateCommitSubject(subject: string) {\n if (subject.length <= 72) {\n return subject;\n }\n\n return `${subject.slice(0, 69)}...`;\n}\n\n/**\n * @description\n * ์ตœ๊ทผ ์ปค๋ฐ‹ ๋ชฉ๋ก์„ ๋ฆฌ๋ทฐ ์„ ํƒ UI์—์„œ ๋ฐ”๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.\n * git log ํฌ๋งท์„ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•ด main review์™€ one-by-one review๊ฐ€ ๊ฐ™์€ ์ปค๋ฐ‹ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.\n * @returns ์ตœ๊ทผ ์ปค๋ฐ‹ ์˜ต์…˜ ๋ชฉ๋ก\n */\nexport function getRecentCommitOptions(): CommitOption[] {\n const output = runGitCommand(\n ['log', `-${COMMIT_FETCH_LIMIT}`, '--date=relative', '--pretty=format:%h%x09%an%x09%ar%x09%s'],\n { allowFailure: true }\n );\n\n if (!output) {\n return [];\n }\n\n return output.split('\\n').map((line) => {\n const [hash = '', author = '', relativeDate = '', ...subjectParts] = line.split('\\t');\n const subject = subjectParts.join('\\t').trim();\n\n return {\n author,\n description: `${author} | ${relativeDate}`,\n hash,\n label: `${hash} | ${truncateCommitSubject(subject)}`,\n relativeDate,\n subject\n };\n });\n}\n\n/**\n * @description\n * ์„ ํƒ๋œ ์ปค๋ฐ‹ ๋ชฉ๋ก์„ ๋ฆฌํฌํŠธ ๋ฐ diff ํ—ค๋”์— ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” markdown bullet ๋ฌธ์ž์—ด๋กœ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.\n * @param commits ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ ๋ฅธ ์ปค๋ฐ‹ ๋ชฉ๋ก\n * @returns ์ปค๋ฐ‹ ์š”์•ฝ markdown\n */\nexport function buildSelectedCommitSummary(commits: CommitOption[]) {\n return commits.map((commit) => `- ${commit.hash} | ${commit.subject} | ${commit.author} | ${commit.relativeDate}`).join('\\n');\n}\n\n/**\n * @description\n * ๋ฆฌ๋ทฐ ๋Œ€์ƒ pathspec ๋ฐฐ์—ด์„ git argv์— ๋ฐ”๋กœ ๋ถ™์ผ ์ˆ˜ ์žˆ๊ฒŒ ํ‰ํƒ„ํ™”ํ•ฉ๋‹ˆ๋‹ค.\n * ๋ฌธ์ž์—ด ์ปค๋งจ๋“œ์™€ ๋‹ค๋ฅธ ๊ฒฝ๋กœ ๊ธฐ๋ฐ˜ helper๋„ ๊ฐ™์€ ํ•„ํ„ฐ๋ฅผ ๊ณต์œ ํ•˜๋„๋ก helper ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.\n * @returns include/exclude pathspec ๋ฐฐ์—ด\n */\nfunction getReviewPathspecArgs() {\n const { includePatterns, excludePatterns } = getGitDiffPathspecs();\n\n return [...includePatterns, ...excludePatterns];\n}\n\n/**\n * @description\n * ์„ ํƒ๋œ ์—ฌ๋Ÿฌ ์ปค๋ฐ‹์˜ ์ „์ฒด diff๋ฅผ ํ•œ ํŒŒ์ผ์— ํ•ฉ์นฉ๋‹ˆ๋‹ค.\n * ๊ฐ ์ปค๋ฐ‹์„ ๋ณ„๋„ ์„น์…˜์œผ๋กœ ๊ฐ์‹ธ AI๊ฐ€ ์ปค๋ฐ‹ ๊ฒฝ๊ณ„๋ฅผ ์žƒ์ง€ ์•Š๋„๋ก ํ•˜๋ฉฐ, ๊ธฐ์กด ๋ฆฌ๋ทฐ ๋Œ€์ƒ ํ™•์žฅ์ž ํ•„ํ„ฐ๋„ ๊ทธ๋Œ€๋กœ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.\n * @param commits ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ ๋ฅธ ์ปค๋ฐ‹ ๋ชฉ๋ก\n * @returns ๋ฆฌ๋ทฐ์šฉ ํ†ตํ•ฉ diff ํ…์ŠคํŠธ\n */\nexport function buildSelectedCommitDiff(commits: CommitOption[]) {\n const reviewPathspecArgs = getReviewPathspecArgs();\n const sections = commits\n .map((commit) => {\n const diff = runGitCommand(['show', '--stat', '--patch', '--format=', commit.hash, '--', ...reviewPathspecArgs], {\n allowFailure: true,\n trimOutput: false\n }).trim();\n\n if (!diff) {\n return '';\n }\n\n return [`## ${commit.hash} ${commit.subject}`, diff].join('\\n\\n');\n })\n .filter(Boolean)\n .join('\\n\\n');\n\n if (!sections) {\n return '';\n }\n\n return ['# ์„ ํƒํ•œ ์ปค๋ฐ‹', buildSelectedCommitSummary(commits), '', '# ๋ฆฌ๋ทฐ ๋Œ€์ƒ diff', sections].join('\\n');\n}\n\n/**\n * @description\n * ์„ ํƒ๋œ ์ปค๋ฐ‹์—์„œ ์‹ค์ œ ๋ฆฌ๋ทฐ ๋Œ€์ƒ ํŒŒ์ผ ๋ชฉ๋ก๋งŒ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.\n * one-by-one ๋ฆฌ๋ทฐ๊ฐ€ ํ˜„์žฌ ์„ ํƒ๋œ ์ปค๋ฐ‹ ์ง‘ํ•ฉ์—๋งŒ ๋ฐ˜์‘ํ•˜๋„๋ก commit๋ณ„ name-only ๊ฒฐ๊ณผ๋ฅผ ํ•ฉ์ง‘ํ•ฉ์œผ๋กœ ๊ณ„์‚ฐํ•ฉ๋‹ˆ๋‹ค.\n * @param commits ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ ๋ฅธ ์ปค๋ฐ‹ ๋ชฉ๋ก\n * @returns ์ค‘๋ณต ์ œ๊ฑฐ๋œ ํŒŒ์ผ ๋ชฉ๋ก\n */\nexport function getSelectedCommitFiles(commits: CommitOption[]) {\n const reviewPathspecArgs = getReviewPathspecArgs();\n const files = new Set<string>();\n\n commits.forEach((commit) => {\n const output = runGitCommand(['show', '--pretty=format:', '--name-only', commit.hash, '--', ...reviewPathspecArgs], {\n allowFailure: true\n });\n\n output\n .split('\\n')\n .map((line) => line.trim())\n .filter(Boolean)\n .forEach((filePath) => files.add(filePath));\n });\n\n return [...files];\n}\n\n/**\n * @description\n * ํŠน์ • ํŒŒ์ผ์— ๋Œ€ํ•œ ์„ ํƒ ์ปค๋ฐ‹๋“ค์˜ diff๋งŒ ๋ชจ์•„์„œ one-by-one ๋ฆฌ๋ทฐ ์ž…๋ ฅ์œผ๋กœ ๋งŒ๋“ญ๋‹ˆ๋‹ค.\n * ๋™์ผ ํŒŒ์ผ์ด ์—ฌ๋Ÿฌ ์ปค๋ฐ‹์—์„œ ๋ฐ”๋€ ๊ฒฝ์šฐ commit section์„ ๋‚˜๋ˆ  ๋ณด์—ฌ์ค˜ ํŒŒ์ผ ๋ฆฌ๋ทฐ ์‘๋‹ต์ด ์–ด๋А ๋ณ€๊ฒฝ์„ ๋‹ค๋ฃจ๋Š”์ง€ ์ถ”์  ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.\n * @param commits ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ ๋ฅธ ์ปค๋ฐ‹ ๋ชฉ๋ก\n * @param filePath ๋ฆฌ๋ทฐํ•  ํŒŒ์ผ ๊ฒฝ๋กœ\n * @returns ๋‹จ์ผ ํŒŒ์ผ ๋ฆฌ๋ทฐ์šฉ diff ํ…์ŠคํŠธ\n */\nexport function buildSelectedFileDiff(commits: CommitOption[], filePath: string) {\n const sections = commits\n .map((commit) => {\n const diff = runGitCommand(['show', '--stat', '--patch', '--format=', commit.hash, '--', filePath], {\n allowFailure: true,\n trimOutput: false\n }).trim();\n\n if (!diff) {\n return '';\n }\n\n return [`## ${commit.hash} ${commit.subject}`, diff].join('\\n\\n');\n })\n .filter(Boolean)\n .join('\\n\\n');\n\n if (!sections) {\n return '';\n }\n\n return ['# ์„ ํƒํ•œ ์ปค๋ฐ‹', buildSelectedCommitSummary(commits), '', `# ํŒŒ์ผ: ${filePath}`, sections].join('\\n\\n');\n}\n\n/**\n * openReport๋ฅผ OS๋ณ„๋กœ ๋™์ž‘ํ•˜๋„๋ก ๋ณ€๊ฒฝ\n * ์šฐ์„ ์ˆœ์œ„:\n * 1. Chrome ์‹œ๋„\n * - macOS: open -a \"Google Chrome\" \"<path>\"\n * - Ubuntu/Linux: google-chrome \"<path>\"\n * 2. ์‹คํŒจ ์‹œ ๊ธฐ๋ณธ ๋ธŒ๋ผ์šฐ์ €๋กœ ํด๋ฐฑ\n * - macOS: open \"<path>\"\n * - Ubuntu/Linux: xdg-open \"<path>\"\n * 3. ๋‘˜ ๋‹ค ์‹คํŒจํ•˜๋ฉด ์—๋Ÿฌ ์ถœ๋ ฅ\n * 4. ๋ฏธ์ง€์› ํ”Œ๋žซํผ์ด๋ฉด ํ”Œ๋žซํผ ๊ฒฝ๊ณ  ์ถœ๋ ฅ\n */\nexport function openReport(reportPath: string) {\n const resolvedPath = path.resolve(reportPath);\n const { platform } = process;\n helperTrace('open-report:start', resolvedPath);\n\n const openWithChrome = () => {\n if (platform === 'darwin') {\n execSync(`open -a \"Google Chrome\" \"${resolvedPath}\"`, { stdio: 'ignore' });\n\n return true;\n }\n\n if (platform === 'linux') {\n execSync(`google-chrome \"${resolvedPath}\"`, { stdio: 'ignore' });\n\n return true;\n }\n\n return false;\n };\n\n const openWithDefaultBrowser = () => {\n if (platform === 'darwin') {\n execSync(`open \"${resolvedPath}\"`, { stdio: 'ignore' });\n\n return true;\n }\n\n if (platform === 'linux') {\n execSync(`xdg-open \"${resolvedPath}\"`, { stdio: 'ignore' });\n\n return true;\n }\n\n return false;\n };\n\n try {\n if (openWithChrome()) {\n helperTrace('open-report:chrome:success', platform);\n console.log('๐Ÿš€ Google Chrome์—์„œ ๋ฆฌํฌํŠธ๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.');\n\n return;\n }\n } catch (error) {\n helperTrace('open-report:chrome:failed', getErrorSummary(error));\n // Chrome ์‹คํ–‰ ์‹คํŒจ ์‹œ ๊ธฐ๋ณธ ๋ธŒ๋ผ์šฐ์ €๋กœ ํด๋ฐฑ\n }\n\n try {\n if (openWithDefaultBrowser()) {\n helperTrace('open-report:default-browser:success', platform);\n console.log('๐Ÿš€ ๊ธฐ๋ณธ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ฆฌํฌํŠธ๋ฅผ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.');\n\n return;\n }\n } catch (error) {\n helperTrace('open-report:default-browser:failed', getErrorSummary(error));\n console.error('โš ๏ธ ๋ธŒ๋ผ์šฐ์ € ์—ด๊ธฐ ์‹คํŒจ:', error);\n\n return;\n }\n\n helperTrace('open-report:unsupported-platform', platform);\n console.error(`โš ๏ธ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค: ${platform}`);\n}\n\n/**\n * @description\n * raw mode ๊ธฐ๋ฐ˜ ์„ ํƒ UI๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์—ด ์ˆ˜ ์žˆ๋Š” TTY ํ™˜๊ฒฝ์ธ์ง€ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค.\n * CI๋‚˜ pipe ํ™˜๊ฒฝ์—์„œ๋Š” ์ปค์„œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ฆ‰์‹œ ์—๋Ÿฌ ๋ฆฌํฌํŠธ๋ฅผ ๋‚จ๊ธฐ๊ณ  ์ข…๋ฃŒํ•ฉ๋‹ˆ๋‹ค.\n * @param scope ์—๋Ÿฌ ๋ฆฌํฌํŠธ ๊ตฌ๋ถ„์šฉ scope\n * @param message ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค„ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€\n */\nfunction ensureInteractiveSelectionAvailable(scope: string, message: string) {\n if (process.stdin.isTTY && process.stdout.isTTY && typeof process.stdin.setRawMode === 'function') {\n return;\n }\n\n helperTrace(`${scope}:tty-missing`);\n exitWithError(message, {\n scope: `helper:${scope}`\n });\n}\n\n/**\n * @description\n * ์„ ํƒ ๋ชจ๋‹ฌ์„ ํ˜„์žฌ ์œ„์น˜์—์„œ ๋‹ค์‹œ ๊ทธ๋ฆฝ๋‹ˆ๋‹ค.\n * ๊ฐ ์ค„์€ ๋ฏธ๋ฆฌ ํ„ฐ๋ฏธ๋„ ํญ ์•ˆ์œผ๋กœ ์ž˜๋ผ physical line์ด 1์ค„๋กœ ์œ ์ง€๋˜๋ฏ€๋กœ,\n * ์ง์ „ ๋ Œ๋” ์ค„ ์ˆ˜๋งŒํผ ์œ„๋กœ ์ด๋™ํ•œ ๋’ค clearScreenDown ํ•ด๋„ ์ค‘๋ณต ์—†์ด ์•ˆ์ •์ ์œผ๋กœ ๊ฐฑ์‹ ๋ฉ๋‹ˆ๋‹ค.\n * @param lines ์ƒˆ๋กœ ๋ Œ๋”ํ•  ๋ฌธ์ž์—ด ์ค„ ๋ชฉ๋ก\n * @param previousLineCount ์ง์ „ ๋ Œ๋” ์ค„ ์ˆ˜\n * @returns ํ˜„์žฌ ๋ Œ๋” ์ค„ ์ˆ˜\n */\nfunction renderSelectionBlock(lines: string[], previousLineCount: number) {\n if (previousLineCount > 0) {\n readline.moveCursor(process.stdout, 0, -previousLineCount);\n readline.clearScreenDown(process.stdout);\n }\n\n const fittedLines = fitLinesToTerminal(lines);\n process.stdout.write(`${fittedLines.join('\\n')}\\n`);\n\n return fittedLines.length;\n}\n\n/**\n * @description\n * ํ˜„์žฌ ์ปค์„œ ๊ธฐ์ค€ visible window๋ฅผ ๊ณ„์‚ฐํ•ด ๊ธด ์ปค๋ฐ‹ ๋ชฉ๋ก๋„ ๊ณ ์ • ๋†’์ด๋กœ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.\n * @param optionCount ์ „์ฒด ์˜ต์…˜ ๊ฐœ์ˆ˜\n * @param selectedIndex ํ˜„์žฌ ํฌ์ปค์Šค ์ธ๋ฑ์Šค\n * @param windowSize ๋™์‹œ์— ๋ณด์—ฌ์ค„ ์ตœ๋Œ€ ์˜ต์…˜ ๊ฐœ์ˆ˜\n * @returns ์‹œ์ž‘/๋ ์ธ๋ฑ์Šค\n */\nfunction getSelectionWindowRange(optionCount: number, selectedIndex: number, windowSize: number) {\n if (optionCount <= windowSize) {\n return {\n end: optionCount,\n start: 0\n };\n }\n\n const halfWindow = Math.floor(windowSize / 2);\n const maxStart = optionCount - windowSize;\n const start = Math.max(0, Math.min(selectedIndex - halfWindow, maxStart));\n\n return {\n end: Math.min(optionCount, start + windowSize),\n start\n };\n}\n\n/**\n * @description\n * ๊ณตํ†ต multi-select UI ๋ Œ๋”๋ง์— ํ•„์š”ํ•œ ๋ฌธ์ž์—ด ๋ชฉ๋ก์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.\n * ์„ค๋ช… ํ…์ŠคํŠธ๋Š” dim ์ฒ˜๋ฆฌํ•ด subject์™€ author/date๊ฐ€ ํ•œ ์ค„์—์„œ ๊ตฌ๋ถ„๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.\n * @param question ์งˆ๋ฌธ ํ—ค๋”\n * @param options ํ‘œ์‹œํ•  ์˜ต์…˜ ๋ชฉ๋ก\n * @param selectedIndex ํ˜„์žฌ ํฌ์ปค์Šค ์ธ๋ฑ์Šค\n * @param toggled ์„ ํƒ๋œ ์ธ๋ฑ์Šค Set\n * @param windowSize ๋™์‹œ์— ๋ณด์—ฌ์ค„ ์ตœ๋Œ€ ์˜ต์…˜ ๊ฐœ์ˆ˜\n * @returns ์ถœ๋ ฅ ์ค„ ๋ชฉ๋ก\n */\nfunction buildMultiSelectLines<T>(\n question: string,\n options: MultiSelectOption<T>[],\n selectedIndex: number,\n toggled: Set<number>,\n windowSize: number\n) {\n const { start, end } = getSelectionWindowRange(options.length, selectedIndex, windowSize);\n const lines = [\n `${ANSI.bold}${question}${ANSI.reset}`,\n `${ANSI.dim}โ†‘โ†“ ์ด๋™ | Space ์„ ํƒ/ํ•ด์ œ | Enter ์™„๋ฃŒ | Esc ์ทจ์†Œ${ANSI.reset}`,\n `${ANSI.dim}์„ ํƒ๋จ: ${toggled.size}๊ฐœ / ์ „์ฒด: ${options.length}๊ฐœ${ANSI.reset}`\n ];\n\n for (let index = start; index < end; index += 1) {\n const option = options[index];\n\n if (!option) {\n continue;\n }\n\n const cursor = index === selectedIndex ? `${ANSI.cyan}>${ANSI.reset}` : ' ';\n const checked = toggled.has(index) ? `${ANSI.green}โ˜‘${ANSI.reset}` : 'โ˜';\n const description = option.description ? ` ${ANSI.dim}${option.description}${ANSI.reset}` : '';\n lines.push(`${cursor} ${checked} ${option.label}${description}`);\n }\n\n if (options.length > windowSize) {\n lines.push(`${ANSI.dim}ํ‘œ์‹œ ๋ฒ”์œ„: ${start + 1}-${end} / ${options.length}${ANSI.reset}`);\n }\n\n return lines;\n}\n\n/**\n * @description\n * ์ปค๋ฐ‹ ์„ ํƒ์ฒ˜๋Ÿผ ๋ณต์ˆ˜ ์„ ํƒ์ด ํ•„์š”ํ•œ ํ„ฐ๋ฏธ๋„ ๋ชจ๋‹ฌ์„ ๊ณตํ†ต์œผ๋กœ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.\n * raw mode๋ฅผ ์ง์ ‘ ์ œ์–ดํ•ด ๋ฐฉํ–ฅํ‚ค, Space, Enter, Esc๋ฅผ ์ฝ๊ณ  ์„ ํƒ๋œ value ๋ชฉ๋ก๋งŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.\n * @param question ์‚ฌ์šฉ์ž ์•ˆ๋‚ด ๋ฌธ๊ตฌ\n * @param options ์„ ํƒ ์˜ต์…˜ ๋ชฉ๋ก\n * @param windowSize ๋™์‹œ์— ๋ณด์—ฌ์ค„ ์ตœ๋Œ€ ์˜ต์…˜ ๊ฐœ์ˆ˜\n * @returns ์‚ฌ์šฉ์ž๊ฐ€ ํ™•์ •ํ•œ ์„ ํƒ ๊ฐ’ ๋ฐฐ์—ด\n */\nexport async function showMultiSelect<T>(question: string, options: MultiSelectOption<T>[], windowSize = COMMIT_SELECTION_WINDOW) {\n ensureInteractiveSelectionAvailable('showMultiSelect', 'โŒ ์ปค๋ฐ‹ ์„ ํƒ ๋ชจ๋‹ฌ์€ TTY ํ™˜๊ฒฝ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.');\n let selectedIndex = 0;\n let renderedLineCount = 0;\n const toggled = new Set<number>();\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: true\n });\n\n process.stdout.write('\\u001b[?25l');\n\n const cleanup = () => {\n if (renderedLineCount > 0) {\n readline.moveCursor(process.stdout, 0, -renderedLineCount);\n readline.clearScreenDown(process.stdout);\n renderedLineCount = 0;\n }\n process.stdin.removeListener('data', onData);\n process.stdin.setRawMode(false);\n process.stdin.pause();\n rl.close();\n process.stdout.write('\\u001b[?25h');\n };\n\n const render = () => {\n const lines = buildMultiSelectLines(question, options, selectedIndex, toggled, windowSize);\n renderedLineCount = renderSelectionBlock(lines, renderedLineCount);\n };\n\n const confirmSelection = (resolve: (value: T[]) => void) => {\n const values = [...toggled]\n .sort((left, right) => left - right)\n .map((index) => options[index]?.value)\n .filter((value): value is T => value !== undefined);\n\n cleanup();\n resolve(values);\n };\n\n const cancelSelection = (resolve: (value: T[]) => void) => {\n cleanup();\n resolve([]);\n };\n\n let onData = (_data: Buffer) => {\n // ์‹ค์ œ ๊ตฌํ˜„์€ Promise ์ƒ์„ฑ ์‹œ์ ์— ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค.\n };\n\n render();\n\n return new Promise<T[]>((resolve) => {\n onData = (data: Buffer) => {\n const key = data.toString();\n\n if (key === '\\u0003') {\n cleanup();\n process.exit(0);\n }\n\n if (key === '\\u001b') {\n cancelSelection(resolve);\n\n return;\n }\n\n if (key === '\\x1b[A') {\n selectedIndex = (selectedIndex - 1 + options.length) % options.length;\n render();\n\n return;\n }\n\n if (key === '\\x1b[B') {\n selectedIndex = (selectedIndex + 1) % options.length;\n render();\n\n return;\n }\n\n if (key === ' ') {\n if (toggled.has(selectedIndex)) {\n toggled.delete(selectedIndex);\n } else {\n toggled.add(selectedIndex);\n }\n render();\n\n return;\n }\n\n if (key === '\\r' || key === '\\n') {\n confirmSelection(resolve);\n }\n };\n\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.on('data', onData);\n });\n}\n\n/**\n * @description\n * ์ตœ๊ทผ ์ปค๋ฐ‹ ๋ชฉ๋ก์„ modal UI๋กœ ์„ ํƒ๋ฐ›์•„ review ์—”ํŠธ๋ฆฌํฌ์ธํŠธ์—์„œ ๋ฐ”๋กœ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.\n * @returns ์‚ฌ์šฉ์ž๊ฐ€ ๊ณ ๋ฅธ ์ปค๋ฐ‹ ๋ชฉ๋ก\n */\nexport async function selectReviewCommits() {\n const commits = getRecentCommitOptions();\n\n if (commits.length === 0) {\n console.log('โ„น๏ธ ๋ฆฌ๋ทฐํ•  ์ตœ๊ทผ ์ปค๋ฐ‹์ด ์—†์Šต๋‹ˆ๋‹ค.');\n\n return [];\n }\n\n return showMultiSelect<CommitOption>(\n '๋ฆฌ๋ทฐํ•  ์ปค๋ฐ‹์„ ์„ ํƒํ•ด์ฃผ์„ธ์š”.',\n commits.map((commit) => ({\n description: commit.description,\n label: commit.label,\n value: commit\n })),\n COMMIT_SELECTION_WINDOW\n );\n}\n\n/**\n * AI ์„œ๋น„์Šค ์„ ํƒ\n */\nexport function selectAIService() {\n const service = parseServiceFromArgs();\n\n if (!service) {\n helperTrace('select-service:missing');\n exitWithError('โŒ ์„œ๋น„์Šค๊ฐ€ ์„ ํƒ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.', {\n scope: 'helper:selectAIService'\n });\n }\n\n helperTrace('select-service:done', service);\n\n return service;\n}\n\n/**\n * ํ„ฐ๋ฏธ๋„์—์„œ ๋ผ๋””์˜ค ๋ฒ„ํŠผ ํ˜•ํƒœ๋กœ AI ์„œ๋น„์Šค๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.\n */\nexport async function showSelectionAIService(): Promise<AIServiceType> {\n const selectedServiceFromArgs = parseServiceFromArgs();\n\n if (selectedServiceFromArgs) {\n helperTrace('show-selection:from-args', selectedServiceFromArgs);\n console.log(`\\nโœ… ${ANSI.green}${selectedServiceFromArgs}${ANSI.reset} ์„œ๋น„์Šค๊ฐ€ ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. (--service)\\n`);\n\n return selectedServiceFromArgs;\n }\n\n ensureInteractiveSelectionAvailable('showSelectionAIService', 'โŒ AI ์„œ๋น„์Šค ์„ ํƒ UI๋Š” TTY ํ™˜๊ฒฝ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.');\n helperTrace('show-selection:interactive:start');\n let selectedIndex = 0;\n\n // Use readline to handle keypresses\n // ํ‚ค ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด readline ์ธํ„ฐํŽ˜์ด์Šค ์‚ฌ์šฉ\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n terminal: true\n });\n\n let firstRender = true;\n\n // Hide cursor\n process.stdout.write('\\u001b[?25l');\n\n const render = () => {\n if (!firstRender) {\n // Move cursor back to the starting line of the selection UI\n // We print (1 question line + services.length lines)\n // ์„ ํƒ UI์˜ ์‹œ์ž‘ ๋ผ์ธ์œผ๋กœ ์ปค์„œ ์ด๋™ (์งˆ๋ฌธ 1์ค„ + ์„œ๋น„์Šค ๋ชฉ๋ก N์ค„)\n readline.moveCursor(process.stdout, 0, -(AIServices.length + 1));\n }\n firstRender = false;\n helperTrace('show-selection:interactive:render', AIServices[selectedIndex] || 'unknown');\n\n // Clear everything from cursor down to avoid ghosting/overlaps\n // ์ž”์ƒ์ด๋‚˜ ๊ฒน์นจ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ปค์„œ ์œ„์น˜๋ถ€ํ„ฐ ์•„๋ž˜์ชฝ ๋ชจ๋‘ ์ง€์›€\n readline.clearScreenDown(process.stdout);\n\n process.stdout.write(\n `๐Ÿค– AI ์„œ๋น„์Šค๋ฅผ ์„ ํƒํ•ด์ฃผ์„ธ์š” (${ANSI.yellow}โ†‘โ†“ ๋ฐฉํ–ฅํ‚ค${ANSI.reset} ์ด๋™, ${ANSI.yellow}Enter${ANSI.reset} ์„ ํƒ):\\n`\n );\n AIServices.forEach((service, index) => {\n if (index === selectedIndex) {\n process.stdout.write(` ${ANSI.cyan}>${ANSI.reset} ${ANSI.cyan}โ—‰${ANSI.reset} ${ANSI.bold}${service}${ANSI.reset}\\n`);\n } else {\n process.stdout.write(` โ—ฏ ${service}\\n`);\n }\n });\n };\n\n render();\n\n return new Promise((resolve) => {\n const onData = (data: Buffer) => {\n const key = data.toString();\n if (key === '\\u0003') {\n // Ctrl+C\n helperTrace('show-selection:interactive:ctrl-c');\n process.stdout.write('\\u001b[?25h'); // Show cursor\n process.exit(0);\n }\n if (key === '\\x1b[A') {\n // Up arrow\n selectedIndex = (selectedIndex - 1 + AIServices.length) % AIServices.length;\n render();\n } else if (key === '\\x1b[B') {\n // Down arrow\n selectedIndex = (selectedIndex + 1) % AIServices.length;\n render();\n } else if (key === '\\r' || key === '\\n') {\n // Enter\n process.stdin.removeListener('data', onData);\n process.stdin.setRawMode(false);\n process.stdin.pause();\n rl.close();\n\n // Show cursor\n process.stdout.write('\\u001b[?25h');\n\n console.log(`\\nโœ… ${ANSI.green}${AIServices[selectedIndex]}${ANSI.reset} ์„œ๋น„์Šค๊ฐ€ ์„ ํƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.\\n`);\n const result = AIServices[selectedIndex];\n if (result) {\n helperTrace('show-selection:interactive:confirmed', result);\n resolve(result);\n }\n }\n };\n\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.on('data', onData);\n });\n}\n","import fs from 'fs';\n\nimport { codingConventionRulesPath, createTraceLogger, namingRulesPath, rulesPath } from '../../common/helper';\n\nconst args = process.argv.slice(2);\nconst trace = createTraceLogger('claude-commander', args);\nconst ALLOWED_REASONING_EFFORTS = ['minimal', 'low', 'medium', 'high'] as const;\n\ntype ReasoningEffort = (typeof ALLOWED_REASONING_EFFORTS)[number];\ntype ClaudeEffort = 'low' | 'medium' | 'high';\n\nfunction shellQuote(value: string) {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\n/**\n * @description\n * shell ์˜ต์…˜ ๊ฐ’์ด ๋‹จ์ˆœ ํ† ํฐ์ด๋ฉด ๋”ฐ์˜ดํ‘œ ์—†์ด ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ณ ,\n * ๊ณต๋ฐฑ์ด๋‚˜ shell ํŠน์ˆ˜๋ฌธ์ž๊ฐ€ ์„ž์ด๋ฉด ์•ˆ์ „ํ•˜๊ฒŒ single quote๋กœ ๊ฐ์Œ‰๋‹ˆ๋‹ค.\n * Claude ๋ชจ๋ธ๋ช…๊ณผ effort ๊ฐ’์€ ๋ณดํ†ต ๋‹จ์ˆœ ํ† ํฐ์ด๋ฏ€๋กœ, ๋ณต๋ถ™ ๊ณผ์ •์—์„œ\n * ์Šค๋งˆํŠธ ์ฟผํŠธ๋กœ ๋ณ€ํ˜•๋˜์–ด ๋ฐœ์ƒํ•˜๋Š” ์žฌํ˜„ ์˜ค๋ฅ˜๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋ถ„๊ธฐํ•ฉ๋‹ˆ๋‹ค.\n * @param value shell ์˜ต์…˜์— ์ „๋‹ฌํ•  ๊ฐ’\n * @returns shell command์— ์‚ฝ์ž… ๊ฐ€๋Šฅํ•œ ์•ˆ์ „ํ•œ ํ† ํฐ ๋ฌธ์ž์—ด\n */\nfunction toShellOptionToken(value: string) {\n const SIMPLE_SHELL_TOKEN_PATTERN = /^[A-Za-z0-9._:/=-]+$/;\n\n if (SIMPLE_SHELL_TOKEN_PATTERN.test(value)) {\n return value;\n }\n\n return shellQuote(value);\n}\n\nfunction getArgValue(flag: string) {\n const index = args.indexOf(flag);\n\n if (index === -1 || !args[index + 1]) {\n return '';\n }\n\n return args[index + 1];\n}\n\nfunction printNotice(message: string) {\n if (args.includes('--test')) {\n console.warn(message);\n }\n}\n\nfunction toUnique(values: string[]) {\n const seen = new Set<string>();\n\n return values.filter((value) => {\n if (!value || seen.has(value)) {\n return false;\n }\n seen.add(value);\n\n return true;\n });\n}\n\nfunction normalizeEffort(level: ReasoningEffort): ClaudeEffort {\n if (level === 'minimal') {\n return 'low';\n }\n\n return level;\n}\n\nfunction resolveReasoningEffort(): ClaudeEffort {\n const customReasoningEffort = getArgValue('--reasoning-effort') || getArgValue('--effort');\n\n if (customReasoningEffort) {\n if (ALLOWED_REASONING_EFFORTS.includes(customReasoningEffort as ReasoningEffort)) {\n const normalized = normalizeEffort(customReasoningEffort as ReasoningEffort);\n trace('reasoning:custom', `${customReasoningEffort} -> ${normalized}`);\n\n if (customReasoningEffort === 'minimal') {\n printNotice('โš ๏ธ Claude๋Š” minimal์„ ์ง์ ‘ ์ง€์›ํ•˜์ง€ ์•Š์•„ low๋กœ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.');\n }\n\n return normalized;\n }\n\n printNotice(\n `โš ๏ธ ์ง€์›๋˜์ง€ ์•Š๋Š” reasoning effort(${customReasoningEffort})์ž…๋‹ˆ๋‹ค. allowed: ${ALLOWED_REASONING_EFFORTS.join(\n ', '\n )}`\n );\n }\n\n if (args.includes('--flash')) {\n trace('reasoning:flash-default', 'low');\n\n return 'low';\n }\n\n if (args.includes('--review')) {\n trace('reasoning:review-default', 'high');\n\n return 'high';\n }\n\n trace('reasoning:default', 'medium');\n\n return 'medium';\n}\n\nfunction resolvePrimaryAlias() {\n if (args.includes('--review')) {\n trace('model:mode-alias', 'opus');\n\n return 'opus';\n }\n\n if (args.includes('--flash')) {\n trace('model:mode-alias', 'haiku');\n\n return 'haiku';\n }\n\n trace('model:default-alias', 'sonnet');\n\n return 'sonnet';\n}\n\nfunction getAliasFallbacks(primaryAlias: string) {\n if (primaryAlias === 'opus') {\n return ['opus', 'sonnet', 'haiku'];\n }\n\n if (primaryAlias === 'haiku') {\n return ['haiku', 'sonnet'];\n }\n\n return [primaryAlias, 'sonnet', 'haiku'];\n}\n\nfunction buildClaudeExecCommand(options: {\n tempDiffPath: string;\n prompt: string;\n systemPromptFiles: string[];\n effort: ClaudeEffort;\n model?: string;\n fallbackModel?: string;\n}) {\n const { tempDiffPath, prompt, systemPromptFiles, effort, model, fallbackModel } = options;\n const modelOption = model ? `--model ${toShellOptionToken(model)}` : '';\n const fallbackOption = model && fallbackModel ? `--fallback-model ${toShellOptionToken(fallbackModel)}` : '';\n const effortOption = `--effort ${toShellOptionToken(effort)}`;\n\n const appendedPromptFiles = systemPromptFiles\n .map((path) => `--append-system-prompt-file ${shellQuote(path)}`)\n .join(' ');\n\n return `cat ${shellQuote(tempDiffPath)} | claude ${[\n modelOption,\n fallbackOption,\n effortOption,\n appendedPromptFiles,\n '-p',\n shellQuote(prompt)\n ]\n .filter(Boolean)\n .join(' ')}`;\n}\n\n/**\n * @description\n * Claude Code CLI๋ฅผ ํ™œ์šฉํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ช…๋ น์–ด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.\n *\n * ๋ชจ๋ธ ์ „๋žต:\n * 1) --model ์ปค์Šคํ…€ ๋ชจ๋ธ ์šฐ์„  ์‹œ๋„\n * 2) ์„œ๋น„์Šค alias ์ˆœ์ฐจ ํด๋ฐฑ (opus/sonnet/haiku ์กฐํ•ฉ)\n * 3) ๋งˆ์ง€๋ง‰์— --model ์—†์ด ๊ณ„์ •/CLI ๊ธฐ๋ณธ ๋ชจ๋ธ๋กœ ํด๋ฐฑ\n *\n * reasoning ์ „๋žต:\n * - --effort(low|medium|high)๋ฅผ ์‚ฌ์šฉ\n * - --reasoning-effort(minimal|low|medium|high) ์ž…๋ ฅ ์‹œ Claude ํ˜ธํ™˜ ๊ฐ’์œผ๋กœ ๋งคํ•‘\n */\nexport const createClaudeCommand = (tempDiffPath: string, reviewFormPath: string) => {\n trace('createClaudeCommand:start', `tempDiffPath=${tempDiffPath}, reviewFormPath=${reviewFormPath}`);\n const customModel = getArgValue('--model');\n const effort = resolveReasoningEffort();\n const primaryAlias = resolvePrimaryAlias();\n const aliasFallbacks = toUnique(getAliasFallbacks(primaryAlias));\n\n // ๋ฃฐ์…‹ ํŒŒ์ผ๋“ค์„ --append-system-prompt-file ๋กœ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์— ์ถ”๊ฐ€\n // Claude๊ฐ€ \"์ง€์นจ/๊ทœ์น™\"์œผ๋กœ ์ธ์‹ํ•˜๋„๋ก ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ ๋ ˆ๋ฒจ์— ์ฃผ์ž…\n const rules = [\n { path: rulesPath, display: '๋ฃฐ์…‹' },\n { path: namingRulesPath, display: '๋„ค์ด๋ฐ ๊ทœ์น™' },\n { path: codingConventionRulesPath, display: '์ฝ”๋”ฉ ์ปจ๋ฒค์…˜' }\n ];\n const existingRuleFiles = rules.filter((rule) => fs.existsSync(rule.path)).map((rule) => rule.path);\n\n trace('rules:loaded', `count=${existingRuleFiles.length}`);\n\n // ๋ฆฌ๋ทฐ ์–‘์‹๋„ ์‹œ์Šคํ…œ ํ”„๋กฌํ”„ํŠธ์— ์ถ”๊ฐ€ (์ถœ๋ ฅ ํฌ๋งท ์ง€์นจ)\n const reviewFormExists = fs.existsSync(reviewFormPath);\n trace('reviewForm:status', reviewFormExists ? 'exists' : 'missing');\n const systemPromptFiles = reviewFormExists ? [...existingRuleFiles, reviewFormPath] : existingRuleFiles;\n\n const prompt = '์œ„ ๊ทœ์น™๋“ค์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ด diff๋ฅผ ์ฝ”๋“œ๋ฆฌ๋ทฐํ•ด์ค˜. ๋ฆฌ๋ทฐ์–‘์‹์— ๋งž์ถฐ์„œ ์ž‘์„ฑํ•ด์ค˜.';\n trace('prompt:prepared', `length=${prompt.length}`);\n trace('system-prompt-files', `count=${systemPromptFiles.length}`);\n const modelCandidates = toUnique(customModel ? [customModel, ...aliasFallbacks] : aliasFallbacks);\n trace('model:candidates', modelCandidates.join(', '));\n trace('command:candidates:count', String(modelCandidates.length + 1));\n\n if (customModel) {\n printNotice(\n `โš ๏ธ ์ปค์Šคํ…€ ๋ชจ๋ธ(${customModel})์„ ์šฐ์„  ์‹œ๋„ํ•˜๊ณ  ์‹คํŒจํ•˜๋ฉด alias(${aliasFallbacks.join(\n ' -> '\n )}) ๋ฐ ๊ธฐ๋ณธ ๋ชจ๋ธ ์ˆœ์œผ๋กœ ํด๋ฐฑํ•ฉ๋‹ˆ๋‹ค.`\n );\n } else {\n printNotice(\n `โš ๏ธ ๋ชจ๋ธ์ด ์ง€์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. alias(${aliasFallbacks.join(' -> ')})๋ฅผ ์ˆœ์ฐจ ์‹œ๋„ํ•˜๊ณ  ๋งˆ์ง€๋ง‰์— ๊ธฐ๋ณธ ๋ชจ๋ธ๋กœ ํด๋ฐฑํ•ฉ๋‹ˆ๋‹ค.`\n );\n }\n\n const commandCandidates = modelCandidates.map((model, index) => {\n const fallbackModel = modelCandidates[index + 1];\n\n return buildClaudeExecCommand({\n tempDiffPath,\n prompt,\n systemPromptFiles,\n effort,\n model,\n fallbackModel\n });\n });\n\n const command = [\n ...commandCandidates,\n buildClaudeExecCommand({\n tempDiffPath,\n prompt,\n systemPromptFiles,\n effort\n })\n ].join(' || ');\n\n trace('command:created');\n\n // test mode\n if (args.includes('--test')) {\n const safeCommand = command.replace(/\"/g, '\\\\\"');\n trace('test-mode:return-preview');\n\n return `echo \"[TEST MODE] Claude ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.\\n\\n์ƒ์„ฑ๋  ๋ช…๋ น์–ด ๋ฏธ๋ฆฌ๋ณด๊ธฐ:\\n${safeCommand}\"`;\n }\n\n trace('command:mode', 'execute');\n trace('createClaudeCommand:end');\n\n return command;\n};\n","import { execSync } from 'child_process';\n\nimport { createTraceLogger, exitWithError, getErrorSummary } from '../../common/helper';\n\nconst trace = createTraceLogger('installation-claude');\n\n// claude-cli ์„ค์น˜ ํ™•์ธ ๋ฐ ์„ค์น˜\nexport function checkClaudeCliInstalled() {\n trace('checkClaudeCliInstalled:start');\n try {\n trace('version-check:run', 'claude --version');\n execSync('claude --version', { stdio: 'ignore' });\n trace('version-check:ok');\n } catch (error) {\n trace('version-check:failed', getErrorSummary(error));\n trace('install:start', '@anthropic-ai/claude-code');\n console.log(\n 'โ„น๏ธ claude-cli๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ค์น˜๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค... npm install -g @anthropic-ai/claude-code'\n );\n try {\n execSync('npm install -g @anthropic-ai/claude-code', { stdio: 'inherit' });\n trace('install:ok', 'login-required');\n console.log('โœ… claude-cli ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');\n console.log('โš ๏ธ claude-cli ์‚ฌ์šฉ์„ ์œ„ํ•ด ์ธ์ฆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.');\n console.log(' ํ„ฐ๋ฏธ๋„์—์„œ \"claude\" ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ € ๋กœ๊ทธ์ธ์„ ์™„๋ฃŒํ•œ ํ›„, ๋‹ค์‹œ ์‹œ๋„ํ•ด์ฃผ์„ธ์š”.');\n process.exit(1);\n } catch (installError) {\n trace('install:failed', getErrorSummary(installError));\n exitWithError('โŒ claude-cli ์„ค์น˜ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ถŒํ•œ ๋ฌธ์ œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (sudo ํ•„์š”).', {\n scope: 'installation-claude',\n error: installError\n });\n }\n }\n trace('checkClaudeCliInstalled:end');\n}\n","import fs from 'fs';\n\nimport { codingConventionRulesPath, createTraceLogger, namingRulesPath, rulesPath } from '../../common/helper';\n\nconst args = process.argv.slice(2);\nconst trace = createTraceLogger('codex-commander', args);\nconst ALLOWED_REASONING_EFFORTS = ['minimal', 'low', 'medium', 'high'] as const;\n\ntype ReasoningEffort = (typeof ALLOWED_REASONING_EFFORTS)[number];\ntype CodexReasoningEffort = 'low' | 'medium' | 'high';\n\nfunction shellQuote(value: string) {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction getArgValue(flag: string) {\n const index = args.indexOf(flag);\n\n if (index === -1 || !args[index + 1]) {\n return '';\n }\n\n return args[index + 1];\n}\n\nfunction printNotice(message: string) {\n if (args.includes('--test')) {\n console.warn(message);\n }\n}\n\n/**\n * @description\n * Codex CLI์— ์ „๋‹ฌํ•  reasoning effort๋ฅผ ์•ˆ์ „ํ•œ ๊ฐ’์œผ๋กœ ์ •๊ทœํ™”ํ•ฉ๋‹ˆ๋‹ค.\n * Codex ์‹คํ–‰ ํ™˜๊ฒฝ์—์„œ web_search ๋„๊ตฌ๊ฐ€ ํ™œ์„ฑํ™”๋˜๋ฉด `minimal`๊ณผ ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ์–ด,\n * ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ํ˜ธํ™˜ ๊ฐ’์ธ `low`๋กœ ๊ฐ•์ œ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.\n * @param level ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ reasoning effort\n * @returns Codex CLI์— ์‹ค์ œ ์ „๋‹ฌํ•  reasoning effort\n */\nfunction normalizeEffort(level: ReasoningEffort): CodexReasoningEffort {\n if (level === 'minimal') {\n return 'low';\n }\n\n return level;\n}\n\nfunction resolveReasoningEffort(): CodexReasoningEffort {\n const customReasoningEffort = getArgValue('--reasoning-effort');\n\n if (customReasoningEffort) {\n if (ALLOWED_REASONING_EFFORTS.includes(customReasoningEffort as ReasoningEffort)) {\n const normalized = normalizeEffort(customReasoningEffort as ReasoningEffort);\n trace('reasoning:custom', `${customReasoningEffort} -> ${normalized}`);\n\n if (customReasoningEffort === 'minimal') {\n printNotice('โš ๏ธ Codex๋Š” minimal์ด web_search ๋„๊ตฌ์™€ ์ถฉ๋Œํ•  ์ˆ˜ ์žˆ์–ด low๋กœ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.');\n }\n\n return normalized;\n }\n\n printNotice(\n `โš ๏ธ ์ง€์›๋˜์ง€ ์•Š๋Š” reasoning effort(${customReasoningEffort})์ž…๋‹ˆ๋‹ค. allowed: ${ALLOWED_REASONING_EFFORTS.join(\n ', '\n )}`\n );\n }\n\n if (args.includes('--flash')) {\n trace('reasoning:flash-default', 'low');\n\n return 'low';\n }\n\n if (args.includes('--review')) {\n trace('reasoning:review-default', 'high');\n\n return 'high';\n }\n\n trace('reasoning:default', 'medium');\n\n return 'medium';\n}\n\nfunction buildCodexExecCommand(prompt: string, reasoningEffort: CodexReasoningEffort, model?: string) {\n const modelOption = model ? `--model ${shellQuote(model)}` : '';\n const reasoningOption = `-c ${shellQuote(`model_reasoning_effort=\"${reasoningEffort}\"`)}`;\n\n return `codex exec ${[modelOption, reasoningOption, shellQuote(prompt)].filter(Boolean).join(' ')}`;\n}\n\n/**\n * @description\n * Codex CLI๋ฅผ ํ™œ์šฉํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ช…๋ น์–ด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.\n *\n * ๋ชจ๋ธ ๊ธฐ๋ณธ๊ฐ’:\n * - --review: gpt-5 alias ์šฐ์„  ์‹œ๋„ ํ›„ ๊ณ„์ • ๊ธฐ๋ณธ ๋ชจ๋ธ๋กœ ์ž๋™ ํด๋ฐฑ\n * - --flash: gpt-5 alias ์šฐ์„  ์‹œ๋„ ํ›„ ๊ณ„์ • ๊ธฐ๋ณธ ๋ชจ๋ธ๋กœ ์ž๋™ ํด๋ฐฑ\n * - ๋ฏธ์ง€์ •: gpt-5 alias ์šฐ์„  ์‹œ๋„ ํ›„ ๊ณ„์ • ๊ธฐ๋ณธ ๋ชจ๋ธ๋กœ ์ž๋™ ํด๋ฐฑ\n *\n * ์ถ”๋ก  ๊ฐ•๋„ ๊ธฐ๋ณธ๊ฐ’:\n * - --review: high\n * - --flash: low\n * - ๋ฏธ์ง€์ •: medium\n */\nexport const createCodexCommand = (tempDiffPath: string, reviewFormPath: string) => {\n trace('createCodexCommand:start', `tempDiffPath=${tempDiffPath}, reviewFormPath=${reviewFormPath}`);\n const customModel = getArgValue('--model');\n const reasoningEffort = resolveReasoningEffort();\n\n const rules = [rulesPath, namingRulesPath, codingConventionRulesPath]\n .filter((filePath) => fs.existsSync(filePath))\n .map((filePath) => `- ${filePath}`)\n .join('\\n');\n const rulesCount = rules ? rules.split('\\n').length : 0;\n trace('rules:loaded', `count=${rulesCount}`);\n\n const hasReviewForm = fs.existsSync(reviewFormPath);\n const reviewFormLine = hasReviewForm ? `- ${reviewFormPath}` : '';\n trace('reviewForm:status', reviewFormLine ? 'exists' : 'missing');\n\n const prompt = `์•„๋ž˜ ํŒŒ์ผ๋“ค์„ ์ฐธ๊ณ ํ•ด์„œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ์ง„ํ–‰ํ•ด์ค˜.\n๊ทœ์น™ ํŒŒ์ผ: \n${rules || '- (์—†์Œ)'}\n๋ฆฌ๋ทฐ ์–‘์‹ ํŒŒ์ผ:\n${reviewFormLine || '- (์—†์Œ)'}\n๋ฆฌ๋ทฐ ๋Œ€์ƒ diff ํŒŒ์ผ:\n- ${tempDiffPath}\n\n๋ฐ˜๋“œ์‹œ ๋ฆฌ๋ทฐ ์–‘์‹์— ๋งž์ถฐ ์ž‘์„ฑํ•ด์ค˜.`;\n trace('prompt:prepared', `length=${prompt.length}`);\n\n let command = '';\n\n if (customModel) {\n printNotice('โš ๏ธ ์ง€์ •ํ•œ ๋ชจ๋ธ์ด ์—†๋Š” ๊ฒฝ์šฐ, ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋‹ˆ ์ฃผ์˜ํ•˜์„ธ์š”.');\n trace('model:custom', customModel);\n command = buildCodexExecCommand(prompt, reasoningEffort, customModel);\n } else {\n const preferredModelAlias = 'gpt-5';\n const aliasCommand = buildCodexExecCommand(prompt, reasoningEffort, preferredModelAlias);\n const fallbackCommand = buildCodexExecCommand(prompt, reasoningEffort);\n\n printNotice(\n `โš ๏ธ ๋ชจ๋ธ์ด ์ง€์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. alias(${preferredModelAlias})๋ฅผ ์šฐ์„  ์‹œ๋„ํ•˜๊ณ  ์‹คํŒจํ•˜๋ฉด ๊ณ„์ • ๊ธฐ๋ณธ ๋ชจ๋ธ๋กœ ์ž๋™ ํด๋ฐฑํ•ฉ๋‹ˆ๋‹ค.`\n );\n trace('model:alias-first', preferredModelAlias);\n trace('model:fallback', 'account-default');\n command = `${aliasCommand} || ${fallbackCommand}`;\n }\n\n trace('command:created');\n\n if (args.includes('--test')) {\n const safeCommand = command.replace(/\"/g, '\\\\\"');\n trace('test-mode:return-preview');\n\n return `echo \"[TEST MODE] Codex ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.\\n\\n์ƒ์„ฑ๋  ๋ช…๋ น์–ด ๋ฏธ๋ฆฌ๋ณด๊ธฐ:\\n${safeCommand}\"`;\n }\n\n trace('command:mode', 'execute');\n trace('createCodexCommand:end');\n\n return command;\n};\n","import { execSync } from 'child_process';\n\nimport { createTraceLogger, exitWithError, getErrorSummary } from '../../common/helper';\n\nconst trace = createTraceLogger('installation-codex');\n\n// codex-cli ์„ค์น˜ ํ™•์ธ ๋ฐ ์„ค์น˜\nexport function checkCodexCliInstalled() {\n trace('checkCodexCliInstalled:start');\n try {\n trace('version-check:run', 'codex --version');\n execSync('codex --version', { stdio: 'ignore' });\n trace('version-check:ok');\n } catch (error) {\n trace('version-check:failed', getErrorSummary(error));\n trace('install:start', '@openai/codex');\n console.log('โ„น๏ธ codex-cli๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ค์น˜๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค... npm install -g @openai/codex');\n try {\n execSync('npm install -g @openai/codex', { stdio: 'inherit' });\n trace('install:ok', 'login-required');\n console.log('โœ… codex-cli ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');\n console.log('โš ๏ธ codex-cli ์‚ฌ์šฉ์„ ์œ„ํ•ด ์ธ์ฆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.');\n console.log(' ํ„ฐ๋ฏธ๋„์—์„œ \"codex login\" ์„ ์ž…๋ ฅํ•˜์—ฌ ๋กœ๊ทธ์ธ์„ ์™„๋ฃŒํ•œ ํ›„, ๋‹ค์‹œ ์‹œ๋„ํ•ด์ฃผ์„ธ์š”.');\n process.exit(1);\n } catch (installError) {\n trace('install:failed', getErrorSummary(installError));\n exitWithError('โŒ codex-cli ์„ค์น˜ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ถŒํ•œ ๋ฌธ์ œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (sudo ํ•„์š”).', {\n scope: 'installation-codex',\n error: installError\n });\n }\n }\n trace('checkCodexCliInstalled:end');\n}\n","import fs from 'fs';\nimport path from 'path';\n\nimport { codingConventionRulesPath, createTraceLogger, namingRulesPath, rulesPath } from '../../common/helper';\n// gemini ์‹คํ–‰ ๋ฐ ๊ฒฐ๊ณผ ์บก์ฒ˜\nconst args = process.argv.slice(2);\nconst trace = createTraceLogger('gemini-commander', args);\nconst ALLOWED_REASONING_EFFORTS = ['minimal', 'low', 'medium', 'high'] as const;\n\ntype ReasoningEffort = (typeof ALLOWED_REASONING_EFFORTS)[number];\ntype GeminiPromptFile = {\n path: string;\n display: string;\n};\n\nfunction shellQuote(value: string) {\n return `'${value.replace(/'/g, `'\\\\''`)}'`;\n}\n\nfunction getArgValue(flag: string) {\n const index = args.indexOf(flag);\n\n if (index === -1 || !args[index + 1]) {\n return '';\n }\n\n return args[index + 1];\n}\n\nfunction printNotice(message: string) {\n if (args.includes('--test')) {\n console.warn(message);\n }\n}\n\nfunction toUnique(values: string[]) {\n const seen = new Set<string>();\n\n return values.filter((value) => {\n if (!value || seen.has(value)) {\n return false;\n }\n seen.add(value);\n\n return true;\n });\n}\n\nfunction resolveReasoningEffort(): ReasoningEffort {\n const customReasoningEffort = getArgValue('--reasoning-effort');\n\n if (customReasoningEffort) {\n if (ALLOWED_REASONING_EFFORTS.includes(customReasoningEffort as ReasoningEffort)) {\n trace('reasoning:custom', customReasoningEffort);\n\n return customReasoningEffort as ReasoningEffort;\n }\n\n printNotice(\n `โš ๏ธ ์ง€์›๋˜์ง€ ์•Š๋Š” reasoning effort(${customReasoningEffort})์ž…๋‹ˆ๋‹ค. allowed: ${ALLOWED_REASONING_EFFORTS.join(\n ', '\n )}`\n );\n }\n\n if (args.includes('--flash')) {\n trace('reasoning:flash-default', 'minimal');\n\n return 'minimal';\n }\n\n if (args.includes('--review')) {\n trace('reasoning:review-default', 'high');\n\n return 'high';\n }\n\n trace('reasoning:default', 'medium');\n\n return 'medium';\n}\n\nfunction resolvePrimaryAlias(reasoningEffort: ReasoningEffort) {\n if (args.includes('--review')) {\n trace('model:mode-alias', 'pro');\n\n return 'pro';\n }\n\n if (args.includes('--flash')) {\n trace('model:mode-alias', 'flash');\n\n return 'flash';\n }\n\n // ์ผ๋ฐ˜ ๋ชจ๋“œ์—์„œ๋Š” ์ถ”๋ก  ๊ฐ•๋„ ๊ธฐ์ค€์œผ๋กœ alias๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.\n if (reasoningEffort === 'high') {\n trace('model:reasoning-alias', 'pro');\n\n return 'pro';\n }\n\n if (reasoningEffort === 'minimal' || reasoningEffort === 'low') {\n trace('model:reasoning-alias', 'flash');\n\n return 'flash';\n }\n\n trace('model:default-alias', 'auto');\n\n return 'auto';\n}\n\nfunction getAliasFallbacks(primaryAlias: string) {\n if (primaryAlias === 'pro') {\n return ['pro', 'flash', 'auto'];\n }\n\n if (primaryAlias === 'flash') {\n return ['flash', 'auto', 'pro'];\n }\n\n return [primaryAlias, 'auto', 'flash', 'pro'];\n}\n\nfunction getReasoningInstruction(reasoningEffort: ReasoningEffort) {\n if (reasoningEffort === 'high') {\n return 'high (๊นŠ์ด ์žˆ๋Š” ๋ถ„์„, ์ž ์žฌ์  ๋ฆฌ์Šคํฌ๊นŒ์ง€ ์ ๊ฒ€)';\n }\n\n if (reasoningEffort === 'medium') {\n return 'medium (๊ท ํ˜• ์žกํžŒ ๋ถ„์„๊ณผ ํ•ต์‹ฌ ์ด์Šˆ ์ค‘์‹ฌ)';\n }\n\n if (reasoningEffort === 'low') {\n return 'low (ํ•ต์‹ฌ ๊ฒฐํ•จ ์œ„์ฃผ๋กœ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋ถ„์„)';\n }\n\n return 'minimal (์น˜๋ช…๋„ ๋†’์€ ์ด์Šˆ๋งŒ ๋งค์šฐ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๋ถ„์„)';\n}\n\nfunction buildGeminiExecCommand(prompt: string, model?: string) {\n const modelOption = model ? `--model ${shellQuote(model)}` : '';\n\n return `gemini ${[modelOption, '-p', shellQuote(prompt)].filter(Boolean).join(' ')}`;\n}\n\n/**\n * @description\n * Gemini CLI ํ”„๋กฌํ”„ํŠธ์—์„œ ์‚ฌ์šฉํ•  ํŒŒ์ผ ์ฐธ์กฐ ํ† ํฐ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.\n * ํŒŒ์ผ ์ฐธ์กฐ๋ฅผ ์‰ผํ‘œ๋‚˜ ๊ด„ํ˜ธ์™€ ์ง์ ‘ ๋ถ™์ด์ง€ ์•Š๋„๋ก helper๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ,\n * Gemini๊ฐ€ ๊ฒฝ๋กœ์˜ ๋์„ ์•ˆ์ •์ ์œผ๋กœ ์ธ์‹ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.\n * @param filePath Gemini๊ฐ€ ์ฝ์–ด์•ผ ํ•˜๋Š” ํŒŒ์ผ ๊ฒฝ๋กœ\n * @returns Gemini ํŒŒ์ผ ์ฐธ์กฐ ํ˜•์‹(@๊ฒฝ๋กœ)\n */\nfunction toGeminiFileReference(filePath: string) {\n return `@${filePath}`;\n}\n\n/**\n * @description\n * Gemini๊ฐ€ ์ฝ์„ ํŒŒ์ผ ๋ชฉ๋ก์„ ํ•œ ์ค„ ํ”„๋กฌํ”„ํŠธ์— ์•ˆ์ „ํ•˜๊ฒŒ ์‚ฝ์ž…ํ•  ์ˆ˜ ์žˆ๋Š” ํ•ญ๋ชฉ์œผ๋กœ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.\n * ๊ธฐ์กด์ฒ˜๋Ÿผ ์‰ผํ‘œ๋‚˜ ๊ด„ํ˜ธ๋ฅผ ํŒŒ์ผ ์ฐธ์กฐ ๋ฐ”๋กœ ๋’ค์— ๋ถ™์ด๋ฉด ํŒŒ์ผ ๊ฒฝ๋กœ ์ผ๋ถ€๋กœ ํ•ด์„๋  ์ˆ˜ ์žˆ์–ด,\n * `๋ผ๋ฒจ @๊ฒฝ๋กœ` ํ˜•ํƒœ์˜ ๋‹จ์ˆœ ํ† ํฐ ๋ฌธ์ž์—ด๋กœ ๋งŒ๋“ค์–ด ์žฌ์กฐํ•ฉํ•ฉ๋‹ˆ๋‹ค.\n * @param files Gemini ํ”„๋กฌํ”„ํŠธ์— ํฌํ•จํ•  ํŒŒ์ผ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ชฉ๋ก\n * @returns ์‹ค์ œ๋กœ ์กด์žฌํ•˜๋Š” ํŒŒ์ผ ๊ธฐ์ค€์˜ ํ•ญ๋ชฉ ๋ชฉ๋ก๊ณผ ๊ฐœ์ˆ˜\n */\nfunction buildGeminiFileReferenceSection(files: GeminiPromptFile[]) {\n const existingFiles = files.filter((file) => fs.existsSync(file.path));\n\n return {\n count: existingFiles.length,\n items: existingFiles.map((file) => `${file.display} ${toGeminiFileReference(file.path)}`)\n };\n}\n\n/**\n * @description\n * Gemini CLI๋ฅผ ํ™œ์šฉํ•œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ๋ช…๋ น์–ด๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.\n *\n * ๋ชจ๋ธ ์ „๋žต:\n * 1) --model ์ปค์Šคํ…€ ๋ชจ๋ธ ์šฐ์„  ์‹œ๋„\n * 2) ์„œ๋น„์Šค alias ์ˆœ์ฐจ ํด๋ฐฑ (pro/flash/auto ์กฐํ•ฉ)\n * 3) ๋งˆ์ง€๋ง‰์— --model ์—†์ด ๊ณ„์ •/CLI ๊ธฐ๋ณธ ๋ชจ๋ธ๋กœ ํด๋ฐฑ\n *\n * reasoning ์ „๋žต:\n * - Gemini CLI๋Š” ํ˜„์žฌ reasoning effort ์ „์šฉ ํ”Œ๋ž˜๊ทธ๊ฐ€ ์—†์–ด ํ”„๋กฌํ”„ํŠธ ์ง€์‹œ๋ฌธ์œผ๋กœ ๋ฐ˜์˜\n * - --reasoning-effort(minimal|low|medium|high) ์ง€์›\n */\nexport const createGeminiCommand = (tempDiffPath: string, reviewFormPath: string) => {\n trace('createGeminiCommand:start', `tempDiffPath=${tempDiffPath}, reviewFormPath=${reviewFormPath}`);\n const customModel = getArgValue('--model');\n const reasoningEffort = resolveReasoningEffort();\n const primaryAlias = resolvePrimaryAlias(reasoningEffort);\n const aliasFallbacks = toUnique(getAliasFallbacks(primaryAlias));\n const resolvedTempDiffPath = path.resolve(tempDiffPath);\n const resolvedReviewFormPath = path.resolve(reviewFormPath);\n\n // ์กด์žฌํ•˜์ง€ ์•Š๋Š” ํŒŒ์ผ์€ ์ œ์™ธํ•˜์—ฌ ๋ช…๋ น์–ด ์ƒ์„ฑ\n const rules: GeminiPromptFile[] = [\n { path: rulesPath, display: '๋ฃฐ์…‹' },\n { path: namingRulesPath, display: '๋„ค์ด๋ฐ ๊ทœ์น™' },\n { path: codingConventionRulesPath, display: '์ฝ”๋”ฉ ์ปจ๋ฒค์…˜' }\n ];\n\n const ruleSection = buildGeminiFileReferenceSection(rules);\n trace('rules:loaded', `count=${ruleSection.count}`);\n\n const reviewFormExists = fs.existsSync(resolvedReviewFormPath);\n const reviewFormText = reviewFormExists ? `๋ฆฌ๋ทฐ ์–‘์‹ ${toGeminiFileReference(resolvedReviewFormPath)}` : '๋ฆฌ๋ทฐ ์–‘์‹ (์—†์Œ)';\n trace('reviewForm:status', reviewFormExists ? 'exists' : 'missing');\n\n const reasoningInstruction = getReasoningInstruction(reasoningEffort);\n const ruleText = ruleSection.items.join(' ') || '(์—†์Œ)';\n const diffText = `๋ฆฌ๋ทฐ ๋Œ€์ƒ diff ${toGeminiFileReference(resolvedTempDiffPath)}`;\n const prompt = [\n '์•„๋ž˜ ํŒŒ์ผ๋“ค์„ ์ˆœ์„œ๋Œ€๋กœ ์ฝ๊ณ  ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ์ง„ํ–‰ํ•ด์ค˜.',\n `๊ทœ์น™ ํŒŒ์ผ: ${ruleText}`,\n `๋ฆฌ๋ทฐ ์–‘์‹ ํŒŒ์ผ: ${reviewFormText}`,\n `๋ฆฌ๋ทฐ ๋Œ€์ƒ diff ํŒŒ์ผ: ${diffText}`,\n '๋ฐ˜๋“œ์‹œ ๋ฆฌ๋ทฐ ์–‘์‹์— ๋งž์ถฐ ์ž‘์„ฑํ•ด์ค˜.',\n `์ถ”๋ก  ๊ฐ•๋„ ์ง€์นจ: ${reasoningInstruction}`\n ].join(' ');\n trace('prompt:prepared', `length=${prompt.length}`);\n\n const modelCandidates = toUnique(customModel ? [customModel, ...aliasFallbacks] : aliasFallbacks);\n trace('model:candidates', modelCandidates.join(', '));\n trace('command:candidates:count', String(modelCandidates.length + 1));\n\n if (customModel) {\n printNotice(\n `โš ๏ธ ์ปค์Šคํ…€ ๋ชจ๋ธ(${customModel})์„ ์šฐ์„  ์‹œ๋„ํ•˜๊ณ  ์‹คํŒจํ•˜๋ฉด alias(${aliasFallbacks.join(\n ' -> '\n )}) ๋ฐ ๊ธฐ๋ณธ ๋ชจ๋ธ ์ˆœ์œผ๋กœ ํด๋ฐฑํ•ฉ๋‹ˆ๋‹ค.`\n );\n } else {\n printNotice(\n `โš ๏ธ ๋ชจ๋ธ์ด ์ง€์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. alias(${aliasFallbacks.join(' -> ')})๋ฅผ ์ˆœ์ฐจ ์‹œ๋„ํ•˜๊ณ  ๋งˆ์ง€๋ง‰์— ๊ธฐ๋ณธ ๋ชจ๋ธ๋กœ ํด๋ฐฑํ•ฉ๋‹ˆ๋‹ค.`\n );\n }\n\n const commandCandidates = modelCandidates.map((model) => buildGeminiExecCommand(prompt, model));\n const command = [...commandCandidates, buildGeminiExecCommand(prompt)].join(' || ');\n\n // gemini ์‹คํ–‰ ๋ฐ ๊ฒฐ๊ณผ ์บก์ฒ˜\n trace('command:created');\n\n // test mode\n if (args.includes('--test')) {\n const safeCommand = command.replace(/\"/g, '\\\\\"');\n trace('test-mode:return-preview');\n\n return `echo \"[TEST MODE] Gemini ๋ช…๋ น์–ด๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.\\n\\n์ƒ์„ฑ๋  ๋ช…๋ น์–ด ๋ฏธ๋ฆฌ๋ณด๊ธฐ:\\n${safeCommand}\"`;\n }\n\n trace('command:mode', 'execute');\n trace('createGeminiCommand:end');\n\n return command;\n};\n","import { execSync } from 'child_process';\n\nimport { createTraceLogger, exitWithError, getErrorSummary } from '../../common/helper';\n\nconst trace = createTraceLogger('installation-gemini');\n\n// gemini-cli ์„ค์น˜ ํ™•์ธ ๋ฐ ์„ค์น˜\nexport function checkGeminiCliInstalled() {\n trace('checkGeminiCliInstalled:start');\n try {\n trace('version-check:run', 'gemini --version');\n execSync('gemini --version', { stdio: 'ignore' });\n trace('version-check:ok');\n } catch (error) {\n trace('version-check:failed', getErrorSummary(error));\n trace('install:start', '@google/gemini-cli');\n console.log('โ„น๏ธ gemini-cli๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ค์น˜๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค... npm install -g @google/gemini-cli');\n try {\n execSync('npm install -g @google/gemini-cli', { stdio: 'inherit' });\n trace('install:ok', 'login-required');\n console.log('โœ… gemini-cli ์„ค์น˜๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');\n console.log('โš ๏ธ Gemini API ์‚ฌ์šฉ์„ ์œ„ํ•ด ์ธ์ฆ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.');\n console.log(' ํ„ฐ๋ฏธ๋„์—์„œ \"gemini\" ๋ฅผ ์ž…๋ ฅํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ € ๋กœ๊ทธ์ธ์„ ์™„๋ฃŒํ•œ ํ›„, ๋‹ค์‹œ ์‹œ๋„ํ•ด์ฃผ์„ธ์š”.');\n process.exit(1);\n } catch (installError) {\n trace('install:failed', getErrorSummary(installError));\n exitWithError('โŒ gemini-cli ์„ค์น˜ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ถŒํ•œ ๋ฌธ์ œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (sudo ํ•„์š”).', {\n scope: 'installation-gemini',\n error: installError\n });\n }\n }\n trace('checkGeminiCliInstalled:end');\n}\n","#!/usr/bin/env node\nimport fs from 'fs';\n\nimport {\n buildSelectedCommitDiff,\n buildSelectedCommitSummary,\n clearTraceMessages,\n createReportDirectory,\n createTraceLogger,\n deleteTempDiff,\n executeShellCommandWithProgress,\n formatReviewTargetFiles,\n getErrorSummary,\n getNextFilePath,\n getNowString,\n getSelectedCommitFiles,\n isTestMode,\n openReport,\n REPORT_DIR,\n reviewFormPath,\n selectReviewCommits,\n shouldStreamAIOutput,\n tempDiffPath,\n writeExecutionLog,\n writeErrorReport,\n showSelectionAIService\n} from '../common/helper';\n\nimport { createClaudeCommand } from './claude/claude-commander';\nimport { checkClaudeCliInstalled } from './claude/installation-claude';\nimport { createCodexCommand } from './codex/codex-commander';\nimport { checkCodexCliInstalled } from './codex/installation-codex';\nimport { createGeminiCommand } from './gemini/gemini-commander';\nimport { checkGeminiCliInstalled } from './gemini/installation-gemini';\n\nasync function main() {\n // gemini ์‹คํ–‰ ๋ฐ ๊ฒฐ๊ณผ ์บก์ฒ˜\n const args = process.argv.slice(2);\n const startedAt = new Date();\n clearTraceMessages();\n const isTest = isTestMode(args);\n const shouldStreamOutput = shouldStreamAIOutput(args);\n const trace = createTraceLogger('review', args);\n trace('main:start', `args=${JSON.stringify(args)}`);\n let command = '';\n let savedDiffPath = '';\n let savedReportPath = '';\n let service = '';\n let selectedCommitSummary = '';\n let reviewTargetFiles: string[] = [];\n let executionLogPath = '';\n let executionStatus: 'cancelled' | 'failed' | 'success' = 'cancelled';\n let executionTitle = '๋ฆฌ๋ทฐ ์‹คํ–‰์ด ์ทจ์†Œ๋˜์—ˆ๊ฑฐ๋‚˜ ๋ฆฌ๋ทฐ ๋Œ€์ƒ์ด ์—†์–ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.';\n let executionError: unknown = null;\n let resultLength = 0;\n let exitCode = 0;\n\n try {\n // AI ์„œ๋น„์Šค ์„ ํƒ\n trace('service-selection:start');\n service = await showSelectionAIService();\n trace('service-selection:done', `service=${service}`);\n\n switch (service) {\n case 'gemini':\n // gemini-cli ์„ค์น˜ ํ™•์ธ ๋ฐ ์„ค์น˜\n trace('install-check:start', 'service=gemini');\n checkGeminiCliInstalled();\n trace('install-check:done', 'service=gemini');\n break;\n case 'claude':\n // claude-cli ์„ค์น˜ ํ™•์ธ ๋ฐ ์„ค์น˜\n trace('install-check:start', 'service=claude');\n checkClaudeCliInstalled();\n trace('install-check:done', 'service=claude');\n break;\n case 'codex':\n // codex-cli ์„ค์น˜ ํ™•์ธ ๋ฐ ์„ค์น˜\n trace('install-check:start', 'service=codex');\n checkCodexCliInstalled();\n trace('install-check:done', 'service=codex');\n break;\n }\n\n trace('review-flow:start');\n console.log('๐Ÿš€ AI Code Review๋ฅผ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค...');\n if (shouldStreamOutput) {\n console.log('โ„น๏ธ AI ์‹ค์‹œ๊ฐ„ ์‘๋‹ต ํ‘œ์‹œ ๋ชจ๋“œ๊ฐ€ ํ™œ์„ฑํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.');\n }\n\n trace('commit-selection:start');\n const selectedCommits = await selectReviewCommits();\n trace('commit-selection:done', `count=${selectedCommits.length}`);\n\n if (selectedCommits.length === 0) {\n trace('commit-selection:empty');\n executionTitle = '์„ ํƒ๋œ ์ปค๋ฐ‹์ด ์—†์Šต๋‹ˆ๋‹ค.';\n console.log('โ„น๏ธ ์„ ํƒ๋œ ์ปค๋ฐ‹์ด ์—†์Šต๋‹ˆ๋‹ค.');\n deleteTempDiff();\n return;\n }\n\n selectedCommitSummary = buildSelectedCommitSummary(selectedCommits);\n trace('commit-summary:prepared', selectedCommitSummary);\n\n reviewTargetFiles = getSelectedCommitFiles(selectedCommits);\n console.log(`๐Ÿ“‚ ๋ฆฌ๋ทฐ ๋Œ€์ƒ ํŒŒ์ผ(${reviewTargetFiles.length}๊ฐœ): ${formatReviewTargetFiles(reviewTargetFiles)}`);\n console.log('โณ ์„ ํƒํ•œ ์ปค๋ฐ‹ diff๋ฅผ ์ •๋ฆฌํ•˜๋Š” ์ค‘์ž…๋‹ˆ๋‹ค...');\n trace('git-diff:build:start');\n const diff = buildSelectedCommitDiff(selectedCommits);\n trace('git-diff:build:done', `length=${diff.length}`);\n\n if (!diff.trim() && !isTest) {\n trace('empty-diff:exit');\n executionTitle = '์„ ํƒํ•œ ์ปค๋ฐ‹์—์„œ ๋ฆฌ๋ทฐ ๋Œ€์ƒ ํŒŒ์ผ ๋ณ€๊ฒฝ์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.';\n console.log('โ„น๏ธ ์„ ํƒํ•œ ์ปค๋ฐ‹์—์„œ ๋ฆฌ๋ทฐ ๋Œ€์ƒ ํŒŒ์ผ ๋ณ€๊ฒฝ์„ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.');\n // ์ž„์‹œ ํŒŒ์ผ ์‚ญ์ œ\n deleteTempDiff();\n return;\n }\n\n const nowStr = getNowString();\n trace('timestamp:created', nowStr);\n\n // ๋ฆฌ๋ทฐ ๊ฒฐ๊ณผ ํด๋” ์ƒ์„ฑ\n trace('report-dir:create:start');\n createReportDirectory();\n trace('report-dir:create:done');\n\n trace('temp-diff:write:start', tempDiffPath);\n fs.writeFileSync(tempDiffPath, diff);\n trace('temp-diff:write:done');\n\n // diff ํŒŒ์ผ ์ €์žฅ (.review-report ์•ˆ์œผ๋กœ ๋ณต์‚ฌ)\n trace('saved-diff:copy:start');\n savedDiffPath = getNextFilePath(REPORT_DIR, `${nowStr}-diff`, '.txt');\n fs.copyFileSync(tempDiffPath, savedDiffPath);\n trace('saved-diff:copy:done', savedDiffPath);\n\n // ๋ช…๋ น์–ด ์ƒ์„ฑ\n trace('command:create:start', `service=${service}`);\n\n switch (service) {\n case 'gemini':\n // gemini-cli ์— ๋งž๊ฒŒ ํ”„๋กฌํ”„ํŠธ ๋ช…๋ น์–ด ์ƒ์„ฑ\n command = createGeminiCommand(tempDiffPath, reviewFormPath);\n break;\n case 'claude':\n // claude-cli ์— ๋งž๊ฒŒ ํ”„๋กฌํ”„ํŠธ ๋ช…๋ น์–ด ์ƒ์„ฑ\n command = createClaudeCommand(tempDiffPath, reviewFormPath);\n break;\n case 'codex':\n // codex-cli ์— ๋งž๊ฒŒ ํ”„๋กฌํ”„ํŠธ ๋ช…๋ น์–ด ์ƒ์„ฑ\n command = createCodexCommand(tempDiffPath, reviewFormPath);\n break;\n }\n trace('command:create:done');\n\n // ๊ฒฐ๊ณผ๊ฐ€ ๊ธธ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ buffer๋ฅผ ๋„‰๋„‰ํ•˜๊ฒŒ ์žก๊ฑฐ๋‚˜ ์ˆœ์ฐจ์ ์œผ๋กœ ๋ฐ›์Œ. ์—ฌ๊ธฐ์„œ๋Š” ๊ฐ„๋‹จํžˆ toString()\n trace('command:exec:start');\n const result = (\n await executeShellCommandWithProgress(command, {\n progressMessage: `โณ [๋ฆฌ๋ทฐ ์ง„ํ–‰] ${service} | ๋Œ€์ƒ ${reviewTargetFiles.length}๊ฐœ ํŒŒ์ผ`,\n streamOutput: isTest || shouldStreamOutput\n })\n ).stdout;\n resultLength = result.length;\n trace('command:exec:done', `resultLength=${result.length}`);\n\n // ๋ฆฌ๋ทฐ ๊ฒฐ๊ณผ ์ €์žฅ\n trace('report:write:start');\n savedReportPath = getNextFilePath(REPORT_DIR, nowStr, '.md');\n fs.writeFileSync(savedReportPath, result);\n trace('report:write:done', savedReportPath);\n\n //์‚ฌ์šฉํ•œ ๋ช…๋ น์–ด๋„ ์ €์žฅ(๋””๋ฒ„๊น…์šฉ)\n if (isTest) {\n trace('test-command:append:start');\n fs.appendFileSync(savedReportPath, `\\n\\n## ์‚ฌ์šฉ๋œ ๋ช…๋ น์–ด\\n\\n${command}`);\n trace('test-command:append:done');\n }\n\n console.log(`\\nโœ… ๋ฆฌ๋ทฐ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.`);\n console.log(`๐Ÿ“„ ๋ฆฌํฌํŠธ ์ €์žฅ ์œ„์น˜: ${savedReportPath}`);\n console.log(`diff ์ €์žฅ ์œ„์น˜: ${savedDiffPath}`);\n\n // ๋ธŒ๋ผ์šฐ์ € ์—ด๊ธฐ\n trace('open-report:start');\n openReport(savedReportPath);\n trace('open-report:done');\n\n // ์ž„์‹œ ํŒŒ์ผ ์‚ญ์ œ\n trace('cleanup-temp-diff:start');\n deleteTempDiff();\n trace('cleanup-temp-diff:done');\n trace('review-flow:end');\n executionStatus = 'success';\n executionTitle = '๋ฆฌ๋ทฐ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.';\n } catch (error) {\n trace('review-flow:catch', getErrorSummary(error));\n let errorReportPath = '';\n executionStatus = 'failed';\n executionTitle = '๋ฆฌ๋ทฐ ์‹คํ–‰ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.';\n executionError = error;\n exitCode = 1;\n\n trace('cleanup-temp-diff:start(catch)');\n try {\n deleteTempDiff();\n trace('cleanup-temp-diff:done(catch)');\n } catch (cleanupError) {\n trace('cleanup-temp-diff:failed(catch)', getErrorSummary(cleanupError));\n console.error('โš ๏ธ ์ž„์‹œ diff ์ •๋ฆฌ ์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.');\n console.error(cleanupError);\n }\n\n trace('error-report:prepare', `service=${service}`);\n errorReportPath = writeErrorReport(error, {\n scope: 'review',\n args,\n extraSections: [\n {\n heading: 'Execution Context',\n markdown: `\\`\\`\\`json\\n${JSON.stringify(\n {\n service,\n selectedCommitSummary: selectedCommitSummary || null,\n reviewTargetFiles,\n command: command || null,\n tempDiffPath,\n savedDiffPath: savedDiffPath || null,\n savedReportPath: savedReportPath || null\n },\n null,\n 2\n )}\\n\\`\\`\\``\n }\n ]\n });\n\n console.error('โŒ ๋ฆฌ๋ทฐ ๋„์ค‘ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.');\n console.error(error);\n\n if (errorReportPath) {\n console.error(`๐Ÿ“„ ์—๋Ÿฌ ๋กœ๊ทธ ์ €์žฅ ์œ„์น˜: ${errorReportPath}`);\n }\n } finally {\n executionLogPath = writeExecutionLog({\n scope: 'review',\n status: executionStatus,\n title: executionTitle,\n args,\n startedAt,\n error: executionError,\n extraSections: [\n {\n heading: 'Execution Context',\n markdown: `\\`\\`\\`json\\n${JSON.stringify(\n {\n service: service || null,\n selectedCommitSummary: selectedCommitSummary || null,\n reviewTargetFiles,\n command: command || null,\n tempDiffPath,\n savedDiffPath: savedDiffPath || null,\n savedReportPath: savedReportPath || null,\n shouldStreamOutput,\n resultLength\n },\n null,\n 2\n )}\\n\\`\\`\\``\n },\n {\n heading: 'Generated Command',\n markdown: command ? `\\`\\`\\`sh\\n${command}\\n\\`\\`\\`` : '(์—†์Œ)'\n }\n ]\n });\n\n if (executionLogPath) {\n const writeLog = executionStatus === 'failed' ? console.error : console.log;\n writeLog(`๐Ÿ“ ์‹คํ–‰ ๋กœ๊ทธ ์ €์žฅ ์œ„์น˜: ${executionLogPath}`);\n }\n }\n\n if (exitCode !== 0) {\n process.exit(exitCode);\n }\n}\n\nmain();\n"]}