sales-frontend-gemini-cli 0.4.1 → 0.4.3

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 (45) hide show
  1. package/dist/common/helper.cjs +674 -68
  2. package/dist/common/helper.cjs.map +1 -1
  3. package/dist/common/helper.d.cts +106 -4
  4. package/dist/common/helper.d.ts +106 -4
  5. package/dist/common/helper.js +659 -70
  6. package/dist/common/helper.js.map +1 -1
  7. package/dist/common/types.d.cts +24 -1
  8. package/dist/common/types.d.ts +24 -1
  9. package/dist/pr-review/claude/claude-commander.cjs +58 -10
  10. package/dist/pr-review/claude/claude-commander.cjs.map +1 -1
  11. package/dist/pr-review/claude/claude-commander.js +58 -10
  12. package/dist/pr-review/claude/claude-commander.js.map +1 -1
  13. package/dist/pr-review/claude/installation-claude.cjs +219 -13
  14. package/dist/pr-review/claude/installation-claude.cjs.map +1 -1
  15. package/dist/pr-review/claude/installation-claude.js +218 -13
  16. package/dist/pr-review/claude/installation-claude.js.map +1 -1
  17. package/dist/pr-review/codex/codex-commander.cjs +55 -9
  18. package/dist/pr-review/codex/codex-commander.cjs.map +1 -1
  19. package/dist/pr-review/codex/codex-commander.js +55 -9
  20. package/dist/pr-review/codex/codex-commander.js.map +1 -1
  21. package/dist/pr-review/codex/installation-codex.cjs +219 -13
  22. package/dist/pr-review/codex/installation-codex.cjs.map +1 -1
  23. package/dist/pr-review/codex/installation-codex.js +218 -13
  24. package/dist/pr-review/codex/installation-codex.js.map +1 -1
  25. package/dist/pr-review/gemini/gemini-commander.cjs +82 -16
  26. package/dist/pr-review/gemini/gemini-commander.cjs.map +1 -1
  27. package/dist/pr-review/gemini/gemini-commander.js +82 -16
  28. package/dist/pr-review/gemini/gemini-commander.js.map +1 -1
  29. package/dist/pr-review/gemini/installation-gemini.cjs +219 -13
  30. package/dist/pr-review/gemini/installation-gemini.cjs.map +1 -1
  31. package/dist/pr-review/gemini/installation-gemini.js +218 -13
  32. package/dist/pr-review/gemini/installation-gemini.js.map +1 -1
  33. package/dist/pr-review/review-one-by-one.cjs +838 -184
  34. package/dist/pr-review/review-one-by-one.cjs.map +1 -1
  35. package/dist/pr-review/review-one-by-one.js +839 -185
  36. package/dist/pr-review/review-one-by-one.js.map +1 -1
  37. package/dist/pr-review/review.cjs +815 -156
  38. package/dist/pr-review/review.cjs.map +1 -1
  39. package/dist/pr-review/review.js +815 -156
  40. package/dist/pr-review/review.js.map +1 -1
  41. package/package.json +4 -7
  42. package/src/common/rules/coding-convention.md +393 -0
  43. package/src/common/rules/coding-convention.pdf +0 -0
  44. package/src/common/rules/naming-rule.md +347 -0
  45. package/src/common/rules/naming-rule.pdf +0 -0
@@ -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-one-by-one.ts"],"names":["args","fs","tempDiffPath","path","reviewFormPath","trace","execSync","ALLOWED_REASONING_EFFORTS","shellQuote","getArgValue","resolveReasoningEffort","toUnique","resolvePrimaryAlias","getAliasFallbacks"],"mappings":";;;;;;;;AAQA,IAAM,YAAY,IAAK,CAAA,OAAA,CAAQ,aAAc,CAAA,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AAKtD,IAAM,SAAY,GAAA,IAAA,CAAK,OAAQ,CAAA,SAAA,EAAW,wCAAwC,CAAA;AAClF,IAAM,eAAkB,GAAA,IAAA,CAAK,OAAQ,CAAA,SAAA,EAAW,uCAAuC,CAAA;AACvF,IAAM,yBAA4B,GAAA,IAAA,CAAK,OAAQ,CAAA,SAAA,EAAW,6CAA6C,CAAA;AAChF,IAAA,CAAK,OAAQ,CAAA,SAAA,EAAW,sCAAsC;AACrF,IAAM,sBAAyB,GAAA,IAAA,CAAK,OAAQ,CAAA,SAAA,EAAW,iDAAiD,CAAA;AACxG,IAAM,UAAa,GAAA,gBAAA;AACnB,IAAM,YAAe,GAAA,eAAA;AACrB,IAAM,UAA8B,GAAA,CAAC,QAAU,EAAA,QAAA,EAAU,OAAO,CAAA;AAChE,IAAM,UAAa,GAAA;AAAA,EACxB,cAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA,OAAA;AAAA,EACA,eAAA;AAAA,EACA,SAAA;AAAA,EACA,SAAA;AAAA,EACA,QAAA;AAAA,EACA,QAAA;AAAA,EACA;AAAA;AACF,CAAA;AAEA,SAAS,qBAAqBA,KAAiB,GAAA,OAAA,CAAQ,IAAK,CAAA,KAAA,CAAM,CAAC,CAAuB,EAAA;AACxF,EAAM,MAAA,YAAA,GAAeA,KAAK,CAAA,OAAA,CAAQ,WAAW,CAAA;AAC7C,EAAA,MAAM,aAAa,YAAiB,KAAA,EAAA,GAAKA,KAAK,CAAA,YAAA,GAAe,CAAC,CAAI,GAAA,EAAA;AAElE,EAAA,IAAI,CAAC,UAAY,EAAA;AACf,IAAO,OAAA,EAAA;AAAA;AAGT,EAAM,MAAA,iBAAA,GAAoB,WAAW,WAAY,EAAA;AAEjD,EAAI,IAAA,UAAA,CAAW,QAAS,CAAA,iBAAkC,CAAG,EAAA;AAC3D,IAAO,OAAA,iBAAA;AAAA;AAGT,EAAQ,OAAA,CAAA,KAAA;AAAA,IACN,sFAAqB,UAAU,CAAA,oCAAA,EAAc,UAAW,CAAA,IAAA,CAAK,IAAI,CAAC,CAAA,0BAAA;AAAA,GACpE;AACA,EAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAChB;AAEO,SAAS,WAAWA,KAAiB,GAAA,OAAA,CAAQ,IAAK,CAAA,KAAA,CAAM,CAAC,CAAG,EAAA;AACjE,EAAOA,OAAAA,KAAAA,CAAK,SAAS,QAAQ,CAAA;AAC/B;AAEO,SAAS,kBAAkB,KAAeA,EAAAA,KAAAA,GAAiB,QAAQ,IAAK,CAAA,KAAA,CAAM,CAAC,CAAG,EAAA;AACvF,EAAM,MAAA,OAAA,GAAU,WAAWA,KAAI,CAAA;AAE/B,EAAO,OAAA,CAAC,MAAc,MAAoB,KAAA;AACxC,IAAA,IAAI,CAAC,OAAS,EAAA;AACZ,MAAA;AAAA;AAGF,IAAQ,OAAA,CAAA,GAAA,CAAI,CAAW,QAAA,EAAA,KAAK,CAAK,EAAA,EAAA,IAAI,CAAG,EAAA,MAAA,GAAS,CAAM,GAAA,EAAA,MAAM,CAAK,CAAA,GAAA,EAAE,CAAE,CAAA,CAAA;AAAA,GACxE;AACF;AAEO,SAAS,eAAA,CAAgB,GAAa,EAAA,QAAA,EAAkB,SAAmB,EAAA;AAChF,EAAA,IAAI,OAAU,GAAA,CAAA;AAEd,EAAA,OAAO,IAAM,EAAA;AACX,IAAM,MAAA,QAAA,GAAW,IAAK,CAAA,IAAA,CAAK,GAAK,EAAA,CAAA,EAAG,QAAQ,CAAI,CAAA,EAAA,OAAO,CAAG,EAAA,SAAS,CAAE,CAAA,CAAA;AACpE,IAAA,IAAI,CAACC,GAAA,CAAG,UAAW,CAAA,QAAQ,CAAG,EAAA;AAC5B,MAAO,OAAA,QAAA;AAAA;AAET,IAAA,OAAA,EAAA;AAAA;AAEJ;AAEO,SAAS,WAAW,QAAkB,EAAA;AAC3C,EAAI,IAAAA,GAAA,CAAG,UAAW,CAAA,QAAQ,CAAG,EAAA;AAC3B,IAAAA,GAAA,CAAG,WAAW,QAAQ,CAAA;AAAA;AAE1B;AAKO,SAAS,cAAiB,GAAA;AAC/B,EAAA,UAAA,CAAW,YAAY,CAAA;AACzB;AAKO,SAAS,qBAAwB,GAAA;AACtC,EAAA,IAAI,CAACA,GAAA,CAAG,UAAW,CAAA,UAAU,CAAG,EAAA;AAC9B,IAAAA,GAAA,CAAG,SAAU,CAAA,UAAA,EAAY,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA;AAEhD;AAKO,SAAS,YAAe,GAAA;AAC7B,EAAM,MAAA,GAAA,uBAAU,IAAK,EAAA;AACrB,EAAM,MAAA,IAAA,GAAO,IAAI,WAAY,EAAA;AAC7B,EAAM,MAAA,EAAA,GAAK,OAAO,GAAI,CAAA,QAAA,KAAa,CAAC,CAAA,CAAE,QAAS,CAAA,CAAA,EAAG,GAAG,CAAA;AACrD,EAAM,MAAA,EAAA,GAAK,OAAO,GAAI,CAAA,OAAA,EAAS,CAAE,CAAA,QAAA,CAAS,GAAG,GAAG,CAAA;AAChD,EAAM,MAAA,EAAA,GAAK,OAAO,GAAI,CAAA,QAAA,EAAU,CAAE,CAAA,QAAA,CAAS,GAAG,GAAG,CAAA;AACjD,EAAM,MAAA,EAAA,GAAK,OAAO,GAAI,CAAA,UAAA,EAAY,CAAE,CAAA,QAAA,CAAS,GAAG,GAAG,CAAA;AACnD,EAAM,MAAA,EAAA,GAAK,OAAO,GAAI,CAAA,UAAA,EAAY,CAAE,CAAA,QAAA,CAAS,GAAG,GAAG,CAAA;AAEnD,EAAO,OAAA,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAA;AAC9C;AAEO,SAAS,gBAAmB,GAAA;AAEjC,EAAA,MAAM,iBAAoB,GAAA,CAAC,MAAQ,EAAA,OAAA,EAAS,QAAQ,OAAO,CAAA;AAG3D,EAAA,MAAM,kBAAkB,UAAW,CAAA,GAAA,CAAI,CAAC,IAAS,KAAA,CAAA,UAAA,EAAa,IAAI,CAAE,CAAA,CAAA;AAKpE,EAAA,MAAM,KAAQ,GAAA,CAAC,OAAoB,KAAA,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,CAAA;AAC9C,EAAA,MAAM,gBAAgB,iBAAkB,CAAA,GAAA,CAAI,KAAK,CAAA,CAAE,KAAK,GAAG,CAAA;AAC3D,EAAA,MAAM,gBAAgB,eAAgB,CAAA,GAAA,CAAI,KAAK,CAAA,CAAE,KAAK,GAAG,CAAA;AAEzD,EAAO,OAAA,EAAE,eAAe,aAAc,EAAA;AACxC;AAcO,SAAS,WAAW,UAAoB,EAAA;AAC7C,EAAM,MAAA,YAAA,GAAe,IAAK,CAAA,OAAA,CAAQ,UAAU,CAAA;AAC5C,EAAM,MAAA,EAAE,UAAa,GAAA,OAAA;AAErB,EAAA,MAAM,iBAAiB,MAAM;AAC3B,IAAA,IAAI,aAAa,QAAU,EAAA;AACzB,MAAA,QAAA,CAAS,4BAA4B,YAAY,CAAA,CAAA,CAAA,EAAK,EAAE,KAAA,EAAO,UAAU,CAAA;AAEzE,MAAO,OAAA,IAAA;AAAA;AAGT,IAAA,IAAI,aAAa,OAAS,EAAA;AACxB,MAAA,QAAA,CAAS,kBAAkB,YAAY,CAAA,CAAA,CAAA,EAAK,EAAE,KAAA,EAAO,UAAU,CAAA;AAE/D,MAAO,OAAA,IAAA;AAAA;AAGT,IAAO,OAAA,KAAA;AAAA,GACT;AAEA,EAAA,MAAM,yBAAyB,MAAM;AACnC,IAAA,IAAI,aAAa,QAAU,EAAA;AACzB,MAAA,QAAA,CAAS,SAAS,YAAY,CAAA,CAAA,CAAA,EAAK,EAAE,KAAA,EAAO,UAAU,CAAA;AAEtD,MAAO,OAAA,IAAA;AAAA;AAGT,IAAA,IAAI,aAAa,OAAS,EAAA;AACxB,MAAA,QAAA,CAAS,aAAa,YAAY,CAAA,CAAA,CAAA,EAAK,EAAE,KAAA,EAAO,UAAU,CAAA;AAE1D,MAAO,OAAA,IAAA;AAAA;AAGT,IAAO,OAAA,KAAA;AAAA,GACT;AAEA,EAAI,IAAA;AACF,IAAA,IAAI,gBAAkB,EAAA;AACpB,MAAA,OAAA,CAAQ,IAAI,8FAAgC,CAAA;AAE5C,MAAA;AAAA;AACF,GACM,CAAA,MAAA;AAAA;AAIR,EAAI,IAAA;AACF,IAAA,IAAI,wBAA0B,EAAA;AAC5B,MAAA,OAAA,CAAQ,IAAI,sHAA0B,CAAA;AAEtC,MAAA;AAAA;AACF,WACO,CAAG,EAAA;AACV,IAAQ,OAAA,CAAA,KAAA,CAAM,oEAAkB,CAAC,CAAA;AAEjC,IAAA;AAAA;AAGF,EAAQ,OAAA,CAAA,KAAA,CAAM,CAAsB,yFAAA,EAAA,QAAQ,CAAE,CAAA,CAAA;AAChD;AAEO,SAAS,WAAc,GAAA;AAC5B,EAAA,MAAMD,KAAO,GAAA,OAAA,CAAQ,IAAK,CAAA,KAAA,CAAM,CAAC,CAAA;AACjC,EAAM,MAAA,WAAA,GAAcA,KAAK,CAAA,OAAA,CAAQ,UAAU,CAAA;AAC3C,EAAA,MAAM,EAAE,aAAA,EAAe,aAAc,EAAA,GAAI,gBAAiB,EAAA;AAE1D,EAAA,IAAI,QAAW,GAAA,EAAA;AAEf,EAAA,IAAI,gBAAgB,EAAI,EAAA;AAEtB,IAAM,MAAA,UAAA,GAAaA,KAAK,CAAA,WAAA,GAAc,CAAC,CAAA;AACvC,IAAA,IAAI,CAAC,UAAY,EAAA;AACf,MAAA,OAAA,CAAQ,MAAM,iGAAsB,CAAA;AACpC,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA;AAIhB,IAAM,MAAA,OAAA,GAAUA,KAAK,CAAA,WAAA,GAAc,CAAC,CAAA;AACpC,IAAA,IAAI,CAAI,GAAA,CAAA;AACR,IAAA,IAAI,OAAW,IAAA,CAAC,OAAQ,CAAA,UAAA,CAAW,IAAI,CAAG,EAAA;AACxC,MAAI,CAAA,GAAA,QAAA,CAAS,SAAS,EAAE,CAAA;AACxB,MAAI,IAAA,KAAA,CAAM,CAAC,CAAG,EAAA;AACZ,QAAI,CAAA,GAAA,CAAA;AAAA;AACN;AAGF,IAAQ,OAAA,CAAA,GAAA,CAAI,CAAU,2BAAA,EAAA,UAAU,CAAK,EAAA,EAAA,CAAA,GAAI,CAAI,GAAA,CAAA,qBAAA,EAAS,CAAI,GAAA,CAAC,CAAU,yBAAA,CAAA,GAAA,EAAE,CAAY,wCAAA,CAAA,CAAA;AACnF,IAAA,QAAA,GAAW,GAAG,UAAU,CAAA,CAAA,EAAI,CAAI,GAAA,CAAC,IAAI,UAAU,CAAA,CAAA;AAAA,GAC1C,MAAA;AAGL,IAAI,IAAA;AACF,MAAM,MAAA,KAAA,GAAQ,SAAS,CAA2B,wBAAA,EAAA,aAAa,IAAI,aAAa,CAAA,CAAE,EAAE,QAAS,EAAA;AAC7F,MAAI,IAAA,CAAC,KAAM,CAAA,IAAA,EAAQ,EAAA;AACjB,QAAA,OAAA,CAAQ,IAAI,8JAAgD,CAAA;AAC5D,QAAW,QAAA,GAAA,aAAA;AAAA;AACb,KACM,CAAA,MAAA;AAAA;AAER;AAGF,EAAO,OAAA,QAAA;AACT;AA0BA,eAAsB,sBAAiD,GAAA;AACrE,EAAA,MAAM,0BAA0B,oBAAqB,EAAA;AAErD,EAAA,IAAI,uBAAyB,EAAA;AAC3B,IAAA,OAAA,CAAQ,GAAI,CAAA;AAAA,eAAA,EAAiB,uBAAuB,CAAA;AAAA,CAAuC,CAAA;AAE3F,IAAO,OAAA,uBAAA;AAAA;AAGT,EAAA,IAAI,aAAgB,GAAA,CAAA;AAIpB,EAAM,MAAA,EAAA,GAAK,SAAS,eAAgB,CAAA;AAAA,IAClC,OAAO,OAAQ,CAAA,KAAA;AAAA,IACf,QAAQ,OAAQ,CAAA,MAAA;AAAA,IAChB,QAAU,EAAA;AAAA,GACX,CAAA;AAED,EAAA,IAAI,WAAc,GAAA,IAAA;AAGlB,EAAQ,OAAA,CAAA,MAAA,CAAO,MAAM,WAAa,CAAA;AAElC,EAAA,MAAM,SAAS,MAAM;AACnB,IAAA,IAAI,CAAC,WAAa,EAAA;AAIhB,MAAA,QAAA,CAAS,WAAW,OAAQ,CAAA,MAAA,EAAQ,GAAG,EAAE,UAAA,CAAW,SAAS,CAAE,CAAA,CAAA;AAAA;AAEjE,IAAc,WAAA,GAAA,KAAA;AAId,IAAS,QAAA,CAAA,eAAA,CAAgB,QAAQ,MAAM,CAAA;AAEvC,IAAA,OAAA,CAAQ,MAAO,CAAA,KAAA;AAAA,MACb;AAAA,KACF;AACA,IAAW,UAAA,CAAA,OAAA,CAAQ,CAAC,OAAA,EAAS,KAAU,KAAA;AACrC,MAAA,IAAI,UAAU,aAAe,EAAA;AAC3B,QAAQ,OAAA,CAAA,MAAA,CAAO,KAAM,CAAA,CAAA,+CAAA,EAAuD,OAAO,CAAA;AAAA,CAAa,CAAA;AAAA,OAC3F,MAAA;AACL,QAAQ,OAAA,CAAA,MAAA,CAAO,KAAM,CAAA,CAAA,UAAA,EAAQ,OAAO;AAAA,CAAI,CAAA;AAAA;AAC1C,KACD,CAAA;AAAA,GACH;AAEA,EAAO,MAAA,EAAA;AAEP,EAAO,OAAA,IAAI,OAAQ,CAAA,CAAC,OAAY,KAAA;AAC9B,IAAM,MAAA,MAAA,GAAS,CAAC,IAAiB,KAAA;AAC/B,MAAM,MAAA,GAAA,GAAM,KAAK,QAAS,EAAA;AAC1B,MAAA,IAAI,QAAQ,GAAU,EAAA;AAEpB,QAAQ,OAAA,CAAA,MAAA,CAAO,MAAM,WAAa,CAAA;AAClC,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA;AAEhB,MAAA,IAAI,QAAQ,QAAU,EAAA;AAEpB,QAAA,aAAA,GAAA,CAAiB,aAAgB,GAAA,CAAA,GAAI,UAAW,CAAA,MAAA,IAAU,UAAW,CAAA,MAAA;AACrE,QAAO,MAAA,EAAA;AAAA,OACT,MAAA,IAAW,QAAQ,QAAU,EAAA;AAE3B,QAAiB,aAAA,GAAA,CAAA,aAAA,GAAgB,KAAK,UAAW,CAAA,MAAA;AACjD,QAAO,MAAA,EAAA;AAAA,OACE,MAAA,IAAA,GAAA,KAAQ,IAAQ,IAAA,GAAA,KAAQ,IAAM,EAAA;AAEvC,QAAQ,OAAA,CAAA,KAAA,CAAM,cAAe,CAAA,MAAA,EAAQ,MAAM,CAAA;AAC3C,QAAQ,OAAA,CAAA,KAAA,CAAM,WAAW,KAAK,CAAA;AAC9B,QAAA,OAAA,CAAQ,MAAM,KAAM,EAAA;AACpB,QAAA,EAAA,CAAG,KAAM,EAAA;AAGT,QAAQ,OAAA,CAAA,MAAA,CAAO,MAAM,WAAa,CAAA;AAElC,QAAA,OAAA,CAAQ,GAAI,CAAA;AAAA,eAAiB,EAAA,UAAA,CAAW,aAAa,CAAC,CAAA;AAAA,CAA2B,CAAA;AACjF,QAAM,MAAA,MAAA,GAAS,WAAW,aAAa,CAAA;AACvC,QAAA,IAAI,MAAQ,EAAA;AACV,UAAA,OAAA,CAAQ,MAAM,CAAA;AAAA;AAChB;AACF,KACF;AAEA,IAAQ,OAAA,CAAA,KAAA,CAAM,WAAW,IAAI,CAAA;AAC7B,IAAA,OAAA,CAAQ,MAAM,MAAO,EAAA;AACrB,IAAQ,OAAA,CAAA,KAAA,CAAM,EAAG,CAAA,MAAA,EAAQ,MAAM,CAAA;AAAA,GAChC,CAAA;AACH;AC3WA,IAAM,IAAO,GAAA,OAAA,CAAQ,IAAK,CAAA,KAAA,CAAM,CAAC,CAAA;AACjC,IAAM,KAAA,GAAQ,iBAAkB,CAAA,kBAAA,EAAoB,IAAI,CAAA;AACxD,IAAM,yBAA4B,GAAA,CAAC,SAAW,EAAA,KAAA,EAAO,UAAU,MAAM,CAAA;AAKrE,SAAS,WAAW,KAAe,EAAA;AACjC,EAAA,OAAO,CAAI,CAAA,EAAA,KAAA,CAAM,OAAQ,CAAA,IAAA,EAAM,OAAO,CAAC,CAAA,CAAA,CAAA;AACzC;AAEA,SAAS,YAAY,IAAc,EAAA;AACjC,EAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,OAAA,CAAQ,IAAI,CAAA;AAE/B,EAAA,IAAI,UAAU,EAAM,IAAA,CAAC,IAAK,CAAA,KAAA,GAAQ,CAAC,CAAG,EAAA;AACpC,IAAO,OAAA,EAAA;AAAA;AAGT,EAAO,OAAA,IAAA,CAAK,QAAQ,CAAC,CAAA;AACvB;AAEA,SAAS,SAAS,MAAkB,EAAA;AAClC,EAAM,MAAA,IAAA,uBAAW,GAAY,EAAA;AAE7B,EAAO,OAAA,MAAA,CAAO,MAAO,CAAA,CAAC,KAAU,KAAA;AAC9B,IAAA,IAAI,CAAC,KAAA,IAAS,IAAK,CAAA,GAAA,CAAI,KAAK,CAAG,EAAA;AAC7B,MAAO,OAAA,KAAA;AAAA;AAET,IAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AAEd,IAAO,OAAA,IAAA;AAAA,GACR,CAAA;AACH;AAEA,SAAS,gBAAgB,KAAsC,EAAA;AAC7D,EAAA,IAAI,UAAU,SAAW,EAAA;AACvB,IAAO,OAAA,KAAA;AAAA;AAGT,EAAO,OAAA,KAAA;AACT;AAEA,SAAS,sBAAuC,GAAA;AAC9C,EAAA,MAAM,qBAAwB,GAAA,WAAA,CAAY,oBAAoB,CAAA,IAAK,YAAY,UAAU,CAAA;AAEzF,EAAA,IAAI,qBAAuB,EAAA;AACzB,IAAI,IAAA,yBAAA,CAA0B,QAAS,CAAA,qBAAwC,CAAG,EAAA;AAChF,MAAM,MAAA,UAAA,GAAa,gBAAgB,qBAAwC,CAAA;AAC3E,MAAA,KAAA,CAAM,kBAAoB,EAAA,CAAA,EAAG,qBAAqB,CAAA,IAAA,EAAO,UAAU,CAAE,CAAA,CAAA;AAErE,MAAA,IAAI,0BAA0B,SAAW,EAAA;AACvC,QAAA,OAAA,CAAQ,KAAK,sIAA4C,CAAA;AAAA;AAG3D,MAAO,OAAA,UAAA;AAAA;AAGT,IAAQ,OAAA,CAAA,IAAA;AAAA,MACN,CAAA,oEAAA,EAA+B,qBAAqB,CAAA,8BAAA,EAAkB,yBAA0B,CAAA,IAAA;AAAA,QAC9F;AAAA,OACD,CAAA;AAAA,KACH;AAAA;AAGF,EAAI,IAAA,IAAA,CAAK,QAAS,CAAA,SAAS,CAAG,EAAA;AAC5B,IAAA,KAAA,CAAM,2BAA2B,KAAK,CAAA;AAEtC,IAAO,OAAA,KAAA;AAAA;AAGT,EAAI,IAAA,IAAA,CAAK,QAAS,CAAA,UAAU,CAAG,EAAA;AAC7B,IAAA,KAAA,CAAM,4BAA4B,MAAM,CAAA;AAExC,IAAO,OAAA,MAAA;AAAA;AAGT,EAAA,KAAA,CAAM,qBAAqB,QAAQ,CAAA;AAEnC,EAAO,OAAA,QAAA;AACT;AAEA,SAAS,mBAAsB,GAAA;AAC7B,EAAI,IAAA,IAAA,CAAK,QAAS,CAAA,UAAU,CAAG,EAAA;AAC7B,IAAA,KAAA,CAAM,oBAAoB,MAAM,CAAA;AAEhC,IAAO,OAAA,MAAA;AAAA;AAGT,EAAI,IAAA,IAAA,CAAK,QAAS,CAAA,SAAS,CAAG,EAAA;AAC5B,IAAA,KAAA,CAAM,oBAAoB,OAAO,CAAA;AAEjC,IAAO,OAAA,OAAA;AAAA;AAGT,EAAA,KAAA,CAAM,uBAAuB,QAAQ,CAAA;AAErC,EAAO,OAAA,QAAA;AACT;AAEA,SAAS,kBAAkB,YAAsB,EAAA;AAC/C,EAAA,IAAI,iBAAiB,MAAQ,EAAA;AAC3B,IAAO,OAAA,CAAC,MAAQ,EAAA,QAAA,EAAU,OAAO,CAAA;AAAA;AAGnC,EAAA,IAAI,iBAAiB,OAAS,EAAA;AAC5B,IAAO,OAAA,CAAC,SAAS,QAAQ,CAAA;AAAA;AAG3B,EAAO,OAAA,CAAC,YAAc,EAAA,QAAA,EAAU,OAAO,CAAA;AACzC;AAEA,SAAS,uBAAuB,OAO7B,EAAA;AACD,EAAM,MAAA,EAAE,cAAAE,aAAc,EAAA,MAAA,EAAQ,mBAAmB,MAAQ,EAAA,KAAA,EAAO,eAAkB,GAAA,OAAA;AAClF,EAAA,MAAM,cAAc,KAAQ,GAAA,CAAA,QAAA,EAAW,UAAW,CAAA,KAAK,CAAC,CAAK,CAAA,GAAA,EAAA;AAC7D,EAAA,MAAM,iBAAiB,KAAS,IAAA,aAAA,GAAgB,oBAAoB,UAAW,CAAA,aAAa,CAAC,CAAK,CAAA,GAAA,EAAA;AAClG,EAAA,MAAM,YAAe,GAAA,CAAA,SAAA,EAAY,UAAW,CAAA,MAAM,CAAC,CAAA,CAAA;AAEnD,EAAA,MAAM,mBAAsB,GAAA,iBAAA,CACzB,GAAI,CAAA,CAACC,KAAS,KAAA,CAAA,4BAAA,EAA+B,UAAWA,CAAAA,KAAI,CAAC,CAAA,CAAE,CAC/D,CAAA,IAAA,CAAK,GAAG,CAAA;AAEX,EAAA,OAAO,CAAO,IAAA,EAAA,UAAA,CAAWD,aAAY,CAAC,CAAa,UAAA,EAAA;AAAA,IACjD,WAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA,mBAAA;AAAA,IACA,IAAA;AAAA,IACA,WAAW,MAAM;AAAA,IAEhB,MAAO,CAAA,OAAO,CACd,CAAA,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AACd;AAeO,IAAM,mBAAA,GAAsB,CAACA,aAAAA,EAAsBE,eAA2B,KAAA;AACnF,EAAA,KAAA,CAAM,2BAA6B,EAAA,CAAA,aAAA,EAAgBF,aAAY,CAAA,iBAAA,EAAoBE,eAAc,CAAE,CAAA,CAAA;AACnG,EAAM,MAAA,WAAA,GAAc,YAAY,SAAS,CAAA;AACzC,EAAA,MAAM,SAAS,sBAAuB,EAAA;AACtC,EAAA,MAAM,eAAe,mBAAoB,EAAA;AACzC,EAAA,MAAM,cAAiB,GAAA,QAAA,CAAS,iBAAkB,CAAA,YAAY,CAAC,CAAA;AAI/D,EAAA,MAAM,KAAQ,GAAA;AAAA,IACZ,EAAE,IAAA,EAAM,SAAW,EAAA,OAAA,EAAS,cAAK,EAAA;AAAA,IACjC,EAAE,IAAA,EAAM,eAAiB,EAAA,OAAA,EAAS,iCAAS,EAAA;AAAA,IAC3C,EAAE,IAAA,EAAM,yBAA2B,EAAA,OAAA,EAAS,iCAAS;AAAA,GACvD;AACA,EAAA,MAAM,iBAAoB,GAAA,KAAA,CAAM,MAAO,CAAA,CAAC,SAASH,GAAG,CAAA,UAAA,CAAW,IAAK,CAAA,IAAI,CAAC,CAAE,CAAA,GAAA,CAAI,CAAC,IAAA,KAAS,KAAK,IAAI,CAAA;AAElG,EAAA,KAAA,CAAM,cAAgB,EAAA,CAAA,MAAA,EAAS,iBAAkB,CAAA,MAAM,CAAE,CAAA,CAAA;AAGzD,EAAM,MAAA,gBAAA,GAAmBA,GAAG,CAAA,UAAA,CAAWG,eAAc,CAAA;AACrD,EAAM,KAAA,CAAA,mBAAA,EAAqB,gBAAmB,GAAA,QAAA,GAAW,SAAS,CAAA;AAClE,EAAA,MAAM,oBAAoB,gBAAmB,GAAA,CAAC,GAAG,iBAAA,EAAmBA,eAAc,CAAI,GAAA,iBAAA;AAEtF,EAAA,MAAM,MAAS,GAAA,8LAAA;AACf,EAAM,MAAA,eAAA,GAAkB,SAAS,WAAc,GAAA,CAAC,aAAa,GAAG,cAAc,IAAI,cAAc,CAAA;AAChG,EAAA,KAAA,CAAM,kBAAoB,EAAA,eAAA,CAAgB,IAAK,CAAA,IAAI,CAAC,CAAA;AAEpD,EAAA,IAAI,WAAa,EAAA;AACf,IAAQ,OAAA,CAAA,IAAA;AAAA,MACN,CAAA,6CAAA,EAAa,WAAW,CAAA,6EAAA,EAAyB,cAAe,CAAA,IAAA;AAAA,QAC9D;AAAA,OACD,CAAA,qFAAA;AAAA,KACH;AAAA,GACK,MAAA;AACL,IAAQ,OAAA,CAAA,IAAA;AAAA,MACN,CAA4B,+FAAA,EAAA,cAAA,CAAe,IAAK,CAAA,MAAM,CAAC,CAAA,sIAAA;AAAA,KACzD;AAAA;AAGF,EAAA,MAAM,iBAAoB,GAAA,eAAA,CAAgB,GAAI,CAAA,CAAC,OAAO,KAAU,KAAA;AAC9D,IAAM,MAAA,aAAA,GAAgB,eAAgB,CAAA,KAAA,GAAQ,CAAC,CAAA;AAE/C,IAAA,OAAO,sBAAuB,CAAA;AAAA,MAC5B,YAAAF,EAAAA,aAAAA;AAAA,MACA,MAAA;AAAA,MACA,iBAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,GACF,CAAA;AAED,EAAA,MAAM,OAAU,GAAA;AAAA,IACd,GAAG,iBAAA;AAAA,IACH,sBAAuB,CAAA;AAAA,MACrB,YAAAA,EAAAA,aAAAA;AAAA,MACA,MAAA;AAAA,MACA,iBAAA;AAAA,MACA;AAAA,KACD;AAAA,GACH,CAAE,KAAK,MAAM,CAAA;AAEb,EAAA,KAAA,CAAM,iBAAiB,CAAA;AAGvB,EAAI,IAAA,IAAA,CAAK,QAAS,CAAA,QAAQ,CAAG,EAAA;AAC3B,IAAA,MAAM,WAAc,GAAA,OAAA,CAAQ,OAAQ,CAAA,IAAA,EAAM,KAAK,CAAA;AAC/C,IAAA,KAAA,CAAM,0BAA0B,CAAA;AAEhC,IAAO,OAAA,CAAA;;AAAA;AAAA,EAA+D,WAAW,CAAA,CAAA,CAAA;AAAA;AAGnF,EAAA,KAAA,CAAM,yBAAyB,CAAA;AAE/B,EAAO,OAAA,OAAA;AACT,CAAA;ACpOA,IAAMG,MAAAA,GAAQ,kBAAkB,qBAAqB,CAAA;AAG9C,SAAS,uBAA0B,GAAA;AACxC,EAAAA,OAAM,+BAA+B,CAAA;AACrC,EAAI,IAAA;AACF,IAAAA,MAAAA,CAAM,qBAAqB,kBAAkB,CAAA;AAC7C,IAAAC,QAAS,CAAA,kBAAA,EAAoB,EAAE,KAAA,EAAO,UAAU,CAAA;AAChD,IAAAD,OAAM,kBAAkB,CAAA;AAAA,GAClB,CAAA,MAAA;AACN,IAAAA,MAAAA,CAAM,wBAAwB,eAAe,CAAA;AAC7C,IAAQ,OAAA,CAAA,GAAA;AAAA,MACN;AAAA,KACF;AACA,IAAI,IAAA;AACF,MAAAC,QAAS,CAAA,0CAAA,EAA4C,EAAE,KAAA,EAAO,WAAW,CAAA;AACzE,MAAAD,MAAAA,CAAM,cAAc,mBAAmB,CAAA;AACvC,MAAA,OAAA,CAAQ,IAAI,kFAA2B,CAAA;AACvC,MAAA,OAAA,CAAQ,IAAI,6GAAkC,CAAA;AAC9C,MAAA,OAAA,CAAQ,IAAI,4MAAsD,CAAA;AAClE,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,aACP,YAAc,EAAA;AACrB,MAAAA,OAAM,gBAAgB,CAAA;AACtB,MAAA,OAAA,CAAQ,MAAM,qLAAwD,CAAA;AACtE,MAAA,OAAA,CAAQ,MAAM,YAAY,CAAA;AAC1B,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA;AAChB;AAEF,EAAAA,OAAM,6BAA6B,CAAA;AACrC;AC7BA,IAAML,KAAO,GAAA,OAAA,CAAQ,IAAK,CAAA,KAAA,CAAM,CAAC,CAAA;AACjC,IAAMK,MAAAA,GAAQ,iBAAkB,CAAA,iBAAA,EAAmBL,KAAI,CAAA;AACvD,IAAMO,0BAA4B,GAAA,CAAC,SAAW,EAAA,KAAA,EAAO,UAAU,MAAM,CAAA;AAIrE,SAASC,YAAW,KAAe,EAAA;AACjC,EAAA,OAAO,CAAI,CAAA,EAAA,KAAA,CAAM,OAAQ,CAAA,IAAA,EAAM,OAAO,CAAC,CAAA,CAAA,CAAA;AACzC;AAEA,SAASC,aAAY,IAAc,EAAA;AACjC,EAAM,MAAA,KAAA,GAAQT,KAAK,CAAA,OAAA,CAAQ,IAAI,CAAA;AAE/B,EAAA,IAAI,UAAU,EAAM,IAAA,CAACA,KAAK,CAAA,KAAA,GAAQ,CAAC,CAAG,EAAA;AACpC,IAAO,OAAA,EAAA;AAAA;AAGT,EAAOA,OAAAA,KAAAA,CAAK,QAAQ,CAAC,CAAA;AACvB;AAEA,SAASU,uBAA0C,GAAA;AACjD,EAAM,MAAA,qBAAA,GAAwBD,aAAY,oBAAoB,CAAA;AAE9D,EAAA,IAAI,qBAAuB,EAAA;AACzB,IAAIF,IAAAA,0BAAAA,CAA0B,QAAS,CAAA,qBAAwC,CAAG,EAAA;AAChF,MAAAF,MAAAA,CAAM,oBAAoB,qBAAqB,CAAA;AAE/C,MAAO,OAAA,qBAAA;AAAA;AAGT,IAAQ,OAAA,CAAA,IAAA;AAAA,MACN,CAAA,oEAAA,EAA+B,qBAAqB,CAAA,8BAAA,EAAkBE,0BAA0B,CAAA,IAAA;AAAA,QAC9F;AAAA,OACD,CAAA;AAAA,KACH;AAAA;AAGF,EAAIP,IAAAA,KAAAA,CAAK,QAAS,CAAA,SAAS,CAAG,EAAA;AAC5B,IAAAK,MAAAA,CAAM,2BAA2B,SAAS,CAAA;AAE1C,IAAO,OAAA,SAAA;AAAA;AAGT,EAAIL,IAAAA,KAAAA,CAAK,QAAS,CAAA,UAAU,CAAG,EAAA;AAC7B,IAAAK,MAAAA,CAAM,4BAA4B,MAAM,CAAA;AAExC,IAAO,OAAA,MAAA;AAAA;AAGT,EAAAA,MAAAA,CAAM,qBAAqB,QAAQ,CAAA;AAEnC,EAAO,OAAA,QAAA;AACT;AAEA,SAAS,qBAAA,CAAsB,MAAgB,EAAA,eAAA,EAAkC,KAAgB,EAAA;AAC/F,EAAA,MAAM,cAAc,KAAQ,GAAA,CAAA,QAAA,EAAWG,WAAW,CAAA,KAAK,CAAC,CAAK,CAAA,GAAA,EAAA;AAC7D,EAAA,MAAM,kBAAkB,CAAMA,GAAAA,EAAAA,WAAAA,CAAW,CAA2B,wBAAA,EAAA,eAAe,GAAG,CAAC,CAAA,CAAA;AAEvF,EAAA,OAAO,CAAc,WAAA,EAAA,CAAC,WAAa,EAAA,eAAA,EAAiBA,WAAW,CAAA,MAAM,CAAC,CAAA,CAAE,MAAO,CAAA,OAAO,CAAE,CAAA,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AACnG;AAgBO,IAAM,kBAAA,GAAqB,CAACN,aAAAA,EAAsBE,eAA2B,KAAA;AAClF,EAAAC,OAAM,0BAA4B,EAAA,CAAA,aAAA,EAAgBH,aAAY,CAAA,iBAAA,EAAoBE,eAAc,CAAE,CAAA,CAAA;AAClG,EAAM,MAAA,WAAA,GAAcK,aAAY,SAAS,CAAA;AACzC,EAAA,MAAM,kBAAkBC,uBAAuB,EAAA;AAE/C,EAAM,MAAA,KAAA,GAAQ,CAAC,SAAW,EAAA,eAAA,EAAiB,yBAAyB,CACjE,CAAA,MAAA,CAAO,CAAC,QAAA,KAAaT,GAAG,CAAA,UAAA,CAAW,QAAQ,CAAC,CAAA,CAC5C,IAAI,CAAC,QAAA,KAAa,KAAK,QAAQ,CAAA,CAAE,CACjC,CAAA,IAAA,CAAK,IAAI,CAAA;AACZ,EAAA,MAAM,aAAa,KAAQ,GAAA,KAAA,CAAM,KAAM,CAAA,IAAI,EAAE,MAAS,GAAA,CAAA;AACtD,EAAAI,MAAM,CAAA,cAAA,EAAgB,CAAS,MAAA,EAAA,UAAU,CAAE,CAAA,CAAA;AAE3C,EAAM,MAAA,aAAA,GAAgBJ,GAAG,CAAA,UAAA,CAAWG,eAAc,CAAA;AAClD,EAAA,MAAM,cAAiB,GAAA,aAAA,GAAgB,CAAKA,EAAAA,EAAAA,eAAc,CAAK,CAAA,GAAA,EAAA;AAC/D,EAAAC,MAAM,CAAA,mBAAA,EAAqB,cAAiB,GAAA,QAAA,GAAW,SAAS,CAAA;AAEhE,EAAA,MAAM,MAAS,GAAA,CAAA;AAAA;AAAA,EAEf,SAAS,kBAAQ;AAAA;AAAA,EAEjB,kBAAkB,kBAAQ;AAAA;AAAA,EAAA,EAExBH,aAAY;;AAAA,yFAAA,CAAA;AAId,EAAA,IAAI,OAAU,GAAA,EAAA;AAEd,EAAA,IAAI,WAAa,EAAA;AACf,IAAA,OAAA,CAAQ,KAAK,2JAAmC,CAAA;AAChD,IAAAG,MAAAA,CAAM,gBAAgB,WAAW,CAAA;AACjC,IAAU,OAAA,GAAA,qBAAA,CAAsB,MAAQ,EAAA,eAAA,EAAiB,WAAW,CAAA;AAAA,GAC/D,MAAA;AACL,IAAA,MAAM,mBAAsB,GAAA,OAAA;AAC5B,IAAA,MAAM,YAAe,GAAA,qBAAA,CAAsB,MAAQ,EAAA,eAAA,EAAiB,mBAAmB,CAAA;AACvF,IAAM,MAAA,eAAA,GAAkB,qBAAsB,CAAA,MAAA,EAAQ,eAAe,CAAA;AAErE,IAAQ,OAAA,CAAA,IAAA;AAAA,MACN,kGAA4B,mBAAmB,CAAA,gKAAA;AAAA,KACjD;AACA,IAAAA,MAAAA,CAAM,qBAAqB,mBAAmB,CAAA;AAC9C,IAAAA,MAAAA,CAAM,kBAAkB,iBAAiB,CAAA;AACzC,IAAU,OAAA,GAAA,CAAA,EAAG,YAAY,CAAA,IAAA,EAAO,eAAe,CAAA,CAAA;AAAA;AAGjD,EAAAA,OAAM,iBAAiB,CAAA;AAEvB,EAAIL,IAAAA,KAAAA,CAAK,QAAS,CAAA,QAAQ,CAAG,EAAA;AAC3B,IAAA,MAAM,WAAc,GAAA,OAAA,CAAQ,OAAQ,CAAA,IAAA,EAAM,KAAK,CAAA;AAC/C,IAAAK,OAAM,0BAA0B,CAAA;AAEhC,IAAO,OAAA,CAAA;;AAAA;AAAA,EAA8D,WAAW,CAAA,CAAA,CAAA;AAAA;AAGlF,EAAAA,OAAM,wBAAwB,CAAA;AAE9B,EAAO,OAAA,OAAA;AACT,CAAA;ACpIA,IAAMA,MAAAA,GAAQ,kBAAkB,oBAAoB,CAAA;AAG7C,SAAS,sBAAyB,GAAA;AACvC,EAAAA,OAAM,8BAA8B,CAAA;AACpC,EAAI,IAAA;AACF,IAAAA,MAAAA,CAAM,qBAAqB,iBAAiB,CAAA;AAC5C,IAAAC,QAAS,CAAA,iBAAA,EAAmB,EAAE,KAAA,EAAO,UAAU,CAAA;AAC/C,IAAAD,OAAM,kBAAkB,CAAA;AAAA,GAClB,CAAA,MAAA;AACN,IAAAA,MAAAA,CAAM,wBAAwB,eAAe,CAAA;AAC7C,IAAA,OAAA,CAAQ,IAAI,gLAAuE,CAAA;AACnF,IAAI,IAAA;AACF,MAAAC,QAAS,CAAA,8BAAA,EAAgC,EAAE,KAAA,EAAO,WAAW,CAAA;AAC7D,MAAAD,MAAAA,CAAM,cAAc,mBAAmB,CAAA;AACvC,MAAA,OAAA,CAAQ,IAAI,iFAA0B,CAAA;AACtC,MAAA,OAAA,CAAQ,IAAI,2GAAgC,CAAA;AAC5C,MAAA,OAAA,CAAQ,IAAI,wLAAsD,CAAA;AAClE,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,aACP,YAAc,EAAA;AACrB,MAAAA,OAAM,gBAAgB,CAAA;AACtB,MAAA,OAAA,CAAQ,MAAM,oLAAuD,CAAA;AACrE,MAAA,OAAA,CAAQ,MAAM,YAAY,CAAA;AAC1B,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA;AAChB;AAEF,EAAAA,OAAM,4BAA4B,CAAA;AACpC;AC3BA,IAAML,KAAO,GAAA,OAAA,CAAQ,IAAK,CAAA,KAAA,CAAM,CAAC,CAAA;AACjC,IAAMK,MAAAA,GAAQ,iBAAkB,CAAA,kBAAA,EAAoBL,KAAI,CAAA;AACxD,IAAMO,0BAA4B,GAAA,CAAC,SAAW,EAAA,KAAA,EAAO,UAAU,MAAM,CAAA;AAIrE,SAASC,YAAW,KAAe,EAAA;AACjC,EAAA,OAAO,CAAI,CAAA,EAAA,KAAA,CAAM,OAAQ,CAAA,IAAA,EAAM,OAAO,CAAC,CAAA,CAAA,CAAA;AACzC;AAEA,SAASC,aAAY,IAAc,EAAA;AACjC,EAAM,MAAA,KAAA,GAAQT,KAAK,CAAA,OAAA,CAAQ,IAAI,CAAA;AAE/B,EAAA,IAAI,UAAU,EAAM,IAAA,CAACA,KAAK,CAAA,KAAA,GAAQ,CAAC,CAAG,EAAA;AACpC,IAAO,OAAA,EAAA;AAAA;AAGT,EAAOA,OAAAA,KAAAA,CAAK,QAAQ,CAAC,CAAA;AACvB;AAEA,SAASW,UAAS,MAAkB,EAAA;AAClC,EAAM,MAAA,IAAA,uBAAW,GAAY,EAAA;AAE7B,EAAO,OAAA,MAAA,CAAO,MAAO,CAAA,CAAC,KAAU,KAAA;AAC9B,IAAA,IAAI,CAAC,KAAA,IAAS,IAAK,CAAA,GAAA,CAAI,KAAK,CAAG,EAAA;AAC7B,MAAO,OAAA,KAAA;AAAA;AAET,IAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AAEd,IAAO,OAAA,IAAA;AAAA,GACR,CAAA;AACH;AAEA,SAASD,uBAA0C,GAAA;AACjD,EAAM,MAAA,qBAAA,GAAwBD,aAAY,oBAAoB,CAAA;AAE9D,EAAA,IAAI,qBAAuB,EAAA;AACzB,IAAIF,IAAAA,0BAAAA,CAA0B,QAAS,CAAA,qBAAwC,CAAG,EAAA;AAChF,MAAAF,MAAAA,CAAM,oBAAoB,qBAAqB,CAAA;AAE/C,MAAO,OAAA,qBAAA;AAAA;AAGT,IAAQ,OAAA,CAAA,IAAA;AAAA,MACN,CAAA,oEAAA,EAA+B,qBAAqB,CAAA,8BAAA,EAAkBE,0BAA0B,CAAA,IAAA;AAAA,QAC9F;AAAA,OACD,CAAA;AAAA,KACH;AAAA;AAGF,EAAIP,IAAAA,KAAAA,CAAK,QAAS,CAAA,SAAS,CAAG,EAAA;AAC5B,IAAAK,MAAAA,CAAM,2BAA2B,SAAS,CAAA;AAE1C,IAAO,OAAA,SAAA;AAAA;AAGT,EAAIL,IAAAA,KAAAA,CAAK,QAAS,CAAA,UAAU,CAAG,EAAA;AAC7B,IAAAK,MAAAA,CAAM,4BAA4B,MAAM,CAAA;AAExC,IAAO,OAAA,MAAA;AAAA;AAGT,EAAAA,MAAAA,CAAM,qBAAqB,QAAQ,CAAA;AAEnC,EAAO,OAAA,QAAA;AACT;AAEA,SAASO,qBAAoB,eAAkC,EAAA;AAC7D,EAAIZ,IAAAA,KAAAA,CAAK,QAAS,CAAA,UAAU,CAAG,EAAA;AAC7B,IAAAK,MAAAA,CAAM,oBAAoB,KAAK,CAAA;AAE/B,IAAO,OAAA,KAAA;AAAA;AAGT,EAAIL,IAAAA,KAAAA,CAAK,QAAS,CAAA,SAAS,CAAG,EAAA;AAC5B,IAAAK,MAAAA,CAAM,oBAAoB,OAAO,CAAA;AAEjC,IAAO,OAAA,OAAA;AAAA;AAIT,EAAA,IAAI,oBAAoB,MAAQ,EAAA;AAC9B,IAAAA,MAAAA,CAAM,yBAAyB,KAAK,CAAA;AAEpC,IAAO,OAAA,KAAA;AAAA;AAGT,EAAI,IAAA,eAAA,KAAoB,SAAa,IAAA,eAAA,KAAoB,KAAO,EAAA;AAC9D,IAAAA,MAAAA,CAAM,yBAAyB,OAAO,CAAA;AAEtC,IAAO,OAAA,OAAA;AAAA;AAGT,EAAAA,MAAAA,CAAM,uBAAuB,MAAM,CAAA;AAEnC,EAAO,OAAA,MAAA;AACT;AAEA,SAASQ,mBAAkB,YAAsB,EAAA;AAC/C,EAAA,IAAI,iBAAiB,KAAO,EAAA;AAC1B,IAAO,OAAA,CAAC,KAAO,EAAA,OAAA,EAAS,MAAM,CAAA;AAAA;AAGhC,EAAA,IAAI,iBAAiB,OAAS,EAAA;AAC5B,IAAO,OAAA,CAAC,OAAS,EAAA,MAAA,EAAQ,KAAK,CAAA;AAAA;AAGhC,EAAA,OAAO,CAAC,YAAA,EAAc,MAAQ,EAAA,OAAA,EAAS,KAAK,CAAA;AAC9C;AAEA,SAAS,wBAAwB,eAAkC,EAAA;AACjE,EAAA,IAAI,oBAAoB,MAAQ,EAAA;AAC9B,IAAO,OAAA,+GAAA;AAAA;AAGT,EAAA,IAAI,oBAAoB,QAAU,EAAA;AAChC,IAAO,OAAA,8FAAA;AAAA;AAGT,EAAA,IAAI,oBAAoB,KAAO,EAAA;AAC7B,IAAO,OAAA,0FAAA;AAAA;AAGT,EAAO,OAAA,iHAAA;AACT;AAEA,SAAS,sBAAA,CAAuB,QAAgB,KAAgB,EAAA;AAC9D,EAAA,MAAM,cAAc,KAAQ,GAAA,CAAA,QAAA,EAAWL,WAAW,CAAA,KAAK,CAAC,CAAK,CAAA,GAAA,EAAA;AAE7D,EAAA,OAAO,CAAU,OAAA,EAAA,CAAC,WAAa,EAAA,IAAA,EAAMA,WAAW,CAAA,MAAM,CAAC,CAAA,CAAE,MAAO,CAAA,OAAO,CAAE,CAAA,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AACpF;AAeO,IAAM,mBAAA,GAAsB,CAACN,aAAAA,EAAsBE,eAA2B,KAAA;AACnF,EAAAC,OAAM,2BAA6B,EAAA,CAAA,aAAA,EAAgBH,aAAY,CAAA,iBAAA,EAAoBE,eAAc,CAAE,CAAA,CAAA;AACnG,EAAM,MAAA,WAAA,GAAcK,aAAY,SAAS,CAAA;AACzC,EAAA,MAAM,kBAAkBC,uBAAuB,EAAA;AAC/C,EAAM,MAAA,YAAA,GAAeE,qBAAoB,eAAe,CAAA;AACxD,EAAA,MAAM,cAAiBD,GAAAA,SAAAA,CAASE,kBAAkB,CAAA,YAAY,CAAC,CAAA;AAG/D,EAAA,MAAM,KAAQ,GAAA;AAAA,IACZ,EAAE,IAAA,EAAM,SAAW,EAAA,OAAA,EAAS,cAAK,EAAA;AAAA,IACjC,EAAE,IAAA,EAAM,eAAiB,EAAA,OAAA,EAAS,iCAAS,EAAA;AAAA,IAC3C,EAAE,IAAA,EAAM,yBAA2B,EAAA,OAAA,EAAS,iCAAS;AAAA,GACvD;AAEA,EAAM,MAAA,UAAA,GAAa,MAChB,MAAO,CAAA,CAAC,SAASZ,GAAG,CAAA,UAAA,CAAW,KAAK,IAAI,CAAC,EACzC,GAAI,CAAA,CAAC,SAAS,CAAI,CAAA,EAAA,IAAA,CAAK,IAAI,CAAE,CAAA,CAAA,CAC7B,KAAK,IAAI,CAAA;AACZ,EAAA,MAAM,aAAa,UAAa,GAAA,UAAA,CAAW,KAAM,CAAA,GAAG,EAAE,MAAS,GAAA,CAAA;AAC/D,EAAAI,MAAM,CAAA,cAAA,EAAgB,CAAS,MAAA,EAAA,UAAU,CAAE,CAAA,CAAA;AAE3C,EAAA,MAAM,gBAAgBJ,GAAG,CAAA,UAAA,CAAWG,eAAc,CAAI,GAAA,CAAA,CAAA,EAAIA,eAAc,CAAK,CAAA,GAAA,gBAAA;AAC7E,EAAAC,MAAM,CAAA,mBAAA,EAAqB,aAAkB,KAAA,gBAAA,GAAS,YAAY,QAAQ,CAAA;AAE1E,EAAM,MAAA,oBAAA,GAAuB,wBAAwB,eAAe,CAAA;AACpE,EAAA,MAAM,MAAS,GAAA,CAAA,+DAAA,EAAgB,UAAc,IAAA,gBAAM,kBAAaH,aAAY,CAAA;AAAA,gCAAA,EACrE,aAAa,CAAA;AAAA,wCAAA,EACV,oBAAoB,CAAA,CAAA;AAE9B,EAAM,MAAA,eAAA,GAAkBS,UAAS,WAAc,GAAA,CAAC,aAAa,GAAG,cAAc,IAAI,cAAc,CAAA;AAChG,EAAAN,MAAM,CAAA,kBAAA,EAAoB,eAAgB,CAAA,IAAA,CAAK,IAAI,CAAC,CAAA;AAEpD,EAAA,IAAI,WAAa,EAAA;AACf,IAAQ,OAAA,CAAA,IAAA;AAAA,MACN,CAAA,6CAAA,EAAa,WAAW,CAAA,6EAAA,EAAyB,cAAe,CAAA,IAAA;AAAA,QAC9D;AAAA,OACD,CAAA,qFAAA;AAAA,KACH;AAAA,GACK,MAAA;AACL,IAAQ,OAAA,CAAA,IAAA;AAAA,MACN,CAA4B,+FAAA,EAAA,cAAA,CAAe,IAAK,CAAA,MAAM,CAAC,CAAA,sIAAA;AAAA,KACzD;AAAA;AAGF,EAAM,MAAA,iBAAA,GAAoB,gBAAgB,GAAI,CAAA,CAAC,UAAU,sBAAuB,CAAA,MAAA,EAAQ,KAAK,CAAC,CAAA;AAC9F,EAAM,MAAA,OAAA,GAAU,CAAC,GAAG,iBAAA,EAAmB,uBAAuB,MAAM,CAAC,CAAE,CAAA,IAAA,CAAK,MAAM,CAAA;AAGlF,EAAAA,OAAM,iBAAiB,CAAA;AAGvB,EAAIL,IAAAA,KAAAA,CAAK,QAAS,CAAA,QAAQ,CAAG,EAAA;AAC3B,IAAA,MAAM,WAAc,GAAA,OAAA,CAAQ,OAAQ,CAAA,IAAA,EAAM,KAAK,CAAA;AAC/C,IAAAK,OAAM,0BAA0B,CAAA;AAEhC,IAAO,OAAA,CAAA;;AAAA;AAAA,EAA+D,WAAW,CAAA,CAAA,CAAA;AAAA;AAGnF,EAAAA,OAAM,yBAAyB,CAAA;AAE/B,EAAO,OAAA,OAAA;AACT,CAAA;AC9MA,IAAMA,MAAAA,GAAQ,kBAAkB,qBAAqB,CAAA;AAG9C,SAAS,uBAA0B,GAAA;AACxC,EAAAA,OAAM,+BAA+B,CAAA;AACrC,EAAI,IAAA;AACF,IAAAA,MAAAA,CAAM,qBAAqB,kBAAkB,CAAA;AAC7C,IAAAC,QAAS,CAAA,kBAAA,EAAoB,EAAE,KAAA,EAAO,UAAU,CAAA;AAChD,IAAAD,OAAM,kBAAkB,CAAA;AAAA,GAClB,CAAA,MAAA;AACN,IAAAA,MAAAA,CAAM,wBAAwB,eAAe,CAAA;AAC7C,IAAA,OAAA,CAAQ,IAAI,sLAA6E,CAAA;AACzF,IAAI,IAAA;AACF,MAAAC,QAAS,CAAA,mCAAA,EAAqC,EAAE,KAAA,EAAO,WAAW,CAAA;AAClE,MAAAD,MAAAA,CAAM,cAAc,mBAAmB,CAAA;AACvC,MAAA,OAAA,CAAQ,IAAI,kFAA2B,CAAA;AACvC,MAAA,OAAA,CAAQ,IAAI,6GAAkC,CAAA;AAC9C,MAAA,OAAA,CAAQ,IAAI,4MAAsD,CAAA;AAClE,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,aACP,YAAc,EAAA;AACrB,MAAAA,OAAM,gBAAgB,CAAA;AACtB,MAAA,OAAA,CAAQ,MAAM,qLAAwD,CAAA;AACtE,MAAA,OAAA,CAAQ,MAAM,YAAY,CAAA;AAC1B,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA;AAChB;AAEF,EAAAA,OAAM,6BAA6B,CAAA;AACrC;;;AC1BA,IAAM,SAAA,GAAY,IAAK,CAAA,SAAA,CAAU,IAAI,CAAA;AA0BrC,eAAe,IAAO,GAAA;AACpB,EAAA,MAAML,KAAO,GAAA,OAAA,CAAQ,IAAK,CAAA,KAAA,CAAM,CAAC,CAAA;AACjC,EAAM,MAAA,MAAA,GAAS,WAAWA,KAAI,CAAA;AAC9B,EAAMK,MAAAA,MAAAA,GAAQ,iBAAkB,CAAA,mBAAA,EAAqBL,KAAI,CAAA;AACzD,EAAAK,OAAM,YAAc,EAAA,CAAA,KAAA,EAAQ,KAAK,SAAUL,CAAAA,KAAI,CAAC,CAAE,CAAA,CAAA;AAElD,EAAAK,OAAM,yBAAyB,CAAA;AAC/B,EAAM,MAAA,OAAA,GAAU,MAAM,sBAAuB,EAAA;AAC7C,EAAAA,MAAM,CAAA,wBAAA,EAA0B,CAAW,QAAA,EAAA,OAAO,CAAE,CAAA,CAAA;AAEpD,EAAA,QAAQ,OAAS;AAAA,IACf,KAAK,QAAA;AAEH,MAAAA,MAAAA,CAAM,uBAAuB,gBAAgB,CAAA;AAC7C,MAAwB,uBAAA,EAAA;AACxB,MAAAA,MAAAA,CAAM,sBAAsB,gBAAgB,CAAA;AAC5C,MAAA;AAAA,IACF,KAAK,QAAA;AAEH,MAAAA,MAAAA,CAAM,uBAAuB,gBAAgB,CAAA;AAC7C,MAAwB,uBAAA,EAAA;AACxB,MAAAA,MAAAA,CAAM,sBAAsB,gBAAgB,CAAA;AAC5C,MAAA;AAAA,IACF,KAAK,OAAA;AAEH,MAAAA,MAAAA,CAAM,uBAAuB,eAAe,CAAA;AAC5C,MAAuB,sBAAA,EAAA;AACvB,MAAAA,MAAAA,CAAM,sBAAsB,eAAe,CAAA;AAC3C,MAAA;AAAA;AAGJ,EAAI,IAAA;AACF,IAAAA,OAAM,mBAAmB,CAAA;AACzB,IAAA,OAAA,CAAQ,IAAI,kEAA6B,CAAA;AAGzC,IAAAA,OAAM,yBAAyB,CAAA;AAC/B,IAAsB,qBAAA,EAAA;AACtB,IAAAA,OAAM,wBAAwB,CAAA;AAE9B,IAAA,MAAM,EAAE,aAAA,EAAe,aAAc,EAAA,GAAI,gBAAiB,EAAA;AAC1D,IAAAA,OAAM,oBAAsB,EAAA,CAAA,QAAA,EAAW,aAAa,CAAA,WAAA,EAAc,aAAa,CAAE,CAAA,CAAA;AAEjF,IAAA,MAAM,WAAW,WAAY,EAAA;AAC7B,IAAAA,MAAM,CAAA,sBAAA,EAAwB,CAAY,SAAA,EAAA,QAAA,IAAY,WAAW,CAAE,CAAA,CAAA;AAEnE,IAAA,MAAM,eAAe,CAAwB,qBAAA,EAAA,QAAQ,CAAO,IAAA,EAAA,aAAa,IAAI,aAAa,CAAA,CAAA;AAC1F,IAAAA,MAAAA,CAAM,qBAAqB,YAAY,CAAA;AACvC,IAAM,MAAA,QAAA,GAAWC,QAAS,CAAA,YAAY,CAAE,CAAA,QAAA,GAAW,KAAM,CAAA,IAAI,CAAE,CAAA,MAAA,CAAO,OAAO,CAAA;AAC7E,IAAAD,MAAM,CAAA,oBAAA,EAAsB,CAAa,UAAA,EAAA,QAAA,CAAS,MAAM,CAAE,CAAA,CAAA;AAE1D,IAAI,IAAA,QAAA,CAAS,WAAW,CAAG,EAAA;AACzB,MAAAA,OAAM,sBAAsB,CAAA;AAC5B,MAAA,OAAA,CAAQ,IAAI,wEAAiB,CAAA;AAC7B,MAAe,cAAA,EAAA;AAEf,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA;AAGhB,IAAA,MAAM,kBAAkB,CAAY,SAAA,EAAA,QAAQ,CAAO,IAAA,EAAA,aAAa,IAAI,aAAa,CAAA,CAAA;AACjF,IAAAA,OAAM,eAAe,CAAA;AACrB,IAAA,MAAM,QAAWC,GAAAA,QAAAA,CAAS,eAAe,CAAA,CAAE,QAAS,EAAA;AACpD,IAAA,MAAM,SAAS,YAAa,EAAA;AAC5B,IAAAD,MAAM,CAAA,gBAAA,EAAkB,CAAU,OAAA,EAAA,QAAA,CAAS,MAAM,CAAE,CAAA,CAAA;AACnD,IAAAA,MAAAA,CAAM,qBAAqB,MAAM,CAAA;AAEjC,IAAAA,MAAAA,CAAM,yBAAyB,YAAY,CAAA;AAC3C,IAAAJ,GAAAA,CAAG,aAAc,CAAA,YAAA,EAAc,QAAQ,CAAA;AACvC,IAAAI,OAAM,sBAAsB,CAAA;AAG5B,IAAAA,OAAM,uBAAuB,CAAA;AAC7B,IAAA,MAAM,gBAAgB,eAAgB,CAAA,UAAA,EAAY,CAAG,EAAA,MAAM,SAAS,MAAM,CAAA;AAC1E,IAAAJ,GAAAA,CAAG,YAAa,CAAA,YAAA,EAAc,aAAa,CAAA;AAC3C,IAAAI,MAAAA,CAAM,wBAAwB,aAAa,CAAA;AAG3C,IAAA,MAAM,eAAkB,GAAA,eAAA,CAAgB,UAAY,EAAA,MAAA,EAAQ,KAAK,CAAA;AACjE,IAAAA,MAAAA,CAAM,qBAAqB,eAAe,CAAA;AAI1C,IAAA,MAAM,QAAW,GAAA,QAAA,CAAS,GAAI,CAAA,OAAO,IAAS,KAAA;AAC5C,MAAI,IAAA;AACF,QAAAA,MAAAA,CAAM,qBAAqB,IAAI,CAAA;AAC/B,QAAQ,OAAA,CAAA,GAAA,CAAI,CAAiB,qBAAA,EAAA,IAAI,CAAK,GAAA,CAAA,CAAA;AAGtC,QAAAA,MAAAA,CAAM,iBAAiB,IAAI,CAAA;AAC3B,QAAM,MAAA,QAAA,GAAWC,SAAS,CAAY,SAAA,EAAA,QAAQ,QAAQ,IAAI,CAAA,CAAA,CAAG,EAAE,QAAS,EAAA;AACxE,QAAAD,OAAM,gBAAkB,EAAA,CAAA,EAAG,IAAI,CAAa,UAAA,EAAA,QAAA,CAAS,MAAM,CAAE,CAAA,CAAA;AAE7D,QAAA,MAAM,sBAAsB,CAAa,UAAA,EAAA,IAAA,CAAK,OAAQ,CAAA,KAAA,EAAO,GAAG,CAAC,CAAA,IAAA,CAAA;AACjE,QAAAA,MAAAA,CAAM,8BAA8B,mBAAmB,CAAA;AACvD,QAAAJ,GAAAA,CAAG,aAAc,CAAA,mBAAA,EAAqB,QAAQ,CAAA;AAC9C,QAAAI,MAAAA,CAAM,6BAA6B,mBAAmB,CAAA;AAGtD,QAAA,IAAI,OAAU,GAAA,EAAA;AACd,QAAAA,MAAAA,CAAM,6BAA6B,IAAI,CAAA;AACvC,QAAA,QAAQ,OAAS;AAAA,UACf,KAAK,QAAA;AAEH,YAAU,OAAA,GAAA,mBAAA,CAAoB,qBAAqB,sBAAsB,CAAA;AACzE,YAAA;AAAA,UACF,KAAK,QAAA;AAEH,YAAU,OAAA,GAAA,mBAAA,CAAoB,qBAAqB,sBAAsB,CAAA;AACzE,YAAA;AAAA,UACF,KAAK,OAAA;AAEH,YAAU,OAAA,GAAA,kBAAA,CAAmB,qBAAqB,sBAAsB,CAAA;AACxE,YAAA;AAAA;AAEJ,QAAAA,MAAAA,CAAM,4BAA4B,IAAI,CAAA;AAItC,QAAAA,MAAAA,CAAM,2BAA2B,IAAI,CAAA;AACrC,QAAM,MAAA,EAAE,MAAO,EAAA,GAAI,MAAM,SAAA,CAAU,OAAS,EAAA,EAAE,SAAW,EAAA,IAAA,GAAO,IAAO,GAAA,EAAA,EAAI,CAAA;AAC3E,QAAM,MAAA,MAAA,GAAS,OAAO,QAAS,EAAA;AAC/B,QAAAA,OAAM,wBAA0B,EAAA,CAAA,EAAG,IAAI,CAAmB,gBAAA,EAAA,MAAA,CAAO,MAAM,CAAE,CAAA,CAAA;AAGzE,QAAAA,MAAAA,CAAM,+BAA+B,mBAAmB,CAAA;AACxD,QAAA,UAAA,CAAW,mBAAmB,CAAA;AAC9B,QAAAA,MAAAA,CAAM,8BAA8B,mBAAmB,CAAA;AAEvD,QAAM,MAAA,UAAA,GAAa,aAAa,IAAI;AAAA,EAAK,MAAM;;AAAA,CAAA;AAG/C,QAAA,OAAA,CAAQ,IAAI,UAAU,CAAA;AAEtB,QAAAA,MAAAA,CAAM,4BAA4B,IAAI,CAAA;AACtC,QAAAJ,GAAAA,CAAG,cAAe,CAAA,eAAA,EAAiB,UAAU,CAAA;AAC7C,QAAAI,MAAAA,CAAM,2BAA2B,IAAI,CAAA;AAGrC,QAAA,IAAI,MAAQ,EAAA;AACV,UAAAA,MAAAA,CAAM,kCAAkC,IAAI,CAAA;AAC5C,UAAAJ,GAAAA,CAAG,eAAe,eAAiB,EAAA;;AAAA;;AAAA,EAAqB,OAAO,CAAE,CAAA,CAAA;AACjE,UAAAI,MAAAA,CAAM,iCAAiC,IAAI,CAAA;AAAA;AAE7C,QAAAA,MAAAA,CAAM,mBAAmB,IAAI,CAAA;AAAA,eACtB,GAAK,EAAA;AACZ,QAAAA,MAAAA,CAAM,qBAAqB,IAAI,CAAA;AAC/B,QAAA,OAAA,CAAQ,KAAM,CAAA,CAAA,4BAAA,EAA0B,IAAI,CAAA,CAAA,CAAA,EAAK,GAAG,CAAA;AAEpD,QAAM,MAAA,WAAA,GAAc,aAAa,IAAI;AAAA;AAAA;AAAA,EAA8B,GAAG;AAAA;;AAAA,CAAA;AACtE,QAAAJ,GAAAA,CAAG,cAAe,CAAA,eAAA,EAAiB,WAAW,CAAA;AAG9C,QAAI,IAAA;AACF,UAAA,MAAM,sBAAsB,CAAa,UAAA,EAAA,IAAA,CAAK,OAAQ,CAAA,KAAA,EAAO,GAAG,CAAC,CAAA,IAAA,CAAA;AACjE,UAAIA,IAAAA,GAAAA,CAAG,UAAW,CAAA,mBAAmB,CAAG,EAAA;AACtC,YAAAI,MAAAA,CAAM,sCAAsC,mBAAmB,CAAA;AAC/D,YAAA,UAAA,CAAW,mBAAmB,CAAA;AAC9B,YAAAA,MAAAA,CAAM,qCAAqC,mBAAmB,CAAA;AAAA;AAChE,iBACO,CAAG,EAAA;AACV,UAAAA,MAAAA,CAAM,uCAAuC,IAAI,CAAA;AACjD,UAAA,OAAA,CAAQ,KAAM,CAAA,CAAA,oCAAA,EAAkC,IAAI,CAAA,CAAA,CAAA,EAAK,CAAC,CAAA;AAAA;AAC5D;AACF,KACD,CAAA;AAED,IAAAA,OAAM,6BAA6B,CAAA;AACnC,IAAM,MAAA,OAAA,CAAQ,IAAI,QAAQ,CAAA;AAC1B,IAAAA,OAAM,4BAA4B,CAAA;AAElC,IAAA,OAAA,CAAQ,GAAI,CAAA;AAAA,qEAAkB,CAAA,CAAA;AAC9B,IAAQ,OAAA,CAAA,GAAA,CAAI,CAAiB,wDAAA,EAAA,eAAe,CAAE,CAAA,CAAA;AAC9C,IAAQ,OAAA,CAAA,GAAA,CAAI,CAAe,gCAAA,EAAA,aAAa,CAAE,CAAA,CAAA;AAG1C,IAAAA,OAAM,mBAAmB,CAAA;AACzB,IAAA,UAAA,CAAW,eAAe,CAAA;AAC1B,IAAAA,OAAM,kBAAkB,CAAA;AAExB,IAAAA,OAAM,yBAAyB,CAAA;AAC/B,IAAe,cAAA,EAAA;AACf,IAAAA,OAAM,wBAAwB,CAAA;AAC9B,IAAAA,OAAM,iBAAiB,CAAA;AAAA,WAChB,KAAO,EAAA;AACd,IAAAA,OAAM,mBAAmB,CAAA;AACzB,IAAA,OAAA,CAAQ,MAAM,2FAAqB,CAAA;AACnC,IAAA,OAAA,CAAQ,MAAM,KAAK,CAAA;AAGnB,IAAAA,OAAM,gCAAgC,CAAA;AACtC,IAAe,cAAA,EAAA;AACf,IAAAA,OAAM,+BAA+B,CAAA;AAErC,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA;AAElB;AAEA,IAAK,EAAA","file":"review-one-by-one.js","sourcesContent":["import { execSync } from 'child_process';\nimport fs from 'fs';\nimport path from 'path';\nimport readline from 'readline';\nimport { fileURLToPath } from 'url';\n\nimport { AIServiceType } from './types';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n// 설치된 위치에 맞게 규칙/양식 파일 경로를 계산 (dist에서 src로 이동 등 고려)\n// dist/common/helper.js 가 실행되므로 __dirname은 .../dist/common 입니다.\n// 따라서 ../../src/common/rules 로 이동해야 원본 소스의 규칙 파일을 찾을 수 있습니다.\nexport const rulesPath = path.resolve(__dirname, '../../src/common/rules/review-rules.md');\nexport const namingRulesPath = path.resolve(__dirname, '../../src/common/rules/naming-rule.md');\nexport const codingConventionRulesPath = path.resolve(__dirname, '../../src/common/rules/coding-convention.md');\nexport const reviewFormPath = path.resolve(__dirname, '../../src/common/form/review-form.md');\nexport const reviewFormOneByOnePath = path.resolve(__dirname, '../../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 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\nfunction parseServiceFromArgs(args: string[] = process.argv.slice(2)): AIServiceType | '' {\n const serviceIndex = args.indexOf('--service');\n const rawService = serviceIndex !== -1 ? args[serviceIndex + 1] : '';\n\n if (!rawService) {\n return '';\n }\n\n const normalizedService = rawService.toLowerCase();\n\n if (AIServices.includes(normalizedService as AIServiceType)) {\n return normalizedService as AIServiceType;\n }\n\n console.error(\n `❌ 지원하지 않는 서비스입니다: ${rawService}. 사용 가능 값: ${AIServices.join(', ')} (예: --service codex)`\n );\n process.exit(1);\n}\n\nexport function isTestMode(args: string[] = process.argv.slice(2)) {\n return args.includes('--test');\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 if (!enabled) {\n return;\n }\n\n console.log(`[TRACE][${scope}] ${step}${detail ? ` | ${detail}` : ''}`);\n };\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 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() {\n const now = new Date();\n const YYYY = now.getFullYear();\n const MM = String(now.getMonth() + 1).padStart(2, '0');\n const DD = String(now.getDate()).padStart(2, '0');\n const HH = String(now.getHours()).padStart(2, '0');\n const mm = String(now.getMinutes()).padStart(2, '0');\n const ss = String(now.getSeconds()).padStart(2, '0');\n\n return `${YYYY}-${MM}-${DD}_${HH}-${mm}-${ss}`;\n}\n\nexport function getGitDiffFilter() {\n // 1. 리뷰 대상 파일 확장자 정의\n const includeExtensions = ['*.ts', '*.tsx', '*.js', '*.jsx'];\n\n // ignoreList 를 import 하여 재사용하여 작성한다.\n const excludePatterns = ignoreList.map((item) => `:(exclude)${item}`);\n\n // const excludePatterns = [':(exclude)*.lock', ':(exclude)dist/', ':(exclude)*.md'];\n\n // 2. 변경된 파일 목록 가져오기 (각 패턴을 따옴표로 감싸서 쉘 에러 방지)\n const quote = (pattern: string) => `\"${pattern}\"`;\n const includeParams = includeExtensions.map(quote).join(' ');\n const excludeParams = excludePatterns.map(quote).join(' ');\n\n return { includeParams, excludeParams };\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\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 console.log('🚀 Google Chrome에서 리포트를 열었습니다.');\n\n return;\n }\n } catch {\n // Chrome 실행 실패 시 기본 브라우저로 폴백\n }\n\n try {\n if (openWithDefaultBrowser()) {\n console.log('🚀 기본 브라우저에서 리포트를 열었습니다.');\n\n return;\n }\n } catch (e) {\n console.error('⚠️ 브라우저 열기 실패:', e);\n\n return;\n }\n\n console.error(`⚠️ 지원하지 않는 플랫폼입니다: ${platform}`);\n}\n\nexport function getDiffArgs() {\n const args = process.argv.slice(2);\n const commitIndex = args.indexOf('--commit');\n const { includeParams, excludeParams } = getGitDiffFilter();\n\n let diffArgs = '';\n\n if (commitIndex !== -1) {\n // 특정 커밋 (및 이전 n개) 리뷰\n const commitHash = args[commitIndex + 1];\n if (!commitHash) {\n console.error('❌ 커밋 해시가 제공되지 않았습니다.');\n process.exit(1);\n }\n\n // n값 확인 (optional)\n const nextArg = args[commitIndex + 2];\n let n = 0;\n if (nextArg && !nextArg.startsWith('--')) {\n n = parseInt(nextArg, 10);\n if (isNaN(n)) {\n n = 0;\n }\n }\n\n console.log(`ℹ️ 커밋 '${commitHash}' ${n > 0 ? ` 포함 총 ${n + 1}개의 커밋` : ''}을 리뷰합니다...`);\n diffArgs = `${commitHash}~${n + 1} ${commitHash}`;\n } else {\n // 기본 모드:\n // 1. Unstaged 변경사항 확인\n try {\n const check = execSync(`git diff --name-only -- ${includeParams} ${excludeParams}`).toString();\n if (!check.trim()) {\n console.log('ℹ️ Unstaged 변경사항이 없습니다. 마지막 커밋(HEAD)을 리뷰합니다...');\n diffArgs = 'HEAD~1 HEAD';\n }\n } catch {\n // git diff 실패시 무시\n }\n }\n\n return diffArgs;\n}\n\n// export const ServiceType = {\n// GEMINI: 'gemini',\n// CLAUDE: 'claude',\n// CODEX: 'codex'\n\n// }\n\n/**\n * AI 서비스 선택\n */\nexport function selectAIService() {\n const service = parseServiceFromArgs();\n\n if (!service) {\n console.error('❌ 서비스가 선택되지 않았습니다.');\n process.exit(1);\n }\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 console.log(`\\n✅ \\u001b[32m${selectedServiceFromArgs}\\u001b[0m 서비스가 선택되었습니다. (--service)\\n`);\n\n return selectedServiceFromArgs;\n }\n\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\n // Clear everything from cursor down to avoid ghosting/overlaps\n // 잔상이나 겹침을 방지하기 위해 커서 위치부터 아래쪽 모두 지움\n readline.clearScreenDown(process.stdout);\n\n process.stdout.write(\n '🤖 AI 서비스를 선택해주세요 (\\u001b[33m↑↓ 방향키\\u001b[0m 이동, \\u001b[33mEnter\\u001b[0m 선택):\\n'\n );\n AIServices.forEach((service, index) => {\n if (index === selectedIndex) {\n process.stdout.write(` \\u001b[36m>\\u001b[0m \\u001b[36m◉\\u001b[0m \\u001b[1m${service}\\u001b[0m\\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 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✅ \\u001b[32m${AIServices[selectedIndex]}\\u001b[0m 서비스가 선택되었습니다.\\n`);\n const result = AIServices[selectedIndex];\n if (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 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 console.warn('⚠️ Claude는 minimal을 직접 지원하지 않아 low로 매핑합니다.');\n }\n\n return normalized;\n }\n\n console.warn(\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 const modelCandidates = toUnique(customModel ? [customModel, ...aliasFallbacks] : aliasFallbacks);\n trace('model:candidates', modelCandidates.join(', '));\n\n if (customModel) {\n console.warn(\n `⚠️ 커스텀 모델(${customModel})을 우선 시도하고 실패하면 alias(${aliasFallbacks.join(\n ' -> '\n )}) 및 기본 모델 순으로 폴백합니다.`\n );\n } else {\n console.warn(\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('createClaudeCommand:end');\n\n return command;\n};\n","import { execSync } from 'child_process';\n\nimport { createTraceLogger } 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 {\n trace('version-check:failed', 'install-start');\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', 'exit(1) for login');\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');\n console.error('❌ claude-cli 설치 중 오류가 발생했습니다. 권한 문제일 수 있습니다 (sudo 필요).');\n console.error(installError);\n process.exit(1);\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 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 console.warn(\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\n let command = '';\n\n if (customModel) {\n console.warn('⚠️ 지정한 모델이 없는 경우, 에러가 발생하니 주의하세요.');\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 console.warn(\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('createCodexCommand:end');\n\n return command;\n};\n","import { execSync } from 'child_process';\n\nimport { createTraceLogger } 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 {\n trace('version-check:failed', 'install-start');\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', 'exit(1) for login');\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');\n console.error('❌ codex-cli 설치 중 오류가 발생했습니다. 권한 문제일 수 있습니다 (sudo 필요).');\n console.error(installError);\n process.exit(1);\n }\n }\n trace('checkCodexCliInstalled:end');\n}\n","import fs from 'fs';\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];\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 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 console.warn(\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 *\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\n // 존재하지 않는 파일은 제외하여 명령어 생성\n const rules = [\n { path: rulesPath, display: '룰셋' },\n { path: namingRulesPath, display: '네이밍 규칙' },\n { path: codingConventionRulesPath, display: '코딩 컨벤션' }\n ];\n\n const validRules = rules\n .filter((rule) => fs.existsSync(rule.path))\n .map((rule) => `@${rule.path}`)\n .join(', ');\n const rulesCount = validRules ? validRules.split(',').length : 0;\n trace('rules:loaded', `count=${rulesCount}`);\n\n const reviewFormRef = fs.existsSync(reviewFormPath) ? `@${reviewFormPath}` : '(없음)';\n trace('reviewForm:status', reviewFormRef === '(없음)' ? 'missing' : 'exists');\n\n const reasoningInstruction = getReasoningInstruction(reasoningEffort);\n const prompt = `다음 규칙들을 참고해서(${validRules || '(없음)'}) 이 diff(@${tempDiffPath})를 리뷰해줘.\n리뷰 양식은 ${reviewFormRef} 에 맞춰서 작성해줘.\n추론 강도 지침: ${reasoningInstruction}`;\n\n const modelCandidates = toUnique(customModel ? [customModel, ...aliasFallbacks] : aliasFallbacks);\n trace('model:candidates', modelCandidates.join(', '));\n\n if (customModel) {\n console.warn(\n `⚠️ 커스텀 모델(${customModel})을 우선 시도하고 실패하면 alias(${aliasFallbacks.join(\n ' -> '\n )}) 및 기본 모델 순으로 폴백합니다.`\n );\n } else {\n console.warn(\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('createGeminiCommand:end');\n\n return command;\n};\n","import { execSync } from 'child_process';\n\nimport { createTraceLogger } 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 {\n trace('version-check:failed', 'install-start');\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', 'exit(1) for login');\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');\n console.error('❌ gemini-cli 설치 중 오류가 발생했습니다. 권한 문제일 수 있습니다 (sudo 필요).');\n console.error(installError);\n process.exit(1);\n }\n }\n trace('checkGeminiCliInstalled:end');\n}\n","#!/usr/bin/env node\nimport { execSync, exec } from 'child_process';\nimport fs from 'fs';\nimport util from 'util';\n\nconst execAsync = util.promisify(exec);\n\nimport {\n tempDiffPath,\n createTraceLogger,\n getNextFilePath,\n deleteTempDiff,\n deleteFile,\n createReportDirectory,\n REPORT_DIR,\n getNowString,\n getGitDiffFilter,\n reviewFormOneByOnePath,\n getDiffArgs,\n isTestMode,\n openReport,\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 const args = process.argv.slice(2);\n const isTest = isTestMode(args);\n const trace = createTraceLogger('review-one-by-one', args);\n trace('main:start', `args=${JSON.stringify(args)}`);\n // AI 서비스 선택\n trace('service-selection:start');\n const 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 try {\n trace('review-flow:start');\n console.log('🚀 AI Code Review를 시작합니다...');\n\n // 리뷰 결과 폴더 생성\n trace('report-dir:create:start');\n createReportDirectory();\n trace('report-dir:create:done');\n\n const { includeParams, excludeParams } = getGitDiffFilter();\n trace('diff-filter:loaded', `include=${includeParams} | exclude=${excludeParams}`);\n\n const diffArgs = getDiffArgs();\n trace('diff-args:build:done', `diffArgs=${diffArgs || '(default)'}`);\n\n const filesCommand = `git diff --name-only ${diffArgs} -- ${includeParams} ${excludeParams}`;\n trace('files-command:run', filesCommand);\n const fileList = execSync(filesCommand).toString().split('\\n').filter(Boolean);\n trace('files-command:done', `fileCount=${fileList.length}`);\n\n if (fileList.length === 0) {\n trace('empty-file-list:exit');\n console.log('ℹ️ 변경 사항이 없습니다.');\n deleteTempDiff();\n\n process.exit(0);\n }\n\n const fullDiffCommand = `git diff ${diffArgs} -- ${includeParams} ${excludeParams}`;\n trace('full-diff:run');\n const fullDiff = execSync(fullDiffCommand).toString();\n const nowStr = getNowString();\n trace('full-diff:done', `length=${fullDiff.length}`);\n trace('timestamp:created', nowStr);\n\n trace('temp-diff:write:start', tempDiffPath);\n fs.writeFileSync(tempDiffPath, fullDiff);\n trace('temp-diff:write:done');\n\n // diff 파일 저장 (.review-report 안으로 복사)\n trace('saved-diff:copy:start');\n const savedDiffPath = getNextFilePath(REPORT_DIR, `${nowStr}-diff`, '.txt');\n fs.copyFileSync(tempDiffPath, savedDiffPath);\n trace('saved-diff:copy:done', savedDiffPath);\n\n // 리뷰 결과 저장\n const savedReportPath = getNextFilePath(REPORT_DIR, nowStr, '.md');\n trace('saved-report:path', savedReportPath);\n\n // let fullReport = '';\n // 병렬 처리를 위해 Promise.all 사용\n const promises = fileList.map(async (file) => {\n try {\n trace('file-review:start', file);\n console.log(`🔍 Reviewing: ${file}...`);\n\n // 3. 개별 파일에 대한 diff 생성\n trace('file-diff:run', file);\n const fileDiff = execSync(`git diff ${diffArgs} -- \"${file}\"`).toString();\n trace('file-diff:done', `${file} | length=${fileDiff.length}`);\n\n const tempOneFileDiffPath = `temp_diff_${file.replace(/\\//g, '_')}.txt`;\n trace('file-temp-diff:write:start', tempOneFileDiffPath);\n fs.writeFileSync(tempOneFileDiffPath, fileDiff);\n trace('file-temp-diff:write:done', tempOneFileDiffPath);\n\n // 4. 명령어 생성\n let command = '';\n trace('file-command:create:start', file);\n switch (service) {\n case 'gemini':\n // gemini-cli 에 맞게 프롬프트 명령어 생성\n command = createGeminiCommand(tempOneFileDiffPath, reviewFormOneByOnePath);\n break;\n case 'claude':\n // claude-cli 에 맞게 프롬프트 명령어 생성\n command = createClaudeCommand(tempOneFileDiffPath, reviewFormOneByOnePath);\n break;\n case 'codex':\n // codex-cli 에 맞게 프롬프트 명령어 생성\n command = createCodexCommand(tempOneFileDiffPath, reviewFormOneByOnePath);\n break;\n }\n trace('file-command:create:done', file);\n\n // 5. AI에게 해당 파일만 리뷰 요청 (비동기 실행)\n // execSync 대신 execAsync 사용. maxBuffer를 넉넉하게 설정\n trace('file-command:exec:start', file);\n const { stdout } = await execAsync(command, { maxBuffer: 1024 * 1024 * 20 });\n const result = stdout.toString();\n trace('file-command:exec:done', `${file} | resultLength=${result.length}`);\n\n // 6. 리뷰 마친후 해당 파일 삭제\n trace('file-temp-diff:delete:start', tempOneFileDiffPath);\n deleteFile(tempOneFileDiffPath);\n trace('file-temp-diff:delete:done', tempOneFileDiffPath);\n\n const tempReport = `### File: ${file}\\n${result}\\n\\n`;\n\n // 콘솔 출력\n console.log(tempReport);\n\n trace('file-report:append:start', file);\n fs.appendFileSync(savedReportPath, tempReport);\n trace('file-report:append:done', file);\n\n // 사용한 명령어도 저장(디버깅용)\n if (isTest) {\n trace('file-test-command:append:start', file);\n fs.appendFileSync(savedReportPath, `\\n\\n## 사용된 명령어\\n\\n${command}`);\n trace('file-test-command:append:done', file);\n }\n trace('file-review:end', file);\n } catch (err) {\n trace('file-review:catch', file);\n console.error(`❌ Error reviewing file ${file}:`, err);\n // 에러 내용도 리포트에 포함\n const errorReport = `### File: ${file}\\n❌ Review Failed\\n\\`\\`\\`\\n${err}\\n\\`\\`\\`\\n\\n`;\n fs.appendFileSync(savedReportPath, errorReport);\n\n // 임시 파일 정리 시도\n try {\n const tempOneFileDiffPath = `temp_diff_${file.replace(/\\//g, '_')}.txt`;\n if (fs.existsSync(tempOneFileDiffPath)) {\n trace('file-temp-diff:delete:start(catch)', tempOneFileDiffPath);\n deleteFile(tempOneFileDiffPath);\n trace('file-temp-diff:delete:done(catch)', tempOneFileDiffPath);\n }\n } catch (e) {\n trace('file-temp-diff:delete:failed(catch)', file);\n console.error(`❌ Error deleting temp file for ${file}:`, e);\n }\n }\n });\n\n trace('parallel-review:await-start');\n await Promise.all(promises);\n trace('parallel-review:await-done');\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 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');\n console.error('❌ 리뷰 도중 오류가 발생했습니다.');\n console.error(error);\n\n // 임시 파일 삭제\n trace('cleanup-temp-diff:start(catch)');\n deleteTempDiff();\n trace('cleanup-temp-diff:done(catch)');\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-one-by-one.ts"],"names":["args","tempDiffPath","path","reviewFormPath","fs","trace","execSync","ALLOWED_REASONING_EFFORTS","shellQuote","getArgValue","printNotice","resolveReasoningEffort","toUnique","resolvePrimaryAlias","getAliasFallbacks"],"mappings":"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","file":"review-one-by-one.js","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 { exec } from 'child_process';\nimport fs from 'fs';\nimport util from 'util';\n\nconst execAsync = util.promisify(exec);\n\nimport {\n buildSelectedCommitDiff,\n buildSelectedCommitSummary,\n buildSelectedFileDiff,\n tempDiffPath,\n clearTraceMessages,\n createTraceLogger,\n getNextFilePath,\n deleteTempDiff,\n deleteFile,\n createReportDirectory,\n formatReviewTargetFiles,\n getSelectedCommitFiles,\n REPORT_DIR,\n getNowString,\n getErrorSummary,\n reviewFormOneByOnePath,\n isTestMode,\n openReport,\n selectReviewCommits,\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 const args = process.argv.slice(2);\n clearTraceMessages();\n const isTest = isTestMode(args);\n const trace = createTraceLogger('review-one-by-one', args);\n trace('main:start', `args=${JSON.stringify(args)}`);\n let service = '';\n let savedDiffPath = '';\n let savedReportPath = '';\n let selectedCommitSummary = '';\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\n process.exit(0);\n }\n\n selectedCommitSummary = buildSelectedCommitSummary(selectedCommits);\n trace('commit-summary:prepared', selectedCommitSummary);\n\n console.log('⏳ 선택한 커밋의 파일 목록과 diff를 정리하는 중입니다...');\n trace('files-command:run');\n const fileList = getSelectedCommitFiles(selectedCommits);\n trace('files-command:done', `fileCount=${fileList.length}`);\n console.log(`📂 리뷰 대상 파일(${fileList.length}개): ${formatReviewTargetFiles(fileList)}`);\n\n if (fileList.length === 0) {\n trace('empty-file-list:exit');\n console.log('ℹ️ 선택한 커밋에서 리뷰 대상 파일 변경을 찾지 못했습니다.');\n deleteTempDiff();\n\n process.exit(0);\n }\n\n // 리뷰 결과 폴더 생성\n trace('report-dir:create:start');\n createReportDirectory();\n trace('report-dir:create:done');\n\n trace('full-diff:build:start');\n const fullDiff = buildSelectedCommitDiff(selectedCommits);\n const nowStr = getNowString();\n trace('full-diff:build:done', `length=${fullDiff.length}`);\n trace('timestamp:created', nowStr);\n\n trace('temp-diff:write:start', tempDiffPath);\n fs.writeFileSync(tempDiffPath, fullDiff);\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 savedReportPath = getNextFilePath(REPORT_DIR, nowStr, '.md');\n trace('saved-report:path', savedReportPath);\n\n // let fullReport = '';\n // 병렬 처리를 위해 Promise.all 사용\n const promises = fileList.map(async (file, index) => {\n const tempOneFileDiffPath = `temp_diff_${file.replace(/\\//g, '_')}.txt`;\n let command = '';\n\n try {\n trace('file-review:start', file);\n console.log(`🔍 [${index + 1}/${fileList.length}] 리뷰 준비: ${file}`);\n\n // 3. 개별 파일에 대한 diff 생성\n trace('file-diff:build:start', file);\n const fileDiff = buildSelectedFileDiff(selectedCommits, file);\n trace('file-diff:build:done', `${file} | length=${fileDiff.length}`);\n\n if (!fileDiff.trim()) {\n trace('file-diff:empty', file);\n\n return;\n }\n\n trace('file-temp-diff:write:start', tempOneFileDiffPath);\n fs.writeFileSync(tempOneFileDiffPath, fileDiff);\n trace('file-temp-diff:write:done', tempOneFileDiffPath);\n\n // 4. 명령어 생성\n trace('file-command:create:start', file);\n switch (service) {\n case 'gemini':\n // gemini-cli 에 맞게 프롬프트 명령어 생성\n command = createGeminiCommand(tempOneFileDiffPath, reviewFormOneByOnePath);\n break;\n case 'claude':\n // claude-cli 에 맞게 프롬프트 명령어 생성\n command = createClaudeCommand(tempOneFileDiffPath, reviewFormOneByOnePath);\n break;\n case 'codex':\n // codex-cli 에 맞게 프롬프트 명령어 생성\n command = createCodexCommand(tempOneFileDiffPath, reviewFormOneByOnePath);\n break;\n }\n trace('file-command:create:done', `${file} | commandLength=${command.length}`);\n\n // 5. AI에게 해당 파일만 리뷰 요청 (비동기 실행)\n // execSync 대신 execAsync 사용. maxBuffer를 넉넉하게 설정\n console.log(`⏳ [${index + 1}/${fileList.length}] 리뷰 진행: ${file}`);\n trace('file-command:exec:start', file);\n const { stdout } = await execAsync(command, { maxBuffer: 1024 * 1024 * 20 });\n const result = stdout.toString();\n trace('file-command:exec:done', `${file} | resultLength=${result.length}`);\n\n // 6. 리뷰 마친후 해당 파일 삭제\n trace('file-temp-diff:delete:start', tempOneFileDiffPath);\n deleteFile(tempOneFileDiffPath);\n trace('file-temp-diff:delete:done', tempOneFileDiffPath);\n\n const tempReport = `### File: ${file}\\n${result}\\n\\n`;\n\n trace('file-report:append:start', file);\n fs.appendFileSync(savedReportPath, tempReport);\n trace('file-report:append:done', file);\n\n // 사용한 명령어도 저장(디버깅용)\n if (isTest) {\n trace('file-test-command:append:start', file);\n fs.appendFileSync(savedReportPath, `\\n\\n## 사용된 명령어\\n\\n${command}`);\n trace('file-test-command:append:done', file);\n }\n trace('file-review:end', file);\n } catch (err) {\n trace('file-review:catch', `${file} | ${getErrorSummary(err)}`);\n const errorLogPath = writeErrorReport(err, {\n scope: 'review-one-by-one:file',\n args,\n extraSections: [\n {\n heading: 'Execution Context',\n markdown: `\\`\\`\\`json\\n${JSON.stringify(\n {\n service,\n selectedCommitSummary: selectedCommitSummary || null,\n file,\n command: command || null,\n tempOneFileDiffPath,\n savedDiffPath: savedDiffPath || null,\n savedReportPath: savedReportPath || null\n },\n null,\n 2\n )}\\n\\`\\`\\``\n }\n ]\n });\n console.error(`❌ Error reviewing file ${file}:`, err);\n if (errorLogPath) {\n console.error(`📄 에러 로그 저장 위치: ${errorLogPath}`);\n }\n // 에러 내용도 리포트에 포함\n const errorReport = `### File: ${file}\\n❌ Review Failed\\n\\`\\`\\`\\n${getErrorSummary(err)}\\n\\`\\`\\`\\n\\n`;\n fs.appendFileSync(savedReportPath, errorReport);\n\n // 임시 파일 정리 시도\n try {\n if (fs.existsSync(tempOneFileDiffPath)) {\n trace('file-temp-diff:delete:start(catch)', tempOneFileDiffPath);\n deleteFile(tempOneFileDiffPath);\n trace('file-temp-diff:delete:done(catch)', tempOneFileDiffPath);\n }\n } catch (cleanupError) {\n trace('file-temp-diff:delete:failed(catch)', `${file} | ${getErrorSummary(cleanupError)}`);\n console.error(`❌ Error deleting temp file for ${file}:`, cleanupError);\n }\n }\n });\n\n trace('parallel-review:await-start');\n await Promise.all(promises);\n trace('parallel-review:await-done');\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 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 || 'unknown'}`);\n errorReportPath = writeErrorReport(error, {\n scope: 'review-one-by-one',\n args,\n extraSections: [\n {\n heading: 'Execution Context',\n markdown: `\\`\\`\\`json\\n${JSON.stringify(\n {\n service: service || null,\n selectedCommitSummary: selectedCommitSummary || 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"]}