newexpand-autopr
Version:
GitHub PR Automation CLI Tool with AI
190 lines (148 loc) • 95.5 kB
JavaScript
#!/usr/bin/env node
import {a as a$1,d as d$1,b}from'./chunk-VT7EM67T.js';import {a,f,d,p,j,h,e,c,k,i,g,m,b as b$1}from'./chunk-FC7BHN76.js';import {Command}from'commander';import I from'inquirer';import {exec,spawn,execSync}from'child_process';import {promisify}from'util';import {existsSync,renameSync}from'fs';import M,{writeFile,readFile,appendFile,stat,unlink}from'fs/promises';import {Octokit}from'octokit';import {z}from'zod';import {minimatch}from'minimatch';import ue,{join,resolve}from'path';import {tmpdir}from'os';var $e=promisify(exec);async function Dt(r){f.info(d("core.oauth.device_flow.initializing")),f.debug(d("core.oauth.device_flow.client_id",{clientId:r}));let n={client_id:r,scope:"repo read:user user:email"};f.debug(d("core.oauth.device_flow.request_data"),JSON.stringify(n,null,2));let o=await fetch("https://github.com/login/device/code",{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json","User-Agent":"AutoPR-CLI","X-GitHub-Api-Version":"2022-11-28"},body:JSON.stringify(n)});if(f.debug(d("core.oauth.device_flow.response_status"),o.status),f.debug(d("core.oauth.device_flow.response_headers"),JSON.stringify(Object.fromEntries(o.headers.entries()),null,2)),!o.ok){let i=await o.text();throw f.error(d("core.oauth.device_flow.error_response"),i),new Error(d("core.oauth.device_flow.init_failed",{status:o.status,error:i}))}let a=await o.json();return f.debug(d("core.oauth.device_flow.response_data"),JSON.stringify(a,null,2)),a}a(Dt,"getDeviceCode");async function qt(r,n,o,a){let s=Date.now()+a*1e3;for(;Date.now()<s;)try{let c=await fetch("https://github.com/login/oauth/access_token",{method:"POST",headers:{Accept:"application/json","Content-Type":"application/json","User-Agent":"AutoPR-CLI","X-GitHub-Api-Version":"2022-11-28"},body:JSON.stringify({client_id:r,device_code:n,grant_type:"urn:ietf:params:oauth:grant-type:device_code"})});if(!c.ok)throw new Error(d("core.oauth.token.request_failed",{status:c.status}));let m=await c.json();if(m.error){if(m.error==="authorization_pending"){await new Promise(u=>setTimeout(u,o*1e3));continue}if(m.error==="slow_down"){o+=5,await new Promise(u=>setTimeout(u,o*1e3));continue}throw m.error==="expired_token"?new Error(d("core.oauth.token.expired")):new Error(d("core.oauth.token.error",{error:m.error}))}if(!m.access_token)throw new Error(d("core.oauth.token.missing"));return m.access_token}catch(c){if(c instanceof Error&&c.message.includes("expired"))throw c;await new Promise(m=>setTimeout(m,o*1e3));}throw new Error(d("core.oauth.token.expired"))}a(qt,"pollForToken");async function Me(){try{f.info(`
`+d("core.oauth.auth.starting"));let{oauthClientId:r}=await a$1().getGitHubOAuthClientInfo(),n=await Dt(r);f.section(d("core.oauth.ui.auth_guide_title")),f.info(d("core.oauth.auth.instructions")),f.section(d("core.oauth.ui.auth_steps_title")),f.step("1\uFE0F\u20E3 "+d("core.oauth.auth.open_url",{url:n.verification_uri})),f.step("2\uFE0F\u20E3 "+d("core.oauth.auth.enter_code",{code:n.user_code}));try{process.platform==="darwin"?await $e(`open "${n.verification_uri}"`):process.platform==="win32"?await $e(`start "${n.verification_uri}"`):await $e(`xdg-open "${n.verification_uri}"`);}catch{f.warn(d("core.oauth.auth.browser_open_failed"));}f.section(d("core.oauth.ui.auth_waiting_title")),f.info(d("core.oauth.auth.waiting")),f.info(d("core.oauth.auth.time_limit",{minutes:Math.floor(n.expires_in/60)}));let o=await qt(r,n.device_code,n.interval,n.expires_in);await p({githubToken:o}),f.info(`
`+d("core.oauth.auth.success"));}catch(r){throw r instanceof Error?new Error(d("core.oauth.auth.failed",{error:r.message})):r}}a(Me,"setupOAuthCredentials");async function Ft(){let r=".autopr.json",n=h;if(existsSync(r)){n=await j();let{doInit:o}=await I.prompt([{type:"confirm",name:"doInit",message:d("commands.init.prompts.project_already_initialized",{fallback:"\uAE30\uC874 \uC124\uC815\uC774 \uC788\uC2B5\uB2C8\uB2E4. \uCD08\uAE30\uD654(\uBC31\uC5C5 \uD6C4 \uC0C8\uB85C \uC0DD\uC131) \uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?"}),default:false}]);if(o){let a=r+".bak";renameSync(r,a),await writeFile(r,JSON.stringify(h,null,2)),f.info(".autopr.json \uD30C\uC77C\uC774 \uBC31\uC5C5\uB418\uACE0, \uC0C8\uB85C \uCD08\uAE30\uD654\uB418\uC5C8\uC2B5\uB2C8\uB2E4."),n=h;}else f.info("\uAE30\uC874 \uC124\uC815\uC744 \uC720\uC9C0\uD569\uB2C8\uB2E4.");}else await writeFile(r,JSON.stringify(h,null,2)),n=h;return n}a(Ft,"initializeProjectConfig");async function Mt(r){f.info(d("commands.init.info.oauth_why"));let n=true;if(r.githubToken){let{reauth:o}=await I.prompt([{type:"confirm",name:"reauth",message:d("commands.init.prompts.oauth_already_authenticated"),default:false}]);if(!o)return true;n=o;}else {let{doOAuth:o}=await I.prompt([{type:"confirm",name:"doOAuth",message:d("commands.init.prompts.oauth_authenticate"),default:true}]);n=o;}if(n)try{return await Me(),f.info(d("commands.init.info.oauth_auth_success")),true}catch(o){return f.warn(d("commands.init.warning.oauth_auth_failed"),o),f.warn(d("commands.init.info.oauth_failed_why")),false}else return f.warn(d("commands.init.info.oauth_skipped_why")),false}a(Mt,"promptUserOAuth");async function Ht(){f.info(d("commands.init.info.ai_token_why"));try{f.info(d("commands.init.info.acquiring_ai_token")),await a$1().getAuthToken()?f.info(d("commands.init.info.ai_token_success")):(f.warn(d("commands.init.warning.ai_token_failed")),f.warn(d("commands.init.info.ai_token_failed_why")));}catch(r){f.warn(d("commands.init.warning.ai_token_error"),r),f.warn(d("commands.init.info.ai_token_failed_why"));}}a(Ht,"acquireAIToken");async function Ut(r){var o,a,i;let n=true;if((o=r.githubApp)!=null&&o.appId&&((a=r.githubApp)!=null&&a.clientId)&&((i=r.githubApp)!=null&&i.installationId)){let{reauth:s}=await I.prompt([{type:"confirm",name:"reauth",message:d("commands.init.prompts.github_app_already_authenticated",{fallback:"GitHub App\uC774 \uC774\uBBF8 \uC778\uC99D\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. \uB2E4\uC2DC \uC778\uC99D\uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C?"}),default:false}]);n=s;}else {let{doAuth:s}=await I.prompt([{type:"confirm",name:"doAuth",message:d("commands.init.prompts.github_app_authenticate",{fallback:"AI \uB9AC\uBDF0 \uB4F1 \uACE0\uAE09 \uAE30\uB2A5\uC744 \uC704\uD574 GitHub App \uC778\uC99D\uC744 \uD558\uC2DC\uACA0\uC2B5\uB2C8\uAE4C? (\uC120\uD0DD)"}),default:false}]);n=s;}if(n){f.info(d("commands.init.info.github_app_auth_why"));try{await d$1(),f.info(d("commands.init.info.github_app_auth_success"));}catch(s){f.error(d("commands.init.error.auth_failed",{error:s})),f.error(d("commands.init.info.github_app_auth_failed_why"));}}else f.info(d("commands.init.info.github_app_auth_skipped")),f.info(d("commands.init.info.github_app_auth_skipped_why")),f.info(d("commands.init.info.github_app_auth_later"));}a(Ut,"promptGitHubAppAuth");async function Nt(r){if(r.language){let{updateLanguage:n}=await I.prompt([{type:"confirm",name:"updateLanguage",message:d("commands.init.prompts.update_language",{language:r.language}),default:false}]);if(n){let{language:o}=await I.prompt([{type:"list",name:"language",message:d("commands.init.prompts.language"),choices:e,default:r.language}]);r.language=o,await c(o);}}else {let{language:n}=await I.prompt([{type:"list",name:"language",message:d("commands.init.prompts.language"),choices:e,default:"en"}]);r.language=n,await c(n);}}a(Nt,"promptLanguage");async function zt(r){return await I.prompt([{type:"input",name:"defaultReviewers",message:d("commands.init.prompts.reviewers"),default:r.defaultReviewers.join(", "),filter:a(n=>n.split(",").map(o=>o.trim()).filter(Boolean),"filter")}])}a(zt,"promptProjectSettings");async function Wt(r,n){try{await p({...r,...n});let o=".gitignore",a=true;existsSync(o)&&(await readFile(o,"utf-8")||"").split(`
`).some(s=>s.trim()===".autopr.json")&&(a=false),a&&(await appendFile(o,`
.autopr.json
`),f.info(".autopr.json\uC774 .gitignore\uC5D0 \uCD94\uAC00\uB418\uC5C8\uC2B5\uB2C8\uB2E4.")),f.info(d("common.success.init"));}catch(o){f.error(d("common.error.unknown",{error:o})),process.exit(1);}}a(Wt,"saveConfigAndGitignore");async function Ne(){try{await k();let n=await i();await Nt(n);let o=await Ft();await Mt(n)||(f.error(d("commands.init.info.oauth_required_exit")),process.exit(1)),await Ht(),await Ut(o);let i$1=await zt(o);await Wt(n,i$1);}catch(r){f.error(d("common.error.unknown",{error:r})),process.exit(1);}}a(Ne,"initCommand");var ne=z.object({number:z.number(),title:z.string(),body:z.string().nullable(),state:z.enum(["open","closed"]),draft:z.boolean(),user:z.object({login:z.string()}),created_at:z.string(),updated_at:z.string(),head:z.object({ref:z.string(),sha:z.string()}),base:z.object({ref:z.string(),sha:z.string()}),html_url:z.string(),mergeable:z.boolean().nullable().optional(),mergeable_state:z.string().optional(),merged:z.boolean().optional(),merged_at:z.string().nullable()}),ze=z.object({name:z.string(),commit:z.object({sha:z.string(),url:z.string()})});z.enum(["UNKNOWN","MERGEABLE","CONFLICTING","CHECKING"]);var ae=null,We=new Map,Je=new Map;async function R(){if(ae)return ae;try{let r=await k();if(r.githubApp&&r.githubApp.installationId)try{let n=await b(r.githubApp.installationId);return ae=new Octokit({auth:n,request:{headers:{"X-GitHub-Api-Version":"2022-11-28"}}}),ae}catch(n){f.error(d("core.github.error.app_auth_failed",{error:String(n)}));}if(r.githubToken)return ae=new Octokit({auth:r.githubToken,request:{headers:{"X-GitHub-Api-Version":"2022-11-28"}}}),ae;throw new Error(d("core.github.error.github_token"))}catch(r){throw f.error(d("core.github.error.general",{error:String(r)})),r}}a(R,"getOctokit");async function Jt(r){let n=await R(),{data:o}=await n.rest.pulls.get(r);if(o.mergeable===null){await new Promise(i=>setTimeout(i,1e3));let{data:a}=await n.rest.pulls.get(r);return {mergeable:a.mergeable,mergeableState:a.mergeable_state,hasConflicts:a.mergeable_state==="dirty"}}return {mergeable:o.mergeable,mergeableState:o.mergeable_state,hasConflicts:o.mergeable_state==="dirty"}}a(Jt,"checkMergeability");async function _e(r){let n=`${r.owner}/${r.repo}/${r.pull_number}`,o=We.get(n);if(o&&Date.now()-o.timestamp<5*60*1e3)return o.status;let a=await Jt(r),i;return a.mergeable===null?i="CHECKING":a.hasConflicts?i="CONFLICTING":a.mergeable?i="MERGEABLE":i="UNKNOWN",We.set(n,{status:i,timestamp:Date.now()}),i}a(_e,"getPullRequestStatus");async function Ve(r){var o,a,i;let n=r.token?new Octokit({auth:r.token,request:{headers:{"X-GitHub-Api-Version":"2022-11-28"}}}):await R();try{let s=await n.rest.pulls.create({...r,maintainer_can_modify:true}),c=ne.parse(s.data),m=await _e({owner:r.owner,repo:r.repo,pull_number:c.number});return m==="CONFLICTING"?f.warn(d("common.warning.merge_conflict")):m==="CHECKING"&&f.warn(d("common.warning.merge_status_unknown")),c}catch(s){if(s.status===422){if((o=s.message)!=null&&o.includes("No commits between"))throw new Error(d("common.error.no_commits"));if((a=s.message)!=null&&a.includes("A pull request already exists"))throw new Error(d("common.error.pr_exists"));if((i=s.message)!=null&&i.includes("Base branch was modified"))throw new Error(d("common.error.base_modified"))}throw s}}a(Ve,"createPullRequest");async function Ae(r){let n=await R(),{page:o=1,per_page:a=30}=r;try{return (await n.rest.pulls.list({owner:r.owner,repo:r.repo,state:r.state,page:o,per_page:a,headers:{"X-GitHub-Api-Version":"2022-11-28"}})).data.map(c=>{let m=c.state==="closed"&&c.merged_at!==null;return ne.parse({...c,merged:m})})}catch(i){throw f.error(`PR \uBAA9\uB85D \uAC00\uC838\uC624\uAE30 \uC2E4\uD328: ${i instanceof Error?i.message:String(i)}`),i}}a(Ae,"listPullRequests");async function F(r){let o=await(await R()).rest.pulls.get(r);return ne.parse(o.data)}a(F,"getPullRequest");async function Ke(r){return (await(await R()).rest.repos.listBranches(r)).data.map(a=>ze.parse(a))}a(Ke,"listBranches");async function Vt({owner:r,repo:n,pull_number:o,base:a}){let i=await R(),s=await F({owner:r,repo:n,pull_number:o});try{await i.rest.repos.merge({owner:r,repo:n,base:s.head.ref,head:a});let c=await i.rest.pulls.update({owner:r,repo:n,pull_number:o,base:a});return ne.parse(c.data)}catch(c){throw c.status===409?new Error(d("commands.merge.error.merge_conflict")):c.status===422?new Error(d("commands.merge.error.base_change_failed")):c}}a(Vt,"updatePullRequestBase");async function J({owner:r,repo:n,pull_number:o,title:a,body:i,state:s,base:c,draft:m}){if(c)return Vt({owner:r,repo:n,pull_number:o,base:c});let u=await R();if(m!==void 0){f.info("Updating PR draft status using GraphQL API...");let{repository:p}=await u.graphql(`
query($owner: String!, $repo: String!, $number: Int!) {
repository(owner: $owner, name: $repo) {
pullRequest(number: $number) {
id
}
}
}
`,{owner:r,repo:n,number:o}),w=p.pullRequest.id,y=m?"convertPullRequestToDraft":"markPullRequestReadyForReview";try{await u.graphql(`
mutation($id: ID!) {
${y}(input: {pullRequestId: $id}) {
pullRequest {
number
title
body
state
isDraft
url
baseRefName
headRefName
author {
login
}
}
}
}
`,{id:w});return (a||i||s)&&await u.rest.pulls.update({owner:r,repo:n,pull_number:o,...a&&{title:a},...i&&{body:i},...s&&{state:s}}),await F({owner:r,repo:n,pull_number:o})}catch(f$1){throw f.error("GraphQL Error:",f$1),f$1}}let d=await u.rest.pulls.update({owner:r,repo:n,pull_number:o,...a&&{title:a},...i&&{body:i},...s&&{state:s}});return ne.parse(d.data)}a(J,"updatePullRequest");async function Qe(r){await(await R()).rest.pulls.requestReviewers(r);}a(Qe,"addReviewers");async function Xe({owner:r,repo:n,pull_number:o,merge_method:a="merge",commit_title:i,commit_message:s,delete_branch:c=false}){let m=await R();f.info(d("core.github.info.debug.pr_merge_start",{number:o})),f.debug(d("core.github.info.debug.owner_repo",{owner:r,repo:n})),f.debug(d("core.github.info.debug.merge_method",{method:a}));let u=await F({owner:r,repo:n,pull_number:o});if(f.info(d("core.github.info.debug.pr_state",{state:u.state})),f.info(d("core.github.info.debug.pr_title",{title:u.title})),f.debug(d("core.github.info.debug.pr_branch",{head:u.head.ref,base:u.base.ref})),u.state!=="open")throw f.error(d("core.github.info.debug.pr_not_open",{state:u.state})),new Error(d("core.github.error.pr_closed"));let d$1=await _e({owner:r,repo:n,pull_number:o});if(f.debug(d("core.github.info.debug.merge_status",{status:d$1})),d$1!=="MERGEABLE")throw f.error(d("core.github.info.debug.pr_not_mergeable",{status:d$1})),new Error(d("core.github.error.not_mergeable"));f.debug(d("core.github.info.debug.merge_attempt"));try{await m.rest.pulls.merge({owner:r,repo:n,pull_number:o,merge_method:a,commit_title:i,commit_message:s}),f.info(d("core.github.info.debug.merge_success"));}catch(p){throw f.error(d("core.github.info.debug.merge_failed",{error:p instanceof Error?p.message:String(p)})),p}if(c){f.debug(d("core.github.info.debug.branch_delete_attempt",{branch:u.head.ref}));try{await m.rest.git.deleteRef({owner:r,repo:n,ref:`heads/${u.head.ref}`}),f.debug(d("core.github.info.debug.branch_delete_success"));}catch(p){f.warn(d("core.github.info.debug.branch_delete_failed",{error:p instanceof Error?p.message:String(p)})),f.warn(d("core.github.warning.branch_delete_failed"));}}}a(Xe,"mergePullRequest");async function me(r){let n=`${r.owner}/${r.repo}`,o=Je.get(n);if(o&&Date.now()-o.timestamp<15*60*1e3)return o.data;let s=(await(await R()).rest.repos.listCollaborators({...r,affiliation:"all"})).data;return Je.set(n,{data:s,timestamp:Date.now()}),s}a(me,"getCollaborators");async function Ze({owner:r,repo:n,username:o,permission:a}){await(await R()).rest.repos.addCollaborator({owner:r,repo:n,username:o,permission:a});}a(Ze,"inviteCollaborator");async function Ye({owner:r,repo:n,username:o}){await(await R()).rest.repos.removeCollaborator({owner:r,repo:n,username:o});}a(Ye,"removeCollaborator");async function et({owner:r,repo:n,username:o}){try{let s=(await(await R()).rest.repos.listInvitations({owner:r,repo:n,per_page:100})).data.find(p=>{var w;return ((w=p.invitee)==null?void 0:w.login)===o});if(!s)return null;let c=new Date(s.created_at),m=new Date,u=new Date(c.getTime()+7*24*60*60*1e3),d;return m>u?d="expired":d=(await me({owner:r,repo:n})).some(y=>y.login===o)?"accepted":"pending",{status:d,invitedAt:s.created_at,expiresAt:u.toISOString()}}catch(a){throw a instanceof Error?new Error(d("common.error.get_invitation_status",{error:a.message})):a}}a(et,"getInvitationStatus");async function tt({owner:r,repo:n}){try{let a=await(await R()).rest.repos.listInvitations({owner:r,repo:n,per_page:100}),i=await me({owner:r,repo:n});return a.data.map(s=>{var p;let c=new Date(s.created_at),m=new Date,u=new Date(c.getTime()+7*24*60*60*1e3),d;return m>u?d="expired":d=i.some(y=>{var f;return y.login===((f=s.invitee)==null?void 0:f.login)})?"accepted":"pending",{username:((p=s.invitee)==null?void 0:p.login)||"Unknown",status:d,invitedAt:s.created_at,expiresAt:u.toISOString()}})}catch(o){throw o instanceof Error?new Error(d("common.error.get_invitation_statuses",{error:o.message})):o}}a(tt,"getAllInvitationStatuses");async function rt(r,n,o){try{let a=await R(),{data:i}=await a.rest.pulls.get({owner:r,repo:n,pull_number:o}),{data:s}=await a.rest.pulls.listFiles({owner:r,repo:n,pull_number:o}),c=[];if(i.mergeable_state==="dirty")for(let m of s)m.status!=="removed"&&(m.status==="modified"||m.status==="added")&&c.push({filename:m.filename,status:"conflicted",additions:m.additions,deletions:m.deletions,changes:m.changes,conflictBlocks:[]});return {hasConflicts:c.length>0,conflicts:c}}catch(a){throw a instanceof Error?new Error(d("common.error.get_conflicts",{error:a.message})):a}}a(rt,"getPullRequestConflicts");async function ot(r){try{let n=await R(),{data:o}=await n.rest.repos.get({...r,headers:{"X-GitHub-Api-Version":"2022-11-28"}});return !o.private}catch(n){return f.warn("Draft PR \uAE30\uB2A5 \uD655\uC778 \uC2E4\uD328, \uC77C\uBC18 PR\uB85C \uC9C4\uD589\uD569\uB2C8\uB2E4:",n),false}}a(ot,"checkDraftPRAvailability");async function be(r){let n=await R();try{let o={owner:r.owner,repo:r.repo,pull_number:r.pull_number,body:r.body||"",event:r.event||"COMMENT"};r.comments&&r.comments.length>0&&(o.comments=r.comments.map(i=>{let s={path:i.path,body:i.body};return i.line?(s.line=i.line,s.side=i.side||"RIGHT"):i.position&&(s.position=i.position),s}));let a=await n.rest.pulls.createReview(o);return {id:a.data.id,url:a.data.html_url}}catch(o){throw f.error(d("core.github.error.review_create_failed",{error:String(o)})),new Error(d("core.github.error.review_create_failed",{error:o instanceof Error?o.message:String(o)}))}}a(be,"createPullRequestReview");async function nt(r){let n=await R();try{let a=(await n.rest.pulls.listFiles({owner:r.owner,repo:r.repo,pull_number:r.pull_number})).data.find(u=>u.filename===r.file_path);if(!a||!a.patch)return {changes:[]};let i=[],s=a.patch.split(`
`),c=0,m=0;for(let u of s){if(u.startsWith("@@")){let d=u.match(/@@ -(\d+)(?:,\d+)? \+(\d+)(?:,\d+)? @@/);d&&(c=parseInt(d[1],10)-1,m=parseInt(d[2],10)-1);continue}u.startsWith("-")?(c++,i.push({oldLineNumber:c,content:u.substring(1),type:"removed"})):u.startsWith("+")?(m++,i.push({newLineNumber:m,content:u.substring(1),type:"added"})):(c++,m++,i.push({oldLineNumber:c,newLineNumber:m,content:u.startsWith(" ")?u.substring(1):u,type:"unchanged"}));}return {patch:a.patch,changes:i}}catch(o){return f.error(d("core.github.error.file_diff_failed",{error:String(o)})),{changes:[]}}}a(nt,"getPullRequestFileDiff");var ye=promisify(exec);async function T(){try{let{stdout:r}=await ye("git rev-parse --abbrev-ref HEAD"),n=r.trim(),{stdout:o}=await ye("git config --get remote.origin.url"),i=o.trim().match(/github\.com[:/]([^/]+)\/([^.]+)(?:\.git)?$/);if(!i)return null;let[,s,c]=i;return {owner:s,repo:c,currentBranch:n}}catch{return null}}a(T,"getCurrentRepoInfo");async function Xt(){try{let{stdout:r}=await ye("git branch --format='%(refname:short)'");return r.split(`
`).filter(Boolean)}catch{return []}}a(Xt,"getLocalBranches");async function Zt(){try{let{stdout:r}=await ye("git branch -r --format='%(refname:short)'");return r.split(`
`).filter(Boolean).map(n=>n.replace(/^origin\//,"")).filter(n=>n!=="HEAD")}catch{return []}}a(Zt,"getRemoteBranches");async function at(){let r=await Xt(),n=await Zt(),o=[...new Set([...r,...n])];return {local:r,remote:n,all:o}}a(at,"getAllBranches");var Se=class Se{constructor(n="ko"){this.defaultLanguage=n;}async generatePRDescription(n,o,a,i){try{let s=i||this.defaultLanguage;return (await a$1().callAPI("/ai/google/features/pr-description",{files:n,diffContent:o,template:(a==null?void 0:a.template)||"",relatedIssues:(a==null?void 0:a.relatedIssues)||[],language:s})).description||""}catch(s){throw f.error(d("core.ai_features.error.pr_description_failed"),s),s}}async generatePRTitle(n,o,a,i){try{let s=i||this.defaultLanguage;return (await a$1().callAPI("/ai/google/features/pr-title",{files:n,diffContent:o,type:a.type,language:s})).title||""}catch(s){throw f.error(d("core.ai_features.error.pr_title_failed"),s),s}}async reviewCode(n,o){try{let a=o||this.defaultLanguage;return (await a$1().callAPI("/ai/google/features/code-review-lines",{files:n,language:a})).review||""}catch(a){throw f.error(d("core.ai_features.error.code_review_failed"),a),a}}async lineByLineCodeReview(n,o,a){var i;try{let s=a||this.defaultLanguage,c={files:n,language:s,analyzers:["typo","security","bug"]};if(o){let u;try{let{loadConfig:d}=await import('./config-DCRKMGEQ.js'),{getInstallationToken:p}=await import('./github-app-QYA7QBNF.js'),w=await d();if((i=w.githubApp)!=null&&i.installationId)try{u=await p(w.githubApp.installationId),f.debug("GitHub App \uC778\uC99D \uD1A0\uD070\uC744 \uC0DD\uC131\uD588\uC2B5\uB2C8\uB2E4.");}catch(y){f.debug("GitHub App \uD1A0\uD070 \uC0DD\uC131 \uC2E4\uD328:",y);}}catch(d){f.debug("GitHub \uC778\uC99D \uC815\uBCF4\uB97C \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uC790\uC138\uD55C \uC624\uB958:",d);}c.pullRequestContext={owner:o.owner,repo:o.repo,pullNumber:o.pull_number,diffOnly:true,baseBranch:o.baseBranch||"main"},u?(c.pullRequestContext.accessToken=u,f.debug("GitHub \uD1A0\uD070\uC774 PR \uCEE8\uD14D\uC2A4\uD2B8\uC5D0 \uCD94\uAC00\uB418\uC5C8\uC2B5\uB2C8\uB2E4.")):f.debug("GitHub \uD1A0\uD070\uC744 \uAC00\uC838\uC624\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4. \uD1A0\uD070 \uC5C6\uC774 \uC694\uCCAD\uD569\uB2C8\uB2E4."),f.debug(`PR #${o.pull_number} \uCEE8\uD14D\uC2A4\uD2B8 \uC815\uBCF4\uAC00 \uC81C\uACF5\uB418\uC5C8\uC2B5\uB2C8\uB2E4.`);}return (await a$1().callAPI("/ai/google/features/line-by-line-review",c)).comments||[]}catch(s){throw f.error(d("core.ai_features.error.line_review_failed"),s),s}}async suggestConflictResolution(n,o,a="ko"){try{return (await a$1().callAPI("/ai/google/features/conflict-resolution",{conflicts:n,prContext:o,language:a})).resolution||""}catch(i){throw f.error(d("core.ai_features.error.conflict_resolution_failed"),i),i}}async improveCommitMessage(n,o,a,i="ko"){try{return (await a$1().callAPI("/ai/google/features/improve-commit-message",{message:n,diff:o,changedFiles:a||[],language:i})).message||""}catch(s){throw f.error(d("core.ai_features.error.commit_message_failed"),s),s}}async generateDailyCommitSummary(n,o,a,i,s="ko"){try{return (await a$1().callAPI("/ai/google/features/daily-commit-summary",{commits:n,username:o,date:a,stats:i,language:s})).summary||""}catch(c){throw f.error(d("core.ai_features.error.daily_report_failed"),c),c}}async reviewPR(n,o="ko"){try{return (await a$1().callAPI("/ai/google/features/pr-review",{context:n,language:o})).review}catch(a){throw f.error(d("core.ai_features.error.pr_review_failed"),a),a}}async generatePRContent(n,o,a,i){try{return (await a$1().callAPI("/ai/google/features/pr-content",{files:n,diffContent:o,type:a,relatedIssues:(i==null?void 0:i.relatedIssues)||[],modelId:i==null?void 0:i.modelId,language:i==null?void 0:i.language,customInstructions:i==null?void 0:i.customInstructions})).content||""}catch(s){throw f.error(d("core.ai_features.error.pr_content_failed"),s),s}}};a(Se,"AIFeatures");var q=Se;var tr=".github/PULL_REQUEST_TEMPLATE",it={en:{feature:`## Feature Description
A brief description of the new feature you're adding.
## Implementation Details
Explain the key implementation details and technical decisions.
## Testing
Describe how this feature was tested.
## Screenshots
If there are UI changes, include screenshots here.
## Related Issues
Related issue numbers: #`,bugfix:`## Bug Description
Describe the bug that was fixed.
## Root Cause
Explain what was causing the bug.
## Solution
Describe how you fixed the issue.
## Testing
Explain how you tested the fix.
## Related Issues
Bug report: #`,refactor:`## Refactoring Description
Describe what was refactored.
## Reason for Change
Explain why this refactoring was needed.
## Major Changes
List the key changes made during refactoring.
## Testing
Describe how you verified the refactoring doesn't break existing functionality.
## Performance Impact
Note any performance impacts from this change.`,docs:`## Documentation Changes
Describe what documentation was changed.
## Reason for Change
Explain why these changes were needed.
## Major Changes
List the key documentation changes.`,chore:`## Changes
Describe what maintenance work was performed.
## Reason for Change
Explain why these changes were needed.
## Scope
Indicate the scope of changes (build system, dependencies, configuration files, etc.).`,test:`## Test Changes
Describe what tests were added or modified.
## Test Coverage
Explain what types of testing was added (unit, integration, E2E).
## Test Cases
List the key test cases that were implemented.`},ko:{feature:`## \uAE30\uB2A5 \uC124\uBA85
\uCD94\uAC00\uD55C \uC0C8\uB85C\uC6B4 \uAE30\uB2A5\uC5D0 \uB300\uD55C \uAC04\uB7B5\uD55C \uC124\uBA85\uC744 \uC791\uC131\uD558\uC138\uC694.
## \uAD6C\uD604 \uB0B4\uC6A9
\uC8FC\uC694 \uAD6C\uD604 \uB0B4\uC6A9\uACFC \uAE30\uC220\uC801 \uACB0\uC815 \uC0AC\uD56D\uC744 \uC124\uBA85\uD558\uC138\uC694.
## \uD14C\uC2A4\uD2B8
\uC774 \uAE30\uB2A5\uC744 \uC5B4\uB5BB\uAC8C \uD14C\uC2A4\uD2B8\uD588\uB294\uC9C0 \uC124\uBA85\uD558\uC138\uC694.
## \uC2A4\uD06C\uB9B0\uC0F7
UI \uBCC0\uACBD\uC0AC\uD56D\uC774 \uC788\uB294 \uACBD\uC6B0 \uC2A4\uD06C\uB9B0\uC0F7\uC744 \uCCA8\uBD80\uD558\uC138\uC694.
## \uAD00\uB828 \uC774\uC288
\uAD00\uB828\uB41C \uC774\uC288 \uBC88\uD638: #`,bugfix:`## \uBC84\uADF8 \uC124\uBA85
\uC218\uC815\uD55C \uBC84\uADF8\uC5D0 \uB300\uD574 \uC124\uBA85\uD558\uC138\uC694.
## \uC6D0\uC778
\uBC84\uADF8\uC758 \uC6D0\uC778\uC774 \uBB34\uC5C7\uC774\uC5C8\uB294\uC9C0 \uC124\uBA85\uD558\uC138\uC694.
## \uD574\uACB0 \uBC29\uBC95
\uBB38\uC81C\uB97C \uC5B4\uB5BB\uAC8C \uD574\uACB0\uD588\uB294\uC9C0 \uC124\uBA85\uD558\uC138\uC694.
## \uD14C\uC2A4\uD2B8
\uC218\uC815 \uC0AC\uD56D\uC744 \uC5B4\uB5BB\uAC8C \uD14C\uC2A4\uD2B8\uD588\uB294\uC9C0 \uC124\uBA85\uD558\uC138\uC694.
## \uAD00\uB828 \uC774\uC288
\uBC84\uADF8 \uB9AC\uD3EC\uD2B8: #`,refactor:`## \uB9AC\uD329\uD1A0\uB9C1 \uC124\uBA85
\uC5B4\uB5A4 \uBD80\uBD84\uC744 \uB9AC\uD329\uD1A0\uB9C1\uD588\uB294\uC9C0 \uC124\uBA85\uD558\uC138\uC694.
## \uBCC0\uACBD \uC774\uC720
\uC774 \uB9AC\uD329\uD1A0\uB9C1\uC774 \uC65C \uD544\uC694\uD588\uB294\uC9C0 \uC124\uBA85\uD558\uC138\uC694.
## \uC8FC\uC694 \uBCC0\uACBD \uC0AC\uD56D
\uB9AC\uD329\uD1A0\uB9C1 \uC911 \uC774\uB8E8\uC5B4\uC9C4 \uC8FC\uC694 \uBCC0\uACBD \uC0AC\uD56D\uC744 \uB098\uC5F4\uD558\uC138\uC694.
## \uD14C\uC2A4\uD2B8
\uB9AC\uD329\uD1A0\uB9C1\uC774 \uAE30\uC874 \uAE30\uB2A5\uC744 \uC190\uC0C1\uC2DC\uD0A4\uC9C0 \uC54A\uB294\uC9C0 \uC5B4\uB5BB\uAC8C \uD655\uC778\uD588\uB294\uC9C0 \uC124\uBA85\uD558\uC138\uC694.
## \uC131\uB2A5 \uC601\uD5A5
\uC774 \uBCC0\uACBD\uC73C\uB85C \uC778\uD55C \uC131\uB2A5 \uC601\uD5A5\uC744 \uC124\uBA85\uD558\uC138\uC694.`,docs:`## \uBB38\uC11C \uBCC0\uACBD \uC0AC\uD56D
\uC5B4\uB5A4 \uBB38\uC11C\uB97C \uBCC0\uACBD\uD588\uB294\uC9C0 \uC124\uBA85\uD558\uC138\uC694.
## \uBCC0\uACBD \uC774\uC720
\uC774 \uBCC0\uACBD\uC774 \uC65C \uD544\uC694\uD588\uB294\uC9C0 \uC124\uBA85\uD558\uC138\uC694.
## \uC8FC\uC694 \uBCC0\uACBD \uB0B4\uC6A9
\uC8FC\uC694 \uBB38\uC11C \uBCC0\uACBD \uC0AC\uD56D\uC744 \uB098\uC5F4\uD558\uC138\uC694.`,chore:`## \uBCC0\uACBD \uC0AC\uD56D
\uC5B4\uB5A4 \uC720\uC9C0\uBCF4\uC218 \uC791\uC5C5\uC744 \uC218\uD589\uD588\uB294\uC9C0 \uC124\uBA85\uD558\uC138\uC694.
## \uBCC0\uACBD \uC774\uC720
\uC774 \uBCC0\uACBD\uC774 \uC65C \uD544\uC694\uD588\uB294\uC9C0 \uC124\uBA85\uD558\uC138\uC694.
## \uC601\uD5A5 \uBC94\uC704
\uBCC0\uACBD \uC0AC\uD56D\uC758 \uC601\uD5A5 \uBC94\uC704\uB97C \uC124\uBA85\uD558\uC138\uC694(\uBE4C\uB4DC \uC2DC\uC2A4\uD15C, \uC758\uC874\uC131, \uC124\uC815 \uD30C\uC77C \uB4F1).`,test:`## \uD14C\uC2A4\uD2B8 \uCD94\uAC00/\uC218\uC815 \uC0AC\uD56D
\uC5B4\uB5A4 \uD14C\uC2A4\uD2B8\uB97C \uCD94\uAC00\uD558\uAC70\uB098 \uC218\uC815\uD588\uB294\uC9C0 \uC124\uBA85\uD558\uC138\uC694.
## \uD14C\uC2A4\uD2B8 \uBC94\uC704
\uC5B4\uB5A4 \uC720\uD615\uC758 \uD14C\uC2A4\uD2B8\uAC00 \uCD94\uAC00\uB418\uC5C8\uB294\uC9C0 \uC124\uBA85\uD558\uC138\uC694(\uB2E8\uC704, \uD1B5\uD569, E2E).
## \uD14C\uC2A4\uD2B8 \uCF00\uC774\uC2A4
\uAD6C\uD604\uB41C \uC8FC\uC694 \uD14C\uC2A4\uD2B8 \uCF00\uC774\uC2A4\uB97C \uB098\uC5F4\uD558\uC138\uC694.`}};async function st(r){var n;try{let o=join(process.cwd(),tr,`${r}.md`);return await readFile(o,"utf-8")}catch{let a=await k(),i=(a==null?void 0:a.language)||"en";return ((n=it[i])==null?void 0:n[r])||it[i].feature}}a(st,"loadTemplate");function or(r,n){return minimatch(r,n)}a(or,"matchBranchPattern");async function ct(r){let n=await k();if(!n)return f.warn(d("core.branch_pattern.no_config")),null;let o=n.branchPatterns.find(a=>or(r,a.pattern));return o?(f.info(d("core.branch_pattern.matched_pattern")),f.info(d("core.branch_pattern.pattern_info",{pattern:o.pattern,type:o.type,draft:o.draft?d("core.branch_pattern.yes"):d("core.branch_pattern.no"),labels:o.labels.length>0?o.labels.join(", "):d("core.branch_pattern.none"),template:o.template||d("core.branch_pattern.default")}))):f.warn(d("core.branch_pattern.no_match")),o||null}a(ct,"findMatchingPattern");async function Te(r){return r.template?await st(r.template):[d("core.branch_pattern.template.default.changes"),d("core.branch_pattern.template.default.changes_placeholder"),"",d("core.branch_pattern.template.default.tests"),d("core.branch_pattern.template.default.unit_test"),d("core.branch_pattern.template.default.integration_test"),"",d("core.branch_pattern.template.default.reviewer_checklist"),d("core.branch_pattern.template.default.code_clarity"),d("core.branch_pattern.template.default.test_coverage"),d("core.branch_pattern.template.default.performance")].join(`
`)}a(Te,"generatePRBody");var sr=promisify(exec),mt=".github/PR_TEMPLATES";async function ve(){try{let r=process.cwd(),n=ue.join(r,mt);try{await M.access(n);}catch{await M.mkdir(n,{recursive:true}),f.info(d("commands.template.info.directory_created",{dir:mt}));}return n}catch(r){throw f.error(d("commands.template.error.directory_create_failed"),r),r}}a(ve,"ensureTemplateDirectory");async function Y(){try{let r=await ve();return (await M.readdir(r)).filter(o=>o.endsWith(".md")).map(o=>o.replace(".md",""))}catch(r){return f.error(d("commands.template.error.list_failed"),r),[]}}a(Y,"getAvailableTemplates");async function lt(r){try{let n=await ve(),o=ue.join(n,`${r}.md`);return await M.readFile(o,"utf-8")}catch(n){throw f.error(d("commands.template.error.read_failed",{name:r}),n),n}}a(lt,"getTemplateContent");async function ut(r,n){try{let o=await ve(),a=ue.join(o,`${r}.md`);await M.writeFile(a,n),f.info(d("commands.template.success.saved",{name:r}));}catch(o){throw f.error(d("commands.template.error.save_failed",{name:r}),o),o}}a(ut,"saveTemplate");async function cr(r){try{let n=await ve(),o=ue.join(n,`${r}.md`);await M.unlink(o),f.info(d("commands.template.success.deleted",{name:r}));}catch(n){throw f.error(d("commands.template.error.delete_failed",{name:r}),n),n}}a(cr,"deleteTemplate");async function dt(r,n=""){let o=ue.join(process.cwd(),`.${r}.md.tmp`);try{await M.writeFile(o,n);let a=process.env.EDITOR||process.env.VISUAL||"vi";f.info(d("commands.template.info.opening_editor",{editor:a})),await sr(`${a} ${o}`);let i=await M.readFile(o,"utf-8");return await M.unlink(o),i}catch(a){f.error(d("commands.template.error.edit_failed",{name:r}),a);try{await M.unlink(o);}catch{}throw a}}a(dt,"editTemplateInEditor");async function mr(r=false){try{let n=await Y();if(n.length===0){r||f.info(d("commands.template.info.no_templates"));return}r||f.info(d("commands.template.info.available_templates")),n.forEach((o,a)=>{});}catch(n){r||f.error(d("commands.template.error.list_failed"),n);}}a(mr,"listTemplates");async function lr(r){try{if(!r){let{name:a$1}=await I.prompt([{type:"input",name:"name",message:d("commands.template.prompts.enter_name"),validate:a(i=>i.trim().length>0||d("commands.template.validation.name_required"),"validate")}]);r=a$1;}if(!r){f.error(d("commands.template.error.template_name_required"));return}let o=await dt(r,`## Description
What does this PR do?
## Changes
-
## Testing
- [ ] Test 1
- [ ] Test 2
## Screenshots
## Checklist
- [ ] Code follows style guidelines
- [ ] Documentation updated
- [ ] Tests added
`);await ut(r,o);}catch(n){f.error(d("commands.template.error.create_failed",{name:r||"unknown"}),n);}}a(lr,"createTemplate");async function ur(r){try{let n=await Y();if(n.length===0){f.info(d("commands.template.info.no_templates"));return}if(r){if(!n.includes(r)){f.error(d("commands.template.error.template_not_found",{name:r}));return}}else {let{template:i}=await I.prompt([{type:"list",name:"template",message:d("commands.template.prompts.select_template"),choices:n}]);r=i;}if(!r){f.error(d("commands.template.error.template_name_required"));return}let o=await lt(r),a=await dt(r,o);if(a===o){f.info(d("commands.template.info.no_changes"));return}await ut(r,a);}catch(n){f.error(d("commands.template.error.edit_failed",{name:r||"unknown"}),n);}}a(ur,"editTemplate");async function dr(r){try{let n=await Y();if(n.length===0){f.info(d("commands.template.info.no_templates"));return}if(r){if(!n.includes(r)){f.error(d("commands.template.error.template_not_found",{name:r}));return}}else {let{template:a}=await I.prompt([{type:"list",name:"template",message:d("commands.template.prompts.select_delete"),choices:n}]);r=a;}if(!r){f.error(d("commands.template.error.template_name_required"));return}let{confirm:o}=await I.prompt([{type:"confirm",name:"confirm",message:d("commands.template.prompts.confirm_delete",{name:r}),default:false}]);if(!o){f.info(d("commands.template.info.delete_cancelled"));return}await cr(r);}catch(n){f.error(d("commands.template.error.delete_failed",{name:r||"unknown"}),n);}}a(dr,"deleteTemplateCommand");async function pr(r){try{let n=await Y();if(n.length===0){f.info(d("commands.template.info.no_templates"));return}if(r){if(!n.includes(r)){f.error(d("commands.template.error.template_not_found",{name:r}));return}}else {let{template:a}=await I.prompt([{type:"list",name:"template",message:d("commands.template.prompts.select_view"),choices:n}]);r=a;}if(!r){f.error(d("commands.template.error.template_name_required"));return}await lt(r);f.info(d("commands.template.info.template_content",{name:r}));}catch(n){f.error(d("commands.template.error.view_failed",{name:r||"unknown"}),n);}}a(pr,"viewTemplate");function pt(){let r=new Command("template").description(d("commands.template.description")).addHelpText("after",`
${d("commands.template.help.examples")}:
$ autopr template list - ${d("commands.template.help.list")}
$ autopr template create - ${d("commands.template.help.create")}
$ autopr template create feature-2 - ${d("commands.template.help.create_named")}
$ autopr template edit - ${d("commands.template.help.edit")}
$ autopr template edit bugfix - ${d("commands.template.help.edit_named")}
$ autopr template delete - ${d("commands.template.help.delete")}
$ autopr template view - ${d("commands.template.help.view")}
`);return r.command("list").description(d("commands.template.subcommands.list")).option("-q, --quiet","Quiet mode - only output template names").action(n=>mr(n.quiet)),r.command("create [name]").description(d("commands.template.subcommands.create")).action(lr),r.command("edit [name]").description(d("commands.template.subcommands.edit")).action(ur),r.command("delete [name]").description(d("commands.template.subcommands.delete")).action(dr),r.command("view [name]").description(d("commands.template.subcommands.view")).action(pr),r}a(pt,"createTemplateCommand");var H=promisify(exec),br=20*1024*1024;async function yr(r){try{let{stdout:n}=await H(`git diff origin/${r}...HEAD`);return n}catch{return f.error(d("commands.new.error.diff_failed")),""}}a(yr,"getDiffContent");async function vr(r){try{let{stdout:n}=await H(`git diff --name-only origin/${r}...HEAD`);return n.split(`
`).filter(Boolean)}catch{return f.error(d("commands.new.error.files_failed")),[]}}a(vr,"getChangedFiles");async function Cr(r){let n=[];for(let o of r)try{let a=await stat(o);if(a.size>br){f.warn(d("commands.new.warning.file_too_large",{file:o,size:Math.round(a.size/1024/1024)}));continue}let i=await readFile(o,"utf-8");n.push({path:o,content:i});}catch{f.warn(d("commands.new.warning.file_read_failed",{file:o}));}return n}a(Cr,"getFileContents");async function Pr(r){try{if(r.files.length===0){f.warn(d("commands.new.warning.no_files_for_review"));return}let n=[],o={prReview:"",overallReview:"",lineComments:[]};if(r.shouldRunPRReview){f.info(d("commands.new.info.running_pr_review"));let a=(async()=>{try{o.prReview=await r.ai.reviewPR({prNumber:r.pull_number,title:r.prTitle||"",changedFiles:r.files,diffContent:r.diffContent||"",repoOwner:r.owner,repoName:r.repo},r.language),f.info(d("commands.new.info.pr_review_completed"));}catch(i){f.warn(d("commands.new.warning.ai_pr_review_failed"),i);}})();n.push(a);}if(r.shouldRunOverallReview){f.info(d("commands.new.info.running_code_review"));let a=(async()=>{try{let i=r.files.map(s=>({path:s.path,content:s.content.split(`
`).map((c,m)=>({line:m+1,text:c}))}));o.overallReview=await r.ai.reviewCode(i,r.language),f.info(d("commands.new.info.code_review_completed"));}catch(i){f.warn(d("commands.new.warning.code_review_failed"),i);}})();n.push(a);}if(r.shouldRunLineByLineReview){f.info(d("commands.new.info.running_line_by_line_review")),f.info(d("commands.new.info.pr_analysis_info"));let a=(async()=>{try{let i=await r.ai.lineByLineCodeReview(r.files,{owner:r.owner,repo:r.repo,pull_number:r.pull_number,baseBranch:r.base_branch||r.base||"main"},r.language);o.lineComments=i,i.length>0?f.info(d("commands.new.info.line_by_line_review_completed")):f.info(d("commands.new.info.no_line_comments"));}catch(i){f.warn(d("commands.new.warning.line_review_failed"),i);}})();n.push(a);}if(await Promise.all(n),o.prReview)try{await be({owner:r.owner,repo:r.repo,pull_number:r.pull_number,body:`## PR \uB9AC\uBDF0
${o.prReview}`,event:"COMMENT",comments:[]}),f.info(d("commands.new.success.pr_review_added"));}catch(a){f.warn(d("commands.new.warning.code_review_add_failed"),a);}if(o.overallReview)try{await be({owner:r.owner,repo:r.repo,pull_number:r.pull_number,body:`## \uCF54\uB4DC \uB9AC\uBDF0
${o.overallReview}`,event:"COMMENT",comments:[]}),f.info(d("commands.new.success.code_review_added"));}catch(a){f.warn(d("commands.new.warning.code_review_add_failed"),a);}if(o.lineComments.length>0){let a=[],i=o.lineComments.map(async c=>{try{let u=(await nt({owner:r.owner,repo:r.repo,pull_number:r.pull_number,file_path:c.file})).changes.find(d=>d.newLineNumber===c.line&&(d.type==="added"||d.type==="unchanged"));if(u&&u.newLineNumber){let d="";return c.severity==="error"?d="\u{1F534} ":c.severity==="warning"?d="\u26A0\uFE0F ":c.severity==="info"&&(d="\u2139\uFE0F "),{path:c.file,line:u.newLineNumber,side:"RIGHT",body:`${d}${c.comment}`}}else return f.warn(d("commands.new.warning.comment_add_failed",{file:c.file,line:c.line})),null}catch(m){return f.warn(d("commands.new.debug.line_comment_mapping_failed",{file:c.file,line:c.line}),m),null}}),s=await Promise.all(i);if(a.push(...s.filter(c=>c!==null)),a.length>0)try{await be({owner:r.owner,repo:r.repo,pull_number:r.pull_number,body:d("commands.new.info.line_by_line_review_comment"),event:"COMMENT",comments:a}),f.info(d("commands.new.success.line_review_added"));}catch(c){f.warn(d("commands.new.warning.code_review_add_failed"),c);}}!o.prReview&&!o.overallReview&&o.lineComments.length===0&&f.info(d("commands.new.info.no_review_comments"));}catch(n){f.warn(d("commands.new.warning.code_review_add_failed"),n);}}a(Pr,"runCodeReviewAndAddComments");async function Rr(r,n,o){let a=await Y().catch(()=>[]),i=["feature","bugfix","refactor","docs","chore","test"],s=(r==null?void 0:r.type)||"feature";r!=null&&r.template&&(s=r.template);let c=i.map(u=>({name:u===s?`${u} (${n("commands.new.info.recommended")})`:u,value:u}));a.length>0&&(c.push(new I.Separator("---- \uC0AC\uC6A9\uC790 \uC815\uC758 \uD15C\uD50C\uB9BF ----")),a.forEach(u=>{c.push({name:u===s?`${u} (${n("commands.new.info.recommended")})`:u,value:u});})),c.push(new I.Separator("----------------")),c.push({name:n("commands.new.prompts.create_new_template"),value:"custom"});let{template:m}=await I.prompt([{type:"list",name:"template",message:n("commands.new.prompts.select_template"),choices:c,default:s,pageSize:15}]);return m==="custom"?await xr(n,o):m}a(Rr,"selectTemplateImproved");async function xr(r,n){try{let o=await Y();if(o.length>0){let{action:s}=await I.prompt([{type:"list",name:"action",message:r("commands.new.prompts.custom_template_action"),choices:[{name:r("commands.new.prompts.use_existing_template"),value:"use"},{name:r("commands.new.prompts.create_new_template"),value:"create"}]}]);if(s==="use"){let{template:c}=await I.prompt([{type:"list",name:"template",message:r("commands.new.prompts.select_custom_template"),choices:o}]);return c}}let{newTemplate:a$1}=await I.prompt([{type:"input",name:"newTemplate",message:r("commands.new.prompts.custom_template_name"),validate:a(s=>s.length>0,"validate")}]);n.info(r("commands.new.info.creating_template"));let i=spawn("autopr",["template","create",a$1],{stdio:"inherit",shell:true});return new Promise(s=>{i.on("close",c=>{c===0?s(a$1):(n.warn(r("commands.new.warning.template_create_failed")),s("feature"));});})}catch{n.warn(r("commands.new.warning.template_list_failed"));let{customTemplate:a$1}=await I.prompt([{type:"input",name:"customTemplate",message:r("commands.new.prompts.custom_template_name"),validate:a(i=>i.length>0,"validate")}]);return a$1}}a(xr,"handleCustomTemplateSelection");async function ft(){var r;try{f.info(d("commands.new.auth.why",{fallback:"\uC774 \uC791\uC5C5\uC744 \uC704\uD574 GitHub \uC778\uC99D\uC774 \uD544\uC694\uD569\uB2C8\uB2E4. \uC778\uC99D\uD558\uC9C0 \uC54A\uC73C\uBA74 PR \uC0DD\uC131 \uAE30\uB2A5\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4."}));let n=await k();n||(f.error(d("common.error.github_token")),process.exit(1));let o=await T();o||(f.error(d("common.error.not_git_repo")),process.exit(1));let a$1=await ct(o.currentBranch),i=a$1===null?void 0:a$1,s=o.currentBranch,c="",m="";if(m=await Rr(i,d,f),i&&m){let b={template:m};c=await Te(b);}else m&&(c=await Te({template:m}));f.info(d("commands.new.info.current_branch",{branch:o.currentBranch}));let u=[];try{let{stdout:b}=await H("git branch -r");u=b.split(`
`).map(B=>B.trim().replace("origin/","")).filter(B=>B&&!B.includes("HEAD ->"));let{stdout:C}=await H("git branch"),$=C.split(`
`).map(B=>B.trim().replace("* ","")).filter(B=>B&&B!==o.currentBranch);u=[...new Set([...u,...$])];}catch{f.warn(d("commands.new.warning.branch_list_failed")),u=["main","master","dev","develop"];}u=u.filter(b=>b!==o.currentBranch);let{baseBranch:d$1}=await I.prompt([{type:"list",name:"baseBranch",message:d("commands.new.prompts.select_base_branch_with_current",{branch:o.currentBranch}),choices:u,default:u.includes("main")?"main":u.includes("master")?"master":u[0]}]),p=o.currentBranch,w=false;try{let{stdout:b}=await H(`git ls-remote --heads origin ${p}`);w=b.includes(p);}catch{w=false;}if(w){let b="",C="";try{let{stdout:$}=await H(`git rev-parse ${p}`);b=$.trim();}catch($){f.debug(d("commands.new.debug.debug_local_hash_failed",{branch:p}),$);}try{let{stdout:$}=await H(`git rev-parse origin/${p}`);C=$.trim();}catch($){f.debug(d("commands.new.debug.debug_remote_hash_failed",{branch:p}),$);}if(b&&C&&b!==C){f.info(d("commands.new.warning.push_branch_ahead_notice"));return}}else {let{shouldPush:b}=await I.prompt([{type:"confirm",name:"shouldPush",message:d("commands.new.warning.push_branch_prompt"),default:true}]);if(b)try{await H(`git push --set-upstream origin ${p}`),f.info(d("commands.new.warning.push_branch_success")),await H(`git fetch origin ${p}`);}catch(C){f.warn(d("commands.new.warning.push_branch_failed",{error:String(C)}));return}else {f.info(d("commands.new.warning.push_branch_cancelled"));return}}let y=await vr(d$1),f$1=await yr(d$1),g=[];try{f.info(d("commands.new.info.fetching_issues_list"));let b=await R();try{let C=1,$=true,B=10,X=new Set;for(;$;){let{data:fe}=await b.rest.issues.listForRepo({owner:o.owner,repo:o.repo,state:"open",sort:"updated",direction:"desc",per_page:B,page:C});if(fe.length>0){if(C===1){let{issueSelectionMethod:O}=await I.prompt([{type:"list",name:"issueSelectionMethod",message:d("commands.new.prompts.related_issues_method"),choices:[{name:d("commands.new.prompts.select_from_list"),value:"list"},{name:d("commands.new.prompts.enter_manually"),value:"manual"}]}]);if(O==="manual"){let{manualIssues:N}=await I.prompt([{type:"input",name:"manualIssues",message:d("commands.new.prompts.related_issues"),default:"",filter:a(xe=>xe.split(",").map(Et=>Et.trim().replace("#","")).filter(Boolean),"filter")}]);g=N;break}}let Tt=fe.map(O=>{let N=X.has(O.number.toString());return {name:`${N?"[\u2713] ":""}#${O.number} - ${O.title}`,value:O.number.toString(),checked:N}}),{selectedIssues:Oe}=await I.prompt([{type:"checkbox",name:"selectedIssues",message:d("commands.new.prompts.select_related_issues"),choices:Tt}]);Oe.forEach(O=>{X.add(O);}),fe.forEach(O=>{let N=O.number.toString();Oe.includes(N)||X.delete(N);});let se=[];C>1&&se.push({name:d("commands.new.prompts.previous_page"),value:"prev"}),fe.length===B&&se.push({name:d("commands.new.prompts.next_page"),value:"next"}),se.push({name:d("commands.new.prompts.manual_entry"),value:"manual"}),se.push({name:d("commands.new.prompts.finish_selection"),value:"finish"}),f.info(d("commands.new.info.issues_page",{page:C}));let{action:ge}=await I.prompt([{type:"list",name:"action",message:d("commands.new.prompts.page_navigation"),choices:se}]);if(ge==="prev"){C--;continue}else if(ge==="next"){C++;continue}else if(ge==="manual"){let{manualIssues:O}=await I.prompt([{type:"input",name:"manualIssues",message:d("commands.new.prompts.related_issues"),default:"",filter:a(N=>N.split(",").map(xe=>xe.trim().replace("#","")).filter(Boolean),"filter")}]);g=[...Array.from(X),...O];break}else if(ge==="finish"){g=Array.from(X);break}}else C===1&&(f.info(d("commands.new.prompts.no_issues_found")),g=[]),$=false;}}catch{f.warn(d("commands.new.warning.issues_list_failed"));let{manualIssues:$}=await I.prompt([{type:"input",name:"manualIssues",message:d("commands.new.prompts.related_issues"),default:"",filter:a(B=>B.split(",").map(X=>X.trim().replace("#","")).filter(Boolean),"filter")}]);g=$;}}catch{let{manualIssues:C}=await I.prompt([{type:"input",name:"manualIssues",message:d("commands.new.prompts.related_issues"),default:"",filter:a($=>$.split(",").map(B=>B.trim().replace("#","")).filter(Boolean),"filter")}]);g=C;}let _=[];if(g.length>0){f.info(d("commands.new.info.fetching_issues"));let b=await R();for(let C of g)try{let{data:$}=await b.rest.issues.get({owner:o.owner,repo:o.repo,issue_number:parseInt(C,10)});_.push({id:$.number,title:$.title,url:$.html_url});}catch{f.warn(d("commands.new.warning.issue_fetch_failed",{issueNumber:C}));}_.length>0&&f.info(d("commands.new.info.issues_fetched",{count:_.length}));}f.info(d("commands.new.info.generating_title"));let k$1="";try{k$1=await new q(n.language).generatePRTitle(y,f$1,{type:(i==null?void 0:i.type)||m},n.language),f.section(d("commands.new.info.generated_title",{title:k$1}));}catch(b){f.warn(d("commands.new.warning.ai_title_failed"),b);}let h=await I.prompt([{type:"input",name:"title",message:d("commands.new.prompts.title"),default:k$1||s,validate:a(b=>b.length>0,"validate")},{type:"input",name:"reviewers",message:d("commands.new.prompts.reviewers"),default:i!=null&&i.autoAssignReviewers?[...new Set([...n.defaultReviewers,...i.reviewers||[]])].join(", "):n.defaultReviewers.join(", "),filter:a(b=>b.split(",").map(C=>C.trim()).filter(Boolean),"filter")}]),E=new q(n.language);(!n.githubToken||n.githubToken.trim()==="")&&f.info(d("commands.new.auth.why",{fallback:"\uC774 \uC791\uC5C5\uC744 \uC704\uD574 GitHub \uC778\uC99D\uC774 \uD544\uC694\uD569\uB2C8\uB2E4. \uC778\uC99D\uD558\uC9C0 \uC54A\uC73C\uBA74 PR \uC0DD\uC131 \uAE30\uB2A5\uC744 \uC0AC\uC6A9\uD560 \uC218 \uC5C6\uC2B5\uB2C8\uB2E4."})),f.info(d("commands.new.info.ai_initialized"));let G="";try{!n.githubToken||n.githubToken.trim()===""?f.warn(d("commands.new.warning.no_github_token_for_pr")):(f.info(d("commands.new.info.generating_pr_content")),G=await E.generatePRContent(y,f$1,(i==null?void 0:i.type)||m,{relatedIssues:_,language:n.language}),f.section(d("commands.new.info.generated_pr_content")),f.verbose(G));}catch(b){f.warn(d("commands.new.warning.ai_pr_content_failed"),b);}let Q=o.currentBranch,j=await ot({owner:o.owner,repo:o.repo}),ee=(i==null?void 0:i.draft)??false;if(j){let{shouldBeDraft:b